aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-01-09 18:30:54 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-01-09 18:31:07 -0500
commit0d34052dfeba307ebc18d2f672e80e3f419714d4 (patch)
tree8f7955328cd9700c443c33f88631449a0c1208fb
parentf0fb2eb7bd76b9927f1350cfb0a3653385b82c6c (diff)
parent926beadb3dfaddccb3348a5b9e6c2a1f8290a220 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6: Revert "driver core: create a private portion of struct device" Revert "driver core: move klist_children into private structure" Revert "driver core: move knode_driver into private structure" Revert "driver core: move knode_bus into private structure"
-rw-r--r--drivers/base/base.h26
-rw-r--r--drivers/base/bus.c40
-rw-r--r--drivers/base/core.c45
-rw-r--r--drivers/base/dd.c13
-rw-r--r--drivers/base/driver.c13
-rw-r--r--include/linux/device.h7
6 files changed, 38 insertions, 106 deletions
diff --git a/drivers/base/base.h b/drivers/base/base.h
index b676f8f801f8..0a5f055dffba 100644
--- a/drivers/base/base.h
+++ b/drivers/base/base.h
@@ -63,32 +63,6 @@ struct class_private {
63#define to_class(obj) \ 63#define to_class(obj) \
64 container_of(obj, struct class_private, class_subsys.kobj) 64 container_of(obj, struct class_private, class_subsys.kobj)
65 65
66/**
67 * struct device_private - structure to hold the private to the driver core portions of the device structure.
68 *
69 * @klist_children - klist containing all children of this device
70 * @knode_parent - node in sibling list
71 * @knode_driver - node in driver list
72 * @knode_bus - node in bus list
73 * @device - pointer back to the struct class that this structure is
74 * associated with.
75 *
76 * Nothing outside of the driver core should ever touch these fields.
77 */
78struct device_private {
79 struct klist klist_children;
80 struct klist_node knode_parent;
81 struct klist_node knode_driver;
82 struct klist_node knode_bus;
83 struct device *device;
84};
85#define to_device_private_parent(obj) \
86 container_of(obj, struct device_private, knode_parent)
87#define to_device_private_driver(obj) \
88 container_of(obj, struct device_private, knode_driver)
89#define to_device_private_bus(obj) \
90 container_of(obj, struct device_private, knode_bus)
91
92/* initialisation functions */ 66/* initialisation functions */
93extern int devices_init(void); 67extern int devices_init(void);
94extern int buses_init(void); 68extern int buses_init(void);
diff --git a/drivers/base/bus.c b/drivers/base/bus.c
index 0f0a50444672..83f32b891fa9 100644
--- a/drivers/base/bus.c
+++ b/drivers/base/bus.c
@@ -253,14 +253,7 @@ static ssize_t store_drivers_probe(struct bus_type *bus,
253static struct device *next_device(struct klist_iter *i) 253static struct device *next_device(struct klist_iter *i)
254{ 254{
255 struct klist_node *n = klist_next(i); 255 struct klist_node *n = klist_next(i);
256 struct device *dev = NULL; 256 return n ? container_of(n, struct device, knode_bus) : NULL;
257 struct device_private *dev_prv;
258
259 if (n) {
260 dev_prv = to_device_private_bus(n);
261 dev = dev_prv->device;
262 }
263 return dev;
264} 257}
265 258
266/** 259/**
@@ -293,7 +286,7 @@ int bus_for_each_dev(struct bus_type *bus, struct device *start,
293 return -EINVAL; 286 return -EINVAL;
294 287
295 klist_iter_init_node(&bus->p->klist_devices, &i, 288 klist_iter_init_node(&bus->p->klist_devices, &i,
296 (start ? &start->p->knode_bus : NULL)); 289 (start ? &start->knode_bus : NULL));
297 while ((dev = next_device(&i)) && !error) 290 while ((dev = next_device(&i)) && !error)
298 error = fn(dev, data); 291 error = fn(dev, data);
299 klist_iter_exit(&i); 292 klist_iter_exit(&i);
@@ -327,7 +320,7 @@ struct device *bus_find_device(struct bus_type *bus,
327 return NULL; 320 return NULL;
328 321
329 klist_iter_init_node(&bus->p->klist_devices, &i, 322 klist_iter_init_node(&bus->p->klist_devices, &i,
330 (start ? &start->p->knode_bus : NULL)); 323 (start ? &start->knode_bus : NULL));
331 while ((dev = next_device(&i))) 324 while ((dev = next_device(&i)))
332 if (match(dev, data) && get_device(dev)) 325 if (match(dev, data) && get_device(dev))
333 break; 326 break;
@@ -514,8 +507,7 @@ void bus_attach_device(struct device *dev)
514 ret = device_attach(dev); 507 ret = device_attach(dev);
515 WARN_ON(ret < 0); 508 WARN_ON(ret < 0);
516 if (ret >= 0) 509 if (ret >= 0)
517 klist_add_tail(&dev->p->knode_bus, 510 klist_add_tail(&dev->knode_bus, &bus->p->klist_devices);
518 &bus->p->klist_devices);
519 } 511 }
520} 512}
521 513
@@ -536,8 +528,8 @@ void bus_remove_device(struct device *dev)
536 sysfs_remove_link(&dev->bus->p->devices_kset->kobj, 528 sysfs_remove_link(&dev->bus->p->devices_kset->kobj,
537 dev_name(dev)); 529 dev_name(dev));
538 device_remove_attrs(dev->bus, dev); 530 device_remove_attrs(dev->bus, dev);
539 if (klist_node_attached(&dev->p->knode_bus)) 531 if (klist_node_attached(&dev->knode_bus))
540 klist_del(&dev->p->knode_bus); 532 klist_del(&dev->knode_bus);
541 533
542 pr_debug("bus: '%s': remove device %s\n", 534 pr_debug("bus: '%s': remove device %s\n",
543 dev->bus->name, dev_name(dev)); 535 dev->bus->name, dev_name(dev));
@@ -839,16 +831,14 @@ static void bus_remove_attrs(struct bus_type *bus)
839 831
840static void klist_devices_get(struct klist_node *n) 832static void klist_devices_get(struct klist_node *n)
841{ 833{
842 struct device_private *dev_prv = to_device_private_bus(n); 834 struct device *dev = container_of(n, struct device, knode_bus);
843 struct device *dev = dev_prv->device;
844 835
845 get_device(dev); 836 get_device(dev);
846} 837}
847 838
848static void klist_devices_put(struct klist_node *n) 839static void klist_devices_put(struct klist_node *n)
849{ 840{
850 struct device_private *dev_prv = to_device_private_bus(n); 841 struct device *dev = container_of(n, struct device, knode_bus);
851 struct device *dev = dev_prv->device;
852 842
853 put_device(dev); 843 put_device(dev);
854} 844}
@@ -1003,20 +993,18 @@ static void device_insertion_sort_klist(struct device *a, struct list_head *list
1003{ 993{
1004 struct list_head *pos; 994 struct list_head *pos;
1005 struct klist_node *n; 995 struct klist_node *n;
1006 struct device_private *dev_prv;
1007 struct device *b; 996 struct device *b;
1008 997
1009 list_for_each(pos, list) { 998 list_for_each(pos, list) {
1010 n = container_of(pos, struct klist_node, n_node); 999 n = container_of(pos, struct klist_node, n_node);
1011 dev_prv = to_device_private_bus(n); 1000 b = container_of(n, struct device, knode_bus);
1012 b = dev_prv->device;
1013 if (compare(a, b) <= 0) { 1001 if (compare(a, b) <= 0) {
1014 list_move_tail(&a->p->knode_bus.n_node, 1002 list_move_tail(&a->knode_bus.n_node,
1015 &b->p->knode_bus.n_node); 1003 &b->knode_bus.n_node);
1016 return; 1004 return;
1017 } 1005 }
1018 } 1006 }
1019 list_move_tail(&a->p->knode_bus.n_node, list); 1007 list_move_tail(&a->knode_bus.n_node, list);
1020} 1008}
1021 1009
1022void bus_sort_breadthfirst(struct bus_type *bus, 1010void bus_sort_breadthfirst(struct bus_type *bus,
@@ -1026,7 +1014,6 @@ void bus_sort_breadthfirst(struct bus_type *bus,
1026 LIST_HEAD(sorted_devices); 1014 LIST_HEAD(sorted_devices);
1027 struct list_head *pos, *tmp; 1015 struct list_head *pos, *tmp;
1028 struct klist_node *n; 1016 struct klist_node *n;
1029 struct device_private *dev_prv;
1030 struct device *dev; 1017 struct device *dev;
1031 struct klist *device_klist; 1018 struct klist *device_klist;
1032 1019
@@ -1035,8 +1022,7 @@ void bus_sort_breadthfirst(struct bus_type *bus,
1035 spin_lock(&device_klist->k_lock); 1022 spin_lock(&device_klist->k_lock);
1036 list_for_each_safe(pos, tmp, &device_klist->k_list) { 1023 list_for_each_safe(pos, tmp, &device_klist->k_list) {
1037 n = container_of(pos, struct klist_node, n_node); 1024 n = container_of(pos, struct klist_node, n_node);
1038 dev_prv = to_device_private_bus(n); 1025 dev = container_of(n, struct device, knode_bus);
1039 dev = dev_prv->device;
1040 device_insertion_sort_klist(dev, &sorted_devices, compare); 1026 device_insertion_sort_klist(dev, &sorted_devices, compare);
1041 } 1027 }
1042 list_splice(&sorted_devices, &device_klist->k_list); 1028 list_splice(&sorted_devices, &device_klist->k_list);
diff --git a/drivers/base/core.c b/drivers/base/core.c
index 61df508fa62b..8079afca4972 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -109,7 +109,6 @@ static struct sysfs_ops dev_sysfs_ops = {
109static void device_release(struct kobject *kobj) 109static void device_release(struct kobject *kobj)
110{ 110{
111 struct device *dev = to_dev(kobj); 111 struct device *dev = to_dev(kobj);
112 struct device_private *p = dev->p;
113 112
114 if (dev->release) 113 if (dev->release)
115 dev->release(dev); 114 dev->release(dev);
@@ -121,7 +120,6 @@ static void device_release(struct kobject *kobj)
121 WARN(1, KERN_ERR "Device '%s' does not have a release() " 120 WARN(1, KERN_ERR "Device '%s' does not have a release() "
122 "function, it is broken and must be fixed.\n", 121 "function, it is broken and must be fixed.\n",
123 dev_name(dev)); 122 dev_name(dev));
124 kfree(p);
125} 123}
126 124
127static struct kobj_type device_ktype = { 125static struct kobj_type device_ktype = {
@@ -509,16 +507,14 @@ EXPORT_SYMBOL_GPL(device_schedule_callback_owner);
509 507
510static void klist_children_get(struct klist_node *n) 508static void klist_children_get(struct klist_node *n)
511{ 509{
512 struct device_private *p = to_device_private_parent(n); 510 struct device *dev = container_of(n, struct device, knode_parent);
513 struct device *dev = p->device;
514 511
515 get_device(dev); 512 get_device(dev);
516} 513}
517 514
518static void klist_children_put(struct klist_node *n) 515static void klist_children_put(struct klist_node *n)
519{ 516{
520 struct device_private *p = to_device_private_parent(n); 517 struct device *dev = container_of(n, struct device, knode_parent);
521 struct device *dev = p->device;
522 518
523 put_device(dev); 519 put_device(dev);
524} 520}
@@ -540,15 +536,9 @@ static void klist_children_put(struct klist_node *n)
540 */ 536 */
541void device_initialize(struct device *dev) 537void device_initialize(struct device *dev)
542{ 538{
543 dev->p = kzalloc(sizeof(*dev->p), GFP_KERNEL);
544 if (!dev->p) {
545 WARN_ON(1);
546 return;
547 }
548 dev->p->device = dev;
549 dev->kobj.kset = devices_kset; 539 dev->kobj.kset = devices_kset;
550 kobject_init(&dev->kobj, &device_ktype); 540 kobject_init(&dev->kobj, &device_ktype);
551 klist_init(&dev->p->klist_children, klist_children_get, 541 klist_init(&dev->klist_children, klist_children_get,
552 klist_children_put); 542 klist_children_put);
553 INIT_LIST_HEAD(&dev->dma_pools); 543 INIT_LIST_HEAD(&dev->dma_pools);
554 init_MUTEX(&dev->sem); 544 init_MUTEX(&dev->sem);
@@ -932,8 +922,7 @@ int device_add(struct device *dev)
932 kobject_uevent(&dev->kobj, KOBJ_ADD); 922 kobject_uevent(&dev->kobj, KOBJ_ADD);
933 bus_attach_device(dev); 923 bus_attach_device(dev);
934 if (parent) 924 if (parent)
935 klist_add_tail(&dev->p->knode_parent, 925 klist_add_tail(&dev->knode_parent, &parent->klist_children);
936 &parent->p->klist_children);
937 926
938 if (dev->class) { 927 if (dev->class) {
939 mutex_lock(&dev->class->p->class_mutex); 928 mutex_lock(&dev->class->p->class_mutex);
@@ -1047,7 +1036,7 @@ void device_del(struct device *dev)
1047 device_pm_remove(dev); 1036 device_pm_remove(dev);
1048 dpm_sysfs_remove(dev); 1037 dpm_sysfs_remove(dev);
1049 if (parent) 1038 if (parent)
1050 klist_del(&dev->p->knode_parent); 1039 klist_del(&dev->knode_parent);
1051 if (MAJOR(dev->devt)) { 1040 if (MAJOR(dev->devt)) {
1052 device_remove_sys_dev_entry(dev); 1041 device_remove_sys_dev_entry(dev);
1053 device_remove_file(dev, &devt_attr); 1042 device_remove_file(dev, &devt_attr);
@@ -1108,14 +1097,7 @@ void device_unregister(struct device *dev)
1108static struct device *next_device(struct klist_iter *i) 1097static struct device *next_device(struct klist_iter *i)
1109{ 1098{
1110 struct klist_node *n = klist_next(i); 1099 struct klist_node *n = klist_next(i);
1111 struct device *dev = NULL; 1100 return n ? container_of(n, struct device, knode_parent) : NULL;
1112 struct device_private *p;
1113
1114 if (n) {
1115 p = to_device_private_parent(n);
1116 dev = p->device;
1117 }
1118 return dev;
1119} 1101}
1120 1102
1121/** 1103/**
@@ -1137,7 +1119,7 @@ int device_for_each_child(struct device *parent, void *data,
1137 struct device *child; 1119 struct device *child;
1138 int error = 0; 1120 int error = 0;
1139 1121
1140 klist_iter_init(&parent->p->klist_children, &i); 1122 klist_iter_init(&parent->klist_children, &i);
1141 while ((child = next_device(&i)) && !error) 1123 while ((child = next_device(&i)) && !error)
1142 error = fn(child, data); 1124 error = fn(child, data);
1143 klist_iter_exit(&i); 1125 klist_iter_exit(&i);
@@ -1168,7 +1150,7 @@ struct device *device_find_child(struct device *parent, void *data,
1168 if (!parent) 1150 if (!parent)
1169 return NULL; 1151 return NULL;
1170 1152
1171 klist_iter_init(&parent->p->klist_children, &i); 1153 klist_iter_init(&parent->klist_children, &i);
1172 while ((child = next_device(&i))) 1154 while ((child = next_device(&i)))
1173 if (match(child, data) && get_device(child)) 1155 if (match(child, data) && get_device(child))
1174 break; 1156 break;
@@ -1582,10 +1564,9 @@ int device_move(struct device *dev, struct device *new_parent)
1582 old_parent = dev->parent; 1564 old_parent = dev->parent;
1583 dev->parent = new_parent; 1565 dev->parent = new_parent;
1584 if (old_parent) 1566 if (old_parent)
1585 klist_remove(&dev->p->knode_parent); 1567 klist_remove(&dev->knode_parent);
1586 if (new_parent) { 1568 if (new_parent) {
1587 klist_add_tail(&dev->p->knode_parent, 1569 klist_add_tail(&dev->knode_parent, &new_parent->klist_children);
1588 &new_parent->p->klist_children);
1589 set_dev_node(dev, dev_to_node(new_parent)); 1570 set_dev_node(dev, dev_to_node(new_parent));
1590 } 1571 }
1591 1572
@@ -1597,11 +1578,11 @@ int device_move(struct device *dev, struct device *new_parent)
1597 device_move_class_links(dev, new_parent, old_parent); 1578 device_move_class_links(dev, new_parent, old_parent);
1598 if (!kobject_move(&dev->kobj, &old_parent->kobj)) { 1579 if (!kobject_move(&dev->kobj, &old_parent->kobj)) {
1599 if (new_parent) 1580 if (new_parent)
1600 klist_remove(&dev->p->knode_parent); 1581 klist_remove(&dev->knode_parent);
1601 dev->parent = old_parent; 1582 dev->parent = old_parent;
1602 if (old_parent) { 1583 if (old_parent) {
1603 klist_add_tail(&dev->p->knode_parent, 1584 klist_add_tail(&dev->knode_parent,
1604 &old_parent->p->klist_children); 1585 &old_parent->klist_children);
1605 set_dev_node(dev, dev_to_node(old_parent)); 1586 set_dev_node(dev, dev_to_node(old_parent));
1606 } 1587 }
1607 } 1588 }
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index 6fdaf76f033f..315bed8d5e7f 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -28,7 +28,7 @@
28 28
29static void driver_bound(struct device *dev) 29static void driver_bound(struct device *dev)
30{ 30{
31 if (klist_node_attached(&dev->p->knode_driver)) { 31 if (klist_node_attached(&dev->knode_driver)) {
32 printk(KERN_WARNING "%s: device %s already bound\n", 32 printk(KERN_WARNING "%s: device %s already bound\n",
33 __func__, kobject_name(&dev->kobj)); 33 __func__, kobject_name(&dev->kobj));
34 return; 34 return;
@@ -41,7 +41,7 @@ static void driver_bound(struct device *dev)
41 blocking_notifier_call_chain(&dev->bus->p->bus_notifier, 41 blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
42 BUS_NOTIFY_BOUND_DRIVER, dev); 42 BUS_NOTIFY_BOUND_DRIVER, dev);
43 43
44 klist_add_tail(&dev->p->knode_driver, &dev->driver->p->klist_devices); 44 klist_add_tail(&dev->knode_driver, &dev->driver->p->klist_devices);
45} 45}
46 46
47static int driver_sysfs_add(struct device *dev) 47static int driver_sysfs_add(struct device *dev)
@@ -310,7 +310,7 @@ static void __device_release_driver(struct device *dev)
310 drv->remove(dev); 310 drv->remove(dev);
311 devres_release_all(dev); 311 devres_release_all(dev);
312 dev->driver = NULL; 312 dev->driver = NULL;
313 klist_remove(&dev->p->knode_driver); 313 klist_remove(&dev->knode_driver);
314 } 314 }
315} 315}
316 316
@@ -340,7 +340,6 @@ EXPORT_SYMBOL_GPL(device_release_driver);
340 */ 340 */
341void driver_detach(struct device_driver *drv) 341void driver_detach(struct device_driver *drv)
342{ 342{
343 struct device_private *dev_prv;
344 struct device *dev; 343 struct device *dev;
345 344
346 for (;;) { 345 for (;;) {
@@ -349,10 +348,8 @@ void driver_detach(struct device_driver *drv)
349 spin_unlock(&drv->p->klist_devices.k_lock); 348 spin_unlock(&drv->p->klist_devices.k_lock);
350 break; 349 break;
351 } 350 }
352 dev_prv = list_entry(drv->p->klist_devices.k_list.prev, 351 dev = list_entry(drv->p->klist_devices.k_list.prev,
353 struct device_private, 352 struct device, knode_driver.n_node);
354 knode_driver.n_node);
355 dev = dev_prv->device;
356 get_device(dev); 353 get_device(dev);
357 spin_unlock(&drv->p->klist_devices.k_lock); 354 spin_unlock(&drv->p->klist_devices.k_lock);
358 355
diff --git a/drivers/base/driver.c b/drivers/base/driver.c
index b76cc69f1106..1e2bda780e48 100644
--- a/drivers/base/driver.c
+++ b/drivers/base/driver.c
@@ -19,14 +19,7 @@
19static struct device *next_device(struct klist_iter *i) 19static struct device *next_device(struct klist_iter *i)
20{ 20{
21 struct klist_node *n = klist_next(i); 21 struct klist_node *n = klist_next(i);
22 struct device *dev = NULL; 22 return n ? container_of(n, struct device, knode_driver) : NULL;
23 struct device_private *dev_prv;
24
25 if (n) {
26 dev_prv = to_device_private_driver(n);
27 dev = dev_prv->device;
28 }
29 return dev;
30} 23}
31 24
32/** 25/**
@@ -49,7 +42,7 @@ int driver_for_each_device(struct device_driver *drv, struct device *start,
49 return -EINVAL; 42 return -EINVAL;
50 43
51 klist_iter_init_node(&drv->p->klist_devices, &i, 44 klist_iter_init_node(&drv->p->klist_devices, &i,
52 start ? &start->p->knode_driver : NULL); 45 start ? &start->knode_driver : NULL);
53 while ((dev = next_device(&i)) && !error) 46 while ((dev = next_device(&i)) && !error)
54 error = fn(dev, data); 47 error = fn(dev, data);
55 klist_iter_exit(&i); 48 klist_iter_exit(&i);
@@ -83,7 +76,7 @@ struct device *driver_find_device(struct device_driver *drv,
83 return NULL; 76 return NULL;
84 77
85 klist_iter_init_node(&drv->p->klist_devices, &i, 78 klist_iter_init_node(&drv->p->klist_devices, &i,
86 (start ? &start->p->knode_driver : NULL)); 79 (start ? &start->knode_driver : NULL));
87 while ((dev = next_device(&i))) 80 while ((dev = next_device(&i)))
88 if (match(dev, data) && get_device(dev)) 81 if (match(dev, data) && get_device(dev))
89 break; 82 break;
diff --git a/include/linux/device.h b/include/linux/device.h
index 7d9da4b4993f..45e5b1921fbb 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -28,7 +28,6 @@
28#define BUS_ID_SIZE 20 28#define BUS_ID_SIZE 20
29 29
30struct device; 30struct device;
31struct device_private;
32struct device_driver; 31struct device_driver;
33struct driver_private; 32struct driver_private;
34struct class; 33struct class;
@@ -366,10 +365,12 @@ struct device_dma_parameters {
366}; 365};
367 366
368struct device { 367struct device {
368 struct klist klist_children;
369 struct klist_node knode_parent; /* node in sibling list */
370 struct klist_node knode_driver;
371 struct klist_node knode_bus;
369 struct device *parent; 372 struct device *parent;
370 373
371 struct device_private *p;
372
373 struct kobject kobj; 374 struct kobject kobj;
374 char bus_id[BUS_ID_SIZE]; /* position on parent bus */ 375 char bus_id[BUS_ID_SIZE]; /* position on parent bus */
375 unsigned uevent_suppress:1; 376 unsigned uevent_suppress:1;