Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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>

authored by

Antti Palosaari and committed by
Mauro Carvalho Chehab
4bef67e3 2c509b86

+18 -18
+18 -18
drivers/media/dvb-frontends/a8293.c
··· 31 31 struct a8293_dev *dev = fe->sec_priv; 32 32 struct i2c_client *client = dev->client; 33 33 int ret; 34 + u8 reg0, reg1; 34 35 35 36 dev_dbg(&client->dev, "fe_sec_voltage=%d\n", fe_sec_voltage); 36 37 37 38 switch (fe_sec_voltage) { 38 39 case SEC_VOLTAGE_OFF: 39 40 /* ENB=0 */ 40 - dev->reg[0] = 0x10; 41 + reg0 = 0x10; 41 42 break; 42 43 case SEC_VOLTAGE_13: 43 44 /* VSEL0=1, VSEL1=0, VSEL2=0, VSEL3=0, ENB=1*/ 44 - dev->reg[0] = 0x31; 45 + reg0 = 0x31; 45 46 break; 46 47 case SEC_VOLTAGE_18: 47 48 /* VSEL0=0, VSEL1=0, VSEL2=0, VSEL3=1, ENB=1*/ 48 - dev->reg[0] = 0x38; 49 + reg0 = 0x38; 49 50 break; 50 51 default: 51 52 ret = -EINVAL; 52 53 goto err; 53 54 } 55 + if (reg0 != dev->reg[0]) { 56 + ret = i2c_master_send(client, &reg0, 1); 57 + if (ret < 0) 58 + goto err; 59 + dev->reg[0] = reg0; 60 + } 54 61 55 - ret = i2c_master_send(client, &dev->reg[0], 1); 56 - if (ret < 0) 57 - goto err; 62 + /* TMODE=0, TGATE=1 */ 63 + reg1 = 0x82; 64 + if (reg1 != dev->reg[1]) { 65 + ret = i2c_master_send(client, &reg1, 1); 66 + if (ret < 0) 67 + goto err; 68 + dev->reg[1] = reg1; 69 + } 58 70 59 71 usleep_range(1500, 50000); 60 72 return 0; ··· 94 82 95 83 /* check if the SEC is there */ 96 84 ret = i2c_master_recv(client, buf, 2); 97 - if (ret < 0) 98 - goto err_kfree; 99 - 100 - /* ENB=0 */ 101 - dev->reg[0] = 0x10; 102 - ret = i2c_master_send(client, &dev->reg[0], 1); 103 - if (ret < 0) 104 - goto err_kfree; 105 - 106 - /* TMODE=0, TGATE=1 */ 107 - dev->reg[1] = 0x82; 108 - ret = i2c_master_send(client, &dev->reg[1], 1); 109 85 if (ret < 0) 110 86 goto err_kfree; 111 87