aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/base/base.h6
-rw-r--r--drivers/base/core.c37
-rw-r--r--include/linux/device.h2
3 files changed, 15 insertions, 30 deletions
diff --git a/drivers/base/base.h b/drivers/base/base.h
index f5cf31c664d7..6b20809b5fd4 100644
--- a/drivers/base/base.h
+++ b/drivers/base/base.h
@@ -66,20 +66,14 @@ struct class_private {
66/** 66/**
67 * struct device_private - structure to hold the private to the driver core portions of the device structure. 67 * struct device_private - structure to hold the private to the driver core portions of the device structure.
68 * 68 *
69 * @klist_children - klist containing all children of this device
70 * @knode_parent - node in sibling list
71 * @device - pointer back to the struct class that this structure is 69 * @device - pointer back to the struct class that this structure is
72 * associated with. 70 * associated with.
73 * 71 *
74 * Nothing outside of the driver core should ever touch these fields. 72 * Nothing outside of the driver core should ever touch these fields.
75 */ 73 */
76struct device_private { 74struct device_private {
77 struct klist klist_children;
78 struct klist_node knode_parent;
79 struct device *device; 75 struct device *device;
80}; 76};
81#define to_device_private_parent(obj) \
82 container_of(obj, struct device_private, knode_parent)
83 77
84/* initialisation functions */ 78/* initialisation functions */
85extern int devices_init(void); 79extern int devices_init(void);
diff --git a/drivers/base/core.c b/drivers/base/core.c
index 61df508fa62b..5c2acf7116d7 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -509,16 +509,14 @@ EXPORT_SYMBOL_GPL(device_schedule_callback_owner);
509 509
510static void klist_children_get(struct klist_node *n) 510static void klist_children_get(struct klist_node *n)
511{ 511{
512 struct device_private *p = to_device_private_parent(n); 512 struct device *dev = container_of(n, struct device, knode_parent);
513 struct device *dev = p->device;
514 513
515 get_device(dev); 514 get_device(dev);
516} 515}
517 516
518static void klist_children_put(struct klist_node *n) 517static void klist_children_put(struct klist_node *n)
519{ 518{
520 struct device_private *p = to_device_private_parent(n); 519 struct device *dev = container_of(n, struct device, knode_parent);
521 struct device *dev = p->device;
522 520
523 put_device(dev); 521 put_device(dev);
524} 522}
@@ -548,7 +546,7 @@ void device_initialize(struct device *dev)
548 dev->p->device = dev; 546 dev->p->device = dev;
549 dev->kobj.kset = devices_kset; 547 dev->kobj.kset = devices_kset;
550 kobject_init(&dev->kobj, &device_ktype); 548 kobject_init(&dev->kobj, &device_ktype);
551 klist_init(&dev->p->klist_children, klist_children_get, 549 klist_init(&dev->klist_children, klist_children_get,
552 klist_children_put); 550 klist_children_put);
553 INIT_LIST_HEAD(&dev->dma_pools); 551 INIT_LIST_HEAD(&dev->dma_pools);
554 init_MUTEX(&dev->sem); 552 init_MUTEX(&dev->sem);
@@ -932,8 +930,7 @@ int device_add(struct device *dev)
932 kobject_uevent(&dev->kobj, KOBJ_ADD); 930 kobject_uevent(&dev->kobj, KOBJ_ADD);
933 bus_attach_device(dev); 931 bus_attach_device(dev);
934 if (parent) 932 if (parent)
935 klist_add_tail(&dev->p->knode_parent, 933 klist_add_tail(&dev->knode_parent, &parent->klist_children);
936 &parent->p->klist_children);
937 934
938 if (dev->class) { 935 if (dev->class) {
939 mutex_lock(&dev->class->p->class_mutex); 936 mutex_lock(&dev->class->p->class_mutex);
@@ -1047,7 +1044,7 @@ void device_del(struct device *dev)
1047 device_pm_remove(dev); 1044 device_pm_remove(dev);
1048 dpm_sysfs_remove(dev); 1045 dpm_sysfs_remove(dev);
1049 if (parent) 1046 if (parent)
1050 klist_del(&dev->p->knode_parent); 1047 klist_del(&dev->knode_parent);
1051 if (MAJOR(dev->devt)) { 1048 if (MAJOR(dev->devt)) {
1052 device_remove_sys_dev_entry(dev); 1049 device_remove_sys_dev_entry(dev);
1053 device_remove_file(dev, &devt_attr); 1050 device_remove_file(dev, &devt_attr);
@@ -1108,14 +1105,7 @@ void device_unregister(struct device *dev)
1108static struct device *next_device(struct klist_iter *i) 1105static struct device *next_device(struct klist_iter *i)
1109{ 1106{
1110 struct klist_node *n = klist_next(i); 1107 struct klist_node *n = klist_next(i);
1111 struct device *dev = NULL; 1108 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} 1109}
1120 1110
1121/** 1111/**
@@ -1137,7 +1127,7 @@ int device_for_each_child(struct device *parent, void *data,
1137 struct device *child; 1127 struct device *child;
1138 int error = 0; 1128 int error = 0;
1139 1129
1140 klist_iter_init(&parent->p->klist_children, &i); 1130 klist_iter_init(&parent->klist_children, &i);
1141 while ((child = next_device(&i)) && !error) 1131 while ((child = next_device(&i)) && !error)
1142 error = fn(child, data); 1132 error = fn(child, data);
1143 klist_iter_exit(&i); 1133 klist_iter_exit(&i);
@@ -1168,7 +1158,7 @@ struct device *device_find_child(struct device *parent, void *data,
1168 if (!parent) 1158 if (!parent)
1169 return NULL; 1159 return NULL;
1170 1160
1171 klist_iter_init(&parent->p->klist_children, &i); 1161 klist_iter_init(&parent->klist_children, &i);
1172 while ((child = next_device(&i))) 1162 while ((child = next_device(&i)))
1173 if (match(child, data) && get_device(child)) 1163 if (match(child, data) && get_device(child))
1174 break; 1164 break;
@@ -1582,10 +1572,9 @@ int device_move(struct device *dev, struct device *new_parent)
1582 old_parent = dev->parent; 1572 old_parent = dev->parent;
1583 dev->parent = new_parent; 1573 dev->parent = new_parent;
1584 if (old_parent) 1574 if (old_parent)
1585 klist_remove(&dev->p->knode_parent); 1575 klist_remove(&dev->knode_parent);
1586 if (new_parent) { 1576 if (new_parent) {
1587 klist_add_tail(&dev->p->knode_parent, 1577 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)); 1578 set_dev_node(dev, dev_to_node(new_parent));
1590 } 1579 }
1591 1580
@@ -1597,11 +1586,11 @@ int device_move(struct device *dev, struct device *new_parent)
1597 device_move_class_links(dev, new_parent, old_parent); 1586 device_move_class_links(dev, new_parent, old_parent);
1598 if (!kobject_move(&dev->kobj, &old_parent->kobj)) { 1587 if (!kobject_move(&dev->kobj, &old_parent->kobj)) {
1599 if (new_parent) 1588 if (new_parent)
1600 klist_remove(&dev->p->knode_parent); 1589 klist_remove(&dev->knode_parent);
1601 dev->parent = old_parent; 1590 dev->parent = old_parent;
1602 if (old_parent) { 1591 if (old_parent) {
1603 klist_add_tail(&dev->p->knode_parent, 1592 klist_add_tail(&dev->knode_parent,
1604 &old_parent->p->klist_children); 1593 &old_parent->klist_children);
1605 set_dev_node(dev, dev_to_node(old_parent)); 1594 set_dev_node(dev, dev_to_node(old_parent));
1606 } 1595 }
1607 } 1596 }
diff --git a/include/linux/device.h b/include/linux/device.h
index c66ceb15acd8..2975351635d3 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -366,6 +366,8 @@ struct device_dma_parameters {
366}; 366};
367 367
368struct device { 368struct device {
369 struct klist klist_children;
370 struct klist_node knode_parent; /* node in sibling list */
369 struct klist_node knode_driver; 371 struct klist_node knode_driver;
370 struct klist_node knode_bus; 372 struct klist_node knode_bus;
371 struct device *parent; 373 struct device *parent;