2019-02-05 19:06:42

by Artur Rojek

[permalink] [raw]
Subject: [PATCH 1/2] dt-bindings: power: supply: gpio-charger: Add status-gpios property

Add documentation for the "status-gpios" property.

Signed-off-by: Artur Rojek <[email protected]>
---
.../devicetree/bindings/power/supply/gpio-charger.txt | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/Documentation/devicetree/bindings/power/supply/gpio-charger.txt b/Documentation/devicetree/bindings/power/supply/gpio-charger.txt
index adbb5dc5b6e9..b98a05a4973c 100644
--- a/Documentation/devicetree/bindings/power/supply/gpio-charger.txt
+++ b/Documentation/devicetree/bindings/power/supply/gpio-charger.txt
@@ -14,12 +14,16 @@ Required properties :
usb-cdp (USB charging downstream port)
usb-aca (USB accessory charger adapter)

+Optional properties:
+ - status-gpios: GPIO indicating the charger status
+
Example:

usb_charger: charger {
compatible = "gpio-charger";
charger-type = "usb-sdp";
gpios = <&gpf0 2 0 0 0>;
+ status-gpios = <&gpf0 3 0 0 0>;
}

battery {
--
2.20.1



2019-02-05 19:07:00

by Artur Rojek

[permalink] [raw]
Subject: [PATCH 2/2] power: supply: gpio-charger: Add support for charger status.

Introduce optional support of POWER_SUPPLY_PROP_STATUS for chargers
which provide charging status GPIO.

Signed-off-by: Artur Rojek <[email protected]>
---
drivers/power/supply/gpio-charger.c | 53 +++++++++++++++++++++++------
1 file changed, 42 insertions(+), 11 deletions(-)

diff --git a/drivers/power/supply/gpio-charger.c b/drivers/power/supply/gpio-charger.c
index 7e4f11d5a230..ebe986f09472 100644
--- a/drivers/power/supply/gpio-charger.c
+++ b/drivers/power/supply/gpio-charger.c
@@ -29,11 +29,13 @@

struct gpio_charger {
unsigned int irq;
+ unsigned int status_irq;
bool wakeup_enabled;

struct power_supply *charger;
struct power_supply_desc charger_desc;
struct gpio_desc *gpiod;
+ struct gpio_desc *status;
};

static irqreturn_t gpio_charger_irq(int irq, void *devid)
@@ -59,6 +61,12 @@ static int gpio_charger_get_property(struct power_supply *psy,
case POWER_SUPPLY_PROP_ONLINE:
val->intval = gpiod_get_value_cansleep(gpio_charger->gpiod);
break;
+ case POWER_SUPPLY_PROP_STATUS:
+ if (gpiod_get_value_cansleep(gpio_charger->status))
+ val->intval = POWER_SUPPLY_STATUS_CHARGING;
+ else
+ val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
+ break;
default:
return -EINVAL;
}
@@ -93,8 +101,29 @@ static enum power_supply_type gpio_charger_get_type(struct device *dev)
return POWER_SUPPLY_TYPE_UNKNOWN;
}

+static int gpio_charger_get_irq(struct device *dev, void *dev_id,
+ struct gpio_desc *gpio)
+{
+ int ret, irq = gpiod_to_irq(gpio);
+
+ if (irq > 0) {
+ ret = devm_request_any_context_irq(dev, irq, gpio_charger_irq,
+ IRQF_TRIGGER_RISING |
+ IRQF_TRIGGER_FALLING,
+ dev_name(dev),
+ dev_id);
+ if (ret < 0) {
+ dev_warn(dev, "Failed to request irq: %d\n", ret);
+ irq = 0;
+ }
+ }
+
+ return irq;
+}
+
static enum power_supply_property gpio_charger_properties[] = {
POWER_SUPPLY_PROP_ONLINE,
+ POWER_SUPPLY_PROP_STATUS /* Must always be last in the array. */
};

static int gpio_charger_probe(struct platform_device *pdev)
@@ -105,7 +134,7 @@ static int gpio_charger_probe(struct platform_device *pdev)
struct gpio_charger *gpio_charger;
struct power_supply_desc *charger_desc;
unsigned long flags;
- int irq, ret;
+ int ret;

if (!pdata && !dev->of_node) {
dev_err(dev, "No platform data\n");
@@ -151,9 +180,16 @@ static int gpio_charger_probe(struct platform_device *pdev)
return PTR_ERR(gpio_charger->gpiod);
}

+ gpio_charger->status = devm_gpiod_get_optional(dev, "status", GPIOD_IN);
+ if (IS_ERR(gpio_charger->status))
+ return PTR_ERR(gpio_charger->status);
+
charger_desc = &gpio_charger->charger_desc;
charger_desc->properties = gpio_charger_properties;
charger_desc->num_properties = ARRAY_SIZE(gpio_charger_properties);
+ /* Remove POWER_SUPPLY_PROP_STATUS from the supported properties. */
+ if (!gpio_charger->status)
+ charger_desc->num_properties -= 1;
charger_desc->get_property = gpio_charger_get_property;

