Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp1149519pxv; Fri, 9 Jul 2021 19:35:46 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyS9RCooDbP39isFeRc/maPAOOh6jd3aKxeFKnkV4DQt7mNKyduIGhZj7BYlC7Dm5wQrCWu X-Received: by 2002:a17:906:7946:: with SMTP id l6mr39642664ejo.230.1625884546259; Fri, 09 Jul 2021 19:35:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625884546; cv=none; d=google.com; s=arc-20160816; b=b7+M3Oh78QWNi8RDZHKmnjF3KMokfjCPBv0CY1o8SP86/pyKmb4OId2tKrkqa0olfD IUkq7FZHZOzxAvrSrUMwwdWGJ4FAxqfw9vTp9BqcZq4ZNPWw/dWk2/boYSGxplertp4X VUcKFYZBjqvhgdJq6Li2XDHe/iDCoE/gp9ITc6bg2zZ3IKYFvoXxCNFgtcFwF13fOssL wMu2GBYgcp/WDEGvX42jOjbPNZR9SXBJ2Tdpl5cy82Ncz29fUApc+fpW2O8mlgj6aQDf OfzpEVHUGeTHUZ0LE3eZZQpH3duUuO43BTkMlKZe6U6NFpOXnMmidzcmMoHiRB6NIXH2 Byog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=wtKhJG1KpnTLzgbP1k2WxlSLPBcUwkONB5HSO8rHMQQ=; b=EuriRGY8shxocnem6Hc1Eb4SoenTACtNXJuwown3Te0gRxdZ1PIU5EeHOFgZXVYez6 5BCuqEcFnOW8fniYYbdtqOl/7W8k65Mz2+vJ5aMbghmwyjXm+25YzT+/ckVpbiMBes6d 66z0s70TDwmXflwhO5O6l3bJd5Ni3B2qGf5gkGxptkNmLkvsnnsjJ2nBIENAHJ2zOYH8 7ddonH/vZ9NzcF3RFdmQ13crUuaR98dm5YELC09fk4uaXUybQ31Sgy6bkhf7hHhiwbzz I81CvrRmsfvkyw0x5xVbcN+sRi/MO1CMvSkV+R1htHDGGQ4fTcl1D6nOgGwOBtbjWkDH OzMA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=MbnlAEFr; 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 h1si8885127ejf.146.2021.07.09.19.35.23; Fri, 09 Jul 2021 19:35:46 -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=k20201202 header.b=MbnlAEFr; 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 S235274AbhGJCel (ORCPT + 99 others); Fri, 9 Jul 2021 22:34:41 -0400 Received: from mail.kernel.org ([198.145.29.99]:42924 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233960AbhGJC2F (ORCPT ); Fri, 9 Jul 2021 22:28:05 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 36DE461412; Sat, 10 Jul 2021 02:24:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1625883896; bh=N9tg4uOowuFl6i9wi0x5B9WKbHwNGTjWXkUqtqYIuno=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MbnlAEFrcOnNz+eoZYWQ6qSGcATngeQSXHn88v2ZmXoYB87ZTDdNzecleod16PvlR angAofPTSIUcXxeiSeNyMrxcIjZiEDyAjT4fzOvqdNyTLGq5FuUvRZdDhqLf1aLmoG K8yDtHNwbE169kkhbKRgst7h7Fkn1cjTnMquJQaJ2m34I5A45o8iKxHmTomlJKJvJP MLb6NGbyg2PtxX2GFqxjh7tW6r61bMmjYNIK2uT1ft4WgTvWEoHUipDMYH2TIGXWMa ZaUjpQ1G0oCa0IL+i3ArlPHT1zzDpz6TjdbR2qDYyANEtM5mGOrqtHhc7lA+iDR3Un tR7qum+PXqvAQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Chunfeng Yun , Greg Kroah-Hartman , Sasha Levin , linux-usb@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org Subject: [PATCH AUTOSEL 5.10 20/93] usb: common: usb-conn-gpio: fix NULL pointer dereference of charger Date: Fri, 9 Jul 2021 22:23:14 -0400 Message-Id: <20210710022428.3169839-20-sashal@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210710022428.3169839-1-sashal@kernel.org> References: <20210710022428.3169839-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Chunfeng Yun [ Upstream commit 880287910b1892ed2cb38977893b947382a09d21 ] When power on system with OTG cable, IDDIG's interrupt arises before the charger registration, it will cause a NULL pointer dereference, fix the issue by registering the power supply before requesting IDDIG/VBUS irq. Signed-off-by: Chunfeng Yun Link: https://lore.kernel.org/r/1621406386-18838-1-git-send-email-chunfeng.yun@mediatek.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/common/usb-conn-gpio.c | 44 ++++++++++++++++++------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/drivers/usb/common/usb-conn-gpio.c b/drivers/usb/common/usb-conn-gpio.c index 6c4e3a19f42c..c9545a4eff66 100644 --- a/drivers/usb/common/usb-conn-gpio.c +++ b/drivers/usb/common/usb-conn-gpio.c @@ -149,14 +149,32 @@ static int usb_charger_get_property(struct power_supply *psy, return 0; } -static int usb_conn_probe(struct platform_device *pdev) +static int usb_conn_psy_register(struct usb_conn_info *info) { - struct device *dev = &pdev->dev; - struct power_supply_desc *desc; - struct usb_conn_info *info; + struct device *dev = info->dev; + struct power_supply_desc *desc = &info->desc; struct power_supply_config cfg = { .of_node = dev->of_node, }; + + desc->name = "usb-charger"; + desc->properties = usb_charger_properties; + desc->num_properties = ARRAY_SIZE(usb_charger_properties); + desc->get_property = usb_charger_get_property; + desc->type = POWER_SUPPLY_TYPE_USB; + cfg.drv_data = info; + + info->charger = devm_power_supply_register(dev, desc, &cfg); + if (IS_ERR(info->charger)) + dev_err(dev, "Unable to register charger\n"); + + return PTR_ERR_OR_ZERO(info->charger); +} + +static int usb_conn_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct usb_conn_info *info; bool need_vbus = true; int ret = 0; @@ -218,6 +236,10 @@ static int usb_conn_probe(struct platform_device *pdev) return PTR_ERR(info->role_sw); } + ret = usb_conn_psy_register(info); + if (ret) + goto put_role_sw; + if (info->id_gpiod) { info->id_irq = gpiod_to_irq(info->id_gpiod); if (info->id_irq < 0) { @@ -252,20 +274,6 @@ static int usb_conn_probe(struct platform_device *pdev) } } - desc = &info->desc; - desc->name = "usb-charger"; - desc->properties = usb_charger_properties; - desc->num_properties = ARRAY_SIZE(usb_charger_properties); - desc->get_property = usb_charger_get_property; - desc->type = POWER_SUPPLY_TYPE_USB; - cfg.drv_data = info; - - info->charger = devm_power_supply_register(dev, desc, &cfg); - if (IS_ERR(info->charger)) { - dev_err(dev, "Unable to register charger\n"); - return PTR_ERR(info->charger); - } - platform_set_drvdata(pdev, info); /* Perform initial detection */ -- 2.30.2