In its current implementation, regmap's debugfs interface fails to correctly print out register values for write-only devices.
The implementation of regmap's debugfs interface doesn't facilitate dumping out register values for write-only devices because it requires readability in the sense that the register exists in a map and can be read over the bus. Write-only devices fail this criteria despite regmap holding cached values of the register contents. Executing 'cat /sys/kernel/debug/regmap/<device>/registers' against a write-only device results in a WARN_ON in dmesg and nothing printed to stdout. My patch makes the following changes: in addition to checking if the register is unreadable, it must also be uncached by regmap in order to be skipped. In other words, write-only devices should have their cached register values (if they exist) printed out the same as read-write devices. Checks for cached values are added in several places where regmap-debugfs.c checks for the existence of a register. I originally wrote this patch for 15.05/kernel 3.18 which supports the LinkIt7688 and its breakout board. Though there isn't LinkIt support for 4.4 in trunk yet, I managed to cobble enough together to test this change. Signed-off-by: Cody Harris <c...@deadcode.xyz> --- --- a/drivers/base/regmap/regmap-debugfs.c +++ b/drivers/base/regmap/regmap-debugfs.c @@ -105,8 +105,9 @@ static unsigned int regmap_debugfs_get_d if (list_empty(&map->debugfs_off_cache)) { for (; i <= map->max_register; i += map->reg_stride) { /* Skip unprinted registers, closing off cache entry */ - if (!regmap_readable(map, i) || - regmap_precious(map, i)) { + if ((regcache_lookup_reg(map, i) < 0 + && !regmap_readable(map, i)) || + regmap_precious(map, i)) { if (c) { c->max = p - 1; c->max_reg = i - map->reg_stride; @@ -204,7 +205,7 @@ static ssize_t regmap_read_debugfs(struc start_reg = regmap_debugfs_get_dump_start(map, from, *ppos, &p); for (i = start_reg; i <= to; i += map->reg_stride) { - if (!regmap_readable(map, i)) + if (!regmap_readable(map, i) && regcache_lookup_reg(map, i) < 0) continue; if (regmap_precious(map, i)) @@ -592,7 +593,8 @@ void regmap_debugfs_init(struct regmap * debugfs_create_file("range", 0400, map->debugfs, map, ®map_reg_ranges_fops); - if (map->max_register || regmap_readable(map, 0)) { + if (map->max_register || regmap_readable(map, 0) + || regcache_lookup_reg(map, 0) > 0) { umode_t registers_mode; #if defined(REGMAP_ALLOW_WRITE_DEBUGFS) _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel