diff --git a/drivers/media/i2c/rk628/rk628.c b/drivers/media/i2c/rk628/rk628.c index 3e3482c08cb4..8236eaef9320 100644 --- a/drivers/media/i2c/rk628/rk628.c +++ b/drivers/media/i2c/rk628/rk628.c @@ -262,6 +262,61 @@ static const struct regmap_config rk628_regmap_config[RK628_DEV_MAX] = { }, }; +int rk628_media_i2c_write(struct rk628 *rk628, u32 reg, u32 val) +{ + int region = (reg >> 16) & 0xff; + int ret = 0; + + if (region >= RK628_DEV_MAX) { + dev_err(rk628->dev, + "%s: i2c err: invalid arguments, out of register range\n", __func__); + return -EINVAL; + } + + ret = regmap_write(rk628->regmap[region], reg, val); + if (ret < 0) + dev_err(rk628->dev, + "%s: i2c err reg=0x%x, val=0x%x, ret=%d\n", __func__, reg, val, ret); + + return ret; +} +EXPORT_SYMBOL(rk628_media_i2c_write); + +int rk628_media_i2c_read(struct rk628 *rk628, u32 reg, u32 *val) +{ + int region = (reg >> 16) & 0xff; + int ret = 0; + + if (region >= RK628_DEV_MAX) { + dev_err(rk628->dev, + "%s: i2c err: invalid arguments, out of register range\n", __func__); + return -EINVAL; + } + + ret = regmap_read(rk628->regmap[region], reg, val); + if (ret < 0) + dev_err(rk628->dev, + "%s: i2c err reg=0x%x, val=0x%x ret=%d\n", __func__, reg, *val, ret); + + return ret; +} +EXPORT_SYMBOL(rk628_media_i2c_read); + +int rk628_media_i2c_update_bits(struct rk628 *rk628, u32 reg, u32 mask, + u32 val) +{ + int region = (reg >> 16) & 0xff; + + if (region >= RK628_DEV_MAX) { + dev_err(rk628->dev, + "%s: i2c err: invalid arguments, out of register range\n", __func__); + return -EINVAL; + } + + return regmap_update_bits(rk628->regmap[region], reg, mask, val); +} +EXPORT_SYMBOL(rk628_media_i2c_update_bits); + static int rk628_reg_show(struct seq_file *s, void *v) { const struct regmap_config *reg; diff --git a/drivers/media/i2c/rk628/rk628.h b/drivers/media/i2c/rk628/rk628.h index b98d18017c17..6ea3ad0d6437 100644 --- a/drivers/media/i2c/rk628/rk628.h +++ b/drivers/media/i2c/rk628/rk628.h @@ -296,36 +296,24 @@ struct rk628 { struct dentry *debug_dir; }; +int rk628_media_i2c_write(struct rk628 *rk628, u32 reg, u32 val); +int rk628_media_i2c_read(struct rk628 *rk628, u32 reg, u32 *val); +int rk628_media_i2c_update_bits(struct rk628 *rk628, u32 reg, u32 mask, u32 val); + static inline int rk628_i2c_write(struct rk628 *rk628, u32 reg, u32 val) { - int region = (reg >> 16) & 0xff; - int ret = 0; - - ret = regmap_write(rk628->regmap[region], reg, val); - if (ret < 0) - pr_info("%s: i2c err reg=0x%x, val=0x%x, ret=%d\n", __func__, reg, val, ret); - - return ret; + return rk628_media_i2c_write(rk628, reg, val); } static inline int rk628_i2c_read(struct rk628 *rk628, u32 reg, u32 *val) { - int region = (reg >> 16) & 0xff; - int ret = 0; - - ret = regmap_read(rk628->regmap[region], reg, val); - if (ret < 0) - pr_info("%s: i2c err reg=0x%x, val=0x%x ret=%d\n", __func__, reg, *val, ret); - - return ret; + return rk628_media_i2c_read(rk628, reg, val); } static inline int rk628_i2c_update_bits(struct rk628 *rk628, u32 reg, u32 mask, u32 val) { - int region = (reg >> 16) & 0xff; - - return regmap_update_bits(rk628->regmap[region], reg, mask, val); + return rk628_media_i2c_update_bits(rk628, reg, mask, val); } struct rk628 *rk628_i2c_register(struct i2c_client *client);