Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1544239

[PATCH 09/14] power: supply: axp288_charger: Handle charger type changing without disconnect

From Hans de Goede <hdegoede@redhat.com>
Newsgroups linux.kernel
Subject [PATCH 09/14] power: supply: axp288_charger: Handle charger type changing without disconnect
Date 2016-12-19 01:10 +0100
Message-ID <sPTGG-pT-21@gated-at.bofh.it> (permalink)
References <sPTGF-pT-3@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


Deal with the charger type changing without a vbus-disconnect being
reported in between the 2 charger type states:

-Do not return from axp288_charger_extcon_evt_worker early in this case
 (track old_chg_type)
-Make calling axp288_charger_enable_charger with the same value as before
 a nop, to avoid the need for the caller to check this
-Do no do a dev_err when axp288_charger_enable_charger returns an error,
 axp288_charger_enable_charger already returns an error itself
-Disable the charger before changing the charge-current setting (nop if
 vbus was seen as disconnected before the change)

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/power/supply/axp288_charger.c | 31 +++++++++++++------------------
 1 file changed, 13 insertions(+), 18 deletions(-)

diff --git a/drivers/power/supply/axp288_charger.c b/drivers/power/supply/axp288_charger.c
index 2b95db2..adeea2f 100644
--- a/drivers/power/supply/axp288_charger.c
+++ b/drivers/power/supply/axp288_charger.c
@@ -174,7 +174,6 @@ struct axp288_chrg_info {
 	int max_cv;
 	bool online;
 	bool present;
-	bool enable_charger;
 	bool is_charger_enabled;
 };
 
@@ -304,6 +303,9 @@ static int axp288_charger_enable_charger(struct axp288_chrg_info *info,
 {
 	int ret;
 
+	if (enable == info->is_charger_enabled)
+		return 0;
+
 	if (enable)
 		ret = regmap_update_bits(info->regmap, AXP20X_CHRG_CTRL1,
 				CHRG_CCCV_CHG_EN, CHRG_CCCV_CHG_EN);
@@ -578,6 +580,7 @@ static void axp288_charger_extcon_evt_worker(struct work_struct *work)
 	bool changed = false;
 	struct extcon_dev *edev = info->cable.edev;
 	bool old_connected = info->cable.connected;
+	enum power_supply_type old_chg_type = info->cable.chg_type;
 
 	/* Determine cable/charger type */
 	if (extcon_get_cable_state_(edev, EXTCON_CHG_USB_SDP) > 0) {
@@ -600,7 +603,8 @@ static void axp288_charger_extcon_evt_worker(struct work_struct *work)
 	}
 
 	/* Cable status changed */
-	if (old_connected != info->cable.connected)
+	if (old_connected != info->cable.connected ||
+	    old_chg_type != info->cable.chg_type)
 		changed = true;
 
 	if (!changed)
@@ -608,14 +612,9 @@ static void axp288_charger_extcon_evt_worker(struct work_struct *work)
 
 	mutex_lock(&info->lock);
 
-	if (info->is_charger_enabled && !info->cable.connected) {
-		info->enable_charger = false;
-		ret = axp288_charger_enable_charger(info, info->enable_charger);
-		if (ret < 0)
-			dev_err(&info->pdev->dev,
-				"cannot disable charger (%d)", ret);
+	if (info->cable.connected) {
+		axp288_charger_enable_charger(info, false);
 
-	} else if (!info->is_charger_enabled && info->cable.connected) {
 		switch (info->cable.chg_type) {
 		case POWER_SUPPLY_TYPE_USB:
 			current_limit = ILIM_500MA;
@@ -634,17 +633,13 @@ static void axp288_charger_extcon_evt_worker(struct work_struct *work)
 
 		/* Set vbus current limit first, then enable charger */
 		ret = axp288_charger_set_vbus_inlmt(info, current_limit);
-		if (ret < 0) {
+		if (ret == 0)
+			axp288_charger_enable_charger(info, true);
+		else
 			dev_err(&info->pdev->dev,
 				"error setting current limit (%d)", ret);
-		} else {
-			info->enable_charger = (current_limit > 0);
-			ret = axp288_charger_enable_charger(info,
-							info->enable_charger);
-			if (ret < 0)
-				dev_err(&info->pdev->dev,
-					"cannot enable charger (%d)", ret);
-		}
+	} else {
+		axp288_charger_enable_charger(info, false);
 	}
 
 	if (changed)
-- 
2.9.3

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH 00/14] extcon api extension + axp288_charger fixes Hans de Goede <hdegoede@redhat.com> - 2016-12-19 01:10 +0100
  [PATCH 12/14] power: supply: axp288_charger: Fix wrong regmap_update_bits Hans de Goede <hdegoede@redhat.com> - 2016-12-19 01:10 +0100
  [PATCH 13/14] power: supply: axp288_charger: Remove unnecessary irq?_en register writes Hans de Goede <hdegoede@redhat.com> - 2016-12-19 01:10 +0100
  [PATCH 08/14] power: supply: axp288_charger: Actually get and use the USB_HOST extcon device Hans de Goede <hdegoede@redhat.com> - 2016-12-19 01:10 +0100
    Re: [PATCH 08/14] power: supply: axp288_charger: Actually get and use  the USB_HOST extcon device Chanwoo Choi <cw00.choi@samsung.com> - 2016-12-19 11:20 +0100
  [PATCH 14/14] power: supply: axp288_charger: Fix the module not auto-loading Hans de Goede <hdegoede@redhat.com> - 2016-12-19 01:10 +0100
  [PATCH 09/14] power: supply: axp288_charger: Handle charger type changing without disconnect Hans de Goede <hdegoede@redhat.com> - 2016-12-19 01:10 +0100
  [PATCH 11/14] power: supply: axp288_charger: Get and process initial hardware-state Hans de Goede <hdegoede@redhat.com> - 2016-12-19 01:10 +0100
  [PATCH 01/14] extcon: Add extcon_get_extcon_dev_by_cable_id function Hans de Goede <hdegoede@redhat.com> - 2016-12-19 01:10 +0100
    Re: [PATCH 01/14] extcon: Add extcon_get_extcon_dev_by_cable_id  function Chanwoo Choi <cw00.choi@samsung.com> - 2016-12-19 11:20 +0100
      Re: [PATCH 01/14] extcon: Add extcon_get_extcon_dev_by_cable_id  function Hans de Goede <hdegoede@redhat.com> - 2016-12-19 12:50 +0100
        Re: [PATCH 01/14] extcon: Add extcon_get_extcon_dev_by_cable_id  function Chanwoo Choi <cw00.choi@samsung.com> - 2016-12-19 13:00 +0100
  [PATCH 07/14] power: supply: axp288_charger: Move init_hw_regs call before supply registration Hans de Goede <hdegoede@redhat.com> - 2016-12-19 01:10 +0100
  [PATCH 03/14] power: supply: axp288_charger: Make charger_init_hw_regs propagate i2c errors Hans de Goede <hdegoede@redhat.com> - 2016-12-19 01:10 +0100
  [PATCH 05/14] power: supply: axp288_charger: use devm extcon / supply register Hans de Goede <hdegoede@redhat.com> - 2016-12-19 01:10 +0100
    Re: [PATCH 05/14] power: supply: axp288_charger: use devm extcon /  supply register Chanwoo Choi <cw00.choi@samsung.com> - 2016-12-19 09:10 +0100
      Re: [PATCH 05/14] power: supply: axp288_charger: use devm extcon /  supply register Hans de Goede <hdegoede@redhat.com> - 2016-12-19 09:50 +0100
  [PATCH 04/14] power: supply: axp288_charger: Drop platform_data dependency Hans de Goede <hdegoede@redhat.com> - 2016-12-19 01:20 +0100
  [PATCH 06/14] power: supply: axp288_charger: Register extcon notifers after power_supply Hans de Goede <hdegoede@redhat.com> - 2016-12-19 01:20 +0100
  [PATCH 02/14] extcon: Make extcon_register_notifier use extcon_get_extcon_dev_by_cable_id Hans de Goede <hdegoede@redhat.com> - 2016-12-19 01:20 +0100

csiph-web