[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>
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 @@
 		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 @@
 	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 @@
 	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 @@
 		goto err;
 	}
 
+	priv->sleeping = true;
+
 	return &priv->fe;
 err:
 	dbg("%s: failed=%d", __func__, ret);
@@ -530,6 +544,7 @@
 	.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_config cfg;
 	struct i2c_adapter tuner_i2c_adapter;
 
+	bool sleeping;
+
 	u8 page; /* active register page */
 };