Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+67 −20
Original line number Original line Diff line number Diff line
@@ -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,
			"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)
	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)
		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)
		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++) {
+20 −6
Original line number Original line Diff line number Diff line
@@ -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 {
	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;
};
};