|
@@ -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 @@ buck1_exit:
|
|
|
"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++) {
|