diff options
author | Antti Palosaari <crope@iki.fi> | 2012-01-22 01:40:58 (GMT) |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-02-28 21:44:25 (GMT) |
commit | a8567cf22e0efb9faafa6cf33b607ca5aee3c2fa (patch) | |
tree | 158208995684ed035053db50970530b3f8c47299 | |
parent | 9935eea5ac300b84036192af1bd98940a64650de (diff) | |
download | linux-a8567cf22e0efb9faafa6cf33b607ca5aee3c2fa.tar.xz |
[media] rtl2830: prevent .read_status() when sleeping
Hardware is not accessible when device is sleeping.
Preventing such IOCTLs when sleep should be job of DVB CORE...
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r-- | drivers/media/dvb/dvb-usb/rtl28xxu.c | 5 | ||||
-rw-r--r-- | drivers/media/dvb/frontends/rtl2830.c | 15 | ||||
-rw-r--r-- | drivers/media/dvb/frontends/rtl2830_priv.h | 2 |
3 files changed, 17 insertions, 5 deletions
diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c index b5785fa..07597c5 100644 --- a/drivers/media/dvb/dvb-usb/rtl28xxu.c +++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c @@ -608,11 +608,6 @@ static int rtl28xxu_power_ctrl(struct dvb_usb_device *d, int onoff) sys0 = sys0 & 0x0f; sys0 |= 0xe0; } else { - /* - * FIXME: Use .fe_ioctl_override() to prevent demod - * IOCTLs in case of device is powered off. Or change - * RTL2830 demod not perform requestesd IOCTL & IO when sleep. - */ gpio &= (~0x01); /* GPIO0 = 0 */ gpio |= 0x10; /* GPIO4 = 1 */ sys0 = sys0 & (~0xc0); diff --git a/drivers/media/dvb/frontends/rtl2830.c b/drivers/media/dvb/frontends/rtl2830.c index f036701..f971d94 100644 --- a/drivers/media/dvb/frontends/rtl2830.c +++ b/drivers/media/dvb/frontends/rtl2830.c @@ -273,12 +273,21 @@ static int rtl2830_init(struct dvb_frontend *fe) if (ret) goto err; + priv->sleeping = false; + return ret; err: dbg("%s: failed=%d", __func__, ret); return ret; } +static int rtl2830_sleep(struct dvb_frontend *fe) +{ + struct rtl2830_priv *priv = fe->demodulator_priv; + priv->sleeping = true; + return 0; +} + int rtl2830_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings *s) { @@ -372,6 +381,9 @@ static int rtl2830_read_status(struct dvb_frontend *fe, fe_status_t *status) u8 tmp; *status = 0; + if (priv->sleeping) + return 0; + ret = rtl2830_rd_reg_mask(priv, 0x351, &tmp, 0x78); /* [6:3] */ if (ret) goto err; @@ -498,6 +510,8 @@ struct dvb_frontend *rtl2830_attach(const struct rtl2830_config *cfg, goto err; } + priv->sleeping = true; + return &priv->fe; err: dbg("%s: failed=%d", __func__, ret); @@ -530,6 +544,7 @@ static struct dvb_frontend_ops rtl2830_ops = { .release = rtl2830_release, .init = rtl2830_init, + .sleep = rtl2830_sleep, .get_tune_settings = rtl2830_get_tune_settings, diff --git a/drivers/media/dvb/frontends/rtl2830_priv.h b/drivers/media/dvb/frontends/rtl2830_priv.h index 49de01d..4a46476 100644 --- a/drivers/media/dvb/frontends/rtl2830_priv.h +++ b/drivers/media/dvb/frontends/rtl2830_priv.h @@ -43,6 +43,8 @@ struct rtl2830_priv { struct rtl2830_config cfg; struct i2c_adapter tuner_i2c_adapter; + bool sleeping; + u8 page; /* active register page */ }; |