From: Roger Quadros <rogerq@kernel.org>
To: "Théo Lebrun" <theo.lebrun@bootlin.com>,
"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>,
"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
Subject: Re: [PATCH 3/6] usb: cdns3-ti: add suspend/resume procedures for J7200
Date: Thu, 16 Nov 2023 14:40:55 +0200 [thread overview]
Message-ID: <dad980f3-e032-41e4-a1e4-a16a7f45ff95@kernel.org> (raw)
In-Reply-To: <CWZH66HQZNYM.T623ZOEEE0BK@tleb-bootlin-xps13-01>
On 15/11/2023 17:02, Théo Lebrun wrote:
> Hi Roger,
>
> On Wed Nov 15, 2023 at 12:37 PM CET, Roger Quadros wrote:
>> On 13/11/2023 16:26, Théo Lebrun wrote:
>>> 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.
>>
>> at probe we are doing a pm_runtime_get() and never doing a put thus
>> preventing any runtime PM.
>
> Indeed. The get() from probe/resume are in symmetry with the put() from
> suspend. Is this wrong in some manner?
>
>>> 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;
>>
>> You might want to check suspend/resume ops in cdns3-plat and
>> do something similar here.
>
> I'm unsure what you are referring to specifically in cdns3-plat?
What I meant is, calling pm_runtime_get/put() from system suspend/resume
hooks doesn't seem right.
How about using something like pm_runtime_forbid(dev) on devices which
loose USB context on runtime suspend e.g. J7200.
So at probe we can get rid of the pm_runtime_get_sync() call.
e.g.
pm_runtime_set_active(dev);
pm_runtime_enable(dev);
if (cnds_ti->can_loose_context)
pm_runtime_forbid(dev);
pm_runtime_set_autosuspend_delay(dev, CNDS_TI_AUTOSUSPEND_DELAY); /* could be 20ms? */
pm_runtime_mark_last_busy(dev);
pm_runtime_use_autosuspend(dev);
You will need to modify the suspend/resume handlers accordingly.
https://docs.kernel.org/power/runtime_pm.html#runtime-pm-and-system-sleep
What I'm not sure of is if there are any TI platforms that retain USB context
on power domain off. Let me get back on this. Till then we can assume that
all platforms loose USB context on power domain off.
One comment below.
> + return ret;
> +}
>
> - Using pm_runtime_status_suspended() to get the current PM runtime
> state & act on it? I don't see why because we know the pm_runtime
> state is a single put() at probe.
>
> - Having a `in_lpm` flag to track low-power mode state? I wouldn't see
> why we'd want that as we don't register runtime_suspend &
> runtime_resume callbacks and system syspend/resume can be assumed to
> be called in the right order.
>
> - Checking the `device_may_wakeup()`? That doesn't apply to this driver
> which cannot be a wakeup source.
>
> Thanks for your review!
> Regards,
>
> --> +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);
Why do you do a pm_runtime_disable() here?
> + return ret;
> +}
> Théo Lebrun, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
>
> ------------------------------------------------------------------------
>
>
--
cheers,
-roger
next prev parent reply other threads:[~2023-11-16 12:41 UTC|newest]
Thread overview: 35+ 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 ` [PATCH 1/6] dt-bindings: usb: ti,j721e-usb: add ti,j7200-usb compatible Théo Lebrun
2023-11-13 19:58 ` Conor Dooley
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 14:23 ` Théo Lebrun
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 15:39 ` Gregory CLEMENT
2023-11-14 11:13 ` Théo Lebrun
2023-11-15 11:37 ` Roger Quadros
2023-11-15 15:02 ` Théo Lebrun
2023-11-16 12:40 ` Roger Quadros [this message]
2023-11-16 18:56 ` Théo Lebrun
2023-11-16 21:44 ` Roger Quadros
2023-11-17 10:17 ` Théo Lebrun
2023-11-17 11:51 ` Roger Quadros
2023-11-17 14:20 ` Théo Lebrun
2023-11-18 10:41 ` Roger Quadros
2023-11-22 22:23 ` Kevin Hilman
2023-11-23 9:51 ` Théo Lebrun
2023-11-26 22:36 ` Kevin Hilman
2023-11-27 13:25 ` Théo Lebrun
2023-12-12 18:26 ` Kevin Hilman
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-14 8:38 ` Peter Chen
2023-11-14 11:10 ` Théo Lebrun
2023-11-17 3:38 ` Peter Chen
2023-11-17 9:58 ` Théo Lebrun
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 ` [PATCH 6/6] arm64: dts: ti: k3-j7200: use J7200-specific USB compatible Théo Lebrun
2023-11-14 10:01 ` Gregory CLEMENT
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=dad980f3-e032-41e4-a1e4-a16a7f45ff95@kernel.org \
--to=rogerq@kernel.org \
--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=theo.lebrun@bootlin.com \
--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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).