psy_cfg.of_node = dev->of_node;
@@ -180,16 +216,11 @@ static int gpio_charger_probe(struct platform_device *pdev)
return ret;
}

- irq = gpiod_to_irq(gpio_charger->gpiod);
- if (irq > 0) {
- ret = devm_request_any_context_irq(dev, irq, gpio_charger_irq,
- IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
- dev_name(dev), gpio_charger->charger);
- if (ret < 0)
- dev_warn(dev, "Failed to request irq: %d\n", ret);
- else
- gpio_charger->irq = irq;
- }
+ gpio_charger->irq = gpio_charger_get_irq(dev, gpio_charger->charger,
+ gpio_charger->gpiod);
+ gpio_charger->status_irq = gpio_charger_get_irq(dev,
+ gpio_charger->charger,
+ gpio_charger->status);

platform_set_drvdata(pdev, gpio_charger);

--
2.20.1


2019-02-25 21:53:53

by Rob Herring (Arm)

[permalink] [raw]
Subject: Re: [PATCH 1/2] dt-bindings: power: supply: gpio-charger: Add status-gpios property

On Tue, Feb 05, 2019 at 08:03:15PM +0100, Artur Rojek wrote:
> Add documentation for the "status-gpios" property.
>
> Signed-off-by: Artur Rojek <[email protected]>
> ---
> .../devicetree/bindings/power/supply/gpio-charger.txt | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/power/supply/gpio-charger.txt b/Documentation/devicetree/bindings/power/supply/gpio-charger.txt
> index adbb5dc5b6e9..b98a05a4973c 100644
> --- a/Documentation/devicetree/bindings/power/supply/gpio-charger.txt
> +++ b/Documentation/devicetree/bindings/power/supply/gpio-charger.txt
> @@ -14,12 +14,16 @@ Required properties :
> usb-cdp (USB charging downstream port)
> usb-aca (USB accessory charger adapter)
>
> +Optional properties:
> + - status-gpios: GPIO indicating the charger status

So when it is asserted it has 'status'? What does status mean?

> +
> Example:
>
> usb_charger: charger {
> compatible = "gpio-charger";
> charger-type = "usb-sdp";
> gpios = <&gpf0 2 0 0 0>;
> + status-gpios = <&gpf0 3 0 0 0>;

Humm, not sure what the thinking for 'gpios' was, but it's wrong and you
just copied it. If we follow the normal cell encoding with 2 cells, this
means the property takes 3 gpios (though the last 2 are marked not
present with 0).

Rob

2019-02-26 14:41:45

by Artur Rojek

[permalink] [raw]
Subject: Re: [PATCH 1/2] dt-bindings: power: supply: gpio-charger: Add status-gpios property

Hi Rob.

Thanks for the review.

On 2019-02-25 22:53, Rob Herring wrote:
> On Tue, Feb 05, 2019 at 08:03:15PM +0100, Artur Rojek wrote:
>> Add documentation for the "status-gpios" property.
>>
>> Signed-off-by: Artur Rojek <[email protected]>
>> ---
>> .../devicetree/bindings/power/supply/gpio-charger.txt | 4
>> ++++
>> 1 file changed, 4 insertions(+)
>>
>> diff --git
>> a/Documentation/devicetree/bindings/power/supply/gpio-charger.txt
>> b/Documentation/devicetree/bindings/power/supply/gpio-charger.txt
>> index adbb5dc5b6e9..b98a05a4973c 100644
>> --- a/Documentation/devicetree/bindings/power/supply/gpio-charger.txt
>> +++ b/Documentation/devicetree/bindings/power/supply/gpio-charger.txt
>> @@ -14,12 +14,16 @@ Required properties :
>> usb-cdp (USB charging downstream port)
>> usb-aca (USB accessory charger adapter)
>>
>> +Optional properties:
>> + - status-gpios: GPIO indicating the charger status
>
> So when it is asserted it has 'status'? What does status mean?
It is a GPIO indicating whether a battery is charging.
I shall make the description more clear.
>
>> +
>> Example:
>>
>> usb_charger: charger {
>> compatible = "gpio-charger";
>> charger-type = "usb-sdp";
>> gpios = <&gpf0 2 0 0 0>;
>> + status-gpios = <&gpf0 3 0 0 0>;
>
> Humm, not sure what the thinking for 'gpios' was, but it's wrong and
> you
> just copied it. If we follow the normal cell encoding with 2 cells,
> this
> means the property takes 3 gpios (though the last 2 are marked not
> present with 0).
I will replace both of those properties with a valid example.

Artur
>
> Rob