mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
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>
This commit is contained in:
committed by
Mark Brown
parent
b85ea95d08
commit
02e3564a34
@@ -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);
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@@ -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);
|
||||
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;
|
||||
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);
|
||||
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;
|
||||
for (i = 0; i < val_len / 2; i++)
|
||||
data->read[r + i] = true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user