Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1679652 > unrolled thread
| Started by | Baolin Wang <baolin.wang@linaro.org> |
|---|---|
| First post | 2017-07-03 08:10 +0200 |
| Last post | 2017-07-04 09:30 +0200 |
| Articles | 5 — 3 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
[PATCH v2 3/3] power: wm831x_power: Support USB charger current limit management Baolin Wang <baolin.wang@linaro.org> - 2017-07-03 08:10 +0200
Re: [PATCH v2 3/3] power: wm831x_power: Support USB charger current limit management Charles Keepax <ckeepax@opensource.cirrus.com> - 2017-07-03 11:00 +0200
Re: [PATCH v2 3/3] power: wm831x_power: Support USB charger current limit management Baolin Wang <baolin.wang@linaro.org> - 2017-07-04 09:30 +0200
Re: [PATCH v2 3/3] power: wm831x_power: Support USB charger current limit management Sebastian Reichel <sebastian.reichel@collabora.co.uk> - 2017-07-03 18:00 +0200
Re: [PATCH v2 3/3] power: wm831x_power: Support USB charger current limit management Baolin Wang <baolin.wang@linaro.org> - 2017-07-04 09:30 +0200
| From | Baolin Wang <baolin.wang@linaro.org> |
|---|---|
| Date | 2017-07-03 08:10 +0200 |
| Subject | [PATCH v2 3/3] power: wm831x_power: Support USB charger current limit management |
| Message-ID | <tZ2Ix-5y7-3@gated-at.bofh.it> |
Integrate with the newly added USB charger interface to limit the current
we draw from the USB input based on the input device configuration
identified by the USB stack, allowing us to charge more quickly from high
current inputs without drawing more current than specified from others.
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Baolin Wang <baolin.wang@linaro.org>
---
drivers/power/supply/wm831x_power.c | 61 +++++++++++++++++++++++++++++++++++
1 file changed, 61 insertions(+)
diff --git a/drivers/power/supply/wm831x_power.c b/drivers/power/supply/wm831x_power.c
index 7082301..3e3480708 100644
--- a/drivers/power/supply/wm831x_power.c
+++ b/drivers/power/supply/wm831x_power.c
@@ -13,6 +13,7 @@
#include <linux/platform_device.h>
#include <linux/power_supply.h>
#include <linux/slab.h>
+#include <linux/usb/phy.h>
#include <linux/mfd/wm831x/core.h>
#include <linux/mfd/wm831x/auxadc.h>
@@ -31,6 +32,8 @@ struct wm831x_power {
char usb_name[20];
char battery_name[20];
bool have_battery;
+ struct usb_phy *usb_phy;
+ struct notifier_block usb_notify;
};
static int wm831x_power_check_online(struct wm831x *wm831x, int supply,
@@ -125,6 +128,43 @@ static int wm831x_usb_get_prop(struct power_supply *psy,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
};
+/* In milliamps */
+static const unsigned int wm831x_usb_limits[] = {
+ 0,
+ 2,
+ 100,
+ 500,
+ 900,
+ 1500,
+ 1800,
+ 550,
+};
+
+static int wm831x_usb_limit_change(struct notifier_block *nb,
+ unsigned long limit, void *data)
+{
+ struct wm831x_power *wm831x_power = container_of(nb,
+ struct wm831x_power,
+ usb_notify);
+ unsigned int i, best;
+
+ /* Find the highest supported limit */
+ best = 0;
+ for (i = 0; i < ARRAY_SIZE(wm831x_usb_limits); i++) {
+ if (limit >= wm831x_usb_limits[i] &&
+ wm831x_usb_limits[best] < wm831x_usb_limits[i])
+ best = i;
+ }
+
+ dev_dbg(wm831x_power->wm831x->dev,
+ "Limiting USB current to %umA", wm831x_usb_limits[best]);
+
+ wm831x_set_bits(wm831x_power->wm831x, WM831X_POWER_STATE,
+ WM831X_USB_ILIM_MASK, best);
+
+ return 0;
+}
+
/*********************************************************************
* Battery properties
*********************************************************************/
@@ -607,6 +647,22 @@ static int wm831x_power_probe(struct platform_device *pdev)
}
}
+ power->usb_phy = devm_usb_get_phy_by_phandle(&pdev->dev,
+ "usb-phy", 0);
+ if (IS_ERR(power->usb_phy)) {
+ ret = PTR_ERR(power->usb_phy);
+ dev_err(&pdev->dev, "Failed to find USB phy: %d\n", ret);
+ goto err_bat_irq;
+ }
+
+ power->usb_notify.notifier_call = wm831x_usb_limit_change;
+ ret = usb_register_notifier(power->usb_phy,
+ &power->usb_notify);
+ if (ret) {
+ dev_err(&pdev->dev, "Failed to register notifier: %d\n", ret);
+ goto err_bat_irq;
+ }
+
return ret;
err_bat_irq:
@@ -637,6 +693,11 @@ static int wm831x_power_remove(struct platform_device *pdev)
struct wm831x *wm831x = wm831x_power->wm831x;
int irq, i;
+ if (wm831x_power->usb_phy) {
+ usb_unregister_notifier(wm831x_power->usb_phy,
+ &wm831x_power->usb_notify);
+ }
+
for (i = 0; i < ARRAY_SIZE(wm831x_bat_irqs); i++) {
irq = wm831x_irq(wm831x,
platform_get_irq_byname(pdev,
--
1.7.9.5
[toc] | [next] | [standalone]
| From | Charles Keepax <ckeepax@opensource.cirrus.com> |
|---|---|
| Date | 2017-07-03 11:00 +0200 |
| Subject | Re: [PATCH v2 3/3] power: wm831x_power: Support USB charger current limit management |
| Message-ID | <tZ5n3-78c-13@gated-at.bofh.it> |
| In reply to | #1679652 |
On Mon, Jul 03, 2017 at 02:07:15PM +0800, Baolin Wang wrote:
> Integrate with the newly added USB charger interface to limit the current
> we draw from the USB input based on the input device configuration
> identified by the USB stack, allowing us to charge more quickly from high
> current inputs without drawing more current than specified from others.
>
> Signed-off-by: Mark Brown <broonie@kernel.org>
> Signed-off-by: Baolin Wang <baolin.wang@linaro.org>
> ---
<snip>
> /*********************************************************************
> * Battery properties
> *********************************************************************/
> @@ -607,6 +647,22 @@ static int wm831x_power_probe(struct platform_device *pdev)
> }
> }
>
> + power->usb_phy = devm_usb_get_phy_by_phandle(&pdev->dev,
> + "usb-phy", 0);
> + if (IS_ERR(power->usb_phy)) {
> + ret = PTR_ERR(power->usb_phy);
> + dev_err(&pdev->dev, "Failed to find USB phy: %d\n", ret);
> + goto err_bat_irq;
> + }
> +
We should probably update the binding documentation for this as
well: mfd/wm831x.txt
Also I am not sure this needs to be implemented now, but what is
the plan regarding pdata systems? Generally the driver supports
both and it would be nice to know there is a way forward for that
even if we don't implement it yet.
Thanks,
Charles
[toc] | [prev] | [next] | [standalone]
| From | Baolin Wang <baolin.wang@linaro.org> |
|---|---|
| Date | 2017-07-04 09:30 +0200 |
| Subject | Re: [PATCH v2 3/3] power: wm831x_power: Support USB charger current limit management |
| Message-ID | <tZqrv-5a4-1@gated-at.bofh.it> |
| In reply to | #1679773 |
Hi,
On 3 July 2017 at 16:53, Charles Keepax <ckeepax@opensource.cirrus.com> wrote:
> On Mon, Jul 03, 2017 at 02:07:15PM +0800, Baolin Wang wrote:
>> Integrate with the newly added USB charger interface to limit the current
>> we draw from the USB input based on the input device configuration
>> identified by the USB stack, allowing us to charge more quickly from high
>> current inputs without drawing more current than specified from others.
>>
>> Signed-off-by: Mark Brown <broonie@kernel.org>
>> Signed-off-by: Baolin Wang <baolin.wang@linaro.org>
>> ---
> <snip>
>> /*********************************************************************
>> * Battery properties
>> *********************************************************************/
>> @@ -607,6 +647,22 @@ static int wm831x_power_probe(struct platform_device *pdev)
>> }
>> }
>>
>> + power->usb_phy = devm_usb_get_phy_by_phandle(&pdev->dev,
>> + "usb-phy", 0);
>> + if (IS_ERR(power->usb_phy)) {
>> + ret = PTR_ERR(power->usb_phy);
>> + dev_err(&pdev->dev, "Failed to find USB phy: %d\n", ret);
>> + goto err_bat_irq;
>> + }
>> +
>
> We should probably update the binding documentation for this as
> well: mfd/wm831x.txt
Yes, I will update the binding documentation.
>
> Also I am not sure this needs to be implemented now, but what is
> the plan regarding pdata systems? Generally the driver supports
> both and it would be nice to know there is a way forward for that
> even if we don't implement it yet.
OK, I'll modify this in next version. Thanks.
--
Baolin.wang
Best Regards
[toc] | [prev] | [next] | [standalone]
| From | Sebastian Reichel <sebastian.reichel@collabora.co.uk> |
|---|---|
| Date | 2017-07-03 18:00 +0200 |
| Subject | Re: [PATCH v2 3/3] power: wm831x_power: Support USB charger current limit management |
| Message-ID | <tZbVv-3vu-17@gated-at.bofh.it> |
| In reply to | #1679652 |
[Multipart message — attachments visible in raw view] — view raw
Hi,
On Mon, Jul 03, 2017 at 02:07:15PM +0800, Baolin Wang wrote:
> Integrate with the newly added USB charger interface to limit the current
> we draw from the USB input based on the input device configuration
> identified by the USB stack, allowing us to charge more quickly from high
> current inputs without drawing more current than specified from others.
>
> Signed-off-by: Mark Brown <broonie@kernel.org>
> Signed-off-by: Baolin Wang <baolin.wang@linaro.org>
Missing DT binding documentation, otherwise fine with me.
Would be nice to convert existing drivers:
$ git grep -l extcon -- drivers/power/supply
drivers/power/supply/axp288_charger.c
drivers/power/supply/bq24190_charger.c
drivers/power/supply/charger-manager.c
drivers/power/supply/qcom_smbb.c
-- Sebastian
> ---
> drivers/power/supply/wm831x_power.c | 61 +++++++++++++++++++++++++++++++++++
> 1 file changed, 61 insertions(+)
>
> diff --git a/drivers/power/supply/wm831x_power.c b/drivers/power/supply/wm831x_power.c
> index 7082301..3e3480708 100644
> --- a/drivers/power/supply/wm831x_power.c
> +++ b/drivers/power/supply/wm831x_power.c
> @@ -13,6 +13,7 @@
> #include <linux/platform_device.h>
> #include <linux/power_supply.h>
> #include <linux/slab.h>
> +#include <linux/usb/phy.h>
>
> #include <linux/mfd/wm831x/core.h>
> #include <linux/mfd/wm831x/auxadc.h>
> @@ -31,6 +32,8 @@ struct wm831x_power {
> char usb_name[20];
> char battery_name[20];
> bool have_battery;
> + struct usb_phy *usb_phy;
> + struct notifier_block usb_notify;
> };
>
> static int wm831x_power_check_online(struct wm831x *wm831x, int supply,
> @@ -125,6 +128,43 @@ static int wm831x_usb_get_prop(struct power_supply *psy,
> POWER_SUPPLY_PROP_VOLTAGE_NOW,
> };
>
> +/* In milliamps */
> +static const unsigned int wm831x_usb_limits[] = {
> + 0,
> + 2,
> + 100,
> + 500,
> + 900,
> + 1500,
> + 1800,
> + 550,
> +};
> +
> +static int wm831x_usb_limit_change(struct notifier_block *nb,
> + unsigned long limit, void *data)
> +{
> + struct wm831x_power *wm831x_power = container_of(nb,
> + struct wm831x_power,
> + usb_notify);
> + unsigned int i, best;
> +
> + /* Find the highest supported limit */
> + best = 0;
> + for (i = 0; i < ARRAY_SIZE(wm831x_usb_limits); i++) {
> + if (limit >= wm831x_usb_limits[i] &&
> + wm831x_usb_limits[best] < wm831x_usb_limits[i])
> + best = i;
> + }
> +
> + dev_dbg(wm831x_power->wm831x->dev,
> + "Limiting USB current to %umA", wm831x_usb_limits[best]);
> +
> + wm831x_set_bits(wm831x_power->wm831x, WM831X_POWER_STATE,
> + WM831X_USB_ILIM_MASK, best);
> +
> + return 0;
> +}
> +
> /*********************************************************************
> * Battery properties
> *********************************************************************/
> @@ -607,6 +647,22 @@ static int wm831x_power_probe(struct platform_device *pdev)
> }
> }
>
> + power->usb_phy = devm_usb_get_phy_by_phandle(&pdev->dev,
> + "usb-phy", 0);
> + if (IS_ERR(power->usb_phy)) {
> + ret = PTR_ERR(power->usb_phy);
> + dev_err(&pdev->dev, "Failed to find USB phy: %d\n", ret);
> + goto err_bat_irq;
> + }
> +
> + power->usb_notify.notifier_call = wm831x_usb_limit_change;
> + ret = usb_register_notifier(power->usb_phy,
> + &power->usb_notify);
> + if (ret) {
> + dev_err(&pdev->dev, "Failed to register notifier: %d\n", ret);
> + goto err_bat_irq;
> + }
> +
> return ret;
>
> err_bat_irq:
> @@ -637,6 +693,11 @@ static int wm831x_power_remove(struct platform_device *pdev)
> struct wm831x *wm831x = wm831x_power->wm831x;
> int irq, i;
>
> + if (wm831x_power->usb_phy) {
> + usb_unregister_notifier(wm831x_power->usb_phy,
> + &wm831x_power->usb_notify);
> + }
> +
> for (i = 0; i < ARRAY_SIZE(wm831x_bat_irqs); i++) {
> irq = wm831x_irq(wm831x,
> platform_get_irq_byname(pdev,
> --
> 1.7.9.5
>
[toc] | [prev] | [next] | [standalone]
| From | Baolin Wang <baolin.wang@linaro.org> |
|---|---|
| Date | 2017-07-04 09:30 +0200 |
| Subject | Re: [PATCH v2 3/3] power: wm831x_power: Support USB charger current limit management |
| Message-ID | <tZqrw-5a4-13@gated-at.bofh.it> |
| In reply to | #1680464 |
Hi,
On 3 July 2017 at 23:50, Sebastian Reichel
<sebastian.reichel@collabora.co.uk> wrote:
> Hi,
>
> On Mon, Jul 03, 2017 at 02:07:15PM +0800, Baolin Wang wrote:
>> Integrate with the newly added USB charger interface to limit the current
>> we draw from the USB input based on the input device configuration
>> identified by the USB stack, allowing us to charge more quickly from high
>> current inputs without drawing more current than specified from others.
>>
>> Signed-off-by: Mark Brown <broonie@kernel.org>
>> Signed-off-by: Baolin Wang <baolin.wang@linaro.org>
>
> Missing DT binding documentation, otherwise fine with me.
> Would be nice to convert existing drivers:
>
> $ git grep -l extcon -- drivers/power/supply
> drivers/power/supply/axp288_charger.c
> drivers/power/supply/bq24190_charger.c
> drivers/power/supply/charger-manager.c
> drivers/power/supply/qcom_smbb.c
I'll create new patches with adding the DT binding documentation if
there are no objections for USB phy modification, moreover I will help
to convert these drivers you listed. Thanks.
>
> -- Sebastian
>
>> ---
>> drivers/power/supply/wm831x_power.c | 61 +++++++++++++++++++++++++++++++++++
>> 1 file changed, 61 insertions(+)
>>
>> diff --git a/drivers/power/supply/wm831x_power.c b/drivers/power/supply/wm831x_power.c
>> index 7082301..3e3480708 100644
>> --- a/drivers/power/supply/wm831x_power.c
>> +++ b/drivers/power/supply/wm831x_power.c
>> @@ -13,6 +13,7 @@
>> #include <linux/platform_device.h>
>> #include <linux/power_supply.h>
>> #include <linux/slab.h>
>> +#include <linux/usb/phy.h>
>>
>> #include <linux/mfd/wm831x/core.h>
>> #include <linux/mfd/wm831x/auxadc.h>
>> @@ -31,6 +32,8 @@ struct wm831x_power {
>> char usb_name[20];
>> char battery_name[20];
>> bool have_battery;
>> + struct usb_phy *usb_phy;
>> + struct notifier_block usb_notify;
>> };
>>
>> static int wm831x_power_check_online(struct wm831x *wm831x, int supply,
>> @@ -125,6 +128,43 @@ static int wm831x_usb_get_prop(struct power_supply *psy,
>> POWER_SUPPLY_PROP_VOLTAGE_NOW,
>> };
>>
>> +/* In milliamps */
>> +static const unsigned int wm831x_usb_limits[] = {
>> + 0,
>> + 2,
>> + 100,
>> + 500,
>> + 900,
>> + 1500,
>> + 1800,
>> + 550,
>> +};
>> +
>> +static int wm831x_usb_limit_change(struct notifier_block *nb,
>> + unsigned long limit, void *data)
>> +{
>> + struct wm831x_power *wm831x_power = container_of(nb,
>> + struct wm831x_power,
>> + usb_notify);
>> + unsigned int i, best;
>> +
>> + /* Find the highest supported limit */
>> + best = 0;
>> + for (i = 0; i < ARRAY_SIZE(wm831x_usb_limits); i++) {
>> + if (limit >= wm831x_usb_limits[i] &&
>> + wm831x_usb_limits[best] < wm831x_usb_limits[i])
>> + best = i;
>> + }
>> +
>> + dev_dbg(wm831x_power->wm831x->dev,
>> + "Limiting USB current to %umA", wm831x_usb_limits[best]);
>> +
>> + wm831x_set_bits(wm831x_power->wm831x, WM831X_POWER_STATE,
>> + WM831X_USB_ILIM_MASK, best);
>> +
>> + return 0;
>> +}
>> +
>> /*********************************************************************
>> * Battery properties
>> *********************************************************************/
>> @@ -607,6 +647,22 @@ static int wm831x_power_probe(struct platform_device *pdev)
>> }
>> }
>>
>> + power->usb_phy = devm_usb_get_phy_by_phandle(&pdev->dev,
>> + "usb-phy", 0);
>> + if (IS_ERR(power->usb_phy)) {
>> + ret = PTR_ERR(power->usb_phy);
>> + dev_err(&pdev->dev, "Failed to find USB phy: %d\n", ret);
>> + goto err_bat_irq;
>> + }
>> +
>> + power->usb_notify.notifier_call = wm831x_usb_limit_change;
>> + ret = usb_register_notifier(power->usb_phy,
>> + &power->usb_notify);
>> + if (ret) {
>> + dev_err(&pdev->dev, "Failed to register notifier: %d\n", ret);
>> + goto err_bat_irq;
>> + }
>> +
>> return ret;
>>
>> err_bat_irq:
>> @@ -637,6 +693,11 @@ static int wm831x_power_remove(struct platform_device *pdev)
>> struct wm831x *wm831x = wm831x_power->wm831x;
>> int irq, i;
>>
>> + if (wm831x_power->usb_phy) {
>> + usb_unregister_notifier(wm831x_power->usb_phy,
>> + &wm831x_power->usb_notify);
>> + }
>> +
>> for (i = 0; i < ARRAY_SIZE(wm831x_bat_irqs); i++) {
>> irq = wm831x_irq(wm831x,
>> platform_get_irq_byname(pdev,
>> --
>> 1.7.9.5
>>
--
Baolin.wang
Best Regards
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web