[PATCH v4 07/10] power: supply: max77693: Set up charge/input current according to cable type

Artur Weber posted 10 patches 1 year, 4 months ago
[PATCH v4 07/10] power: supply: max77693: Set up charge/input current according to cable type
Posted by Artur Weber 1 year, 4 months ago
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:
 	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);

-- 
2.46.0
Re: [PATCH v4 07/10] power: supply: max77693: Set up charge/input current according to cable type
Posted by Krzysztof Kozlowski 1 year, 4 months ago
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