Messages in this thread Patch in this message | | | Date | Mon, 4 Aug 2008 10:45:15 -0400 (EDT) | From | Alan Stern <> | Subject | Re: [PATCH] [PM] Fixes missing PM entries in sysfs without CONFIG_PM_SLEEP |
| |
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); }
| |