Skip to content

Commit 02e3564

Browse files
lopsided98broonie
authored andcommitted
regmap: ram: support noinc semantics
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>
1 parent b85ea95 commit 02e3564

File tree

2 files changed

+20
-8
lines changed

2 files changed

+20
-8
lines changed

drivers/base/regmap/internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,7 @@ struct regmap_ram_data {
318318
bool *read;
319319
bool *written;
320320
enum regmap_endian reg_endian;
321+
bool (*noinc_reg)(struct regmap_ram_data *data, unsigned int reg);
321322
};
322323

323324
/*

drivers/base/regmap/regmap-raw-ram.c

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,15 @@ static int regmap_raw_ram_gather_write(void *context,
4141
return -EINVAL;
4242

4343
r = decode_reg(data->reg_endian, reg);
44-
memcpy(&our_buf[r], val, val_len);
45-
46-
for (i = 0; i < val_len / 2; i++)
47-
data->written[r + i] = true;
44+
if (data->noinc_reg && data->noinc_reg(data, r)) {
45+
memcpy(&our_buf[r], val + val_len - 2, 2);
46+
data->written[r] = true;
47+
} else {
48+
memcpy(&our_buf[r], val, val_len);
49+
50+
for (i = 0; i < val_len / 2; i++)
51+
data->written[r + i] = true;
52+
}
4853

4954
return 0;
5055
}
@@ -70,10 +75,16 @@ static int regmap_raw_ram_read(void *context,
7075
return -EINVAL;
7176

7277
r = decode_reg(data->reg_endian, reg);
73-
memcpy(val, &our_buf[r], val_len);
74-
75-
for (i = 0; i < val_len / 2; i++)
76-
data->read[r + i] = true;
78+
if (data->noinc_reg && data->noinc_reg(data, r)) {
79+
for (i = 0; i < val_len; i += 2)
80+
memcpy(val + i, &our_buf[r], 2);
81+
data->read[r] = true;
82+
} else {
83+
memcpy(val, &our_buf[r], val_len);
84+
85+
for (i = 0; i < val_len / 2; i++)
86+
data->read[r + i] = true;
87+
}
7788

7889
return 0;
7990
}

0 commit comments

Comments
 (0)