From patchwork Mon Nov 13 14:26:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Th=C3=A9o_Lebrun?= X-Patchwork-Id: 13454038 Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net [23.128.96.19]) (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 014DB210E7; Mon, 13 Nov 2023 14:27:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="dNWCpFGY" Received: from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net [IPv6:2001:4b98:dc4:8::225]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CBC9FD5F; Mon, 13 Nov 2023 06:27:01 -0800 (PST) Received: by mail.gandi.net (Postfix) with ESMTPSA id D83E21C000F; Mon, 13 Nov 2023 14:26:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1699885620; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wEIgs122T7Asjcu3DAVwNs7eylVPunuGePaZEbl2tp8=; b=dNWCpFGY1qQrSRHjE5jAiv2SOMoC/Vkt74glt8+kW453OpsdimOQ6aw9eXp0Wr1Towbw5M Dn/7aBoG7qGp+huZcQjDhFZSDQBBatEWcfpoAP8PNAg5wW/CwA5iltmJyrI8+XpkdEwxTT kbj+dZIBiPnY+l3/TLvEV/Fkz1K/f3VenxYi3abxz0g8t+5qbTs9p5RCK+l0lmr/59QTxk M20tysL0nYfbuOdYylYb3UOX6T7ryx+nG65Rs9n3hNCx308YyEvh3tA9pfTUUWy8v1+pjw P9RsYCFAcjnNUVLxbN/I4qCdHxIHacs2i21h5n0UkZCsEbAZvCXoVdM9evsWpw== From: =?utf-8?q?Th=C3=A9o_Lebrun?= Date: Mon, 13 Nov 2023 15:26:56 +0100 Subject: [PATCH 1/6] dt-bindings: usb: ti,j721e-usb: add ti,j7200-usb compatible Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20231113-j7200-usb-suspend-v1-1-ad1ee714835c@bootlin.com> References: <20231113-j7200-usb-suspend-v1-0-ad1ee714835c@bootlin.com> In-Reply-To: <20231113-j7200-usb-suspend-v1-0-ad1ee714835c@bootlin.com> To: Greg Kroah-Hartman , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Roger Quadros , Peter Chen , Pawel Laszczak , Nishanth Menon , Vignesh Raghavendra , Tero Kristo Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, =?utf-8?q?Th=C3=A9o_Lebrun?= X-Mailer: b4 0.12.3 X-GND-Sasl: theo.lebrun@bootlin.com On this platform, the controller is reset on resume. This makes it have a different behavior from other platforms. Signed-off-by: Théo Lebrun Acked-by: Conor Dooley --- Documentation/devicetree/bindings/usb/ti,j721e-usb.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/usb/ti,j721e-usb.yaml b/Documentation/devicetree/bindings/usb/ti,j721e-usb.yaml index 95ff9791baea..77e0c0499936 100644 --- a/Documentation/devicetree/bindings/usb/ti,j721e-usb.yaml +++ b/Documentation/devicetree/bindings/usb/ti,j721e-usb.yaml @@ -12,6 +12,7 @@ maintainers: properties: compatible: oneOf: + - const: ti,j7200-usb - const: ti,j721e-usb - const: ti,am64-usb - items: From patchwork Mon Nov 13 14:26:57 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Th=C3=A9o_Lebrun?= X-Patchwork-Id: 13454042 Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net [23.128.96.19]) (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 F335A210FC; Mon, 13 Nov 2023 14:27:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="SwUcstoM" Received: from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net [217.70.183.197]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9301FD5E; Mon, 13 Nov 2023 06:27:02 -0800 (PST) Received: by mail.gandi.net (Postfix) with ESMTPSA id 8C3A21C0015; Mon, 13 Nov 2023 14:27:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1699885621; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=GSimQIqa/8SepKg3uis9mexXr+RooQka7AQUj0ZMCxM=; b=SwUcstoMkO51WegbzPUOXINPZ7NYGCDMsSX0TGQ1JTX8616YqGNMPNTIaMYNIdWQ35Dku+ QmWV2FEHBVVZBsexgmEjdOmjFtlIq+ydInNn6XP2nZPQj55mglPNuuAyYqHwiITK75nWAC VzBCcYJvpz7H087K6HdZz5+obEe/2eOZnvxwUb5P0L65KMHQfR4r/KZrxmelOxS5Fvq9CQ NkXbPlSCOKL2S6v+1o1YlB9fCcBiQeDl5T+U4BF3PbBXFYe4Ud4wpofFGQK6Z+G2JjFI8E i07xwHxck7QCcudy3pCixOhdQW/ekohVwHujrytfq81jMmf0ctoZNe/43FdDLQ== From: =?utf-8?q?Th=C3=A9o_Lebrun?= Date: Mon, 13 Nov 2023 15:26:57 +0100 Subject: [PATCH 2/6] usb: cdns3-ti: move reg writes from probe into an init_hw helper Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20231113-j7200-usb-suspend-v1-2-ad1ee714835c@bootlin.com> References: <20231113-j7200-usb-suspend-v1-0-ad1ee714835c@bootlin.com> In-Reply-To: <20231113-j7200-usb-suspend-v1-0-ad1ee714835c@bootlin.com> To: Greg Kroah-Hartman , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Roger Quadros , Peter Chen , Pawel Laszczak , Nishanth Menon , Vignesh Raghavendra , Tero Kristo Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, =?utf-8?q?Th=C3=A9o_Lebrun?= X-Mailer: b4 0.12.3 X-GND-Sasl: theo.lebrun@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 --- 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) { From patchwork Mon Nov 13 14:26:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Th=C3=A9o_Lebrun?= X-Patchwork-Id: 13454040 Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net [23.128.96.19]) (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 BD8C1210F4; Mon, 13 Nov 2023 14:27:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="CdUrQ5QZ" Received: from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net [217.70.183.197]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 28F66D60; Mon, 13 Nov 2023 06:27:03 -0800 (PST) Received: by mail.gandi.net (Postfix) with ESMTPSA id 4CF531C0003; Mon, 13 Nov 2023 14:27:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1699885621; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xhQIX2l1AguLqLqqSuhrXlTHhHreB3Yx+m4gIExyzdk=; b=CdUrQ5QZKlKgfAHkaN5pRMkm6kJPA7FlAgX2N1M8ahm8ex2+uOgnaxX7lYbma/37xjoiRR XvjQ+AmQaJMrockgTuSlRkL1QUubiF49WGsh9YTkowiuuvRhl9EoaH3DspwDotkBdXLOwv LE9brLy6qOvyZkXRkYRhk8wg2GPX19qZGyr7ebhITZO+h+rXHfrYQk9V53UF5D5aVE3HeL XdU2nwVZ5T0MfN8IR33H+UiHkN7fy69Xr1hkKECt9SoTyZ5PR5IBBIj8p0aBPrddSnfhPS 4m30yACn8GeoehQ57l1oVuMsJrzUg2PcR25Enpzsly5sV9f6yLG5IeL/tKxM+g== From: =?utf-8?q?Th=C3=A9o_Lebrun?= Date: Mon, 13 Nov 2023 15:26:58 +0100 Subject: [PATCH 3/6] usb: cdns3-ti: add suspend/resume procedures for J7200 Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20231113-j7200-usb-suspend-v1-3-ad1ee714835c@bootlin.com> References: <20231113-j7200-usb-suspend-v1-0-ad1ee714835c@bootlin.com> In-Reply-To: <20231113-j7200-usb-suspend-v1-0-ad1ee714835c@bootlin.com> To: Greg Kroah-Hartman , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Roger Quadros , Peter Chen , Pawel Laszczak , Nishanth Menon , Vignesh Raghavendra , Tero Kristo Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, =?utf-8?q?Th=C3=A9o_Lebrun?= X-Mailer: b4 0.12.3 X-GND-Sasl: theo.lebrun@bootlin.com Hardware initialisation is only done at probe. The J7200 USB controller is reset at resume because of power-domains toggling off & on. We therefore (1) toggle PM runtime at suspend/resume & (2) reconfigure the hardware at resume. Reuse the newly extracted cdns_ti_init_hw() function that contains the register write sequence. We guard this behavior based on compatible to avoid modifying the current behavior on other platforms. If the controller does not reset we do not want to touch PM runtime & do not want to redo reg writes. Signed-off-by: Théo Lebrun Reviewed-by: Gregory CLEMENT --- drivers/usb/cdns3/cdns3-ti.c | 48 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/drivers/usb/cdns3/cdns3-ti.c b/drivers/usb/cdns3/cdns3-ti.c index c331bcd2faeb..50b38c4b9c87 100644 --- a/drivers/usb/cdns3/cdns3-ti.c +++ b/drivers/usb/cdns3/cdns3-ti.c @@ -197,6 +197,50 @@ static int cdns_ti_probe(struct platform_device *pdev) return error; } +#ifdef CONFIG_PM + +static int cdns_ti_suspend(struct device *dev) +{ + struct cdns_ti *data = dev_get_drvdata(dev); + + if (!of_device_is_compatible(dev_of_node(dev), "ti,j7200-usb")) + return 0; + + pm_runtime_put_sync(data->dev); + + return 0; +} + +static int cdns_ti_resume(struct device *dev) +{ + struct cdns_ti *data = dev_get_drvdata(dev); + int ret; + + if (!of_device_is_compatible(dev_of_node(dev), "ti,j7200-usb")) + return 0; + + ret = pm_runtime_get_sync(dev); + if (ret < 0) { + dev_err(dev, "pm_runtime_get_sync failed: %d\n", ret); + goto err; + } + + cdns_ti_init_hw(data); + + return 0; + +err: + pm_runtime_put_sync(data->dev); + pm_runtime_disable(data->dev); + return ret; +} + +static const struct dev_pm_ops cdns_ti_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(cdns_ti_suspend, cdns_ti_resume) +}; + +#endif /* CONFIG_PM */ + static int cdns_ti_remove_core(struct device *dev, void *c) { struct platform_device *pdev = to_platform_device(dev); @@ -218,6 +262,7 @@ static void cdns_ti_remove(struct platform_device *pdev) } static const struct of_device_id cdns_ti_of_match[] = { + { .compatible = "ti,j7200-usb", }, { .compatible = "ti,j721e-usb", }, { .compatible = "ti,am64-usb", }, {}, @@ -228,8 +273,9 @@ static struct platform_driver cdns_ti_driver = { .probe = cdns_ti_probe, .remove_new = cdns_ti_remove, .driver = { - .name = "cdns3-ti", + .name = "cdns3-ti", .of_match_table = cdns_ti_of_match, + .pm = pm_ptr(&cdns_ti_pm_ops), }, }; From patchwork Mon Nov 13 14:26:59 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Th=C3=A9o_Lebrun?= X-Patchwork-Id: 13454041 Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net [23.128.96.19]) (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 B8760210F3; Mon, 13 Nov 2023 14:27:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="dkrLrBm0" Received: from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net [217.70.183.197]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C7BA4D6E; Mon, 13 Nov 2023 06:27:03 -0800 (PST) Received: by mail.gandi.net (Postfix) with ESMTPSA id F36D91C0006; Mon, 13 Nov 2023 14:27:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1699885622; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cnUtq32WECjfa76r/drw3nv80tgUh5X0WPjXLzFlw28=; b=dkrLrBm0G6WnQIfo4v7EkNmhc1fxeqZv1l6opb3gjHwULojiv5p/NaJkGUcgKv6etaoTPi 0ADc6WeA4CdTabdx64+7Gy6f75FiUnUNQLtLQseNQx/zupfA/EeObKE/1sR3HGVLTDLlHM Z7kk8kfQ1SjxnzJwKIPBztWSCscdZ887WmLlRhjPQw8cKbTzt9uJ1yImGdhxThhyNu2gcI mNkXD5ji2f8B+Vz9TPGfvS9qEzz+GHVuLlueiKEMLpXbzezYnSKIVFa21m+qkzSOiKy7Ic 4YXN4WaS+eim3Llkje2kUE2pwefMyWZL7qdftfkh4ktna5b+quJLChPti4S6Ew== From: =?utf-8?q?Th=C3=A9o_Lebrun?= Date: Mon, 13 Nov 2023 15:26:59 +0100 Subject: [PATCH 4/6] usb: cdns3: support power-off of controller when in host role Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20231113-j7200-usb-suspend-v1-4-ad1ee714835c@bootlin.com> References: <20231113-j7200-usb-suspend-v1-0-ad1ee714835c@bootlin.com> In-Reply-To: <20231113-j7200-usb-suspend-v1-0-ad1ee714835c@bootlin.com> To: Greg Kroah-Hartman , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Roger Quadros , Peter Chen , Pawel Laszczak , Nishanth Menon , Vignesh Raghavendra , Tero Kristo Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, =?utf-8?q?Th=C3=A9o_Lebrun?= X-Mailer: b4 0.12.3 X-GND-Sasl: theo.lebrun@bootlin.com The controller is not being reconfigured at resume. Change resume to redo hardware config if quirk CDNS3_RESET_ON_RESUME is active. Platform data comes from the parent driver (eg cdns3-ti). The quirk should be passed if the platform driver knows that the controller might be in reset state at resume. We do NOT reconfigure the hardware without this quirk to avoid losing state if we did a suspend without reset. If the quirk is on, we notify the xHCI subsystem that: 1. We reset on resume. It will therefore redo the xHC init & trigger such message as "root hub lost power or was reset" in dmesg. 2. It should disable/enable clocks on suspend/resume. This does not matter on our platform as xhci-plat does not get access to any clock but it would be the right thing to do if we indeed had such clocks. Signed-off-by: Théo Lebrun --- drivers/usb/cdns3/core.h | 1 + drivers/usb/cdns3/host.c | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/drivers/usb/cdns3/core.h b/drivers/usb/cdns3/core.h index 81a9c9d6be08..7487067ba23f 100644 --- a/drivers/usb/cdns3/core.h +++ b/drivers/usb/cdns3/core.h @@ -44,6 +44,7 @@ struct cdns3_platform_data { bool suspend, bool wakeup); unsigned long quirks; #define CDNS3_DEFAULT_PM_RUNTIME_ALLOW BIT(0) +#define CDNS3_RESET_ON_RESUME BIT(1) }; /** diff --git a/drivers/usb/cdns3/host.c b/drivers/usb/cdns3/host.c index 6164fc4c96a4..a81019a7c8cc 100644 --- a/drivers/usb/cdns3/host.c +++ b/drivers/usb/cdns3/host.c @@ -88,6 +88,9 @@ static int __cdns_host_init(struct cdns *cdns) goto err1; } + if (cdns->pdata && cdns->pdata->quirks & CDNS3_RESET_ON_RESUME) + cdns->xhci_plat_data->quirks |= XHCI_RESET_ON_RESUME | XHCI_SUSPEND_RESUME_CLKS; + if (cdns->pdata && (cdns->pdata->quirks & CDNS3_DEFAULT_PM_RUNTIME_ALLOW)) cdns->xhci_plat_data->quirks |= XHCI_DEFAULT_PM_RUNTIME_ALLOW; @@ -124,6 +127,18 @@ static void cdns_host_exit(struct cdns *cdns) cdns_drd_host_off(cdns); } +static int cdns_host_suspend(struct cdns *cdns, bool do_wakeup) +{ + if (!do_wakeup) + cdns_drd_host_off(cdns); + return 0; +} + +static int cdns_host_resume(struct cdns *cdns, bool hibernated) +{ + return cdns_drd_host_on(cdns); +} + int cdns_host_init(struct cdns *cdns) { struct cdns_role_driver *rdrv; @@ -137,6 +152,11 @@ int cdns_host_init(struct cdns *cdns) rdrv->state = CDNS_ROLE_STATE_INACTIVE; rdrv->name = "host"; + if (cdns->pdata && cdns->pdata->quirks & CDNS3_RESET_ON_RESUME) { + rdrv->suspend = cdns_host_suspend; + rdrv->resume = cdns_host_resume; + } + cdns->roles[USB_ROLE_HOST] = rdrv; return 0; From patchwork Mon Nov 13 14:27:00 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Th=C3=A9o_Lebrun?= X-Patchwork-Id: 13454043 Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net [23.128.96.19]) (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 5116321111; Mon, 13 Nov 2023 14:27:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="iGLuVOPw" Received: from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net [217.70.183.197]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 727B2D72; Mon, 13 Nov 2023 06:27:04 -0800 (PST) Received: by mail.gandi.net (Postfix) with ESMTPSA id 9F7B31C0012; Mon, 13 Nov 2023 14:27:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1699885623; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=k+i4FLnvd6XaZ4FK4Rv/lHlLAWGwtUlxb23vylnIS6g=; b=iGLuVOPw+l/CxkdcZ/4FKg7+dIPMY8gL2CbmKr/0Umw9RnIJxa4RBep3RmGFRt7kBhrULY VwDCidB9ZXtJYNGEpMm+OebAMZUXYfTlOC6WPRXCsQDlE1rFkoETqtaBtODxEpHk8vM0Bx LvlOx6U2BL5fGVNNpN7HaBySe3mYNLBKTD5yVXxf6L9o/9DkK2O9Yc7v4HMH5ikcI5xrYs hhMFaP0Q7LaWWeg4Tl1vJKHTS/U2TKBee34xMElK4UoDmNjz25wzhPMHV0ugN4Xb5s/+Ze rxZOWCT2xetF5zM9gJBUSr2jeXjWlU+EC2QJA2RM+Z+BtYedyq0w4twkS9L2XA== From: =?utf-8?q?Th=C3=A9o_Lebrun?= Date: Mon, 13 Nov 2023 15:27:00 +0100 Subject: [PATCH 5/6] usb: cdns3-ti: notify cdns core that hardware resets across suspend on J7200 Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20231113-j7200-usb-suspend-v1-5-ad1ee714835c@bootlin.com> References: <20231113-j7200-usb-suspend-v1-0-ad1ee714835c@bootlin.com> In-Reply-To: <20231113-j7200-usb-suspend-v1-0-ad1ee714835c@bootlin.com> To: Greg Kroah-Hartman , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Roger Quadros , Peter Chen , Pawel Laszczak , Nishanth Menon , Vignesh Raghavendra , Tero Kristo Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, =?utf-8?q?Th=C3=A9o_Lebrun?= X-Mailer: b4 0.12.3 X-GND-Sasl: theo.lebrun@bootlin.com Use the CDNS3_RESET_ON_RESUME quirk flag to inform the cdns3 core that our J7200 USB controller will lose power during suspend. It therefore must be reconfigured when we resume. Signed-off-by: Théo Lebrun --- drivers/usb/cdns3/cdns3-ti.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/drivers/usb/cdns3/cdns3-ti.c b/drivers/usb/cdns3/cdns3-ti.c index 50b38c4b9c87..c65714c783fb 100644 --- a/drivers/usb/cdns3/cdns3-ti.c +++ b/drivers/usb/cdns3/cdns3-ti.c @@ -16,6 +16,7 @@ #include #include #include +#include "core.h" /* USB Wrapper register offsets */ #define USBSS_PID 0x0 @@ -127,6 +128,7 @@ static int cdns_ti_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *node = pdev->dev.of_node; + const struct of_dev_auxdata *auxdata; struct cdns_ti *data; unsigned long rate; int error, i; @@ -182,7 +184,8 @@ static int cdns_ti_probe(struct platform_device *pdev) cdns_ti_init_hw(data); - error = of_platform_populate(node, NULL, NULL, dev); + auxdata = of_device_get_match_data(dev); + error = of_platform_populate(node, NULL, auxdata, dev); if (error) { dev_err(dev, "failed to create children: %d\n", error); goto err; @@ -261,8 +264,20 @@ static void cdns_ti_remove(struct platform_device *pdev) platform_set_drvdata(pdev, NULL); } +static struct cdns3_platform_data cdns_ti_j7200_pdata = { + .quirks = CDNS3_RESET_ON_RESUME, +}; + +static const struct of_dev_auxdata cdns_ti_j7200_auxdata[] = { + { + .compatible = "cdns,usb3", + .platform_data = &cdns_ti_j7200_pdata, + }, + {}, +}; + static const struct of_device_id cdns_ti_of_match[] = { - { .compatible = "ti,j7200-usb", }, + { .compatible = "ti,j7200-usb", .data = cdns_ti_j7200_auxdata, }, { .compatible = "ti,j721e-usb", }, { .compatible = "ti,am64-usb", }, {}, From patchwork Mon Nov 13 14:27:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Th=C3=A9o_Lebrun?= X-Patchwork-Id: 13454044 Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net [23.128.96.19]) (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 5E2FE21115; Mon, 13 Nov 2023 14:27:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="JKEFIsKB" Received: from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net [IPv6:2001:4b98:dc4:8::225]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 498BE10E5; Mon, 13 Nov 2023 06:27:05 -0800 (PST) Received: by mail.gandi.net (Postfix) with ESMTPSA id 4C9EF1C001D; Mon, 13 Nov 2023 14:27:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1699885623; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xSePrEltdrZVOTvOhxdlRrK/qcL9Ks2P2izMU5tje1Y=; b=JKEFIsKBpS7AxZ3+kCpMqv8P5Lm/HTtIKtvBs8c7H0q2fKGbGECmfrHKImDfvuhobhcZ1u Gev9AUbdxWIBRLqbHb9k+OlVwvxQ+DY57PY32FuoA6asoyuyGrY/3aU1cw9zXPwh40A6Fl GkGACM+hTd3rwNT/kPle3JVOlWyYr2W7uGhaaJ0LHKZIJRVeUdOzSgyQm4/QJvm8+TYPlJ 6zPY419LPYhfOWk8JRyDs1PWuCrxJXCxFtTxK1QPgkK2j2S5NxvA9kO5dbHI6Fl56yOGMF IXVctc1Up4doHSAd2pWgQRfsBDo87v3jFFRcn3Zy/HQI2ZibhVwnDVX29lxXVg== From: =?utf-8?q?Th=C3=A9o_Lebrun?= Date: Mon, 13 Nov 2023 15:27:01 +0100 Subject: [PATCH 6/6] arm64: dts: ti: k3-j7200: use J7200-specific USB compatible Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20231113-j7200-usb-suspend-v1-6-ad1ee714835c@bootlin.com> References: <20231113-j7200-usb-suspend-v1-0-ad1ee714835c@bootlin.com> In-Reply-To: <20231113-j7200-usb-suspend-v1-0-ad1ee714835c@bootlin.com> To: Greg Kroah-Hartman , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Roger Quadros , Peter Chen , Pawel Laszczak , Nishanth Menon , Vignesh Raghavendra , Tero Kristo Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, =?utf-8?q?Th=C3=A9o_Lebrun?= X-Mailer: b4 0.12.3 X-GND-Sasl: theo.lebrun@bootlin.com On our platform, suspend-to-idle or suspend-to-RAM turn the controller off thanks to a power-domain. This compatible triggers reset on resume behavior to reconfigure the hardware. Signed-off-by: Théo Lebrun --- arch/arm64/boot/dts/ti/k3-j7200-main.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/ti/k3-j7200-main.dtsi b/arch/arm64/boot/dts/ti/k3-j7200-main.dtsi index 709081cd1e7f..581905d9199e 100644 --- a/arch/arm64/boot/dts/ti/k3-j7200-main.dtsi +++ b/arch/arm64/boot/dts/ti/k3-j7200-main.dtsi @@ -788,7 +788,7 @@ pcie1_ep: pcie-ep@2910000 { }; usbss0: cdns-usb@4104000 { - compatible = "ti,j721e-usb"; + compatible = "ti,j7200-usb"; reg = <0x00 0x4104000 0x00 0x100>; dma-coherent; power-domains = <&k3_pds 288 TI_SCI_PD_EXCLUSIVE>;