V4L/DVB (11887): Siano: smscards - add board (target) events
authorUri Shkolnik <uris@siano-ms.com>
Tue, 19 May 2009 15:18:40 +0000 (12:18 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 16 Jun 2009 22:14:40 +0000 (19:14 -0300)
Add events handling for targets. All board-specific
(target specific) should reside here.

Signed-off-by: Uri Shkolnik <uris@siano-ms.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/siano/sms-cards.c
drivers/media/dvb/siano/sms-cards.h

index 370cf513a81ac9b26e36c2956f6675e618895a2d..d8b15d583bdeb2e662a3d336aabd7017d2414722 100644 (file)
@@ -104,6 +104,173 @@ struct sms_board *sms_get_board(int id)
        return &sms_boards[id];
 }
 EXPORT_SYMBOL_GPL(sms_get_board);
+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_INPUT_CHARACTERISTICS_NORMAL;
+       pGpioConfig->OutputDriving = SMS_GPIO_OUTPUT_DRIVING_4mA;
+       pGpioConfig->OutputSlewRate = SMS_GPIO_OUTPUT_SLEW_RATE_0_45_V_NS;
+       pGpioConfig->PullUpDown = SMS_GPIO_PULL_UP_DOWN_NONE;
+}
+
+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;
+
+       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;
+}
+EXPORT_SYMBOL_GPL(sms_board_event);
 
 static int sms_set_gpio(struct smscore_device_t *coredev, int pin, int enable)
 {
index e183f946af4d5973247bdd20b967e55c953a4bf5..38f062f6ad68a95c462a49afeb196ad37b580b07 100644 (file)
@@ -85,6 +85,30 @@ struct sms_board *sms_get_board(int id);
 
 extern struct smscore_device_t *coredev;
 
+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
+};
+
+int sms_board_event(struct smscore_device_t *coredev,
+               enum SMS_BOARD_EVENTS gevent);
+
 int sms_board_setup(struct smscore_device_t *coredev);
 
 #define SMS_LED_OFF 0