Skip to content

Commit 83130ff

Browse files
committed
Merge tag 'regmap-v6.8' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap
Pull regmap updates from Mark Brown: "This was a very quiet release for regmap, we added kunit test coverage for a noinc fix that was merged during v6.7 and a couple of other trivial cleanups" * tag 'regmap-v6.8' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap: regmap: fix kcalloc() arguments order regmap: fix regmap_noinc_write() description regmap: kunit: add noinc write test regmap: ram: support noinc semantics
2 parents 6c1dd1f + 3b201c9 commit 83130ff

File tree

5 files changed

+85
-13
lines changed

5 files changed

+85
-13
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-kunit.c

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1186,6 +1186,65 @@ static void raw_write(struct kunit *test)
11861186
regmap_exit(map);
11871187
}
11881188

1189+
static bool reg_zero(struct device *dev, unsigned int reg)
1190+
{
1191+
return reg == 0;
1192+
}
1193+
1194+
static bool ram_reg_zero(struct regmap_ram_data *data, unsigned int reg)
1195+
{
1196+
return reg == 0;
1197+
}
1198+
1199+
static void raw_noinc_write(struct kunit *test)
1200+
{
1201+
struct raw_test_types *t = (struct raw_test_types *)test->param_value;
1202+
struct regmap *map;
1203+
struct regmap_config config;
1204+
struct regmap_ram_data *data;
1205+
unsigned int val, val_test, val_last;
1206+
u16 val_array[BLOCK_TEST_SIZE];
1207+
1208+
config = raw_regmap_config;
1209+
config.volatile_reg = reg_zero;
1210+
config.writeable_noinc_reg = reg_zero;
1211+
config.readable_noinc_reg = reg_zero;
1212+
1213+
map = gen_raw_regmap(&config, t, &data);
1214+
KUNIT_ASSERT_FALSE(test, IS_ERR(map));
1215+
if (IS_ERR(map))
1216+
return;
1217+
1218+
data->noinc_reg = ram_reg_zero;
1219+
1220+
get_random_bytes(&val_array, sizeof(val_array));
1221+
1222+
if (config.val_format_endian == REGMAP_ENDIAN_BIG) {
1223+
val_test = be16_to_cpu(val_array[1]) + 100;
1224+
val_last = be16_to_cpu(val_array[BLOCK_TEST_SIZE - 1]);
1225+
} else {
1226+
val_test = le16_to_cpu(val_array[1]) + 100;
1227+
val_last = le16_to_cpu(val_array[BLOCK_TEST_SIZE - 1]);
1228+
}
1229+
1230+
/* Put some data into the register following the noinc register */
1231+
KUNIT_EXPECT_EQ(test, 0, regmap_write(map, 1, val_test));
1232+
1233+
/* Write some data to the noinc register */
1234+
KUNIT_EXPECT_EQ(test, 0, regmap_noinc_write(map, 0, val_array,
1235+
sizeof(val_array)));
1236+
1237+
/* We should read back the last value written */
1238+
KUNIT_EXPECT_EQ(test, 0, regmap_read(map, 0, &val));
1239+
KUNIT_ASSERT_EQ(test, val_last, val);
1240+
1241+
/* Make sure we didn't touch the register after the noinc register */
1242+
KUNIT_EXPECT_EQ(test, 0, regmap_read(map, 1, &val));
1243+
KUNIT_ASSERT_EQ(test, val_test, val);
1244+
1245+
regmap_exit(map);
1246+
}
1247+
11891248
static void raw_sync(struct kunit *test)
11901249
{
11911250
struct raw_test_types *t = (struct raw_test_types *)test->param_value;
@@ -1284,6 +1343,7 @@ static struct kunit_case regmap_test_cases[] = {
12841343
KUNIT_CASE_PARAM(raw_read_defaults, raw_test_types_gen_params),
12851344
KUNIT_CASE_PARAM(raw_write_read_single, raw_test_types_gen_params),
12861345
KUNIT_CASE_PARAM(raw_write, raw_test_types_gen_params),
1346+
KUNIT_CASE_PARAM(raw_noinc_write, raw_test_types_gen_params),
12871347
KUNIT_CASE_PARAM(raw_sync, raw_test_cache_types_gen_params),
12881348
{}
12891349
};

drivers/base/regmap/regmap-ram.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,12 @@ struct regmap *__regmap_init_ram(const struct regmap_config *config,
6565
return ERR_PTR(-EINVAL);
6666
}
6767

68-
data->read = kcalloc(sizeof(bool), config->max_register + 1,
68+
data->read = kcalloc(config->max_register + 1, sizeof(bool),
6969
GFP_KERNEL);
7070
if (!data->read)
7171
return ERR_PTR(-ENOMEM);
7272

73-
data->written = kcalloc(sizeof(bool), config->max_register + 1,
73+
data->written = kcalloc(config->max_register + 1, sizeof(bool),
7474
GFP_KERNEL);
7575
if (!data->written)
7676
return ERR_PTR(-ENOMEM);

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

Lines changed: 21 additions & 10 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
}
@@ -111,12 +122,12 @@ struct regmap *__regmap_init_raw_ram(const struct regmap_config *config,
111122
return ERR_PTR(-EINVAL);
112123
}
113124

114-
data->read = kcalloc(sizeof(bool), config->max_register + 1,
125+
data->read = kcalloc(config->max_register + 1, sizeof(bool),
115126
GFP_KERNEL);
116127
if (!data->read)
117128
return ERR_PTR(-ENOMEM);
118129

119-
data->written = kcalloc(sizeof(bool), config->max_register + 1,
130+
data->written = kcalloc(config->max_register + 1, sizeof(bool),
120131
GFP_KERNEL);
121132
if (!data->written)
122133
return ERR_PTR(-ENOMEM);

drivers/base/regmap/regmap.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2136,7 +2136,7 @@ static int regmap_noinc_readwrite(struct regmap *map, unsigned int reg,
21362136
}
21372137

21382138
/**
2139-
* regmap_noinc_write(): Write data from a register without incrementing the
2139+
* regmap_noinc_write(): Write data to a register without incrementing the
21402140
* register number
21412141
*
21422142
* @map: Register map to write to

0 commit comments

Comments
 (0)