Message ID | 87eh3o7mfc.wl%kuninori.morimoto.gx@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
On Thu, Jan 30, 2014 at 09:25:14PM -0800, Kuninori Morimoto wrote: > From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> > > config->gpios[x].flags indicates initial pin status, > and it will be used for drvdata->state > on gpio_regulator_probe(). I've applied this, thanks. However, a couple of things that it'd be nice to improve with followup patches: > +- gpios-states : gpios pin's initial states. 1 means HIGH A mention that this is an array of values would be good (it's clear from the code but not from the document), as would saying that the defualt is low if nothing is specified. > + if (proplen != config->nr_gpios) { > + /* gpios <-> gpios-states mismatch */ > + prop = NULL; > + } > + } It's probably worth printing a warning here.
diff --git a/Documentation/devicetree/bindings/regulator/gpio-regulator.txt b/Documentation/devicetree/bindings/regulator/gpio-regulator.txt index 63c6598..3ecb585 100644 --- a/Documentation/devicetree/bindings/regulator/gpio-regulator.txt +++ b/Documentation/devicetree/bindings/regulator/gpio-regulator.txt @@ -8,6 +8,7 @@ Required properties: Optional properties: - enable-gpio : GPIO to use to enable/disable the regulator. - gpios : GPIO group used to control voltage. +- gpios-states : gpios pin's initial states. 1 means HIGH - startup-delay-us : Startup time in microseconds. - enable-active-high : Polarity of GPIO is active high (default is low). diff --git a/drivers/regulator/gpio-regulator.c b/drivers/regulator/gpio-regulator.c index c0a1d00..7c8e37a 100644 --- a/drivers/regulator/gpio-regulator.c +++ b/drivers/regulator/gpio-regulator.c @@ -172,11 +172,22 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np) if (!config->gpios) return ERR_PTR(-ENOMEM); + prop = of_find_property(np, "gpios-states", NULL); + if (prop) { + proplen = prop->length / sizeof(int); + if (proplen != config->nr_gpios) { + /* gpios <-> gpios-states mismatch */ + prop = NULL; + } + } + for (i = 0; i < config->nr_gpios; i++) { gpio = of_get_named_gpio(np, "gpios", i); if (gpio < 0) break; config->gpios[i].gpio = gpio; + if (prop && be32_to_cpup((int *)prop->value + i)) + config->gpios[i].flags = GPIOF_OUT_INIT_HIGH; } /* Fetch states. */