2019-11-03 22:09:40

by Paul Cercueil

[permalink] [raw]
Subject: [PATCH 1/2] dt-bindings: power/supply: Document generic USB charger

Add documentation about the devicetree bindings for the generic USB
charger.

Signed-off-by: Paul Cercueil <[email protected]>
---
.../bindings/power/supply/usb-charger.txt | 24 +++++++++++++++++++
1 file changed, 24 insertions(+)
create mode 100644 Documentation/devicetree/bindings/power/supply/usb-charger.txt

diff --git a/Documentation/devicetree/bindings/power/supply/usb-charger.txt b/Documentation/devicetree/bindings/power/supply/usb-charger.txt
new file mode 100644
index 000000000000..fd46734cb0e5
--- /dev/null
+++ b/Documentation/devicetree/bindings/power/supply/usb-charger.txt
@@ -0,0 +1,24 @@
+Generic USB charger bindings
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Required properties :
+ - compatible : should be "usb-charger"
+ - phys: phandle to the USB PHY
+
+Example:
+
+usb_con: extcon {
+ compatible = "linux,extcon-usb-gpio";
+ vbus-gpios = <&gpb 5 GPIO_ACTIVE_HIGH>;
+};
+
+usb_phy: usb-phy@0 {
+ compatible = "usb-nop-xceiv";
+ #phy-cells = <0>;
+ extcon = <&usb_con>;
+};
+
+usb_charger: usb-charger {
+ compatible = "usb-charger";
+ phys = <&usb_phy>;
+};
--
2.24.0.rc1


2019-11-03 22:12:54

by Paul Cercueil

[permalink] [raw]
Subject: [PATCH 2/2] power/supply: Add generic USB charger driver

This simple charger driver uses the USB PHY framework to detect the
presence of a charger.

Signed-off-by: Paul Cercueil <[email protected]>
---
drivers/power/supply/Kconfig | 7 ++
drivers/power/supply/Makefile | 1 +
drivers/power/supply/generic-usb-charger.c | 140 +++++++++++++++++++++
3 files changed, 148 insertions(+)
create mode 100644 drivers/power/supply/generic-usb-charger.c

diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig
index c84a7b1caeb6..069a91d89a42 100644
--- a/drivers/power/supply/Kconfig
+++ b/drivers/power/supply/Kconfig
@@ -51,6 +51,13 @@ config GENERIC_ADC_BATTERY
Say Y here to enable support for the generic battery driver
which uses IIO framework to read adc.

+config GENERIC_USB_CHARGER
+ tristate "Generic USB charger"
+ depends on USB_PHY
+ help
+ Say Y here to enable a generic USB charger driver which uses
+ the USB PHY framework to detect the presence of the charger.
+
config MAX8925_POWER
tristate "MAX8925 battery charger support"
depends on MFD_MAX8925
diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile
index 6c7da920ea83..03f9b553bdfc 100644
--- a/drivers/power/supply/Makefile
+++ b/drivers/power/supply/Makefile
@@ -8,6 +8,7 @@ power_supply-$(CONFIG_LEDS_TRIGGERS) += power_supply_leds.o
obj-$(CONFIG_POWER_SUPPLY) += power_supply.o
obj-$(CONFIG_POWER_SUPPLY_HWMON) += power_supply_hwmon.o
obj-$(CONFIG_GENERIC_ADC_BATTERY) += generic-adc-battery.o
+obj-$(CONFIG_GENERIC_USB_CHARGER) += generic-usb-charger.o

