Skip to contentSkip to conversation

Arizona Regulator Updates v5

PATCH In review Charles Keepax 3 participants 13 messages Apr 1, 2014 – Apr 16, 2014

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

cover Arizona Regulator Updates v5

Hi,

This series of patches are small fixes/improvements to the Arizona regulators. The main thing added is proper device tree bindings for getting the regulator init_data.

Changes Since v4:
- Added a subnode section in the binding documentation and moved the sub-node documentation into that.

Thanks,
Charles

Charles Keepax (6):
mfd: arizona: Factor out read of device tree GPIOs
regulator: arizona-ldo1: Move setup processing from arizona-core
regulator: arizona-ldo1: Add processing of init_data from device tree
mfd: arizona: Update DT binding to support LDO1 init_data
regulator: arizona-micsupp: Add processing of init_data from device
tree
mfd: arizona: Update DT binding to support MICVDD init_data

 Documentation/devicetree/bindings/mfd/arizona.txt |   10 +++
 drivers/mfd/arizona-core.c                        |   43 +++++++-----
 drivers/regulator/arizona-ldo1.c                  |   73 +++++++++++++++++++++
 drivers/regulator/arizona-micsupp.c               |   53 +++++++++++++++
 include/linux/mfd/arizona/core.h                  |    3 +
 5 files changed, 165 insertions(+), 17 deletions(-)
Signature · 1 line
1.7.2.5
#1 lore raw

PATCH 1/6 mfd: arizona: Factor out read of device tree GPIOs

This patch factors out the reading of GPIOs for the Arizona devices into a helper function.

---
 drivers/mfd/arizona-core.c       |   33 ++++++++++++++++++++++++---------
 include/linux/mfd/arizona/core.h |    3 +++
 2 files changed, 27 insertions(+), 9 deletions(-)
drivers/mfd/arizona-core.c +24 -9
index a45aab9..8ad4373 100644
@@ -512,19 +512,34 @@ int arizona_of_get_type(struct device *dev)
 }
 EXPORT_SYMBOL_GPL(arizona_of_get_type);
 
