]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
regmap: ram: support noinc semantics
authorBen Wolsieffer <ben.wolsieffer@hefring.com>
Thu, 2 Nov 2023 20:30:38 +0000 (16:30 -0400)
committerMark Brown <broonie@kernel.org>
Mon, 13 Nov 2023 01:26:17 +0000 (01:26 +0000)
Support noinc semantics in RAM backed regmaps, for testing purposes. Add
a new callback that selects registers which should have noinc behavior.
Bulk writes to a noinc register will cause the last value in the buffer
to be assigned to the register, while bulk reads will copy the same
value repeatedly into the buffer.

This patch only adds support to regmap-raw-ram, since regmap-ram does
not support bulk operations.

Signed-off-by: Ben Wolsieffer <ben.wolsieffer@hefring.com>
Link: https://lore.kernel.org/r/20231102203039.3069305-1-ben.wolsieffer@hefring.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/base/regmap/internal.h
drivers/base/regmap/regmap-raw-ram.c

index 9a9ea514c2d8176ded59056c7565ff195e6a64d1..583dd5d7d46bf3a5ad0ddd4d7dcd1d8bcc93be97 100644 (file)
@@ -318,6 +318,7 @@ struct regmap_ram_data {
        bool *read;
        bool *written;
        enum regmap_endian reg_endian;
+       bool (*noinc_reg)(struct regmap_ram_data *data, unsigned int reg);
 };
 
 /*
index c9b800885f3ba4f2cd19db5a4f1b121023ac203e..463adafa9532c2b38882648ee0bfbe4e50cf7b56 100644 (file)
@@ -41,10 +41,15 @@ static int regmap_raw_ram_gather_write(void *context,
                return -EINVAL;
 
        r = decode_reg(data->reg_endian, reg);
-       memcpy(&our_buf[r], val, val_len);
-
-       for (i = 0; i < val_len / 2; i++)
-               data->written[r + i] = true;
+       if (data->noinc_reg && data->noinc_reg(data, r)) {
+               memcpy(&our_buf[r], val + val_len - 2, 2);
+               data->written[r] = true;
+       } else {
+               memcpy(&our_buf[r], val, val_len);
+
+               for (i = 0; i < val_len / 2; i++)
+                       data->written[r + i] = true;
+       }
        
        return 0;
 }
@@ -70,10 +75,16 @@ static int regmap_raw_ram_read(void *context,
                return -EINVAL;
 
        r = decode_reg(data->reg_endian, reg);
-       memcpy(val, &our_buf[r], val_len);
-
-       for (i = 0; i < val_len / 2; i++)
-               data->read[r + i] = true;
+       if (data->noinc_reg && data->noinc_reg(data, r)) {
+               for (i = 0; i < val_len; i += 2)
+                       memcpy(val + i, &our_buf[r], 2);
+               data->read[r] = true;
+       } else {
+               memcpy(val, &our_buf[r], val_len);
+
+               for (i = 0; i < val_len / 2; i++)
+                       data->read[r + i] = true;
+       }
 
        return 0;
 }