Commit a8567cf2 authored by Antti Palosaari's avatar Antti Palosaari Committed by Mauro Carvalho Chehab

[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: default avatarAntti Palosaari <crope@iki.fi>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 9935eea5
...@@ -608,11 +608,6 @@ static int rtl28xxu_power_ctrl(struct dvb_usb_device *d, int onoff) ...@@ -608,11 +608,6 @@ static int rtl28xxu_power_ctrl(struct dvb_usb_device *d, int onoff)
sys0 = sys0 & 0x0f; sys0 = sys0 & 0x0f;
sys0 |= 0xe0; sys0 |= 0xe0;
} else { } 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 &= (~0x01); /* GPIO0 = 0 */
gpio |= 0x10; /* GPIO4 = 1 */ gpio |= 0x10; /* GPIO4 = 1 */
sys0 = sys0 & (~0xc0); sys0 = sys0 & (~0xc0);
......
...@@ -273,12 +273,21 @@ static int rtl2830_init(struct dvb_frontend *fe) ...@@ -273,12 +273,21 @@ static int rtl2830_init(struct dvb_frontend *fe)
if (ret) if (ret)
goto err; goto err;
priv->sleeping = false;
return ret; return ret;
err: err:
dbg("%s: failed=%d", __func__, ret); dbg("%s: failed=%d", __func__, ret);
return 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, int rtl2830_get_tune_settings(struct dvb_frontend *fe,
struct dvb_frontend_tune_settings *s) struct dvb_frontend_tune_settings *s)
{ {
...@@ -372,6 +381,9 @@ static int rtl2830_read_status(struct dvb_frontend *fe, fe_status_t *status) ...@@ -372,6 +381,9 @@ static int rtl2830_read_status(struct dvb_frontend *fe, fe_status_t *status)
u8 tmp; u8 tmp;
*status = 0; *status = 0;
if (priv->sleeping)
return 0;
ret = rtl2830_rd_reg_mask(priv, 0x351, &tmp, 0x78); /* [6:3] */ ret = rtl2830_rd_reg_mask(priv, 0x351, &tmp, 0x78); /* [6:3] */
if (ret) if (ret)
goto err; goto err;
...@@ -498,6 +510,8 @@ struct dvb_frontend *rtl2830_attach(const struct rtl2830_config *cfg, ...@@ -498,6 +510,8 @@ struct dvb_frontend *rtl2830_attach(const struct rtl2830_config *cfg,
goto err; goto err;
} }
priv->sleeping = true;
return &priv->fe; return &priv->fe;
err: err:
dbg("%s: failed=%d", __func__, ret); dbg("%s: failed=%d", __func__, ret);
...@@ -530,6 +544,7 @@ static struct dvb_frontend_ops rtl2830_ops = { ...@@ -530,6 +544,7 @@ static struct dvb_frontend_ops rtl2830_ops = {
.release = rtl2830_release, .release = rtl2830_release,
.init = rtl2830_init, .init = rtl2830_init,
.sleep = rtl2830_sleep,
.get_tune_settings = rtl2830_get_tune_settings, .get_tune_settings = rtl2830_get_tune_settings,
......
...@@ -43,6 +43,8 @@ struct rtl2830_priv { ...@@ -43,6 +43,8 @@ struct rtl2830_priv {
struct rtl2830_config cfg; struct rtl2830_config cfg;
struct i2c_adapter tuner_i2c_adapter; struct i2c_adapter tuner_i2c_adapter;
bool sleeping;
u8 page; /* active register page */ u8 page; /* active register page */
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment