From mboxrd@z Thu Jan 1 00:00:00 1970 From: Grant Likely Subject: Re: [PATCH v2 4/5] regulator: adapt fixed regulator driver to dt Date: Thu, 13 Oct 2011 12:43:19 -0600 Message-ID: <20111013184319.GP18574@ponder.secretlab.ca> References: <1318263578-7407-1-git-send-email-rnayak@ti.com> <1318263578-7407-5-git-send-email-rnayak@ti.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Content-Disposition: inline In-Reply-To: <1318263578-7407-5-git-send-email-rnayak@ti.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-arm-kernel-bounces@lists.infradead.org Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org To: Rajendra Nayak Cc: b-cousson@ti.com, patches@linaro.org, tony@atomide.com, devicetree-discuss@lists.ozlabs.org, broonie@opensource.wolfsonmicro.com, linux-kernel@vger.kernel.org, linux-omap@vger.kernel.org, lrg@ti.com, linux-arm-kernel@lists.infradead.org List-Id: devicetree@vger.kernel.org On Mon, Oct 10, 2011 at 09:49:37PM +0530, Rajendra Nayak wrote: > The fixed regulator driver uses of_get_fixed_voltage_config() > to extract fixed_voltage_config structure contents from device tree. > > Also add documenation for additional bindings for fixed > regulators that can be passed through dt. > > Signed-off-by: Rajendra Nayak > --- > .../bindings/regulator/fixed-regulator.txt | 25 +++++++++ > drivers/regulator/fixed.c | 58 ++++++++++++++++++++ > 2 files changed, 83 insertions(+), 0 deletions(-) > create mode 100644 Documentation/devicetree/bindings/regulator/fixed-regulator.txt > > diff --git a/Documentation/devicetree/bindings/regulator/fixed-regulator.txt b/Documentation/devicetree/bindings/regulator/fixed-regulator.txt > new file mode 100644 > index 0000000..049df3d > --- /dev/null > +++ b/Documentation/devicetree/bindings/regulator/fixed-regulator.txt > @@ -0,0 +1,25 @@ > +Fixed Voltage regulators > + > +Required properties: > +- compatible: Must be "regulator-fixed"; > + > +Optional properties: > +- regulator-fixed-supply: Name of the regulator supply > +- regulator-fixed-microvolts: Output voltage of regulator > +- regulator-fixed-gpio: gpio to use for enable control > +- regulator-fixed-startup-delay: startup time in microseconds > +- regulator-fixed-enable-high: Polarity of enable GPIO, > + 1 = Active High, 0 = Active low > +- regulator-fixed-enabled-at-boot: 1 = yes, 0 = no > + > +Example: > + > + abc: fixedregulator@0 { > + compatible = "regulator-fixed"; > + regulator-fixed-supply = "fixed-supply"; > + regulator-fixed-microvolts = <1800000>; > + regulator-fixed-gpio = <43>; > + regulator-fixed-startup-delay = <70000>; > + regulator-fixed-enable-high; > + regulator-fixed-enabled-at-boot; > + }; > diff --git a/drivers/regulator/fixed.c b/drivers/regulator/fixed.c > index 2fe9d99..eb37eb6 100644 > --- a/drivers/regulator/fixed.c > +++ b/drivers/regulator/fixed.c > @@ -23,9 +23,12 @@ > #include > #include > #include > +#include > #include > #include > #include > +#include > +#include > > struct fixed_voltage_data { > struct regulator_desc desc; > @@ -37,6 +40,47 @@ struct fixed_voltage_data { > bool is_enabled; > }; > > + > +/** > + * of_get_fixed_voltage_config - extract fixed_voltage_config structure info > + * @dev: device requesting for fixed_voltage_config > + * > + * Populates fixed_voltage_config structure by extracting data from device > + * tree node, returns a pointer to the populated structure of NULL if memory > + * alloc fails. > + */ > +struct fixed_voltage_config *of_get_fixed_voltage_config(struct device *dev) > +{ > + struct fixed_voltage_config *config; > + struct device_node *np = dev->of_node; > + const __be32 *microvolts, *gpio, *delay; > + > + config = devm_kzalloc(dev, sizeof(struct fixed_voltage_config), GFP_KERNEL); > + if (!config) > + return NULL; > + > + config->supply_name = (char *)of_get_property(np, > + "regulator-fixed-supply", NULL); of_get_property() returns a (const void *). Casting drops the const and should not be used. Either make supply_name a (const char *), or copy the string into a (char *) buffer. > + microvolts = of_get_property(np, "regulator-fixed-microvolts", NULL); > + if (microvolts) > + config->microvolts = be32_to_cpu(*microvolts); > + gpio = of_get_property(np, "regulator-fixed-gpio", NULL); > + if (gpio) > + config->gpio = be32_to_cpu(*gpio); of_property_read_u32() may help here. > + delay = of_get_property(np, "regulator-fixed-startup-delay", NULL); > + if (delay) > + config->startup_delay = be32_to_cpu(*delay); > + > + if (of_find_property(np, "regulator-fixed-enable-high", NULL)) > + config->enable_high = true; > + if (of_find_property(np, "regulator-fixed-enabled-at-boot", NULL)) > + config->enabled_at_boot = true; > + > + config->init_data = of_get_regulator_init_data(dev); > + > + return config; > +} > + > static int fixed_voltage_is_enabled(struct regulator_dev *dev) > { > struct fixed_voltage_data *data = rdev_get_drvdata(dev); > @@ -108,6 +152,9 @@ static int __devinit reg_fixed_voltage_probe(struct platform_device *pdev) > struct fixed_voltage_data *drvdata; > int ret; > > + if (pdev->dev.of_node) > + config = of_get_fixed_voltage_config(&pdev->dev); > + > drvdata = kzalloc(sizeof(struct fixed_voltage_data), GFP_KERNEL); > if (drvdata == NULL) { > dev_err(&pdev->dev, "Failed to allocate device data\n"); > @@ -216,12 +263,23 @@ static int __devexit reg_fixed_voltage_remove(struct platform_device *pdev) > return 0; > } > > +#if defined(CONFIG_OF) > +static const struct of_device_id fixed_of_match[] __devinitconst = { > + { .compatible = "regulator-fixed", }, > + {}, > +}; > +MODULE_DEVICE_TABLE(of, fixed_of_match); > +#else > +#define fixed_of_match NULL > +#endif > + > static struct platform_driver regulator_fixed_voltage_driver = { > .probe = reg_fixed_voltage_probe, > .remove = __devexit_p(reg_fixed_voltage_remove), > .driver = { > .name = "reg-fixed-voltage", > .owner = THIS_MODULE, > + .of_match_table = fixed_of_match, > }, > }; > > -- > 1.7.1 >