* [PATCH 0/4] Add device tree support for mc13892 regulator driver @ 2011-12-01 9:21 Shawn Guo [not found] ` <1322731268-12158-1-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 0 siblings, 1 reply; 18+ messages in thread From: Shawn Guo @ 2011-12-01 9:21 UTC (permalink / raw) To: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Cc: Samuel Ortiz, Sascha Hauer, Mark Brown, Uwe Kleine-König, Liam Girdwood Changes since v1: * Drop '[PATCH 2/5] regulator: fix label names used in device tree bindings' which has been picked up * Add binding document for mfd/mc13xxx-core device tree support * Fix regulator/fixed.c breakage caused by interface change on of_get_regulator_init_data() * Reword the commit message of patch #2 a little bit to make the reason for changing clear * Retrieve the irq from gpio irq domain Shawn Guo (4): mfd: mc13xxx: add device tree probe support regulator: pass device_node to of_get_regulator_init_data() regulator: mc13892: add device tree probe support arm/imx: add mc13892 support into imx51-babbage.dts Documentation/devicetree/bindings/mfd/mc13xxx.txt | 50 ++++++++++ arch/arm/boot/dts/imx51-babbage.dts | 103 ++++++++++++++++++++- drivers/mfd/mc13xxx-core.c | 106 +++++++++++++++------ drivers/regulator/fixed.c | 2 +- drivers/regulator/mc13892-regulator.c | 43 ++++++-- drivers/regulator/mc13xxx-regulator-core.c | 57 +++++++++++ drivers/regulator/mc13xxx.h | 20 ++++ drivers/regulator/of_regulator.c | 7 +- include/linux/mfd/mc13xxx.h | 1 + include/linux/regulator/of_regulator.h | 6 +- 10 files changed, 345 insertions(+), 50 deletions(-) ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <1322731268-12158-1-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>]
* [PATCH v2 1/4] mfd: mc13xxx: add device tree probe support [not found] ` <1322731268-12158-1-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> @ 2011-12-01 9:21 ` Shawn Guo [not found] ` <1322731268-12158-2-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2011-12-01 9:21 ` [PATCH v2 2/4] regulator: pass device_node to of_get_regulator_init_data() Shawn Guo ` (2 subsequent siblings) 3 siblings, 1 reply; 18+ messages in thread From: Shawn Guo @ 2011-12-01 9:21 UTC (permalink / raw) To: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Cc: Samuel Ortiz, Sascha Hauer, Mark Brown, Uwe Kleine-König, Liam Girdwood It adds device tree probe support for mc13xxx mfd driver. Signed-off-by: Shawn Guo <shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> Cc: Samuel Ortiz <sameo-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> --- Documentation/devicetree/bindings/mfd/mc13xxx.txt | 50 ++++++++++ drivers/mfd/mc13xxx-core.c | 106 +++++++++++++++------ 2 files changed, 125 insertions(+), 31 deletions(-) create mode 100644 Documentation/devicetree/bindings/mfd/mc13xxx.txt diff --git a/Documentation/devicetree/bindings/mfd/mc13xxx.txt b/Documentation/devicetree/bindings/mfd/mc13xxx.txt new file mode 100644 index 0000000..67f1718 --- /dev/null +++ b/Documentation/devicetree/bindings/mfd/mc13xxx.txt @@ -0,0 +1,50 @@ +* Freescale MC13783/MC13892 Power Management Integrated Circuit (PMIC) + +Required properties: +- compatible : Should be "fsl,mc13783" or "fsl,mc13892" + +Optional properties: +- fsl,mc13xxx-uses-adc : Indicate the ADC is being used +- fsl,mc13xxx-uses-codec : Indicate the Audio Codec is being used +- fsl,mc13xxx-uses-rtc : Indicate the RTC is being used +- fsl,mc13xxx-uses-touch : Indicate the touchscreen controller is being used + +Sub-nodes: +- regulators : Contain the regulator nodes. The bindings details of individual + regulator node can be found in: + Documentation/devicetree/bindings/regulator/regulator.txt + +Examples: + +ecspi@70010000 { /* ECSPI1 */ + fsl,spi-num-chipselects = <2>; + cs-gpios = <&gpio3 24 0>, /* GPIO4_24 */ + <&gpio3 25 0>; /* GPIO4_25 */ + status = "okay"; + + pmic: mc13892@0 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,mc13892"; + spi-max-frequency = <6000000>; + reg = <0>; + interrupt-parent = <&gpio0>; + interrupts = <8>; + + regulators { + sw1_reg: mc13892__sw1 { + regulator-min-microvolt = <600000>; + regulator-max-microvolt = <1375000>; + regulator-boot-on; + regulator-always-on; + }; + + sw2_reg: mc13892__sw2 { + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <1850000>; + regulator-boot-on; + regulator-always-on; + }; + }; + }; +}; diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c index e9619ac..51b2dcc 100644 --- a/drivers/mfd/mc13xxx-core.c +++ b/drivers/mfd/mc13xxx-core.c @@ -18,11 +18,15 @@ #include <linux/spi/spi.h> #include <linux/mfd/core.h> #include <linux/mfd/mc13xxx.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/of_gpio.h> struct mc13xxx { struct spi_device *spidev; struct mutex lock; int irq; + int flags; irq_handler_t irqhandler[MC13XXX_NUM_IRQ]; void *irqdata[MC13XXX_NUM_IRQ]; @@ -550,10 +554,7 @@ static const char *mc13xxx_get_chipname(struct mc13xxx *mc13xxx) int mc13xxx_get_flags(struct mc13xxx *mc13xxx) { - struct mc13xxx_platform_data *pdata = - dev_get_platdata(&mc13xxx->spidev->dev); - - return pdata->flags; + return mc13xxx->flags; } EXPORT_SYMBOL(mc13xxx_get_flags); @@ -696,17 +697,67 @@ static int mc13xxx_add_subdevice(struct mc13xxx *mc13xxx, const char *format) return mc13xxx_add_subdevice_pdata(mc13xxx, format, NULL, 0); } +#ifdef CONFIG_OF +static int mc13xxx_probe_flags_dt(struct mc13xxx *mc13xxx) +{ + struct device_node *np = mc13xxx->spidev->dev.of_node; + + if (!np) + return -ENODEV; + + if (of_get_property(np, "fsl,mc13xxx-uses-adc", NULL)) + mc13xxx->flags |= MC13XXX_USE_ADC; + + if (of_get_property(np, "fsl,mc13xxx-uses-codec", NULL)) + mc13xxx->flags |= MC13XXX_USE_CODEC; + + if (of_get_property(np, "fsl,mc13xxx-uses-rtc", NULL)) + mc13xxx->flags |= MC13XXX_USE_RTC; + + if (of_get_property(np, "fsl,mc13xxx-uses-touch", NULL)) + mc13xxx->flags |= MC13XXX_USE_TOUCHSCREEN; + + return 0; +} +#else +static inline int mc13xxx_probe_flags_dt(struct mc13xxx *mc13xxx) +{ + return -ENODEV; +} +#endif + +static const struct spi_device_id mc13xxx_device_id[] = { + { + .name = "mc13783", + .driver_data = MC13XXX_ID_MC13783, + }, { + .name = "mc13892", + .driver_data = MC13XXX_ID_MC13892, + }, { + /* sentinel */ + } +}; +MODULE_DEVICE_TABLE(spi, mc13xxx_device_id); + +static const struct of_device_id mc13xxx_dt_ids[] = { + { .compatible = "fsl,mc13783", .data = (void *) MC13XXX_ID_MC13783, }, + { .compatible = "fsl,mc13892", .data = (void *) MC13XXX_ID_MC13892, }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, mc13xxx_dt_ids); + static int mc13xxx_probe(struct spi_device *spi) { + const struct of_device_id *of_id; + struct spi_driver *sdrv = to_spi_driver(spi->dev.driver); struct mc13xxx *mc13xxx; struct mc13xxx_platform_data *pdata = dev_get_platdata(&spi->dev); enum mc13xxx_id id; int ret; - if (!pdata) { - dev_err(&spi->dev, "invalid platform data\n"); - return -EINVAL; - } + of_id = of_match_device(mc13xxx_dt_ids, &spi->dev); + if (of_id) + sdrv->id_table = &mc13xxx_device_id[(enum mc13xxx_id) of_id->data]; mc13xxx = kzalloc(sizeof(*mc13xxx), GFP_KERNEL); if (!mc13xxx) @@ -749,28 +800,33 @@ err_revision: mc13xxx_unlock(mc13xxx); - if (pdata->flags & MC13XXX_USE_ADC) + if (mc13xxx_probe_flags_dt(mc13xxx) < 0 && pdata) + mc13xxx->flags = pdata->flags; + + if (mc13xxx->flags & MC13XXX_USE_ADC) mc13xxx_add_subdevice(mc13xxx, "%s-adc"); - if (pdata->flags & MC13XXX_USE_CODEC) + if (mc13xxx->flags & MC13XXX_USE_CODEC) mc13xxx_add_subdevice(mc13xxx, "%s-codec"); - mc13xxx_add_subdevice_pdata(mc13xxx, "%s-regulator", - &pdata->regulators, sizeof(pdata->regulators)); - - if (pdata->flags & MC13XXX_USE_RTC) + if (mc13xxx->flags & MC13XXX_USE_RTC) mc13xxx_add_subdevice(mc13xxx, "%s-rtc"); - if (pdata->flags & MC13XXX_USE_TOUCHSCREEN) + if (mc13xxx->flags & MC13XXX_USE_TOUCHSCREEN) mc13xxx_add_subdevice(mc13xxx, "%s-ts"); - if (pdata->leds) + if (pdata) { + mc13xxx_add_subdevice_pdata(mc13xxx, "%s-regulator", + &pdata->regulators, sizeof(pdata->regulators)); mc13xxx_add_subdevice_pdata(mc13xxx, "%s-led", pdata->leds, sizeof(*pdata->leds)); - - if (pdata->buttons) mc13xxx_add_subdevice_pdata(mc13xxx, "%s-pwrbutton", pdata->buttons, sizeof(*pdata->buttons)); + } else { + mc13xxx_add_subdevice(mc13xxx, "%s-regulator"); + mc13xxx_add_subdevice(mc13xxx, "%s-led"); + mc13xxx_add_subdevice(mc13xxx, "%s-pwrbutton"); + } return 0; } @@ -788,25 +844,13 @@ static int __devexit mc13xxx_remove(struct spi_device *spi) return 0; } -static const struct spi_device_id mc13xxx_device_id[] = { - { - .name = "mc13783", - .driver_data = MC13XXX_ID_MC13783, - }, { - .name = "mc13892", - .driver_data = MC13XXX_ID_MC13892, - }, { - /* sentinel */ - } -}; -MODULE_DEVICE_TABLE(spi, mc13xxx_device_id); - static struct spi_driver mc13xxx_driver = { .id_table = mc13xxx_device_id, .driver = { .name = "mc13xxx", .bus = &spi_bus_type, .owner = THIS_MODULE, + .of_match_table = mc13xxx_dt_ids, }, .probe = mc13xxx_probe, .remove = __devexit_p(mc13xxx_remove), -- 1.7.4.1 ^ permalink raw reply related [flat|nested] 18+ messages in thread
[parent not found: <1322731268-12158-2-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>]
* Re: [PATCH v2 1/4] mfd: mc13xxx: add device tree probe support [not found] ` <1322731268-12158-2-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> @ 2011-12-02 15:36 ` Mark Brown [not found] ` <20111202153637.GY8245-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org> 2011-12-06 15:04 ` [PATCH v3] " Shawn Guo 1 sibling, 1 reply; 18+ messages in thread From: Mark Brown @ 2011-12-02 15:36 UTC (permalink / raw) To: Shawn Guo Cc: Sascha Hauer, Samuel Ortiz, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Uwe Kleine-König, Liam Girdwood, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On Thu, Dec 01, 2011 at 05:21:05PM +0800, Shawn Guo wrote: > +Sub-nodes: > +- regulators : Contain the regulator nodes. The bindings details of individual > + regulator node can be found in: > + Documentation/devicetree/bindings/regulator/regulator.txt How does the driver figure out which regulators map onto which subnodes? ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <20111202153637.GY8245-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org>]
* Re: [PATCH v2 1/4] mfd: mc13xxx: add device tree probe support [not found] ` <20111202153637.GY8245-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org> @ 2011-12-05 6:41 ` Shawn Guo [not found] ` <20111205064124.GC2980-+NayF8gZjK2ctlrPMvKcciBecyulp+rMXqFh9Ls21Oc@public.gmane.org> 0 siblings, 1 reply; 18+ messages in thread From: Shawn Guo @ 2011-12-05 6:41 UTC (permalink / raw) To: Mark Brown Cc: Sascha Hauer, Samuel Ortiz, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Uwe Kleine-König, Liam Girdwood, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On Fri, Dec 02, 2011 at 03:36:38PM +0000, Mark Brown wrote: > On Thu, Dec 01, 2011 at 05:21:05PM +0800, Shawn Guo wrote: > > > +Sub-nodes: > > +- regulators : Contain the regulator nodes. The bindings details of individual > > + regulator node can be found in: > > + Documentation/devicetree/bindings/regulator/regulator.txt > > How does the driver figure out which regulators map onto which subnodes? There should only be one sub-node named 'regulators', otherwise, DTC will report ERROR (duplicate_node_names). -- Regards, Shawn ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <20111205064124.GC2980-+NayF8gZjK2ctlrPMvKcciBecyulp+rMXqFh9Ls21Oc@public.gmane.org>]
* Re: [PATCH v2 1/4] mfd: mc13xxx: add device tree probe support [not found] ` <20111205064124.GC2980-+NayF8gZjK2ctlrPMvKcciBecyulp+rMXqFh9Ls21Oc@public.gmane.org> @ 2011-12-05 19:09 ` Mark Brown [not found] ` <20111205190946.GD7467-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org> 0 siblings, 1 reply; 18+ messages in thread From: Mark Brown @ 2011-12-05 19:09 UTC (permalink / raw) To: Shawn Guo Cc: Sascha Hauer, Samuel Ortiz, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Uwe Kleine-König, Liam Girdwood, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On Mon, Dec 05, 2011 at 02:41:24PM +0800, Shawn Guo wrote: > On Fri, Dec 02, 2011 at 03:36:38PM +0000, Mark Brown wrote: > > On Thu, Dec 01, 2011 at 05:21:05PM +0800, Shawn Guo wrote: > > > +Sub-nodes: > > > +- regulators : Contain the regulator nodes. The bindings details of individual > > > + regulator node can be found in: > > > + Documentation/devicetree/bindings/regulator/regulator.txt > > How does the driver figure out which regulators map onto which subnodes? > There should only be one sub-node named 'regulators', otherwise, DTC > will report ERROR (duplicate_node_names). That doesn't answer the question - I've still no idea how the binding is supposed to map the nodes contained within regulators onto the physical regulators. ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <20111205190946.GD7467-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org>]
* Re: [PATCH v2 1/4] mfd: mc13xxx: add device tree probe support [not found] ` <20111205190946.GD7467-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org> @ 2011-12-06 3:26 ` Shawn Guo [not found] ` <20111206032642.GI2980-+NayF8gZjK2ctlrPMvKcciBecyulp+rMXqFh9Ls21Oc@public.gmane.org> 0 siblings, 1 reply; 18+ messages in thread From: Shawn Guo @ 2011-12-06 3:26 UTC (permalink / raw) To: Mark Brown Cc: Sascha Hauer, Samuel Ortiz, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Uwe Kleine-König, Liam Girdwood, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On Mon, Dec 05, 2011 at 07:09:47PM +0000, Mark Brown wrote: > On Mon, Dec 05, 2011 at 02:41:24PM +0800, Shawn Guo wrote: > > On Fri, Dec 02, 2011 at 03:36:38PM +0000, Mark Brown wrote: > > > On Thu, Dec 01, 2011 at 05:21:05PM +0800, Shawn Guo wrote: > > > > > +Sub-nodes: > > > > +- regulators : Contain the regulator nodes. The bindings details of individual > > > > + regulator node can be found in: > > > > + Documentation/devicetree/bindings/regulator/regulator.txt > > > > How does the driver figure out which regulators map onto which subnodes? > > > There should only be one sub-node named 'regulators', otherwise, DTC > > will report ERROR (duplicate_node_names). > > That doesn't answer the question - I've still no idea how the binding is > supposed to map the nodes contained within regulators onto the physical > regulators. > Oops, I missed the question. It's in the patch #3. > +struct mc13xxx_regulator_init_data * __devinit mc13xxx_parse_regulators_dt( > + struct platform_device *pdev, struct mc13xxx_regulator *regulators, > + int num_regulators) > +{ > + struct mc13xxx_regulator_priv *priv = platform_get_drvdata(pdev); > + struct mc13xxx_regulator_init_data *data, *p; > + struct device_node *parent, *child; > + int i; > + > + of_node_get(pdev->dev.parent->of_node); > + parent = of_find_node_by_name(pdev->dev.parent->of_node, "regulators"); > + if (!parent) > + return NULL; > + > + data = devm_kzalloc(&pdev->dev, sizeof(*data) * priv->num_regulators, > + GFP_KERNEL); > + if (!data) > + return NULL; > + p = data; > + > + for_each_child_of_node(parent, child) { > + for (i = 0; i < num_regulators; i++) { > + if (!of_node_cmp(child->name, > + regulators[i].desc.name)) { And here it is. It finds the regulator node by looking for the regulator name. Regards, Shawn > + p->id = i; > + p->init_data = of_get_regulator_init_data( > + &pdev->dev, child); > + p->node = child; > + p++; > + break; > + } > + } > + } > + > + return data; > +} ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <20111206032642.GI2980-+NayF8gZjK2ctlrPMvKcciBecyulp+rMXqFh9Ls21Oc@public.gmane.org>]
* Re: [PATCH v2 1/4] mfd: mc13xxx: add device tree probe support [not found] ` <20111206032642.GI2980-+NayF8gZjK2ctlrPMvKcciBecyulp+rMXqFh9Ls21Oc@public.gmane.org> @ 2011-12-06 10:13 ` Mark Brown 0 siblings, 0 replies; 18+ messages in thread From: Mark Brown @ 2011-12-06 10:13 UTC (permalink / raw) To: Shawn Guo Cc: Sascha Hauer, Samuel Ortiz, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Uwe Kleine-König, Liam Girdwood, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On Tue, Dec 06, 2011 at 11:26:43AM +0800, Shawn Guo wrote: > On Mon, Dec 05, 2011 at 07:09:47PM +0000, Mark Brown wrote: > > That doesn't answer the question - I've still no idea how the binding is > > supposed to map the nodes contained within regulators onto the physical > > regulators. > And here it is. It finds the regulator node by looking for the > regulator name. OK, this needs to be documented in the binding documentation - people shouldn't need to look at the code to figure this out. ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v3] mfd: mc13xxx: add device tree probe support [not found] ` <1322731268-12158-2-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2011-12-02 15:36 ` Mark Brown @ 2011-12-06 15:04 ` Shawn Guo [not found] ` <1323183883-32161-1-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 1 sibling, 1 reply; 18+ messages in thread From: Shawn Guo @ 2011-12-06 15:04 UTC (permalink / raw) To: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Cc: Samuel Ortiz, Sascha Hauer, Mark Brown, Uwe Kleine-König, Liam Girdwood It adds device tree probe support for mc13xxx mfd driver. Signed-off-by: Shawn Guo <shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> Cc: Samuel Ortiz <sameo-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> --- Changes since v2: * Add some note on how driver matches regulator device and the node in binding document Since it's a small change, I only resend this patch (as v3) instead of the whole series. Hope it's fine. Regards, Shawn Documentation/devicetree/bindings/mfd/mc13xxx.txt | 53 ++++++++++ drivers/mfd/mc13xxx-core.c | 106 +++++++++++++++------ 2 files changed, 128 insertions(+), 31 deletions(-) create mode 100644 Documentation/devicetree/bindings/mfd/mc13xxx.txt diff --git a/Documentation/devicetree/bindings/mfd/mc13xxx.txt b/Documentation/devicetree/bindings/mfd/mc13xxx.txt new file mode 100644 index 0000000..4ed46a61 --- /dev/null +++ b/Documentation/devicetree/bindings/mfd/mc13xxx.txt @@ -0,0 +1,53 @@ +* Freescale MC13783/MC13892 Power Management Integrated Circuit (PMIC) + +Required properties: +- compatible : Should be "fsl,mc13783" or "fsl,mc13892" + +Optional properties: +- fsl,mc13xxx-uses-adc : Indicate the ADC is being used +- fsl,mc13xxx-uses-codec : Indicate the Audio Codec is being used +- fsl,mc13xxx-uses-rtc : Indicate the RTC is being used +- fsl,mc13xxx-uses-touch : Indicate the touchscreen controller is being used + +Sub-nodes: +- regulators : Contain the regulator nodes. The name of regulator node + is being used by mc13xxx regulator driver to find the correct relator + device. + + The bindings details of individual regulator device can be found in: + Documentation/devicetree/bindings/regulator/regulator.txt + +Examples: + +ecspi@70010000 { /* ECSPI1 */ + fsl,spi-num-chipselects = <2>; + cs-gpios = <&gpio3 24 0>, /* GPIO4_24 */ + <&gpio3 25 0>; /* GPIO4_25 */ + status = "okay"; + + pmic: mc13892@0 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "fsl,mc13892"; + spi-max-frequency = <6000000>; + reg = <0>; + interrupt-parent = <&gpio0>; + interrupts = <8>; + + regulators { + sw1_reg: mc13892__sw1 { + regulator-min-microvolt = <600000>; + regulator-max-microvolt = <1375000>; + regulator-boot-on; + regulator-always-on; + }; + + sw2_reg: mc13892__sw2 { + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <1850000>; + regulator-boot-on; + regulator-always-on; + }; + }; + }; +}; diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c index e9619ac..51b2dcc 100644 --- a/drivers/mfd/mc13xxx-core.c +++ b/drivers/mfd/mc13xxx-core.c @@ -18,11 +18,15 @@ #include <linux/spi/spi.h> #include <linux/mfd/core.h> #include <linux/mfd/mc13xxx.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/of_gpio.h> struct mc13xxx { struct spi_device *spidev; struct mutex lock; int irq; + int flags; irq_handler_t irqhandler[MC13XXX_NUM_IRQ]; void *irqdata[MC13XXX_NUM_IRQ]; @@ -550,10 +554,7 @@ static const char *mc13xxx_get_chipname(struct mc13xxx *mc13xxx) int mc13xxx_get_flags(struct mc13xxx *mc13xxx) { - struct mc13xxx_platform_data *pdata = - dev_get_platdata(&mc13xxx->spidev->dev); - - return pdata->flags; + return mc13xxx->flags; } EXPORT_SYMBOL(mc13xxx_get_flags); @@ -696,17 +697,67 @@ static int mc13xxx_add_subdevice(struct mc13xxx *mc13xxx, const char *format) return mc13xxx_add_subdevice_pdata(mc13xxx, format, NULL, 0); } +#ifdef CONFIG_OF +static int mc13xxx_probe_flags_dt(struct mc13xxx *mc13xxx) +{ + struct device_node *np = mc13xxx->spidev->dev.of_node; + + if (!np) + return -ENODEV; + + if (of_get_property(np, "fsl,mc13xxx-uses-adc", NULL)) + mc13xxx->flags |= MC13XXX_USE_ADC; + + if (of_get_property(np, "fsl,mc13xxx-uses-codec", NULL)) + mc13xxx->flags |= MC13XXX_USE_CODEC; + + if (of_get_property(np, "fsl,mc13xxx-uses-rtc", NULL)) + mc13xxx->flags |= MC13XXX_USE_RTC; + + if (of_get_property(np, "fsl,mc13xxx-uses-touch", NULL)) + mc13xxx->flags |= MC13XXX_USE_TOUCHSCREEN; + + return 0; +} +#else +static inline int mc13xxx_probe_flags_dt(struct mc13xxx *mc13xxx) +{ + return -ENODEV; +} +#endif + +static const struct spi_device_id mc13xxx_device_id[] = { + { + .name = "mc13783", + .driver_data = MC13XXX_ID_MC13783, + }, { + .name = "mc13892", + .driver_data = MC13XXX_ID_MC13892, + }, { + /* sentinel */ + } +}; +MODULE_DEVICE_TABLE(spi, mc13xxx_device_id); + +static const struct of_device_id mc13xxx_dt_ids[] = { + { .compatible = "fsl,mc13783", .data = (void *) MC13XXX_ID_MC13783, }, + { .compatible = "fsl,mc13892", .data = (void *) MC13XXX_ID_MC13892, }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, mc13xxx_dt_ids); + static int mc13xxx_probe(struct spi_device *spi) { + const struct of_device_id *of_id; + struct spi_driver *sdrv = to_spi_driver(spi->dev.driver); struct mc13xxx *mc13xxx; struct mc13xxx_platform_data *pdata = dev_get_platdata(&spi->dev); enum mc13xxx_id id; int ret; - if (!pdata) { - dev_err(&spi->dev, "invalid platform data\n"); - return -EINVAL; - } + of_id = of_match_device(mc13xxx_dt_ids, &spi->dev); + if (of_id) + sdrv->id_table = &mc13xxx_device_id[(enum mc13xxx_id) of_id->data]; mc13xxx = kzalloc(sizeof(*mc13xxx), GFP_KERNEL); if (!mc13xxx) @@ -749,28 +800,33 @@ err_revision: mc13xxx_unlock(mc13xxx); - if (pdata->flags & MC13XXX_USE_ADC) + if (mc13xxx_probe_flags_dt(mc13xxx) < 0 && pdata) + mc13xxx->flags = pdata->flags; + + if (mc13xxx->flags & MC13XXX_USE_ADC) mc13xxx_add_subdevice(mc13xxx, "%s-adc"); - if (pdata->flags & MC13XXX_USE_CODEC) + if (mc13xxx->flags & MC13XXX_USE_CODEC) mc13xxx_add_subdevice(mc13xxx, "%s-codec"); - mc13xxx_add_subdevice_pdata(mc13xxx, "%s-regulator", - &pdata->regulators, sizeof(pdata->regulators)); - - if (pdata->flags & MC13XXX_USE_RTC) + if (mc13xxx->flags & MC13XXX_USE_RTC) mc13xxx_add_subdevice(mc13xxx, "%s-rtc"); - if (pdata->flags & MC13XXX_USE_TOUCHSCREEN) + if (mc13xxx->flags & MC13XXX_USE_TOUCHSCREEN) mc13xxx_add_subdevice(mc13xxx, "%s-ts"); - if (pdata->leds) + if (pdata) { + mc13xxx_add_subdevice_pdata(mc13xxx, "%s-regulator", + &pdata->regulators, sizeof(pdata->regulators)); mc13xxx_add_subdevice_pdata(mc13xxx, "%s-led", pdata->leds, sizeof(*pdata->leds)); - - if (pdata->buttons) mc13xxx_add_subdevice_pdata(mc13xxx, "%s-pwrbutton", pdata->buttons, sizeof(*pdata->buttons)); + } else { + mc13xxx_add_subdevice(mc13xxx, "%s-regulator"); + mc13xxx_add_subdevice(mc13xxx, "%s-led"); + mc13xxx_add_subdevice(mc13xxx, "%s-pwrbutton"); + } return 0; } @@ -788,25 +844,13 @@ static int __devexit mc13xxx_remove(struct spi_device *spi) return 0; } -static const struct spi_device_id mc13xxx_device_id[] = { - { - .name = "mc13783", - .driver_data = MC13XXX_ID_MC13783, - }, { - .name = "mc13892", - .driver_data = MC13XXX_ID_MC13892, - }, { - /* sentinel */ - } -}; -MODULE_DEVICE_TABLE(spi, mc13xxx_device_id); - static struct spi_driver mc13xxx_driver = { .id_table = mc13xxx_device_id, .driver = { .name = "mc13xxx", .bus = &spi_bus_type, .owner = THIS_MODULE, + .of_match_table = mc13xxx_dt_ids, }, .probe = mc13xxx_probe, .remove = __devexit_p(mc13xxx_remove), -- 1.7.4.1 ^ permalink raw reply related [flat|nested] 18+ messages in thread
[parent not found: <1323183883-32161-1-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>]
* Re: [PATCH v3] mfd: mc13xxx: add device tree probe support [not found] ` <1323183883-32161-1-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> @ 2011-12-12 1:20 ` Shawn Guo 2011-12-12 17:56 ` Samuel Ortiz 1 sibling, 0 replies; 18+ messages in thread From: Shawn Guo @ 2011-12-12 1:20 UTC (permalink / raw) To: Samuel Ortiz Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Mark Brown, Liam Girdwood, Uwe Kleine-König, Sascha Hauer, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Hi Samuel, Ping? Regards, Shawn On Tue, Dec 06, 2011 at 11:04:43PM +0800, Shawn Guo wrote: > It adds device tree probe support for mc13xxx mfd driver. > > Signed-off-by: Shawn Guo <shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> > Cc: Samuel Ortiz <sameo-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> > --- > Changes since v2: > > * Add some note on how driver matches regulator device and the node > in binding document > > Since it's a small change, I only resend this patch (as v3) instead > of the whole series. Hope it's fine. > > Regards, > Shawn > > Documentation/devicetree/bindings/mfd/mc13xxx.txt | 53 ++++++++++ > drivers/mfd/mc13xxx-core.c | 106 +++++++++++++++------ > 2 files changed, 128 insertions(+), 31 deletions(-) > create mode 100644 Documentation/devicetree/bindings/mfd/mc13xxx.txt ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v3] mfd: mc13xxx: add device tree probe support [not found] ` <1323183883-32161-1-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2011-12-12 1:20 ` Shawn Guo @ 2011-12-12 17:56 ` Samuel Ortiz 1 sibling, 0 replies; 18+ messages in thread From: Samuel Ortiz @ 2011-12-12 17:56 UTC (permalink / raw) To: Shawn Guo Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Mark Brown, Liam Girdwood, Uwe Kleine-König, Sascha Hauer, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Hi Shawn, On Tue, Dec 06, 2011 at 11:04:43PM +0800, Shawn Guo wrote: > It adds device tree probe support for mc13xxx mfd driver. Thanks, I applied this one. Cheers, Samuel. -- Intel Open Source Technology Centre http://oss.intel.com/ ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v2 2/4] regulator: pass device_node to of_get_regulator_init_data() [not found] ` <1322731268-12158-1-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2011-12-01 9:21 ` [PATCH v2 1/4] mfd: mc13xxx: add device tree probe support Shawn Guo @ 2011-12-01 9:21 ` Shawn Guo [not found] ` <1322731268-12158-3-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2011-12-01 9:21 ` [PATCH v2 3/4] regulator: mc13892: add device tree probe support Shawn Guo 2011-12-01 9:21 ` [PATCH v2 4/4] arm/imx: add mc13892 support into imx51-babbage.dts Shawn Guo 3 siblings, 1 reply; 18+ messages in thread From: Shawn Guo @ 2011-12-01 9:21 UTC (permalink / raw) To: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Cc: Samuel Ortiz, Sascha Hauer, Mark Brown, Uwe Kleine-König, Liam Girdwood It's not always true that the device_node of regulator can be found at dev->of_node at the time when of_get_regulator_init_data() is being called, because in some cases the regulator nodes in device tree do not have 'struct device' behind them until regulator_dev gets created for it by core function regulator_register(). The patch adds device_node as a new parameter to of_get_regulator_init_data(), so that caller can pass in the node of regulator directly. Signed-off-by: Shawn Guo <shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> Cc: Mark Brown <broonie-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org> Cc: Liam Girdwood <lrg-l0cyMroinI0@public.gmane.org> --- drivers/regulator/fixed.c | 2 +- drivers/regulator/of_regulator.c | 7 ++++--- include/linux/regulator/of_regulator.h | 6 ++++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/drivers/regulator/fixed.c b/drivers/regulator/fixed.c index 72abbf5..a44a017 100644 --- a/drivers/regulator/fixed.c +++ b/drivers/regulator/fixed.c @@ -64,7 +64,7 @@ of_get_fixed_voltage_config(struct device *dev) if (!config) return NULL; - config->init_data = of_get_regulator_init_data(dev); + config->init_data = of_get_regulator_init_data(dev, dev->of_node); if (!config->init_data) return NULL; diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c index acd7045..6caf641 100644 --- a/drivers/regulator/of_regulator.c +++ b/drivers/regulator/of_regulator.c @@ -66,18 +66,19 @@ static void of_get_regulation_constraints(struct device_node *np, * tree node, returns a pointer to the populated struture or NULL if memory * alloc fails. */ -struct regulator_init_data *of_get_regulator_init_data(struct device *dev) +struct regulator_init_data *of_get_regulator_init_data(struct device *dev, + struct device_node *node) { struct regulator_init_data *init_data; - if (!dev->of_node) + if (!node) return NULL; init_data = devm_kzalloc(dev, sizeof(*init_data), GFP_KERNEL); if (!init_data) return NULL; /* Out of memory? */ - of_get_regulation_constraints(dev->of_node, &init_data); + of_get_regulation_constraints(node, &init_data); return init_data; } EXPORT_SYMBOL_GPL(of_get_regulator_init_data); diff --git a/include/linux/regulator/of_regulator.h b/include/linux/regulator/of_regulator.h index d83a98d..769704f 100644 --- a/include/linux/regulator/of_regulator.h +++ b/include/linux/regulator/of_regulator.h @@ -8,10 +8,12 @@ #if defined(CONFIG_OF) extern struct regulator_init_data - *of_get_regulator_init_data(struct device *dev); + *of_get_regulator_init_data(struct device *dev, + struct device_node *node); #else static inline struct regulator_init_data - *of_get_regulator_init_data(struct device *dev) + *of_get_regulator_init_data(struct device *dev, + struct device_node *node) { return NULL; } -- 1.7.4.1 ^ permalink raw reply related [flat|nested] 18+ messages in thread
[parent not found: <1322731268-12158-3-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>]
* Re: [PATCH v2 2/4] regulator: pass device_node to of_get_regulator_init_data() [not found] ` <1322731268-12158-3-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> @ 2011-12-05 18:22 ` Thomas Abraham 2011-12-05 19:28 ` Mark Brown 1 sibling, 0 replies; 18+ messages in thread From: Thomas Abraham @ 2011-12-05 18:22 UTC (permalink / raw) To: Shawn Guo Cc: Samuel Ortiz, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Mark Brown, Liam Girdwood, Uwe Kleine-König, Sascha Hauer, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On 1 December 2011 14:51, Shawn Guo <shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> wrote: > It's not always true that the device_node of regulator can be found > at dev->of_node at the time when of_get_regulator_init_data() is being > called, because in some cases the regulator nodes in device tree do > not have 'struct device' behind them until regulator_dev gets created > for it by core function regulator_register(). > > The patch adds device_node as a new parameter to > of_get_regulator_init_data(), so that caller can pass in the node of > regulator directly. > > Signed-off-by: Shawn Guo <shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> > Cc: Mark Brown <broonie-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org> > Cc: Liam Girdwood <lrg-l0cyMroinI0@public.gmane.org> > --- > drivers/regulator/fixed.c | 2 +- > drivers/regulator/of_regulator.c | 7 ++++--- > include/linux/regulator/of_regulator.h | 6 ++++-- > 3 files changed, 9 insertions(+), 6 deletions(-) > > diff --git a/drivers/regulator/fixed.c b/drivers/regulator/fixed.c > index 72abbf5..a44a017 100644 > --- a/drivers/regulator/fixed.c > +++ b/drivers/regulator/fixed.c > @@ -64,7 +64,7 @@ of_get_fixed_voltage_config(struct device *dev) > if (!config) > return NULL; > > - config->init_data = of_get_regulator_init_data(dev); > + config->init_data = of_get_regulator_init_data(dev, dev->of_node); > if (!config->init_data) > return NULL; > > diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c > index acd7045..6caf641 100644 > --- a/drivers/regulator/of_regulator.c > +++ b/drivers/regulator/of_regulator.c > @@ -66,18 +66,19 @@ static void of_get_regulation_constraints(struct device_node *np, > * tree node, returns a pointer to the populated struture or NULL if memory > * alloc fails. > */ > -struct regulator_init_data *of_get_regulator_init_data(struct device *dev) > +struct regulator_init_data *of_get_regulator_init_data(struct device *dev, > + struct device_node *node) The new parameter 'node' should be added in the documentation which is above this function. > { > struct regulator_init_data *init_data; > > - if (!dev->of_node) > + if (!node) > return NULL; > > init_data = devm_kzalloc(dev, sizeof(*init_data), GFP_KERNEL); > if (!init_data) > return NULL; /* Out of memory? */ > > - of_get_regulation_constraints(dev->of_node, &init_data); > + of_get_regulation_constraints(node, &init_data); > return init_data; > } > EXPORT_SYMBOL_GPL(of_get_regulator_init_data); > diff --git a/include/linux/regulator/of_regulator.h b/include/linux/regulator/of_regulator.h > index d83a98d..769704f 100644 > --- a/include/linux/regulator/of_regulator.h > +++ b/include/linux/regulator/of_regulator.h > @@ -8,10 +8,12 @@ > > #if defined(CONFIG_OF) > extern struct regulator_init_data > - *of_get_regulator_init_data(struct device *dev); > + *of_get_regulator_init_data(struct device *dev, > + struct device_node *node); > #else > static inline struct regulator_init_data > - *of_get_regulator_init_data(struct device *dev) > + *of_get_regulator_init_data(struct device *dev, > + struct device_node *node) > { > return NULL; > } This was useful while adding regulator DT support for Origen board. Acked-by: Thomas Abraham <thomas.abraham-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> > -- > 1.7.4.1 > > _______________________________________________ > devicetree-discuss mailing list > devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org > https://lists.ozlabs.org/listinfo/devicetree-discuss > ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 2/4] regulator: pass device_node to of_get_regulator_init_data() [not found] ` <1322731268-12158-3-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2011-12-05 18:22 ` Thomas Abraham @ 2011-12-05 19:28 ` Mark Brown 1 sibling, 0 replies; 18+ messages in thread From: Mark Brown @ 2011-12-05 19:28 UTC (permalink / raw) To: Shawn Guo Cc: Sascha Hauer, Samuel Ortiz, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Uwe Kleine-König, Liam Girdwood, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On Thu, Dec 01, 2011 at 05:21:06PM +0800, Shawn Guo wrote: > It's not always true that the device_node of regulator can be found > at dev->of_node at the time when of_get_regulator_init_data() is being > called, because in some cases the regulator nodes in device tree do > not have 'struct device' behind them until regulator_dev gets created > for it by core function regulator_register(). Applied, thanks. ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v2 3/4] regulator: mc13892: add device tree probe support [not found] ` <1322731268-12158-1-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2011-12-01 9:21 ` [PATCH v2 1/4] mfd: mc13xxx: add device tree probe support Shawn Guo 2011-12-01 9:21 ` [PATCH v2 2/4] regulator: pass device_node to of_get_regulator_init_data() Shawn Guo @ 2011-12-01 9:21 ` Shawn Guo [not found] ` <1322731268-12158-4-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2011-12-12 17:56 ` Samuel Ortiz 2011-12-01 9:21 ` [PATCH v2 4/4] arm/imx: add mc13892 support into imx51-babbage.dts Shawn Guo 3 siblings, 2 replies; 18+ messages in thread From: Shawn Guo @ 2011-12-01 9:21 UTC (permalink / raw) To: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Cc: Samuel Ortiz, Sascha Hauer, Mark Brown, Uwe Kleine-König, Liam Girdwood It adds device tree probe support for mc13892-regulator driver. Signed-off-by: Shawn Guo <shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> Cc: Mark Brown <broonie-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org> Cc: Liam Girdwood <lrg-l0cyMroinI0@public.gmane.org> --- drivers/regulator/mc13892-regulator.c | 43 +++++++++++++++----- drivers/regulator/mc13xxx-regulator-core.c | 57 ++++++++++++++++++++++++++++ drivers/regulator/mc13xxx.h | 20 ++++++++++ include/linux/mfd/mc13xxx.h | 1 + 4 files changed, 110 insertions(+), 11 deletions(-) diff --git a/drivers/regulator/mc13892-regulator.c b/drivers/regulator/mc13892-regulator.c index 2824804..46bfa4a 100644 --- a/drivers/regulator/mc13892-regulator.c +++ b/drivers/regulator/mc13892-regulator.c @@ -527,18 +527,27 @@ static int __devinit mc13892_regulator_probe(struct platform_device *pdev) struct mc13xxx *mc13892 = dev_get_drvdata(pdev->dev.parent); struct mc13xxx_regulator_platform_data *pdata = dev_get_platdata(&pdev->dev); - struct mc13xxx_regulator_init_data *init_data; + struct mc13xxx_regulator_init_data *mc13xxx_data; int i, ret; + int num_regulators = 0; u32 val; + num_regulators = mc13xxx_get_num_regulators_dt(pdev); + if (num_regulators <= 0 && pdata) + num_regulators = pdata->num_regulators; + if (num_regulators <= 0) + return -EINVAL; + priv = kzalloc(sizeof(*priv) + - pdata->num_regulators * sizeof(priv->regulators[0]), + num_regulators * sizeof(priv->regulators[0]), GFP_KERNEL); if (!priv) return -ENOMEM; + priv->num_regulators = num_regulators; priv->mc13xxx_regulators = mc13892_regulators; priv->mc13xxx = mc13892; + platform_set_drvdata(pdev, priv); mc13xxx_lock(mc13892); ret = mc13xxx_reg_read(mc13892, MC13892_REVISION, &val); @@ -569,11 +578,27 @@ static int __devinit mc13892_regulator_probe(struct platform_device *pdev) = mc13892_vcam_set_mode; mc13892_regulators[MC13892_VCAM].desc.ops->get_mode = mc13892_vcam_get_mode; - for (i = 0; i < pdata->num_regulators; i++) { - init_data = &pdata->regulators[i]; + + mc13xxx_data = mc13xxx_parse_regulators_dt(pdev, mc13892_regulators, + ARRAY_SIZE(mc13892_regulators)); + for (i = 0; i < num_regulators; i++) { + struct regulator_init_data *init_data; + struct regulator_desc *desc; + struct device_node *node = NULL; + int id; + + if (mc13xxx_data) { + id = mc13xxx_data[i].id; + init_data = mc13xxx_data[i].init_data; + node = mc13xxx_data[i].node; + } else { + id = pdata->regulators[i].id; + init_data = pdata->regulators[i].init_data; + } + desc = &mc13892_regulators[id].desc; + priv->regulators[i] = regulator_register( - &mc13892_regulators[init_data->id].desc, - &pdev->dev, init_data->init_data, priv, NULL); + desc, &pdev->dev, init_data, priv, node); if (IS_ERR(priv->regulators[i])) { dev_err(&pdev->dev, "failed to register regulator %s\n", @@ -583,8 +608,6 @@ static int __devinit mc13892_regulator_probe(struct platform_device *pdev) } } - platform_set_drvdata(pdev, priv); - return 0; err: while (--i >= 0) @@ -600,13 +623,11 @@ err_free: static int __devexit mc13892_regulator_remove(struct platform_device *pdev) { struct mc13xxx_regulator_priv *priv = platform_get_drvdata(pdev); - struct mc13xxx_regulator_platform_data *pdata = - dev_get_platdata(&pdev->dev); int i; platform_set_drvdata(pdev, NULL); - for (i = 0; i < pdata->num_regulators; i++) + for (i = 0; i < priv->num_regulators; i++) regulator_unregister(priv->regulators[i]); kfree(priv); diff --git a/drivers/regulator/mc13xxx-regulator-core.c b/drivers/regulator/mc13xxx-regulator-core.c index 6532853..80ecafe 100644 --- a/drivers/regulator/mc13xxx-regulator-core.c +++ b/drivers/regulator/mc13xxx-regulator-core.c @@ -18,12 +18,14 @@ #include <linux/mfd/mc13xxx.h> #include <linux/regulator/machine.h> #include <linux/regulator/driver.h> +#include <linux/regulator/of_regulator.h> #include <linux/platform_device.h> #include <linux/kernel.h> #include <linux/slab.h> #include <linux/init.h> #include <linux/err.h> #include <linux/module.h> +#include <linux/of.h> #include "mc13xxx.h" static int mc13xxx_regulator_enable(struct regulator_dev *rdev) @@ -236,6 +238,61 @@ int mc13xxx_sw_regulator_is_enabled(struct regulator_dev *rdev) } EXPORT_SYMBOL_GPL(mc13xxx_sw_regulator_is_enabled); +#ifdef CONFIG_OF +int __devinit mc13xxx_get_num_regulators_dt(struct platform_device *pdev) +{ + struct device_node *parent, *child; + int num = 0; + + of_node_get(pdev->dev.parent->of_node); + parent = of_find_node_by_name(pdev->dev.parent->of_node, "regulators"); + if (!parent) + return -ENODEV; + + for_each_child_of_node(parent, child) + num++; + + return num; +} + +struct mc13xxx_regulator_init_data * __devinit mc13xxx_parse_regulators_dt( + struct platform_device *pdev, struct mc13xxx_regulator *regulators, + int num_regulators) +{ + struct mc13xxx_regulator_priv *priv = platform_get_drvdata(pdev); + struct mc13xxx_regulator_init_data *data, *p; + struct device_node *parent, *child; + int i; + + of_node_get(pdev->dev.parent->of_node); + parent = of_find_node_by_name(pdev->dev.parent->of_node, "regulators"); + if (!parent) + return NULL; + + data = devm_kzalloc(&pdev->dev, sizeof(*data) * priv->num_regulators, + GFP_KERNEL); + if (!data) + return NULL; + p = data; + + for_each_child_of_node(parent, child) { + for (i = 0; i < num_regulators; i++) { + if (!of_node_cmp(child->name, + regulators[i].desc.name)) { + p->id = i; + p->init_data = of_get_regulator_init_data( + &pdev->dev, child); + p->node = child; + p++; + break; + } + } + } + + return data; +} +#endif + MODULE_LICENSE("GPL v2"); MODULE_AUTHOR("Yong Shen <yong.shen-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>"); MODULE_DESCRIPTION("Regulator Driver for Freescale MC13xxx PMIC"); diff --git a/drivers/regulator/mc13xxx.h b/drivers/regulator/mc13xxx.h index 2775826..419aee5 100644 --- a/drivers/regulator/mc13xxx.h +++ b/drivers/regulator/mc13xxx.h @@ -29,6 +29,7 @@ struct mc13xxx_regulator_priv { struct mc13xxx *mc13xxx; u32 powermisc_pwgt_state; struct mc13xxx_regulator *mc13xxx_regulators; + int num_regulators; struct regulator_dev *regulators[]; }; @@ -42,6 +43,25 @@ extern int mc13xxx_fixed_regulator_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV, unsigned *selector); extern int mc13xxx_fixed_regulator_get_voltage(struct regulator_dev *rdev); +#ifdef CONFIG_OF +extern int mc13xxx_get_num_regulators_dt(struct platform_device *pdev); +extern struct mc13xxx_regulator_init_data *mc13xxx_parse_regulators_dt( + struct platform_device *pdev, struct mc13xxx_regulator *regulators, + int num_regulators); +#else +static inline int mc13xxx_get_num_regulators_dt(struct platform_device *pdev) +{ + return -ENODEV; +} + +static inline struct mc13xxx_regulator_init_data *mc13xxx_parse_regulators_dt( + struct platform_device *pdev, struct mc13xxx_regulator *regulators, + int num_regulators) +{ + return NULL; +} +#endif + extern struct regulator_ops mc13xxx_regulator_ops; extern struct regulator_ops mc13xxx_fixed_regulator_ops; diff --git a/include/linux/mfd/mc13xxx.h b/include/linux/mfd/mc13xxx.h index 3816c2f..a98e2a3 100644 --- a/include/linux/mfd/mc13xxx.h +++ b/include/linux/mfd/mc13xxx.h @@ -69,6 +69,7 @@ struct regulator_init_data; struct mc13xxx_regulator_init_data { int id; struct regulator_init_data *init_data; + struct device_node *node; }; struct mc13xxx_regulator_platform_data { -- 1.7.4.1 ^ permalink raw reply related [flat|nested] 18+ messages in thread
[parent not found: <1322731268-12158-4-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>]
* Re: [PATCH v2 3/4] regulator: mc13892: add device tree probe support [not found] ` <1322731268-12158-4-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> @ 2011-12-12 1:21 ` Shawn Guo [not found] ` <20111212012124.GC9572-+NayF8gZjK2ctlrPMvKcciBecyulp+rMXqFh9Ls21Oc@public.gmane.org> 0 siblings, 1 reply; 18+ messages in thread From: Shawn Guo @ 2011-12-12 1:21 UTC (permalink / raw) To: Shawn Guo Cc: Samuel Ortiz, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Mark Brown, Liam Girdwood, Uwe Kleine-König, Sascha Hauer, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Hi Mark, Ping? Regards, Shawn On Thu, Dec 01, 2011 at 05:21:07PM +0800, Shawn Guo wrote: > It adds device tree probe support for mc13892-regulator driver. > > Signed-off-by: Shawn Guo <shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> > Cc: Mark Brown <broonie-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org> > Cc: Liam Girdwood <lrg-l0cyMroinI0@public.gmane.org> > --- > drivers/regulator/mc13892-regulator.c | 43 +++++++++++++++----- > drivers/regulator/mc13xxx-regulator-core.c | 57 ++++++++++++++++++++++++++++ > drivers/regulator/mc13xxx.h | 20 ++++++++++ > include/linux/mfd/mc13xxx.h | 1 + > 4 files changed, 110 insertions(+), 11 deletions(-) ^ permalink raw reply [flat|nested] 18+ messages in thread
[parent not found: <20111212012124.GC9572-+NayF8gZjK2ctlrPMvKcciBecyulp+rMXqFh9Ls21Oc@public.gmane.org>]
* Re: [PATCH v2 3/4] regulator: mc13892: add device tree probe support [not found] ` <20111212012124.GC9572-+NayF8gZjK2ctlrPMvKcciBecyulp+rMXqFh9Ls21Oc@public.gmane.org> @ 2011-12-12 3:16 ` Mark Brown 0 siblings, 0 replies; 18+ messages in thread From: Mark Brown @ 2011-12-12 3:16 UTC (permalink / raw) To: Shawn Guo Cc: Samuel Ortiz, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Liam Girdwood, Uwe Kleine-König, Sascha Hauer, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On Mon, Dec 12, 2011 at 09:21:25AM +0800, Shawn Guo wrote: > Ping? I was rather expecting you to respin the series... ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 3/4] regulator: mc13892: add device tree probe support 2011-12-01 9:21 ` [PATCH v2 3/4] regulator: mc13892: add device tree probe support Shawn Guo [not found] ` <1322731268-12158-4-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> @ 2011-12-12 17:56 ` Samuel Ortiz 1 sibling, 0 replies; 18+ messages in thread From: Samuel Ortiz @ 2011-12-12 17:56 UTC (permalink / raw) To: Shawn Guo Cc: Rajendra Nayak, Sascha Hauer, devicetree-discuss, Mark Brown, Uwe Kleine-König, Liam Girdwood, linux-arm-kernel On Thu, Dec 01, 2011 at 05:21:07PM +0800, Shawn Guo wrote: > It adds device tree probe support for mc13892-regulator driver. > > Signed-off-by: Shawn Guo <shawn.guo@linaro.org> > Cc: Mark Brown <broonie@opensource.wolfsonmicro.com> > Cc: Liam Girdwood <lrg@ti.com> Acked-by: Samuel Ortiz <sameo@linux.intel.com> Cheers, Samuel. -- Intel Open Source Technology Centre http://oss.intel.com/ ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v2 4/4] arm/imx: add mc13892 support into imx51-babbage.dts [not found] ` <1322731268-12158-1-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> ` (2 preceding siblings ...) 2011-12-01 9:21 ` [PATCH v2 3/4] regulator: mc13892: add device tree probe support Shawn Guo @ 2011-12-01 9:21 ` Shawn Guo 3 siblings, 0 replies; 18+ messages in thread From: Shawn Guo @ 2011-12-01 9:21 UTC (permalink / raw) To: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Cc: Samuel Ortiz, Sascha Hauer, Mark Brown, Uwe Kleine-König, Liam Girdwood It adds mc13892 support into imx51-babbage device tree source. Signed-off-by: Shawn Guo <shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> Cc: Sascha Hauer <s.hauer-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> --- arch/arm/boot/dts/imx51-babbage.dts | 103 ++++++++++++++++++++++++++++++++++- 1 files changed, 101 insertions(+), 2 deletions(-) diff --git a/arch/arm/boot/dts/imx51-babbage.dts b/arch/arm/boot/dts/imx51-babbage.dts index f8766af..407fc0b 100644 --- a/arch/arm/boot/dts/imx51-babbage.dts +++ b/arch/arm/boot/dts/imx51-babbage.dts @@ -31,12 +31,14 @@ esdhc@70004000 { /* ESDHC1 */ fsl,cd-internal; fsl,wp-internal; + vmmc-supply = <&vsd_reg>; status = "okay"; }; esdhc@70008000 { /* ESDHC2 */ cd-gpios = <&gpio0 6 0>; /* GPIO1_6 */ wp-gpios = <&gpio0 5 0>; /* GPIO1_5 */ + vmmc-supply = <&vsd_reg>; status = "okay"; }; @@ -57,8 +59,105 @@ compatible = "fsl,mc13892"; spi-max-frequency = <6000000>; reg = <0>; - mc13xxx-irq-gpios = <&gpio0 8 0>; /* GPIO1_8 */ - fsl,mc13xxx-uses-regulator; + interrupt-parent = <&gpio0>; + interrupts = <8>; + + regulators { + sw1_reg: mc13892__sw1 { + regulator-min-microvolt = <600000>; + regulator-max-microvolt = <1375000>; + regulator-boot-on; + regulator-always-on; + }; + + sw2_reg: mc13892__sw2 { + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <1850000>; + regulator-boot-on; + regulator-always-on; + }; + + sw3_reg: mc13892__sw3 { + regulator-min-microvolt = <1100000>; + regulator-max-microvolt = <1850000>; + regulator-boot-on; + regulator-always-on; + }; + + sw4_reg: mc13892__sw4 { + regulator-min-microvolt = <1100000>; + regulator-max-microvolt = <1850000>; + regulator-boot-on; + regulator-always-on; + }; + + viohi_reg: mc13892__viohi { + regulator-boot-on; + regulator-always-on; + }; + + vpll_reg: mc13892__vpll { + regulator-min-microvolt = <1050000>; + regulator-max-microvolt = <1800000>; + regulator-boot-on; + regulator-always-on; + }; + + vdig_reg: mc13892__vdig { + regulator-min-microvolt = <1650000>; + regulator-max-microvolt = <1650000>; + regulator-boot-on; + }; + + vsd_reg: mc13892__vsd { + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <3150000>; + }; + + vusb2_reg: mc13892__vusb2 { + regulator-min-microvolt = <2400000>; + regulator-max-microvolt = <2775000>; + regulator-boot-on; + regulator-always-on; + }; + + vvideo_reg: mc13892__vvideo { + regulator-min-microvolt = <2775000>; + regulator-max-microvolt = <2775000>; + }; + + vaudio_reg: mc13892__vaudio { + regulator-min-microvolt = <2300000>; + regulator-max-microvolt = <3000000>; + }; + + vcam_reg: mc13892__vcam { + regulator-min-microvolt = <2500000>; + regulator-max-microvolt = <3000000>; + }; + + vgen1_reg: mc13892__vgen1 { + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <1200000>; + }; + + vgen2_reg: mc13892__vgen2 { + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <3150000>; + regulator-always-on; + }; + + vgen3_reg: mc13892__vgen3 { + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <2900000>; + regulator-always-on; + }; + + vusb_reg: mc13892__vusb { + regulator-boot-on; + regulator-always-on; + }; + }; }; flash: at45db321d@1 { -- 1.7.4.1 ^ permalink raw reply related [flat|nested] 18+ messages in thread
end of thread, other threads:[~2011-12-12 17:56 UTC | newest] Thread overview: 18+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-12-01 9:21 [PATCH 0/4] Add device tree support for mc13892 regulator driver Shawn Guo [not found] ` <1322731268-12158-1-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2011-12-01 9:21 ` [PATCH v2 1/4] mfd: mc13xxx: add device tree probe support Shawn Guo [not found] ` <1322731268-12158-2-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2011-12-02 15:36 ` Mark Brown [not found] ` <20111202153637.GY8245-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org> 2011-12-05 6:41 ` Shawn Guo [not found] ` <20111205064124.GC2980-+NayF8gZjK2ctlrPMvKcciBecyulp+rMXqFh9Ls21Oc@public.gmane.org> 2011-12-05 19:09 ` Mark Brown [not found] ` <20111205190946.GD7467-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org> 2011-12-06 3:26 ` Shawn Guo [not found] ` <20111206032642.GI2980-+NayF8gZjK2ctlrPMvKcciBecyulp+rMXqFh9Ls21Oc@public.gmane.org> 2011-12-06 10:13 ` Mark Brown 2011-12-06 15:04 ` [PATCH v3] " Shawn Guo [not found] ` <1323183883-32161-1-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2011-12-12 1:20 ` Shawn Guo 2011-12-12 17:56 ` Samuel Ortiz 2011-12-01 9:21 ` [PATCH v2 2/4] regulator: pass device_node to of_get_regulator_init_data() Shawn Guo [not found] ` <1322731268-12158-3-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2011-12-05 18:22 ` Thomas Abraham 2011-12-05 19:28 ` Mark Brown 2011-12-01 9:21 ` [PATCH v2 3/4] regulator: mc13892: add device tree probe support Shawn Guo [not found] ` <1322731268-12158-4-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2011-12-12 1:21 ` Shawn Guo [not found] ` <20111212012124.GC9572-+NayF8gZjK2ctlrPMvKcciBecyulp+rMXqFh9Ls21Oc@public.gmane.org> 2011-12-12 3:16 ` Mark Brown 2011-12-12 17:56 ` Samuel Ortiz 2011-12-01 9:21 ` [PATCH v2 4/4] arm/imx: add mc13892 support into imx51-babbage.dts Shawn Guo
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).