|
@@ -56,16 +56,46 @@ static const struct file_operations regmap_name_fops = {
|
|
|
.llseek = default_llseek,
|
|
|
};
|
|
|
|
|
|
+/*
|
|
|
+ * Work out where the start offset maps into register numbers, bearing
|
|
|
+ * in mind that we suppress hidden registers.
|
|
|
+ */
|
|
|
+static unsigned int regmap_debugfs_get_dump_start(struct regmap *map,
|
|
|
+ unsigned int base,
|
|
|
+ loff_t from,
|
|
|
+ loff_t *pos)
|
|
|
+{
|
|
|
+ loff_t p = *pos;
|
|
|
+ unsigned int i;
|
|
|
+
|
|
|
+ for (i = base; i <= map->max_register; i += map->reg_stride) {
|
|
|
+ if (!regmap_readable(map, i))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (regmap_precious(map, i))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (i >= from) {
|
|
|
+ *pos = p;
|
|
|
+ return i;
|
|
|
+ }
|
|
|
+
|
|
|
+ p += map->debugfs_tot_len;
|
|
|
+ }
|
|
|
+
|
|
|
+ return base;
|
|
|
+}
|
|
|
+
|
|
|
static ssize_t regmap_read_debugfs(struct regmap *map, unsigned int from,
|
|
|
unsigned int to, char __user *user_buf,
|
|
|
size_t count, loff_t *ppos)
|
|
|
{
|
|
|
size_t buf_pos = 0;
|
|
|
- loff_t p = 0;
|
|
|
+ loff_t p = *ppos;
|
|
|
ssize_t ret;
|
|
|
int i;
|
|
|
char *buf;
|
|
|
- unsigned int val;
|
|
|
+ unsigned int val, start_reg;
|
|
|
|
|
|
if (*ppos < 0 || !count)
|
|
|
return -EINVAL;
|
|
@@ -83,7 +113,10 @@ static ssize_t regmap_read_debugfs(struct regmap *map, unsigned int from,
|
|
|
map->debugfs_val_len + 3; /* : \n */
|
|
|
}
|
|
|
|
|
|
- for (i = from; i <= to; i += map->reg_stride) {
|
|
|
+ /* Work out which register we're starting at */
|
|
|
+ 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))
|
|
|
continue;
|
|
|
|