+int arizona_of_get_named_gpio(struct arizona *arizona, const char *prop,
+			      bool mandatory, int *gpio)
+{
+	int ret;
+
+	ret = of_get_named_gpio(arizona->dev->of_node, prop, 0);
+	*gpio = ret;
+	if (ret >= 0)
+		return ret;
+
+	*gpio = 0;
+
+	if (mandatory)
+		dev_err(arizona->dev,
+			"Mandatory DT gpio %s missing/malformed: %d\n",
+			prop, ret);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(arizona_of_get_named_gpio);
+
 static int arizona_of_get_core_pdata(struct arizona *arizona)
 {
+	struct arizona_pdata *pdata = &arizona->pdata;
 	int ret, i;
 
-	arizona->pdata.reset = of_get_named_gpio(arizona->dev->of_node,
-						 "wlf,reset", 0);
-	if (arizona->pdata.reset < 0)
-		arizona->pdata.reset = 0;
-
-	arizona->pdata.ldoena = of_get_named_gpio(arizona->dev->of_node,
-						  "wlf,ldoena", 0);
-	if (arizona->pdata.ldoena < 0)
-		arizona->pdata.ldoena = 0;
+	arizona_of_get_named_gpio(arizona, "wlf,reset", true, &pdata->reset);
+	arizona_of_get_named_gpio(arizona, "wlf,ldoena", true, &pdata->ldoena);
 
 	ret = of_property_read_u32_array(arizona->dev->of_node,
 					 "wlf,gpio-defaults",
include/linux/mfd/arizona/core.h +3 -0
index 5cf8b91..16150cc 100644
@@ -124,4 +124,7 @@ int wm5102_patch(struct arizona *arizona);
 int wm5110_patch(struct arizona *arizona);
 int wm8997_patch(struct arizona *arizona);
 
+extern int arizona_of_get_named_gpio(struct arizona *arizona, const char *prop,
+				     bool mandatory, int *gpio);
+
 #endif
Signature · 1 line
1.7.2.5
#2 lore raw

Re: [PATCH 1/6] mfd: arizona: Factor out read of device tree GPIOs

Quoted 26 lines · Charles Keepax

This patch factors out the reading of GPIOs for the Arizona devices into a helper function.

---
 drivers/mfd/arizona-core.c       |   33 ++++++++++++++++++++++++---------
 include/linux/mfd/arizona/core.h |    3 +++
 2 files changed, 27 insertions(+), 9 deletions(-)
drivers/mfd/arizona-core.c +9 -0
index a45aab9..8ad4373 100644
@@ -512,19 +512,34 @@ int arizona_of_get_type(struct device *dev)
 }
 EXPORT_SYMBOL_GPL(arizona_of_get_type);
 
+int arizona_of_get_named_gpio(struct arizona *arizona, const char *prop,
+			      bool mandatory, int *gpio)
+{
+	int ret;
+
+	ret = of_get_named_gpio(arizona->dev->of_node, prop, 0);
+	*gpio = ret;
+	if (ret >= 0)
+		return ret;

drivers/mfd/arizona-core.c int arizona_of_get_type(struct device *dev) · line 533

Quoted 10 lines
drivers/mfd/arizona-core.c +10 -0
+
+	*gpio = 0;
+
+	if (mandatory)
+		dev_err(arizona->dev,
+			"Mandatory DT gpio %s missing/malformed: %d\n",
+			prop, ret);
+
+	return ret;
+}

Hmm.. me no likey!

How about:

+void arizona_of_get_named_gpio(struct arizona *arizona, const char *prop,
+ bool mandatory, int *gpio)
+{
+ *gpio = of_get_named_gpio(arizona->dev->of_node, prop, 0);
+ if (*gpio < 0) {
+ if (mandatory)
+ dev_err(arizona->dev,
+ "Mandatory DT gpio %s missing/malformed: %d\n",
+ prop, *gpio);
+ *gpio = 0;
+ }
+}

drivers/mfd/arizona-core.c int arizona_of_get_type(struct device *dev) · line 535

Quoted 2 lines
drivers/mfd/arizona-core.c +2 -0
+EXPORT_SYMBOL_GPL(arizona_of_get_named_gpio);
+

Are you sure you're going to use this externally?

NB: I haven't looked at the remainder of the set yet.

Quoted 6 lines
drivers/mfd/arizona-core.c +1 -1
 static int arizona_of_get_core_pdata(struct arizona *arizona)
 {
+	struct arizona_pdata *pdata = &arizona->pdata;
 	int ret, i;
 
-	arizona->pdata.reset = of_get_named_gpio(arizona->dev->of_node,

drivers/mfd/arizona-core.c int arizona_of_get_type(struct device *dev) · line 542

Quoted 10 lines
drivers/mfd/arizona-core.c +2 -8
-						 "wlf,reset", 0);
-	if (arizona->pdata.reset < 0)
-		arizona->pdata.reset = 0;
-
-	arizona->pdata.ldoena = of_get_named_gpio(arizona->dev->of_node,
-						  "wlf,ldoena", 0);
-	if (arizona->pdata.ldoena < 0)
-		arizona->pdata.ldoena = 0;
+	arizona_of_get_named_gpio(arizona, "wlf,reset", true, &pdata->reset);
+	arizona_of_get_named_gpio(arizona, "wlf,ldoena", true, &pdata->ldoena);

I guess this pdata is populated by DT?

Signature · 4 lines
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
#3 lore raw

Re: [PATCH 1/6] mfd: arizona: Factor out read of device tree GPIOs

Quoted 45 lines · Lee Jones
Quoted 26 lines · Charles Keepax

This patch factors out the reading of GPIOs for the Arizona devices into a helper function.

---
 drivers/mfd/arizona-core.c       |   33 ++++++++++++++++++++++++---------
 include/linux/mfd/arizona/core.h |    3 +++
 2 files changed, 27 insertions(+), 9 deletions(-)
drivers/mfd/arizona-core.c +9 -0
index a45aab9..8ad4373 100644
@@ -512,19 +512,34 @@ int arizona_of_get_type(struct device *dev)
 }
 EXPORT_SYMBOL_GPL(arizona_of_get_type);
 
+int arizona_of_get_named_gpio(struct arizona *arizona, const char *prop,
+			      bool mandatory, int *gpio)
+{
+	int ret;
+
+	ret = of_get_named_gpio(arizona->dev->of_node, prop, 0);
+	*gpio = ret;
+	if (ret >= 0)
+		return ret;

drivers/mfd/arizona-core.c int arizona_of_get_type(struct device *dev) · line 533

Quoted 10 lines
drivers/mfd/arizona-core.c +10 -0
+
+	*gpio = 0;
+
+	if (mandatory)
+		dev_err(arizona->dev,
+			"Mandatory DT gpio %s missing/malformed: %d\n",
+			prop, ret);
+
+	return ret;
+}

Hmm.. me no likey!

How about:

drivers/mfd/arizona-core.c +2 -0
+void arizona_of_get_named_gpio(struct arizona *arizona, const char *prop,
+				bool mandatory, int *gpio)

drivers/mfd/arizona-core.c int arizona_of_get_type(struct device *dev)

Quoted 10 lines
drivers/mfd/arizona-core.c +10 -0
+{
+	*gpio = of_get_named_gpio(arizona->dev->of_node, prop, 0);
+	if (*gpio < 0) {
+	 	if (mandatory)
+			dev_err(arizona->dev,
+				"Mandatory DT gpio %s missing/malformed: %d\n",
+				prop, *gpio);
+		*gpio = 0;
+	}
+}

Indeed that is nicer I will respin and change it.

Quoted 7 lines

drivers/mfd/arizona-core.c int arizona_of_get_type(struct device *dev) · line 535

Quoted 3 lines
drivers/mfd/arizona-core.c +2 -0
+EXPORT_SYMBOL_GPL(arizona_of_get_named_gpio);
+

Are you sure you're going to use this externally?

NB: I haven't looked at the remainder of the set yet.

Yeah we move the ldoena gpio into the LDO driver, and later we will be adding a polarity GPIO into the extcon driver.

Quoted 6 lines
Quoted 6 lines
drivers/mfd/arizona-core.c +1 -0
 static int arizona_of_get_core_pdata(struct arizona *arizona)
 {
+	struct arizona_pdata *pdata = &arizona->pdata;
 	int ret, i;
 
Quoted 13 lines

drivers/mfd/arizona-core.c int arizona_of_get_type(struct device *dev) · line 542

Quoted 11 lines
drivers/mfd/arizona-core.c +2 -9
-	arizona->pdata.reset = of_get_named_gpio(arizona->dev->of_node,
-						 "wlf,reset", 0);
-	if (arizona->pdata.reset < 0)
-		arizona->pdata.reset = 0;
-
-	arizona->pdata.ldoena = of_get_named_gpio(arizona->dev->of_node,
-						  "wlf,ldoena", 0);
-	if (arizona->pdata.ldoena < 0)
-		arizona->pdata.ldoena = 0;
+	arizona_of_get_named_gpio(arizona, "wlf,reset", true, &pdata->reset);
+	arizona_of_get_named_gpio(arizona, "wlf,ldoena", true, &pdata->ldoena);

I guess this pdata is populated by DT?

Yeah that is correct, the Arizona driver populates the pdata from the DT then the rest of the driver just uses the pdata in both DT and pdata cases.

Thanks,
Charles
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html

#4 lore raw

Re: [PATCH 1/6] mfd: arizona: Factor out read of device tree GPIOs

Quoted 8 lines
Quoted 8 lines
Quoted 8 lines

This patch factors out the reading of GPIOs for the Arizona devices into a helper function.

---
 drivers/mfd/arizona-core.c       |   33 ++++++++++++++++++++++++---------
 include/linux/mfd/arizona/core.h |    3 +++
 2 files changed, 27 insertions(+), 9 deletions(-)

[...]

Quoted 9 lines
Quoted 6 lines

drivers/mfd/arizona-core.c int arizona_of_get_type(struct device *dev) · line 535

Quoted 2 lines
drivers/mfd/arizona-core.c +2 -0
+EXPORT_SYMBOL_GPL(arizona_of_get_named_gpio);
+

Are you sure you're going to use this externally?

NB: I haven't looked at the remainder of the set yet.

Yeah we move the ldoena gpio into the LDO driver, and later we will be adding a polarity GPIO into the extcon driver.

Okay, just checking.

Quoted 19 lines
Quoted 5 lines
Quoted 5 lines

static int arizona_of_get_core_pdata(struct arizona *arizona) {

drivers/mfd/arizona-core.c +1 -0
+	struct arizona_pdata *pdata = &arizona->pdata;
 	int ret, i;
Quoted 13 lines

drivers/mfd/arizona-core.c int arizona_of_get_type(struct device *dev) · line 542

Quoted 11 lines
drivers/mfd/arizona-core.c +2 -9
-	arizona->pdata.reset = of_get_named_gpio(arizona->dev->of_node,
-						 "wlf,reset", 0);
-	if (arizona->pdata.reset < 0)
-		arizona->pdata.reset = 0;
-
-	arizona->pdata.ldoena = of_get_named_gpio(arizona->dev->of_node,
-						  "wlf,ldoena", 0);
-	if (arizona->pdata.ldoena < 0)
-		arizona->pdata.ldoena = 0;
+	arizona_of_get_named_gpio(arizona, "wlf,reset", true, &pdata->reset);
+	arizona_of_get_named_gpio(arizona, "wlf,ldoena", true, &pdata->ldoena);

I guess this pdata is populated by DT?

Quoted 3 lines

Yeah that is correct, the Arizona driver populates the pdata from the DT then the rest of the driver just uses the pdata in both DT and pdata cases.

Sounds ugly when you put it like that, but I know that a _lot_ of other drivers do the same thing.

Signature · 8 lines
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#5 lore raw

PATCH 2/6 regulator: arizona-ldo1: Move setup processing from arizona-core

In reply to Charles Keepax

It is more idiomatic to process things relating to the regulator in its driver. This patch moves both processing of device tree relating to the regulator and checking if the regulator is external from arizona-core into the regulator driver.

---
 drivers/mfd/arizona-core.c       |   12 +++---------
 drivers/regulator/arizona-ldo1.c |   32 ++++++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 9 deletions(-)
drivers/mfd/arizona-core.c +3 -9
index 8ad4373..0096261 100644
@@ -539,7 +539,6 @@ static int arizona_of_get_core_pdata(struct arizona *arizona)
 	int ret, i;
 
 	arizona_of_get_named_gpio(arizona, "wlf,reset", true, &pdata->reset);
-	arizona_of_get_named_gpio(arizona, "wlf,ldoena", true, &pdata->ldoena);
 
 	ret = of_property_read_u32_array(arizona->dev->of_node,
 					 "wlf,gpio-defaults",
@@ -671,6 +670,9 @@ int arizona_dev_init(struct arizona *arizona)
 		return -EINVAL;
 	}
 
+	/* Mark DCVDD as external, LDO1 driver will clear if internal */
+	arizona->external_dcvdd = true;
+
 	ret = mfd_add_devices(arizona->dev, -1, early_devs,
 			      ARRAY_SIZE(early_devs), NULL, 0, NULL);
 	if (ret != 0) {
@@ -870,14 +872,6 @@ int arizona_dev_init(struct arizona *arizona)
 			     arizona->pdata.gpio_defaults[i]);
 	}
 
-	/*
-	 * LDO1 can only be used to supply DCVDD so if it has no
-	 * consumers then DCVDD is supplied externally.
-	 */
-	if (arizona->pdata.ldo1 &&
-	    arizona->pdata.ldo1->num_consumer_supplies == 0)
-		arizona->external_dcvdd = true;
-
 	pm_runtime_set_autosuspend_delay(arizona->dev, 100);
 	pm_runtime_use_autosuspend(arizona->dev);
 	pm_runtime_enable(arizona->dev);
drivers/regulator/arizona-ldo1.c +32 -0
index b1033d3..211af83 100644
@@ -178,6 +178,22 @@ static const struct regulator_init_data arizona_ldo1_default = {
 	.num_consumer_supplies = 1,
 };
 
+#ifdef CONFIG_OF
+static int arizona_ldo1_of_get_pdata(struct arizona *arizona)
+{
+	struct arizona_pdata *pdata = &arizona->pdata;
+
+	arizona_of_get_named_gpio(arizona, "wlf,ldoena", true, &pdata->ldoena);
+
+	return 0;
+}
+#else
+static inline int arizona_ldo1_of_get_pdata(struct arizona *arizona)
+{
+	return 0;
+}
+#endif
+
 static int arizona_ldo1_probe(struct platform_device *pdev)
 {
 	struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
@@ -186,6 +202,8 @@ static int arizona_ldo1_probe(struct platform_device *pdev)
 	struct arizona_ldo1 *ldo1;
 	int ret;
 
+	arizona->external_dcvdd = false;
+
 	ldo1 = devm_kzalloc(&pdev->dev, sizeof(*ldo1), GFP_KERNEL);
 	if (!ldo1)
 		return -ENOMEM;
@@ -216,6 +234,13 @@ static int arizona_ldo1_probe(struct platform_device *pdev)
 	config.dev = arizona->dev;
 	config.driver_data = ldo1;
 	config.regmap = arizona->regmap;
+
+	if (!dev_get_platdata(arizona->dev)) {
+		ret = arizona_ldo1_of_get_pdata(arizona);
+		if (ret < 0)
+			return ret;
+	}
+
 	config.ena_gpio = arizona->pdata.ldoena;
 
 	if (arizona->pdata.ldo1)
@@ -223,6 +248,13 @@ static int arizona_ldo1_probe(struct platform_device *pdev)
 	else
 		config.init_data = &ldo1->init_data;
 
+	/*
+	 * LDO1 can only be used to supply DCVDD so if it has no
+	 * consumers then DCVDD is supplied externally.
+	 */
+	if (config.init_data->num_consumer_supplies == 0)
+		arizona->external_dcvdd = true;
+
 	ldo1->regulator = devm_regulator_register(&pdev->dev, desc, &config);
 	if (IS_ERR(ldo1->regulator)) {
 		ret = PTR_ERR(ldo1->regulator);
Signature · 1 line
1.7.2.5
Acked-by on v1 2/6
#6 lore raw

Re: [PATCH 2/6] regulator: arizona-ldo1: Move setup processing from arizona-core

Quoted 10 lines · Charles Keepax

It is more idiomatic to process things relating to the regulator in its driver. This patch moves both processing of device tree relating to the regulator and checking if the regulator is external from arizona-core into the regulator driver.

---
 drivers/mfd/arizona-core.c       |   12 +++---------
 drivers/regulator/arizona-ldo1.c |   32 ++++++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 9 deletions(-)

[...]

Quoted 14 lines
drivers/regulator/arizona-ldo1.c +6 -0
index b1033d3..211af83 100644
@@ -178,6 +178,22 @@ static const struct regulator_init_data arizona_ldo1_default = {
 	.num_consumer_supplies = 1,
 };
 
+#ifdef CONFIG_OF
+static int arizona_ldo1_of_get_pdata(struct arizona *arizona)
+{
+	struct arizona_pdata *pdata = &arizona->pdata;
+
+	arizona_of_get_named_gpio(arizona, "wlf,ldoena", true, &pdata->ldoena);

drivers/regulator/arizona-ldo1.c static const struct regulator_init_data arizona_ldo1_default = { · line 196

Quoted 10 lines
drivers/regulator/arizona-ldo1.c +10 -0
+
+	return 0;
+}
+#else
+static inline int arizona_ldo1_of_get_pdata(struct arizona *arizona)
+{
+	return 0;
+}
+#endif
+

I think "if (IS_ENABLED(CONFIG_OF))" is preferred now, but I guess that's up to Mark.

Quoted 13 lines
drivers/regulator/arizona-ldo1.c +2 -0
 static int arizona_ldo1_probe(struct platform_device *pdev)
 {
 	struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
@@ -186,6 +202,8 @@ static int arizona_ldo1_probe(struct platform_device *pdev)
 	struct arizona_ldo1 *ldo1;
 	int ret;
 
+	arizona->external_dcvdd = false;
+
 	ldo1 = devm_kzalloc(&pdev->dev, sizeof(*ldo1), GFP_KERNEL);
 	if (!ldo1)
 		return -ENOMEM;

drivers/regulator/arizona-ldo1.c static int arizona_ldo1_probe(struct platform_device *pdev) · line 238

Quoted 5 lines
drivers/regulator/arizona-ldo1.c +2 -0
@@ -216,6 +234,13 @@ static int arizona_ldo1_probe(struct platform_device *pdev)
 	config.dev = arizona->dev;
 	config.driver_data = ldo1;
 	config.regmap = arizona->regmap;
+
+	if (!dev_get_platdata(arizona->dev)) {

Here ^

drivers/regulator/arizona-ldo1.c static int arizona_ldo1_probe(struct platform_device *pdev) · line 243

Quoted 5 lines
drivers/regulator/arizona-ldo1.c +5 -0
+		ret = arizona_ldo1_of_get_pdata(arizona);
+		if (ret < 0)
+			return ret;
+	}
+

For the MFD changes:

Mark,
Post acceptance, I'd prefer to create an IB for this patch-set.

Signature · 8 lines
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
maintainer
#7 lore raw

Re: [PATCH 2/6] regulator: arizona-ldo1: Move setup processing from arizona-core

Quoted 6 lines · Lee Jones
Quoted 1 line · Charles Keepax

+#ifdef CONFIG_OF

I think "if (IS_ENABLED(CONFIG_OF))" is preferred now, but I guess that's up to Mark.

Yes, it doesn't matter for booleans though.

#8 lore raw

Re: [PATCH 2/6] regulator: arizona-ldo1: Move setup processing from arizona-core

In reply to Lee Jones
Quoted 34 lines · Lee Jones
Quoted 10 lines · Charles Keepax

It is more idiomatic to process things relating to the regulator in its driver. This patch moves both processing of device tree relating to the regulator and checking if the regulator is external from arizona-core into the regulator driver.

---
 drivers/mfd/arizona-core.c       |   12 +++---------
 drivers/regulator/arizona-ldo1.c |   32 ++++++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 9 deletions(-)

[...]

Quoted 19 lines
drivers/regulator/arizona-ldo1.c +11 -0
index b1033d3..211af83 100644
@@ -178,6 +178,22 @@ static const struct regulator_init_data arizona_ldo1_default = {
 	.num_consumer_supplies = 1,
 };
 
+#ifdef CONFIG_OF
+static int arizona_ldo1_of_get_pdata(struct arizona *arizona)
+{
+	struct arizona_pdata *pdata = &arizona->pdata;
+
+	arizona_of_get_named_gpio(arizona, "wlf,ldoena", true, &pdata->ldoena);
+
+	return 0;
+}
+#else
+static inline int arizona_ldo1_of_get_pdata(struct arizona *arizona)
Quoted 8 lines

drivers/regulator/arizona-ldo1.c static const struct regulator_init_data arizona_ldo1_default = { · line 196

Quoted 5 lines
drivers/regulator/arizona-ldo1.c +5 -0
+{
+	return 0;
+}
+#endif
+

I think "if (IS_ENABLED(CONFIG_OF))" is preferred now, but I guess that's up to Mark.

I am happy to respin if this is preferred.

Thanks,
Charles

#9 lore raw

PATCH 3/6 regulator: arizona-ldo1: Add processing of init_data from device tree

In reply to Charles Keepax
---
 drivers/regulator/arizona-ldo1.c |   47 +++++++++++++++++++++++++++++++++++--
 1 files changed, 44 insertions(+), 3 deletions(-)
drivers/regulator/arizona-ldo1.c +44 -3
index 211af83..e23a95f 100644
@@ -19,6 +19,7 @@
 #include <linux/platform_device.h>
 #include <linux/regulator/driver.h>
 #include <linux/regulator/machine.h>
+#include <linux/regulator/of_regulator.h>
 #include <linux/gpio.h>
 #include <linux/slab.h>
 
@@ -179,19 +180,56 @@ static const struct regulator_init_data arizona_ldo1_default = {
 };
 
 #ifdef CONFIG_OF
-static int arizona_ldo1_of_get_pdata(struct arizona *arizona)
+static int arizona_ldo1_of_get_pdata(struct arizona *arizona,
+				     struct regulator_config *config)
 {
 	struct arizona_pdata *pdata = &arizona->pdata;
+	struct arizona_ldo1 *ldo1 = config->driver_data;
+	struct device_node *init_node, *dcvdd_node;
+	struct regulator_init_data *init_data;
 
 	arizona_of_get_named_gpio(arizona, "wlf,ldoena", true, &pdata->ldoena);
 
+	init_node = of_get_child_by_name(arizona->dev->of_node, "ldo1");
+	dcvdd_node = of_parse_phandle(arizona->dev->of_node, "DCVDD-supply", 0);
+
+	if (init_node) {
+		config->of_node = init_node;
+
+		init_data = of_get_regulator_init_data(arizona->dev, init_node);
+
+		if (init_data) {
+			init_data->consumer_supplies = &ldo1->supply;
+			init_data->num_consumer_supplies = 1;
+
+			if (dcvdd_node && dcvdd_node != init_node)
+				arizona->external_dcvdd = true;
+
+			pdata->ldo1 = init_data;
+		}
+	} else if (dcvdd_node) {
+		arizona->external_dcvdd = true;
+	}
+
+	of_node_put(dcvdd_node);
+
 	return 0;
 }
+
+static void arizona_ldo1_of_put_pdata(struct regulator_config *config)
+{
+	of_node_put(config->of_node);
+}
 #else
-static inline int arizona_ldo1_of_get_pdata(struct arizona *arizona)
+static inline int arizona_ldo1_of_get_pdata(struct arizona *arizona,
+					    struct regulator_config *config)
 {
 	return 0;
 }
+
+static inline void arizona_ldo1_of_put_pdata(struct regulator_config *config)
+{
+}
 #endif
 
 static int arizona_ldo1_probe(struct platform_device *pdev)
@@ -236,7 +274,7 @@ static int arizona_ldo1_probe(struct platform_device *pdev)
 	config.regmap = arizona->regmap;
 
 	if (!dev_get_platdata(arizona->dev)) {
-		ret = arizona_ldo1_of_get_pdata(arizona);
+		ret = arizona_ldo1_of_get_pdata(arizona, &config);
 		if (ret < 0)
 			return ret;
 	}
@@ -263,6 +301,9 @@ static int arizona_ldo1_probe(struct platform_device *pdev)
 		return ret;
 	}
 
+	if (!dev_get_platdata(arizona->dev))
+		arizona_ldo1_of_put_pdata(&config);
+
 	platform_set_drvdata(pdev, ldo1);
 
 	return 0;
Signature · 6 lines
1.7.2.5

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#10 lore raw

PATCH 4/6 mfd: arizona: Update DT binding to support LDO1 init_data

In reply to Charles Keepax
---
 Documentation/devicetree/bindings/mfd/arizona.txt |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)
Documentation/devicetree/bindings/mfd/arizona.txt +8 -0
index 0e295c9..aa16489 100644
@@ -40,6 +40,14 @@ Optional properties:
     the chip default will be used.  If present exactly five values must
     be specified.
 
+  - DCVDD-supply : Power supply, only needs to be specified if DCVDD is being
+    externally supplied. As covered in
+    Documentation/devicetree/bindings/regulator/regulator.txt
+
+Optional subnodes:
+  - ldo1 : Initial data for the LDO1 regulator, as covered in
+    Documentation/devicetree/bindings/regulator/regulator.txt
+
 Example:
 
 codec: wm5102@1a {
Signature · 1 line
1.7.2.5
#11 lore raw

PATCH 5/6 regulator: arizona-micsupp: Add processing of init_data from device tree

In reply to Charles Keepax
---
 drivers/regulator/arizona-micsupp.c |   53 +++++++++++++++++++++++++++++++++++
 1 files changed, 53 insertions(+), 0 deletions(-)
drivers/regulator/arizona-micsupp.c +53 -0
index 6fdd9bf..5225470 100644
@@ -19,6 +19,7 @@
 #include <linux/platform_device.h>
 #include <linux/regulator/driver.h>
 #include <linux/regulator/machine.h>
+#include <linux/regulator/of_regulator.h>
 #include <linux/gpio.h>
 #include <linux/slab.h>
 #include <linux/workqueue.h>
@@ -195,6 +196,49 @@ static const struct regulator_init_data arizona_micsupp_ext_default = {
 	.num_consumer_supplies = 1,
 };
 
+#ifdef CONFIG_OF
+static int arizona_micsupp_of_get_pdata(struct arizona *arizona,
+					struct regulator_config *config)
+{
+	struct arizona_pdata *pdata = &arizona->pdata;
+	struct arizona_micsupp *micsupp = config->driver_data;
+	struct device_node *np;
+	struct regulator_init_data *init_data;
+
+	np = of_get_child_by_name(arizona->dev->of_node, "micvdd");
+
+	if (np) {
+		config->of_node = np;
+
+		init_data = of_get_regulator_init_data(arizona->dev, np);
+
+		if (init_data) {
+			init_data->consumer_supplies = &micsupp->supply;
+			init_data->num_consumer_supplies = 1;
+
+			pdata->micvdd = init_data;
+		}
+	}
+
+	return 0;
+}
+
+static void arizona_micsupp_of_put_pdata(struct regulator_config *config)
+{
+	of_node_put(config->of_node);
+}
+#else
+static inline int arizona_micsupp_of_get_pdata(struct arizona *arizona,
+					       struct regulator_config *config)
+{
+	return 0;
+}
+
+static inline void arizona_micsupp_of_put_pdata(struct regulator_config *config)
+{
+}
+#endif
+
 static int arizona_micsupp_probe(struct platform_device *pdev)
 {
 	struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
@@ -234,6 +278,12 @@ static int arizona_micsupp_probe(struct platform_device *pdev)
 	config.driver_data = micsupp;
 	config.regmap = arizona->regmap;
 
+	if (!dev_get_platdata(arizona->dev)) {
+		ret = arizona_micsupp_of_get_pdata(arizona, &config);
+		if (ret < 0)
+			return ret;
+	}
+
 	if (arizona->pdata.micvdd)
 		config.init_data = arizona->pdata.micvdd;
 	else
@@ -253,6 +303,9 @@ static int arizona_micsupp_probe(struct platform_device *pdev)
 		return ret;
 	}
 
+	if (!dev_get_platdata(arizona->dev))
+		arizona_micsupp_of_put_pdata(&config);
+
 	platform_set_drvdata(pdev, micsupp);
 
 	return 0;
Signature · 1 line
1.7.2.5
#12 lore raw

PATCH 6/6 mfd: arizona: Update DT binding to support MICVDD init_data

In reply to Charles Keepax
---
 Documentation/devicetree/bindings/mfd/arizona.txt |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)
Documentation/devicetree/bindings/mfd/arizona.txt +4 -2
index aa16489..10f87a29 100644
@@ -40,13 +40,15 @@ Optional properties:
     the chip default will be used.  If present exactly five values must
     be specified.
 
-  - DCVDD-supply : Power supply, only needs to be specified if DCVDD is being
-    externally supplied. As covered in
+  - DCVDD-supply, MICVDD-supply : Power supplies, only need to be specified if
+    they are being externally supplied. As covered in
     Documentation/devicetree/bindings/regulator/regulator.txt
 
 Optional subnodes:
   - ldo1 : Initial data for the LDO1 regulator, as covered in
     Documentation/devicetree/bindings/regulator/regulator.txt
+  - micvdd : Initial data for the MICVDD regulator, as covered in
+    Documentation/devicetree/bindings/regulator/regulator.txt
 
 Example:
 
Signature · 1 line
1.7.2.5