On Monday, May 07, 2012, Marek Szyprowski wrote:
> Hi Rafael,
> 
> I'm sorry for a late reply, I was on holidays last week and just got back to 
> the office.
> 
> On Sunday, April 29, 2012 10:55 PM Rafael J. Wysocki wrote:
> 
> > On Friday, April 06, 2012, Marek Szyprowski wrote:
> > > Some bootloaders disable power domains on boot and the platform startup
> > > code registers them in the 'disabled' state. Current gen_pd code assumed
> > > that the devices can be registered only to the power domain which is in
> > > 'enabled' state and these devices are active at the time of the
> > > registration. This is not correct in our case. This patch lets drivers
> > > to be registered into 'disabled' power domains and finally solves
> > > mysterious freezes and lack of resume/suspend calls on Samsung Exynos4
> > > NURI and UniversalC210 platforms.
> > >
> > > Signed-off-by: Marek Szyprowski <m.szyprow...@samsung.com>
> > > Signed-off-by: Kyungmin Park <kyungmin.p...@samsung.com>
> > > ---
> > >  drivers/base/power/domain.c |    7 +------
> > >  1 files changed, 1 insertions(+), 6 deletions(-)
> > >
> > > diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
> > > index 73ce9fb..05f5799f 100644
> > > --- a/drivers/base/power/domain.c
> > > +++ b/drivers/base/power/domain.c
> > > @@ -1211,11 +1211,6 @@ int __pm_genpd_add_device(struct generic_pm_domain 
> > > *genpd, struct
> > device *dev,
> > >
> > >   genpd_acquire_lock(genpd);
> > >
> > > - if (genpd->status == GPD_STATE_POWER_OFF) {
> > > -         ret = -EINVAL;
> > > -         goto out;
> > > - }
> > > -
> > >   if (genpd->prepared_count > 0) {
> > >           ret = -EAGAIN;
> > >           goto out;
> > > @@ -1239,7 +1234,7 @@ int __pm_genpd_add_device(struct generic_pm_domain 
> > > *genpd, struct
> > device *dev,
> > >   dev_pm_get_subsys_data(dev);
> > >   dev->power.subsys_data->domain_data = &gpd_data->base;
> > >   gpd_data->base.dev = dev;
> > > - gpd_data->need_restore = false;
> > > + gpd_data->need_restore = true;
> > 
> > I think that should be:
> > 
> > +   gpd_data->need_restore = genpd->status == GPD_STATE_POWER_OFF;
> > 
> > Otherwise, on the next domain power off the device's state won't be saved.
> > 
> > >   list_add_tail(&gpd_data->base.list_node, &genpd->dev_list);
> > >   if (td)
> > >           gpd_data->td = *td;
> 
> I've tested the above change and there is problem. Let me explain in detail 
> the 
> sw/hw configuration I have.
> 
> There is a power domain and the device driver. The device itself also has 
> it's own 
> power management code (which enables and disables clocks).  Some power 
> domains are 
> disabled by bootloader and some devices in the active power domains have 
> their 
> clocks disabled too. In the current runtime pm code the devices were probed in
> 'disabled' state and had to enable itself by calling get_runtime_sync(). My 
> initial
> patch restored runtime pm handling to the old state (the same which was with 
> non 
> gen_pd based driver or no power domain driver at all, where runtime pm was 
> handled
> by platform bus). If I apply your patch the runtime_restore

I guess you mean .runtime_resume().

> callback is not called on first driver probe for devices inside the domain 
> which
> has been left enabled by the bootloader.

I don't see why .probe() should depend on the runtime PM framework to call
.runtime_resume() for it.  It looks like .probe() could just call
.runtime_resume() directly if needed.

Besides, your change breaks existing code as I said.

Thanks,
Rafael
--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to