[PATCH V2] ENGR00242223-2 Need to add delay to regulator based on register setting

Huang Yongcai-B20788 B20788 at freescale.com
Thu Jan 31 14:36:07 EST 2013


Sorry, sent to the devicetree-discuss list by mistake, anyone who is in devicetree-discuss list please ignore it.

Best Regards.
Anson huang 黄勇才
 
Freescale Semiconductor Shanghai
上海浦东新区亮景路192号A座2楼
201203
Tel:021-28937058


$-----Original Message-----
$From: Huang Yongcai-B20788
$Sent: Friday, February 01, 2013 12:32 AM
$To: devicetree-discuss at lists.ozlabs.org; Gong Yibin-B38343
$Cc: LNXREVLI at internal.freescale.com; Huang Yongcai-B20788
$Subject: [PATCH V2] ENGR00242223-2 Need to add delay to regulator based on
$register setting
$
$When LDO is set to voltage up, need to do enough waiting before it ramps up to
$the new voltage, and this ramp up time should be based on the register setting.
$
$Signed-off-by: Anson Huang <b20788 at freescale.com>
$---
$ .../bindings/regulator/anatop-regulator.txt        |    8 ++++
$ drivers/regulator/anatop-regulator.c               |   41
$+++++++++++++++++++-
$ 2 files changed, 48 insertions(+), 1 deletion(-)
$
$diff --git a/Documentation/devicetree/bindings/regulator/anatop-regulator.txt
$b/Documentation/devicetree/bindings/regulator/anatop-regulator.txt
$index 357758c..758eae2 100644
$--- a/Documentation/devicetree/bindings/regulator/anatop-regulator.txt
$+++ b/Documentation/devicetree/bindings/regulator/anatop-regulator.txt
$@@ -9,6 +9,11 @@ Required properties:
$ - anatop-min-voltage: Minimum voltage of this regulator
$ - anatop-max-voltage: Maximum voltage of this regulator
$
$+Optional properties:
$+- anatop-delay-reg-offset: Anatop MFD step time register offset
$+- anatop-delay-bit-shift: Bit shift for the step time register
$+- anatop-delay-bit-width: Number of bits used in the step time register
$+
$ Any property defined as part of the core regulator  binding, defined in
$regulator.txt, can also be used.
$
$@@ -23,6 +28,9 @@ Example:
$ 		anatop-reg-offset = <0x140>;
$ 		anatop-vol-bit-shift = <9>;
$ 		anatop-vol-bit-width = <5>;
$+		anatop-delay-reg-offset = <0x170>;
$+		anatop-delay-bit-shift = <24>;
$+		anatop-delay-bit-width = <2>;
$ 		anatop-min-bit-val = <1>;
$ 		anatop-min-voltage = <725000>;
$ 		anatop-max-voltage = <1300000>;
$diff --git a/drivers/regulator/anatop-regulator.c b/drivers/regulator/anatop-
$regulator.c
$index 1af9768..f4ed04f 100644
$--- a/drivers/regulator/anatop-regulator.c
$+++ b/drivers/regulator/anatop-regulator.c
$@@ -1,5 +1,5 @@
$ /*
$- * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved.
$+ * Copyright (C) 2011-2013 Freescale Semiconductor, Inc. All Rights Reserved.
$  */
$
$ /*
$@@ -31,12 +31,18 @@
$ #include <linux/regulator/driver.h>
$ #include <linux/regulator/of_regulator.h>
$
$+#define LDO_RAMP_UP_UNIT_IN_CYCLES      64 /* 64 cycles per step */
$+#define LDO_RAMP_UP_FREQ_IN_MHZ         24 /* time base on 24M OSC */
$+
$ struct anatop_regulator {
$ 	const char *name;
$ 	u32 control_reg;
$ 	struct regmap *anatop;
$ 	int vol_bit_shift;
$ 	int vol_bit_width;
$+	u32 delay_reg;
$+	int delay_bit_shift;
$+	int delay_bit_width;
$ 	int min_bit_val;
$ 	int min_voltage;
$ 	int max_voltage;
$@@ -80,8 +86,34 @@ static int anatop_regmap_get_voltage_sel(struct
$regulator_dev *reg)
$ 	return val - anatop_reg->min_bit_val;
$ }
$
$+static int anatop_regmap_set_voltage_time_sel(struct regulator_dev *reg,
$+	unsigned int old_sel,
$+	unsigned int new_sel)
$+{
$+	struct anatop_regulator *anatop_reg = rdev_get_drvdata(reg);
$+	u32 val;
$+	int ret = 0;
$+
$+	if (anatop_reg->delay_bit_width && new_sel > old_sel) {
$+		/*
$+		 * the delay time for LDO ramp up time is
$+		 * based on the register setting, we need
$+		 * to calculate how many steps LDO need to
$+		 * ramp up, and how much delay needed. (us)
$+		 */
$+		regmap_read(anatop_reg->anatop, anatop_reg->delay_reg, &val);
$+		val = (val >> anatop_reg->delay_bit_shift) &
$+			((1 << anatop_reg->delay_bit_width) - 1);
$+		ret = (new_sel - old_sel) * ((LDO_RAMP_UP_UNIT_IN_CYCLES <<
$+			val) / LDO_RAMP_UP_FREQ_IN_MHZ + 1);
$+	}
$+
$+	return ret;
$+}
$+
$ static struct regulator_ops anatop_rops = {
$ 	.set_voltage_sel = anatop_regmap_set_voltage_sel,
$+	.set_voltage_time_sel = anatop_regmap_set_voltage_time_sel,
$ 	.get_voltage_sel = anatop_regmap_get_voltage_sel,
$ 	.list_voltage = regulator_list_voltage_linear,
$ 	.map_voltage = regulator_map_voltage_linear, @@ -157,6 +189,13 @@ static
$int __devinit anatop_regulator_probe(struct platform_device *pdev)
$ 		dev_err(dev, "no anatop-max-voltage property set\n");
$ 		goto anatop_probe_end;
$ 	}
$+	/* read LDO ramp up setting, only for core reg */
$+	of_property_read_u32(np, "anatop-delay-reg-offset",
$+			     &sreg->delay_reg);
$+	of_property_read_u32(np, "anatop-delay-bit-width",
$+			     &sreg->delay_bit_width);
$+	of_property_read_u32(np, "anatop-delay-bit-shift",
$+			     &sreg->delay_bit_shift);
$
$ 	rdesc->n_voltages = (sreg->max_voltage - sreg->min_voltage)
$ 		/ 25000 + 1;
$--
$1.7.9.5



More information about the devicetree-discuss mailing list