Commit 594c8281f90560faf9632d91bb9d402cbe560e63
Committed by
Greg Kroah-Hartman
1 parent
bd37e5a951
Exists in
master
and in
20 other branches
[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>
Showing 4 changed files with 22 additions and 3 deletions Side-by-side Diff
drivers/base/dd.c
... | ... | @@ -78,7 +78,13 @@ |
78 | 78 | pr_debug("%s: Matched Device %s with Driver %s\n", |
79 | 79 | drv->bus->name, dev->bus_id, drv->name); |
80 | 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 | 88 | ret = drv->probe(dev); |
83 | 89 | if (ret) { |
84 | 90 | dev->driver = NULL; |
... | ... | @@ -203,7 +209,9 @@ |
203 | 209 | sysfs_remove_link(&dev->kobj, "driver"); |
204 | 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 | 215 | drv->remove(dev); |
208 | 216 | dev->driver = NULL; |
209 | 217 | put_driver(drv); |
drivers/base/driver.c
... | ... | @@ -171,6 +171,11 @@ |
171 | 171 | */ |
172 | 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 | 179 | klist_init(&drv->klist_devices, klist_devices_get, klist_devices_put); |
175 | 180 | init_completion(&drv->unloaded); |
176 | 181 | return bus_add_driver(drv); |
drivers/base/power/shutdown.c
... | ... | @@ -40,7 +40,10 @@ |
40 | 40 | down_write(&devices_subsys.rwsem); |
41 | 41 | list_for_each_entry_reverse(dev, &devices_subsys.kset.list, |
42 | 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 | 47 | dev_dbg(dev, "shutdown\n"); |
45 | 48 | dev->driver->shutdown(dev); |
46 | 49 | } |
include/linux/device.h
... | ... | @@ -49,6 +49,9 @@ |
49 | 49 | int (*match)(struct device * dev, struct device_driver * drv); |
50 | 50 | int (*uevent)(struct device *dev, char **envp, |
51 | 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 | 55 | int (*suspend)(struct device * dev, pm_message_t state); |
53 | 56 | int (*resume)(struct device * dev); |
54 | 57 | }; |