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

Merge remote-tracking branches 'regmap/topic/core' and 'regmap/topic/debugfs' into regmap-next

+71 -22
+3 -2
drivers/base/regmap/internal.h
··· 105 105 106 106 bool defer_caching; 107 107 108 - u8 read_flag_mask; 109 - u8 write_flag_mask; 108 + unsigned long read_flag_mask; 109 + unsigned long write_flag_mask; 110 110 111 111 /* number of bits to (left) shift the reg value when formatting*/ 112 112 int reg_shift; ··· 173 173 int (*drop)(struct regmap *map, unsigned int min, unsigned int max); 174 174 }; 175 175 176 + bool regmap_cached(struct regmap *map, unsigned int reg); 176 177 bool regmap_writeable(struct regmap *map, unsigned int reg); 177 178 bool regmap_readable(struct regmap *map, unsigned int reg); 178 179 bool regmap_volatile(struct regmap *map, unsigned int reg);
+13 -3
drivers/base/regmap/regmap-debugfs.c
··· 77 77 } 78 78 } 79 79 80 + static bool regmap_printable(struct regmap *map, unsigned int reg) 81 + { 82 + if (regmap_precious(map, reg)) 83 + return false; 84 + 85 + if (!regmap_readable(map, reg) && !regmap_cached(map, reg)) 86 + return false; 87 + 88 + return true; 89 + } 90 + 80 91 /* 81 92 * Work out where the start offset maps into register numbers, bearing 82 93 * in mind that we suppress hidden registers. ··· 116 105 if (list_empty(&map->debugfs_off_cache)) { 117 106 for (; i <= map->max_register; i += map->reg_stride) { 118 107 /* Skip unprinted registers, closing off cache entry */ 119 - if (!regmap_readable(map, i) || 120 - regmap_precious(map, i)) { 108 + if (!regmap_printable(map, i)) { 121 109 if (c) { 122 110 c->max = p - 1; 123 111 c->max_reg = i - map->reg_stride; ··· 214 204 start_reg = regmap_debugfs_get_dump_start(map, from, *ppos, &p); 215 205 216 206 for (i = start_reg; i <= to; i += map->reg_stride) { 217 - if (!regmap_readable(map, i)) 207 + if (!regmap_readable(map, i) && !regmap_cached(map, i)) 218 208 continue; 219 209 220 210 if (regmap_precious(map, i))
+51 -13
drivers/base/regmap/regmap.c
··· 93 93 return true; 94 94 } 95 95 96 + bool regmap_cached(struct regmap *map, unsigned int reg) 97 + { 98 + int ret; 99 + unsigned int val; 100 + 101 + if (map->cache == REGCACHE_NONE) 102 + return false; 103 + 104 + if (!map->cache_ops) 105 + return false; 106 + 107 + if (map->max_register && reg > map->max_register) 108 + return false; 109 + 110 + map->lock(map->lock_arg); 111 + ret = regcache_read(map, reg, &val); 112 + map->unlock(map->lock_arg); 113 + if (ret) 114 + return false; 115 + 116 + return true; 117 + } 118 + 96 119 bool regmap_readable(struct regmap *map, unsigned int reg) 97 120 { 98 121 if (!map->reg_read) ··· 772 749 case REGMAP_ENDIAN_BIG: 773 750 map->format.format_reg = regmap_format_16_be; 774 751 break; 752 + case REGMAP_ENDIAN_LITTLE: 753 + map->format.format_reg = regmap_format_16_le; 754 + break; 775 755 case REGMAP_ENDIAN_NATIVE: 776 756 map->format.format_reg = regmap_format_16_native; 777 757 break; ··· 794 768 case REGMAP_ENDIAN_BIG: 795 769 map->format.format_reg = regmap_format_32_be; 796 770 break; 771 + case REGMAP_ENDIAN_LITTLE: 772 + map->format.format_reg = regmap_format_32_le; 773 + break; 797 774 case REGMAP_ENDIAN_NATIVE: 798 775 map->format.format_reg = regmap_format_32_native; 799 776 break; ··· 810 781 switch (reg_endian) { 811 782 case REGMAP_ENDIAN_BIG: 812 783 map->format.format_reg = regmap_format_64_be; 784 + break; 785 + case REGMAP_ENDIAN_LITTLE: 786 + map->format.format_reg = regmap_format_64_le; 813 787 break; 814 788 case REGMAP_ENDIAN_NATIVE: 815 789 map->format.format_reg = regmap_format_64_native; ··· 1328 1296 return 0; 1329 1297 } 1330 1298 1299 + static void regmap_set_work_buf_flag_mask(struct regmap *map, int max_bytes, 1300 + unsigned long mask) 1301 + { 1302 + u8 *buf; 1303 + int i; 1304 + 1305 + if (!mask || !map->work_buf) 1306 + return; 1307 + 1308 + buf = map->work_buf; 1309 + 1310 + for (i = 0; i < max_bytes; i++) 1311 + buf[i] |= (mask >> (8 * i)) & 0xff; 1312 + } 1313 + 1331 1314 int _regmap_raw_write(struct regmap *map, unsigned int reg, 1332 1315 const void *val, size_t val_len) 1333 1316 { 1334 1317 struct regmap_range_node *range; 1335 1318 unsigned long flags; 1336 - u8 *u8 = map->work_buf; 1337 1319 void *work_val = map->work_buf + map->format.reg_bytes + 1338 1320 map->format.pad_bytes; 1339 1321 void *buf; ··· 1416 1370 } 1417 1371 1418 1372 map->format.format_reg(map->work_buf, reg, map->reg_shift); 1419 - 1420 - u8[0] |= map->write_flag_mask; 1373 + regmap_set_work_buf_flag_mask(map, map->format.reg_bytes, 1374 + map->write_flag_mask); 1421 1375 1422 1376 /* 1423 1377 * Essentially all I/O mechanisms will be faster with a single ··· 2297 2251 unsigned int val_len) 2298 2252 { 2299 2253 struct regmap_range_node *range; 2300 - u8 *u8 = map->work_buf; 2301 2254 int ret; 2302 2255 2303 2256 WARN_ON(!map->bus); ··· 2313 2268 } 2314 2269 2315 2270 map->format.format_reg(map->work_buf, reg, map->reg_shift); 2316 - 2317 - /* 2318 - * Some buses or devices flag reads by setting the high bits in the 2319 - * register address; since it's always the high bits for all 2320 - * current formats we can do this here rather than in 2321 - * formatting. This may break if we get interesting formats. 2322 - */ 2323 - u8[0] |= map->read_flag_mask; 2324 - 2271 + regmap_set_work_buf_flag_mask(map, map->format.reg_bytes, 2272 + map->read_flag_mask); 2325 2273 trace_regmap_hw_read_start(map, reg, val_len / map->format.val_bytes); 2326 2274 2327 2275 ret = map->bus->read(map->bus_context, map->work_buf,
+4 -4
include/linux/regmap.h
··· 241 241 * register cache support). 242 242 * @num_reg_defaults: Number of elements in reg_defaults. 243 243 * 244 - * @read_flag_mask: Mask to be set in the top byte of the register when doing 244 + * @read_flag_mask: Mask to be set in the top bytes of the register when doing 245 245 * a read. 246 - * @write_flag_mask: Mask to be set in the top byte of the register when doing 246 + * @write_flag_mask: Mask to be set in the top bytes of the register when doing 247 247 * a write. If both read_flag_mask and write_flag_mask are 248 248 * empty the regmap_bus default masks are used. 249 249 * @use_single_rw: If set, converts the bulk read and write operations into ··· 299 299 const void *reg_defaults_raw; 300 300 unsigned int num_reg_defaults_raw; 301 301 302 - u8 read_flag_mask; 303 - u8 write_flag_mask; 302 + unsigned long read_flag_mask; 303 + unsigned long write_flag_mask; 304 304 305 305 bool use_single_rw; 306 306 bool can_multi_write;