* [PATCH v3 0/3] gpio-charger: add devicetree support @ 2014-09-23 11:59 Heiko Stuebner 2014-09-23 11:59 ` [PATCH v3 1/3] dt-bindings: document gpio-charger bindings Heiko Stuebner ` (2 more replies) 0 siblings, 3 replies; 6+ messages in thread From: Heiko Stuebner @ 2014-09-23 11:59 UTC (permalink / raw) To: sre-DgEjT+Ai2ygdnm+yROfE0A, dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w, dwmw2-wEGCiKHe2LqWVfeAwA7xHQ Cc: linux-pm-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8, pawel.moll-5wv7dgnIgG8, ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg, galak-sgV2jX0FEOL9JmXXK+q4OQ, dianders-F7+t8E8rja9g9hUCZPvPmw, heiko-4mtYJXux2i+zQB+pC5nmwQ This series adds devicetree support to the gpio-charger and fixes a small issue with the return value of gpio_get_value. changes since v2: - fix (hopefully all) issues pointed out by Doug Anderson - add missing of_node assignment to charger changes since v1: - adapt binding example to show how the charger fits into the power-supplies structure Heiko Stuebner (3): dt-bindings: document gpio-charger bindings power: gpio-charger: add device tree support power: gpio-charger: do not use gpio value directly .../bindings/power_supply/gpio-charger.txt | 27 ++++++++ drivers/power/gpio-charger.c | 74 +++++++++++++++++++++- 2 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 Documentation/devicetree/bindings/power_supply/gpio-charger.txt -- 2.1.0 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v3 1/3] dt-bindings: document gpio-charger bindings 2014-09-23 11:59 [PATCH v3 0/3] gpio-charger: add devicetree support Heiko Stuebner @ 2014-09-23 11:59 ` Heiko Stuebner 2014-09-23 11:59 ` [PATCH v3 2/3] power: gpio-charger: add device tree support Heiko Stuebner 2014-09-23 11:59 ` [PATCH v3 3/3] power: gpio-charger: do not use gpio value directly Heiko Stuebner 2 siblings, 0 replies; 6+ messages in thread From: Heiko Stuebner @ 2014-09-23 11:59 UTC (permalink / raw) To: sre, dbaryshkov, dwmw2 Cc: linux-pm, linux-kernel, devicetree, robh+dt, mark.rutland, pawel.moll, ijc+devicetree, galak, dianders, heiko, Heiko Stuebner From: Heiko Stuebner <heiko.stuebner@bq.com> This documents the binding for the gpio-charger power-supply. Signed-off-by: Heiko Stuebner <heiko.stuebner@bq.com> Reviewed-by: Doug Anderson <dianders@chromium.org> --- .../bindings/power_supply/gpio-charger.txt | 27 ++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 Documentation/devicetree/bindings/power_supply/gpio-charger.txt diff --git a/Documentation/devicetree/bindings/power_supply/gpio-charger.txt b/Documentation/devicetree/bindings/power_supply/gpio-charger.txt new file mode 100644 index 0000000..adbb5dc --- /dev/null +++ b/Documentation/devicetree/bindings/power_supply/gpio-charger.txt @@ -0,0 +1,27 @@ +gpio-charger + +Required properties : + - compatible : "gpio-charger" + - gpios : GPIO indicating the charger presence. + See GPIO binding in bindings/gpio/gpio.txt . + - charger-type : power supply type, one of + unknown + battery + ups + mains + usb-sdp (USB standard downstream port) + usb-dcp (USB dedicated charging port) + usb-cdp (USB charging downstream port) + usb-aca (USB accessory charger adapter) + +Example: + + usb_charger: charger { + compatible = "gpio-charger"; + charger-type = "usb-sdp"; + gpios = <&gpf0 2 0 0 0>; + } + + battery { + power-supplies = <&usb_charger>; + }; -- 2.1.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v3 2/3] power: gpio-charger: add device tree support 2014-09-23 11:59 [PATCH v3 0/3] gpio-charger: add devicetree support Heiko Stuebner 2014-09-23 11:59 ` [PATCH v3 1/3] dt-bindings: document gpio-charger bindings Heiko Stuebner @ 2014-09-23 11:59 ` Heiko Stuebner 2014-09-23 16:08 ` Doug Anderson 2014-09-23 11:59 ` [PATCH v3 3/3] power: gpio-charger: do not use gpio value directly Heiko Stuebner 2 siblings, 1 reply; 6+ messages in thread From: Heiko Stuebner @ 2014-09-23 11:59 UTC (permalink / raw) To: sre, dbaryshkov, dwmw2 Cc: linux-pm, linux-kernel, devicetree, robh+dt, mark.rutland, pawel.moll, ijc+devicetree, galak, dianders, heiko, Heiko Stuebner From: Heiko Stuebner <heiko.stuebner@bq.com> Add the ability to parse gpio-charger data from a devicetree node. Signed-off-by: Heiko Stuebner <heiko.stuebner@bq.com> --- drivers/power/gpio-charger.c | 72 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 2 deletions(-) diff --git a/drivers/power/gpio-charger.c b/drivers/power/gpio-charger.c index a0024b2..22f084a 100644 --- a/drivers/power/gpio-charger.c +++ b/drivers/power/gpio-charger.c @@ -22,6 +22,8 @@ #include <linux/platform_device.h> #include <linux/power_supply.h> #include <linux/slab.h> +#include <linux/of.h> +#include <linux/of_gpio.h> #include <linux/power/gpio-charger.h> @@ -69,6 +71,59 @@ static enum power_supply_property gpio_charger_properties[] = { POWER_SUPPLY_PROP_ONLINE, }; +static +struct gpio_charger_platform_data *gpio_charger_parse_dt(struct device *dev) +{ + struct device_node *np = dev->of_node; + struct gpio_charger_platform_data *pdata; + const char *chargetype; + enum of_gpio_flags flags; + int ret; + + if (!np) + return ERR_PTR(-ENOENT); + + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) + return ERR_PTR(-ENOMEM); + + pdata->name = np->name; + + pdata->gpio = of_get_gpio_flags(np, 0, &flags); + if (pdata->gpio < 0) { + if (pdata->gpio != -EPROBE_DEFER) + dev_err(dev, "could not get charger gpio\n"); + return ERR_PTR(pdata->gpio); + } + + pdata->gpio_active_low = !!(flags & OF_GPIO_ACTIVE_LOW); + + pdata->type = POWER_SUPPLY_TYPE_UNKNOWN; + ret = of_property_read_string(np, "charger-type", &chargetype); + if (ret >= 0) { + if (!strncmp("unknown", chargetype, 7)) + pdata->type = POWER_SUPPLY_TYPE_UNKNOWN; + else if (!strncmp("battery", chargetype, 7)) + pdata->type = POWER_SUPPLY_TYPE_BATTERY; + else if (!strncmp("ups", chargetype, 3)) + pdata->type = POWER_SUPPLY_TYPE_UPS; + else if (!strncmp("mains", chargetype, 5)) + pdata->type = POWER_SUPPLY_TYPE_MAINS; + else if (!strncmp("usb-sdp", chargetype, 7)) + pdata->type = POWER_SUPPLY_TYPE_USB; + else if (!strncmp("usb-dcp", chargetype, 7)) + pdata->type = POWER_SUPPLY_TYPE_USB_DCP; + else if (!strncmp("usb-cdp", chargetype, 7)) + pdata->type = POWER_SUPPLY_TYPE_USB_CDP; + else if (!strncmp("usb-aca", chargetype, 7)) + pdata->type = POWER_SUPPLY_TYPE_USB_ACA; + else + dev_warn(dev, "unknown charger type %s\n", chargetype); + } + + return pdata; +} + static int gpio_charger_probe(struct platform_device *pdev) { const struct gpio_charger_platform_data *pdata = pdev->dev.platform_data; @@ -78,8 +133,13 @@ static int gpio_charger_probe(struct platform_device *pdev) int irq; if (!pdata) { - dev_err(&pdev->dev, "No platform data\n"); - return -EINVAL; + pdata = gpio_charger_parse_dt(&pdev->dev); + if (IS_ERR(pdata)) { + ret = PTR_ERR(pdata); + if (ret != -EPROBE_DEFER) + dev_err(&pdev->dev, "No platform data\n"); + return ret; + } } if (!gpio_is_valid(pdata->gpio)) { @@ -103,6 +163,7 @@ static int gpio_charger_probe(struct platform_device *pdev) charger->get_property = gpio_charger_get_property; charger->supplied_to = pdata->supplied_to; charger->num_supplicants = pdata->num_supplicants; + charger->of_node = pdev->dev.of_node; ret = gpio_request(pdata->gpio, dev_name(&pdev->dev)); if (ret) { @@ -189,6 +250,12 @@ static int gpio_charger_resume(struct device *dev) static SIMPLE_DEV_PM_OPS(gpio_charger_pm_ops, gpio_charger_suspend, gpio_charger_resume); +static const struct of_device_id gpio_charger_match[] = { + { .compatible = "gpio-charger" }, + { } +}; +MODULE_DEVICE_TABLE(of, gpio_charger_match); + static struct platform_driver gpio_charger_driver = { .probe = gpio_charger_probe, .remove = gpio_charger_remove, @@ -196,6 +263,7 @@ static struct platform_driver gpio_charger_driver = { .name = "gpio-charger", .owner = THIS_MODULE, .pm = &gpio_charger_pm_ops, + .of_match_table = of_match_ptr(gpio_charger_match), }, }; -- 2.1.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v3 2/3] power: gpio-charger: add device tree support 2014-09-23 11:59 ` [PATCH v3 2/3] power: gpio-charger: add device tree support Heiko Stuebner @ 2014-09-23 16:08 ` Doug Anderson 0 siblings, 0 replies; 6+ messages in thread From: Doug Anderson @ 2014-09-23 16:08 UTC (permalink / raw) To: Heiko Stuebner Cc: sre, Dmitry Eremin-Solenikov, David Woodhouse, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Rob Herring, Mark Rutland, Pawel Moll, Ian Campbell, Kumar Gala, Heiko Stuebner Heiko, On Tue, Sep 23, 2014 at 4:59 AM, Heiko Stuebner <heiko@sntech.de> wrote: > From: Heiko Stuebner <heiko.stuebner@bq.com> > > Add the ability to parse gpio-charger data from a devicetree node. > > Signed-off-by: Heiko Stuebner <heiko.stuebner@bq.com> > --- > drivers/power/gpio-charger.c | 72 ++++++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 70 insertions(+), 2 deletions(-) > > diff --git a/drivers/power/gpio-charger.c b/drivers/power/gpio-charger.c > index a0024b2..22f084a 100644 > --- a/drivers/power/gpio-charger.c > +++ b/drivers/power/gpio-charger.c > @@ -22,6 +22,8 @@ > #include <linux/platform_device.h> > #include <linux/power_supply.h> > #include <linux/slab.h> > +#include <linux/of.h> > +#include <linux/of_gpio.h> > > #include <linux/power/gpio-charger.h> > > @@ -69,6 +71,59 @@ static enum power_supply_property gpio_charger_properties[] = { > POWER_SUPPLY_PROP_ONLINE, > }; > > +static > +struct gpio_charger_platform_data *gpio_charger_parse_dt(struct device *dev) > +{ > + struct device_node *np = dev->of_node; > + struct gpio_charger_platform_data *pdata; > + const char *chargetype; > + enum of_gpio_flags flags; > + int ret; > + > + if (!np) > + return ERR_PTR(-ENOENT); > + > + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); > + if (!pdata) > + return ERR_PTR(-ENOMEM); > + > + pdata->name = np->name; > + > + pdata->gpio = of_get_gpio_flags(np, 0, &flags); > + if (pdata->gpio < 0) { > + if (pdata->gpio != -EPROBE_DEFER) > + dev_err(dev, "could not get charger gpio\n"); > + return ERR_PTR(pdata->gpio); > + } > + > + pdata->gpio_active_low = !!(flags & OF_GPIO_ACTIVE_LOW); > + > + pdata->type = POWER_SUPPLY_TYPE_UNKNOWN; > + ret = of_property_read_string(np, "charger-type", &chargetype); > + if (ret >= 0) { > + if (!strncmp("unknown", chargetype, 7)) > + pdata->type = POWER_SUPPLY_TYPE_UNKNOWN; > + else if (!strncmp("battery", chargetype, 7)) > + pdata->type = POWER_SUPPLY_TYPE_BATTERY; > + else if (!strncmp("ups", chargetype, 3)) > + pdata->type = POWER_SUPPLY_TYPE_UPS; > + else if (!strncmp("mains", chargetype, 5)) > + pdata->type = POWER_SUPPLY_TYPE_MAINS; > + else if (!strncmp("usb-sdp", chargetype, 7)) > + pdata->type = POWER_SUPPLY_TYPE_USB; > + else if (!strncmp("usb-dcp", chargetype, 7)) > + pdata->type = POWER_SUPPLY_TYPE_USB_DCP; > + else if (!strncmp("usb-cdp", chargetype, 7)) > + pdata->type = POWER_SUPPLY_TYPE_USB_CDP; > + else if (!strncmp("usb-aca", chargetype, 7)) > + pdata->type = POWER_SUPPLY_TYPE_USB_ACA; > + else > + dev_warn(dev, "unknown charger type %s\n", chargetype); > + } > + > + return pdata; > +} > + > static int gpio_charger_probe(struct platform_device *pdev) > { > const struct gpio_charger_platform_data *pdata = pdev->dev.platform_data; > @@ -78,8 +133,13 @@ static int gpio_charger_probe(struct platform_device *pdev) > int irq; > > if (!pdata) { > - dev_err(&pdev->dev, "No platform data\n"); > - return -EINVAL; > + pdata = gpio_charger_parse_dt(&pdev->dev); > + if (IS_ERR(pdata)) { > + ret = PTR_ERR(pdata); > + if (ret != -EPROBE_DEFER) > + dev_err(&pdev->dev, "No platform data\n"); > + return ret; > + } > } > > if (!gpio_is_valid(pdata->gpio)) { > @@ -103,6 +163,7 @@ static int gpio_charger_probe(struct platform_device *pdev) > charger->get_property = gpio_charger_get_property; > charger->supplied_to = pdata->supplied_to; > charger->num_supplicants = pdata->num_supplicants; > + charger->of_node = pdev->dev.of_node; > > ret = gpio_request(pdata->gpio, dev_name(&pdev->dev)); > if (ret) { > @@ -189,6 +250,12 @@ static int gpio_charger_resume(struct device *dev) > static SIMPLE_DEV_PM_OPS(gpio_charger_pm_ops, > gpio_charger_suspend, gpio_charger_resume); > > +static const struct of_device_id gpio_charger_match[] = { > + { .compatible = "gpio-charger" }, > + { } > +}; > +MODULE_DEVICE_TABLE(of, gpio_charger_match); > + > static struct platform_driver gpio_charger_driver = { > .probe = gpio_charger_probe, > .remove = gpio_charger_remove, > @@ -196,6 +263,7 @@ static struct platform_driver gpio_charger_driver = { > .name = "gpio-charger", > .owner = THIS_MODULE, > .pm = &gpio_charger_pm_ops, > + .of_match_table = of_match_ptr(gpio_charger_match), I'm still not convinced about of_match_ptr() here as you can see in my response to v2. ...but at most it could give a warning that would be something like "gpio_charger_match defined but not used" in the !CONFIG_OF case, so I guess it's fine? In any case, everything else looks reasonable: Reviewed-by: Doug Anderson <dianders@chromium.org> Tested-by: Doug Anderson <dianders@chromium.org> ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v3 3/3] power: gpio-charger: do not use gpio value directly 2014-09-23 11:59 [PATCH v3 0/3] gpio-charger: add devicetree support Heiko Stuebner 2014-09-23 11:59 ` [PATCH v3 1/3] dt-bindings: document gpio-charger bindings Heiko Stuebner 2014-09-23 11:59 ` [PATCH v3 2/3] power: gpio-charger: add device tree support Heiko Stuebner @ 2014-09-23 11:59 ` Heiko Stuebner 2014-09-23 16:06 ` Doug Anderson 2 siblings, 1 reply; 6+ messages in thread From: Heiko Stuebner @ 2014-09-23 11:59 UTC (permalink / raw) To: sre, dbaryshkov, dwmw2 Cc: linux-pm, linux-kernel, devicetree, robh+dt, mark.rutland, pawel.moll, ijc+devicetree, galak, dianders, heiko, Heiko Stuebner From: Heiko Stuebner <heiko.stuebner@bq.com> Some gpio implementations return interesting values for gpio_get_value when the value is not 0 - as seen on a imx6sl board. Therefore do not use the value returned from gpio_get_value directly but simply check for 0 or not 0. Signed-off-by: Heiko Stuebner <heiko.stuebner@bq.com> --- drivers/power/gpio-charger.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/power/gpio-charger.c b/drivers/power/gpio-charger.c index 22f084a..7d4eab2 100644 --- a/drivers/power/gpio-charger.c +++ b/drivers/power/gpio-charger.c @@ -57,7 +57,7 @@ static int gpio_charger_get_property(struct power_supply *psy, switch (psp) { case POWER_SUPPLY_PROP_ONLINE: - val->intval = gpio_get_value_cansleep(pdata->gpio); + val->intval = !!gpio_get_value_cansleep(pdata->gpio); val->intval ^= pdata->gpio_active_low; break; default: -- 2.1.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v3 3/3] power: gpio-charger: do not use gpio value directly 2014-09-23 11:59 ` [PATCH v3 3/3] power: gpio-charger: do not use gpio value directly Heiko Stuebner @ 2014-09-23 16:06 ` Doug Anderson 0 siblings, 0 replies; 6+ messages in thread From: Doug Anderson @ 2014-09-23 16:06 UTC (permalink / raw) To: Heiko Stuebner Cc: sre, Dmitry Eremin-Solenikov, David Woodhouse, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Rob Herring, Mark Rutland, Pawel Moll, Ian Campbell, Kumar Gala, Heiko Stuebner Heiko, On Tue, Sep 23, 2014 at 4:59 AM, Heiko Stuebner <heiko@sntech.de> wrote: > From: Heiko Stuebner <heiko.stuebner@bq.com> > > Some gpio implementations return interesting values for gpio_get_value when > the value is not 0 - as seen on a imx6sl board. Therefore do not use the > value returned from gpio_get_value directly but simply check for 0 or not 0. > > Signed-off-by: Heiko Stuebner <heiko.stuebner@bq.com> > --- > drivers/power/gpio-charger.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/power/gpio-charger.c b/drivers/power/gpio-charger.c > index 22f084a..7d4eab2 100644 > --- a/drivers/power/gpio-charger.c > +++ b/drivers/power/gpio-charger.c > @@ -57,7 +57,7 @@ static int gpio_charger_get_property(struct power_supply *psy, > > switch (psp) { > case POWER_SUPPLY_PROP_ONLINE: > - val->intval = gpio_get_value_cansleep(pdata->gpio); > + val->intval = !!gpio_get_value_cansleep(pdata->gpio); > val->intval ^= pdata->gpio_active_low; ...so I guess the interface is that gpio_active_low must be exactly 1 or 0. Oh, and that's actually defined in gpio-charger.h! I should have checked that before. Reviewed-by: Doug Anderson <dianders@chromium.org> Tested-by: Doug Anderson <dianders@chromium.org> ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-09-23 16:08 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-09-23 11:59 [PATCH v3 0/3] gpio-charger: add devicetree support Heiko Stuebner 2014-09-23 11:59 ` [PATCH v3 1/3] dt-bindings: document gpio-charger bindings Heiko Stuebner 2014-09-23 11:59 ` [PATCH v3 2/3] power: gpio-charger: add device tree support Heiko Stuebner 2014-09-23 16:08 ` Doug Anderson 2014-09-23 11:59 ` [PATCH v3 3/3] power: gpio-charger: do not use gpio value directly Heiko Stuebner 2014-09-23 16:06 ` Doug Anderson
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).