# HG changeset patch
# User Uri Shkolnik <u...@siano-ms.com>
# Date 1231849043 -7200
# Node ID 84bd0617f712c993f6ee767c78483e147b049a49
# Parent  1432098ff39090d2d619ce509031675e1e91ea5a
SMS Cards module upgrade

From: Uri Shkolnik <u...@siano-ms.com>

This patch provides generic events handling for SMS chip-sets based boards and 
cards
Venice and Vega development boaqrds have been Added

Priority: normal

Signed-off-by: Uri Shkolnik <u...@siano-ms.com>

diff -r 1432098ff390 -r 84bd0617f712 linux/drivers/media/dvb/siano/sms-cards.c
--- a/linux/drivers/media/dvb/siano/sms-cards.c Tue Jan 13 14:08:17 2009 +0200
+++ b/linux/drivers/media/dvb/siano/sms-cards.c Tue Jan 13 14:17:23 2009 +0200
@@ -20,7 +20,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),
@@ -31,7 +30,6 @@ struct usb_device_id smsusb_id_table[] =
                .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),
@@ -60,168 +58,272 @@ struct usb_device_id smsusb_id_table[] =
                .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
        { USB_DEVICE(0x2040, 0x5590),
                .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
-       { }             /* Terminating entry */
-};
+       { USB_DEVICE(0x187f, 0x0202),
+               .driver_info = SMS1XXX_BOARD_SIANO_NICE },
+       { USB_DEVICE(0x187f, 0x0301),
+               .driver_info = SMS1XXX_BOARD_SIANO_VENICE },
+       { } /* Terminating entry */
+       };
+
 MODULE_DEVICE_TABLE(usb, smsusb_id_table);
 
 static struct sms_board sms_boards[] = {
        [SMS_BOARD_UNKNOWN] = {
-               .name   = "Unknown board",
+       /* 0 */
+               .name = "Unknown board",
        },
        [SMS1XXX_BOARD_SIANO_STELLAR] = {
-               .name   = "Siano Stellar Digital Receiver",
-               .type   = SMS_STELLAR,
-               .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-stellar-dvbt-01.fw",
+       /* 1 */
+               .name =
+               "Siano Stellar Digital Receiver",
+               .type = SMS_STELLAR,
+               .fw[DEVICE_MODE_DVBT_BDA] =
+               "sms1xxx-stellar-dvbt-01.fw",
        },
        [SMS1XXX_BOARD_SIANO_NOVA_A] = {
-               .name   = "Siano Nova A Digital Receiver",
-               .type   = SMS_NOVA_A0,
-               .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-nova-a-dvbt-01.fw",
+       /* 2 */
+               .name = "Siano Nova A Digital Receiver",
+               .type = SMS_NOVA_A0,
+               .fw[DEVICE_MODE_DVBT_BDA] =
+               "sms1xxx-nova-a-dvbt-01.fw",
        },
        [SMS1XXX_BOARD_SIANO_NOVA_B] = {
-               .name   = "Siano Nova B Digital Receiver",
-               .type   = SMS_NOVA_B0,
-               .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-nova-b-dvbt-01.fw",
+       /* 3 */
+               .name = "Siano Nova B Digital Receiver",
+               .type = SMS_NOVA_B0,
+               .fw[DEVICE_MODE_DVBT_BDA] =
+               "sms1xxx-nova-b-dvbt-01.fw",
        },
        [SMS1XXX_BOARD_SIANO_VEGA] = {
-               .name   = "Siano Vega Digital Receiver",
-               .type   = SMS_VEGA,
+       /* 4 */
+               .name = "Siano Vega Digital Receiver",
+               .type = SMS_VEGA,
        },
        [SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT] = {
-               .name   = "Hauppauge Catamount",
-               .type   = SMS_STELLAR,
-               .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-stellar-dvbt-01.fw",
+       /* 5 */
+               .name = "Hauppauge Catamount",
+               .type = SMS_STELLAR,
+               .fw[DEVICE_MODE_DVBT_BDA] =
+               "sms1xxx-stellar-dvbt-01.fw",
        },
        [SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A] = {
-               .name   = "Hauppauge Okemo-A",
-               .type   = SMS_NOVA_A0,
-               .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-nova-a-dvbt-01.fw",
+       /* 6 */
+               .name = "Hauppauge Okemo-A",
+               .type = SMS_NOVA_A0,
+               .fw[DEVICE_MODE_DVBT_BDA] =
+               "sms1xxx-nova-a-dvbt-01.fw",
        },
        [SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B] = {
-               .name   = "Hauppauge Okemo-B",
-               .type   = SMS_NOVA_B0,
-               .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-nova-b-dvbt-01.fw",
+       /* 7 */
+               .name = "Hauppauge Okemo-B",
+               .type = SMS_NOVA_B0,
+               .fw[DEVICE_MODE_DVBT_BDA] =
+               "sms1xxx-nova-b-dvbt-01.fw",
        },
        [SMS1XXX_BOARD_HAUPPAUGE_WINDHAM] = {
-               .name   = "Hauppauge WinTV MiniStick",
-               .type   = SMS_NOVA_B0,
+       /* 8 */
+               .name = "Hauppauge WinTV MiniStick",
+               .type = SMS_NOVA_B0,
                .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw",
-               .led_power = 26,
-               .led_lo    = 27,
-               .led_hi    = 28,
+               .board_cfg.leds_power = 26,
+               .board_cfg.led0 = 27,
+               .board_cfg.led1 = 28,
        },
        [SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD] = {
-               .name   = "Hauppauge WinTV MiniCard",
-               .type   = SMS_NOVA_B0,
+       /* 9 */
+               .name = "Hauppauge WinTV MiniCard",
+               .type = SMS_NOVA_B0,
                .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw",
-               .lna_ctrl  = 29,
+               .board_cfg.foreign_lna0_ctrl = 29,
        },
        [SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2] = {
-               .name   = "Hauppauge WinTV MiniCard",
-               .type   = SMS_NOVA_B0,
+       /* 10 */
+               .name = "Hauppauge WinTV MiniCard",
+               .type = SMS_NOVA_B0,
                .fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw",
-               .lna_ctrl  = -1,
+               .board_cfg.foreign_lna0_ctrl = 1,
+       },
+       [SMS1XXX_BOARD_SIANO_NICE] = {
+       /* 11 */
+               .name = "Siano Nice Digital Receiver",
+               .type = SMS_NOVA_B0,
+       },
+       [SMS1XXX_BOARD_SIANO_VENICE] = {
+       /* 12 */
+               .name = "Siano Venice Digital Receiver",
+               .type = SMS_VEGA,
        },
 };
 
 struct sms_board *sms_get_board(int id)
 {
        BUG_ON(id >= ARRAY_SIZE(sms_boards));
-
        return &sms_boards[id];
 }
 
