diff options
author | Russell King <rmk@arm.linux.org.uk> | 2006-01-05 09:29:51 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-01-13 14:26:04 -0500 |
commit | 594c8281f90560faf9632d91bb9d402cbe560e63 (patch) | |
tree | abeb32df086cfd204accad33b11040381c31689d | |
parent | bd37e5a951ad2123d3f51f59c407b5242946b6ba (diff) |
[PATCH] Add bus_type probe, remove, shutdown methods.
Add bus_type probe, remove and shutdown methods to replace the
corresponding methods in struct device_driver. This matches
the way we handle the suspend/resume methods.
Since the bus methods override the device_driver methods, warn
if a device driver is registered whose methods will not be
called.
The long-term idea is to remove the device_driver methods entirely.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/base/dd.c | 12 | ||||
-rw-r--r-- | drivers/base/driver.c | 5 | ||||
-rw-r--r-- | drivers/base/power/shutdown.c | 5 | ||||
-rw-r--r-- | include/linux/device.h | 3 |
4 files changed, 22 insertions, 3 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/power/shutdown.c b/drivers/base/power/shutdown.c index f50a08be424b..a47bb74da72b 100644 --- a/drivers/base/power/shutdown.c +++ b/drivers/base/power/shutdown.c | |||
@@ -40,7 +40,10 @@ void device_shutdown(void) | |||
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_reverse(dev, &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 | } |
diff --git a/include/linux/device.h b/include/linux/device.h index 0cdee78e5ce1..58df18d9cd3e 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
@@ -49,6 +49,9 @@ struct bus_type { | |||
49 | int (*match)(struct device * dev, struct device_driver * drv); | 49 | int (*match)(struct device * dev, struct device_driver * drv); |
50 | int (*uevent)(struct device *dev, char **envp, | 50 | int (*uevent)(struct device *dev, char **envp, |
51 | int num_envp, char *buffer, int buffer_size); | 51 | int num_envp, char *buffer, int buffer_size); |
52 | int (*probe)(struct device * dev); | ||
53 | int (*remove)(struct device * dev); | ||
54 | void (*shutdown)(struct device * dev); | ||
52 | int (*suspend)(struct device * dev, pm_message_t state); | 55 | int (*suspend)(struct device * dev, pm_message_t state); |
53 | int (*resume)(struct device * dev); | 56 | int (*resume)(struct device * dev); |
54 | }; | 57 | }; |