diff options
author | Jiri Slaby <jslaby@suse.cz> | 2012-01-10 12:11:25 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-01-17 20:02:41 -0500 |
commit | d43272a4e898a1e43e5ac351ab625b7a40b39e88 (patch) | |
tree | dfa1a7123d83de466e3ebad5c7c51d8d3e80b86d /drivers/media/dvb/dvb-usb | |
parent | 2b05b881ec9b04cc308f0880ea604843bcb2265a (diff) |
[media] DVB: dib0700, add support for Nova-TD LEDs
Add an override of read_status to intercept lock status. This allows
us to switch LEDs appropriately on and off with signal un/locked.
The second phase is to override sleep to properly turn off both.
This is a hackish way to achieve that.
Thanks to Mike Krufky for his help.
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Acked-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Patrick Boettcher <pboettcher@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb/dvb-usb')
-rw-r--r-- | drivers/media/dvb/dvb-usb/dib0700.h | 2 | ||||
-rw-r--r-- | drivers/media/dvb/dvb-usb/dib0700_devices.c | 41 |
2 files changed, 42 insertions, 1 deletions
diff --git a/drivers/media/dvb/dvb-usb/dib0700.h b/drivers/media/dvb/dvb-usb/dib0700.h index 9bd6d51b3b93..7de125c0b36f 100644 --- a/drivers/media/dvb/dvb-usb/dib0700.h +++ b/drivers/media/dvb/dvb-usb/dib0700.h | |||
@@ -48,6 +48,8 @@ struct dib0700_state { | |||
48 | u8 disable_streaming_master_mode; | 48 | u8 disable_streaming_master_mode; |
49 | u32 fw_version; | 49 | u32 fw_version; |
50 | u32 nb_packet_buffer_size; | 50 | u32 nb_packet_buffer_size; |
51 | int (*read_status)(struct dvb_frontend *, fe_status_t *); | ||
52 | int (*sleep)(struct dvb_frontend* fe); | ||
51 | u8 buf[255]; | 53 | u8 buf[255]; |
52 | }; | 54 | }; |
53 | 55 | ||
diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c index 3ab45aedbdfb..f9e966aa26e7 100644 --- a/drivers/media/dvb/dvb-usb/dib0700_devices.c +++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c | |||
@@ -3105,6 +3105,35 @@ static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap) | |||
3105 | return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; | 3105 | return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; |
3106 | } | 3106 | } |
3107 | 3107 | ||
3108 | static int novatd_read_status_override(struct dvb_frontend *fe, | ||
3109 | fe_status_t *stat) | ||
3110 | { | ||
3111 | struct dvb_usb_adapter *adap = fe->dvb->priv; | ||
3112 | struct dvb_usb_device *dev = adap->dev; | ||
3113 | struct dib0700_state *state = dev->priv; | ||
3114 | int ret; | ||
3115 | |||
3116 | ret = state->read_status(fe, stat); | ||
3117 | |||
3118 | if (!ret) | ||
3119 | dib0700_set_gpio(dev, adap->id == 0 ? GPIO1 : GPIO0, GPIO_OUT, | ||
3120 | !!(*stat & FE_HAS_LOCK)); | ||
3121 | |||
3122 | return ret; | ||
3123 | } | ||
3124 | |||
3125 | static int novatd_sleep_override(struct dvb_frontend* fe) | ||
3126 | { | ||
3127 | struct dvb_usb_adapter *adap = fe->dvb->priv; | ||
3128 | struct dvb_usb_device *dev = adap->dev; | ||
3129 | struct dib0700_state *state = dev->priv; | ||
3130 | |||
3131 | /* turn off LED */ | ||
3132 | dib0700_set_gpio(dev, adap->id == 0 ? GPIO1 : GPIO0, GPIO_OUT, 0); | ||
3133 | |||
3134 | return state->sleep(fe); | ||
3135 | } | ||
3136 | |||
3108 | /** | 3137 | /** |
3109 | * novatd_frontend_attach - Nova-TD specific attach | 3138 | * novatd_frontend_attach - Nova-TD specific attach |
3110 | * | 3139 | * |
@@ -3114,6 +3143,7 @@ static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap) | |||
3114 | static int novatd_frontend_attach(struct dvb_usb_adapter *adap) | 3143 | static int novatd_frontend_attach(struct dvb_usb_adapter *adap) |
3115 | { | 3144 | { |
3116 | struct dvb_usb_device *dev = adap->dev; | 3145 | struct dvb_usb_device *dev = adap->dev; |
3146 | struct dib0700_state *st = dev->priv; | ||
3117 | 3147 | ||
3118 | if (adap->id == 0) { | 3148 | if (adap->id == 0) { |
3119 | stk7070pd_init(dev); | 3149 | stk7070pd_init(dev); |
@@ -3134,7 +3164,16 @@ static int novatd_frontend_attach(struct dvb_usb_adapter *adap) | |||
3134 | adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &dev->i2c_adap, | 3164 | adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &dev->i2c_adap, |
3135 | adap->id == 0 ? 0x80 : 0x82, | 3165 | adap->id == 0 ? 0x80 : 0x82, |
3136 | &stk7070pd_dib7000p_config[adap->id]); | 3166 | &stk7070pd_dib7000p_config[adap->id]); |
3137 | return adap->fe_adap[0].fe == NULL ? -ENODEV : 0; | 3167 | |
3168 | if (adap->fe_adap[0].fe == NULL) | ||
3169 | return -ENODEV; | ||
3170 | |||
3171 | st->read_status = adap->fe_adap[0].fe->ops.read_status; | ||
3172 | adap->fe_adap[0].fe->ops.read_status = novatd_read_status_override; | ||
3173 | st->sleep = adap->fe_adap[0].fe->ops.sleep; | ||
3174 | adap->fe_adap[0].fe->ops.sleep = novatd_sleep_override; | ||
3175 | |||
3176 | return 0; | ||
3138 | } | 3177 | } |
3139 | 3178 | ||
3140 | /* S5H1411 */ | 3179 | /* S5H1411 */ |