V4L/DVB (9739): sms1xxx: enable signal quality indicator LEDs on Hauppauge WinTV...
authorMichael Krufky <mkrufky@linuxtv.org>
Sat, 22 Nov 2008 18:32:19 +0000 (15:32 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 29 Dec 2008 19:53:41 +0000 (17:53 -0200)
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/siano/sms-cards.c
drivers/media/dvb/siano/sms-cards.h
drivers/media/dvb/siano/smscoreapi.c
drivers/media/dvb/siano/smscoreapi.h
drivers/media/dvb/siano/smsdvb.c

index e17eb35877fc4da6e00d336b313b32cf24b059ac..f4eb46a7c90593183f675d1ceb0740e23e6f1e65 100644 (file)
@@ -183,3 +183,25 @@ int sms_board_power(struct smscore_device_t *coredev, int onoff)
        }
        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;
+}
index f68da5d77998b588404da9fa88a084c2337a3f74..5c013c4390d71ed5e6603391c909138f90da11c9 100644 (file)
@@ -46,6 +46,10 @@ struct sms_board *sms_get_board(int id);
 
 int sms_board_setup(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);
 
 extern struct usb_device_id smsusb_id_table[];
index b0e8bcb1238daa97b9bf6f351e131cf1441cbea5..cf613f22fb8d84e68203f7de9f7bed5c3b997978 100644 (file)
@@ -91,6 +91,7 @@ struct smscore_device_t {
        struct completion init_device_done, reload_start_done, resume_done;
 
        int board_id;
+       int led_state;
 };
 
 void smscore_set_board_id(struct smscore_device_t *core, int id)
@@ -98,6 +99,13 @@ void smscore_set_board_id(struct smscore_device_t *core, int id)
        core->board_id = id;
 }
 
+int smscore_led_state(struct smscore_device_t *core, int led)
+{
+       if (led >= 0)
+               core->led_state = led;
+       return core->led_state;
+}
+
 int smscore_get_board_id(struct smscore_device_t *core)
 {
        return core->board_id;
index 6b3fb86c814bd27b8288ce6384e2accf60248b3b..760e233fcbc587594d965479a7ee35de64760c0e 100644 (file)
@@ -431,6 +431,8 @@ int smscore_set_gpio(struct smscore_device_t *coredev, u32 pin, int level);
 void smscore_set_board_id(struct smscore_device_t *core, int id);
 int smscore_get_board_id(struct smscore_device_t *core);
 
+int smscore_led_state(struct smscore_device_t *core, int led);
+
 /* smsdvb.c */
 int smsdvb_register(void);
 void smsdvb_unregister(void);
index adf00b989c124770471e12bcd8a4060d69853495..2da953a4f4f56cc08d94e9d6d0e0460dc6a9aa31 100644 (file)
@@ -167,8 +167,18 @@ static int smsdvb_send_statistics_request(struct smsdvb_client_t *client)
        struct SmsMsgHdr_ST Msg = { MSG_SMS_GET_STATISTICS_REQ,
                             DVBT_BDA_CONTROL_MSG_ID,
                             HIF_TASK, sizeof(struct SmsMsgHdr_ST), 0 };
-       return smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg),
-                                          &client->stat_done);
+       int ret = smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg),
+                                             &client->stat_done);
+       if (ret < 0)
+               return ret;
+
+       if (client->fe_status & FE_HAS_LOCK)
+               sms_board_led_feedback(client->coredev,
+                                      (client->fe_unc == 0) ?
+                                      SMS_LED_HI : SMS_LED_LO);
+       else
+               sms_board_led_feedback(client->coredev, SMS_LED_OFF);
+       return ret;
 }
 
 static int smsdvb_read_status(struct dvb_frontend *fe, fe_status_t *stat)
@@ -306,6 +316,7 @@ static int smsdvb_sleep(struct dvb_frontend *fe)
        struct smsdvb_client_t *client =
                container_of(fe, struct smsdvb_client_t, frontend);
 
+       sms_board_led_feedback(client->coredev, SMS_LED_OFF);
        sms_board_power(client->coredev, 0);
 
        return 0;