Re-sending on top of Tero's changes which are already in -next and the one which adds support for twl6030 vdd1/2/3 SMPS [1].
v3 has mainly 2 differences from v2 -1- TWL driver now uses just one table for both dt and non-dt based lookup for driver data. -2- All common regulator nodes for twl4030 and twl6030 are now defined in the twl4030.dtsi and twl6030.dtsi instead of repeating the nodes in all board files, which also means the patch ('arm/dts: twl: Pass regulator data from dt') has a dependency with the series from Benoit which adds the twl4030.dtsi and twl6030.dtsi files[2].
I have tested the patches on omap4panda and omap3beagle boards.
[1] http://marc.info/?l=linux-omap&m=133009693905864&w=2 [2] git://git.kernel.org/pub/scm/linux/kernel/git/bcousson/linux-omap-dt.git for_3.4/dt_i2c_twl
Rajendra Nayak (2): regulator: twl: adapt twl-regulator driver to dt arm/dts: twl: Pass regulator data from dt
.../bindings/regulator/twl-regulator.txt | 66 +++++ arch/arm/boot/dts/omap3-beagle.dts | 6 + arch/arm/boot/dts/twl4030.dtsi | 18 ++ arch/arm/boot/dts/twl6030.dtsi | 60 +++++ drivers/regulator/twl-regulator.c | 259 +++++++++++++------- 5 files changed, 322 insertions(+), 87 deletions(-) create mode 100644 Documentation/devicetree/bindings/regulator/twl-regulator.txt
Modify the twl regulator driver to extract the regulator_init_data from device tree when passed, instead of getting it through platform_data structures (on non-DT builds)
Also add documentation for TWL regulator specific bindings.
Signed-off-by: Rajendra Nayak rnayak@ti.com --- .../bindings/regulator/twl-regulator.txt | 66 +++++ drivers/regulator/twl-regulator.c | 259 +++++++++++++------- 2 files changed, 238 insertions(+), 87 deletions(-) create mode 100644 Documentation/devicetree/bindings/regulator/twl-regulator.txt
diff --git a/Documentation/devicetree/bindings/regulator/twl-regulator.txt b/Documentation/devicetree/bindings/regulator/twl-regulator.txt new file mode 100644 index 0000000..ba9d2cc --- /dev/null +++ b/Documentation/devicetree/bindings/regulator/twl-regulator.txt @@ -0,0 +1,66 @@ +TWL family of regulators + +Required properties: +For twl6030 regulators/LDOs +- compatible: + - "ti,twl6030-vaux1" for VAUX1 LDO + - "ti,twl6030-vaux2" for VAUX2 LDO + - "ti,twl6030-vaux3" for VAUX3 LDO + - "ti,twl6030-vmmc" for VMMC LDO + - "ti,twl6030-vpp" for VPP LDO + - "ti,twl6030-vusim" for VUSIM LDO + - "ti,twl6030-vana" for VANA LDO + - "ti,twl6030-vcxio" for VCXIO LDO + - "ti,twl6030-vdac" for VDAC LDO + - "ti,twl6030-vusb" for VUSB LDO + - "ti,twl6030-clk32kg" for CLK32KG RESOURCE + - "ti,twl6030-vdd1" for VDD1 SMPS + - "ti,twl6030-vdd2" for VDD2 SMPS + - "ti,twl6030-vdd3" for VDD3 SMPS +For twl6025 regulators/LDOs +- compatible: + - "ti,twl6025-ldo1" for LDO1 LDO + - "ti,twl6025-ldo2" for LDO2 LDO + - "ti,twl6025-ldo3" for LDO3 LDO + - "ti,twl6025-ldo4" for LDO4 LDO + - "ti,twl6025-ldo5" for LDO5 LDO + - "ti,twl6025-ldo6" for LDO6 LDO + - "ti,twl6025-ldo7" for LDO7 LDO + - "ti,twl6025-ldoln" for LDOLN LDO + - "ti,twl6025-ldousb" for LDOUSB LDO + - "ti,twl6025-smps3" for SMPS3 SMPS + - "ti,twl6025-smps4" for SMPS4 SMPS + - "ti,twl6025-vio" for VIO SMPS +For twl4030 regulators/LDOs +- compatible: + - "ti,twl4030-vaux1" for VAUX1 LDO + - "ti,twl4030-vaux2" for VAUX2 LDO + - "ti,twl5030-vaux2" for VAUX2 LDO + - "ti,twl4030-vaux3" for VAUX3 LDO + - "ti,twl4030-vaux4" for VAUX4 LDO + - "ti,twl4030-vmmc1" for VMMC1 LDO + - "ti,twl4030-vmmc2" for VMMC2 LDO + - "ti,twl4030-vpll1" for VPLL1 LDO + - "ti,twl4030-vpll2" for VPLL2 LDO + - "ti,twl4030-vsim" for VSIM LDO + - "ti,twl4030-vdac" for VDAC LDO + - "ti,twl4030-vintana2" for VINTANA2 LDO + - "ti,twl4030-vio" for VIO LDO + - "ti,twl4030-vdd1" for VDD1 SMPS + - "ti,twl4030-vdd2" for VDD2 SMPS + - "ti,twl4030-vintana1" for VINTANA1 LDO + - "ti,twl4030-vintdig" for VINTDIG LDO + - "ti,twl4030-vusb1v5" for VUSB1V5 LDO + - "ti,twl4030-vusb1v8" for VUSB1V8 LDO + - "ti,twl4030-vusb3v1" for VUSB3V1 LDO + +Optional properties: +- Any optional property defined in bindings/regulator/regulator.txt + +Example: + + xyz: regulator@0 { + compatible = "ti,twl6030-vaux1"; + regulator-min-microvolt = <1000000>; + regulator-max-microvolt = <3000000>; + }; diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c index 8611282..2a13211 100644 --- a/drivers/regulator/twl-regulator.c +++ b/drivers/regulator/twl-regulator.c @@ -14,8 +14,11 @@ #include <linux/err.h> #include <linux/delay.h> #include <linux/platform_device.h> +#include <linux/of.h> +#include <linux/of_device.h> #include <linux/regulator/driver.h> #include <linux/regulator/machine.h> +#include <linux/regulator/of_regulator.h> #include <linux/i2c/twl.h>
@@ -920,7 +923,8 @@ static struct regulator_ops twlsmps_ops = { TWL_FIXED_LDO(label, offset, mVolts, 0x0, turnon_delay, \ 0x0, TWL6030, twl6030fixed_ops)
-#define TWL4030_ADJUSTABLE_LDO(label, offset, num, turnon_delay, remap_conf) { \ +#define TWL4030_ADJUSTABLE_LDO(label, offset, num, turnon_delay, remap_conf) \ +static struct twlreg_info TWL4030_INFO_##label = { \ .base = offset, \ .id = num, \ .table_len = ARRAY_SIZE(label##_VSEL_table), \ @@ -938,7 +942,7 @@ static struct regulator_ops twlsmps_ops = { }
#define TWL4030_ADJUSTABLE_SMPS(label, offset, num, turnon_delay, remap_conf) \ - { \ +static struct twlreg_info TWL4030_INFO_##label = { \ .base = offset, \ .id = num, \ .delay = turnon_delay, \ @@ -952,7 +956,8 @@ static struct regulator_ops twlsmps_ops = { }, \ }
-#define TWL6030_ADJUSTABLE_SMPS(label) { \ +#define TWL6030_ADJUSTABLE_SMPS(label) \ +static struct twlreg_info TWL6030_INFO_##label = { \ .desc = { \ .name = #label, \ .id = TWL6030_REG_##label, \ @@ -962,7 +967,8 @@ static struct regulator_ops twlsmps_ops = { }, \ }
-#define TWL6030_ADJUSTABLE_LDO(label, offset, min_mVolts, max_mVolts) { \ +#define TWL6030_ADJUSTABLE_LDO(label, offset, min_mVolts, max_mVolts) \ +static struct twlreg_info TWL6030_INFO_##label = { \ .base = offset, \ .min_mV = min_mVolts, \ .max_mV = max_mVolts, \ @@ -976,7 +982,8 @@ static struct regulator_ops twlsmps_ops = { }, \ }
-#define TWL6025_ADJUSTABLE_LDO(label, offset, min_mVolts, max_mVolts) { \ +#define TWL6025_ADJUSTABLE_LDO(label, offset, min_mVolts, max_mVolts) \ +static struct twlreg_info TWL6025_INFO_##label = { \ .base = offset, \ .min_mV = min_mVolts, \ .max_mV = max_mVolts, \ @@ -991,7 +998,8 @@ static struct regulator_ops twlsmps_ops = { }
#define TWL_FIXED_LDO(label, offset, mVolts, num, turnon_delay, remap_conf, \ - family, operations) { \ + family, operations) \ +static struct twlreg_info TWLFIXED_INFO_##label = { \ .base = offset, \ .id = num, \ .min_mV = mVolts, \ @@ -1007,7 +1015,8 @@ static struct regulator_ops twlsmps_ops = { }, \ }
-#define TWL6030_FIXED_RESOURCE(label, offset, turnon_delay) { \ +#define TWL6030_FIXED_RESOURCE(label, offset, turnon_delay) \ +static struct twlreg_info TWLRES_INFO_##label = { \ .base = offset, \ .delay = turnon_delay, \ .desc = { \ @@ -1019,7 +1028,8 @@ static struct regulator_ops twlsmps_ops = { }, \ }
-#define TWL6025_ADJUSTABLE_SMPS(label, offset) { \ +#define TWL6025_ADJUSTABLE_SMPS(label, offset) \ +static struct twlreg_info TWLSMPS_INFO_##label = { \ .base = offset, \ .min_mV = 600, \ .max_mV = 2100, \ @@ -1037,62 +1047,57 @@ static struct regulator_ops twlsmps_ops = { * We list regulators here if systems need some level of * software control over them after boot. */ -static struct twlreg_info twl_regs[] = { - TWL4030_ADJUSTABLE_LDO(VAUX1, 0x17, 1, 100, 0x08), - TWL4030_ADJUSTABLE_LDO(VAUX2_4030, 0x1b, 2, 100, 0x08), - TWL4030_ADJUSTABLE_LDO(VAUX2, 0x1b, 2, 100, 0x08), - TWL4030_ADJUSTABLE_LDO(VAUX3, 0x1f, 3, 100, 0x08), - TWL4030_ADJUSTABLE_LDO(VAUX4, 0x23, 4, 100, 0x08), - TWL4030_ADJUSTABLE_LDO(VMMC1, 0x27, 5, 100, 0x08), - TWL4030_ADJUSTABLE_LDO(VMMC2, 0x2b, 6, 100, 0x08), - TWL4030_ADJUSTABLE_LDO(VPLL1, 0x2f, 7, 100, 0x00), - TWL4030_ADJUSTABLE_LDO(VPLL2, 0x33, 8, 100, 0x08), - TWL4030_ADJUSTABLE_LDO(VSIM, 0x37, 9, 100, 0x00), - TWL4030_ADJUSTABLE_LDO(VDAC, 0x3b, 10, 100, 0x08), - TWL4030_FIXED_LDO(VINTANA1, 0x3f, 1500, 11, 100, 0x08), - TWL4030_ADJUSTABLE_LDO(VINTANA2, 0x43, 12, 100, 0x08), - TWL4030_FIXED_LDO(VINTDIG, 0x47, 1500, 13, 100, 0x08), - TWL4030_ADJUSTABLE_LDO(VIO, 0x4b, 14, 1000, 0x08), - TWL4030_ADJUSTABLE_SMPS(VDD1, 0x55, 15, 1000, 0x08), - TWL4030_ADJUSTABLE_SMPS(VDD2, 0x63, 16, 1000, 0x08), - TWL4030_FIXED_LDO(VUSB1V5, 0x71, 1500, 17, 100, 0x08), - TWL4030_FIXED_LDO(VUSB1V8, 0x74, 1800, 18, 100, 0x08), - TWL4030_FIXED_LDO(VUSB3V1, 0x77, 3100, 19, 150, 0x08), - /* VUSBCP is managed *only* by the USB subchip */ - - /* 6030 REG with base as PMC Slave Misc : 0x0030 */ - /* Turnon-delay and remap configuration values for 6030 are not - verified since the specification is not public */ - TWL6030_ADJUSTABLE_SMPS(VDD1), - TWL6030_ADJUSTABLE_SMPS(VDD2), - TWL6030_ADJUSTABLE_SMPS(VDD3), - TWL6030_ADJUSTABLE_LDO(VAUX1_6030, 0x54, 1000, 3300), - TWL6030_ADJUSTABLE_LDO(VAUX2_6030, 0x58, 1000, 3300), - TWL6030_ADJUSTABLE_LDO(VAUX3_6030, 0x5c, 1000, 3300), - TWL6030_ADJUSTABLE_LDO(VMMC, 0x68, 1000, 3300), - TWL6030_ADJUSTABLE_LDO(VPP, 0x6c, 1000, 3300), - TWL6030_ADJUSTABLE_LDO(VUSIM, 0x74, 1000, 3300), - TWL6030_FIXED_LDO(VANA, 0x50, 2100, 0), - TWL6030_FIXED_LDO(VCXIO, 0x60, 1800, 0), - TWL6030_FIXED_LDO(VDAC, 0x64, 1800, 0), - TWL6030_FIXED_LDO(VUSB, 0x70, 3300, 0), - TWL6030_FIXED_RESOURCE(CLK32KG, 0x8C, 0), - - /* 6025 are renamed compared to 6030 versions */ - TWL6025_ADJUSTABLE_LDO(LDO2, 0x54, 1000, 3300), - TWL6025_ADJUSTABLE_LDO(LDO4, 0x58, 1000, 3300), - TWL6025_ADJUSTABLE_LDO(LDO3, 0x5c, 1000, 3300), - TWL6025_ADJUSTABLE_LDO(LDO5, 0x68, 1000, 3300), - TWL6025_ADJUSTABLE_LDO(LDO1, 0x6c, 1000, 3300), - TWL6025_ADJUSTABLE_LDO(LDO7, 0x74, 1000, 3300), - TWL6025_ADJUSTABLE_LDO(LDO6, 0x60, 1000, 3300), - TWL6025_ADJUSTABLE_LDO(LDOLN, 0x64, 1000, 3300), - TWL6025_ADJUSTABLE_LDO(LDOUSB, 0x70, 1000, 3300), - - TWL6025_ADJUSTABLE_SMPS(SMPS3, 0x34), - TWL6025_ADJUSTABLE_SMPS(SMPS4, 0x10), - TWL6025_ADJUSTABLE_SMPS(VIO, 0x16), -}; +TWL4030_ADJUSTABLE_LDO(VAUX1, 0x17, 1, 100, 0x08); +TWL4030_ADJUSTABLE_LDO(VAUX2_4030, 0x1b, 2, 100, 0x08); +TWL4030_ADJUSTABLE_LDO(VAUX2, 0x1b, 2, 100, 0x08); +TWL4030_ADJUSTABLE_LDO(VAUX3, 0x1f, 3, 100, 0x08); +TWL4030_ADJUSTABLE_LDO(VAUX4, 0x23, 4, 100, 0x08); +TWL4030_ADJUSTABLE_LDO(VMMC1, 0x27, 5, 100, 0x08); +TWL4030_ADJUSTABLE_LDO(VMMC2, 0x2b, 6, 100, 0x08); +TWL4030_ADJUSTABLE_LDO(VPLL1, 0x2f, 7, 100, 0x00); +TWL4030_ADJUSTABLE_LDO(VPLL2, 0x33, 8, 100, 0x08); +TWL4030_ADJUSTABLE_LDO(VSIM, 0x37, 9, 100, 0x00); +TWL4030_ADJUSTABLE_LDO(VDAC, 0x3b, 10, 100, 0x08); +TWL4030_ADJUSTABLE_LDO(VINTANA2, 0x43, 12, 100, 0x08); +TWL4030_ADJUSTABLE_LDO(VIO, 0x4b, 14, 1000, 0x08); +TWL4030_ADJUSTABLE_SMPS(VDD1, 0x55, 15, 1000, 0x08); +TWL4030_ADJUSTABLE_SMPS(VDD2, 0x63, 16, 1000, 0x08); +/* VUSBCP is managed *only* by the USB subchip */ +/* 6030 REG with base as PMC Slave Misc : 0x0030 */ +/* Turnon-delay and remap configuration values for 6030 are not + verified since the specification is not public */ +TWL6030_ADJUSTABLE_SMPS(VDD1); +TWL6030_ADJUSTABLE_SMPS(VDD2); +TWL6030_ADJUSTABLE_SMPS(VDD3); +TWL6030_ADJUSTABLE_LDO(VAUX1_6030, 0x54, 1000, 3300); +TWL6030_ADJUSTABLE_LDO(VAUX2_6030, 0x58, 1000, 3300); +TWL6030_ADJUSTABLE_LDO(VAUX3_6030, 0x5c, 1000, 3300); +TWL6030_ADJUSTABLE_LDO(VMMC, 0x68, 1000, 3300); +TWL6030_ADJUSTABLE_LDO(VPP, 0x6c, 1000, 3300); +TWL6030_ADJUSTABLE_LDO(VUSIM, 0x74, 1000, 3300); +/* 6025 are renamed compared to 6030 versions */ +TWL6025_ADJUSTABLE_LDO(LDO2, 0x54, 1000, 3300); +TWL6025_ADJUSTABLE_LDO(LDO4, 0x58, 1000, 3300); +TWL6025_ADJUSTABLE_LDO(LDO3, 0x5c, 1000, 3300); +TWL6025_ADJUSTABLE_LDO(LDO5, 0x68, 1000, 3300); +TWL6025_ADJUSTABLE_LDO(LDO1, 0x6c, 1000, 3300); +TWL6025_ADJUSTABLE_LDO(LDO7, 0x74, 1000, 3300); +TWL6025_ADJUSTABLE_LDO(LDO6, 0x60, 1000, 3300); +TWL6025_ADJUSTABLE_LDO(LDOLN, 0x64, 1000, 3300); +TWL6025_ADJUSTABLE_LDO(LDOUSB, 0x70, 1000, 3300); +TWL4030_FIXED_LDO(VINTANA2, 0x3f, 1500, 11, 100, 0x08); +TWL4030_FIXED_LDO(VINTDIG, 0x47, 1500, 13, 100, 0x08); +TWL4030_FIXED_LDO(VUSB1V5, 0x71, 1500, 17, 100, 0x08); +TWL4030_FIXED_LDO(VUSB1V8, 0x74, 1800, 18, 100, 0x08); +TWL4030_FIXED_LDO(VUSB3V1, 0x77, 3100, 19, 150, 0x08); +TWL6030_FIXED_LDO(VANA, 0x50, 2100, 0); +TWL6030_FIXED_LDO(VCXIO, 0x60, 1800, 0); +TWL6030_FIXED_LDO(VDAC, 0x64, 1800, 0); +TWL6030_FIXED_LDO(VUSB, 0x70, 3300, 0); +TWL6030_FIXED_RESOURCE(CLK32KG, 0x8C, 0); +TWL6025_ADJUSTABLE_SMPS(SMPS3, 0x34); +TWL6025_ADJUSTABLE_SMPS(SMPS4, 0x10); +TWL6025_ADJUSTABLE_SMPS(VIO, 0x16);
static u8 twl_get_smps_offset(void) { @@ -1112,38 +1117,114 @@ static u8 twl_get_smps_mult(void) return value; }
+#define TWL_OF_MATCH(comp, family, label) \ + { \ + .compatible = comp, \ + .data = &family##_INFO_##label, \ + } + +#define TWL4030_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWL4030, label) +#define TWL6030_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWL6030, label) +#define TWL6025_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWL6025, label) +#define TWLFIXED_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWLFIXED, label) +#define TWLRES_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWLRES, label) +#define TWLSMPS_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWLSMPS, label) + +static const struct of_device_id twl_of_match[] __devinitconst = { + TWL4030_OF_MATCH("ti,twl4030-vaux1", VAUX1), + TWL4030_OF_MATCH("ti,twl4030-vaux2", VAUX2_4030), + TWL4030_OF_MATCH("ti,twl5030-vaux2", VAUX2), + TWL4030_OF_MATCH("ti,twl4030-vaux3", VAUX3), + TWL4030_OF_MATCH("ti,twl4030-vaux4", VAUX4), + TWL4030_OF_MATCH("ti,twl4030-vmmc1", VMMC1), + TWL4030_OF_MATCH("ti,twl4030-vmmc2", VMMC2), + TWL4030_OF_MATCH("ti,twl4030-vpll1", VPLL1), + TWL4030_OF_MATCH("ti,twl4030-vpll2", VPLL2), + TWL4030_OF_MATCH("ti,twl4030-vsim", VSIM), + TWL4030_OF_MATCH("ti,twl4030-vdac", VDAC), + TWL4030_OF_MATCH("ti,twl4030-vintana2", VINTANA2), + TWL4030_OF_MATCH("ti,twl4030-vio", VIO), + TWL4030_OF_MATCH("ti,twl4030-vdd1", VDD1), + TWL4030_OF_MATCH("ti,twl4030-vdd2", VDD2), + TWL6030_OF_MATCH("ti,twl6030-vdd1", VDD1), + TWL6030_OF_MATCH("ti,twl6030-vdd2", VDD2), + TWL6030_OF_MATCH("ti,twl6030-vdd3", VDD3), + TWL6030_OF_MATCH("ti,twl6030-vaux1", VAUX1_6030), + TWL6030_OF_MATCH("ti,twl6030-vaux2", VAUX2_6030), + TWL6030_OF_MATCH("ti,twl6030-vaux3", VAUX3_6030), + TWL6030_OF_MATCH("ti,twl6030-vmmc", VMMC), + TWL6030_OF_MATCH("ti,twl6030-vpp", VPP), + TWL6030_OF_MATCH("ti,twl6030-vusim", VUSIM), + TWL6025_OF_MATCH("ti,twl6025-ldo2", LDO2), + TWL6025_OF_MATCH("ti,twl6025-ldo4", LDO4), + TWL6025_OF_MATCH("ti,twl6025-ldo3", LDO3), + TWL6025_OF_MATCH("ti,twl6025-ldo5", LDO5), + TWL6025_OF_MATCH("ti,twl6025-ldo1", LDO1), + TWL6025_OF_MATCH("ti,twl6025-ldo7", LDO7), + TWL6025_OF_MATCH("ti,twl6025-ldo6", LDO6), + TWL6025_OF_MATCH("ti,twl6025-ldoln", LDOLN), + TWL6025_OF_MATCH("ti,twl6025-ldousb", LDOUSB), + TWLFIXED_OF_MATCH("ti,twl4030-vintana2", VINTANA2), + TWLFIXED_OF_MATCH("ti,twl4030-vintdig", VINTDIG), + TWLFIXED_OF_MATCH("ti,twl4030-vusb1v5", VUSB1V5), + TWLFIXED_OF_MATCH("ti,twl4030-vusb1v8", VUSB1V8), + TWLFIXED_OF_MATCH("ti,twl4030-vusb3v1", VUSB3V1), + TWLFIXED_OF_MATCH("ti,twl6030-vana", VANA), + TWLFIXED_OF_MATCH("ti,twl6030-vcxio", VCXIO), + TWLFIXED_OF_MATCH("ti,twl6030-vdac", VDAC), + TWLFIXED_OF_MATCH("ti,twl6030-vusb", VUSB), + TWLRES_OF_MATCH("ti,twl6030-clk32kg", CLK32KG), + TWLSMPS_OF_MATCH("ti,twl6025-smps3", SMPS3), + TWLSMPS_OF_MATCH("ti,twl6025-smps4", SMPS4), + TWLSMPS_OF_MATCH("ti,twl6025-vio", VIO), + {}, +}; +MODULE_DEVICE_TABLE(of, twl_of_match); + static int __devinit twlreg_probe(struct platform_device *pdev) { - int i; + int i, id; struct twlreg_info *info; struct regulator_init_data *initdata; struct regulation_constraints *c; struct regulator_dev *rdev; struct twl_regulator_driver_data *drvdata; - - for (i = 0, info = NULL; i < ARRAY_SIZE(twl_regs); i++) { - if (twl_regs[i].desc.id != pdev->id) - continue; - info = twl_regs + i; - break; + const struct of_device_id *match; + + match = of_match_device(twl_of_match, &pdev->dev); + if (match) { + info = match->data; + id = info->desc.id; + initdata = of_get_regulator_init_data(&pdev->dev, + pdev->dev.of_node); + drvdata = NULL; + } else { + id = pdev->id; + initdata = pdev->dev.platform_data; + for (i = 0, info = NULL; i < ARRAY_SIZE(twl_of_match); i++) { + info = twl_of_match[i].data; + if (!info || info->desc.id != id) + continue; + break; + } + drvdata = initdata->driver_data; + if (!drvdata) + return -EINVAL; } + if (!info) return -ENODEV;
- initdata = pdev->dev.platform_data; if (!initdata) return -EINVAL;
- drvdata = initdata->driver_data; - - if (!drvdata) - return -EINVAL; - - /* copy the driver data into regulator data */ - info->features = drvdata->features; - info->data = drvdata->data; - info->set_voltage = drvdata->set_voltage; - info->get_voltage = drvdata->get_voltage; + if (drvdata) { + /* copy the driver data into regulator data */ + info->features = drvdata->features; + info->data = drvdata->data; + info->set_voltage = drvdata->set_voltage; + info->get_voltage = drvdata->get_voltage; + }
/* Constrain board-specific capabilities according to what * this driver and the chip itself can actually do. @@ -1153,7 +1234,7 @@ static int __devinit twlreg_probe(struct platform_device *pdev) c->valid_ops_mask &= REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS; - switch (pdev->id) { + switch (id) { case TWL4030_REG_VIO: case TWL4030_REG_VDD1: case TWL4030_REG_VDD2: @@ -1167,7 +1248,7 @@ static int __devinit twlreg_probe(struct platform_device *pdev) break; }
- switch (pdev->id) { + switch (id) { case TWL6025_REG_SMPS3: if (twl_get_smps_mult() & SMPS_MULTOFFSET_SMPS3) info->flags |= SMPS_EXTENDED_EN; @@ -1188,7 +1269,8 @@ static int __devinit twlreg_probe(struct platform_device *pdev) break; }
- rdev = regulator_register(&info->desc, &pdev->dev, initdata, info, NULL); + rdev = regulator_register(&info->desc, &pdev->dev, initdata, info, + pdev->dev.of_node); if (IS_ERR(rdev)) { dev_err(&pdev->dev, "can't register %s, %ld\n", info->desc.name, PTR_ERR(rdev)); @@ -1225,8 +1307,11 @@ static struct platform_driver twlreg_driver = { /* NOTE: short name, to work around driver model truncation of * "twl_regulator.12" (and friends) to "twl_regulator.1". */ - .driver.name = "twl_reg", - .driver.owner = THIS_MODULE, + .driver = { + .name = "twl_reg", + .owner = THIS_MODULE, + .of_match_table = of_match_ptr(twl_of_match), + }, };
static int __init twlreg_init(void)
Pass all the voltage regulator information for twl6030/twl4030 PMIC from device tree.
Signed-off-by: Rajendra Nayak rnayak@ti.com Signed-off-by: Benoit Cousson b-cousson@ti.com --- arch/arm/boot/dts/omap3-beagle.dts | 6 +++ arch/arm/boot/dts/twl4030.dtsi | 18 +++++++++++ arch/arm/boot/dts/twl6030.dtsi | 60 ++++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 0 deletions(-)
diff --git a/arch/arm/boot/dts/omap3-beagle.dts b/arch/arm/boot/dts/omap3-beagle.dts index 714ba5d..54556b1 100644 --- a/arch/arm/boot/dts/omap3-beagle.dts +++ b/arch/arm/boot/dts/omap3-beagle.dts @@ -26,6 +26,12 @@ reg = <0x48>; interrupts = <7>; /* SYS_NIRQ cascaded to intc */ interrupt-parent = <&intc>; + + vsim: regulator@10 { + compatible = "ti,twl4030-vsim"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <3000000>; + }; }; };
diff --git a/arch/arm/boot/dts/twl4030.dtsi b/arch/arm/boot/dts/twl4030.dtsi index 8be5223..a94654c 100644 --- a/arch/arm/boot/dts/twl4030.dtsi +++ b/arch/arm/boot/dts/twl4030.dtsi @@ -18,4 +18,22 @@ compatible = "ti,twl4030-rtc"; interrupts = <11>; }; + + vdac: regulator@0 { + compatible = "ti,twl4030-vdac"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + }; + + vpll2: regulator@1 { + compatible = "ti,twl4030-vpll2"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + }; + + vmmc1: regulator@2 { + compatible = "ti,twl4030-vmmc1"; + regulator-min-microvolt = <1850000>; + regulator-max-microvolt = <3150000>; + }; }; diff --git a/arch/arm/boot/dts/twl6030.dtsi b/arch/arm/boot/dts/twl6030.dtsi index b7b4e5e..efa19e8 100644 --- a/arch/arm/boot/dts/twl6030.dtsi +++ b/arch/arm/boot/dts/twl6030.dtsi @@ -19,4 +19,64 @@ compatible = "ti,twl4030-rtc"; interrupts = <11>; }; + + vaux1: regulator@0 { + compatible = "ti,twl6030-vaux1"; + regulator-min-microvolt = <1000000>; + regulator-max-microvolt = <3000000>; + }; + + vaux2: regulator@1 { + compatible = "ti,twl6030-vaux2"; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <2800000>; + }; + + vaux3: regulator@2 { + compatible = "ti,twl6030-vaux3"; + regulator-min-microvolt = <1000000>; + regulator-max-microvolt = <3000000>; + }; + + vmmc: regulator@3 { + compatible = "ti,twl6030-vmmc"; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <3000000>; + }; + + vpp: regulator@4 { + compatible = "ti,twl6030-vpp"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <2500000>; + }; + + vusim: regulator@5 { + compatible = "ti,twl6030-vusim"; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <2900000>; + }; + + vdac: regulator@6 { + compatible = "ti,twl6030-vdac"; + }; + + vana: regulator@7 { + compatible = "ti,twl6030-vana"; + }; + + vcxio: regulator@8 { + compatible = "ti,twl6030-vcxio"; + }; + + vusb: regulator@9 { + compatible = "ti,twl6030-vusb"; + }; + + vusb: regulator@9 { + compatible = "ti,twl6030-vusb"; + }; + + clk32kg: regulator@10 { + compatible = "ti,twl6030-clk32kg"; + }; };
Hi Rajendra,
On 02/27/2012 12:35 PM, Rajendra Nayak wrote:
Re-sending on top of Tero's changes which are already in -next and the one which adds support for twl6030 vdd1/2/3 SMPS [1].
Would you be able to add support for V1V8, V2V1 SMPS supplies in twl6030? These regulators are need on SDP4430, and PandaBoards for the twl6040 audio codec. I have sent a series to add this support: http://marc.info/?l=linux-omap&m=132886849202915&w=2
Thanks, Péter
v3 has mainly 2 differences from v2 -1- TWL driver now uses just one table for both dt and non-dt based lookup for driver data. -2- All common regulator nodes for twl4030 and twl6030 are now defined in the twl4030.dtsi and twl6030.dtsi instead of repeating the nodes in all board files, which also means the patch ('arm/dts: twl: Pass regulator data from dt') has a dependency with the series from Benoit which adds the twl4030.dtsi and twl6030.dtsi files[2].
I have tested the patches on omap4panda and omap3beagle boards.
[1] http://marc.info/?l=linux-omap&m=133009693905864&w=2 [2] git://git.kernel.org/pub/scm/linux/kernel/git/bcousson/linux-omap-dt.git for_3.4/dt_i2c_twl
Rajendra Nayak (2): regulator: twl: adapt twl-regulator driver to dt arm/dts: twl: Pass regulator data from dt
.../bindings/regulator/twl-regulator.txt | 66 +++++ arch/arm/boot/dts/omap3-beagle.dts | 6 + arch/arm/boot/dts/twl4030.dtsi | 18 ++ arch/arm/boot/dts/twl6030.dtsi | 60 +++++ drivers/regulator/twl-regulator.c | 259 +++++++++++++------- 5 files changed, 322 insertions(+), 87 deletions(-) create mode 100644 Documentation/devicetree/bindings/regulator/twl-regulator.txt
-- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Monday 27 February 2012 05:45 PM, Peter Ujfalusi wrote:
Hi Rajendra,
On 02/27/2012 12:35 PM, Rajendra Nayak wrote:
Re-sending on top of Tero's changes which are already in -next and the one which adds support for twl6030 vdd1/2/3 SMPS [1].
Would you be able to add support for V1V8, V2V1 SMPS supplies in twl6030? These regulators are need on SDP4430, and PandaBoards for the twl6040 audio codec. I have sent a series to add this support: http://marc.info/?l=linux-omap&m=132886849202915&w=2
Sure, seems quite straight forward to add DT support for those too. I just based my patches on top of whats already in -next and some changes from Tero. Did not notice there are more patches floating around touching twl-regulator :) Depending on what order Mark happens to pull them in, I am fine re-sending adding support for the 2 twl6030 fixed regulators.
Thanks, Péter
v3 has mainly 2 differences from v2 -1- TWL driver now uses just one table for both dt and non-dt based lookup for driver data. -2- All common regulator nodes for twl4030 and twl6030 are now defined in the twl4030.dtsi and twl6030.dtsi instead of repeating the nodes in all board files, which also means the patch ('arm/dts: twl: Pass regulator data from dt') has a dependency with the series from Benoit which adds the twl4030.dtsi and twl6030.dtsi files[2].
I have tested the patches on omap4panda and omap3beagle boards.
[1] http://marc.info/?l=linux-omap&m=133009693905864&w=2 [2] git://git.kernel.org/pub/scm/linux/kernel/git/bcousson/linux-omap-dt.git for_3.4/dt_i2c_twl
Rajendra Nayak (2): regulator: twl: adapt twl-regulator driver to dt arm/dts: twl: Pass regulator data from dt
.../bindings/regulator/twl-regulator.txt | 66 +++++ arch/arm/boot/dts/omap3-beagle.dts | 6 + arch/arm/boot/dts/twl4030.dtsi | 18 ++ arch/arm/boot/dts/twl6030.dtsi | 60 +++++ drivers/regulator/twl-regulator.c | 259 +++++++++++++------- 5 files changed, 322 insertions(+), 87 deletions(-) create mode 100644 Documentation/devicetree/bindings/regulator/twl-regulator.txt
-- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, Feb 27, 2012 at 06:01:20PM +0530, Rajendra Nayak wrote:
Depending on what order Mark happens to pull them in, I am fine re-sending adding support for the 2 twl6030 fixed regulators.
Please can you guys come up with a single unified series for this stuff - I'll hold off on applying anything to allow you to do this.
Hi Mark,
On 2/27/2012 2:41 PM, Mark Brown wrote:
On Mon, Feb 27, 2012 at 06:01:20PM +0530, Rajendra Nayak wrote:
Depending on what order Mark happens to pull them in, I am fine re-sending adding support for the 2 twl6030 fixed regulators.
Please can you guys come up with a single unified series for this stuff
- I'll hold off on applying anything to allow you to do this.
The issue is that the initial TWL regulator series from Rajendra will depend on the twl core DT support I have that depends on the irq_domain series from Grant...
So I guess, it will be easy for us to split the regulator patches from the DTS ones to have at least the driver changes merged by you. Then Tony might be able to pull all the DTS in one series and thus avoid the various merge conflict that will happen since most OMAP drivers are hacking the same DTS files.
Does that make sense? Or do you think it will be even worst separating the patches?
Thanks, Benoit
On Mon, Feb 27, 2012 at 02:52:05PM +0100, Cousson, Benoit wrote:
On 2/27/2012 2:41 PM, Mark Brown wrote:
On Mon, Feb 27, 2012 at 06:01:20PM +0530, Rajendra Nayak wrote:
Please can you guys come up with a single unified series for this stuff
- I'll hold off on applying anything to allow you to do this.
The issue is that the initial TWL regulator series from Rajendra will depend on the twl core DT support I have that depends on the irq_domain series from Grant...
Really? That's the first I've heard of any such dependency here. Is it a build time dependency or is it just something that's required to make the code actually spring into life? It looks like it's the latter but you're saying there's an actual dependency.
There's also more than that, there's also at least Tero submitting some other stuff separately (and his stuff won't play with DT...) and I think Peter also. It really fees like there's a bunch of people working on different things without talking to each other here.
So I guess, it will be easy for us to split the regulator patches from the DTS ones to have at least the driver changes merged by you. Then Tony might be able to pull all the DTS in one series and thus avoid the various merge conflict that will happen since most OMAP drivers are hacking the same DTS files.
Does that make sense? Or do you think it will be even worst separating the patches?
Unless there's a compile time dependency I don't think we need to refactor anything here, what I'm seeing at the minute looks OK from a merge point of view except that there appears to be a lack of coordination between the various serieses.
On 2/27/2012 3:03 PM, Mark Brown wrote:
On Mon, Feb 27, 2012 at 02:52:05PM +0100, Cousson, Benoit wrote:
On 2/27/2012 2:41 PM, Mark Brown wrote:
On Mon, Feb 27, 2012 at 06:01:20PM +0530, Rajendra Nayak wrote:
Please can you guys come up with a single unified series for this stuff
- I'll hold off on applying anything to allow you to do this.
The issue is that the initial TWL regulator series from Rajendra will depend on the twl core DT support I have that depends on the irq_domain series from Grant...
Really? That's the first I've heard of any such dependency here. Is it a build time dependency or is it just something that's required to make the code actually spring into life? It looks like it's the latter but you're saying there's an actual dependency.
Mmm, it is written in Rajendra's changelog:
"-2- All common regulator nodes for twl4030 and twl6030 are now defined in the twl4030.dtsi and twl6030.dtsi instead of repeating the nodes in all board files, which also means the patch ('arm/dts: twl: Pass regulator data from dt') has a dependency with the series from Benoit which adds the twl4030.dtsi and twl6030.dtsi files[2]."
The good point is that a missing or broken DTS will indeed not break the build, it will just not boot the platform properly. But that still an important dependency to me.
There's also more than that, there's also at least Tero submitting some other stuff separately (and his stuff won't play with DT...) and I think Peter also. It really fees like there's a bunch of people working on different things without talking to each other here.
That's the problem with MFD devices that are doing everything from audio to power including the coffee...
So I guess, it will be easy for us to split the regulator patches from the DTS ones to have at least the driver changes merged by you. Then Tony might be able to pull all the DTS in one series and thus avoid the various merge conflict that will happen since most OMAP drivers are hacking the same DTS files.
Does that make sense? Or do you think it will be even worst separating the patches?
Unless there's a compile time dependency I don't think we need to refactor anything here, what I'm seeing at the minute looks OK from a merge point of view except that there appears to be a lack of coordination between the various serieses.
Fair enough on that point. At least now we have all the stakeholders, so let's do some TI internal laundry.
Regards, Benoit
On Mon, Feb 27, 2012 at 03:21:26PM +0100, Cousson, Benoit wrote:
Mmm, it is written in Rajendra's changelog:
"-2- All common regulator nodes for twl4030 and twl6030 are now defined in the twl4030.dtsi and twl6030.dtsi instead of
Oh, it's buried at the end of a rather verbose inter-patch changelog, that's not exactly visible :(
The good point is that a missing or broken DTS will indeed not break the build, it will just not boot the platform properly. But that still an important dependency to me.
If adding device tree support breaks existing platforms something is going wrong, while you're pulling things together device tree might not work until all the support makes it in but the old non-DT code should continue to function.
There's also more than that, there's also at least Tero submitting some other stuff separately (and his stuff won't play with DT...) and I think Peter also. It really fees like there's a bunch of people working on different things without talking to each other here.
That's the problem with MFD devices that are doing everything from audio to power including the coffee...
Well, in this case everyone's only working on the regulator stuff, or at least only overlapping on that.
The twl drivers aren't helping here - the structure is *very* non-standard and seems to make updates more fiddly than they should be as you're not just adding stuff to tables. Every update seems to need explicit code and per-change data adding which is making life harder. If things looked more standard from a code point of view it'd probably reduce the pain a lot.
On Monday 27 February 2012 08:23 PM, Mark Brown wrote:
If adding device tree support breaks existing platforms something is going wrong, while you're pulling things together device tree might not work until all the support makes it in but the old non-DT code should continue to function.
Adding device tree support will not break existing platforms. The non-DT code will function as expected. The dependencies I mentioned were only with the dtsi/dts files that patch 2 was updating. The driver changes have no dependencies with any other DT series. I will repost all of Tero/Peter and my changes (to add DT support to the driver) as one single series and drop the dts file updates, which I guess can go via Tony/OMAP tree.
On Tue, Feb 28, 2012 at 11:11:48AM +0530, Rajendra Nayak wrote:
changes have no dependencies with any other DT series. I will repost all of Tero/Peter and my changes (to add DT support to the driver) as one single series and drop the dts file updates, which I guess can go via Tony/OMAP tree.
Yes, that sounds like a good plan - the DTS changes are largely orthogonal to the code changes and don't need to go via the same path (this is true in general, the DTSs are pretty horrible for merge issues).
On Mon, Feb 27, 2012 at 6:52 AM, Cousson, Benoit b-cousson@ti.com wrote:
Hi Mark,
On 2/27/2012 2:41 PM, Mark Brown wrote:
On Mon, Feb 27, 2012 at 06:01:20PM +0530, Rajendra Nayak wrote:
Depending on what order Mark happens to pull them in, I am fine re-sending adding support for the 2 twl6030 fixed regulators.
Please can you guys come up with a single unified series for this stuff
- I'll hold off on applying anything to allow you to do this.
The issue is that the initial TWL regulator series from Rajendra will depend on the twl core DT support I have that depends on the irq_domain series from Grant...
If it depends on the irqdomain tree, then just merge that tree into yours. That tree is stable now for exactly that reason. You can rely on it.
git://git.secretlab.ca/git/linux-2.6 irqdomain/next
g.
On 2/27/2012 11:17 PM, Grant Likely wrote:
On Mon, Feb 27, 2012 at 6:52 AM, Cousson, Benoitb-cousson@ti.com wrote:
Hi Mark,
On 2/27/2012 2:41 PM, Mark Brown wrote:
On Mon, Feb 27, 2012 at 06:01:20PM +0530, Rajendra Nayak wrote:
Depending on what order Mark happens to pull them in, I am fine re-sending adding support for the 2 twl6030 fixed regulators.
Please can you guys come up with a single unified series for this stuff
- I'll hold off on applying anything to allow you to do this.
The issue is that the initial TWL regulator series from Rajendra will depend on the twl core DT support I have that depends on the irq_domain series from Grant...
If it depends on the irqdomain tree, then just merge that tree into yours. That tree is stable now for exactly that reason. You can rely on it.
I've just posted a pull request [1] to Tony that will merge your series into an OMAP DT branch to be a base for further OMAP DT series.
Regards, Benoit