The patch number 10754 was added via Mauro Carvalho Chehab <mche...@redhat.com>
to http://linuxtv.org/hg/v4l-dvb master development tree.

Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel

If anyone has any objections, please let us know by sending a message to:
        Linux Media Mailing List <linux-me...@vger.kernel.org>

------

From: Mauro Carvalho Chehab  <mche...@redhat.com>
merge: http://linuxtv.org/hg/~mkrufky/sms1xxx


Signed-off-by: Mauro Carvalho Chehab <mche...@redhat.com>


---

 linux/drivers/media/dvb/siano/Makefile     |    4 
 linux/drivers/media/dvb/siano/sms-cards.c  |  100 +++++++---------
 linux/drivers/media/dvb/siano/sms-cards.h  |    5 
 linux/drivers/media/dvb/siano/smscoreapi.c |  124 +++++++++++++++++----
 linux/drivers/media/dvb/siano/smscoreapi.h |   42 +------
 linux/drivers/media/dvb/siano/smsdvb.c     |   66 +++++++++--
 linux/drivers/media/dvb/siano/smsusb.c     |   73 +++++++++++-
 7 files changed, 286 insertions(+), 128 deletions(-)

diff -r 51664b7471a2 -r 008f357fb0fa linux/drivers/media/dvb/siano/Makefile
--- a/linux/drivers/media/dvb/siano/Makefile    Thu Feb 26 22:01:51 2009 -0300
+++ b/linux/drivers/media/dvb/siano/Makefile    Thu Feb 26 22:04:49 2009 -0300
@@ -1,6 +1,8 @@ sms1xxx-objs := smscoreapi.o smsusb.o sm
-sms1xxx-objs := smscoreapi.o smsusb.o smsdvb.o sms-cards.o
+sms1xxx-objs := smscoreapi.o sms-cards.o
 
 obj-$(CONFIG_DVB_SIANO_SMS1XXX) += sms1xxx.o
+obj-$(CONFIG_DVB_SIANO_SMS1XXX) += smsusb.o
+obj-$(CONFIG_DVB_SIANO_SMS1XXX) += smsdvb.o
 
 EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core
 
diff -r 51664b7471a2 -r 008f357fb0fa linux/drivers/media/dvb/siano/sms-cards.c
--- a/linux/drivers/media/dvb/siano/sms-cards.c Thu Feb 26 22:01:51 2009 -0300
+++ b/linux/drivers/media/dvb/siano/sms-cards.c Thu Feb 26 22:04:49 2009 -0300
@@ -19,53 +19,6 @@
 
 #include "sms-cards.h"
 
