void *work_buf; /* Scratch buffer used to format I/O */
struct regmap_format format; /* Buffer format */
const struct regmap_bus *bus;
++
++ unsigned int max_register;
++ bool (*writeable_reg)(struct device *dev, unsigned int reg);
++ bool (*readable_reg)(struct device *dev, unsigned int reg);
++ bool (*volatile_reg)(struct device *dev, unsigned int reg);
};
static void regmap_format_4_12_write(struct regmap *map,
map->format.val_bytes = config->val_bits / 8;
map->dev = dev;
map->bus = bus;
++ map->max_register = config->max_register;
++ map->writeable_reg = config->writeable_reg;
++ map->readable_reg = config->readable_reg;
++ map->volatile_reg = config->volatile_reg;
switch (config->reg_bits) {
case 4:
map->format.format_reg(map->work_buf, reg);
-- /* Try to do a gather write if we can */
-- if (map->bus->gather_write)
++ /* If we're doing a single register write we can probably just
++ * send the work_buf directly, otherwise try to do a gather
++ * write.
++ */
++ if (val == map->work_buf + map->format.reg_bytes)
++ ret = map->bus->write(map->dev, map->work_buf,
++ map->format.reg_bytes + val_len);
++ else if (map->bus->gather_write)
ret = map->bus->gather_write(map->dev, map->work_buf,
map->format.reg_bytes,
val, val_len);
-- /* Otherwise fall back on linearising by hand. */
++ /* If that didn't work fall back on linearising by hand. */
if (ret == -ENOTSUPP) {
len = map->format.reg_bytes + val_len;
buf = kmalloc(len, GFP_KERNEL);
u8[0] |= map->bus->read_flag_mask;
ret = map->bus->read(map->dev, map->work_buf, map->format.reg_bytes,
- - val, map->format.val_bytes);
+ + val, val_len);
if (ret != 0)
return ret;