diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-14 13:42:40 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-14 13:42:40 -0500 |
commit | 3e2b32b69308e974cd1167beaf266d3c716e4734 (patch) | |
tree | 0f1b24dcb7b066a6322d33235b95655d885695ac /drivers/base | |
parent | 3824ba7df91745da6ebac703c87c3b801c34fdd0 (diff) | |
parent | 9c08a938ce5a3e1c9d5f764dc6ae844cb1af76ff (diff) |
Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-2.6
Diffstat (limited to 'drivers/base')
-rw-r--r-- | drivers/base/dd.c | 12 | ||||
-rw-r--r-- | drivers/base/driver.c | 5 | ||||
-rw-r--r-- | drivers/base/platform.c | 2 | ||||
-rw-r--r-- | drivers/base/power/shutdown.c | 9 |
4 files changed, 22 insertions, 6 deletions
diff --git a/drivers/base/dd.c b/drivers/base/dd.c index 2b905016664d..730a9ce0a14a 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c | |||
@@ -78,7 +78,13 @@ int driver_probe_device(struct device_driver * drv, struct device * dev) | |||
78 | pr_debug("%s: Matched Device %s with Driver %s\n", | 78 | pr_debug("%s: Matched Device %s with Driver %s\n", |
79 | drv->bus->name, dev->bus_id, drv->name); | 79 | drv->bus->name, dev->bus_id, drv->name); |
80 | dev->driver = drv; | 80 | dev->driver = drv; |
81 | if (drv->probe) { | 81 | if (dev->bus->probe) { |
82 | ret = dev->bus->probe(dev); | ||
83 | if (ret) { | ||
84 | dev->driver = NULL; | ||
85 | goto ProbeFailed; | ||
86 | } | ||
87 | } else if (drv->probe) { | ||
82 | ret = drv->probe(dev); | 88 | ret = drv->probe(dev); |
83 | if (ret) { | 89 | if (ret) { |
84 | dev->driver = NULL; | 90 | dev->driver = NULL; |
@@ -203,7 +209,9 @@ static void __device_release_driver(struct device * dev) | |||
203 | sysfs_remove_link(&dev->kobj, "driver"); | 209 | sysfs_remove_link(&dev->kobj, "driver"); |
204 | klist_remove(&dev->knode_driver); | 210 | klist_remove(&dev->knode_driver); |
205 | 211 | ||
206 | if (drv->remove) | 212 | if (dev->bus->remove) |
213 | dev->bus->remove(dev); | ||
214 | else if (drv->remove) | ||
207 | drv->remove(dev); | 215 | drv->remove(dev); |
208 | dev->driver = NULL; | 216 | dev->driver = NULL; |
209 | put_driver(drv); | 217 | put_driver(drv); |
diff --git a/drivers/base/driver.c b/drivers/base/driver.c index 161f3a390d90..b400314e1c62 100644 --- a/drivers/base/driver.c +++ b/drivers/base/driver.c | |||
@@ -171,6 +171,11 @@ static void klist_devices_put(struct klist_node *n) | |||
171 | */ | 171 | */ |
172 | int driver_register(struct device_driver * drv) | 172 | int driver_register(struct device_driver * drv) |
173 | { | 173 | { |
174 | if ((drv->bus->probe && drv->probe) || | ||
175 | (drv->bus->remove && drv->remove) || | ||
176 | (drv->bus->shutdown && drv->shutdown)) { | ||
177 | printk(KERN_WARNING "Driver '%s' needs updating - please use bus_type methods\n", drv->name); | ||
178 | } | ||
174 | klist_init(&drv->klist_devices, klist_devices_get, klist_devices_put); | 179 | klist_init(&drv->klist_devices, klist_devices_get, klist_devices_put); |
175 | init_completion(&drv->unloaded); | 180 | init_completion(&drv->unloaded); |
176 | return bus_add_driver(drv); | 181 | return bus_add_driver(drv); |
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 0f81731bdfa8..461554a02517 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c | |||
@@ -327,7 +327,7 @@ EXPORT_SYMBOL_GPL(platform_device_register); | |||
327 | * @pdev: platform device we're unregistering | 327 | * @pdev: platform device we're unregistering |
328 | * | 328 | * |
329 | * Unregistration is done in 2 steps. Fisrt we release all resources | 329 | * Unregistration is done in 2 steps. Fisrt we release all resources |
330 | * and remove it from the sybsystem, then we drop reference count by | 330 | * and remove it from the subsystem, then we drop reference count by |
331 | * calling platform_device_put(). | 331 | * calling platform_device_put(). |
332 | */ | 332 | */ |
333 | void platform_device_unregister(struct platform_device * pdev) | 333 | void platform_device_unregister(struct platform_device * pdev) |
diff --git a/drivers/base/power/shutdown.c b/drivers/base/power/shutdown.c index f50a08be424b..c2475f3134ea 100644 --- a/drivers/base/power/shutdown.c +++ b/drivers/base/power/shutdown.c | |||
@@ -35,12 +35,15 @@ extern int sysdev_shutdown(void); | |||
35 | */ | 35 | */ |
36 | void device_shutdown(void) | 36 | void device_shutdown(void) |
37 | { | 37 | { |
38 | struct device * dev; | 38 | struct device * dev, *devn; |
39 | 39 | ||
40 | down_write(&devices_subsys.rwsem); | 40 | down_write(&devices_subsys.rwsem); |
41 | list_for_each_entry_reverse(dev, &devices_subsys.kset.list, | 41 | list_for_each_entry_safe_reverse(dev, devn, &devices_subsys.kset.list, |
42 | kobj.entry) { | 42 | kobj.entry) { |
43 | if (dev->driver && dev->driver->shutdown) { | 43 | if (dev->bus && dev->bus->shutdown) { |
44 | dev_dbg(dev, "shutdown\n"); | ||
45 | dev->bus->shutdown(dev); | ||
46 | } else if (dev->driver && dev->driver->shutdown) { | ||
44 | dev_dbg(dev, "shutdown\n"); | 47 | dev_dbg(dev, "shutdown\n"); |
45 | dev->driver->shutdown(dev); | 48 | dev->driver->shutdown(dev); |
46 | } | 49 | } |