Message ID | 20240205141221.56076-6-rogerq@kernel.org |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel+bounces-52794-ouuuleilei=gmail.com@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:168b:b0:106:860b:bbdd with SMTP id ma11csp902892dyb; Mon, 5 Feb 2024 06:16:50 -0800 (PST) X-Google-Smtp-Source: AGHT+IH1rAj1vHEvZ2+fw0HDQ2WS9gtyJAZdu97X9lKp27z1paFzkFkN8GRpKhvOJZ+vLbGqlhGa X-Received: by 2002:a17:902:b701:b0:1d9:1b55:a37 with SMTP id d1-20020a170902b70100b001d91b550a37mr13297225pls.50.1707142610125; Mon, 05 Feb 2024 06:16:50 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1707142610; cv=pass; d=google.com; s=arc-20160816; b=uTa+gUd8BxIxxkGIANk1oV1V4Qrzx2KRdh1iu7c7TZ9nMoVuK1loW86n54Nkm7jjM0 bZHgX1C3Zmg5jz9W0JYGaJAYddjtjw0Mb6SxeXvZRPbE0WdW+EOtHPvopu/X4biEGTvW rUfIoVJQ5Bj9GfvsZzYD73gLsQPCzUbW+Q/2VSN5nonYMc0vo2xEm/54GuD6Yw9HC2oW 4ZYl33qaazVHKxmR9fiEm0Uf10eJZZfZEcMIS68UN5/YZ7YgY8Rrls9zj5Cm/3xQnUrw bGwJ5KAlgRqWM/9ehFFZRw/+Hycow2oLZCR94q2zw6a15tVcqVBygsmElZ3GtmYPfq1A aeYg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=7hkdaiC54LR0/Nq1OhSEqd/L0AAR5FnvLrvL/hU9RbI=; fh=e5W+/CeMvJTOi+7drHZkzGoUCiqJB0dnFO4YslJ+9Is=; b=gzfCX2mPcm5rWowRIp8oiRT3Yw8lW6HBXlQQv4YllnnRT2G4q803mivrGSRTfb0nk7 rqsm1uApygsVXfjOw/hRbYfy0GaJptrVQ5XZNgCBvEG5X0zw0oC4dMY2pZSGSctCFMux TsuV7MFxq6jgRfLjMhLrQd2UxescnrpyWe6aNOpp0PgomYkM608AYxdHQnTHh0/IYp1Y ssGyYpiKcZon8G5EMjNieehaxMDZr1eXTPRY4KXcgv/K/BAcmgYO+X4aVk0t48T74q88 Yek+HvHlayqCmq3x/6ETwNpcN+sjNXtSKucRsJ5SX+uKF559R4yyxjoWjufrpoS2MH4Q i2Pg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=Gd8iKo+q; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-52794-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-52794-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org X-Forwarded-Encrypted: i=1; AJvYcCWeGrRWJlRfrPMkZwXse6YJslN/ec08GewkOjsOc/6MUmP7HAZ6lLR/tx8/XuWu7kNMhW3nAhtf8w3T+nd5ULf4ZofTFA== Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id t21-20020a170902dcd500b001d9871e4da5si4421012pll.99.2024.02.05.06.16.50 for <ouuuleilei@gmail.com> (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Feb 2024 06:16:50 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-52794-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=Gd8iKo+q; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-52794-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-52794-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 4AFEA284BDE for <ouuuleilei@gmail.com>; Mon, 5 Feb 2024 14:14:44 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 101CE35EF1; Mon, 5 Feb 2024 14:12:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Gd8iKo+q" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5035F32C93; Mon, 5 Feb 2024 14:12:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707142364; cv=none; b=VODbLqgIY37TzxNhc+iW5n/gawAz+zgkTeBpO0Y6ykfL9llyC6JDgna1E5VeNdTh55ezyukZiFY0SYvpjTD3pO1ClMuY6jl+Xd1be2PP4AZm6DDW4rvBq9/CvUZn88Yo9pmJScRnTCvumXTWs3VkYyiJwz8mlQ50nloxGlsSOMc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707142364; c=relaxed/simple; bh=h/Wjhl4phEKjtwys+YLS96BL5IrD+pUdM1DisLakQwI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=j5+VoSisPhSP/p1AsV0azcolmmDJ1JqejGpkiBVObtz1kLIq1YcMkZMzy+76gMO7eMe1/xjKIXuBrDta8J0nNycXzetmkPTABtiV1SpgCK+AvMHlewsGJAGQTkndKPQLksGSM2Fh/+75oyggAUzv9/fMV32K0N1A6gHswlNJblo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Gd8iKo+q; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id C1439C433A6; Mon, 5 Feb 2024 14:12:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1707142363; bh=h/Wjhl4phEKjtwys+YLS96BL5IrD+pUdM1DisLakQwI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Gd8iKo+qWSY0wR4esH/qgfx2hrvkVTjGhH9Nz/yHmqLI4WTGVETLnqOsTpUmRaMKJ qoHQuQnZ5DGIU+WhQEDoOJWvdnUDz+EDBOcttpoIlIrzLJdfO/hiXJdp/VhkwhyPVH YWb5skYGzrfu56Qx1e52hPecq5mK777xKqViQ/zcrcOgR/N934Cw1R0Ho7diN/RMHc kURZj6+Hlkgcg8sGbDafscm4LoxHvXx4rEvKkdIoSDLOBq1CRO/ZHoPJVcx/bTNbNP PU/EEf+jVoLYUraguGBbgfvs9FXyiLvbVOp7ZGQx85WU5nL5BT9qyuz8af47v73Eq+ Vzphk47VCKxOg== From: Roger Quadros <rogerq@kernel.org> To: Thinh.Nguyen@synopsys.com Cc: gregkh@linuxfoundation.org, r-gunasekaran@ti.com, b-liu@ti.com, afd@ti.com, nm@ti.com, srk@ti.com, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Roger Quadros <rogerq@kernel.org>, Rob Herring <robh+dt@kernel.org>, Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>, Conor Dooley <conor+dt@kernel.org> Subject: [PATCH v2 5/5] usb: dwc3-am62: add workaround for Errata i2409 Date: Mon, 5 Feb 2024 16:12:21 +0200 Message-Id: <20240205141221.56076-6-rogerq@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240205141221.56076-1-rogerq@kernel.org> References: <20240205141221.56076-1-rogerq@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: <linux-kernel.vger.kernel.org> List-Subscribe: <mailto:linux-kernel+subscribe@vger.kernel.org> List-Unsubscribe: <mailto:linux-kernel+unsubscribe@vger.kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1790068769443193934 X-GMAIL-MSGID: 1790068769443193934 |
Series |
usb: dwc3-am62: module removal and errata fixes
|
|
Commit Message
Roger Quadros
Feb. 5, 2024, 2:12 p.m. UTC
All AM62 devices have Errata i2409 [1] due to which
USB2 PHY may lock up due to short suspend.
Workaround involves setting bit 5 and 4 PLL_REG12
in PHY2 register space after USB controller is brought
out of LPSC reset but before controller initialization.
Handle this workaround.
[1] - https://www.ti.com/lit/er/sprz487d/sprz487d.pdf
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>
Cc: Conor Dooley <conor+dt@kernel.org>
Signed-off-by: Roger Quadros <rogerq@kernel.org>
---
Notes:
Changelog:
v2:
- don't add phy read/write helpers or add phy to private data
v1: https://lore.kernel.org/all/20240201121220.5523-5-rogerq@kernel.org/
drivers/usb/dwc3/dwc3-am62.c | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
Comments
On 2/5/24 8:12 AM, Roger Quadros wrote: > All AM62 devices have Errata i2409 [1] due to which > USB2 PHY may lock up due to short suspend. > > Workaround involves setting bit 5 and 4 PLL_REG12 > in PHY2 register space after USB controller is brought > out of LPSC reset but before controller initialization. > > Handle this workaround. > > [1] - https://www.ti.com/lit/er/sprz487d/sprz487d.pdf > > Cc: Rob Herring <robh+dt@kernel.org> > Cc: Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org> > Cc: Conor Dooley <conor+dt@kernel.org> > Signed-off-by: Roger Quadros <rogerq@kernel.org> > --- > > Notes: > Changelog: > > v2: > - don't add phy read/write helpers or add phy to private data > > v1: https://lore.kernel.org/all/20240201121220.5523-5-rogerq@kernel.org/ > > drivers/usb/dwc3/dwc3-am62.c | 21 ++++++++++++++++++++- > 1 file changed, 20 insertions(+), 1 deletion(-) > > diff --git a/drivers/usb/dwc3/dwc3-am62.c b/drivers/usb/dwc3/dwc3-am62.c > index af1ce934e7fb..5ae5c3087b0f 100644 > --- a/drivers/usb/dwc3/dwc3-am62.c > +++ b/drivers/usb/dwc3/dwc3-am62.c > @@ -101,6 +101,11 @@ > #define PHY_CORE_VOLTAGE_MASK BIT(31) > #define PHY_PLL_REFCLK_MASK GENMASK(3, 0) > > +/* USB PHY2 register offsets */ > +#define USB_PHY_PLL_REG12 0x130 > +#define USB_PHY_PLL_LDO_REF_EN BIT(5) > +#define USB_PHY_PLL_LDO_REF_EN_EN BIT(4) > + > #define DWC3_AM62_AUTOSUSPEND_DELAY 100 > > struct dwc3_am62 { > @@ -184,8 +189,9 @@ static int dwc3_ti_probe(struct platform_device *pdev) > struct device *dev = &pdev->dev; > struct device_node *node = pdev->dev.of_node; > struct dwc3_am62 *am62; > - int i, ret; > unsigned long rate; > + void __iomem *phy; > + int i, ret; > u32 reg; > > am62 = devm_kzalloc(dev, sizeof(*am62), GFP_KERNEL); > @@ -201,6 +207,12 @@ static int dwc3_ti_probe(struct platform_device *pdev) > return PTR_ERR(am62->usbss); > } > > + phy = devm_platform_ioremap_resource(pdev, 1); > + if (IS_ERR(phy)) { > + dev_err(dev, "can't map PHY IOMEM resource. Won't apply i2409 fix.\n"); > + phy = NULL; > + } Why not move this down to where you use it below, then just have it be an if/else with the work around in the if (!IS_ERR(phy)) and the warning in the else. Andrew > + > am62->usb2_refclk = devm_clk_get(dev, "ref"); > if (IS_ERR(am62->usb2_refclk)) { > dev_err(dev, "can't get usb2_refclk\n"); > @@ -227,6 +239,13 @@ static int dwc3_ti_probe(struct platform_device *pdev) > if (ret) > return ret; > > + /* Workaround Errata i2409 */ > + if (phy) { > + reg = readl(phy + USB_PHY_PLL_REG12); > + reg |= USB_PHY_PLL_LDO_REF_EN | USB_PHY_PLL_LDO_REF_EN_EN; > + writel(reg, phy + USB_PHY_PLL_REG12); > + } > + > /* VBUS divider select */ > am62->vbus_divider = device_property_read_bool(dev, "ti,vbus-divider"); > reg = dwc3_ti_readl(am62, USBSS_PHY_CONFIG);
On 05/02/2024 20:07, Andrew Davis wrote: > On 2/5/24 8:12 AM, Roger Quadros wrote: >> All AM62 devices have Errata i2409 [1] due to which >> USB2 PHY may lock up due to short suspend. >> >> Workaround involves setting bit 5 and 4 PLL_REG12 >> in PHY2 register space after USB controller is brought >> out of LPSC reset but before controller initialization. >> >> Handle this workaround. >> >> [1] - https://www.ti.com/lit/er/sprz487d/sprz487d.pdf >> >> Cc: Rob Herring <robh+dt@kernel.org> >> Cc: Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org> >> Cc: Conor Dooley <conor+dt@kernel.org> >> Signed-off-by: Roger Quadros <rogerq@kernel.org> >> --- >> >> Notes: >> Changelog: >> v2: >> - don't add phy read/write helpers or add phy to private data >> v1: https://lore.kernel.org/all/20240201121220.5523-5-rogerq@kernel.org/ >> >> drivers/usb/dwc3/dwc3-am62.c | 21 ++++++++++++++++++++- >> 1 file changed, 20 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/usb/dwc3/dwc3-am62.c b/drivers/usb/dwc3/dwc3-am62.c >> index af1ce934e7fb..5ae5c3087b0f 100644 >> --- a/drivers/usb/dwc3/dwc3-am62.c >> +++ b/drivers/usb/dwc3/dwc3-am62.c >> @@ -101,6 +101,11 @@ >> #define PHY_CORE_VOLTAGE_MASK BIT(31) >> #define PHY_PLL_REFCLK_MASK GENMASK(3, 0) >> +/* USB PHY2 register offsets */ >> +#define USB_PHY_PLL_REG12 0x130 >> +#define USB_PHY_PLL_LDO_REF_EN BIT(5) >> +#define USB_PHY_PLL_LDO_REF_EN_EN BIT(4) >> + >> #define DWC3_AM62_AUTOSUSPEND_DELAY 100 >> struct dwc3_am62 { >> @@ -184,8 +189,9 @@ static int dwc3_ti_probe(struct platform_device *pdev) >> struct device *dev = &pdev->dev; >> struct device_node *node = pdev->dev.of_node; >> struct dwc3_am62 *am62; >> - int i, ret; >> unsigned long rate; >> + void __iomem *phy; >> + int i, ret; >> u32 reg; >> am62 = devm_kzalloc(dev, sizeof(*am62), GFP_KERNEL); >> @@ -201,6 +207,12 @@ static int dwc3_ti_probe(struct platform_device *pdev) >> return PTR_ERR(am62->usbss); >> } >> + phy = devm_platform_ioremap_resource(pdev, 1); >> + if (IS_ERR(phy)) { >> + dev_err(dev, "can't map PHY IOMEM resource. Won't apply i2409 fix.\n"); >> + phy = NULL; >> + } > > Why not move this down to where you use it below, then just have > it be an if/else with the work around in the if (!IS_ERR(phy)) > and the warning in the else. Seems reasonable. Will fix. > > Andrew > >> + >> am62->usb2_refclk = devm_clk_get(dev, "ref"); >> if (IS_ERR(am62->usb2_refclk)) { >> dev_err(dev, "can't get usb2_refclk\n"); >> @@ -227,6 +239,13 @@ static int dwc3_ti_probe(struct platform_device *pdev) >> if (ret) >> return ret; >> + /* Workaround Errata i2409 */ >> + if (phy) { >> + reg = readl(phy + USB_PHY_PLL_REG12); >> + reg |= USB_PHY_PLL_LDO_REF_EN | USB_PHY_PLL_LDO_REF_EN_EN; >> + writel(reg, phy + USB_PHY_PLL_REG12); >> + } >> + >> /* VBUS divider select */ >> am62->vbus_divider = device_property_read_bool(dev, "ti,vbus-divider"); >> reg = dwc3_ti_readl(am62, USBSS_PHY_CONFIG);
On Mon, Feb 05, 2024 at 04:12:21PM +0200, Roger Quadros wrote: > All AM62 devices have Errata i2409 [1] due to which > USB2 PHY may lock up due to short suspend. Is there any visible log trace when we have this phy lock up situation? Eventually it would be nice to have this in the commit message. Francesco
On 11/02/2024 18:18, Francesco Dolcini wrote: > On Mon, Feb 05, 2024 at 04:12:21PM +0200, Roger Quadros wrote: >> All AM62 devices have Errata i2409 [1] due to which >> USB2 PHY may lock up due to short suspend. > > Is there any visible log trace when we have this phy lock up situation? > Eventually it would be nice to have this in the commit message. > I have not been able to reproduce this issue here so no log trace.
diff --git a/drivers/usb/dwc3/dwc3-am62.c b/drivers/usb/dwc3/dwc3-am62.c index af1ce934e7fb..5ae5c3087b0f 100644 --- a/drivers/usb/dwc3/dwc3-am62.c +++ b/drivers/usb/dwc3/dwc3-am62.c @@ -101,6 +101,11 @@ #define PHY_CORE_VOLTAGE_MASK BIT(31) #define PHY_PLL_REFCLK_MASK GENMASK(3, 0) +/* USB PHY2 register offsets */ +#define USB_PHY_PLL_REG12 0x130 +#define USB_PHY_PLL_LDO_REF_EN BIT(5) +#define USB_PHY_PLL_LDO_REF_EN_EN BIT(4) + #define DWC3_AM62_AUTOSUSPEND_DELAY 100 struct dwc3_am62 { @@ -184,8 +189,9 @@ static int dwc3_ti_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct device_node *node = pdev->dev.of_node; struct dwc3_am62 *am62; - int i, ret; unsigned long rate; + void __iomem *phy; + int i, ret; u32 reg; am62 = devm_kzalloc(dev, sizeof(*am62), GFP_KERNEL); @@ -201,6 +207,12 @@ static int dwc3_ti_probe(struct platform_device *pdev) return PTR_ERR(am62->usbss); } + phy = devm_platform_ioremap_resource(pdev, 1); + if (IS_ERR(phy)) { + dev_err(dev, "can't map PHY IOMEM resource. Won't apply i2409 fix.\n"); + phy = NULL; + } + am62->usb2_refclk = devm_clk_get(dev, "ref"); if (IS_ERR(am62->usb2_refclk)) { dev_err(dev, "can't get usb2_refclk\n"); @@ -227,6 +239,13 @@ static int dwc3_ti_probe(struct platform_device *pdev) if (ret) return ret; + /* Workaround Errata i2409 */ + if (phy) { + reg = readl(phy + USB_PHY_PLL_REG12); + reg |= USB_PHY_PLL_LDO_REF_EN | USB_PHY_PLL_LDO_REF_EN_EN; + writel(reg, phy + USB_PHY_PLL_REG12); + } + /* VBUS divider select */ am62->vbus_divider = device_property_read_bool(dev, "ti,vbus-divider"); reg = dwc3_ti_readl(am62, USBSS_PHY_CONFIG);