Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+0 −5
Original line number Original line Diff line number Diff line
@@ -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);
+15 −0
Original line number Original line Diff line number Diff line
@@ -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)
	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,
		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 = {
	.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,


+2 −0
Original line number Original line Diff line number Diff line
@@ -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 */
};
};