obj-$(CONFIG_PDA_POWER) += pda_power.o
obj-$(CONFIG_APM_POWER) += apm_power.o
diff --git a/drivers/power/supply/generic-usb-charger.c b/drivers/power/supply/generic-usb-charger.c
new file mode 100644
index 000000000000..d005acfc33c7
--- /dev/null
+++ b/drivers/power/supply/generic-usb-charger.c
@@ -0,0 +1,140 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Simple USB charger driver
+ * Copyright (c) 2019 Paul Cercueil <[email protected]>
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/power_supply.h>
+#include <linux/usb/phy.h>
+
+struct usb_charger {
+ struct usb_phy *phy;
+ struct notifier_block nb;
+ struct power_supply_desc desc;
+ struct power_supply *charger;
+};
+
+static enum power_supply_property usb_charger_properties[] = {
+ POWER_SUPPLY_PROP_ONLINE,
+};
+
+static int usb_charger_get_property(struct power_supply *psy,
+ enum power_supply_property psp,
+ union power_supply_propval *val)
+{
+ struct usb_charger *charger = power_supply_get_drvdata(psy);
+
+ switch (psp) {
+ case POWER_SUPPLY_PROP_ONLINE:
+ val->intval = charger->phy->chg_state == USB_CHARGER_PRESENT;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int usb_charger_event(struct notifier_block *nb,
+ unsigned long event, void *d)
+{
+ struct usb_charger *charger = container_of(nb, struct usb_charger, nb);
+
+ power_supply_changed(charger->charger);
+
+ return 0;
+}
+
+static int usb_charger_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct power_supply_desc *desc;
+ struct usb_charger *charger;
+ struct power_supply_config cfg = {
+ .of_node = dev->of_node,
+ };
+ int err;
+
+ charger = devm_kzalloc(dev, sizeof(*charger), GFP_KERNEL);
+ if (!charger)
+ return -ENOMEM;
+
+ platform_set_drvdata(pdev, charger);
+ charger->nb.notifier_call = usb_charger_event;
+ cfg.drv_data = charger;
+
+ if (dev->of_node)
+ charger->phy = devm_usb_get_phy_by_phandle(dev, "phys", 0);
+ else
+ charger->phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
+ if (IS_ERR(charger->phy)) {
+ err = PTR_ERR(charger->phy);
+ if (err != -EPROBE_DEFER)
+ dev_err(dev, "No transceiver configured");
+ return err;
+ }
+
+ desc = &charger->desc;
+ desc->name = "usb-charger";
+ desc->properties = usb_charger_properties;
+ desc->num_properties = ARRAY_SIZE(usb_charger_properties);
+ desc->get_property = usb_charger_get_property;
+
+ switch (charger->phy->chg_type) {
+ case SDP_TYPE:
+ desc->type = POWER_SUPPLY_TYPE_USB;
+ break;
+ case DCP_TYPE:
+ desc->type = POWER_SUPPLY_TYPE_USB_DCP;
+ break;
+ case CDP_TYPE:
+ desc->type = POWER_SUPPLY_TYPE_USB_CDP;
+ break;
+ case ACA_TYPE:
+ desc->type = POWER_SUPPLY_TYPE_USB_ACA;
+ break;
+ default:
+ desc->type = POWER_SUPPLY_TYPE_UNKNOWN;
+ }
+
+ charger->charger = devm_power_supply_register(dev, desc, &cfg);
+ if (IS_ERR(charger->charger)) {
+ dev_err(dev, "Unable to register charger");
+ return PTR_ERR(charger->charger);
+ }
+
+ return usb_register_notifier(charger->phy, &charger->nb);
+}
+
+static int usb_charger_remove(struct platform_device *pdev)
+{
+ struct usb_charger *charger = platform_get_drvdata(pdev);
+
+ usb_unregister_notifier(charger->phy, &charger->nb);
+
+ return 0;
+}
+
+#ifdef CONFIG_OF
+static const struct of_device_id usb_charger_of_match[] = {
+ { .compatible = "usb-charger" },
+ { /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(of, usb_charger_of_match);
+#endif
+
+static struct platform_driver usb_charger_driver = {
+ .driver = {
+ .name = "usb-charger",
+ .of_match_table = of_match_ptr(usb_charger_of_match),
+ },
+ .probe = usb_charger_probe,
+ .remove = usb_charger_remove,
+};
+module_platform_driver(usb_charger_driver);
+
+MODULE_DESCRIPTION("Simple USB charger driver");
+MODULE_AUTHOR("Paul Cercueil <[email protected]>");
+MODULE_LICENSE("GPL");
--
2.24.0.rc1

2019-11-03 22:54:18

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH 2/2] power/supply: Add generic USB charger driver

Hi Paul,

I love your patch! Yet something to improve:

[auto build test ERROR on power-supply/for-next]
[cannot apply to v5.4-rc6 next-20191031]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url: https://github.com/0day-ci/linux/commits/Paul-Cercueil/dt-bindings-power-supply-Document-generic-USB-charger/20191104-061214
base: https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git for-next
config: sh-allmodconfig (attached as .config)
compiler: sh4-linux-gcc (GCC) 7.4.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
GCC_VERSION=7.4.0 make.cross ARCH=sh

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <[email protected]>

All error/warnings (new ones prefixed by >>):

>> drivers/power/supply/generic-usb-charger.c:131:21: error: implicit declaration of function 'of_match_ptr'; did you mean 'usb_match_id'? [-Werror=implicit-function-declaration]
.of_match_table = of_match_ptr(usb_charger_of_match),
^~~~~~~~~~~~
usb_match_id
>> drivers/power/supply/generic-usb-charger.c:131:21: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
drivers/power/supply/generic-usb-charger.c:131:21: note: (near initialization for 'usb_charger_driver.driver.of_match_table')
>> drivers/power/supply/generic-usb-charger.c:131:21: error: initializer element is not constant
drivers/power/supply/generic-usb-charger.c:131:21: note: (near initialization for 'usb_charger_driver.driver.of_match_table')
cc1: some warnings being treated as errors

vim +131 drivers/power/supply/generic-usb-charger.c

127
128 static struct platform_driver usb_charger_driver = {
129 .driver = {
130 .name = "usb-charger",
> 131 .of_match_table = of_match_ptr(usb_charger_of_match),
132 },
133 .probe = usb_charger_probe,
134 .remove = usb_charger_remove,
135 };
136 module_platform_driver(usb_charger_driver);
137

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation


Attachments:
(No filename) (2.49 kB)
.config.gz (51.03 kB)
Download all attachments

2019-11-04 13:54:34

by Rob Herring

[permalink] [raw]
Subject: Re: [PATCH 1/2] dt-bindings: power/supply: Document generic USB charger

On Sun, Nov 3, 2019 at 4:08 PM Paul Cercueil <[email protected]> wrote:
>
> Add documentation about the devicetree bindings for the generic USB
> charger.

What makes it generic?

>
> Signed-off-by: Paul Cercueil <[email protected]>
> ---
> .../bindings/power/supply/usb-charger.txt | 24 +++++++++++++++++++
> 1 file changed, 24 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/power/supply/usb-charger.txt
>
> diff --git a/Documentation/devicetree/bindings/power/supply/usb-charger.txt b/Documentation/devicetree/bindings/power/supply/usb-charger.txt
> new file mode 100644
> index 000000000000..fd46734cb0e5
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/power/supply/usb-charger.txt
> @@ -0,0 +1,24 @@
> +Generic USB charger bindings
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +Required properties :
> + - compatible : should be "usb-charger"
> + - phys: phandle to the USB PHY
> +
> +Example:
> +
> +usb_con: extcon {
> + compatible = "linux,extcon-usb-gpio";
> + vbus-gpios = <&gpb 5 GPIO_ACTIVE_HIGH>;
> +};
> +
> +usb_phy: usb-phy@0 {
> + compatible = "usb-nop-xceiv";
> + #phy-cells = <0>;
> + extcon = <&usb_con>;

extcon is deprecated in favor of usb-connector binding. See
.../bindings/connector/usb-connector.txt. There's also some pending
patches for adding GPIO based connector controls including Vbus sense
(GPIO input) and control (regulator via a GPIO).

Rob

2019-11-05 09:19:42

by Paul Cercueil

[permalink] [raw]
Subject: Re: [PATCH 1/2] dt-bindings: power/supply: Document generic USB charger

Hi Rob,


Le lun., nov. 4, 2019 at 07:52, Rob Herring <[email protected]> a
?crit :
> On Sun, Nov 3, 2019 at 4:08 PM Paul Cercueil <[email protected]>
> wrote:
>>
>> Add documentation about the devicetree bindings for the generic USB
>> charger.
>
> What makes it generic?

It only uses the USB PHY subsystem, which already has some half-baked
support for chargers but not bound to the power-supply subsystem.


>>
>> Signed-off-by: Paul Cercueil <[email protected]>
>> ---
>> .../bindings/power/supply/usb-charger.txt | 24
>> +++++++++++++++++++
>> 1 file changed, 24 insertions(+)
>> create mode 100644
>> Documentation/devicetree/bindings/power/supply/usb-charger.txt
>>
>> diff --git
>> a/Documentation/devicetree/bindings/power/supply/usb-charger.txt
>> b/Documentation/devicetree/bindings/power/supply/usb-charger.txt
>> new file mode 100644
>> index 000000000000..fd46734cb0e5
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/power/supply/usb-charger.txt
>> @@ -0,0 +1,24 @@
>> +Generic USB charger bindings
>> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> +
>> +Required properties :
>> + - compatible : should be "usb-charger"
>> + - phys: phandle to the USB PHY
>> +
>> +Example:
>> +
>> +usb_con: extcon {
>> + compatible = "linux,extcon-usb-gpio";
>> + vbus-gpios = <&gpb 5 GPIO_ACTIVE_HIGH>;
>> +};
>> +
>> +usb_phy: usb-phy@0 {
>> + compatible = "usb-nop-xceiv";
>> + #phy-cells = <0>;
>> + extcon = <&usb_con>;
>
> extcon is deprecated in favor of usb-connector binding. See
> .../bindings/connector/usb-connector.txt. There's also some pending
> patches for adding GPIO based connector controls including Vbus sense
> (GPIO input) and control (regulator via a GPIO).
>
> Rob

I understand that the usb-connector binding is better, but the current
code doesn't integrate at all with the USB PHY subsystem, which has its
own code to handle ID and VBUS GPIOs and supports notifiers. Is that
deprecated then?

What's the big picture here?

Thanks,
-Paul



2019-11-05 13:50:45

by Rob Herring

[permalink] [raw]
Subject: Re: [PATCH 1/2] dt-bindings: power/supply: Document generic USB charger

On Tue, Nov 5, 2019 at 3:16 AM Paul Cercueil <[email protected]> wrote:
>
> Hi Rob,
>
>
> Le lun., nov. 4, 2019 at 07:52, Rob Herring <[email protected]> a
> écrit :
> > On Sun, Nov 3, 2019 at 4:08 PM Paul Cercueil <[email protected]>
> > wrote:
> >>
> >> Add documentation about the devicetree bindings for the generic USB
> >> charger.
> >
> > What makes it generic?
>
> It only uses the USB PHY subsystem, which already has some half-baked
> support for chargers but not bound to the power-supply subsystem.
>
>
> >>
> >> Signed-off-by: Paul Cercueil <[email protected]>
> >> ---
> >> .../bindings/power/supply/usb-charger.txt | 24
> >> +++++++++++++++++++
> >> 1 file changed, 24 insertions(+)
> >> create mode 100644
> >> Documentation/devicetree/bindings/power/supply/usb-charger.txt
> >>
> >> diff --git
> >> a/Documentation/devicetree/bindings/power/supply/usb-charger.txt
> >> b/Documentation/devicetree/bindings/power/supply/usb-charger.txt
> >> new file mode 100644
> >> index 000000000000..fd46734cb0e5
> >> --- /dev/null
> >> +++ b/Documentation/devicetree/bindings/power/supply/usb-charger.txt
> >> @@ -0,0 +1,24 @@
> >> +Generic USB charger bindings
> >> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> >> +
> >> +Required properties :
> >> + - compatible : should be "usb-charger"
> >> + - phys: phandle to the USB PHY
> >> +
> >> +Example:
> >> +
> >> +usb_con: extcon {
> >> + compatible = "linux,extcon-usb-gpio";
> >> + vbus-gpios = <&gpb 5 GPIO_ACTIVE_HIGH>;
> >> +};
> >> +
> >> +usb_phy: usb-phy@0 {
> >> + compatible = "usb-nop-xceiv";
> >> + #phy-cells = <0>;
> >> + extcon = <&usb_con>;
> >
> > extcon is deprecated in favor of usb-connector binding. See
> > .../bindings/connector/usb-connector.txt. There's also some pending
> > patches for adding GPIO based connector controls including Vbus sense
> > (GPIO input) and control (regulator via a GPIO).
> >
> > Rob
>
> I understand that the usb-connector binding is better, but the current
> code doesn't integrate at all with the USB PHY subsystem, which has its
> own code to handle ID and VBUS GPIOs and supports notifiers. Is that
> deprecated then?
>
> What's the big picture here?

Does this series work for you?:

https://patchwork.kernel.org/cover/11120707/

2019-11-05 23:20:42

by Paul Cercueil

[permalink] [raw]
Subject: Re: [PATCH 1/2] dt-bindings: power/supply: Document generic USB charger



Le mar., nov. 5, 2019 at 07:48, Rob Herring <[email protected]> a
?crit :
> On Tue, Nov 5, 2019 at 3:16 AM Paul Cercueil <[email protected]>
> wrote:
>>
>> Hi Rob,
>>
>>
>> Le lun., nov. 4, 2019 at 07:52, Rob Herring <[email protected]> a
>> ?crit :
>> > On Sun, Nov 3, 2019 at 4:08 PM Paul Cercueil
>> <[email protected]>
>> > wrote:
>> >>
>> >> Add documentation about the devicetree bindings for the generic
>> USB
>> >> charger.
>> >
>> > What makes it generic?
>>
>> It only uses the USB PHY subsystem, which already has some
>> half-baked
>> support for chargers but not bound to the power-supply subsystem.
>>
>>
>> >>
>> >> Signed-off-by: Paul Cercueil <[email protected]>
>> >> ---
>> >> .../bindings/power/supply/usb-charger.txt | 24
>> >> +++++++++++++++++++
>> >> 1 file changed, 24 insertions(+)
>> >> create mode 100644
>> >> Documentation/devicetree/bindings/power/supply/usb-charger.txt
>> >>
>> >> diff --git
>> >> a/Documentation/devicetree/bindings/power/supply/usb-charger.txt
>> >> b/Documentation/devicetree/bindings/power/supply/usb-charger.txt
>> >> new file mode 100644
>> >> index 000000000000..fd46734cb0e5
>> >> --- /dev/null
>> >> +++
>> b/Documentation/devicetree/bindings/power/supply/usb-charger.txt
>> >> @@ -0,0 +1,24 @@
>> >> +Generic USB charger bindings
>> >> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> >> +
>> >> +Required properties :
>> >> + - compatible : should be "usb-charger"
>> >> + - phys: phandle to the USB PHY
>> >> +
>> >> +Example:
>> >> +
>> >> +usb_con: extcon {
>> >> + compatible = "linux,extcon-usb-gpio";
>> >> + vbus-gpios = <&gpb 5 GPIO_ACTIVE_HIGH>;
>> >> +};
>> >> +
>> >> +usb_phy: usb-phy@0 {
>> >> + compatible = "usb-nop-xceiv";
>> >> + #phy-cells = <0>;
>> >> + extcon = <&usb_con>;
>> >
>> > extcon is deprecated in favor of usb-connector binding. See
>> > .../bindings/connector/usb-connector.txt. There's also some
>> pending
>> > patches for adding GPIO based connector controls including Vbus
>> sense
>> > (GPIO input) and control (regulator via a GPIO).
>> >
>> > Rob
>>
>> I understand that the usb-connector binding is better, but the
>> current
>> code doesn't integrate at all with the USB PHY subsystem, which has
>> its
>> own code to handle ID and VBUS GPIOs and supports notifiers. Is that
>> deprecated then?
>>
>> What's the big picture here?
>
> Does this series work for you?:
>
> https://patchwork.kernel.org/cover/11120707/

I had to do some changes to my musb and PHY drivers but it works, yes.

The good thing is that I didn't have to change this driver, so I'll
wait for feedback on patch 2/2 then post a v2 with a fixed devicetree
example.

Thanks,
-Paul


2019-11-29 19:12:32

by Sebastian Reichel

[permalink] [raw]
Subject: Re: [PATCH 2/2] power/supply: Add generic USB charger driver

Hi Paul,

On Sun, Nov 03, 2019 at 11:08:01PM +0100, Paul Cercueil wrote:
> This simple charger driver uses the USB PHY framework to detect the
> presence of a charger.
>
> Signed-off-by: Paul Cercueil <[email protected]>
> ---
> drivers/power/supply/Kconfig | 7 ++
> drivers/power/supply/Makefile | 1 +
> drivers/power/supply/generic-usb-charger.c | 140 +++++++++++++++++++++
> 3 files changed, 148 insertions(+)
> create mode 100644 drivers/power/supply/generic-usb-charger.c
>
> diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig
> index c84a7b1caeb6..069a91d89a42 100644
> --- a/drivers/power/supply/Kconfig
> +++ b/drivers/power/supply/Kconfig
> @@ -51,6 +51,13 @@ config GENERIC_ADC_BATTERY
> Say Y here to enable support for the generic battery driver
> which uses IIO framework to read adc.
>
> +config GENERIC_USB_CHARGER
> + tristate "Generic USB charger"
> + depends on USB_PHY
> + help
> + Say Y here to enable a generic USB charger driver which uses
> + the USB PHY framework to detect the presence of the charger.
> +
> config MAX8925_POWER
> tristate "MAX8925 battery charger support"
> depends on MFD_MAX8925
> diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile
> index 6c7da920ea83..03f9b553bdfc 100644
> --- a/drivers/power/supply/Makefile
> +++ b/drivers/power/supply/Makefile
> @@ -8,6 +8,7 @@ power_supply-$(CONFIG_LEDS_TRIGGERS) += power_supply_leds.o
> obj-$(CONFIG_POWER_SUPPLY) += power_supply.o
> obj-$(CONFIG_POWER_SUPPLY_HWMON) += power_supply_hwmon.o
> obj-$(CONFIG_GENERIC_ADC_BATTERY) += generic-adc-battery.o
> +obj-$(CONFIG_GENERIC_USB_CHARGER) += generic-usb-charger.o
>
> obj-$(CONFIG_PDA_POWER) += pda_power.o
> obj-$(CONFIG_APM_POWER) += apm_power.o
> diff --git a/drivers/power/supply/generic-usb-charger.c b/drivers/power/supply/generic-usb-charger.c
> new file mode 100644
> index 000000000000..d005acfc33c7
> --- /dev/null
> +++ b/drivers/power/supply/generic-usb-charger.c
> @@ -0,0 +1,140 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Simple USB charger driver
> + * Copyright (c) 2019 Paul Cercueil <[email protected]>
> + */
> +
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/power_supply.h>
> +#include <linux/usb/phy.h>

Missing <linux/of.h> for of_match_ptr()

> +
> +struct usb_charger {
> + struct usb_phy *phy;
> + struct notifier_block nb;
> + struct power_supply_desc desc;
> + struct power_supply *charger;
> +};
> +
> +static enum power_supply_property usb_charger_properties[] = {
> + POWER_SUPPLY_PROP_ONLINE,
> +};
> +
> +static int usb_charger_get_property(struct power_supply *psy,
> + enum power_supply_property psp,
> + union power_supply_propval *val)
> +{
> + struct usb_charger *charger = power_supply_get_drvdata(psy);
> +
> + switch (psp) {
> + case POWER_SUPPLY_PROP_ONLINE:
> + val->intval = charger->phy->chg_state == USB_CHARGER_PRESENT;
> + break;
> + default:
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> +
> +static int usb_charger_event(struct notifier_block *nb,
> + unsigned long event, void *d)
> +{
> + struct usb_charger *charger = container_of(nb, struct usb_charger, nb);
> +
> + power_supply_changed(charger->charger);
> +
> + return 0;
> +}
> +
> +static int usb_charger_probe(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + struct power_supply_desc *desc;
> + struct usb_charger *charger;
> + struct power_supply_config cfg = {
> + .of_node = dev->of_node,
> + };
> + int err;
> +
> + charger = devm_kzalloc(dev, sizeof(*charger), GFP_KERNEL);
> + if (!charger)
> + return -ENOMEM;
> +
> + platform_set_drvdata(pdev, charger);
> + charger->nb.notifier_call = usb_charger_event;
> + cfg.drv_data = charger;
> +
> + if (dev->of_node)
> + charger->phy = devm_usb_get_phy_by_phandle(dev, "phys", 0);
> + else
> + charger->phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
> + if (IS_ERR(charger->phy)) {
> + err = PTR_ERR(charger->phy);
> + if (err != -EPROBE_DEFER)
> + dev_err(dev, "No transceiver configured");
> + return err;
> + }
> +
> + desc = &charger->desc;
> + desc->name = "usb-charger";
> + desc->properties = usb_charger_properties;
> + desc->num_properties = ARRAY_SIZE(usb_charger_properties);
> + desc->get_property = usb_charger_get_property;
> +
> + switch (charger->phy->chg_type) {
> + case SDP_TYPE:
> + desc->type = POWER_SUPPLY_TYPE_USB;
> + break;
> + case DCP_TYPE:
> + desc->type = POWER_SUPPLY_TYPE_USB_DCP;
> + break;
> + case CDP_TYPE:
> + desc->type = POWER_SUPPLY_TYPE_USB_CDP;
> + break;
> + case ACA_TYPE:
> + desc->type = POWER_SUPPLY_TYPE_USB_ACA;
> + break;
> + default:
> + desc->type = POWER_SUPPLY_TYPE_UNKNOWN;
> + }

This is deprecated in favour of the POWER_SUPPLY_PROP_USB_TYPE
property. Set desc->type to POWER_SUPPLY_TYPE_USB and have a
look at e.g. drivers/power/supply/cros_usbpd-charger.c to see
how POWER_SUPPLY_PROP_USB_TYPE is supposed to work.

> + charger->charger = devm_power_supply_register(dev, desc, &cfg);
> + if (IS_ERR(charger->charger)) {
> + dev_err(dev, "Unable to register charger");
> + return PTR_ERR(charger->charger);
> + }
> +
> + return usb_register_notifier(charger->phy, &charger->nb);

Please register with devm_add_action_or_reset() or (better)
create a devm_usb_register_notifier().

> +}
> +
> +static int usb_charger_remove(struct platform_device *pdev)
> +{
> + struct usb_charger *charger = platform_get_drvdata(pdev);
> +
> + usb_unregister_notifier(charger->phy, &charger->nb);
> +
> + return 0;
> +}
> +
> +#ifdef CONFIG_OF
> +static const struct of_device_id usb_charger_of_match[] = {
> + { .compatible = "usb-charger" },
> + { /* sentinel */ },
> +};
> +MODULE_DEVICE_TABLE(of, usb_charger_of_match);
> +#endif
> +
> +static struct platform_driver usb_charger_driver = {
> + .driver = {
> + .name = "usb-charger",
> + .of_match_table = of_match_ptr(usb_charger_of_match),
> + },
> + .probe = usb_charger_probe,
> + .remove = usb_charger_remove,
> +};
> +module_platform_driver(usb_charger_driver);
> +
> +MODULE_DESCRIPTION("Simple USB charger driver");
> +MODULE_AUTHOR("Paul Cercueil <[email protected]>");
> +MODULE_LICENSE("GPL");

-- Sebastian


Attachments:
(No filename) (6.31 kB)
signature.asc (849.00 B)
Download all attachments