diff options
-rw-r--r-- | drivers/base/base.h | 6 | ||||
-rw-r--r-- | drivers/base/core.c | 37 | ||||
-rw-r--r-- | include/linux/device.h | 2 |
3 files changed, 30 insertions, 15 deletions
diff --git a/drivers/base/base.h b/drivers/base/base.h index 6b20809b5fd4..f5cf31c664d7 100644 --- a/drivers/base/base.h +++ b/drivers/base/base.h | |||
@@ -66,14 +66,20 @@ 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 | ||
69 | * @device - pointer back to the struct class that this structure is | 71 | * @device - pointer back to the struct class that this structure is |
70 | * associated with. | 72 | * associated with. |
71 | * | 73 | * |
72 | * Nothing outside of the driver core should ever touch these fields. | 74 | * Nothing outside of the driver core should ever touch these fields. |
73 | */ | 75 | */ |
74 | struct device_private { | 76 | struct device_private { |
77 | struct klist klist_children; | ||
78 | struct klist_node knode_parent; | ||
75 | struct device *device; | 79 | struct device *device; |
76 | }; | 80 | }; |
81 | #define to_device_private_parent(obj) \ | ||
82 | container_of(obj, struct device_private, knode_parent) | ||
77 | 83 | ||
78 | /* initialisation functions */ | 84 | /* initialisation functions */ |
79 | extern int devices_init(void); | 85 | extern int devices_init(void); |
diff --git a/drivers/base/core.c b/drivers/base/core.c index 6657787e64f8..180ff84ea26c 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
@@ -509,14 +509,16 @@ EXPORT_SYMBOL_GPL(device_schedule_callback_owner); | |||
509 | 509 | ||
510 | static void klist_children_get(struct klist_node *n) | 510 | static void klist_children_get(struct klist_node *n) |
511 | { | 511 | { |
512 | struct device *dev = container_of(n, struct device, knode_parent); | 512 | struct device_private *p = to_device_private_parent(n); |
513 | struct device *dev = p->device; | ||
513 | 514 | ||
514 | get_device(dev); | 515 | get_device(dev); |
515 | } | 516 | } |
516 | 517 | ||
517 | static void klist_children_put(struct klist_node *n) | 518 | static void klist_children_put(struct klist_node *n) |
518 | { | 519 | { |
519 | struct device *dev = container_of(n, struct device, knode_parent); | 520 | struct device_private *p = to_device_private_parent(n); |
521 | struct device *dev = p->device; | ||
520 | 522 | ||
521 | put_device(dev); | 523 | put_device(dev); |
522 | } | 524 | } |
@@ -546,7 +548,7 @@ void device_initialize(struct device *dev) | |||
546 | dev->p->device = dev; | 548 | dev->p->device = dev; |
547 | dev->kobj.kset = devices_kset; | 549 | dev->kobj.kset = devices_kset; |
548 | kobject_init(&dev->kobj, &device_ktype); | 550 | kobject_init(&dev->kobj, &device_ktype); |
549 | klist_init(&dev->klist_children, klist_children_get, | 551 | klist_init(&dev->p->klist_children, klist_children_get, |
550 | klist_children_put); | 552 | klist_children_put); |
551 | INIT_LIST_HEAD(&dev->dma_pools); | 553 | INIT_LIST_HEAD(&dev->dma_pools); |
552 | init_MUTEX(&dev->sem); | 554 | init_MUTEX(&dev->sem); |
@@ -927,7 +929,8 @@ int device_add(struct device *dev) | |||
927 | kobject_uevent(&dev->kobj, KOBJ_ADD); | 929 | kobject_uevent(&dev->kobj, KOBJ_ADD); |
928 | bus_attach_device(dev); | 930 | bus_attach_device(dev); |
929 | if (parent) | 931 | if (parent) |
930 | klist_add_tail(&dev->knode_parent, &parent->klist_children); | 932 | klist_add_tail(&dev->p->knode_parent, |
933 | &parent->p->klist_children); | ||
931 | 934 | ||
932 | if (dev->class) { | 935 | if (dev->class) { |
933 | mutex_lock(&dev->class->p->class_mutex); | 936 | mutex_lock(&dev->class->p->class_mutex); |
@@ -1038,7 +1041,7 @@ void device_del(struct device *dev) | |||
1038 | device_pm_remove(dev); | 1041 | device_pm_remove(dev); |
1039 | dpm_sysfs_remove(dev); | 1042 | dpm_sysfs_remove(dev); |
1040 | if (parent) | 1043 | if (parent) |
1041 | klist_del(&dev->knode_parent); | 1044 | klist_del(&dev->p->knode_parent); |
1042 | if (MAJOR(dev->devt)) { | 1045 | if (MAJOR(dev->devt)) { |
1043 | device_remove_sys_dev_entry(dev); | 1046 | device_remove_sys_dev_entry(dev); |
1044 | device_remove_file(dev, &devt_attr); | 1047 | device_remove_file(dev, &devt_attr); |
@@ -1102,7 +1105,14 @@ void device_unregister(struct device *dev) | |||
1102 | static struct device *next_device(struct klist_iter *i) | 1105 | static struct device *next_device(struct klist_iter *i) |
1103 | { | 1106 | { |
1104 | struct klist_node *n = klist_next(i); | 1107 | struct klist_node *n = klist_next(i); |
1105 | return n ? container_of(n, struct device, knode_parent) : NULL; | 1108 | struct device *dev = NULL; |
1109 | struct device_private *p; | ||
1110 | |||
1111 | if (n) { | ||
1112 | p = to_device_private_parent(n); | ||
1113 | dev = p->device; | ||
1114 | } | ||
1115 | return dev; | ||
1106 | } | 1116 | } |
1107 | 1117 | ||
1108 | /** | 1118 | /** |
@@ -1124,7 +1134,7 @@ int device_for_each_child(struct device *parent, void *data, | |||
1124 | struct device *child; | 1134 | struct device *child; |
1125 | int error = 0; | 1135 | int error = 0; |
1126 | 1136 | ||
1127 | klist_iter_init(&parent->klist_children, &i); | 1137 | klist_iter_init(&parent->p->klist_children, &i); |
1128 | while ((child = next_device(&i)) && !error) | 1138 | while ((child = next_device(&i)) && !error) |
1129 | error = fn(child, data); | 1139 | error = fn(child, data); |
1130 | klist_iter_exit(&i); | 1140 | klist_iter_exit(&i); |
@@ -1155,7 +1165,7 @@ struct device *device_find_child(struct device *parent, void *data, | |||
1155 | if (!parent) | 1165 | if (!parent) |
1156 | return NULL; | 1166 | return NULL; |
1157 | 1167 | ||
1158 | klist_iter_init(&parent->klist_children, &i); | 1168 | klist_iter_init(&parent->p->klist_children, &i); |
1159 | while ((child = next_device(&i))) | 1169 | while ((child = next_device(&i))) |
1160 | if (match(child, data) && get_device(child)) | 1170 | if (match(child, data) && get_device(child)) |
1161 | break; | 1171 | break; |
@@ -1478,9 +1488,10 @@ int device_move(struct device *dev, struct device *new_parent) | |||
1478 | old_parent = dev->parent; | 1488 | old_parent = dev->parent; |
1479 | dev->parent = new_parent; | 1489 | dev->parent = new_parent; |
1480 | if (old_parent) | 1490 | if (old_parent) |
1481 | klist_remove(&dev->knode_parent); | 1491 | klist_remove(&dev->p->knode_parent); |
1482 | if (new_parent) { | 1492 | if (new_parent) { |
1483 | klist_add_tail(&dev->knode_parent, &new_parent->klist_children); | 1493 | klist_add_tail(&dev->p->knode_parent, |
1494 | &new_parent->p->klist_children); | ||
1484 | set_dev_node(dev, dev_to_node(new_parent)); | 1495 | set_dev_node(dev, dev_to_node(new_parent)); |
1485 | } | 1496 | } |
1486 | 1497 | ||
@@ -1492,11 +1503,11 @@ int device_move(struct device *dev, struct device *new_parent) | |||
1492 | device_move_class_links(dev, new_parent, old_parent); | 1503 | device_move_class_links(dev, new_parent, old_parent); |
1493 | if (!kobject_move(&dev->kobj, &old_parent->kobj)) { | 1504 | if (!kobject_move(&dev->kobj, &old_parent->kobj)) { |
1494 | if (new_parent) | 1505 | if (new_parent) |
1495 | klist_remove(&dev->knode_parent); | 1506 | klist_remove(&dev->p->knode_parent); |
1496 | dev->parent = old_parent; | 1507 | dev->parent = old_parent; |
1497 | if (old_parent) { | 1508 | if (old_parent) { |
1498 | klist_add_tail(&dev->knode_parent, | 1509 | klist_add_tail(&dev->p->knode_parent, |
1499 | &old_parent->klist_children); | 1510 | &old_parent->p->klist_children); |
1500 | set_dev_node(dev, dev_to_node(old_parent)); | 1511 | set_dev_node(dev, dev_to_node(old_parent)); |
1501 | } | 1512 | } |
1502 | } | 1513 | } |
diff --git a/include/linux/device.h b/include/linux/device.h index d6d34084fd37..60423e687205 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
@@ -366,8 +366,6 @@ struct device_dma_parameters { | |||
366 | }; | 366 | }; |
367 | 367 | ||
368 | struct device { | 368 | struct device { |
369 | struct klist klist_children; | ||
370 | struct klist_node knode_parent; /* node in sibling list */ | ||
371 | struct klist_node knode_driver; | 369 | struct klist_node knode_driver; |
372 | struct klist_node knode_bus; | 370 | struct klist_node knode_bus; |
373 | struct device *parent; | 371 | struct device *parent; |