-struct usb_device_id smsusb_id_table[] = {
-#ifdef CONFIG_DVB_SIANO_SMS1XXX_SMS_IDS
-       { 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 },
-#endif
-       { USB_DEVICE(0x2040, 0x1700),
-               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT },
-       { USB_DEVICE(0x2040, 0x1800),
-               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A },
-       { USB_DEVICE(0x2040, 0x1801),
-               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B },
-       { USB_DEVICE(0x2040, 0x2000),
-               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
-       { USB_DEVICE(0x2040, 0x2009),
-               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2 },
-       { USB_DEVICE(0x2040, 0x200a),
-               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
-       { USB_DEVICE(0x2040, 0x2010),
-               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
-       { USB_DEVICE(0x2040, 0x2011),
-               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
-       { USB_DEVICE(0x2040, 0x2019),
-               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
-       { USB_DEVICE(0x2040, 0x5500),
-               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
-       { USB_DEVICE(0x2040, 0x5510),
-               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
-       { USB_DEVICE(0x2040, 0x5520),
-               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
-       { USB_DEVICE(0x2040, 0x5530),
-               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
-       { USB_DEVICE(0x2040, 0x5580),
-               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
-       { USB_DEVICE(0x2040, 0x5590),
-               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
-       { }             /* Terminating entry */
-};
-MODULE_DEVICE_TABLE(usb, smsusb_id_table);
-
 static struct sms_board sms_boards[] = {
        [SMS_BOARD_UNKNOWN] = {
                .name   = "Unknown board",
@@ -117,6 +70,7 @@ static struct sms_board sms_boards[] = {
                .type   = SMS_NOVA_B0,
                .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw",
                .lna_ctrl  = 29,
+               .rf_switch = 17,
        },
        [SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2] = {
                .name   = "Hauppauge WinTV MiniCard",
@@ -132,6 +86,7 @@ struct sms_board *sms_get_board(int id)
 
        return &sms_boards[id];
 }
+EXPORT_SYMBOL_GPL(sms_get_board);
 
 static int sms_set_gpio(struct smscore_device_t *coredev, int pin, int enable)
 {
@@ -184,6 +139,7 @@ int sms_board_setup(struct smscore_devic
        }
        return 0;
 }
+EXPORT_SYMBOL_GPL(sms_board_setup);
 
 int sms_board_power(struct smscore_device_t *coredev, int onoff)
 {
@@ -199,12 +155,13 @@ int sms_board_power(struct smscore_devic
        case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
        case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
                /* LNA */
-               sms_set_gpio(coredev,
-                            board->lna_ctrl, onoff ? 1 : 0);
-               break;
-       }
-       return 0;
-}
+               if (!onoff)
+                       sms_set_gpio(coredev, board->lna_ctrl, 0);
+               break;
+       }
+       return 0;
+}
+EXPORT_SYMBOL_GPL(sms_board_power);
 
 int sms_board_led_feedback(struct smscore_device_t *coredev, int led)
 {
@@ -227,3 +184,40 @@ int sms_board_led_feedback(struct smscor
        }
        return 0;
 }
+EXPORT_SYMBOL_GPL(sms_board_led_feedback);
+
+int sms_board_lna_control(struct smscore_device_t *coredev, int onoff)
+{
+       int board_id = smscore_get_board_id(coredev);
+       struct sms_board *board = sms_get_board(board_id);
+
+       sms_debug("%s: LNA %s", __func__, onoff ? "enabled" : "disabled");
+
+       switch (board_id) {
+       case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
+       case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
+               sms_set_gpio(coredev,
+                            board->rf_switch, onoff ? 1 : 0);
+               return sms_set_gpio(coredev,
+                                   board->lna_ctrl, onoff ? 1 : 0);
+       }
+       return -EINVAL;
+}
+EXPORT_SYMBOL_GPL(sms_board_lna_control);
+
+int sms_board_load_modules(int id)
+{
+       switch (id) {
+       case SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT:
+       case SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A:
+       case SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B:
+       case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
+               request_module("smsdvb");
+               break;
+       default:
+               /* do nothing */
+               break;
+       }
+       return 0;
+}
+EXPORT_SYMBOL_GPL(sms_board_load_modules);
diff -r 51664b7471a2 -r 008f357fb0fa linux/drivers/media/dvb/siano/sms-cards.h
--- a/linux/drivers/media/dvb/siano/sms-cards.h Thu Feb 26 22:01:51 2009 -0300
+++ b/linux/drivers/media/dvb/siano/sms-cards.h Thu Feb 26 22:04:49 2009 -0300
@@ -40,7 +40,7 @@ struct sms_board {
        char *name, *fw[DEVICE_MODE_MAX];
 
        /* gpios */
-       int led_power, led_hi, led_lo, lna_ctrl;
+       int led_power, led_hi, led_lo, lna_ctrl, rf_switch;
 };
 
 struct sms_board *sms_get_board(int id);
@@ -52,7 +52,8 @@ int sms_board_setup(struct smscore_devic
 #define SMS_LED_HI  2
 int sms_board_led_feedback(struct smscore_device_t *coredev, int led);
 int sms_board_power(struct smscore_device_t *coredev, int onoff);
+int sms_board_lna_control(struct smscore_device_t *coredev, int onoff);
 
-extern struct usb_device_id smsusb_id_table[];
+extern int sms_board_load_modules(int id);
 
 #endif /* __SMS_CARDS_H__ */
diff -r 51664b7471a2 -r 008f357fb0fa linux/drivers/media/dvb/siano/smscoreapi.c
--- a/linux/drivers/media/dvb/siano/smscoreapi.c        Thu Feb 26 22:01:51 
2009 -0300
+++ b/linux/drivers/media/dvb/siano/smscoreapi.c        Thu Feb 26 22:04:49 
2009 -0300
@@ -3,7 +3,7 @@
  *
  *  This file contains implementation for the interface to sms core component
  *
- *  author: Anatoly Greenblat
+ *  author: Uri Shkolnik
  *
  *  Copyright (c), 2005-2008 Siano Mobile Silicon, Inc.
  *
@@ -34,8 +34,8 @@
 #include "smscoreapi.h"
 #include "sms-cards.h"
 
-int sms_debug;
-module_param_named(debug, sms_debug, int, 0644);
+int sms_dbg;
+module_param_named(debug, sms_dbg, int, 0644);
 MODULE_PARM_DESC(debug, "set debug level (info=1, adv=2 (or-able))");
 
 struct smscore_device_notifyee_t {
@@ -105,11 +105,13 @@ int smscore_led_state(struct smscore_dev
                core->led_state = led;
        return core->led_state;
 }
+EXPORT_SYMBOL_GPL(smscore_set_board_id);
 
 int smscore_get_board_id(struct smscore_device_t *core)
 {
        return core->board_id;
 }
+EXPORT_SYMBOL_GPL(smscore_get_board_id);
 
 struct smscore_registry_entry_t {
        struct list_head entry;
@@ -170,6 +172,7 @@ int smscore_registry_getmode(char *devpa
 
        return default_mode;
 }
+EXPORT_SYMBOL_GPL(smscore_registry_getmode);
 
 static enum sms_device_type_st smscore_registry_gettype(char *devpath)
 {
@@ -261,6 +264,7 @@ int smscore_register_hotplug(hotplug_t h
 
        return rc;
 }
+EXPORT_SYMBOL_GPL(smscore_register_hotplug);
 
 /**
  * unregister a client callback that called when device plugged in/unplugged
@@ -289,6 +293,7 @@ void smscore_unregister_hotplug(hotplug_
 
        kmutex_unlock(&g_smscore_deviceslock);
 }
+EXPORT_SYMBOL_GPL(smscore_unregister_hotplug);
 
 static void smscore_notify_clients(struct smscore_device_t *coredev)
 {
@@ -432,6 +437,7 @@ int smscore_register_device(struct smsde
 
        return 0;
 }
+EXPORT_SYMBOL_GPL(smscore_register_device);
 
 /**
  * sets initial device mode and notifies client hotplugs that device is ready
@@ -460,6 +466,7 @@ int smscore_start_device(struct smscore_
 
        return rc;
 }
+EXPORT_SYMBOL_GPL(smscore_start_device);
 
 static int smscore_sendrequest_and_wait(struct smscore_device_t *coredev,
                                        void *buffer, size_t size,
@@ -688,6 +695,7 @@ void smscore_unregister_device(struct sm
 
        sms_info("device %p destroyed", coredev);
 }
+EXPORT_SYMBOL_GPL(smscore_unregister_device);
 
 static int smscore_detect_mode(struct smscore_device_t *coredev)
 {
@@ -732,7 +740,7 @@ static char *smscore_fw_lkup[][SMS_NUM_O
        /*DVBH*/
        {"none", "dvb_nova_12mhz.inp", "dvb_nova_12mhz_b0.inp", "none"},
        /*TDMB*/
-       {"none", "tdmb_nova_12mhz.inp", "none", "none"},
+       {"none", "tdmb_nova_12mhz.inp", "tdmb_nova_12mhz_b0.inp", "none"},
        /*DABIP*/
        {"none", "none", "none", "none"},
        /*BDA*/
@@ -879,6 +887,7 @@ int smscore_get_device_mode(struct smsco
 {
        return coredev->mode;
 }
+EXPORT_SYMBOL_GPL(smscore_get_device_mode);
 
 /**
  * find client by response id & type within the clients list.
@@ -960,10 +969,6 @@ void smscore_onresponse(struct smscore_d
 #endif
        /* If no client registered for type & id,
         * check for control client where type is not registered */
-#if 0
-       if (!client)
-               client = smscore_find_client(coredev, 0, phdr->msgDstId);
-#endif
        if (client)
                rc = client->onresponse_handler(client->context, cb);
 
@@ -1017,6 +1022,7 @@ void smscore_onresponse(struct smscore_d
                smscore_putbuffer(coredev, cb);
        }
 }
+EXPORT_SYMBOL_GPL(smscore_onresponse);
 
 /**
  * return pointer to next free buffer descriptor from core pool
@@ -1042,6 +1048,7 @@ struct smscore_buffer_t *smscore_getbuff
 
        return cb;
 }
+EXPORT_SYMBOL_GPL(smscore_getbuffer);
 
 /**
  * return buffer descriptor to a pool
@@ -1056,6 +1063,7 @@ void smscore_putbuffer(struct smscore_de
 {
        list_add_locked(&cb->entry, &coredev->buffers, &coredev->bufferslock);
 }
+EXPORT_SYMBOL_GPL(smscore_putbuffer);
 
 static int smscore_validate_client(struct smscore_device_t *coredev,
                                   struct smscore_client_t *client,
@@ -1135,6 +1143,7 @@ int smscore_register_client(struct smsco
 
        return 0;
 }
+EXPORT_SYMBOL_GPL(smscore_register_client);
 
 /**
  * frees smsclient object and all subclients associated with it
@@ -1165,6 +1174,7 @@ void smscore_unregister_client(struct sm
 
        spin_unlock_irqrestore(&coredev->clientslock, flags);
 }
+EXPORT_SYMBOL_GPL(smscore_unregister_client);
 
 /**
  * verifies that source id is not taken by another client,
@@ -1204,6 +1214,7 @@ int smsclient_sendrequest(struct smscore
 
        return coredev->sendrequest_handler(coredev->context, buffer, size);
 }
+EXPORT_SYMBOL_GPL(smsclient_sendrequest);
 
 #if 0
 /**
@@ -1337,12 +1348,67 @@ static int __init smscore_module_init(vo
        INIT_LIST_HEAD(&g_smscore_registry);
        kmutex_init(&g_smscore_registrylock);
 
+#if 0 /* def SMS_CHAR_CLIENT */
+       /* Char interface Register */
+       rc = smschar_register();
+       if (rc) {
+               sms_err("Error registering char device client.\n");
+               goto smschar_error;
+       }
+#endif
+
+#if 0 /* def SMS_DVB_CLIENT */
+       /* DVB Register */
+       rc = smsdvb_register();
+       if (rc) {
+               sms_err("Error registering DVB client.\n");
+               goto smsdvb_error;
+       }
+#endif
+
+#if 0 /* def SMS_NET_CLIENT */
+       /* DVB Register */
+       rc = smsnet_register();
+       if (rc) {
+               sms_err("Error registering Network client.\n");
+               goto smsnet_error;
+       }
+#endif
+
+#if 0 /* def SMS_USB_BUS_DRV */
        /* USB Register */
        rc = smsusb_register();
-
-       /* DVB Register */
-       rc = smsdvb_register();
-
+       if (rc) {
+               sms_err("Error registering USB bus driver.\n");
+               goto sms_bus_drv_error;
+       }
+#endif
+
+#if 0 /* def SMS_SPI_BUS_DRV */
+       /* USB Register */
+       rc = smsspi_register();
+       if (rc) {
+               sms_err("Error registering spi bus driver.\n");
+               goto sms_bus_drv_error;
+       }
+#endif
+
+       return rc;
+#if 0
+sms_bus_drv_error:
+#endif /* 0 */
+#if 0 /* def SMS_NET_CLIENT */
+       smsnet_unregister();
+smsnet_error:
+#endif
+#if 0 /* def SMS_DVB_CLIENT */
+       smsdvb_unregister();
+smsdvb_error:
+#endif
+#if 0 /* def SMS_CHAR_CLIENT */
+       smschar_unregister();
+smschar_error:
+#endif
        sms_debug("rc %d", rc);
 
        return rc;
@@ -1350,6 +1416,30 @@ static int __init smscore_module_init(vo
 
 static void __exit smscore_module_exit(void)
 {
+#if 0 /* def SMS_CHAR_CLIENT */
+       /* Char interface UnRegister */
+       smschar_unregister();
+#endif
+
+#if 0 /* def SMS_DVB_CLIENT */
+       /* DVB UnRegister */
+       smsdvb_unregister();
+#endif
+
+#if 0 /* def SMS_NET_CLIENT */
+       /* NET UnRegister */
+       smsnet_unregister();
+#endif
+
+#if 0 /* def SMS_USB_BUS_DRV */
+       /* Unregister USB */
+       smsusb_unregister();
+#endif
+
+#if 0 /* def SMS_SPI_BUS_DRV */
+       /* Unregister SPI */
+       smsspi_unregister();
+#endif
 
        kmutex_lock(&g_smscore_deviceslock);
        while (!list_empty(&g_smscore_notifyees)) {
@@ -1373,18 +1463,12 @@ static void __exit smscore_module_exit(v
        }
        kmutex_unlock(&g_smscore_registrylock);
 
-       /* DVB UnRegister */
-       smsdvb_unregister();
-
-       /* Unregister USB */
-       smsusb_unregister();
-
        sms_debug("");
 }
 
 module_init(smscore_module_init);
 module_exit(smscore_module_exit);
 
-MODULE_DESCRIPTION("Driver for the Siano SMS1XXX USB dongle");
-MODULE_AUTHOR("Siano Mobile Silicon,,, (dor...@siano-ms.com)");
+MODULE_DESCRIPTION("Siano MDTV Core module");
+MODULE_AUTHOR("Siano Mobile Silicon, Inc. (u...@siano-ms.com)");
 MODULE_LICENSE("GPL");
diff -r 51664b7471a2 -r 008f357fb0fa linux/drivers/media/dvb/siano/smscoreapi.h
--- a/linux/drivers/media/dvb/siano/smscoreapi.h        Thu Feb 26 22:01:51 
2009 -0300
+++ b/linux/drivers/media/dvb/siano/smscoreapi.h        Thu Feb 26 22:04:49 
2009 -0300
@@ -29,14 +29,14 @@
 #include <linux/scatterlist.h>
 #include <linux/types.h>
 #include <asm/page.h>
-
+#include <linux/mutex.h>
 #include "compat.h"
+
 #include "dmxdev.h"
 #include "dvbdev.h"
 #include "dvb_demux.h"
 #include "dvb_frontend.h"
 
-#include <linux/mutex.h>
 
 #define kmutex_init(_p_) mutex_init(_p_)
 #define kmutex_lock(_p_) mutex_lock(_p_)
@@ -523,27 +523,6 @@ struct smscore_gpio_config {
        u8 outputdriving;
 };
 
-struct smsdvb_client_t {
-       struct list_head entry;
-
-       struct smscore_device_t *coredev;
-       struct smscore_client_t *smsclient;
-
-       struct dvb_adapter      adapter;
-       struct dvb_demux        demux;
-       struct dmxdev           dmxdev;
-       struct dvb_frontend     frontend;
-
-       fe_status_t             fe_status;
-       int                     fe_ber, fe_snr, fe_unc, fe_signal_strength;
-
-       struct completion       tune_done, stat_done;
-
-       /* todo: save freq/band instead whole struct */
-       struct dvb_frontend_parameters fe_params;
-
-};
-
 extern void smscore_registry_setmode(char *devpath, int mode);
 extern int smscore_registry_getmode(char *devpath);
 
@@ -572,10 +551,14 @@ extern void smscore_onresponse(struct sm
 extern void smscore_onresponse(struct smscore_device_t *coredev,
                               struct smscore_buffer_t *cb);
 
-#if 0
+#if 1
 extern int smscore_get_common_buffer_size(struct smscore_device_t *coredev);
 extern int smscore_map_common_buffer(struct smscore_device_t *coredev,
                                      struct vm_area_struct *vma);
+extern int smscore_get_fw_filename(struct smscore_device_t *coredev,
+                                  int mode, char *filename);
+extern int smscore_send_fw_file(struct smscore_device_t *coredev,
+                               u8 *ufwbuf, int size);
 #endif
 
 extern
@@ -592,17 +575,10 @@ int smscore_get_board_id(struct smscore_
 
 int smscore_led_state(struct smscore_device_t *core, int led);
 
-/* smsdvb.c */
-int smsdvb_register(void);
-void smsdvb_unregister(void);
-
-/* smsusb.c */
-int smsusb_register(void);
-void smsusb_unregister(void);
 
 /* ------------------------------------------------------------------------ */
 
-extern int sms_debug;
+extern int sms_dbg;
 
 #define DBG_INFO 1
 #define DBG_ADV  2
@@ -611,7 +587,7 @@ extern int sms_debug;
        printk(kern "%s: " fmt "\n", __func__, ##arg)
 
 #define dprintk(kern, lvl, fmt, arg...) do {\
-       if (sms_debug & lvl) \
+       if (sms_dbg & lvl) \
                sms_printk(kern, fmt, ##arg); } while (0)
 
 #define sms_log(fmt, arg...) sms_printk(KERN_INFO, fmt, ##arg)
diff -r 51664b7471a2 -r 008f357fb0fa linux/drivers/media/dvb/siano/smsdvb.c
--- a/linux/drivers/media/dvb/siano/smsdvb.c    Thu Feb 26 22:01:51 2009 -0300
+++ b/linux/drivers/media/dvb/siano/smsdvb.c    Thu Feb 26 22:04:49 2009 -0300
@@ -1,7 +1,7 @@
 /*
  *  Driver for the Siano SMS1xxx USB dongle
  *
- *  author: Anatoly Greenblat
+ *  Author: Uri Shkolni
  *
  *  Copyright (c), 2005-2008 Siano Mobile Silicon, Inc.
  *
@@ -27,8 +27,32 @@
 
 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
 
+struct smsdvb_client_t {
+       struct list_head entry;
+
+       struct smscore_device_t *coredev;
+       struct smscore_client_t *smsclient;
+
+       struct dvb_adapter      adapter;
+       struct dvb_demux        demux;
+       struct dmxdev           dmxdev;
+       struct dvb_frontend     frontend;
+
+       fe_status_t             fe_status;
+       int                     fe_ber, fe_snr, fe_unc, fe_signal_strength;
+
+       struct completion       tune_done, stat_done;
+
+       /* todo: save freq/band instead whole struct */
+       struct dvb_frontend_parameters fe_params;
+};
+
 static struct list_head g_smsdvb_clients;
 static struct mutex g_smsdvb_clientslock;
+
+int sms_dbg;
+module_param_named(debug, sms_dbg, int, 0644);
+MODULE_PARM_DESC(debug, "set debug level (info=1, adv=2 (or-able))");
 
 static int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb)
 {
@@ -262,6 +286,7 @@ static int smsdvb_set_frontend(struct dv
                struct SmsMsgHdr_ST     Msg;
                u32             Data[3];
        } Msg;
+       int ret;
 
        Msg.Msg.msgSrcId  = DVBT_BDA_CONTROL_MSG_ID;
        Msg.Msg.msgDstId  = HIF_TASK;
@@ -285,6 +310,24 @@ static int smsdvb_set_frontend(struct dv
        default: return -EINVAL;
        }
 
+       /* Disable LNA, if any. An error is returned if no LNA is present */
+       ret = sms_board_lna_control(client->coredev, 0);
+       if (ret == 0) {
+               fe_status_t status;
+
+               /* tune with LNA off at first */
+               ret = smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg),
+                                                 &client->tune_done);
+
+               smsdvb_read_status(fe, &status);
+
+               if (status & FE_HAS_LOCK)
+                       return ret;
+
+               /* previous tune didnt lock - enable LNA and tune again */
+               sms_board_lna_control(client->coredev, 1);
+       }
+
        return smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg),
                                           &client->tune_done);
 }
@@ -332,7 +375,7 @@ static void smsdvb_release(struct dvb_fr
 
 static struct dvb_frontend_ops smsdvb_fe_ops = {
        .info = {
-               .name                   = "Siano Mobile Digital SMS1xxx",
+               .name                   = "Siano Mobile Digital MDTV Receiver",
                .type                   = FE_OFDM,
                .frequency_min          = 44250000,
                .frequency_max          = 867250000,
@@ -374,16 +417,10 @@ static int smsdvb_hotplug(struct smscore
        if (!arrival)
                return 0;
 
-       if (smscore_get_device_mode(coredev) != 4) {
-#if 1 /* new siano drop (1.2.17) does this -- yuck */
+       if (smscore_get_device_mode(coredev) != DEVICE_MODE_DVBT_BDA) {
                sms_err("SMS Device mode is not set for "
                        "DVB operation.");
                return 0;
-#else
-               rc = smscore_set_device_mode(coredev, 4);
-               if (rc < 0)
-                       return rc;
-#endif
        }
 
        client = kzalloc(sizeof(struct smsdvb_client_t), GFP_KERNEL);
@@ -482,7 +519,7 @@ adapter_error:
        return rc;
 }
 
-int smsdvb_register(void)
+int smsdvb_module_init(void)
 {
        int rc;
 
@@ -496,7 +533,7 @@ int smsdvb_register(void)
        return rc;
 }
 
-void smsdvb_unregister(void)
+void smsdvb_module_exit(void)
 {
        smscore_unregister_hotplug(smsdvb_hotplug);
 
@@ -508,3 +545,10 @@ void smsdvb_unregister(void)
 
        kmutex_unlock(&g_smsdvb_clientslock);
 }
+
+module_init(smsdvb_module_init);
+module_exit(smsdvb_module_exit);
+
+MODULE_DESCRIPTION("SMS DVB subsystem adaptation module");
+MODULE_AUTHOR("Siano Mobile Silicon, INC. (u...@siano-ms.com)");
+MODULE_LICENSE("GPL");
diff -r 51664b7471a2 -r 008f357fb0fa linux/drivers/media/dvb/siano/smsusb.c
--- a/linux/drivers/media/dvb/siano/smsusb.c    Thu Feb 26 22:01:51 2009 -0300
+++ b/linux/drivers/media/dvb/siano/smsusb.c    Thu Feb 26 22:04:49 2009 -0300
@@ -26,6 +26,10 @@
 
 #include "smscoreapi.h"
 #include "sms-cards.h"
+
+int sms_dbg;
+module_param_named(debug, sms_dbg, int, 0644);
+MODULE_PARM_DESC(debug, "set debug level (info=1, adv=2 (or-able))");
 
 #define USB1_BUFFER_SIZE               0x1000
 #define USB2_BUFFER_SIZE               0x4000
@@ -428,6 +432,7 @@ static int smsusb_probe(struct usb_inter
 
        rc = smsusb_init_device(intf, id->driver_info);
        sms_info("rc %d", rc);
+       sms_board_load_modules(id->driver_info);
        return rc;
 }
 
@@ -440,7 +445,7 @@ static int smsusb_suspend(struct usb_int
 {
        struct smsusb_device_t *dev =
                (struct smsusb_device_t *)usb_get_intfdata(intf);
-       printk(KERN_INFO "%s  Entering status %d.\n", __func__, msg.event);
+       printk(KERN_INFO "%s: Entering status %d.\n", __func__, msg.event);
        smsusb_stop_streaming(dev);
        return 0;
 }
@@ -452,7 +457,7 @@ static int smsusb_resume(struct usb_inte
                (struct smsusb_device_t *)usb_get_intfdata(intf);
        struct usb_device *udev = interface_to_usbdev(intf);
 
-       printk(KERN_INFO "%s  Entering.\n", __func__);
+       printk(KERN_INFO "%s: Entering.\n", __func__);
        usb_clear_halt(udev, usb_rcvbulkpipe(udev, 0x81));
        usb_clear_halt(udev, usb_rcvbulkpipe(udev, 0x02));
 
@@ -467,9 +472,8 @@ static int smsusb_resume(struct usb_inte
                                       intf->cur_altsetting->desc.
                                       bInterfaceNumber, 0);
                if (rc < 0) {
-                       printk(KERN_INFO
-                              "%s usb_set_interface failed, rc %d\n",
-                              __func__, rc);
+                       printk(KERN_INFO "%s usb_set_interface failed, "
+                              "rc %d\n", __func__, rc);
                        return rc;
                }
        }
@@ -478,8 +482,55 @@ static int smsusb_resume(struct usb_inte
        return 0;
 }
 
+struct usb_device_id smsusb_id_table[] = {
+#ifdef CONFIG_DVB_SIANO_SMS1XXX_SMS_IDS
+       { 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 },
+#endif
+       { USB_DEVICE(0x2040, 0x1700),
+               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT },
+       { USB_DEVICE(0x2040, 0x1800),
+               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A },
+       { USB_DEVICE(0x2040, 0x1801),
+               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B },
+       { USB_DEVICE(0x2040, 0x2000),
+               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
+       { USB_DEVICE(0x2040, 0x2009),
+               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2 },
+       { USB_DEVICE(0x2040, 0x200a),
+               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
+       { USB_DEVICE(0x2040, 0x2010),
+               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
+       { USB_DEVICE(0x2040, 0x2011),
+               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
+       { USB_DEVICE(0x2040, 0x2019),
+               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
+       { USB_DEVICE(0x2040, 0x5500),
+               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
+       { USB_DEVICE(0x2040, 0x5510),
+               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
+       { USB_DEVICE(0x2040, 0x5520),
+               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
+       { USB_DEVICE(0x2040, 0x5530),
+               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
+       { USB_DEVICE(0x2040, 0x5580),
+               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
+       { USB_DEVICE(0x2040, 0x5590),
+               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
+       { }             /* Terminating entry */
+};
+MODULE_DEVICE_TABLE(usb, smsusb_id_table);
+
 static struct usb_driver smsusb_driver = {
-       .name                   = "sms1xxx",
+       .name                   = "smsusb",
        .probe                  = smsusb_probe,
        .disconnect             = smsusb_disconnect,
        .id_table               = smsusb_id_table,
@@ -488,7 +539,7 @@ static struct usb_driver smsusb_driver =
        .resume                 = smsusb_resume,
 };
 
-int smsusb_register(void)
+int smsusb_module_init(void)
 {
        int rc = usb_register(&smsusb_driver);
        if (rc)
@@ -499,10 +550,16 @@ int smsusb_register(void)
        return rc;
 }
 
-void smsusb_unregister(void)
+void smsusb_module_exit(void)
 {
        sms_debug("");
        /* Regular USB Cleanup */
        usb_deregister(&smsusb_driver);
 }
 
+module_init(smsusb_module_init);
+module_exit(smsusb_module_exit);
+
+MODULE_DESCRIPTION("Driver for the Siano SMS1XXX USB dongle");
+MODULE_AUTHOR("Siano Mobile Silicon, INC. (u...@siano-ms.com)");
+MODULE_LICENSE("GPL");


---

Patch is available at: 
http://linuxtv.org/hg/v4l-dvb/rev/008f357fb0fa8fdf96cd3cca57f449adba9d7b3d

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to