lkml.org 
[lkml]   [2011]   [Mar]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: [linux-pm] [RFC][PATCH 1/2] Introduce struct syscore_ops and related functionality
    Date
    On Thursday, March 10, 2011, Alan Stern wrote:
    > On Thu, 10 Mar 2011, Rafael J. Wysocki wrote:
    >
    > > Some subsystems need to carry out suspend/resume and shutdown
    > > operations with one CPU on-line and interrupts disabled. The only
    > > way to register such operations is to define a sysdev class and
    > > a sysdev specifically for this purpose which is cumbersome and
    > > inefficient. Moreover, the arguments taken by sysdev suspend,
    > > resume and shutdown callbacks are practically never necessary.
    > >
    > > For this reason, introduce a simpler interface allowing subsystems
    > > to register operations to be executed very late during system suspend
    > > and shutdown and very early during resume in the form of
    > > strcut syscore_ops objects.
    >
    > ...
    >
    > > Index: linux-2.6/drivers/base/syscore.c
    > > ===================================================================
    > > --- /dev/null
    > > +++ linux-2.6/drivers/base/syscore.c
    >
    > It's true that the existing sys.c file lies in drivers/base; this is
    > presumably because it handles a bunch of class-related registration
    > stuff. Now you're getting rid of all that, leaving just the
    > power-related operations, so doesn't it make more sense to put this
    > file in drivers/base/power?

    I didn't, because shutdown() doesn't really belong in there (well, depending).

    > > +/**
    > > + * syscore_suspend - Execute all the registered system core suspend callbacks.
    > > + *
    > > + * This function is executed with one CPU on-line and disabled interrupts.
    > > + */
    > > +int syscore_suspend(void)
    > > +{
    > > + struct syscore_ops *ops;
    > > +
    > > + list_for_each_entry_reverse(ops, &syscore_ops_list, node)
    > > + if (ops->suspend) {
    > > + int ret = ops->suspend();
    > > + if (ret) {
    > > + pr_err("PM: System core suspend callback "
    > > + "%pF failed.\n", ops->suspend);
    > > + return ret;
    >
    > If an error occurs, you need to go back and resume all the things that
    > were suspended. At least, that's what the code in sysdev_suspend does.

    Right, thanks a lot!

    > > + }
    > > + }
    > > +
    > > + return 0;
    > > +}

    Rafael


    \
     
     \ /
      Last update: 2011-03-10 11:45    [W:0.024 / U:153.924 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site