Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+83 -11
+1
drivers/base/regmap/internal.h
··· 318 318 bool *read; 319 319 bool *written; 320 320 enum regmap_endian reg_endian; 321 + bool (*noinc_reg)(struct regmap_ram_data *data, unsigned int reg); 321 322 }; 322 323 323 324 /*
+60
drivers/base/regmap/regmap-kunit.c
··· 1186 1186 regmap_exit(map); 1187 1187 } 1188 1188 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 + 1189 1248 static void raw_sync(struct kunit *test) 1190 1249 { 1191 1250 struct raw_test_types *t = (struct raw_test_types *)test->param_value; ··· 1343 1284 KUNIT_CASE_PARAM(raw_read_defaults, raw_test_types_gen_params), 1344 1285 KUNIT_CASE_PARAM(raw_write_read_single, raw_test_types_gen_params), 1345 1286 KUNIT_CASE_PARAM(raw_write, raw_test_types_gen_params), 1287 + KUNIT_CASE_PARAM(raw_noinc_write, raw_test_types_gen_params), 1346 1288 KUNIT_CASE_PARAM(raw_sync, raw_test_cache_types_gen_params), 1347 1289 {} 1348 1290 };
+2 -2
drivers/base/regmap/regmap-ram.c
··· 65 65 return ERR_PTR(-EINVAL); 66 66 } 67 67 68 - data->read = kcalloc(sizeof(bool), config->max_register + 1, 68 + data->read = kcalloc(config->max_register + 1, sizeof(bool), 69 69 GFP_KERNEL); 70 70 if (!data->read) 71 71 return ERR_PTR(-ENOMEM); 72 72 73 - data->written = kcalloc(sizeof(bool), config->max_register + 1, 73 + data->written = kcalloc(config->max_register + 1, sizeof(bool), 74 74 GFP_KERNEL); 75 75 if (!data->written) 76 76 return ERR_PTR(-ENOMEM);
+19 -8
drivers/base/regmap/regmap-raw-ram.c
··· 41 41 return -EINVAL; 42 42 43 43 r = decode_reg(data->reg_endian, reg); 44 - memcpy(&our_buf[r], val, val_len); 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); 45 49 46 - for (i = 0; i < val_len / 2; i++) 47 - data->written[r + i] = true; 50 + for (i = 0; i < val_len / 2; i++) 51 + data->written[r + i] = true; 52 + } 48 53 49 54 return 0; 50 55 } ··· 75 70 return -EINVAL; 76 71 77 72 r = decode_reg(data->reg_endian, reg); 78 - memcpy(val, &our_buf[r], val_len); 73 + if (data->noinc_reg && data->noinc_reg(data, r)) { 74 + for (i = 0; i < val_len; i += 2) 75 + memcpy(val + i, &our_buf[r], 2); 76 + data->read[r] = true; 77 + } else { 78 + memcpy(val, &our_buf[r], val_len); 79 79 80 - for (i = 0; i < val_len / 2; i++) 81 - data->read[r + i] = true; 80 + for (i = 0; i < val_len / 2; i++) 81 + data->read[r + i] = true; 82 + } 82 83 83 84 return 0; 84 85 } ··· 122 111 return ERR_PTR(-EINVAL); 123 112 } 124 113 125 - data->read = kcalloc(sizeof(bool), config->max_register + 1, 114 + data->read = kcalloc(config->max_register + 1, sizeof(bool), 126 115 GFP_KERNEL); 127 116 if (!data->read) 128 117 return ERR_PTR(-ENOMEM); 129 118 130 - data->written = kcalloc(sizeof(bool), config->max_register + 1, 119 + data->written = kcalloc(config->max_register + 1, sizeof(bool), 131 120 GFP_KERNEL); 132 121 if (!data->written) 133 122 return ERR_PTR(-ENOMEM);
+1 -1
drivers/base/regmap/regmap.c
··· 2136 2136 } 2137 2137 2138 2138 /** 2139 - * regmap_noinc_write(): Write data from a register without incrementing the 2139 + * regmap_noinc_write(): Write data to a register without incrementing the 2140 2140 * register number 2141 2141 * 2142 2142 * @map: Register map to write to