summaryrefslogtreecommitdiffstats
path: root/drivers/media/tuners/mt2060.c
diff options
context:
space:
mode:
authorAntti Palosaari <crope@iki.fi>2016-12-09 15:11:09 -0200
committerMauro Carvalho Chehab <mchehab@s-opensource.com>2017-02-03 06:55:46 -0200
commite11415c811047189a132c61c4c838ed7fd8431c8 (patch)
tree062d6b6e594302ca1e74908c281316d9703d0c44 /drivers/media/tuners/mt2060.c
parentd4c554c374f3b7dd1d4e2560c303f050b318420b (diff)
downloadop-kernel-dev-e11415c811047189a132c61c4c838ed7fd8431c8.zip
op-kernel-dev-e11415c811047189a132c61c4c838ed7fd8431c8.tar.gz
[media] mt2060: implement sleep
I saw from ZyDAS ZD1301 sniffs it sets chip sleeping by using REG_MISC_CTRL. That has very huge effect for power management, around 0.9W. Sleep is still disabled for all the old hardware just to avoid possible regression as meaning of register bits are unknown. I tested it also with some other devices and it seems to be working, but I still consider it to be too risky to change it default. Signed-off-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Diffstat (limited to 'drivers/media/tuners/mt2060.c')
-rw-r--r--drivers/media/tuners/mt2060.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/drivers/media/tuners/mt2060.c b/drivers/media/tuners/mt2060.c
index 14f5935..2e487f9 100644
--- a/drivers/media/tuners/mt2060.c
+++ b/drivers/media/tuners/mt2060.c
@@ -313,9 +313,16 @@ static int mt2060_init(struct dvb_frontend *fe)
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1); /* open i2c_gate */
+ if (priv->sleep) {
+ ret = mt2060_writereg(priv, REG_MISC_CTRL, 0x20);
+ if (ret)
+ goto err_i2c_gate_ctrl;
+ }
+
ret = mt2060_writereg(priv, REG_VGAG,
(priv->cfg->clock_out << 6) | 0x33);
+err_i2c_gate_ctrl:
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 0); /* close i2c_gate */
@@ -332,7 +339,13 @@ static int mt2060_sleep(struct dvb_frontend *fe)
ret = mt2060_writereg(priv, REG_VGAG,
(priv->cfg->clock_out << 6) | 0x30);
+ if (ret)
+ goto err_i2c_gate_ctrl;
+
+ if (priv->sleep)
+ ret = mt2060_writereg(priv, REG_MISC_CTRL, 0xe8);
+err_i2c_gate_ctrl:
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 0); /* close i2c_gate */
@@ -435,6 +448,7 @@ static int mt2060_probe(struct i2c_client *client,
dev->if1_freq = pdata->if1 ? pdata->if1 : 1220;
dev->client = client;
dev->i2c_max_regs = pdata->i2c_write_max ? pdata->i2c_write_max - 1 : ~0;
+ dev->sleep = true;
ret = mt2060_readreg(dev, REG_PART_REV, &chip_id);
if (ret) {
@@ -449,14 +463,21 @@ static int mt2060_probe(struct i2c_client *client,
goto err;
}
+ /* Power on, calibrate, sleep */
+ ret = mt2060_writereg(dev, REG_MISC_CTRL, 0x20);
+ if (ret)
+ goto err;
+ mt2060_calibrate(dev);
+ ret = mt2060_writereg(dev, REG_MISC_CTRL, 0xe8);
+ if (ret)
+ goto err;
+
dev_info(&client->dev, "Microtune MT2060 successfully identified\n");
memcpy(&fe->ops.tuner_ops, &mt2060_tuner_ops, sizeof(fe->ops.tuner_ops));
fe->ops.tuner_ops.release = NULL;
fe->tuner_priv = dev;
i2c_set_clientdata(client, dev);
- mt2060_calibrate(dev);
-
return 0;
err:
dev_dbg(&client->dev, "failed=%d\n", ret);
OpenPOWER on IntegriCloud