mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
media: i2c: rk628: check for overflow when i2c operation
Change-Id: Ia99a7149be4e79589b89345d3f538c64cea5550b Signed-off-by: Jianwei Fan <jianwei.fan@rock-chips.com>
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user