From: "Théo Lebrun" <theo.lebrun@bootlin.com> To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>, Rob Herring <robh+dt@kernel.org>, Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>, Conor Dooley <conor+dt@kernel.org>, Roger Quadros <rogerq@kernel.org>, Peter Chen <peter.chen@kernel.org>, Pawel Laszczak <pawell@cadence.com>, Nishanth Menon <nm@ti.com>, Vignesh Raghavendra <vigneshr@ti.com>, Tero Kristo <kristo@kernel.org> Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, "Théo Lebrun" <theo.lebrun@bootlin.com> Subject: [PATCH 2/6] usb: cdns3-ti: move reg writes from probe into an init_hw helper Date: Mon, 13 Nov 2023 15:26:57 +0100 [thread overview] Message-ID: <20231113-j7200-usb-suspend-v1-2-ad1ee714835c@bootlin.com> (raw) In-Reply-To: <20231113-j7200-usb-suspend-v1-0-ad1ee714835c@bootlin.com> The hardware initialisation register write sequence is only used at probe. To support suspend/resume with a controller losing power, we must redo this sequence of writes. Extract the register write sequence to a new cdns_ti_init_hw function to reuse it later down the road, at resume. We keep the devicetree-parsing aspect of the sequence in probe & add a new field in the private struct to remember the USB2 refclk rate code computation result. Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> --- drivers/usb/cdns3/cdns3-ti.c | 76 ++++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/drivers/usb/cdns3/cdns3-ti.c b/drivers/usb/cdns3/cdns3-ti.c index 5945c4b1e11f..c331bcd2faeb 100644 --- a/drivers/usb/cdns3/cdns3-ti.c +++ b/drivers/usb/cdns3/cdns3-ti.c @@ -57,6 +57,7 @@ struct cdns_ti { unsigned vbus_divider:1; struct clk *usb2_refclk; struct clk *lpm_clk; + int usb2_refclk_rate_code; }; static const int cdns_ti_rate_table[] = { /* in KHZ */ @@ -85,15 +86,50 @@ static inline void cdns_ti_writel(struct cdns_ti *data, u32 offset, u32 value) writel(value, data->usbss + offset); } +static void cdns_ti_init_hw(struct cdns_ti *data) +{ + u32 reg; + + /* assert RESET */ + reg = cdns_ti_readl(data, USBSS_W1); + reg &= ~USBSS_W1_PWRUP_RST; + cdns_ti_writel(data, USBSS_W1, reg); + + /* set static config */ + reg = cdns_ti_readl(data, USBSS_STATIC_CONFIG); + reg &= ~USBSS1_STATIC_PLL_REF_SEL_MASK; + reg |= data->usb2_refclk_rate_code << USBSS1_STATIC_PLL_REF_SEL_SHIFT; + + reg &= ~USBSS1_STATIC_VBUS_SEL_MASK; + if (data->vbus_divider) + reg |= 1 << USBSS1_STATIC_VBUS_SEL_SHIFT; + + cdns_ti_writel(data, USBSS_STATIC_CONFIG, reg); + reg = cdns_ti_readl(data, USBSS_STATIC_CONFIG); + + /* set USB2_ONLY mode if requested */ + reg = cdns_ti_readl(data, USBSS_W1); + if (data->usb2_only) + reg |= USBSS_W1_USB2_ONLY; + + /* set default modestrap */ + reg |= USBSS_W1_MODESTRAP_SEL; + reg &= ~USBSS_W1_MODESTRAP_MASK; + reg |= USBSS_MODESTRAP_MODE_NONE << USBSS_W1_MODESTRAP_SHIFT; + cdns_ti_writel(data, USBSS_W1, reg); + + /* de-assert RESET */ + reg |= USBSS_W1_PWRUP_RST; + cdns_ti_writel(data, USBSS_W1, reg); +} + static int cdns_ti_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *node = pdev->dev.of_node; struct cdns_ti *data; - int error; - u32 reg; - int rate_code, i; unsigned long rate; + int error, i; data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); if (!data) @@ -133,8 +169,6 @@ static int cdns_ti_probe(struct platform_device *pdev) return -EINVAL; } - rate_code = i; - pm_runtime_enable(dev); error = pm_runtime_get_sync(dev); if (error < 0) { @@ -142,39 +176,11 @@ static int cdns_ti_probe(struct platform_device *pdev) goto err; } - /* assert RESET */ - reg = cdns_ti_readl(data, USBSS_W1); - reg &= ~USBSS_W1_PWRUP_RST; - cdns_ti_writel(data, USBSS_W1, reg); - - /* set static config */ - reg = cdns_ti_readl(data, USBSS_STATIC_CONFIG); - reg &= ~USBSS1_STATIC_PLL_REF_SEL_MASK; - reg |= rate_code << USBSS1_STATIC_PLL_REF_SEL_SHIFT; - - reg &= ~USBSS1_STATIC_VBUS_SEL_MASK; data->vbus_divider = device_property_read_bool(dev, "ti,vbus-divider"); - if (data->vbus_divider) - reg |= 1 << USBSS1_STATIC_VBUS_SEL_SHIFT; - - cdns_ti_writel(data, USBSS_STATIC_CONFIG, reg); - reg = cdns_ti_readl(data, USBSS_STATIC_CONFIG); - - /* set USB2_ONLY mode if requested */ - reg = cdns_ti_readl(data, USBSS_W1); data->usb2_only = device_property_read_bool(dev, "ti,usb2-only"); - if (data->usb2_only) - reg |= USBSS_W1_USB2_ONLY; - - /* set default modestrap */ - reg |= USBSS_W1_MODESTRAP_SEL; - reg &= ~USBSS_W1_MODESTRAP_MASK; - reg |= USBSS_MODESTRAP_MODE_NONE << USBSS_W1_MODESTRAP_SHIFT; - cdns_ti_writel(data, USBSS_W1, reg); + data->usb2_refclk_rate_code = i; - /* de-assert RESET */ - reg |= USBSS_W1_PWRUP_RST; - cdns_ti_writel(data, USBSS_W1, reg); + cdns_ti_init_hw(data); error = of_platform_populate(node, NULL, NULL, dev); if (error) { -- 2.41.0
WARNING: multiple messages have this Message-ID (diff)
From: "Théo Lebrun" <theo.lebrun@bootlin.com> To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>, Rob Herring <robh+dt@kernel.org>, Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>, Conor Dooley <conor+dt@kernel.org>, Roger Quadros <rogerq@kernel.org>, Peter Chen <peter.chen@kernel.org>, Pawel Laszczak <pawell@cadence.com>, Nishanth Menon <nm@ti.com>, Vignesh Raghavendra <vigneshr@ti.com>, Tero Kristo <kristo@kernel.org> Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, "Théo Lebrun" <theo.lebrun@bootlin.com> Subject: [PATCH 2/6] usb: cdns3-ti: move reg writes from probe into an init_hw helper Date: Mon, 13 Nov 2023 15:26:57 +0100 [thread overview] Message-ID: <20231113-j7200-usb-suspend-v1-2-ad1ee714835c@bootlin.com> (raw) In-Reply-To: <20231113-j7200-usb-suspend-v1-0-ad1ee714835c@bootlin.com> The hardware initialisation register write sequence is only used at probe. To support suspend/resume with a controller losing power, we must redo this sequence of writes. Extract the register write sequence to a new cdns_ti_init_hw function to reuse it later down the road, at resume. We keep the devicetree-parsing aspect of the sequence in probe & add a new field in the private struct to remember the USB2 refclk rate code computation result. Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> --- drivers/usb/cdns3/cdns3-ti.c | 76 ++++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/drivers/usb/cdns3/cdns3-ti.c b/drivers/usb/cdns3/cdns3-ti.c index 5945c4b1e11f..c331bcd2faeb 100644 --- a/drivers/usb/cdns3/cdns3-ti.c +++ b/drivers/usb/cdns3/cdns3-ti.c @@ -57,6 +57,7 @@ struct cdns_ti { unsigned vbus_divider:1; struct clk *usb2_refclk; struct clk *lpm_clk; + int usb2_refclk_rate_code; }; static const int cdns_ti_rate_table[] = { /* in KHZ */ @@ -85,15 +86,50 @@ static inline void cdns_ti_writel(struct cdns_ti *data, u32 offset, u32 value) writel(value, data->usbss + offset); } +static void cdns_ti_init_hw(struct cdns_ti *data) +{ + u32 reg; + + /* assert RESET */ + reg = cdns_ti_readl(data, USBSS_W1); + reg &= ~USBSS_W1_PWRUP_RST; + cdns_ti_writel(data, USBSS_W1, reg); + + /* set static config */ + reg = cdns_ti_readl(data, USBSS_STATIC_CONFIG); + reg &= ~USBSS1_STATIC_PLL_REF_SEL_MASK; + reg |= data->usb2_refclk_rate_code << USBSS1_STATIC_PLL_REF_SEL_SHIFT; + + reg &= ~USBSS1_STATIC_VBUS_SEL_MASK; + if (data->vbus_divider) + reg |= 1 << USBSS1_STATIC_VBUS_SEL_SHIFT; + + cdns_ti_writel(data, USBSS_STATIC_CONFIG, reg); + reg = cdns_ti_readl(data, USBSS_STATIC_CONFIG); + + /* set USB2_ONLY mode if requested */ + reg = cdns_ti_readl(data, USBSS_W1); + if (data->usb2_only) + reg |= USBSS_W1_USB2_ONLY; + + /* set default modestrap */ + reg |= USBSS_W1_MODESTRAP_SEL; + reg &= ~USBSS_W1_MODESTRAP_MASK; + reg |= USBSS_MODESTRAP_MODE_NONE << USBSS_W1_MODESTRAP_SHIFT; + cdns_ti_writel(data, USBSS_W1, reg); + + /* de-assert RESET */ + reg |= USBSS_W1_PWRUP_RST; + cdns_ti_writel(data, USBSS_W1, reg); +} + static int cdns_ti_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *node = pdev->dev.of_node; struct cdns_ti *data; - int error; - u32 reg; - int rate_code, i; unsigned long rate; + int error, i; data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); if (!data) @@ -133,8 +169,6 @@ static int cdns_ti_probe(struct platform_device *pdev) return -EINVAL; } - rate_code = i; - pm_runtime_enable(dev); error = pm_runtime_get_sync(dev); if (error < 0) { @@ -142,39 +176,11 @@ static int cdns_ti_probe(struct platform_device *pdev) goto err; } - /* assert RESET */ - reg = cdns_ti_readl(data, USBSS_W1); - reg &= ~USBSS_W1_PWRUP_RST; - cdns_ti_writel(data, USBSS_W1, reg); - - /* set static config */ - reg = cdns_ti_readl(data, USBSS_STATIC_CONFIG); - reg &= ~USBSS1_STATIC_PLL_REF_SEL_MASK; - reg |= rate_code << USBSS1_STATIC_PLL_REF_SEL_SHIFT; - - reg &= ~USBSS1_STATIC_VBUS_SEL_MASK; data->vbus_divider = device_property_read_bool(dev, "ti,vbus-divider"); - if (data->vbus_divider) - reg |= 1 << USBSS1_STATIC_VBUS_SEL_SHIFT; - - cdns_ti_writel(data, USBSS_STATIC_CONFIG, reg); - reg = cdns_ti_readl(data, USBSS_STATIC_CONFIG); - - /* set USB2_ONLY mode if requested */ - reg = cdns_ti_readl(data, USBSS_W1); data->usb2_only = device_property_read_bool(dev, "ti,usb2-only"); - if (data->usb2_only) - reg |= USBSS_W1_USB2_ONLY; - - /* set default modestrap */ - reg |= USBSS_W1_MODESTRAP_SEL; - reg &= ~USBSS_W1_MODESTRAP_MASK; - reg |= USBSS_MODESTRAP_MODE_NONE << USBSS_W1_MODESTRAP_SHIFT; - cdns_ti_writel(data, USBSS_W1, reg); + data->usb2_refclk_rate_code = i; - /* de-assert RESET */ - reg |= USBSS_W1_PWRUP_RST; - cdns_ti_writel(data, USBSS_W1, reg); + cdns_ti_init_hw(data); error = of_platform_populate(node, NULL, NULL, dev); if (error) { -- 2.41.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2023-11-13 14:27 UTC|newest] Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-11-13 14:26 [PATCH 0/6] usb: cdns: fix suspend on J7200 by assuming reset on resume Théo Lebrun 2023-11-13 14:26 ` Théo Lebrun 2023-11-13 14:26 ` [PATCH 1/6] dt-bindings: usb: ti,j721e-usb: add ti,j7200-usb compatible Théo Lebrun 2023-11-13 14:26 ` Théo Lebrun 2023-11-13 19:58 ` Conor Dooley 2023-11-13 19:58 ` Conor Dooley 2023-11-13 14:26 ` Théo Lebrun [this message] 2023-11-13 14:26 ` [PATCH 2/6] usb: cdns3-ti: move reg writes from probe into an init_hw helper Théo Lebrun 2023-11-15 11:33 ` Roger Quadros 2023-11-15 11:33 ` Roger Quadros 2023-11-15 14:23 ` Théo Lebrun 2023-11-15 14:23 ` Théo Lebrun 2023-11-16 12:00 ` Roger Quadros 2023-11-16 12:00 ` Roger Quadros 2023-11-13 14:26 ` [PATCH 3/6] usb: cdns3-ti: add suspend/resume procedures for J7200 Théo Lebrun 2023-11-13 14:26 ` Théo Lebrun 2023-11-13 15:39 ` Gregory CLEMENT 2023-11-13 15:39 ` Gregory CLEMENT 2023-11-14 11:13 ` Théo Lebrun 2023-11-14 11:13 ` Théo Lebrun 2023-11-15 11:37 ` Roger Quadros 2023-11-15 11:37 ` Roger Quadros 2023-11-15 15:02 ` Théo Lebrun 2023-11-15 15:02 ` Théo Lebrun 2023-11-16 12:40 ` Roger Quadros 2023-11-16 12:40 ` Roger Quadros 2023-11-16 18:56 ` Théo Lebrun 2023-11-16 18:56 ` Théo Lebrun 2023-11-16 21:44 ` Roger Quadros 2023-11-16 21:44 ` Roger Quadros 2023-11-17 10:17 ` Théo Lebrun 2023-11-17 10:17 ` Théo Lebrun 2023-11-17 11:51 ` Roger Quadros 2023-11-17 11:51 ` Roger Quadros 2023-11-17 14:20 ` Théo Lebrun 2023-11-17 14:20 ` Théo Lebrun 2023-11-18 10:41 ` Roger Quadros 2023-11-18 10:41 ` Roger Quadros 2023-11-22 22:23 ` Kevin Hilman 2023-11-22 22:23 ` Kevin Hilman 2023-11-23 9:51 ` Théo Lebrun 2023-11-23 9:51 ` Théo Lebrun 2023-11-26 22:36 ` Kevin Hilman 2023-11-26 22:36 ` Kevin Hilman 2023-11-27 13:25 ` Théo Lebrun 2023-11-27 13:25 ` Théo Lebrun 2023-12-12 18:26 ` Kevin Hilman 2023-12-12 18:26 ` Kevin Hilman 2023-12-12 19:31 ` Alan Stern 2023-12-12 19:31 ` Alan Stern 2023-11-13 14:26 ` [PATCH 4/6] usb: cdns3: support power-off of controller when in host role Théo Lebrun 2023-11-13 14:26 ` Théo Lebrun 2023-11-14 8:38 ` Peter Chen 2023-11-14 8:38 ` Peter Chen 2023-11-14 11:10 ` Théo Lebrun 2023-11-14 11:10 ` Théo Lebrun 2023-11-17 3:38 ` Peter Chen 2023-11-17 3:38 ` Peter Chen 2023-11-17 9:58 ` Théo Lebrun 2023-11-17 9:58 ` Théo Lebrun 2023-11-20 5:44 ` Peter Chen 2023-11-20 5:44 ` Peter Chen 2023-11-13 14:27 ` [PATCH 5/6] usb: cdns3-ti: notify cdns core that hardware resets across suspend on J7200 Théo Lebrun 2023-11-13 14:27 ` Théo Lebrun 2023-11-13 14:27 ` [PATCH 6/6] arm64: dts: ti: k3-j7200: use J7200-specific USB compatible Théo Lebrun 2023-11-13 14:27 ` Théo Lebrun 2023-11-14 10:01 ` Gregory CLEMENT 2023-11-14 10:01 ` Gregory CLEMENT 2023-11-14 11:14 ` Théo Lebrun 2023-11-14 11:14 ` Théo Lebrun
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20231113-j7200-usb-suspend-v1-2-ad1ee714835c@bootlin.com \ --to=theo.lebrun@bootlin.com \ --cc=conor+dt@kernel.org \ --cc=devicetree@vger.kernel.org \ --cc=gregkh@linuxfoundation.org \ --cc=kristo@kernel.org \ --cc=krzysztof.kozlowski+dt@linaro.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-usb@vger.kernel.org \ --cc=nm@ti.com \ --cc=pawell@cadence.com \ --cc=peter.chen@kernel.org \ --cc=robh+dt@kernel.org \ --cc=rogerq@kernel.org \ --cc=vigneshr@ti.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.