提交 676e02d7 编写于 作者: J Joonyoung Shim 提交者: Samuel Ortiz

mfd: Use i2c_client as an argument on MAX8998 i2c routines

The MAX8998 chip have regulator and rtc features. The i2c slave address
of regulator and rtc is different, so needs each i2c client on i2c
operation functions.

Also, this patch exports i2c operation functions instead of callback to
make easy to read.
Signed-off-by: NJoonyoung Shim <jy0922.shim@samsung.com>
Signed-off-by: NKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: NSamuel Ortiz <sameo@linux.intel.com>
上级 1203a1e6
...@@ -36,13 +36,13 @@ static struct mfd_cell max8998_devs[] = { ...@@ -36,13 +36,13 @@ static struct mfd_cell max8998_devs[] = {
} }
}; };
static int max8998_i2c_device_read(struct max8998_dev *max8998, u8 reg, u8 *dest) int max8998_read_reg(struct i2c_client *i2c, u8 reg, u8 *dest)
{ {
struct i2c_client *client = max8998->i2c_client; struct max8998_dev *max8998 = i2c_get_clientdata(i2c);
int ret; int ret;
mutex_lock(&max8998->iolock); mutex_lock(&max8998->iolock);
ret = i2c_smbus_read_byte_data(client, reg); ret = i2c_smbus_read_byte_data(i2c, reg);
mutex_unlock(&max8998->iolock); mutex_unlock(&max8998->iolock);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -51,36 +51,38 @@ static int max8998_i2c_device_read(struct max8998_dev *max8998, u8 reg, u8 *dest ...@@ -51,36 +51,38 @@ static int max8998_i2c_device_read(struct max8998_dev *max8998, u8 reg, u8 *dest
*dest = ret; *dest = ret;
return 0; return 0;
} }
EXPORT_SYMBOL(max8998_read_reg);
static int max8998_i2c_device_write(struct max8998_dev *max8998, u8 reg, u8 value) int max8998_write_reg(struct i2c_client *i2c, u8 reg, u8 value)
{ {
struct i2c_client *client = max8998->i2c_client; struct max8998_dev *max8998 = i2c_get_clientdata(i2c);
int ret; int ret;
mutex_lock(&max8998->iolock); mutex_lock(&max8998->iolock);
ret = i2c_smbus_write_byte_data(client, reg, value); ret = i2c_smbus_write_byte_data(i2c, reg, value);
mutex_unlock(&max8998->iolock); mutex_unlock(&max8998->iolock);
return ret; return ret;
} }
EXPORT_SYMBOL(max8998_write_reg);
static int max8998_i2c_device_update(struct max8998_dev *max8998, u8 reg, int max8998_update_reg(struct i2c_client *i2c, u8 reg, u8 val, u8 mask)
u8 val, u8 mask)
{ {
struct i2c_client *client = max8998->i2c_client; struct max8998_dev *max8998 = i2c_get_clientdata(i2c);
int ret; int ret;
mutex_lock(&max8998->iolock); mutex_lock(&max8998->iolock);
ret = i2c_smbus_read_byte_data(client, reg); ret = i2c_smbus_read_byte_data(i2c, reg);
if (ret >= 0) { if (ret >= 0) {
u8 old_val = ret & 0xff; u8 old_val = ret & 0xff;
u8 new_val = (val & mask) | (old_val & (~mask)); u8 new_val = (val & mask) | (old_val & (~mask));
ret = i2c_smbus_write_byte_data(client, reg, new_val); ret = i2c_smbus_write_byte_data(i2c, reg, new_val);
if (ret >= 0) if (ret >= 0)
ret = 0; ret = 0;
} }
mutex_unlock(&max8998->iolock); mutex_unlock(&max8998->iolock);
return ret; return ret;
} }
EXPORT_SYMBOL(max8998_update_reg);
static int max8998_i2c_probe(struct i2c_client *i2c, static int max8998_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id) const struct i2c_device_id *id)
...@@ -94,10 +96,7 @@ static int max8998_i2c_probe(struct i2c_client *i2c, ...@@ -94,10 +96,7 @@ static int max8998_i2c_probe(struct i2c_client *i2c,
i2c_set_clientdata(i2c, max8998); i2c_set_clientdata(i2c, max8998);
max8998->dev = &i2c->dev; max8998->dev = &i2c->dev;
max8998->i2c_client = i2c; max8998->i2c = i2c;
max8998->dev_read = max8998_i2c_device_read;
max8998->dev_write = max8998_i2c_device_write;
max8998->dev_update = max8998_i2c_device_update;
mutex_init(&max8998->iolock); mutex_init(&max8998->iolock);
ret = mfd_add_devices(max8998->dev, -1, ret = mfd_add_devices(max8998->dev, -1,
......
...@@ -173,6 +173,7 @@ static int max8998_get_enable_register(struct regulator_dev *rdev, ...@@ -173,6 +173,7 @@ static int max8998_get_enable_register(struct regulator_dev *rdev,
static int max8998_ldo_is_enabled(struct regulator_dev *rdev) static int max8998_ldo_is_enabled(struct regulator_dev *rdev)
{ {
struct max8998_data *max8998 = rdev_get_drvdata(rdev); struct max8998_data *max8998 = rdev_get_drvdata(rdev);
struct i2c_client *i2c = max8998->iodev->i2c;
int ret, reg, shift = 8; int ret, reg, shift = 8;
u8 val; u8 val;
...@@ -180,7 +181,7 @@ static int max8998_ldo_is_enabled(struct regulator_dev *rdev) ...@@ -180,7 +181,7 @@ static int max8998_ldo_is_enabled(struct regulator_dev *rdev)
if (ret) if (ret)
return ret; return ret;
ret = max8998_read_reg(max8998->iodev, reg, &val); ret = max8998_read_reg(i2c, reg, &val);
if (ret) if (ret)
return ret; return ret;
...@@ -190,25 +191,27 @@ static int max8998_ldo_is_enabled(struct regulator_dev *rdev) ...@@ -190,25 +191,27 @@ static int max8998_ldo_is_enabled(struct regulator_dev *rdev)
static int max8998_ldo_enable(struct regulator_dev *rdev) static int max8998_ldo_enable(struct regulator_dev *rdev)
{ {
struct max8998_data *max8998 = rdev_get_drvdata(rdev); struct max8998_data *max8998 = rdev_get_drvdata(rdev);
struct i2c_client *i2c = max8998->iodev->i2c;
int reg, shift = 8, ret; int reg, shift = 8, ret;
ret = max8998_get_enable_register(rdev, &reg, &shift); ret = max8998_get_enable_register(rdev, &reg, &shift);
if (ret) if (ret)
return ret; return ret;
return max8998_update_reg(max8998->iodev, reg, 1<<shift, 1<<shift); return max8998_update_reg(i2c, reg, 1<<shift, 1<<shift);
} }
static int max8998_ldo_disable(struct regulator_dev *rdev) static int max8998_ldo_disable(struct regulator_dev *rdev)
{ {
struct max8998_data *max8998 = rdev_get_drvdata(rdev); struct max8998_data *max8998 = rdev_get_drvdata(rdev);
struct i2c_client *i2c = max8998->iodev->i2c;
int reg, shift = 8, ret; int reg, shift = 8, ret;
ret = max8998_get_enable_register(rdev, &reg, &shift); ret = max8998_get_enable_register(rdev, &reg, &shift);
if (ret) if (ret)
return ret; return ret;
return max8998_update_reg(max8998->iodev, reg, 0, 1<<shift); return max8998_update_reg(i2c, reg, 0, 1<<shift);
} }
static int max8998_get_voltage_register(struct regulator_dev *rdev, static int max8998_get_voltage_register(struct regulator_dev *rdev,
...@@ -276,6 +279,7 @@ static int max8998_get_voltage_register(struct regulator_dev *rdev, ...@@ -276,6 +279,7 @@ static int max8998_get_voltage_register(struct regulator_dev *rdev,
static int max8998_get_voltage(struct regulator_dev *rdev) static int max8998_get_voltage(struct regulator_dev *rdev)
{ {
struct max8998_data *max8998 = rdev_get_drvdata(rdev); struct max8998_data *max8998 = rdev_get_drvdata(rdev);
struct i2c_client *i2c = max8998->iodev->i2c;
int reg, shift = 0, mask, ret; int reg, shift = 0, mask, ret;
u8 val; u8 val;
...@@ -283,7 +287,7 @@ static int max8998_get_voltage(struct regulator_dev *rdev) ...@@ -283,7 +287,7 @@ static int max8998_get_voltage(struct regulator_dev *rdev)
if (ret) if (ret)
return ret; return ret;
ret = max8998_read_reg(max8998->iodev, reg, &val); ret = max8998_read_reg(i2c, reg, &val);
if (ret) if (ret)
return ret; return ret;
...@@ -297,6 +301,7 @@ static int max8998_set_voltage(struct regulator_dev *rdev, ...@@ -297,6 +301,7 @@ static int max8998_set_voltage(struct regulator_dev *rdev,
int min_uV, int max_uV) int min_uV, int max_uV)
{ {
struct max8998_data *max8998 = rdev_get_drvdata(rdev); struct max8998_data *max8998 = rdev_get_drvdata(rdev);
struct i2c_client *i2c = max8998->iodev->i2c;
int min_vol = min_uV / 1000, max_vol = max_uV / 1000; int min_vol = min_uV / 1000, max_vol = max_uV / 1000;
int previous_vol = 0; int previous_vol = 0;
const struct voltage_map_desc *desc; const struct voltage_map_desc *desc;
...@@ -330,14 +335,14 @@ static int max8998_set_voltage(struct regulator_dev *rdev, ...@@ -330,14 +335,14 @@ static int max8998_set_voltage(struct regulator_dev *rdev,
/* wait for RAMP_UP_DELAY if rdev is BUCK1/2 and /* wait for RAMP_UP_DELAY if rdev is BUCK1/2 and
* ENRAMP is ON */ * ENRAMP is ON */
if (ldo == MAX8998_BUCK1 || ldo == MAX8998_BUCK2) { if (ldo == MAX8998_BUCK1 || ldo == MAX8998_BUCK2) {
max8998_read_reg(max8998->iodev, MAX8998_REG_ONOFF4, &val); max8998_read_reg(i2c, MAX8998_REG_ONOFF4, &val);
if (val & (1 << 4)) { if (val & (1 << 4)) {
en_ramp = true; en_ramp = true;
previous_vol = max8998_get_voltage(rdev); previous_vol = max8998_get_voltage(rdev);
} }
} }
ret = max8998_update_reg(max8998->iodev, reg, i<<shift, mask<<shift); ret = max8998_update_reg(i2c, reg, i<<shift, mask<<shift);
if (en_ramp == true) { if (en_ramp == true) {
int difference = desc->min + desc->step*i - previous_vol/1000; int difference = desc->min + desc->step*i - previous_vol/1000;
......
...@@ -75,38 +75,18 @@ enum { ...@@ -75,38 +75,18 @@ enum {
/** /**
* struct max8998_dev - max8998 master device for sub-drivers * struct max8998_dev - max8998 master device for sub-drivers
* @dev: master device of the chip (can be used to access platform data) * @dev: master device of the chip (can be used to access platform data)
* @i2c_client: i2c client private data * @i2c: i2c client private data
* @dev_read(): chip register read function
* @dev_write(): chip register write function
* @dev_update(): chip register update function
* @iolock: mutex for serializing io access * @iolock: mutex for serializing io access
*/ */
struct max8998_dev { struct max8998_dev {
struct device *dev; struct device *dev;
struct i2c_client *i2c_client; struct i2c_client *i2c;
int (*dev_read)(struct max8998_dev *max8998, u8 reg, u8 *dest);
int (*dev_write)(struct max8998_dev *max8998, u8 reg, u8 val);
int (*dev_update)(struct max8998_dev *max8998, u8 reg, u8 val, u8 mask);
struct mutex iolock; struct mutex iolock;
}; };
static inline int max8998_read_reg(struct max8998_dev *max8998, u8 reg, extern int max8998_read_reg(struct i2c_client *i2c, u8 reg, u8 *dest);
u8 *value) extern int max8998_write_reg(struct i2c_client *i2c, u8 reg, u8 value);
{ extern int max8998_update_reg(struct i2c_client *i2c, u8 reg, u8 val, u8 mask);
return max8998->dev_read(max8998, reg, value);
}
static inline int max8998_write_reg(struct max8998_dev *max8998, u8 reg,
u8 value)
{
return max8998->dev_write(max8998, reg, value);
}
static inline int max8998_update_reg(struct max8998_dev *max8998, u8 reg,
u8 value, u8 mask)
{
return max8998->dev_update(max8998, reg, value, mask);
}
#endif /* __LINUX_MFD_MAX8998_PRIV_H */ #endif /* __LINUX_MFD_MAX8998_PRIV_H */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册