On Tuesday, 5 of August 2008, Alan Stern wrote: > This patch (as1124) fixes a couple of bugs in the PM core. The new > dev->power.status field should be initialized regardless of whether > CONFIG_PM_SLEEP is enabled, and similarly dpm_sysfs_add() should be > called whenever CONFIG_PM is enabled. > > The patch separates out the call to dpm_sysfs_add() from the call to > device_pm_add(). As a result device_pm_add() can no longer return an > error, so its return type is changed to void. > > Signed-off-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> > Tested-by: Romit Dasgupta <romit@xxxxxx> Acked-by: Rafael J. Wysocki <rjw@xxxxxxx> > --- > > This should be queued for 2.6.27. > > > Index: usb-2.6/drivers/base/power/power.h > =================================================================== > --- usb-2.6.orig/drivers/base/power/power.h > +++ usb-2.6/drivers/base/power/power.h > @@ -1,3 +1,8 @@ > +static inline void device_pm_init(struct device *dev) > +{ > + dev->power.status = DPM_ON; > +} > + > #ifdef CONFIG_PM_SLEEP > > /* > @@ -11,12 +16,12 @@ static inline struct device *to_device(s > return container_of(entry, struct device, power.entry); > } > > -extern int device_pm_add(struct device *); > +extern void device_pm_add(struct device *); > extern void device_pm_remove(struct device *); > > #else /* CONFIG_PM_SLEEP */ > > -static inline int device_pm_add(struct device *dev) { return 0; } > +static inline void device_pm_add(struct device *dev) {} > static inline void device_pm_remove(struct device *dev) {} > > #endif > Index: usb-2.6/drivers/base/core.c > =================================================================== > --- usb-2.6.orig/drivers/base/core.c > +++ usb-2.6/drivers/base/core.c > @@ -542,6 +542,7 @@ void device_initialize(struct device *de > spin_lock_init(&dev->devres_lock); > INIT_LIST_HEAD(&dev->devres_head); > device_init_wakeup(dev, 0); > + device_pm_init(dev); > set_dev_node(dev, -1); > } > > @@ -898,9 +899,10 @@ int device_add(struct device *dev) > error = bus_add_device(dev); > if (error) > goto BusError; > - error = device_pm_add(dev); > + error = dpm_sysfs_add(dev); > if (error) > - goto PMError; > + goto DPMError; > + device_pm_add(dev); > kobject_uevent(&dev->kobj, KOBJ_ADD); > bus_attach_device(dev); > if (parent) > @@ -921,7 +923,7 @@ int device_add(struct device *dev) > Done: > put_device(dev); > return error; > - PMError: > + DPMError: > bus_remove_device(dev); > BusError: > if (dev->bus) > @@ -1008,6 +1010,7 @@ void device_del(struct device *dev) > struct class_interface *class_intf; > > device_pm_remove(dev); > + dpm_sysfs_remove(dev); > if (parent) > klist_del(&dev->knode_parent); > if (MAJOR(dev->devt)) { > Index: usb-2.6/drivers/base/power/main.c > =================================================================== > --- usb-2.6.orig/drivers/base/power/main.c > +++ usb-2.6/drivers/base/power/main.c > @@ -67,10 +67,8 @@ void device_pm_unlock(void) > * device_pm_add - add a device to the list of active devices > * @dev: Device to be added to the list > */ > -int device_pm_add(struct device *dev) > +void device_pm_add(struct device *dev) > { > - int error; > - > pr_debug("PM: Adding info for %s:%s\n", > dev->bus ? dev->bus->name : "No Bus", > kobject_name(&dev->kobj)); > @@ -89,13 +87,9 @@ int device_pm_add(struct device *dev) > */ > WARN_ON(true); > } > - error = dpm_sysfs_add(dev); > - if (!error) { > - dev->power.status = DPM_ON; > - list_add_tail(&dev->power.entry, &dpm_list); > - } > + > + list_add_tail(&dev->power.entry, &dpm_list); > mutex_unlock(&dpm_list_mtx); > - return error; > } > > /** > @@ -110,7 +104,6 @@ void device_pm_remove(struct device *dev > dev->bus ? dev->bus->name : "No Bus", > kobject_name(&dev->kobj)); > mutex_lock(&dpm_list_mtx); > - dpm_sysfs_remove(dev); > list_del_init(&dev->power.entry); > mutex_unlock(&dpm_list_mtx); > } > _______________________________________________ linux-pm mailing list linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/linux-pm