Patch "regmap-i2c: Subtract reg size from max_write" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    regmap-i2c: Subtract reg size from max_write

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     regmap-i2c-subtract-reg-size-from-max_write.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 5bdc55c4a839fc104f87846cf8a5531a04cbe727
Author: Jim Wylder <jwylder@xxxxxxxxxx>
Date:   Thu May 23 16:14:36 2024 -0500

    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@xxxxxxxxxx>
    Link: https://msgid.link/r/20240523211437.2839942-1-jwylder@xxxxxxxxxx
    Signed-off-by: Mark Brown <broonie@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/base/regmap/regmap-i2c.c b/drivers/base/regmap/regmap-i2c.c
index 3ec611dc0c09f..a905e955bbfc7 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);




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux