On Sun, 3 Aug 2008, Dasgupta, Romit wrote: > Alan, > Here is a patch for you. Tested with > > 1) CONFIG_SUSPEND, CONFIG_HIBERNATION i.e. with CONFIG_PM_SLEEP > 2) without CONFIG_PM_SLEEP but with CONFIG_PM > 3) without CONFIG_PM I'd prefer to use the patch below. Although it's a little longer, the end result is slightly less complicated. Also, it fixes two problems: dpm_sysfs_add/remove should be called whenever CONFIG_PM is defined, regardless of CONFIG_PM_SLEEP. dev->power.status should be initialized to DPM_ON even if CONFIG_PM isn't defined. Can you make sure it compiles properly under all three configurations? Rafael, any objections? Alan Stern 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 /* 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,6 +899,9 @@ int device_add(struct device *dev) error = bus_add_device(dev); if (error) goto BusError; + error = dpm_sysfs_add(dev); + if (error) + goto DPMError; error = device_pm_add(dev); if (error) goto PMError; @@ -922,6 +926,8 @@ int device_add(struct device *dev) put_device(dev); return error; PMError: + dpm_sysfs_remove(dev); + DPMError: bus_remove_device(dev); BusError: if (dev->bus) @@ -1008,6 +1014,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 @@ -69,7 +69,7 @@ void device_pm_unlock(void) */ int device_pm_add(struct device *dev) { - int error; + int error = 0; pr_debug("PM: Adding info for %s:%s\n", dev->bus ? dev->bus->name : "No Bus", @@ -89,11 +89,8 @@ 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 +107,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