aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/base.h4
-rw-r--r--drivers/base/bus.c40
2 files changed, 13 insertions, 31 deletions
diff --git a/drivers/base/base.h b/drivers/base/base.h
index b676f8f801f8..8af0bb2c0aa8 100644
--- a/drivers/base/base.h
+++ b/drivers/base/base.h
@@ -69,7 +69,6 @@ struct class_private {
69 * @klist_children - klist containing all children of this device 69 * @klist_children - klist containing all children of this device
70 * @knode_parent - node in sibling list 70 * @knode_parent - node in sibling list
71 * @knode_driver - node in driver 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 72 * @device - pointer back to the struct class that this structure is
74 * associated with. 73 * associated with.
75 * 74 *
@@ -79,15 +78,12 @@ struct device_private {
79 struct klist klist_children; 78 struct klist klist_children;
80 struct klist_node knode_parent; 79 struct klist_node knode_parent;
81 struct klist_node knode_driver; 80 struct klist_node knode_driver;
82 struct klist_node knode_bus;
83 struct device *device; 81 struct device *device;
84}; 82};
85#define to_device_private_parent(obj) \ 83#define to_device_private_parent(obj) \
86 container_of(obj, struct device_private, knode_parent) 84 container_of(obj, struct device_private, knode_parent)
87#define to_device_private_driver(obj) \ 85#define to_device_private_driver(obj) \
88 container_of(obj, struct device_private, knode_driver) 86 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 87
92/* initialisation functions */ 88/* initialisation functions */
93extern int devices_init(void); 89extern int devices_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);