summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Wylder <jwylder@google.com>2024-05-23 16:14:36 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-07-11 12:49:20 +0200
commitfc525ed8cb0fb35e568dd3ef815be443a6959993 (patch)
treeba7c47b0309da38e684b12088e942ca41c5d5d9d
parentb955b47905ed22e447b1958cfc0637ef8de7a657 (diff)
downloadlinux-fc525ed8cb0fb35e568dd3ef815be443a6959993.tar.gz
linux-fc525ed8cb0fb35e568dd3ef815be443a6959993.tar.bz2
linux-fc525ed8cb0fb35e568dd3ef815be443a6959993.zip
regmap-i2c: Subtract reg size from max_write
[ Upstream commit 611b7eb19d0a305d4de00280e4a71a1b15c507fc ] Currently, when an adapter defines a max_write_len quirk, the data will be chunked into data sizes equal to the max_write_len quirk value. But the payload will be increased by the size of the register address before transmission. The resulting value always ends up larger than the limit set by the quirk. Avoid this error by setting regmap's max_write to the quirk's max_write_len minus the number of bytes for the register and padding. This allows the chunking to work correctly for this limited case without impacting other use-cases. Signed-off-by: Jim Wylder <jwylder@google.com> Link: https://msgid.link/r/20240523211437.2839942-1-jwylder@google.com Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--drivers/base/regmap/regmap-i2c.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/base/regmap/regmap-i2c.c b/drivers/base/regmap/regmap-i2c.c
index 3ec611dc0c09..a905e955bbfc 100644
--- a/drivers/base/regmap/regmap-i2c.c
+++ b/drivers/base/regmap/regmap-i2c.c
@@ -350,7 +350,8 @@ static const struct regmap_bus *regmap_get_i2c_bus(struct i2c_client *i2c,
if (quirks->max_write_len &&
(bus->max_raw_write == 0 || bus->max_raw_write > quirks->max_write_len))
- max_write = quirks->max_write_len;
+ max_write = quirks->max_write_len -
+ (config->reg_bits + config->pad_bits) / BITS_PER_BYTE;
if (max_read || max_write) {
ret_bus = kmemdup(bus, sizeof(*bus), GFP_KERNEL);