Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp2099777pxa; Mon, 17 Aug 2020 00:06:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzr1wluzx8PF82zCdm54WEPjNXYlArLBXLSsapmDoSy1FN71smfo8x5t06aaT3O8oapzY3n X-Received: by 2002:a50:fc02:: with SMTP id i2mr13745801edr.121.1597648005061; Mon, 17 Aug 2020 00:06:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1597648005; cv=none; d=google.com; s=arc-20160816; b=tpUijMZHeL2D3lgBPpzijamdyauNaPH2K/BuucwXY2oI5LqvCi7i0HkUP1Wjet3+5l iTrMK6f2MAMt/ZU+b1ufkzWH70bLh06PiMjy7r7ojvHtayFYTtsjqm/Cc/FVoxuH+4s5 lq/UhAY9yrTZvLI7FY94HMUTmPhS7QLBT0AWhOQXjVIIYeToqCvlXmYl0YpeoXmrCvgU DOJ23OQwdnXxPAzmMVehBoyEQ7eU4ET0ZJTgOg4YnyCrGF8oftoCwkQEE2esBgkPVpOW DrRzkC5iUfUW21JwfEVt2j3pDbub7Xh7m8qxFNU2V3iWf3ov+adjffBUUOYJSwFR7Vzt gGDg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:to:from:dkim-signature; bh=7KKQZ09wEW3N/tYsmuCWQWVZzNJsxLEDTiilojBj8fY=; b=eE0RBwCskKoDwGxMzRIoMRcIq9zvGko5wgUMfAlnyXrD3/vXOTU/qQgWMcnDFx4FLe zppXgxmX/LOXAws6ieQmoRZJfAppH7C3zxeJuGxtHEUcroLSHXPTkvjX4n3HJ3A1pTsR Qe8euWJlpZSgyiOywKLRC86dFUQfMRHVt1wuGRHFT/u4YHDFNLosB6NB6RkHhyt2E6v9 j61UTmPHXkysf9xQBGMI+mh5D6Q31Gw2rULwMuCIgPiZtsupjIlqp3DN7Cxrx67RjtfX 68ICFNUtxUufoUQDYMZ4sqomzO5PJQ1lDQBAk25hIk5iRTS8AIcgjhIEWRn1KT0gzvg7 +TvQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=DfTDouap; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id o10si10705246edv.301.2020.08.17.00.06.22; Mon, 17 Aug 2020 00:06:45 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=DfTDouap; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726930AbgHQHDP (ORCPT + 99 others); Mon, 17 Aug 2020 03:03:15 -0400 Received: from mail.kernel.org ([198.145.29.99]:42130 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726371AbgHQHAf (ORCPT ); Mon, 17 Aug 2020 03:00:35 -0400 Received: from localhost.localdomain (unknown [194.230.155.242]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 0E01320829; Mon, 17 Aug 2020 07:00:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1597647634; bh=sqhbsGHDKmGnWrxF7WKJvCjHIGno9ziu+Usjt7jxW2w=; h=From:To:Subject:Date:In-Reply-To:References:From; b=DfTDouap3ZK0yLSxQoNUXtQkQNmpvBwpl2lPr8fHjIk6C/beSVXSs9iHDfzg5sgqE 3YCqACD62Bv3xUK09VpIcUkV2x3JjJteNT7p3BtpLUTK3HROZmc5i9Fee02oqq/fI0 t7ZOGNFHovGrjZl9mvu0dkHCKyu/N+DAtxghSsMs= From: Krzysztof Kozlowski To: MyungJoo Ham , Chanwoo Choi , Rob Herring , Krzysztof Kozlowski , Vijai Kumar K , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org Subject: [PATCH v2 08/13] extcon: ptn5150: Check current USB mode when probing Date: Mon, 17 Aug 2020 09:00:04 +0200 Message-Id: <20200817070009.4631-9-krzk@kernel.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200817070009.4631-1-krzk@kernel.org> References: <20200817070009.4631-1-krzk@kernel.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When machine boots up, the USB could be already in OTG mode. In such case there will be no interrupt coming to ptn5150 device and driver will report default state of nothing connected. Detection of USB connection would happen on first unplug of the cable. Factor out code for checking current connection mode and call it right after probe so the existing USB mode will be properly reported. Signed-off-by: Krzysztof Kozlowski --- Changes since v1: 1. Remove copied mutex_unlock --- drivers/extcon/extcon-ptn5150.c | 92 ++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 43 deletions(-) diff --git a/drivers/extcon/extcon-ptn5150.c b/drivers/extcon/extcon-ptn5150.c index a57fef384a29..342973726565 100644 --- a/drivers/extcon/extcon-ptn5150.c +++ b/drivers/extcon/extcon-ptn5150.c @@ -5,6 +5,7 @@ // Based on extcon-sm5502.c driver // Copyright (c) 2018-2019 by Vijai Kumar K // Author: Vijai Kumar K +// Copyright (c) 2020 Krzysztof Kozlowski #include #include @@ -83,12 +84,49 @@ static const struct regmap_config ptn5150_regmap_config = { .max_register = PTN5150_REG_END, }; +static void ptn5150_check_state(struct ptn5150_info *info) +{ + unsigned int port_status, reg_data, vbus; + int ret; + + ret = regmap_read(info->regmap, PTN5150_REG_CC_STATUS, ®_data); + if (ret) { + dev_err(info->dev, "failed to read CC STATUS %d\n", ret); + return; + } + + port_status = ((reg_data & + PTN5150_REG_CC_PORT_ATTACHMENT_MASK) >> + PTN5150_REG_CC_PORT_ATTACHMENT_SHIFT); + + switch (port_status) { + case PTN5150_DFP_ATTACHED: + extcon_set_state_sync(info->edev, EXTCON_USB_HOST, false); + gpiod_set_value_cansleep(info->vbus_gpiod, 0); + extcon_set_state_sync(info->edev, EXTCON_USB, true); + break; + case PTN5150_UFP_ATTACHED: + extcon_set_state_sync(info->edev, EXTCON_USB, false); + vbus = ((reg_data & PTN5150_REG_CC_VBUS_DETECTION_MASK) >> + PTN5150_REG_CC_VBUS_DETECTION_SHIFT); + if (vbus) + gpiod_set_value_cansleep(info->vbus_gpiod, 0); + else + gpiod_set_value_cansleep(info->vbus_gpiod, 1); + + extcon_set_state_sync(info->edev, EXTCON_USB_HOST, true); + break; + default: + dev_err(info->dev, "Unknown Port status : %x\n", port_status); + break; + } +} + static void ptn5150_irq_work(struct work_struct *work) { struct ptn5150_info *info = container_of(work, struct ptn5150_info, irq_work); int ret = 0; - unsigned int reg_data; unsigned int int_status; if (!info->edev) @@ -96,13 +134,6 @@ static void ptn5150_irq_work(struct work_struct *work) mutex_lock(&info->mutex); - ret = regmap_read(info->regmap, PTN5150_REG_CC_STATUS, ®_data); - if (ret) { - dev_err(info->dev, "failed to read CC STATUS %d\n", ret); - mutex_unlock(&info->mutex); - return; - } - /* Clear interrupt. Read would clear the register */ ret = regmap_read(info->regmap, PTN5150_REG_INT_STATUS, &int_status); if (ret) { @@ -116,41 +147,7 @@ static void ptn5150_irq_work(struct work_struct *work) cable_attach = int_status & PTN5150_REG_INT_CABLE_ATTACH_MASK; if (cable_attach) { - unsigned int port_status; - unsigned int vbus; - - port_status = ((reg_data & - PTN5150_REG_CC_PORT_ATTACHMENT_MASK) >> - PTN5150_REG_CC_PORT_ATTACHMENT_SHIFT); - - switch (port_status) { - case PTN5150_DFP_ATTACHED: - extcon_set_state_sync(info->edev, - EXTCON_USB_HOST, false); - gpiod_set_value_cansleep(info->vbus_gpiod, 0); - extcon_set_state_sync(info->edev, EXTCON_USB, - true); - break; - case PTN5150_UFP_ATTACHED: - extcon_set_state_sync(info->edev, EXTCON_USB, - false); - vbus = ((reg_data & - PTN5150_REG_CC_VBUS_DETECTION_MASK) >> - PTN5150_REG_CC_VBUS_DETECTION_SHIFT); - if (vbus) - gpiod_set_value_cansleep(info->vbus_gpiod, 0); - else - gpiod_set_value_cansleep(info->vbus_gpiod, 1); - - extcon_set_state_sync(info->edev, - EXTCON_USB_HOST, true); - break; - default: - dev_err(info->dev, - "Unknown Port status : %x\n", - port_status); - break; - } + ptn5150_check_state(info); } else { extcon_set_state_sync(info->edev, EXTCON_USB_HOST, false); @@ -302,6 +299,14 @@ static int ptn5150_i2c_probe(struct i2c_client *i2c, if (ret) return -EINVAL; + /* + * Update current extcon state if for example OTG connection was there + * before the probe + */ + mutex_lock(&info->mutex); + ptn5150_check_state(info); + mutex_unlock(&info->mutex); + return 0; } @@ -334,4 +339,5 @@ subsys_initcall(ptn5150_i2c_init); MODULE_DESCRIPTION("NXP PTN5150 CC logic Extcon driver"); MODULE_AUTHOR("Vijai Kumar K "); +MODULE_AUTHOR("Krzysztof Kozlowski "); MODULE_LICENSE("GPL v2"); -- 2.17.1