static ssize_t regmap_map_read_file(struct file *file, char __user *user_buf, size_t count, loff_t *ppos) { int reg_len, val_len, tot_len; size_t buf_pos = 0; loff_t p = 0; ssize_t ret; int i; struct regmap *map = file->private_data; char *buf; unsigned int val; if (*ppos < 0 || !count) return -EINVAL; buf = kmalloc(count, GFP_KERNEL); if (!buf) return -ENOMEM; /* Calculate the length of a fixed format */ reg_len = regmap_calc_reg_len(map->max_register, buf, count); val_len = 2 * map->format.val_bytes; tot_len = reg_len + val_len + 3; /* : \n */ for (i = 0; i < map->max_register + 1; i++) { if (!regmap_readable(map, i)) continue; if (regmap_precious(map, i)) continue; /* If we're in the region the user is trying to read */ if (p >= *ppos) { /* ...but not beyond it */ if (buf_pos >= count - 1 - tot_len) break; /* Format the register */ snprintf(buf + buf_pos, count - buf_pos, "%.*x: ", reg_len, i); buf_pos += reg_len + 2; /* Format the value, write all X if we can't read */ ret = regmap_read(map, i, &val); if (ret == 0) snprintf(buf + buf_pos, count - buf_pos, "%.*x", val_len, val); else memset(buf + buf_pos, 'X', val_len); buf_pos += 2 * map->format.val_bytes; buf[buf_pos++] = '\n'; } p += tot_len; } ret = buf_pos; if (copy_to_user(user_buf, buf, buf_pos)) { ret = -EFAULT; goto out; } *ppos += buf_pos; out: kfree(buf); return ret; }
static ssize_t regmap_access_read_file(struct file *file, char __user *user_buf, size_t count, loff_t *ppos) { int reg_len, tot_len; size_t buf_pos = 0; loff_t p = 0; ssize_t ret; int i; struct regmap *map = file->private_data; char *buf; if (*ppos < 0 || !count) return -EINVAL; buf = kmalloc(count, GFP_KERNEL); if (!buf) return -ENOMEM; reg_len = regmap_calc_reg_len(map->max_register, buf, count); tot_len = reg_len + 10; for (i = 0; i < map->max_register + 1; i++) { if (!regmap_readable(map, i) && !regmap_writeable(map, i)) continue; if (p >= *ppos) { if (buf_pos >= count - 1 - tot_len) break; snprintf(buf + buf_pos, count - buf_pos, "%.*x: %c %c %c %c\n", reg_len, i, regmap_readable(map, i) ? 'y' : 'n', regmap_writeable(map, i) ? 'y' : 'n', regmap_volatile(map, i) ? 'y' : 'n', regmap_precious(map, i) ? 'y' : 'n'); buf_pos += tot_len; } p += tot_len; } ret = buf_pos; if (copy_to_user(user_buf, buf, buf_pos)) { ret = -EFAULT; goto out; } *ppos += buf_pos; out: kfree(buf); return ret; }
static ssize_t regmap_access_read_file(struct file *file, char __user *user_buf, size_t count, loff_t *ppos) { int reg_len, tot_len; size_t buf_pos = 0; loff_t p = 0; ssize_t ret; int i; struct regmap *map = file->private_data; char *buf; if (*ppos < 0 || !count) return -EINVAL; buf = kmalloc(count, GFP_KERNEL); if (!buf) return -ENOMEM; /* Calculate the length of a fixed format */ reg_len = regmap_calc_reg_len(map->max_register, buf, count); tot_len = reg_len + 10; /* ': R W V P\n' */ for (i = 0; i < map->max_register + 1; i++) { /* Ignore registers which are neither readable nor writable */ if (!regmap_readable(map, i) && !regmap_writeable(map, i)) continue; /* If we're in the region the user is trying to read */ if (p >= *ppos) { /* ...but not beyond it */ if (buf_pos >= count - 1 - tot_len) break; /* Format the register */ snprintf(buf + buf_pos, count - buf_pos, "%.*x: %c %c %c %c\n", reg_len, i, regmap_readable(map, i) ? 'y' : 'n', regmap_writeable(map, i) ? 'y' : 'n', regmap_volatile(map, i) ? 'y' : 'n', regmap_precious(map, i) ? 'y' : 'n'); buf_pos += tot_len; } p += tot_len; } ret = buf_pos; if (copy_to_user(user_buf, buf, buf_pos)) { ret = -EFAULT; goto out; } *ppos += buf_pos; out: kfree(buf); return ret; }
static ssize_t regmap_map_read_file(struct file *file, char __user *user_buf, size_t count, loff_t *ppos) { int reg_len, val_len, tot_len; size_t buf_pos = 0; loff_t p = 0; ssize_t ret; int i; struct regmap *map = file->private_data; char *buf; unsigned int val; if (*ppos < 0 || !count) return -EINVAL; buf = kmalloc(count, GFP_KERNEL); if (!buf) return -ENOMEM; reg_len = regmap_calc_reg_len(map->max_register, buf, count); val_len = 2 * map->format.val_bytes; tot_len = reg_len + val_len + 3; for (i = 0; i < map->max_register + 1; i++) { if (!regmap_readable(map, i)) continue; if (regmap_precious(map, i)) continue; if (p >= *ppos) { if (buf_pos + 1 + tot_len >= count) break; snprintf(buf + buf_pos, count - buf_pos, "%.*x: ", reg_len, i); buf_pos += reg_len + 2; ret = regmap_read(map, i, &val); if (ret == 0) snprintf(buf + buf_pos, count - buf_pos, "%.*x", val_len, val); else memset(buf + buf_pos, 'X', val_len); buf_pos += 2 * map->format.val_bytes; buf[buf_pos++] = '\n'; } p += tot_len; } ret = buf_pos; if (copy_to_user(user_buf, buf, buf_pos)) { ret = -EFAULT; goto out; } *ppos += buf_pos; out: kfree(buf); return ret; }