Re: [PATCH 2/2] mmc: tmio: Make sure the PM domain is 'started' while probing

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 18 May 2020 at 23:07, Geert Uytterhoeven <geert@xxxxxxxxxxxxxx> wrote:
>
> Hi Ulf,
>
> On Fri, May 15, 2020 at 4:05 PM Ulf Hansson <ulf.hansson@xxxxxxxxxx> wrote:
> > If the tmio device is attached to a genpd (PM domain), that genpd may have
> > ->start|stop() callback assigned to it. To make sure the device is
> > accessible during ->probe(), genpd's ->start() callback must be invoked,
> > which is currently managed by tmio_mmc_host_probe(). This is very likely to
> > be too late for some cases, as registers may be read and written way before
> > that.
> >
> > To fix this behaviour, let's drop the call to dev_pm_domain_start() from
> > tmio_mmc_host_probe() - and let the tmio clients manage this instead.
> >
> > Signed-off-by: Ulf Hansson <ulf.hansson@xxxxxxxxxx>
>
> So this moves the call to dev_pm_domain_start(). No new calls are added.
> If I get it right, dev_pm_domain_start() just calls into
> genpd_dev_pm_start() through a function pointer, and starts the device
> through the system-specific PM Domain handler.  On R-Car SoCs, that
> is pm_clk_resume(), i.e. enabling the module clock through the clock
> domain.

Correct.

>
> I have two questions there:
>   1. What if the device is already started?
>      There seems to be no reference counting involved.

The device can't be started as runtime PM hasn't been enabled yet for
the device - and this is controlled by the tmio/renesas driver.

>   2. Who stops the device again?

Beyond this point there are two main cases to consider.

1. The driver is probed successfully and thus up and running. Then,
when the device becomes runtime suspended (because of request
inactivity, for example), the device will be "stopped" through genpd.

2. The driver failed to probe or the ->remove() callback is invoked
for the device. This will trigger the platform bus to call
dev_pm_domain_detach(). In this path, genpd invokes the
genpd->detach_dev() callback for the device, which allows the genpd
provider to deal with the clean up. In this particular case, I assume
pm_clk_destroy() is going to be called for the device.

>
> I always thought the PM Domain was powered on (if still off), and the
> device started, by calling pm_runtime_get_sync().

Correct.

However, deploying that kind of pattern in a driver can be a bit
messy, while considering that CONFIG_PM may be set or unset and the
driver should work in both configurations. In principle, it leads to
boilerplate code in drivers, especially if the driver has runtime PM
callbacks assigned to it as shown in commit 1b32999e205b ("mmc: tmio:
Avoid boilerplate code in ->runtime_suspend()").

Does it make sense?

[...]

Kind regards
Uffe



[Index of Archives]     [Linux Memonry Technology]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux