[PATCH] regmap-i2c: Subtract reg size from max_write

Jim Wylder posted 1 patch 1 year, 7 months ago
There is a newer version of this series
drivers/base/regmap/regmap-i2c.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
[PATCH] regmap-i2c: Subtract reg size from max_write
Posted by Jim Wylder 1 year, 7 months ago
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.  This
allows the chunking to work correctly for this limited case
without impacting other use-cases.

Signed-off-by: Jim Wylder <jwylder@google.com>
---
 drivers/base/regmap/regmap-i2c.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/base/regmap/regmap-i2c.c b/drivers/base/regmap/regmap-i2c.c
index 3ec611dc0c09..3b1e78e845bf 100644
--- a/drivers/base/regmap/regmap-i2c.c
+++ b/drivers/base/regmap/regmap-i2c.c
@@ -350,7 +350,7 @@ 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 / BITS_PER_BYTE;
 
 		if (max_read || max_write) {
 			ret_bus = kmemdup(bus, sizeof(*bus), GFP_KERNEL);
-- 
2.45.0.rc0.197.gbae5840b3b-goog
Re: [PATCH] regmap-i2c: Subtract reg size from max_write
Posted by Mark Brown 1 year, 6 months ago
On Tue, Apr 30, 2024 at 03:15:33PM -0500, Jim Wylder wrote:

> -			max_write = quirks->max_write_len;
> +			max_write = quirks->max_write_len - config->reg_bits / BITS_PER_BYTE;

This also needs to take account of any pad bits.