From: Ahmad Fatoum <ahmad@xxxxxx> Signed-off-by: Ahmad Fatoum <ahmad@xxxxxx> --- Works good enough to toggle Ethernet PHY regulator on a rk3399-based Rock Pi N10. --- drivers/base/regmap/regmap-i2c.c | 37 ++++++++++++++++++++++++++++++++ include/regmap.h | 3 +++ 2 files changed, 40 insertions(+) diff --git a/drivers/base/regmap/regmap-i2c.c b/drivers/base/regmap/regmap-i2c.c index 5e3705162c92..756bc224cc3b 100644 --- a/drivers/base/regmap/regmap-i2c.c +++ b/drivers/base/regmap/regmap-i2c.c @@ -42,3 +42,40 @@ struct regmap *regmap_init_i2c(struct i2c_client *client, { return regmap_init(&client->dev, ®map_regmap_i2c_bus, client, config); } + +static int regmap_smbus_byte_reg_read(void *client, unsigned int reg, unsigned int *val) +{ + int ret; + + if (reg > 0xff) + return -EINVAL; + + ret = i2c_smbus_read_byte_data(client, reg); + if (ret < 0) + return ret; + + *val = ret; + + return 0; +} + +static int regmap_smbus_byte_reg_write(void *client, unsigned int reg, unsigned int val) +{ + if (val > 0xff || reg > 0xff) + return -EINVAL; + + return i2c_smbus_write_byte_data(client, reg, val); +} + +static const struct regmap_bus regmap_smbus_byte = { + .reg_write = regmap_smbus_byte_reg_write, + .reg_read = regmap_smbus_byte_reg_read, +}; + +struct regmap *regmap_init_i2c_smbus(struct i2c_client *client, + const struct regmap_config *config) +{ + if (config->val_bits != 8 || config->reg_bits != 8) + return ERR_PTR(-ENOSYS); + return regmap_init(&client->dev, ®map_smbus_byte, client, config); +} diff --git a/include/regmap.h b/include/regmap.h index 4b30c2177629..5bedb30d8a78 100644 --- a/include/regmap.h +++ b/include/regmap.h @@ -89,6 +89,9 @@ struct i2c_client; struct regmap *regmap_init_i2c(struct i2c_client *i2c, const struct regmap_config *config); +struct regmap *regmap_init_i2c_smbus(struct i2c_client *client, + const struct regmap_config *config); + /** * regmap_init_mmio() - Initialise register map * -- 2.30.2 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox