Commit 735a3d9e authored by MyungJoo Ham's avatar MyungJoo Ham Committed by Samuel Ortiz

regulator: Support MAX8998/LP3974 DVS-GPIO

The previous driver did not support BUCK1-DVS3, BUCK1-DVS4, and
BUCK2-DVS2 modes. This patch adds such modes and an option to block
setting buck1/2 voltages out of the preset values.
Signed-off-by: default avatarMyungJoo Ham <myungjoo.ham@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Acked-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 337ce5d1
...@@ -424,6 +424,9 @@ static int max8998_set_voltage_buck(struct regulator_dev *rdev, ...@@ -424,6 +424,9 @@ static int max8998_set_voltage_buck(struct regulator_dev *rdev,
} }
} }
if (pdata->buck_voltage_lock)
return -EINVAL;
/* no predefine regulator found */ /* no predefine regulator found */
max8998->buck1_idx = (buck1_last_val % 2) + 2; max8998->buck1_idx = (buck1_last_val % 2) + 2;
dev_dbg(max8998->dev, "max8998->buck1_idx:%d\n", dev_dbg(max8998->dev, "max8998->buck1_idx:%d\n",
...@@ -451,18 +454,26 @@ static int max8998_set_voltage_buck(struct regulator_dev *rdev, ...@@ -451,18 +454,26 @@ static int max8998_set_voltage_buck(struct regulator_dev *rdev,
"BUCK2, i:%d buck2_vol1:%d, buck2_vol2:%d\n" "BUCK2, i:%d buck2_vol1:%d, buck2_vol2:%d\n"
, i, max8998->buck2_vol[0], max8998->buck2_vol[1]); , i, max8998->buck2_vol[0], max8998->buck2_vol[1]);
if (gpio_is_valid(pdata->buck2_set3)) { if (gpio_is_valid(pdata->buck2_set3)) {
if (max8998->buck2_vol[0] == i) {
max8998->buck1_idx = 0; /* check if requested voltage */
buck2_gpio_set(pdata->buck2_set3, 0); /* value is already defined */
} else { for (j = 0; j < ARRAY_SIZE(max8998->buck2_vol); j++) {
max8998->buck1_idx = 1; if (max8998->buck2_vol[j] == i) {
ret = max8998_get_voltage_register(rdev, &reg, max8998->buck2_idx = j;
&shift, buck2_gpio_set(pdata->buck2_set3, j);
&mask); goto buck2_exit;
ret = max8998_write_reg(i2c, reg, i); }
max8998->buck2_vol[1] = i;
buck2_gpio_set(pdata->buck2_set3, 1);
} }
if (pdata->buck_voltage_lock)
return -EINVAL;
max8998_get_voltage_register(rdev,
&reg, &shift, &mask);
ret = max8998_write_reg(i2c, reg, i);
max8998->buck2_vol[max8998->buck2_idx] = i;
buck2_gpio_set(pdata->buck2_set3, max8998->buck2_idx);
buck2_exit:
dev_dbg(max8998->dev, "%s: SET3:%d\n", i2c->name, dev_dbg(max8998->dev, "%s: SET3:%d\n", i2c->name,
gpio_get_value(pdata->buck2_set3)); gpio_get_value(pdata->buck2_set3));
} else { } else {
...@@ -707,6 +718,9 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev) ...@@ -707,6 +718,9 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, max8998); platform_set_drvdata(pdev, max8998);
i2c = max8998->iodev->i2c; i2c = max8998->iodev->i2c;
max8998->buck1_idx = pdata->buck1_default_idx;
max8998->buck2_idx = pdata->buck2_default_idx;
/* NOTE: */ /* NOTE: */
/* For unused GPIO NOT marked as -1 (thereof equal to 0) WARN_ON */ /* For unused GPIO NOT marked as -1 (thereof equal to 0) WARN_ON */
/* will be displayed */ /* will be displayed */
...@@ -739,23 +753,46 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev) ...@@ -739,23 +753,46 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)
i = 0; i = 0;
while (buck12_voltage_map_desc.min + while (buck12_voltage_map_desc.min +
buck12_voltage_map_desc.step*i buck12_voltage_map_desc.step*i
!= (pdata->buck1_max_voltage1 / 1000)) < (pdata->buck1_voltage1 / 1000))
i++; i++;
printk(KERN_ERR "i:%d, buck1_idx:%d\n", i, max8998->buck1_idx);
max8998->buck1_vol[0] = i; max8998->buck1_vol[0] = i;
ret = max8998_write_reg(i2c, MAX8998_REG_BUCK1_VOLTAGE1, i); ret = max8998_write_reg(i2c, MAX8998_REG_BUCK1_VOLTAGE1, i);
if (ret)
return ret;
/* Set predefined value for BUCK1 register 2 */ /* Set predefined value for BUCK1 register 2 */
i = 0; i = 0;
while (buck12_voltage_map_desc.min + while (buck12_voltage_map_desc.min +
buck12_voltage_map_desc.step*i buck12_voltage_map_desc.step*i
!= (pdata->buck1_max_voltage2 / 1000)) < (pdata->buck1_voltage2 / 1000))
i++; i++;
max8998->buck1_vol[1] = i; max8998->buck1_vol[1] = i;
printk(KERN_ERR "i:%d, buck1_idx:%d\n", i, max8998->buck1_idx); ret = max8998_write_reg(i2c, MAX8998_REG_BUCK1_VOLTAGE2, i);
ret = max8998_write_reg(i2c, MAX8998_REG_BUCK1_VOLTAGE2, i) if (ret)
+ ret; return ret;
/* Set predefined value for BUCK1 register 3 */
i = 0;
while (buck12_voltage_map_desc.min +
buck12_voltage_map_desc.step*i
< (pdata->buck1_voltage3 / 1000))
i++;
max8998->buck1_vol[2] = i;
ret = max8998_write_reg(i2c, MAX8998_REG_BUCK1_VOLTAGE3, i);
if (ret)
return ret;
/* Set predefined value for BUCK1 register 4 */
i = 0;
while (buck12_voltage_map_desc.min +
buck12_voltage_map_desc.step*i
< (pdata->buck1_voltage4 / 1000))
i++;
max8998->buck1_vol[3] = i;
ret = max8998_write_reg(i2c, MAX8998_REG_BUCK1_VOLTAGE4, i);
if (ret) if (ret)
return ret; return ret;
...@@ -772,18 +809,28 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev) ...@@ -772,18 +809,28 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)
gpio_direction_output(pdata->buck2_set3, gpio_direction_output(pdata->buck2_set3,
max8998->buck2_idx & 0x1); max8998->buck2_idx & 0x1);
/* BUCK2 - set preset default voltage value to buck2_vol[0] */ /* BUCK2 register 1 */
i = 0; i = 0;
while (buck12_voltage_map_desc.min + while (buck12_voltage_map_desc.min +
buck12_voltage_map_desc.step*i buck12_voltage_map_desc.step*i
!= (pdata->buck2_max_voltage / 1000)) < (pdata->buck2_voltage1 / 1000))
i++; i++;
printk(KERN_ERR "i:%d, buck2_idx:%d\n", i, max8998->buck2_idx);
max8998->buck2_vol[0] = i; max8998->buck2_vol[0] = i;
ret = max8998_write_reg(i2c, MAX8998_REG_BUCK2_VOLTAGE1, i); ret = max8998_write_reg(i2c, MAX8998_REG_BUCK2_VOLTAGE1, i);
if (ret) if (ret)
return ret; return ret;
/* BUCK2 register 2 */
i = 0;
while (buck12_voltage_map_desc.min +
buck12_voltage_map_desc.step*i
< (pdata->buck2_voltage2 / 1000))
i++;
printk(KERN_ERR "i2:%d, buck2_idx:%d\n", i, max8998->buck2_idx);
max8998->buck2_vol[1] = i;
ret = max8998_write_reg(i2c, MAX8998_REG_BUCK2_VOLTAGE2, i);
if (ret)
return ret;
} }
for (i = 0; i < pdata->num_regulators; i++) { for (i = 0; i < pdata->num_regulators; i++) {
......
...@@ -70,12 +70,20 @@ struct max8998_regulator_data { ...@@ -70,12 +70,20 @@ struct max8998_regulator_data {
* @num_regulators: number of regultors used * @num_regulators: number of regultors used
* @irq_base: base IRQ number for max8998, required for IRQs * @irq_base: base IRQ number for max8998, required for IRQs
* @ono: power onoff IRQ number for max8998 * @ono: power onoff IRQ number for max8998
* @buck1_max_voltage1: BUCK1 maximum alowed voltage register 1 * @buck_voltage_lock: Do NOT change the values of the following six
* @buck1_max_voltage2: BUCK1 maximum alowed voltage register 2 * registers set by buck?_voltage?. The voltage of BUCK1/2 cannot
* @buck2_max_voltage: BUCK2 maximum alowed voltage * be other than the preset values.
* @buck1_voltage1: BUCK1 DVS mode 1 voltage register
* @buck1_voltage2: BUCK1 DVS mode 2 voltage register
* @buck1_voltage3: BUCK1 DVS mode 3 voltage register
* @buck1_voltage4: BUCK1 DVS mode 4 voltage register
* @buck2_voltage1: BUCK2 DVS mode 1 voltage register
* @buck2_voltage2: BUCK2 DVS mode 2 voltage register
* @buck1_set1: BUCK1 gpio pin 1 to set output voltage * @buck1_set1: BUCK1 gpio pin 1 to set output voltage
* @buck1_set2: BUCK1 gpio pin 2 to set output voltage * @buck1_set2: BUCK1 gpio pin 2 to set output voltage
* @buck1_default_idx: Default for BUCK1 gpio pin 1, 2
* @buck2_set3: BUCK2 gpio pin to set output voltage * @buck2_set3: BUCK2 gpio pin to set output voltage
* @buck2_default_idx: Default for BUCK2 gpio pin.
* @wakeup: Allow to wake up from suspend * @wakeup: Allow to wake up from suspend
* @rtc_delay: LP3974 RTC chip bug that requires delay after a register * @rtc_delay: LP3974 RTC chip bug that requires delay after a register
* write before reading it. * write before reading it.
...@@ -85,12 +93,18 @@ struct max8998_platform_data { ...@@ -85,12 +93,18 @@ struct max8998_platform_data {
int num_regulators; int num_regulators;
int irq_base; int irq_base;
int ono; int ono;
int buck1_max_voltage1; bool buck_voltage_lock;
int buck1_max_voltage2; int buck1_voltage1;
int buck2_max_voltage; int buck1_voltage2;
int buck1_voltage3;
int buck1_voltage4;
int buck2_voltage1;
int buck2_voltage2;
int buck1_set1; int buck1_set1;
int buck1_set2; int buck1_set2;
int buck1_default_idx;
int buck2_set3; int buck2_set3;
int buck2_default_idx;
bool wakeup; bool wakeup;
bool rtc_delay; bool rtc_delay;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment