From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757721AbcLSANV (ORCPT ); Sun, 18 Dec 2016 19:13:21 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59632 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753264AbcLSANT (ORCPT ); Sun, 18 Dec 2016 19:13:19 -0500 From: Hans de Goede To: MyungJoo Ham , Chanwoo Choi Cc: linux-kernel@vger.kernel.org, Hans de Goede Subject: [PATCH 4/8] extcon: axp288: Fix possibly reporting 2 cables in state true Date: Mon, 19 Dec 2016 01:13:09 +0100 Message-Id: <20161219001313.13402-4-hdegoede@redhat.com> In-Reply-To: <20161219001313.13402-1-hdegoede@redhat.com> References: <20161219001313.13402-1-hdegoede@redhat.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Mon, 19 Dec 2016 00:13:19 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When the charger type changes from e.g. SDP to CDP, without Vbus being seen as low in between axp288_handle_chrg_det_event would set the state for the new cable type to true, without clearing the state of the previous cable type to false. This commit fixes this and also gets rid of the function local static cable variable, properly storing all drv state in the axp288_extcon_info struct. Signed-off-by: Hans de Goede --- drivers/extcon/extcon-axp288.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/extcon/extcon-axp288.c b/drivers/extcon/extcon-axp288.c index 43b3637..ded0bd9 100644 --- a/drivers/extcon/extcon-axp288.c +++ b/drivers/extcon/extcon-axp288.c @@ -115,6 +115,7 @@ struct axp288_extcon_info { int irq[EXTCON_IRQ_END]; struct extcon_dev *edev; struct notifier_block extcon_nb; + unsigned int previous_cable; }; /* Power up/down reason string array */ @@ -154,9 +155,9 @@ static void axp288_extcon_log_rsi(struct axp288_extcon_info *info) static int axp288_handle_chrg_det_event(struct axp288_extcon_info *info) { - static unsigned int cable; int ret, stat, cfg, pwr_stat; u8 chrg_type; + unsigned int cable = info->previous_cable; bool vbus_attach = false; ret = regmap_read(info->regmap, AXP288_PS_STAT_REG, &pwr_stat); @@ -212,7 +213,11 @@ static int axp288_handle_chrg_det_event(struct axp288_extcon_info *info) vbus_attach ? EXTCON_GPIO_MUX_SEL_SOC : EXTCON_GPIO_MUX_SEL_PMIC); - extcon_set_state_sync(info->edev, cable, vbus_attach); + extcon_set_state_sync(info->edev, info->previous_cable, false); + if (vbus_attach) { + extcon_set_state_sync(info->edev, cable, vbus_attach); + info->previous_cable = cable; + } return 0; @@ -263,6 +268,7 @@ static int axp288_extcon_probe(struct platform_device *pdev) info->dev = &pdev->dev; info->regmap = axp20x->regmap; info->regmap_irqc = axp20x->regmap_irqc; + info->previous_cable = axp288_extcon_cables[0]; if (pdata) info->gpio_mux_cntl = pdata->gpio_mux_cntl; -- 2.9.3