Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=f89cbc399ecd924c4bd879344e662aace2274b4f
Commit:     f89cbc399ecd924c4bd879344e662aace2274b4f
Parent:     bf62456eb91f3d2ef0736081583d09b0b3c8b7ea
Author:     Dmitry Torokhov <[EMAIL PROTECTED]>
AuthorDate: Tue Apr 3 01:08:40 2007 -0400
Committer:  Greg Kroah-Hartman <[EMAIL PROTECTED]>
CommitDate: Fri Apr 27 10:57:29 2007 -0700

    Driver core: add suspend() and resume() to struct device_type
    
    Driver core: add suspend() and resume() to struct device_type
    
    In cases when there are devices of different types in the same class
    we can't use class's implementation of suspend and resume methods and
    we need to add them to struct device_type instead.
    
    Also fix error handling in resume code (we should not try to call
    class's resume method iof bus's resume method for the device failed.
    
    Signed-off-by: Dmitry Torokhov <[EMAIL PROTECTED]>
    Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
---
 drivers/base/power/resume.c  |   13 ++++++++++++-
 drivers/base/power/suspend.c |   12 ++++++++++++
 include/linux/device.h       |    2 ++
 3 files changed, 26 insertions(+), 1 deletions(-)

diff --git a/drivers/base/power/resume.c b/drivers/base/power/resume.c
index 020be36..a2c6418 100644
--- a/drivers/base/power/resume.c
+++ b/drivers/base/power/resume.c
@@ -26,7 +26,9 @@ int resume_device(struct device * dev)
 
        TRACE_DEVICE(dev);
        TRACE_RESUME(0);
+
        down(&dev->sem);
+
        if (dev->power.pm_parent
                        && dev->power.pm_parent->power.power_state.event) {
                dev_err(dev, "PM: resume from %d, parent %s still %d\n",
@@ -34,15 +36,24 @@ int resume_device(struct device * dev)
                        dev->power.pm_parent->bus_id,
                        dev->power.pm_parent->power.power_state.event);
        }
+
        if (dev->bus && dev->bus->resume) {
                dev_dbg(dev,"resuming\n");
                error = dev->bus->resume(dev);
        }
-       if (dev->class && dev->class->resume) {
+
+       if (!error && dev->type && dev->type->resume) {
+               dev_dbg(dev,"resuming\n");
+               error = dev->type->resume(dev);
+       }
+
+       if (!error && dev->class && dev->class->resume) {
                dev_dbg(dev,"class resume\n");
                error = dev->class->resume(dev);
        }
+
        up(&dev->sem);
+
        TRACE_RESUME(error);
        return error;
 }
diff --git a/drivers/base/power/suspend.c b/drivers/base/power/suspend.c
index ece136b..42d2b86 100644
--- a/drivers/base/power/suspend.c
+++ b/drivers/base/power/suspend.c
@@ -78,6 +78,18 @@ int suspend_device(struct device * dev, pm_message_t state)
                suspend_report_result(dev->class->suspend, error);
        }
 
+       if (!error && dev->type && dev->type->suspend && 
!dev->power.power_state.event) {
+               dev_dbg(dev, "%s%s\n",
+                       suspend_verb(state.event),
+                       ((state.event == PM_EVENT_SUSPEND)
+                                       && device_may_wakeup(dev))
+                               ? ", may wakeup"
+                               : ""
+                       );
+               error = dev->type->suspend(dev, state);
+               suspend_report_result(dev->type->suspend, error);
+       }
+
        if (!error && dev->bus && dev->bus->suspend && 
!dev->power.power_state.event) {
                dev_dbg(dev, "%s%s\n",
                        suspend_verb(state.event),
diff --git a/include/linux/device.h b/include/linux/device.h
index c9dc458..af603a1 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -344,6 +344,8 @@ struct device_type {
        int (*uevent)(struct device *dev, char **envp, int num_envp,
                      char *buffer, int buffer_size);
        void (*release)(struct device *dev);
+       int (*suspend)(struct device * dev, pm_message_t state);
+       int (*resume)(struct device * dev);
 };
 
 /* interface for exporting device attributes */
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to