Skip to content

Commit c330cb6

Browse files
committed
Merge tag 'i2c-for-6.17-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
Pull i2c fixes from Wolfram Sang: - hisi: update maintainership - fix several issues in rtl9300 xfer: - check message length boundaries - correct multi-byte value composition on write - increase polling timeout - fix block transfer protocol * tag 'i2c-for-6.17-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: i2c: rtl9300: Add missing count byte for SMBus Block Ops i2c: rtl9300: Increase timeout for transfer polling i2c: rtl9300: Fix multi-byte I2C write i2c: rtl9300: Fix out-of-bounds bug in rtl9300_i2c_smbus_xfer MAINTAINERS: i2c: Update i2c_hisi entry
2 parents 69fd6b9 + 3dd2207 commit c330cb6

File tree

2 files changed

+13
-9
lines changed

2 files changed

+13
-9
lines changed

MAINTAINERS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11025,7 +11025,7 @@ F: Documentation/admin-guide/perf/hns3-pmu.rst
1102511025
F: drivers/perf/hisilicon/hns3_pmu.c
1102611026

1102711027
HISILICON I2C CONTROLLER DRIVER
11028-
M: Yicong Yang <yangyicong@hisilicon.com>
11028+
M: Devyn Liu <liudingyuan@h-partners.com>
1102911029
1103011030
S: Maintained
1103111031
W: https://www.hisilicon.com

drivers/i2c/busses/i2c-rtl9300.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -143,10 +143,10 @@ static int rtl9300_i2c_write(struct rtl9300_i2c *i2c, u8 *buf, int len)
143143
return -EIO;
144144

145145
for (i = 0; i < len; i++) {
146-
if (i % 4 == 0)
147-
vals[i/4] = 0;
148-
vals[i/4] <<= 8;
149-
vals[i/4] |= buf[i];
146+
unsigned int shift = (i % 4) * 8;
147+
unsigned int reg = i / 4;
148+
149+
vals[reg] |= buf[i] << shift;
150150
}
151151

152152
return regmap_bulk_write(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_DATA_WORD0,
@@ -175,7 +175,7 @@ static int rtl9300_i2c_execute_xfer(struct rtl9300_i2c *i2c, char read_write,
175175
return ret;
176176

177177
ret = regmap_read_poll_timeout(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_CTRL1,
178-
val, !(val & RTL9300_I2C_MST_CTRL1_I2C_TRIG), 100, 2000);
178+
val, !(val & RTL9300_I2C_MST_CTRL1_I2C_TRIG), 100, 100000);
179179
if (ret)
180180
return ret;
181181

@@ -281,15 +281,19 @@ static int rtl9300_i2c_smbus_xfer(struct i2c_adapter *adap, u16 addr, unsigned s
281281
ret = rtl9300_i2c_reg_addr_set(i2c, command, 1);
282282
if (ret)
283283
goto out_unlock;
284-
ret = rtl9300_i2c_config_xfer(i2c, chan, addr, data->block[0]);
284+
if (data->block[0] < 1 || data->block[0] > I2C_SMBUS_BLOCK_MAX) {
285+
ret = -EINVAL;
286+
goto out_unlock;
287+
}
288+
ret = rtl9300_i2c_config_xfer(i2c, chan, addr, data->block[0] + 1);
285289
if (ret)
286290
goto out_unlock;
287291
if (read_write == I2C_SMBUS_WRITE) {
288-
ret = rtl9300_i2c_write(i2c, &data->block[1], data->block[0]);
292+
ret = rtl9300_i2c_write(i2c, &data->block[0], data->block[0] + 1);
289293
if (ret)
290294
goto out_unlock;
291295
}
292-
len = data->block[0];
296+
len = data->block[0] + 1;
293297
break;
294298

295299
default:

0 commit comments

Comments
 (0)