Set board ID in the usb_device_id table's driver_info field.
Use board name when registering the dvb adapter.
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
-sms1xxx-objs := smscoreapi.o smsusb.o smsdvb.o
+sms1xxx-objs := smscoreapi.o smsusb.o smsdvb.o sms-cards.o
obj-$(CONFIG_DVB_SIANO_SMS1XXX) += sms1xxx.o
--- /dev/null
+/*
+ * Card-specific functions for the Siano SMS1xxx USB dongle
+ *
+ * Copyright (c) 2008 Michael Krufky <mkrufky@linuxtv.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation;
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
+ *
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "sms-cards.h"
+
+struct usb_device_id smsusb_id_table[] = {
+ { USB_DEVICE(0x187f, 0x0010),
+ .driver_info = SMS1XXX_BOARD_SIANO_STELLAR },
+ { USB_DEVICE(0x187f, 0x0100),
+ .driver_info = SMS1XXX_BOARD_SIANO_STELLAR },
+ { USB_DEVICE(0x187f, 0x0200),
+ .driver_info = SMS1XXX_BOARD_SIANO_NOVA_A },
+ { USB_DEVICE(0x187f, 0x0201),
+ .driver_info = SMS1XXX_BOARD_SIANO_NOVA_B },
+ { USB_DEVICE(0x187f, 0x0300),
+ .driver_info = SMS1XXX_BOARD_SIANO_VEGA },
+ { } /* Terminating entry */
+};
+MODULE_DEVICE_TABLE(usb, smsusb_id_table);
+
+static struct sms_board sms_boards[] = {
+ [SMS_BOARD_UNKNOWN] = {
+ .name = "Unknown board",
+ },
+ [SMS1XXX_BOARD_SIANO_SMS1000] = {
+ .name = "Siano Digital Receiver",
+ .type = SMS_STELLAR,
+ },
+ [SMS1XXX_BOARD_SIANO_STELLAR] = {
+ .name = "Siano Stellar reference board",
+ .type = SMS_STELLAR,
+ },
+ [SMS1XXX_BOARD_SIANO_NOVA_A] = {
+ .name = "Siano Nova A reference board",
+ .type = SMS_NOVA_A0,
+ },
+ [SMS1XXX_BOARD_SIANO_NOVA_B] = {
+ .name = "Siano Nova B reference board",
+ .type = SMS_NOVA_B0,
+ },
+ [SMS1XXX_BOARD_SIANO_VEGA] = {
+ .name = "Siano Vega reference board",
+ .type = SMS_VEGA,
+ },
+};
+
+struct sms_board *sms_get_board(int id)
+{
+ BUG_ON(id >= ARRAY_SIZE(sms_boards));
+
+ return &sms_boards[id];
+}
+
--- /dev/null
+/*
+ * Card-specific functions for the Siano SMS1xxx USB dongle
+ *
+ * Copyright (c) 2008 Michael Krufky <mkrufky@linuxtv.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation;
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
+ *
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __SMS_CARDS_H__
+#define __SMS_CARDS_H__
+
+#include <linux/usb.h>
+#include "smscoreapi.h"
+
+#define SMS_BOARD_UNKNOWN 0
+#define SMS1XXX_BOARD_SIANO_SMS1000 1
+#define SMS1XXX_BOARD_SIANO_STELLAR 2
+#define SMS1XXX_BOARD_SIANO_NOVA_A 3
+#define SMS1XXX_BOARD_SIANO_NOVA_B 4
+#define SMS1XXX_BOARD_SIANO_VEGA 5
+
+struct sms_board {
+ char *name;
+ enum sms_device_type_st type;
+};
+
+struct sms_board *sms_get_board(int id);
+
+extern struct usb_device_id smsusb_id_table[];
+
+#endif /* __SMS_CARDS_H__ */
struct completion version_ex_done, data_download_done, trigger_done;
struct completion init_device_done, reload_start_done, resume_done;
+
+ int board_id;
};
+void smscore_set_board_id(struct smscore_device_t *core, int id)
+{
+ core->board_id = id;
+}
+
+int smscore_get_board_id(struct smscore_device_t *core)
+{
+ return core->board_id;
+}
+
struct smscore_registry_entry_t {
struct list_head entry;
char devpath[32];
extern void smscore_putbuffer(struct smscore_device_t *coredev,
struct smscore_buffer_t *cb);
+void smscore_set_board_id(struct smscore_device_t *core, int id);
+int smscore_get_board_id(struct smscore_device_t *core);
+
/* smsdvb.c */
int smsdvb_register(void);
void smsdvb_unregister(void);
#include <linux/init.h>
#include "smscoreapi.h"
+#include "sms-cards.h"
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
static struct dvb_frontend_ops smsdvb_fe_ops = {
.info = {
- .name = "Siano Mobile Digital SMS10xx",
+ .name = "Siano Mobile Digital SMS1xxx",
.type = FE_OFDM,
.frequency_min = 44250000,
.frequency_max = 867250000,
}
/* register dvb adapter */
- rc = dvb_register_adapter(&client->adapter, "Siano Digital Receiver",
+ rc = dvb_register_adapter(&client->adapter,
+ sms_get_board(
+ smscore_get_board_id(coredev))->name,
THIS_MODULE, device, adapter_nr);
if (rc < 0) {
printk(KERN_ERR "%s dvb_register_adapter() failed %d\n",
#include <linux/firmware.h>
#include "smscoreapi.h"
+#include "sms-cards.h"
#define USB1_BUFFER_SIZE 0x1000
#define USB2_BUFFER_SIZE 0x4000
#define MAX_BUFFERS 50
#define MAX_URBS 10
-/* TO DO: move these to a header file */
-#define USB_VID_SIANO 0x187f
-
-#define USB_PID_STELLAR 0x0100
-#define USB_PID_NOVA_A 0x0200
-#define USB_PID_NOVA_B 0x0201
-#define USB_PID_VEGA 0x0300
-
struct smsusb_device_t;
struct smsusb_urb_t {
usb_set_intfdata(intf, NULL);
}
-int smsusb_init_device(struct usb_interface *intf)
+int smsusb_init_device(struct usb_interface *intf, int board_id)
{
struct smsdevice_params_t params;
struct smsusb_device_t *dev;
+ struct sms_board *board;
int i, rc;
/* create device object */
usb_set_intfdata(intf, dev);
dev->udev = interface_to_usbdev(intf);
- switch (dev->udev->descriptor.idProduct) {
+ board = sms_get_board(board_id);
+
+ switch (board->type) {
- case USB_PID_STELLAR:
+ case SMS_STELLAR:
dev->buffer_size = USB1_BUFFER_SIZE;
params.setmode_handler = smsusb1_setmode;
printk(KERN_INFO "%s stellar device found\n", __func__);
break;
default:
- switch (dev->udev->descriptor.idProduct) {
- case USB_PID_NOVA_A:
+ switch (board->type) {
+ case SMS_NOVA_A0:
params.device_type = SMS_NOVA_A0;
printk(KERN_INFO "%s nova A0 found\n", __func__);
break;
- default:
- case USB_PID_NOVA_B:
+ case SMS_NOVA_B0:
params.device_type = SMS_NOVA_B0;
printk(KERN_INFO "%s nova B0 found\n", __func__);
break;
- case USB_PID_VEGA:
+ case SMS_VEGA:
params.device_type = SMS_VEGA;
printk(KERN_INFO "%s Vega found\n", __func__);
+ break;
+ default:
+ printk(KERN_ERR "%s Unspecified sms device type!\n",
+ __func__);
}
dev->buffer_size = USB2_BUFFER_SIZE;
return rc;
}
+ smscore_set_board_id(dev->coredev, board_id);
+
/* initialize urbs */
for (i = 0; i < MAX_URBS; i++) {
dev->surbs[i].dev = dev;
udev, smscore_registry_getmode(devpath));
}
- rc = smsusb_init_device(intf);
+ rc = smsusb_init_device(intf, id->driver_info);
printk(KERN_INFO "%s rc %d\n", __func__, rc);
return rc;
}
smsusb_term_device(intf);
}
-static struct usb_device_id smsusb_id_table [] = {
- { USB_DEVICE(USB_VID_SIANO, USB_PID_STELLAR) },
- { USB_DEVICE(USB_VID_SIANO, USB_PID_NOVA_A) },
- { USB_DEVICE(USB_VID_SIANO, USB_PID_NOVA_B) },
- { USB_DEVICE(USB_VID_SIANO, USB_PID_VEGA) },
- { } /* Terminating entry */
-};
-MODULE_DEVICE_TABLE(usb, smsusb_id_table);
-
static struct usb_driver smsusb_driver = {
.name = "smsusb",
.probe = smsusb_probe,