2020-12-21 09:55:12

by Timon Baetz

[permalink] [raw]
Subject: [PATCH v2 2/6] power: supply: max8997_charger: Set CHARGER current limit

Register for extcon notification and set charging current depending on
the detected cable type. Current values are taken from vendor kernel,
where most charger types end up setting 650mA [0].

Also enable and disable the CHARGER regulator based on extcon events.

[0] https://github.com/krzk/linux-vendor-backup/blob/samsung/galaxy-s2-epic-4g-touch-sph-d710-exynos4210-dump/drivers/misc/max8997-muic.c#L1675-L1678

Signed-off-by: Timon Baetz <[email protected]>
---
drivers/mfd/max8997.c | 4 +-
drivers/power/supply/max8997_charger.c | 94 ++++++++++++++++++++++++++
2 files changed, 96 insertions(+), 2 deletions(-)

diff --git a/drivers/mfd/max8997.c b/drivers/mfd/max8997.c
index 68d8f2b95287..55d3a6f97783 100644
--- a/drivers/mfd/max8997.c
+++ b/drivers/mfd/max8997.c
@@ -29,9 +29,9 @@
static const struct mfd_cell max8997_devs[] = {
{ .name = "max8997-pmic", },
{ .name = "max8997-rtc", },
- { .name = "max8997-battery", },
+ { .name = "max8997-battery", .of_compatible = "maxim,max8997-battery", },
{ .name = "max8997-haptic", },
- { .name = "max8997-muic", },
+ { .name = "max8997-muic", .of_compatible = "maxim,max8997-muic", },
{ .name = "max8997-led", .id = 1 },
{ .name = "max8997-led", .id = 2 },
};
diff --git a/drivers/power/supply/max8997_charger.c b/drivers/power/supply/max8997_charger.c
index 1947af25879a..6e8750e455ea 100644
--- a/drivers/power/supply/max8997_charger.c
+++ b/drivers/power/supply/max8997_charger.c
@@ -6,12 +6,14 @@
// MyungJoo Ham <[email protected]>

#include <linux/err.h>
+#include <linux/extcon.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/platform_device.h>
#include <linux/power_supply.h>
#include <linux/mfd/max8997.h>
#include <linux/mfd/max8997-private.h>
+#include <linux/regulator/consumer.h>

/* MAX8997_REG_STATUS4 */
#define DCINOK_SHIFT 1
@@ -31,6 +33,10 @@ struct charger_data {
struct device *dev;
struct max8997_dev *iodev;
struct power_supply *battery;
+ struct regulator *reg;
+ struct extcon_dev *edev;
+ struct notifier_block extcon_nb;
+ struct work_struct extcon_work;
};

static enum power_supply_property max8997_battery_props[] = {
@@ -88,6 +94,67 @@ static int max8997_battery_get_property(struct power_supply *psy,
return 0;
}

+static void max8997_battery_extcon_evt_stop_work(void *data)
+{
+ struct charger_data *charger = data;
+
+ cancel_work_sync(&charger->extcon_work);
+}
+
+static void max8997_battery_extcon_evt_worker(struct work_struct *work)
+{
+ struct charger_data *charger =
+ container_of(work, struct charger_data, extcon_work);
+ struct extcon_dev *edev = charger->edev;
+ int current_limit, ret;
+
+ if (extcon_get_state(edev, EXTCON_CHG_USB_SDP) > 0) {
+ dev_dbg(charger->dev, "USB SDP charger is connected\n");
+ current_limit = 450000;
+ } else if (extcon_get_state(edev, EXTCON_CHG_USB_DCP) > 0) {
+ dev_dbg(charger->dev, "USB DCP charger is connected\n");
+ current_limit = 650000;
+ } else if (extcon_get_state(edev, EXTCON_CHG_USB_FAST) > 0) {
+ dev_dbg(charger->dev, "USB FAST charger is connected\n");
+ current_limit = 650000;
+ } else if (extcon_get_state(edev, EXTCON_CHG_USB_SLOW) > 0) {
+ dev_dbg(charger->dev, "USB SLOW charger is connected\n");
+ current_limit = 650000;
+ } else if (extcon_get_state(edev, EXTCON_CHG_USB_CDP) > 0) {
+ dev_dbg(charger->dev, "USB CDP charger is connected\n");
+ current_limit = 650000;
+ } else {
+ dev_dbg(charger->dev, "USB charger is diconnected\n");
+ current_limit = -1;
+ }
+
+ if (current_limit > 0) {
+ ret = regulator_set_current_limit(charger->reg, current_limit, current_limit);
+ if (ret) {
+ dev_err(charger->dev, "failed to set current limit: %d\n", ret);
+ goto regulator_disable;
+ }
+ ret = regulator_enable(charger->reg);
+ if (ret)
+ dev_err(charger->dev, "failed to enable regulator: %d\n", ret);
+ return;
+ }
+
+regulator_disable:
+ ret = regulator_disable(charger->reg);
+ if (ret)
+ dev_err(charger->dev, "failed to disable regulator: %d\n", ret);
+}
+
+static int max8997_battery_extcon_evt(struct notifier_block *nb,
+ unsigned long event, void *param)
+{
+ struct charger_data *charger =
+ container_of(nb, struct charger_data, extcon_nb);
+ schedule_work(&charger->extcon_work);
+ return NOTIFY_OK;
+}
+
static const struct power_supply_desc max8997_battery_desc = {
.name = "max8997_pmic",
.type = POWER_SUPPLY_TYPE_BATTERY,
@@ -170,6 +237,33 @@ static int max8997_battery_probe(struct platform_device *pdev)
return PTR_ERR(charger->battery);
}

+ charger->reg = devm_regulator_get(&pdev->dev, "charger");
+ if (IS_ERR(charger->reg)) {
+ dev_err(&pdev->dev, "couldn't get charger regulator\n");
+ return PTR_ERR(charger->reg);
+ }
+
+ charger->edev = extcon_get_edev_by_phandle(&pdev->dev, 0);
+ if (IS_ERR(charger->edev)) {
+ if (PTR_ERR(charger->edev) != -EPROBE_DEFER)
+ dev_err(charger->dev, "couldn't get extcon device\n");
+ return PTR_ERR(charger->edev);
+ }
+
+ INIT_WORK(&charger->extcon_work, max8997_battery_extcon_evt_worker);
+ ret = devm_add_action(&pdev->dev, max8997_battery_extcon_evt_stop_work, charger);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to add extcon evt stop action: %d\n", ret);
+ return ret;
+ }
+ charger->extcon_nb.notifier_call = max8997_battery_extcon_evt;
+ ret = devm_extcon_register_notifier_all(&pdev->dev, charger->edev,
+ &charger->extcon_nb);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to register extcon notifier\n");
+ return ret;
+ };
+
return 0;
}

--
2.25.1



2020-12-21 10:27:23

by Lee Jones

[permalink] [raw]
Subject: Re: [PATCH v2 2/6] power: supply: max8997_charger: Set CHARGER current limit

On Mon, 21 Dec 2020, Timon Baetz wrote:

> Register for extcon notification and set charging current depending on
> the detected cable type. Current values are taken from vendor kernel,
> where most charger types end up setting 650mA [0].
>
> Also enable and disable the CHARGER regulator based on extcon events.
>
> [0] https://github.com/krzk/linux-vendor-backup/blob/samsung/galaxy-s2-epic-4g-touch-sph-d710-exynos4210-dump/drivers/misc/max8997-muic.c#L1675-L1678
>
> Signed-off-by: Timon Baetz <[email protected]>
> ---
> drivers/mfd/max8997.c | 4 +-

Please split this out into a separate patch.

> drivers/power/supply/max8997_charger.c | 94 ++++++++++++++++++++++++++
> 2 files changed, 96 insertions(+), 2 deletions(-)

--
Lee Jones [李琼斯]
Senior Technical Lead - Developer Services
Linaro.org │ Open source software for Arm SoCs
Follow Linaro: Facebook | Twitter | Blog

2020-12-21 14:19:08

by Krzysztof Kozlowski

[permalink] [raw]
Subject: Re: [PATCH v2 2/6] power: supply: max8997_charger: Set CHARGER current limit

On Mon, Dec 21, 2020 at 09:53:15AM +0000, Timon Baetz wrote:
> Register for extcon notification and set charging current depending on
> the detected cable type. Current values are taken from vendor kernel,
> where most charger types end up setting 650mA [0].
>
> Also enable and disable the CHARGER regulator based on extcon events.
>
> [0] https://github.com/krzk/linux-vendor-backup/blob/samsung/galaxy-s2-epic-4g-touch-sph-d710-exynos4210-dump/drivers/misc/max8997-muic.c#L1675-L1678
>
> Signed-off-by: Timon Baetz <[email protected]>
> ---
> drivers/mfd/max8997.c | 4 +-
> drivers/power/supply/max8997_charger.c | 94 ++++++++++++++++++++++++++
> 2 files changed, 96 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/mfd/max8997.c b/drivers/mfd/max8997.c
> index 68d8f2b95287..55d3a6f97783 100644
> --- a/drivers/mfd/max8997.c
> +++ b/drivers/mfd/max8997.c
> @@ -29,9 +29,9 @@
> static const struct mfd_cell max8997_devs[] = {
> { .name = "max8997-pmic", },
> { .name = "max8997-rtc", },
> - { .name = "max8997-battery", },
> + { .name = "max8997-battery", .of_compatible = "maxim,max8997-battery", },
> { .name = "max8997-haptic", },
> - { .name = "max8997-muic", },
> + { .name = "max8997-muic", .of_compatible = "maxim,max8997-muic", },

Undocumented bindings. The checkpatch should complain about it, so I
assume you did not run it. Please run the checkpatch.

> { .name = "max8997-led", .id = 1 },
> { .name = "max8997-led", .id = 2 },
> };
> diff --git a/drivers/power/supply/max8997_charger.c b/drivers/power/supply/max8997_charger.c
> index 1947af25879a..6e8750e455ea 100644
> --- a/drivers/power/supply/max8997_charger.c
> +++ b/drivers/power/supply/max8997_charger.c
> @@ -6,12 +6,14 @@
> // MyungJoo Ham <[email protected]>
>
> #include <linux/err.h>
> +#include <linux/extcon.h>
> #include <linux/module.h>
> #include <linux/slab.h>
> #include <linux/platform_device.h>
> #include <linux/power_supply.h>
> #include <linux/mfd/max8997.h>
> #include <linux/mfd/max8997-private.h>
> +#include <linux/regulator/consumer.h>
>
> /* MAX8997_REG_STATUS4 */
> #define DCINOK_SHIFT 1
> @@ -31,6 +33,10 @@ struct charger_data {
> struct device *dev;
> struct max8997_dev *iodev;
> struct power_supply *battery;
> + struct regulator *reg;
> + struct extcon_dev *edev;
> + struct notifier_block extcon_nb;
> + struct work_struct extcon_work;
> };
>
> static enum power_supply_property max8997_battery_props[] = {
> @@ -88,6 +94,67 @@ static int max8997_battery_get_property(struct power_supply *psy,
> return 0;
> }
>
> +static void max8997_battery_extcon_evt_stop_work(void *data)
> +{
> + struct charger_data *charger = data;
> +
> + cancel_work_sync(&charger->extcon_work);
> +}
> +
> +static void max8997_battery_extcon_evt_worker(struct work_struct *work)
> +{
> + struct charger_data *charger =
> + container_of(work, struct charger_data, extcon_work);
> + struct extcon_dev *edev = charger->edev;
> + int current_limit, ret;
> +
> + if (extcon_get_state(edev, EXTCON_CHG_USB_SDP) > 0) {
> + dev_dbg(charger->dev, "USB SDP charger is connected\n");
> + current_limit = 450000;
> + } else if (extcon_get_state(edev, EXTCON_CHG_USB_DCP) > 0) {
> + dev_dbg(charger->dev, "USB DCP charger is connected\n");
> + current_limit = 650000;
> + } else if (extcon_get_state(edev, EXTCON_CHG_USB_FAST) > 0) {
> + dev_dbg(charger->dev, "USB FAST charger is connected\n");
> + current_limit = 650000;
> + } else if (extcon_get_state(edev, EXTCON_CHG_USB_SLOW) > 0) {
> + dev_dbg(charger->dev, "USB SLOW charger is connected\n");
> + current_limit = 650000;
> + } else if (extcon_get_state(edev, EXTCON_CHG_USB_CDP) > 0) {
> + dev_dbg(charger->dev, "USB CDP charger is connected\n");
> + current_limit = 650000;
> + } else {
> + dev_dbg(charger->dev, "USB charger is diconnected\n");
> + current_limit = -1;
> + }
> +
> + if (current_limit > 0) {
> + ret = regulator_set_current_limit(charger->reg, current_limit, current_limit);
> + if (ret) {
> + dev_err(charger->dev, "failed to set current limit: %d\n", ret);
> + goto regulator_disable;

Unusual error path... if regulator was not enabled before and
regulator_set_current_limit() failed, you disable the regulator? Why?
Wasn't it already disabled?

Best regards,
Krzysztof

2020-12-21 15:36:54

by Timon Baetz

[permalink] [raw]
Subject: Re: [PATCH v2 2/6] power: supply: max8997_charger: Set CHARGER current limit

On Mon, 21 Dec 2020 15:16:27 +0100, Krzysztof Kozlowski wrote:
> On Mon, Dec 21, 2020 at 09:53:15AM +0000, Timon Baetz wrote:
> > Register for extcon notification and set charging current depending on
> > the detected cable type. Current values are taken from vendor kernel,
> > where most charger types end up setting 650mA [0].
> >
> > Also enable and disable the CHARGER regulator based on extcon events.
> >
> > [0] https://github.com/krzk/linux-vendor-backup/blob/samsung/galaxy-s2-epic-4g-touch-sph-d710-exynos4210-dump/drivers/misc/max8997-muic.c#L1675-L1678
> >
> > Signed-off-by: Timon Baetz <[email protected]>
> > ---
> > drivers/mfd/max8997.c | 4 +-
> > drivers/power/supply/max8997_charger.c | 94 ++++++++++++++++++++++++++
> > 2 files changed, 96 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/mfd/max8997.c b/drivers/mfd/max8997.c
> > index 68d8f2b95287..55d3a6f97783 100644
> > --- a/drivers/mfd/max8997.c
> > +++ b/drivers/mfd/max8997.c
> > @@ -29,9 +29,9 @@
> > static const struct mfd_cell max8997_devs[] = {
> > { .name = "max8997-pmic", },
> > { .name = "max8997-rtc", },
> > - { .name = "max8997-battery", },
> > + { .name = "max8997-battery", .of_compatible = "maxim,max8997-battery", },
> > { .name = "max8997-haptic", },
> > - { .name = "max8997-muic", },
> > + { .name = "max8997-muic", .of_compatible = "maxim,max8997-muic", },
>
> Undocumented bindings. The checkpatch should complain about it, so I
> assume you did not run it. Please run the checkpatch.
>
> > { .name = "max8997-led", .id = 1 },
> > { .name = "max8997-led", .id = 2 },
> > };
> > diff --git a/drivers/power/supply/max8997_charger.c b/drivers/power/supply/max8997_charger.c
> > index 1947af25879a..6e8750e455ea 100644
> > --- a/drivers/power/supply/max8997_charger.c
> > +++ b/drivers/power/supply/max8997_charger.c
> > @@ -6,12 +6,14 @@
> > // MyungJoo Ham <[email protected]>
> >
> > #include <linux/err.h>
> > +#include <linux/extcon.h>
> > #include <linux/module.h>
> > #include <linux/slab.h>
> > #include <linux/platform_device.h>
> > #include <linux/power_supply.h>
> > #include <linux/mfd/max8997.h>
> > #include <linux/mfd/max8997-private.h>
> > +#include <linux/regulator/consumer.h>
> >
> > /* MAX8997_REG_STATUS4 */
> > #define DCINOK_SHIFT 1
> > @@ -31,6 +33,10 @@ struct charger_data {
> > struct device *dev;
> > struct max8997_dev *iodev;
> > struct power_supply *battery;
> > + struct regulator *reg;
> > + struct extcon_dev *edev;
> > + struct notifier_block extcon_nb;
> > + struct work_struct extcon_work;
> > };
> >
> > static enum power_supply_property max8997_battery_props[] = {
> > @@ -88,6 +94,67 @@ static int max8997_battery_get_property(struct power_supply *psy,
> > return 0;
> > }
> >
> > +static void max8997_battery_extcon_evt_stop_work(void *data)
> > +{
> > + struct charger_data *charger = data;
> > +
> > + cancel_work_sync(&charger->extcon_work);
> > +}
> > +
> > +static void max8997_battery_extcon_evt_worker(struct work_struct *work)
> > +{
> > + struct charger_data *charger =
> > + container_of(work, struct charger_data, extcon_work);
> > + struct extcon_dev *edev = charger->edev;
> > + int current_limit, ret;
> > +
> > + if (extcon_get_state(edev, EXTCON_CHG_USB_SDP) > 0) {
> > + dev_dbg(charger->dev, "USB SDP charger is connected\n");
> > + current_limit = 450000;
> > + } else if (extcon_get_state(edev, EXTCON_CHG_USB_DCP) > 0) {
> > + dev_dbg(charger->dev, "USB DCP charger is connected\n");
> > + current_limit = 650000;
> > + } else if (extcon_get_state(edev, EXTCON_CHG_USB_FAST) > 0) {
> > + dev_dbg(charger->dev, "USB FAST charger is connected\n");
> > + current_limit = 650000;
> > + } else if (extcon_get_state(edev, EXTCON_CHG_USB_SLOW) > 0) {
> > + dev_dbg(charger->dev, "USB SLOW charger is connected\n");
> > + current_limit = 650000;
> > + } else if (extcon_get_state(edev, EXTCON_CHG_USB_CDP) > 0) {
> > + dev_dbg(charger->dev, "USB CDP charger is connected\n");
> > + current_limit = 650000;
> > + } else {
> > + dev_dbg(charger->dev, "USB charger is diconnected\n");
> > + current_limit = -1;
> > + }
> > +
> > + if (current_limit > 0) {
> > + ret = regulator_set_current_limit(charger->reg, current_limit, current_limit);
> > + if (ret) {
> > + dev_err(charger->dev, "failed to set current limit: %d\n", ret);
> > + goto regulator_disable;
>
> Unusual error path... if regulator was not enabled before and
> regulator_set_current_limit() failed, you disable the regulator? Why?
> Wasn't it already disabled?

Because I thought you asked me to in v1 of this patch:
> Failure of setting the current should rather disable the charging.

I probably misunderstood you comment then. So I guess it should just
return?

Thanks for reviewing,
Timon

2020-12-21 15:45:35

by Krzysztof Kozlowski

[permalink] [raw]
Subject: Re: [PATCH v2 2/6] power: supply: max8997_charger: Set CHARGER current limit

On Mon, Dec 21, 2020 at 03:35:07PM +0000, Timon Baetz wrote:
> On Mon, 21 Dec 2020 15:16:27 +0100, Krzysztof Kozlowski wrote:
> > On Mon, Dec 21, 2020 at 09:53:15AM +0000, Timon Baetz wrote:
> > > Register for extcon notification and set charging current depending on
> > > the detected cable type. Current values are taken from vendor kernel,
> > > where most charger types end up setting 650mA [0].
> > >
> > > Also enable and disable the CHARGER regulator based on extcon events.
> > >
> > > [0] https://github.com/krzk/linux-vendor-backup/blob/samsung/galaxy-s2-epic-4g-touch-sph-d710-exynos4210-dump/drivers/misc/max8997-muic.c#L1675-L1678
> > >
> > > Signed-off-by: Timon Baetz <[email protected]>
> > > ---
> > > drivers/mfd/max8997.c | 4 +-
> > > drivers/power/supply/max8997_charger.c | 94 ++++++++++++++++++++++++++
> > > 2 files changed, 96 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/drivers/mfd/max8997.c b/drivers/mfd/max8997.c
> > > index 68d8f2b95287..55d3a6f97783 100644
> > > --- a/drivers/mfd/max8997.c
> > > +++ b/drivers/mfd/max8997.c
> > > @@ -29,9 +29,9 @@
> > > static const struct mfd_cell max8997_devs[] = {
> > > { .name = "max8997-pmic", },
> > > { .name = "max8997-rtc", },
> > > - { .name = "max8997-battery", },
> > > + { .name = "max8997-battery", .of_compatible = "maxim,max8997-battery", },
> > > { .name = "max8997-haptic", },
> > > - { .name = "max8997-muic", },
> > > + { .name = "max8997-muic", .of_compatible = "maxim,max8997-muic", },
> >
> > Undocumented bindings. The checkpatch should complain about it, so I
> > assume you did not run it. Please run the checkpatch.
> >
> > > { .name = "max8997-led", .id = 1 },
> > > { .name = "max8997-led", .id = 2 },
> > > };
> > > diff --git a/drivers/power/supply/max8997_charger.c b/drivers/power/supply/max8997_charger.c
> > > index 1947af25879a..6e8750e455ea 100644
> > > --- a/drivers/power/supply/max8997_charger.c
> > > +++ b/drivers/power/supply/max8997_charger.c
> > > @@ -6,12 +6,14 @@
> > > // MyungJoo Ham <[email protected]>
> > >
> > > #include <linux/err.h>
> > > +#include <linux/extcon.h>
> > > #include <linux/module.h>
> > > #include <linux/slab.h>
> > > #include <linux/platform_device.h>
> > > #include <linux/power_supply.h>
> > > #include <linux/mfd/max8997.h>
> > > #include <linux/mfd/max8997-private.h>
> > > +#include <linux/regulator/consumer.h>
> > >
> > > /* MAX8997_REG_STATUS4 */
> > > #define DCINOK_SHIFT 1
> > > @@ -31,6 +33,10 @@ struct charger_data {
> > > struct device *dev;
> > > struct max8997_dev *iodev;
> > > struct power_supply *battery;
> > > + struct regulator *reg;
> > > + struct extcon_dev *edev;
> > > + struct notifier_block extcon_nb;
> > > + struct work_struct extcon_work;
> > > };
> > >
> > > static enum power_supply_property max8997_battery_props[] = {
> > > @@ -88,6 +94,67 @@ static int max8997_battery_get_property(struct power_supply *psy,
> > > return 0;
> > > }
> > >
> > > +static void max8997_battery_extcon_evt_stop_work(void *data)
> > > +{
> > > + struct charger_data *charger = data;
> > > +
> > > + cancel_work_sync(&charger->extcon_work);
> > > +}
> > > +
> > > +static void max8997_battery_extcon_evt_worker(struct work_struct *work)
> > > +{
> > > + struct charger_data *charger =
> > > + container_of(work, struct charger_data, extcon_work);
> > > + struct extcon_dev *edev = charger->edev;
> > > + int current_limit, ret;
> > > +
> > > + if (extcon_get_state(edev, EXTCON_CHG_USB_SDP) > 0) {
> > > + dev_dbg(charger->dev, "USB SDP charger is connected\n");
> > > + current_limit = 450000;
> > > + } else if (extcon_get_state(edev, EXTCON_CHG_USB_DCP) > 0) {
> > > + dev_dbg(charger->dev, "USB DCP charger is connected\n");
> > > + current_limit = 650000;
> > > + } else if (extcon_get_state(edev, EXTCON_CHG_USB_FAST) > 0) {
> > > + dev_dbg(charger->dev, "USB FAST charger is connected\n");
> > > + current_limit = 650000;
> > > + } else if (extcon_get_state(edev, EXTCON_CHG_USB_SLOW) > 0) {
> > > + dev_dbg(charger->dev, "USB SLOW charger is connected\n");
> > > + current_limit = 650000;
> > > + } else if (extcon_get_state(edev, EXTCON_CHG_USB_CDP) > 0) {
> > > + dev_dbg(charger->dev, "USB CDP charger is connected\n");
> > > + current_limit = 650000;
> > > + } else {
> > > + dev_dbg(charger->dev, "USB charger is diconnected\n");
> > > + current_limit = -1;
> > > + }
> > > +
> > > + if (current_limit > 0) {
> > > + ret = regulator_set_current_limit(charger->reg, current_limit, current_limit);
> > > + if (ret) {
> > > + dev_err(charger->dev, "failed to set current limit: %d\n", ret);
> > > + goto regulator_disable;
> >
> > Unusual error path... if regulator was not enabled before and
> > regulator_set_current_limit() failed, you disable the regulator? Why?
> > Wasn't it already disabled?
>
> Because I thought you asked me to in v1 of this patch:
> > Failure of setting the current should rather disable the charging.
>
> I probably misunderstood you comment then. So I guess it should just
> return?

Yes, I was not specific enough. In v1 you enabled the charging even in
case of regulator_set_current_limit() error. Instead, the charging
should not be enabled, so just return here with error.

Best regards,
Krzysztof