V4L/DVB (8292): sms1xxx: add code to allow device-specific functionality
authorMichael Krufky <mkrufky@linuxtv.org>
Thu, 19 Jun 2008 01:09:55 +0000 (22:09 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Sun, 20 Jul 2008 10:22:27 +0000 (07:22 -0300)
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>
drivers/media/dvb/siano/Makefile
drivers/media/dvb/siano/sms-cards.c [new file with mode: 0644]
drivers/media/dvb/siano/sms-cards.h [new file with mode: 0644]
drivers/media/dvb/siano/smscoreapi.c
drivers/media/dvb/siano/smscoreapi.h
drivers/media/dvb/siano/smsdvb.c
drivers/media/dvb/siano/smsusb.c

index e549c4e..ee0737a 100644 (file)
@@ -1,4 +1,4 @@
-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
 
diff --git a/drivers/media/dvb/siano/sms-cards.c b/drivers/media/dvb/siano/sms-cards.c
new file mode 100644 (file)
index 0000000..88fc2a4
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ *  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];
+}
+
diff --git a/drivers/media/dvb/siano/sms-cards.h b/drivers/media/dvb/siano/sms-cards.h
new file mode 100644 (file)
index 0000000..7ba3df6
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ *  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__ */
index 32dbe24..a5a3cbf 100644 (file)
@@ -101,8 +101,20 @@ struct smscore_device_t {
 
        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];
index 355c22b..1962f01 100644 (file)
@@ -403,6 +403,9 @@ extern struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *cored
 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);
index b17696f..88b2bd2 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/init.h>
 
 #include "smscoreapi.h"
+#include "sms-cards.h"
 
 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
 
@@ -282,7 +283,7 @@ static void smsdvb_release(struct dvb_frontend *fe)
 
 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,
@@ -333,7 +334,9 @@ int smsdvb_hotplug(struct smscore_device_t *coredev,
        }
 
        /* 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",
index 2918388..bb8a364 100644 (file)
@@ -25,6 +25,7 @@
 #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 {
@@ -287,10 +280,11 @@ void smsusb_term_device(struct usb_interface *intf)
        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 */
@@ -305,9 +299,11 @@ int smsusb_init_device(struct usb_interface *intf)
        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;
@@ -316,19 +312,22 @@ int smsusb_init_device(struct usb_interface *intf)
                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;
@@ -357,6 +356,8 @@ int smsusb_init_device(struct usb_interface *intf)
                return rc;
        }
 
+       smscore_set_board_id(dev->coredev, board_id);
+
        /* initialize urbs */
        for (i = 0; i < MAX_URBS; i++) {
                dev->surbs[i].dev = dev;
@@ -426,7 +427,7 @@ int smsusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
                                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;
 }
@@ -436,15 +437,6 @@ void smsusb_disconnect(struct usb_interface *intf)
        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,