Re: [RFC][PATCH 2/2] PM: Make system-wide PM and runtime PM handle subsystems consistently
From: Rafael J. Wysocki
Date: Wed Feb 16 2011 - 07:25:19 EST
On Monday, February 14, 2011, Alan Stern wrote:
> On Sat, 12 Feb 2011, Rafael J. Wysocki wrote:
>
> > From: Rafael J. Wysocki <rjw@xxxxxxx>
> >
> > The code handling system-wide power transitions (eg. suspend-to-RAM)
> > can in theory execute callbacks provided by the device's bus type,
> > device type and class in each phase of the power transition. In
> > turn, the runtime PM core code only calls one of those callbacks at
> > a time, preferring bus type callbacks to device type or class
> > callbacks and device type callbacks to class callbacks.
> >
> > It seems reasonable to make them both behave in the same way in that
> > respect. Moreover, even though a device may belong to two subsystems
> > (eg. bus type and device class) simultaneously, in practice power
> > management callbacks for system-wide power transitions are always
> > provided by only one of them (ie. if the bus type callbacks are
> > defined, the device class ones are not and vice versa). Thus it is
> > possible to modify the code handling system-wide power transitions
> > so that it follows the core runtime PM code (ie. treats the
> > subsystem callbacks as mutually exclusive).
> >
> > On the other hand, the core runtime PM code will choose to execute,
> > for example, a runtime suspend callback provided by the device type
> > even if the bus type's struct dev_pm_ops object exists, but the
> > runtime_suspend pointer in it happens to be NULL. This is confusing,
> > because it may lead to the execution of callbacks from different
> > subsystems during different operations (eg. the bus type suspend
> > callback may be executed during runtime suspend, while the device
> > type callback will be executed during runtime resume).
> >
> > Make all of the power management code treat subsystem callbacks in
> > a consistent way, such that:
> > (1) If the device's bus type is defined (eg. dev->bus is not NULL)
> > and its pm pointer is not NULL, the callbacks from dev->bus->pm
> > will be used.
> > (2) If dev->bus is NULL or dev->bus->pm is NULL, but the device's
> > device type is defined (eg. dev->type is not NULL) and its pm
> > pointer is not NULL, the callbacks from dev->type->pm will be
> > used.
> > (3) If dev->bus is NULL or dev->bus->pm is NULL and dev->type is
> > NULL or dev->type->pm is NULL, the callbacks from dev->class->pm
> > will be used provided that both dev->class and dev->class->pm
> > are not NULL.
>
> It looks okay, but I haven't tested it.
Unfortunately, it doesn't work on my Acer Ferrari One. The problem is that
hcd_pci_suspend() fails for the EHCI controller, apparently because the root
hub is not suspended. Do root hubs need both class suspend and bus type
suspend to work at the same time?
Rafael
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/