diff options
author | Rafael J. Wysocki <rjw@sisk.pl> | 2008-03-11 19:59:38 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2008-04-19 22:10:24 -0400 |
commit | 57eee3d23e8833ca18708b374c648235691942ba (patch) | |
tree | 59dc775f05ba7896663e0ab2262f4739f95d22f5 /drivers/base | |
parent | 58aca23226a19983571bd3b65167521fc64f5869 (diff) |
Driver core: Call device_pm_add() after bus_add_device() in device_add()
Include dpm_sysfs_add() into device_pm_add(), in analogy with
device_pm_remove(), and modify device_add() to call the latter after
bus_add_device(), to avoid situations in which the PM core may
attempt to suspend a device the registration of which has not been
successful.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Acked-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/base')
-rw-r--r-- | drivers/base/core.c | 15 | ||||
-rw-r--r-- | drivers/base/power/main.c | 4 |
2 files changed, 8 insertions, 11 deletions
diff --git a/drivers/base/core.c b/drivers/base/core.c index 79848e6c5db5..adbc01788447 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
@@ -817,17 +817,12 @@ int device_add(struct device *dev) | |||
817 | error = device_add_attrs(dev); | 817 | error = device_add_attrs(dev); |
818 | if (error) | 818 | if (error) |
819 | goto AttrsError; | 819 | goto AttrsError; |
820 | error = dpm_sysfs_add(dev); | ||
821 | if (error) | ||
822 | goto PMError; | ||
823 | error = device_pm_add(dev); | ||
824 | if (error) { | ||
825 | dpm_sysfs_remove(dev); | ||
826 | goto PMError; | ||
827 | } | ||
828 | error = bus_add_device(dev); | 820 | error = bus_add_device(dev); |
829 | if (error) | 821 | if (error) |
830 | goto BusError; | 822 | goto BusError; |
823 | error = device_pm_add(dev); | ||
824 | if (error) | ||
825 | goto PMError; | ||
831 | kobject_uevent(&dev->kobj, KOBJ_ADD); | 826 | kobject_uevent(&dev->kobj, KOBJ_ADD); |
832 | bus_attach_device(dev); | 827 | bus_attach_device(dev); |
833 | if (parent) | 828 | if (parent) |
@@ -847,9 +842,9 @@ int device_add(struct device *dev) | |||
847 | Done: | 842 | Done: |
848 | put_device(dev); | 843 | put_device(dev); |
849 | return error; | 844 | return error; |
850 | BusError: | ||
851 | device_pm_remove(dev); | ||
852 | PMError: | 845 | PMError: |
846 | bus_remove_device(dev); | ||
847 | BusError: | ||
853 | if (dev->bus) | 848 | if (dev->bus) |
854 | blocking_notifier_call_chain(&dev->bus->p->bus_notifier, | 849 | blocking_notifier_call_chain(&dev->bus->p->bus_notifier, |
855 | BUS_NOTIFY_DEL_DEVICE, dev); | 850 | BUS_NOTIFY_DEL_DEVICE, dev); |
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index 0e3991a437c6..93a146940b91 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c | |||
@@ -81,7 +81,9 @@ int device_pm_add(struct device *dev) | |||
81 | WARN_ON(true); | 81 | WARN_ON(true); |
82 | error = -EBUSY; | 82 | error = -EBUSY; |
83 | } else { | 83 | } else { |
84 | list_add_tail(&dev->power.entry, &dpm_active); | 84 | error = dpm_sysfs_add(dev); |
85 | if (!error) | ||
86 | list_add_tail(&dev->power.entry, &dpm_active); | ||
85 | } | 87 | } |
86 | mutex_unlock(&dpm_list_mtx); | 88 | mutex_unlock(&dpm_list_mtx); |
87 | return error; | 89 | return error; |