-static int sms_set_gpio(struct smscore_device_t *coredev, int pin, int enable)
-{
-       int lvl, ret;
-       u32 gpio;
-       struct smscore_gpio_config gpioconfig = {
-               .direction            = SMS_GPIO_DIRECTION_OUTPUT,
-               .pullupdown           = SMS_GPIO_PULLUPDOWN_NONE,
-               .inputcharacteristics = SMS_GPIO_INPUTCHARACTERISTICS_NORMAL,
-               .outputslewrate       = SMS_GPIO_OUTPUTSLEWRATE_FAST,
-               .outputdriving        = SMS_GPIO_OUTPUTDRIVING_4mA,
-       };
-
-       if (pin == 0)
-               return -EINVAL;
-
-       if (pin < 0) {
-               /* inverted gpio */
-               gpio = pin * -1;
-               lvl = enable ? 0 : 1;
-       } else {
-               gpio = pin;
-               lvl = enable ? 1 : 0;
-       }
-
-       ret = smscore_configure_gpio(coredev, gpio, &gpioconfig);
-       if (ret < 0)
-               return ret;
-
-       return smscore_set_gpio(coredev, gpio, lvl);
+static inline void sms_gpio_assign_11xx_default_led_config(
+               struct smscore_gpio_config *pGpioConfig) {
+       pGpioConfig->Direction = SMS_GPIO_DIRECTION_OUTPUT;
+       pGpioConfig->InputCharacteristics =
+               SMS_GPIO_INPUTCHARACTERISTICS_NORMAL;
+       pGpioConfig->OutputDriving = SMS_GPIO_OUTPUTDRIVING_4mA;
+       pGpioConfig->OutputSlewRate = SMS_GPIO_OUTPUTSLEWRATE_0_45_V_NS;
+       pGpioConfig->PullUpDown = SMS_GPIO_PULLUPDOWN_NONE;
 }
 
-int sms_board_setup(struct smscore_device_t *coredev)
-{
+int sms_board_event(struct smscore_device_t *coredev,
+               enum SMS_BOARD_EVENTS gevent) {
        int board_id = smscore_get_board_id(coredev);
        struct sms_board *board = sms_get_board(board_id);
+       struct smscore_gpio_config MyGpioConfig;
 
-       switch (board_id) {
-       case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
-               /* turn off all LEDs */
-               sms_set_gpio(coredev, board->led_power, 0);
-               sms_set_gpio(coredev, board->led_hi, 0);
-               sms_set_gpio(coredev, board->led_lo, 0);
-               break;
-       case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
-       case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
-               /* turn off LNA */
-               sms_set_gpio(coredev, board->lna_ctrl, 0);
+       sms_gpio_assign_11xx_default_led_config(&MyGpioConfig);
+
+       switch (gevent) {
+       case BOARD_EVENT_POWER_INIT: /* including hotplug */
+               switch (board_id) {
+               case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
+                       /* set I/O and turn off all LEDs */
+                       smscore_gpio_configure(coredev,
+                                       board->board_cfg.leds_power,
+                                       &MyGpioConfig);
+                       smscore_gpio_set_level(coredev,
+                                       board->board_cfg.leds_power, 0);
+                       smscore_gpio_configure(coredev, board->board_cfg.led0,
+                                       &MyGpioConfig);
+                       smscore_gpio_set_level(coredev,
+                                       board->board_cfg.led0, 0);
+                       smscore_gpio_configure(coredev, board->board_cfg.led1,
+                                       &MyGpioConfig);
+                       smscore_gpio_set_level(coredev,
+                                       board->board_cfg.led1, 0);
+                       break;
+               case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
+               case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
+                       /* set I/O and turn off LNA */
+                       smscore_gpio_configure(coredev,
+                                       board->board_cfg.foreign_lna0_ctrl,
+                                       &MyGpioConfig);
+                       smscore_gpio_set_level(coredev,
+                                       board->board_cfg.foreign_lna0_ctrl,
+                                       0);
+                       break;
+               }
+               break; /* BOARD_EVENT_BIND */
+
+       case BOARD_EVENT_POWER_SUSPEND:
+               switch (board_id) {
+               case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
+                       smscore_gpio_set_level(coredev,
+                                               board->board_cfg.leds_power, 0);
+                       smscore_gpio_set_level(coredev,
+                                               board->board_cfg.led0, 0);
+                       smscore_gpio_set_level(coredev,
+                                               board->board_cfg.led1, 0);
+                       break;
+               case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
+               case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
+                       smscore_gpio_set_level(coredev,
+                                       board->board_cfg.foreign_lna0_ctrl,
+                                       0);
+                       break;
+               }
+               break; /* BOARD_EVENT_POWER_SUSPEND */
+
+       case BOARD_EVENT_POWER_RESUME:
+               switch (board_id) {
+               case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
+                       smscore_gpio_set_level(coredev,
+                                               board->board_cfg.leds_power, 1);
+                       smscore_gpio_set_level(coredev,
+                                               board->board_cfg.led0, 1);
+                       smscore_gpio_set_level(coredev,
+                                               board->board_cfg.led1, 0);
+                       break;
+               case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
+               case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
+                       smscore_gpio_set_level(coredev,
+                                       board->board_cfg.foreign_lna0_ctrl,
+                                       1);
+                       break;
+               }
+               break; /* BOARD_EVENT_POWER_RESUME */
+
+       case BOARD_EVENT_BIND:
+               switch (board_id) {
+               case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
+                       smscore_gpio_set_level(coredev,
+                               board->board_cfg.leds_power, 1);
+                       smscore_gpio_set_level(coredev,
+                               board->board_cfg.led0, 1);
+                       smscore_gpio_set_level(coredev,
+                               board->board_cfg.led1, 0);
+                       break;
+               case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
+               case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
+                       smscore_gpio_set_level(coredev,
+                                       board->board_cfg.foreign_lna0_ctrl,
+                                       1);
+                       break;
+               }
+               break; /* BOARD_EVENT_BIND */
+
+       case BOARD_EVENT_SCAN_PROG:
+               break; /* BOARD_EVENT_SCAN_PROG */
+       case BOARD_EVENT_SCAN_COMP:
+               break; /* BOARD_EVENT_SCAN_COMP */
+       case BOARD_EVENT_EMERGENCY_WARNING_SIGNAL:
+               break; /* BOARD_EVENT_EMERGENCY_WARNING_SIGNAL */
+       case BOARD_EVENT_FE_LOCK:
+               switch (board_id) {
+               case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
+                       smscore_gpio_set_level(coredev,
+                       board->board_cfg.led1, 1);
+                       break;
+               }
+               break; /* BOARD_EVENT_FE_LOCK */
+       case BOARD_EVENT_FE_UNLOCK:
+               switch (board_id) {
+               case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
+                       smscore_gpio_set_level(coredev,
+                                               board->board_cfg.led1, 0);
+                       break;
+               }
+               break; /* BOARD_EVENT_FE_UNLOCK */
+       case BOARD_EVENT_DEMOD_LOCK:
+               break; /* BOARD_EVENT_DEMOD_LOCK */
+       case BOARD_EVENT_DEMOD_UNLOCK:
+               break; /* BOARD_EVENT_DEMOD_UNLOCK */
+       case BOARD_EVENT_RECEPTION_MAX_4:
+               break; /* BOARD_EVENT_RECEPTION_MAX_4 */
+       case BOARD_EVENT_RECEPTION_3:
+               break; /* BOARD_EVENT_RECEPTION_3 */
+       case BOARD_EVENT_RECEPTION_2:
+               break; /* BOARD_EVENT_RECEPTION_2 */
+       case BOARD_EVENT_RECEPTION_1:
+               break; /* BOARD_EVENT_RECEPTION_1 */
+       case BOARD_EVENT_RECEPTION_LOST_0:
+               break; /* BOARD_EVENT_RECEPTION_LOST_0 */
+       case BOARD_EVENT_MULTIPLEX_OK:
+               switch (board_id) {
+               case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
+                       smscore_gpio_set_level(coredev,
+                                               board->board_cfg.led1, 1);
+                       break;
+               }
+               break; /* BOARD_EVENT_MULTIPLEX_OK */
+       case BOARD_EVENT_MULTIPLEX_ERRORS:
+               switch (board_id) {
+               case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
+                       smscore_gpio_set_level(coredev,
+                                               board->board_cfg.led1, 0);
+                       break;
+               }
+               break; /* BOARD_EVENT_MULTIPLEX_ERRORS */
+
+       default:
+               sms_err("Unknown SMS board event");
                break;
        }
        return 0;
 }
-
-int sms_board_power(struct smscore_device_t *coredev, int onoff)
-{
-       int board_id = smscore_get_board_id(coredev);
-       struct sms_board *board = sms_get_board(board_id);
-
-       switch (board_id) {
-       case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
-               /* power LED */
-               sms_set_gpio(coredev,
-                            board->led_power, onoff ? 1 : 0);
-               break;
-       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;
-}
-
-int sms_board_led_feedback(struct smscore_device_t *coredev, int led)
-{
-       int board_id = smscore_get_board_id(coredev);
-       struct sms_board *board = sms_get_board(board_id);
-
-       /* dont touch GPIO if LEDs are already set */
-       if (smscore_led_state(coredev, -1) == led)
-               return 0;
-
-       switch (board_id) {
-       case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
-               sms_set_gpio(coredev,
-                            board->led_lo, (led & SMS_LED_LO) ? 1 : 0);
-               sms_set_gpio(coredev,
-                            board->led_hi, (led & SMS_LED_HI) ? 1 : 0);
-
-               smscore_led_state(coredev, led);
-               break;
-       }
-       return 0;
-}
diff -r 1432098ff390 -r 84bd0617f712 linux/drivers/media/dvb/siano/sms-cards.h
--- a/linux/drivers/media/dvb/siano/sms-cards.h Tue Jan 13 14:08:17 2009 +0200
+++ b/linux/drivers/media/dvb/siano/sms-cards.h Tue Jan 13 14:17:23 2009 +0200
@@ -34,25 +34,72 @@
 #define SMS1XXX_BOARD_HAUPPAUGE_WINDHAM 8
 #define SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD 9
 #define SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2 10
+#define SMS1XXX_BOARD_SIANO_NICE       11
+#define SMS1XXX_BOARD_SIANO_VENICE     12
+
+struct sms_board_gpio_cfg {
+       int foreign_lna0_ctrl;
+       int foreign_lna1_ctrl;
+       int foreign_lna2_ctrl;
+       int lna_vhf_exist;
+       int lna_vhf_ctrl;
+       int lna_uhf_exist;
+       int lna_uhf_ctrl;
+       int lna_uhf_d_ctrl;
+       int lna_sband_exist;
+       int lna_sband_ctrl;
+       int lna_sband_d_ctrl;
+       int leds_power;
+       int led0;
+       int led1;
+       int led2;
+       int led3;
+       int led4;
+       int ir;
+       int eeprom_wp;
+       int mrc_sense;
+       int mrc_pdn_resetn;
+       int mrc_gp0; /* mrcs spi int */
+       int mrc_gp1;
+       int mrc_gp2;
+       int mrc_gp3;
+       int mrc_gp4;
+       int host_spi_gsp_ts_int;
+};
 
 struct sms_board {
        enum sms_device_type_st type;
        char *name, *fw[DEVICE_MODE_MAX];
-
-       /* gpios */
-       int led_power, led_hi, led_lo, lna_ctrl;
+       struct sms_board_gpio_cfg board_cfg;
 };
 
 struct sms_board *sms_get_board(int id);
 
-int sms_board_setup(struct smscore_device_t *coredev);
+extern struct usb_device_id smsusb_id_table[];
+extern struct smscore_device_t *coredev;
 
-#define SMS_LED_OFF 0
-#define SMS_LED_LO  1
-#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);
+enum SMS_BOARD_EVENTS {
+       BOARD_EVENT_POWER_INIT,
+       BOARD_EVENT_POWER_SUSPEND,
+       BOARD_EVENT_POWER_RESUME,
+       BOARD_EVENT_BIND,
+       BOARD_EVENT_SCAN_PROG,
+       BOARD_EVENT_SCAN_COMP,
+       BOARD_EVENT_EMERGENCY_WARNING_SIGNAL,
+       BOARD_EVENT_FE_LOCK,
+       BOARD_EVENT_FE_UNLOCK,
+       BOARD_EVENT_DEMOD_LOCK,
+       BOARD_EVENT_DEMOD_UNLOCK,
+       BOARD_EVENT_RECEPTION_MAX_4,
+       BOARD_EVENT_RECEPTION_3,
+       BOARD_EVENT_RECEPTION_2,
+       BOARD_EVENT_RECEPTION_1,
+       BOARD_EVENT_RECEPTION_LOST_0,
+       BOARD_EVENT_MULTIPLEX_OK,
+       BOARD_EVENT_MULTIPLEX_ERRORS
+};
 
-extern struct usb_device_id smsusb_id_table[];
+int sms_board_event(struct smscore_device_t *coredev,
+               enum SMS_BOARD_EVENTS gevent);
 
 #endif /* __SMS_CARDS_H__ */



      
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to