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

V4L/DVB (12096): Bug fix: stv0900 register read must using i2c in one transaction

Signed-off-by: Abylay Ospan <aospan@netup.ru>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Abylay Ospan and committed by
Mauro Carvalho Chehab
68191ede 0cde9b25

+20 -20
+20 -20
drivers/media/dvb/frontends/stv0900_core.c
··· 149 149 dprintk(KERN_ERR "%s: i2c error %d\n", __func__, ret); 150 150 } 151 151 152 - u8 stv0900_read_reg(struct stv0900_internal *i_params, u16 reg_addr) 152 + u8 stv0900_read_reg(struct stv0900_internal *i_params, u16 reg) 153 153 { 154 - u8 data[2]; 155 154 int ret; 156 - struct i2c_msg i2cmsg = { 157 - .addr = i_params->i2c_addr, 158 - .flags = 0, 159 - .len = 2, 160 - .buf = data, 155 + u8 b0[] = { MSB(reg), LSB(reg) }; 156 + u8 buf = 0; 157 + struct i2c_msg msg[] = { 158 + { 159 + .addr = i_params->i2c_addr, 160 + .flags = 0, 161 + .buf = b0, 162 + .len = 2, 163 + }, { 164 + .addr = i_params->i2c_addr, 165 + .flags = I2C_M_RD, 166 + .buf = &buf, 167 + .len = 1, 168 + }, 161 169 }; 162 170 163 - data[0] = MSB(reg_addr); 164 - data[1] = LSB(reg_addr); 171 + ret = i2c_transfer(i_params->i2c_adap, msg, 2); 172 + if (ret != 2) 173 + dprintk(KERN_ERR "%s: i2c error %d, reg[0x%02x]\n", 174 + __func__, ret, reg); 165 175 166 - ret = i2c_transfer(i_params->i2c_adap, &i2cmsg, 1); 167 - if (ret != 1) 168 - dprintk(KERN_ERR "%s: i2c error %d\n", __func__, ret); 169 - 170 - i2cmsg.flags = I2C_M_RD; 171 - i2cmsg.len = 1; 172 - ret = i2c_transfer(i_params->i2c_adap, &i2cmsg, 1); 173 - if (ret != 1) 174 - dprintk(KERN_ERR "%s: i2c error %d\n", __func__, ret); 175 - 176 - return data[0]; 176 + return buf; 177 177 } 178 178 179 179 void extract_mask_pos(u32 label, u8 *mask, u8 *pos)