gpio-charger: add devicetree support
cover gpio-charger: add devicetree support
This series adds devicetree support to the gpio-charger and fixes a small issue with the return value of gpio_get_value.
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 | 23 ++++++++ drivers/power/gpio-charger.c | 68 ++++++++++++++++++++-- 2 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 Documentation/devicetree/bindings/power_supply/gpio-charger.txt
Signature · 7 lines
1.8.5.3 -- 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
PATCH 1/3 dt-bindings: document gpio-charger bindings
From: Heiko Stuebner <[email protected]>
This documents the binding for the gpio-charger power-supply.
--- .../bindings/power_supply/gpio-charger.txt | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Documentation/devicetree/bindings/power_supply/gpio-charger.txt
Documentation/devicetree/bindings/power_supply/gpio-charger.txt new file +23 -0
@@ -0,0 +1,23 @@ +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: + + charger { + compatible = "gpio-charger"; + charger-type = "usb-sdp"; + gpios = <&gpf0 2 0 0 0>; + }
Signature · 1 line
1.8.5.3
Re: [PATCH 1/3] dt-bindings: document gpio-charger bindings
Quoted 3 lines · Heiko Stübner
From: Heiko Stuebner <[email protected]>
This documents the binding for the gpio-charger power-supply.
How does this relate to what's documented in power_supply.txt and charger-manager.txt? Both have references to USB charging. Doesn't this need some connection to a battery node?
Rob
Quoted 37 lines
Signed-off-by Heiko Stuebner <[email protected]>--- .../bindings/power_supply/gpio-charger.txt | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Documentation/devicetree/bindings/power_supply/gpio-charger.txtDocumentation/devicetree/bindings/power_supply/gpio-charger.txt new file +23
-1@@ -0,0 +1,23 @@ +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: + + charger { + compatible = "gpio-charger"; + charger-type = "usb-sdp"; + gpios = <&gpf0 2 0 0 0>; + } --
Quoted 3 lines
1.8.5.3
--
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
Re: [PATCH 1/3] dt-bindings: document gpio-charger bindings
Hi Rob,
Am Mittwoch, 12. März 2014, 09:28:46 schrieb Rob Herring:
Quoted 8 lines · Heiko Stübner
Quoted 3 lines
From: Heiko Stuebner <[email protected]>
This documents the binding for the gpio-charger power-supply.
How does this relate to what's documented in power_supply.txt and charger-manager.txt? Both have references to USB charging. Doesn't this need some connection to a battery node?
Yep, the gpio-charger takes the position of the "some,usb-charger" from power_supply.txt .
usb_charger: charger {
compatible = "gpio-charger";
charger-type = "usb-sdp";
gpios = <&gpf0 2 0 0 0>;
}
battery {
power-supplies = <&usb_charger>;
};I guess the binding doc could reflect this.
I haven't deeply looked into what charger-manager does, bit it seems to be a layer on top of chargers and batteries, controlling them. So it seems to be used with more intelligent components.
My setup using gpio-charger for example is vastly simpler, it's just a gpio reporting charger present (for gpio-charger), an adc reporting the battery voltage and another gpio reporting the charging state (which is already handled in generic-adc-battery, but needs a dt binding too).
Heiko
Quoted 40 lines
Quoted 40 lines
Signed-off-by Heiko Stuebner <[email protected]>---
.../bindings/power_supply/gpio-charger.txt | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644
Documentation/devicetree/bindings/power_supply/gpio-charger.txt>
diff --gita/Documentation/devicetree/bindings/power_supply/gpio-charger.txtb/Documentation/devicetree/bindings/power_supply/gpio-charger.txtnew file mode 100644
index 0000000..fad87a4Documentation/devicetree/bindings/power_supply/gpio-charger.txt new file +23
-1@@ -0,0 +1,23 @@ +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: + + charger { + compatible = "gpio-charger"; + charger-type = "usb-sdp"; + gpios = <&gpf0 2 0 0 0>; + } --1.8.5.3
PATCH 2/3 power: gpio-charger: add device tree support
In reply to Heiko StübnerFrom: Heiko Stuebner <[email protected]>
Add the ability to parse gpio-charger data from a devicetree node.
--- drivers/power/gpio-charger.c | 66 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 3 deletions(-)
drivers/power/gpio-charger.c +63 -3
@@ -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,17 +71,68 @@ 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 (struct gpio_charger_platform_data ), +GFP_KERNEL ); +if (!pdata) +return ERR_PTR (-ENOMEM ); + + pdata->name = np->name; + + pdata->gpio =of_get_gpio_flags (np,0 , &flags); + 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; +struct gpio_charger_platform_data *pdata = pdev->dev.platform_data;struct gpio_charger *gpio_charger;struct power_supply *charger;int ret;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)) { +dev_err (&pdev->dev,"No platform data\n" ); +return -EINVAL ; + } }if (!gpio_is_valid (pdata->gpio)) {
@@ -189,6 +242,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 +255,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), }, };
Signature · 1 line
1.8.5.3
PATCH 3/3 power: gpio-charger: do not use gpio value directly
In reply to Heiko StübnerFrom: Heiko Stuebner <[email protected]>
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.
--- drivers/power/gpio-charger.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/power/gpio-charger.c +1 -1
@@ -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) ?1 :0 ; val->intval ^= pdata->gpio_active_low;break ;default :
Signature · 1 line
1.8.5.3