Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 220586
b: refs/heads/master
c: 676e02d
h: refs/heads/master
v: v3
  • Loading branch information
Joonyoung Shim authored and Samuel Ortiz committed Oct 28, 2010
1 parent 2d620a2 commit 8c50813
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 47 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 1203a1e6424d502e9c12d29512218487af5fdd1c
refs/heads/master: 676e02d7a2ed9bb02994670a07df533a29a99de6
29 changes: 14 additions & 15 deletions trunk/drivers/mfd/max8998.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

mutex_lock(&max8998->iolock);
ret = i2c_smbus_read_byte_data(client, reg);
ret = i2c_smbus_read_byte_data(i2c, reg);
mutex_unlock(&max8998->iolock);
if (ret < 0)
return ret;
Expand All @@ -51,36 +51,38 @@ static int max8998_i2c_device_read(struct max8998_dev *max8998, u8 reg, u8 *dest
*dest = ret;
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;

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);
return ret;
}
EXPORT_SYMBOL(max8998_write_reg);

static int max8998_i2c_device_update(struct max8998_dev *max8998, u8 reg,
u8 val, u8 mask)
int max8998_update_reg(struct i2c_client *i2c, u8 reg, u8 val, u8 mask)
{
struct i2c_client *client = max8998->i2c_client;
struct max8998_dev *max8998 = i2c_get_clientdata(i2c);
int ret;

mutex_lock(&max8998->iolock);
ret = i2c_smbus_read_byte_data(client, reg);
ret = i2c_smbus_read_byte_data(i2c, reg);
if (ret >= 0) {
u8 old_val = ret & 0xff;
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)
ret = 0;
}
mutex_unlock(&max8998->iolock);
return ret;
}
EXPORT_SYMBOL(max8998_update_reg);

static int max8998_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
Expand All @@ -94,10 +96,7 @@ static int max8998_i2c_probe(struct i2c_client *i2c,

i2c_set_clientdata(i2c, max8998);
max8998->dev = &i2c->dev;
max8998->i2c_client = i2c;
max8998->dev_read = max8998_i2c_device_read;
max8998->dev_write = max8998_i2c_device_write;
max8998->dev_update = max8998_i2c_device_update;
max8998->i2c = i2c;
mutex_init(&max8998->iolock);

ret = mfd_add_devices(max8998->dev, -1,
Expand Down
17 changes: 11 additions & 6 deletions trunk/drivers/regulator/max8998.c
Original file line number Diff line number Diff line change
Expand Up @@ -173,14 +173,15 @@ static int max8998_get_enable_register(struct regulator_dev *rdev,
static int max8998_ldo_is_enabled(struct regulator_dev *rdev)
{
struct max8998_data *max8998 = rdev_get_drvdata(rdev);
struct i2c_client *i2c = max8998->iodev->i2c;
int ret, reg, shift = 8;
u8 val;

ret = max8998_get_enable_register(rdev, &reg, &shift);
if (ret)
return ret;

ret = max8998_read_reg(max8998->iodev, reg, &val);
ret = max8998_read_reg(i2c, reg, &val);
if (ret)
return ret;

Expand All @@ -190,25 +191,27 @@ static int max8998_ldo_is_enabled(struct regulator_dev *rdev)
static int max8998_ldo_enable(struct regulator_dev *rdev)
{
struct max8998_data *max8998 = rdev_get_drvdata(rdev);
struct i2c_client *i2c = max8998->iodev->i2c;
int reg, shift = 8, ret;

ret = max8998_get_enable_register(rdev, &reg, &shift);
if (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)
{
struct max8998_data *max8998 = rdev_get_drvdata(rdev);
struct i2c_client *i2c = max8998->iodev->i2c;
int reg, shift = 8, ret;

ret = max8998_get_enable_register(rdev, &reg, &shift);
if (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,
Expand Down Expand Up @@ -276,14 +279,15 @@ static int max8998_get_voltage_register(struct regulator_dev *rdev,
static int max8998_get_voltage(struct regulator_dev *rdev)
{
struct max8998_data *max8998 = rdev_get_drvdata(rdev);
struct i2c_client *i2c = max8998->iodev->i2c;
int reg, shift = 0, mask, ret;
u8 val;

ret = max8998_get_voltage_register(rdev, &reg, &shift, &mask);
if (ret)
return ret;

ret = max8998_read_reg(max8998->iodev, reg, &val);
ret = max8998_read_reg(i2c, reg, &val);
if (ret)
return ret;

Expand All @@ -297,6 +301,7 @@ static int max8998_set_voltage(struct regulator_dev *rdev,
int min_uV, int max_uV)
{
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 previous_vol = 0;
const struct voltage_map_desc *desc;
Expand Down Expand Up @@ -330,14 +335,14 @@ static int max8998_set_voltage(struct regulator_dev *rdev,
/* wait for RAMP_UP_DELAY if rdev is BUCK1/2 and
* ENRAMP is ON */
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)) {
en_ramp = true;
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) {
int difference = desc->min + desc->step*i - previous_vol/1000;
Expand Down
30 changes: 5 additions & 25 deletions trunk/include/linux/mfd/max8998-private.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,38 +75,18 @@ enum {
/**
* struct max8998_dev - max8998 master device for sub-drivers
* @dev: master device of the chip (can be used to access platform data)
* @i2c_client: i2c client private data
* @dev_read(): chip register read function
* @dev_write(): chip register write function
* @dev_update(): chip register update function
* @i2c: i2c client private data
* @iolock: mutex for serializing io access
*/

struct max8998_dev {
struct device *dev;
struct i2c_client *i2c_client;
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 i2c_client *i2c;
struct mutex iolock;
};

static inline int max8998_read_reg(struct max8998_dev *max8998, u8 reg,
u8 *value)
{
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);
}
extern int max8998_read_reg(struct i2c_client *i2c, u8 reg, u8 *dest);
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);

#endif /* __LINUX_MFD_MAX8998_PRIV_H */

0 comments on commit 8c50813

Please sign in to comment.