Loading drivers/base/regmap/regmap.c +9 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,11 @@ struct regmap { 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, Loading Loading @@ -116,6 +121,10 @@ struct regmap *regmap_init(struct device *dev, 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: Loading include/linux/regmap.h +52 −0 Original line number Diff line number Diff line Loading @@ -20,9 +20,61 @@ struct i2c_client; struct spi_device; /** * Default value for a register. We use an array of structs rather * than a simple array as many modern devices have very sparse * register maps. * * @reg: Register address. * @def: Register default value. */ struct reg_default { unsigned int reg; unsigned int def; }; /** * Configuration for the register map of a device. * * @reg_bits: Number of bits in a register address, mandatory. * @val_bits: Number of bits in a register value, mandatory. * * @writeable_reg: Optional callback returning true if the register * can be written to. * @readable_reg: Optional callback returning true if the register * can be read from. * @volatile_reg: Optional callback returning true if the register * value can't be cached. * @precious_reg: Optional callback returning true if the rgister * should not be read outside of a call from the driver * (eg, a clear on read interrupt status register). * * @max_register: Optional, specifies the maximum valid register index. * @reg_defaults: Power on reset values for registers (for use with * register cache support). * @num_reg_defaults: Number of elements in reg_defaults. * * @read_flag_mask: Mask to be set in the top byte of the register when doing * a read. * @write_flag_mask: Mask to be set in the top byte of the register when doing * a write. If both read_flag_mask and write_flag_mask are * empty the regmap_bus default masks are used. */ struct regmap_config { int reg_bits; int val_bits; 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); bool (*precious_reg)(struct device *dev, unsigned int reg); unsigned int max_register; struct reg_default *reg_defaults; int num_reg_defaults; u8 read_flag_mask; u8 write_flag_mask; }; typedef int (*regmap_hw_write)(struct device *dev, const void *data, Loading Loading
drivers/base/regmap/regmap.c +9 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,11 @@ struct regmap { 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, Loading Loading @@ -116,6 +121,10 @@ struct regmap *regmap_init(struct device *dev, 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: Loading
include/linux/regmap.h +52 −0 Original line number Diff line number Diff line Loading @@ -20,9 +20,61 @@ struct i2c_client; struct spi_device; /** * Default value for a register. We use an array of structs rather * than a simple array as many modern devices have very sparse * register maps. * * @reg: Register address. * @def: Register default value. */ struct reg_default { unsigned int reg; unsigned int def; }; /** * Configuration for the register map of a device. * * @reg_bits: Number of bits in a register address, mandatory. * @val_bits: Number of bits in a register value, mandatory. * * @writeable_reg: Optional callback returning true if the register * can be written to. * @readable_reg: Optional callback returning true if the register * can be read from. * @volatile_reg: Optional callback returning true if the register * value can't be cached. * @precious_reg: Optional callback returning true if the rgister * should not be read outside of a call from the driver * (eg, a clear on read interrupt status register). * * @max_register: Optional, specifies the maximum valid register index. * @reg_defaults: Power on reset values for registers (for use with * register cache support). * @num_reg_defaults: Number of elements in reg_defaults. * * @read_flag_mask: Mask to be set in the top byte of the register when doing * a read. * @write_flag_mask: Mask to be set in the top byte of the register when doing * a write. If both read_flag_mask and write_flag_mask are * empty the regmap_bus default masks are used. */ struct regmap_config { int reg_bits; int val_bits; 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); bool (*precious_reg)(struct device *dev, unsigned int reg); unsigned int max_register; struct reg_default *reg_defaults; int num_reg_defaults; u8 read_flag_mask; u8 write_flag_mask; }; typedef int (*regmap_hw_write)(struct device *dev, const void *data, Loading