diff options
author | 2015-04-20 18:47:44 -0300 | |
---|---|---|
committer | 2015-08-11 07:09:42 -0300 | |
commit | 4bef67e311d6f9908eeae054d5b8611138956abc (patch) | |
tree | ed6acf189b35f0effac22c79da7cdec9055b94a4 /drivers/media/dvb-frontends/a8293.c | |
parent | [media] a8293: use i2c_master_send / i2c_master_recv for I2C I/O (diff) | |
download | linux-4bef67e311d6f9908eeae054d5b8611138956abc.tar.gz linux-4bef67e311d6f9908eeae054d5b8611138956abc.tar.bz2 linux-4bef67e311d6f9908eeae054d5b8611138956abc.zip |
[media] a8293: improve LNB register programming logic
On power-on LNB power supply voltage is disabled, due to that no
need to disable it during probe. Tone is supply is hard-coded as
external tone coming from the demodulator. Program both voltage
and tone on set_voltage(). Use register cache to prevent unneeded
programming.
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'drivers/media/dvb-frontends/a8293.c')
-rw-r--r-- | drivers/media/dvb-frontends/a8293.c | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/drivers/media/dvb-frontends/a8293.c b/drivers/media/dvb-frontends/a8293.c index d99ea4d61315..ef2b47c4c17b 100644 --- a/drivers/media/dvb-frontends/a8293.c +++ b/drivers/media/dvb-frontends/a8293.c @@ -31,30 +31,42 @@ static int a8293_set_voltage(struct dvb_frontend *fe, struct a8293_dev *dev = fe->sec_priv; struct i2c_client *client = dev->client; int ret; + u8 reg0, reg1; dev_dbg(&client->dev, "fe_sec_voltage=%d\n", fe_sec_voltage); switch (fe_sec_voltage) { case SEC_VOLTAGE_OFF: /* ENB=0 */ - dev->reg[0] = 0x10; + reg0 = 0x10; break; case SEC_VOLTAGE_13: /* VSEL0=1, VSEL1=0, VSEL2=0, VSEL3=0, ENB=1*/ - dev->reg[0] = 0x31; + reg0 = 0x31; break; case SEC_VOLTAGE_18: /* VSEL0=0, VSEL1=0, VSEL2=0, VSEL3=1, ENB=1*/ - dev->reg[0] = 0x38; + reg0 = 0x38; break; default: ret = -EINVAL; goto err; } + if (reg0 != dev->reg[0]) { + ret = i2c_master_send(client, ®0, 1); + if (ret < 0) + goto err; + dev->reg[0] = reg0; + } - ret = i2c_master_send(client, &dev->reg[0], 1); - if (ret < 0) - goto err; + /* TMODE=0, TGATE=1 */ + reg1 = 0x82; + if (reg1 != dev->reg[1]) { + ret = i2c_master_send(client, ®1, 1); + if (ret < 0) + goto err; + dev->reg[1] = reg1; + } usleep_range(1500, 50000); return 0; @@ -85,18 +97,6 @@ static int a8293_probe(struct i2c_client *client, if (ret < 0) goto err_kfree; - /* ENB=0 */ - dev->reg[0] = 0x10; - ret = i2c_master_send(client, &dev->reg[0], 1); - if (ret < 0) - goto err_kfree; - - /* TMODE=0, TGATE=1 */ - dev->reg[1] = 0x82; - ret = i2c_master_send(client, &dev->reg[1], 1); - if (ret < 0) - goto err_kfree; - /* override frontend ops */ fe->ops.set_voltage = a8293_set_voltage; fe->sec_priv = dev; |