SRU LP301405 - sms1xxx: enable signal quality indicator LEDs on Hauppauge WinTV MiniStick

Tim Gardner timg at tpi.com
Wed Nov 26 22:08:37 UTC 2008


>From 2bc40c770a3c6bcba242b155ae441dac50b71bb3 Mon Sep 17 00:00:00 2001
From: Michael Krufky <mkrufky at linuxtv.org>
Date: Tue, 25 Nov 2008 16:46:58 -0500
Subject: [PATCH] UBUNTU: sms1xxx: enable signal quality indicator LEDs on Hauppauge WinTV MiniStick

OriginalAuthor: Michael Krufky <mkrufky at linuxtv.org>
OriginalLocation: http://linuxtv.org/hg/v4l-dvb/raw-rev/2d2756ed7b1b
Bug: #301405

sms1xxx: enable signal quality indicator LEDs on Hauppauge WinTV MiniStick

Signed-off-by: Michael Krufky <mkrufky at linuxtv.org>
Signed-off-by: Tim Gardner <tim.gardner at canonical.com>
---
 drivers/media/dvb/siano/sms-cards.c  |   22 ++++++++++++++++++++++
 drivers/media/dvb/siano/sms-cards.h  |    4 ++++
 drivers/media/dvb/siano/smscoreapi.c |    8 ++++++++
 drivers/media/dvb/siano/smscoreapi.h |    2 ++
 drivers/media/dvb/siano/smsdvb.c     |   15 +++++++++++++--
 5 files changed, 49 insertions(+), 2 deletions(-)

diff --git a/drivers/media/dvb/siano/sms-cards.c b/drivers/media/dvb/siano/sms-cards.c
index 0341d53..fd62e0b 100644
--- a/drivers/media/dvb/siano/sms-cards.c
+++ b/drivers/media/dvb/siano/sms-cards.c
@@ -194,3 +194,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;
+}
diff --git a/drivers/media/dvb/siano/sms-cards.h b/drivers/media/dvb/siano/sms-cards.h
index 6384d89..8e0fe9f 100644
--- a/drivers/media/dvb/siano/sms-cards.h
+++ b/drivers/media/dvb/siano/sms-cards.h
@@ -47,6 +47,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[];
diff --git a/drivers/media/dvb/siano/smscoreapi.c b/drivers/media/dvb/siano/smscoreapi.c
index b0e8bcb..cf613f2 100644
--- a/drivers/media/dvb/siano/smscoreapi.c
+++ b/drivers/media/dvb/siano/smscoreapi.c
@@ -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;
diff --git a/drivers/media/dvb/siano/smscoreapi.h b/drivers/media/dvb/siano/smscoreapi.h
index 460b174..dd04726 100644
--- a/drivers/media/dvb/siano/smscoreapi.h
+++ b/drivers/media/dvb/siano/smscoreapi.h
@@ -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);
diff --git a/drivers/media/dvb/siano/smsdvb.c b/drivers/media/dvb/siano/smsdvb.c
index adf00b9..2da953a 100644
--- a/drivers/media/dvb/siano/smsdvb.c
+++ b/drivers/media/dvb/siano/smsdvb.c
@@ -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;
-- 
1.5.6.3





More information about the kernel-team mailing list