mirror of https://gitee.com/openkylin/linux.git
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: MyungJoo Ham <myungjoo.ham@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
parent
337ce5d1c5
commit
735a3d9efd
|
@ -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 */
|
||||
max8998->buck1_idx = (buck1_last_val % 2) + 2;
|
||||
dev_dbg(max8998->dev, "max8998->buck1_idx:%d\n",
|
||||
|
@ -451,18 +454,26 @@ static int max8998_set_voltage_buck(struct regulator_dev *rdev,
|
|||
"BUCK2, i:%d buck2_vol1:%d, buck2_vol2:%d\n"
|
||||
, i, max8998->buck2_vol[0], max8998->buck2_vol[1]);
|
||||
if (gpio_is_valid(pdata->buck2_set3)) {
|
||||
if (max8998->buck2_vol[0] == i) {
|
||||
max8998->buck1_idx = 0;
|
||||
buck2_gpio_set(pdata->buck2_set3, 0);
|
||||
} else {
|
||||
max8998->buck1_idx = 1;
|
||||
ret = max8998_get_voltage_register(rdev, ®,
|
||||
&shift,
|
||||
&mask);
|
||||
ret = max8998_write_reg(i2c, reg, i);
|
||||
max8998->buck2_vol[1] = i;
|
||||
buck2_gpio_set(pdata->buck2_set3, 1);
|
||||
|
||||
/* check if requested voltage */
|
||||
/* value is already defined */
|
||||
for (j = 0; j < ARRAY_SIZE(max8998->buck2_vol); j++) {
|
||||
if (max8998->buck2_vol[j] == i) {
|
||||
max8998->buck2_idx = j;
|
||||
buck2_gpio_set(pdata->buck2_set3, j);
|
||||
goto buck2_exit;
|
||||
}
|
||||
}
|
||||
|
||||
if (pdata->buck_voltage_lock)
|
||||
return -EINVAL;
|
||||
|
||||
max8998_get_voltage_register(rdev,
|
||||
®, &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,
|
||||
gpio_get_value(pdata->buck2_set3));
|
||||
} else {
|
||||
|
@ -707,6 +718,9 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)
|
|||
platform_set_drvdata(pdev, max8998);
|
||||
i2c = max8998->iodev->i2c;
|
||||
|
||||
max8998->buck1_idx = pdata->buck1_default_idx;
|
||||
max8998->buck2_idx = pdata->buck2_default_idx;
|
||||
|
||||
/* NOTE: */
|
||||
/* For unused GPIO NOT marked as -1 (thereof equal to 0) WARN_ON */
|
||||
/* will be displayed */
|
||||
|
@ -739,23 +753,46 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)
|
|||
i = 0;
|
||||
while (buck12_voltage_map_desc.min +
|
||||
buck12_voltage_map_desc.step*i
|
||||
!= (pdata->buck1_max_voltage1 / 1000))
|
||||
< (pdata->buck1_voltage1 / 1000))
|
||||
i++;
|
||||
printk(KERN_ERR "i:%d, buck1_idx:%d\n", i, max8998->buck1_idx);
|
||||
max8998->buck1_vol[0] = i;
|
||||
ret = max8998_write_reg(i2c, MAX8998_REG_BUCK1_VOLTAGE1, i);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Set predefined value for BUCK1 register 2 */
|
||||
i = 0;
|
||||
while (buck12_voltage_map_desc.min +
|
||||
buck12_voltage_map_desc.step*i
|
||||
!= (pdata->buck1_max_voltage2 / 1000))
|
||||
< (pdata->buck1_voltage2 / 1000))
|
||||
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;
|
||||
ret = max8998_write_reg(i2c, MAX8998_REG_BUCK1_VOLTAGE2, i);
|
||||
if (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)
|
||||
return ret;
|
||||
|
||||
|
@ -772,18 +809,28 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)
|
|||
gpio_direction_output(pdata->buck2_set3,
|
||||
max8998->buck2_idx & 0x1);
|
||||
|
||||
/* BUCK2 - set preset default voltage value to buck2_vol[0] */
|
||||
/* BUCK2 register 1 */
|
||||
i = 0;
|
||||
while (buck12_voltage_map_desc.min +
|
||||
buck12_voltage_map_desc.step*i
|
||||
!= (pdata->buck2_max_voltage / 1000))
|
||||
< (pdata->buck2_voltage1 / 1000))
|
||||
i++;
|
||||
printk(KERN_ERR "i:%d, buck2_idx:%d\n", i, max8998->buck2_idx);
|
||||
max8998->buck2_vol[0] = i;
|
||||
ret = max8998_write_reg(i2c, MAX8998_REG_BUCK2_VOLTAGE1, i);
|
||||
if (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++) {
|
||||
|
|
|
@ -70,12 +70,20 @@ struct max8998_regulator_data {
|
|||
* @num_regulators: number of regultors used
|
||||
* @irq_base: base IRQ number for max8998, required for IRQs
|
||||
* @ono: power onoff IRQ number for max8998
|
||||
* @buck1_max_voltage1: BUCK1 maximum alowed voltage register 1
|
||||
* @buck1_max_voltage2: BUCK1 maximum alowed voltage register 2
|
||||
* @buck2_max_voltage: BUCK2 maximum alowed voltage
|
||||
* @buck_voltage_lock: Do NOT change the values of the following six
|
||||
* registers set by buck?_voltage?. The voltage of BUCK1/2 cannot
|
||||
* 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_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_default_idx: Default for BUCK2 gpio pin.
|
||||
* @wakeup: Allow to wake up from suspend
|
||||
* @rtc_delay: LP3974 RTC chip bug that requires delay after a register
|
||||
* write before reading it.
|
||||
|
@ -85,12 +93,18 @@ struct max8998_platform_data {
|
|||
int num_regulators;
|
||||
int irq_base;
|
||||
int ono;
|
||||
int buck1_max_voltage1;
|
||||
int buck1_max_voltage2;
|
||||
int buck2_max_voltage;
|
||||
bool buck_voltage_lock;
|
||||
int buck1_voltage1;
|
||||
int buck1_voltage2;
|
||||
int buck1_voltage3;
|
||||
int buck1_voltage4;
|
||||
int buck2_voltage1;
|
||||
int buck2_voltage2;
|
||||
int buck1_set1;
|
||||
int buck1_set2;
|
||||
int buck1_default_idx;
|
||||
int buck2_set3;
|
||||
int buck2_default_idx;
|
||||
bool wakeup;
|
||||
bool rtc_delay;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue