Message ID | 20240816-max77693-charger-extcon-v4-7-050a0a9bfea0@gmail.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | power: supply: max77693: Toggle charging/OTG based on extcon status | expand |
On 16/08/2024 10:19, Artur Weber wrote: > This behavior was observed on a downstream kernel - for chargers, the > current would be set to a fast charge current value, and it would be > bumped down for all other cable types. > > If we leave only the fast charge current value applied, peripheral mode > stops working. If we stick to 500mA, charging becomes too slow. So, set > the charge input current limit accordingly to the cable type. > > Tested-by: Henrik Grimler <henrik@grimler.se> > Signed-off-by: Artur Weber <aweber.kernel@gmail.com> > --- > Changes in v3: > - Re-introduced this commit from v1. It seems to have been accidentally > rolled into the previous commit in v2. > --- > drivers/power/supply/max77693_charger.c | 23 ++++++++++++++++++++--- > 1 file changed, 20 insertions(+), 3 deletions(-) > > diff --git a/drivers/power/supply/max77693_charger.c b/drivers/power/supply/max77693_charger.c > index bf156544fe1b..908fd2a178ee 100644 > --- a/drivers/power/supply/max77693_charger.c > +++ b/drivers/power/supply/max77693_charger.c > @@ -716,6 +716,7 @@ static void max77693_charger_extcon_work(struct work_struct *work) > cable.work); > struct extcon_dev *edev = chg->cable.edev; > bool set_charging, set_otg; > + unsigned int input_current; > int connector, state; > int ret; > > @@ -728,19 +729,28 @@ static void max77693_charger_extcon_work(struct work_struct *work) > > switch (connector) { > case EXTCON_CHG_USB_SDP: > - case EXTCON_CHG_USB_DCP: Why do you move it? Wasn't it added in previous patch? > case EXTCON_CHG_USB_CDP: > + case EXTCON_CHG_USB_SLOW: > + input_current = 500000; /* 500 mA */ > + set_charging = true; > + set_otg = false; > + > + dev_info(chg->dev, "slow charging. connector type: %d\n", > + connector); > + break; Best regards, Krzysztof
diff --git a/drivers/power/supply/max77693_charger.c b/drivers/power/supply/max77693_charger.c index bf156544fe1b..908fd2a178ee 100644 --- a/drivers/power/supply/max77693_charger.c +++ b/drivers/power/supply/max77693_charger.c @@ -716,6 +716,7 @@ static void max77693_charger_extcon_work(struct work_struct *work) cable.work); struct extcon_dev *edev = chg->cable.edev; bool set_charging, set_otg; + unsigned int input_current; int connector, state; int ret; @@ -728,19 +729,28 @@ static void max77693_charger_extcon_work(struct work_struct *work) switch (connector) { case EXTCON_CHG_USB_SDP: - case EXTCON_CHG_USB_DCP: case EXTCON_CHG_USB_CDP: + case EXTCON_CHG_USB_SLOW: + input_current = 500000; /* 500 mA */ + set_charging = true; + set_otg = false; + + dev_info(chg->dev, "slow charging. connector type: %d\n", + connector); + break; + case EXTCON_CHG_USB_DCP: case EXTCON_CHG_USB_ACA: case EXTCON_CHG_USB_FAST: - case EXTCON_CHG_USB_SLOW: case EXTCON_CHG_USB_PD: + input_current = chg->fast_charge_current; set_charging = true; set_otg = false; - dev_info(chg->dev, "charging. connector type: %d\n", + dev_info(chg->dev, "fast charging. connector type: %d\n", connector); break; case EXTCON_USB_HOST: + input_current = 500000; /* 500 mA */ set_charging = false; set_otg = true; @@ -748,6 +758,7 @@ static void max77693_charger_extcon_work(struct work_struct *work) connector); break; default: + input_current = 500000; /* 500 mA */ set_charging = false; set_otg = false; @@ -756,6 +767,12 @@ static void max77693_charger_extcon_work(struct work_struct *work) break; } + ret = max77693_set_input_current_limit(chg, input_current); + if (ret) { + dev_err(chg->dev, "failed to set input current (%d)\n", ret); + goto out; + } + ret = max77693_set_charging(chg, set_charging); if (ret) { dev_err(chg->dev, "failed to set charging (%d)\n", ret);