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",
                        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;
 }
 
                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),
 
        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 */