diff options
-rw-r--r-- | arch/powerpc/kernel/ibmebus.c | 11 | ||||
-rw-r--r-- | drivers/base/platform.c | 1 | ||||
-rw-r--r-- | drivers/of/device.c | 27 | ||||
-rw-r--r-- | drivers/of/platform.c | 24 | ||||
-rw-r--r-- | include/linux/of_device.h | 13 |
5 files changed, 32 insertions, 44 deletions
diff --git a/arch/powerpc/kernel/ibmebus.c b/arch/powerpc/kernel/ibmebus.c index 9b626cfffce1..f62efdfd1769 100644 --- a/arch/powerpc/kernel/ibmebus.c +++ b/arch/powerpc/kernel/ibmebus.c | |||
@@ -162,13 +162,10 @@ static int ibmebus_create_device(struct device_node *dn) | |||
162 | dev->dev.bus = &ibmebus_bus_type; | 162 | dev->dev.bus = &ibmebus_bus_type; |
163 | dev->dev.archdata.dma_ops = &ibmebus_dma_ops; | 163 | dev->dev.archdata.dma_ops = &ibmebus_dma_ops; |
164 | 164 | ||
165 | ret = of_device_register(dev); | 165 | ret = of_device_add(dev); |
166 | if (ret) { | 166 | if (ret) |
167 | of_device_free(dev); | 167 | platform_device_put(dev); |
168 | return ret; | 168 | return ret; |
169 | } | ||
170 | |||
171 | return 0; | ||
172 | } | 169 | } |
173 | 170 | ||
174 | static int ibmebus_create_devices(const struct of_device_id *matches) | 171 | static int ibmebus_create_devices(const struct of_device_id *matches) |
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index c6c933f58102..2fff59cef505 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c | |||
@@ -147,6 +147,7 @@ static void platform_device_release(struct device *dev) | |||
147 | struct platform_object *pa = container_of(dev, struct platform_object, | 147 | struct platform_object *pa = container_of(dev, struct platform_object, |
148 | pdev.dev); | 148 | pdev.dev); |
149 | 149 | ||
150 | of_device_node_put(&pa->pdev.dev); | ||
150 | kfree(pa->pdev.dev.platform_data); | 151 | kfree(pa->pdev.dev.platform_data); |
151 | kfree(pa->pdev.resource); | 152 | kfree(pa->pdev.resource); |
152 | kfree(pa); | 153 | kfree(pa); |
diff --git a/drivers/of/device.c b/drivers/of/device.c index 92de0eb74aea..45d86530799f 100644 --- a/drivers/of/device.c +++ b/drivers/of/device.c | |||
@@ -81,29 +81,10 @@ struct device_attribute of_platform_device_attrs[] = { | |||
81 | __ATTR_NULL | 81 | __ATTR_NULL |
82 | }; | 82 | }; |
83 | 83 | ||
84 | /** | 84 | int of_device_add(struct platform_device *ofdev) |
85 | * of_release_dev - free an of device structure when all users of it are finished. | ||
86 | * @dev: device that's been disconnected | ||
87 | * | ||
88 | * Will be called only by the device core when all users of this of device are | ||
89 | * done. | ||
90 | */ | ||
91 | void of_release_dev(struct device *dev) | ||
92 | { | ||
93 | struct platform_device *ofdev; | ||
94 | |||
95 | ofdev = to_platform_device(dev); | ||
96 | of_node_put(ofdev->dev.of_node); | ||
97 | kfree(ofdev); | ||
98 | } | ||
99 | EXPORT_SYMBOL(of_release_dev); | ||
100 | |||
101 | int of_device_register(struct platform_device *ofdev) | ||
102 | { | 85 | { |
103 | BUG_ON(ofdev->dev.of_node == NULL); | 86 | BUG_ON(ofdev->dev.of_node == NULL); |
104 | 87 | ||
105 | device_initialize(&ofdev->dev); | ||
106 | |||
107 | /* name and id have to be set so that the platform bus doesn't get | 88 | /* name and id have to be set so that the platform bus doesn't get |
108 | * confused on matching */ | 89 | * confused on matching */ |
109 | ofdev->name = dev_name(&ofdev->dev); | 90 | ofdev->name = dev_name(&ofdev->dev); |
@@ -117,6 +98,12 @@ int of_device_register(struct platform_device *ofdev) | |||
117 | 98 | ||
118 | return device_add(&ofdev->dev); | 99 | return device_add(&ofdev->dev); |
119 | } | 100 | } |
101 | |||
102 | int of_device_register(struct platform_device *pdev) | ||
103 | { | ||
104 | device_initialize(&pdev->dev); | ||
105 | return of_device_add(pdev); | ||
106 | } | ||
120 | EXPORT_SYMBOL(of_device_register); | 107 | EXPORT_SYMBOL(of_device_register); |
121 | 108 | ||
122 | void of_device_unregister(struct platform_device *ofdev) | 109 | void of_device_unregister(struct platform_device *ofdev) |
diff --git a/drivers/of/platform.c b/drivers/of/platform.c index 30726c8b0693..5b4a07f1220e 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c | |||
@@ -587,20 +587,23 @@ struct platform_device *of_device_alloc(struct device_node *np, | |||
587 | int rc, i, num_reg = 0, num_irq; | 587 | int rc, i, num_reg = 0, num_irq; |
588 | struct resource *res, temp_res; | 588 | struct resource *res, temp_res; |
589 | 589 | ||
590 | /* First count how many resources are needed */ | 590 | dev = platform_device_alloc("", -1); |
591 | if (!dev) | ||
592 | return NULL; | ||
593 | |||
594 | /* count the io and irq resources */ | ||
591 | while (of_address_to_resource(np, num_reg, &temp_res) == 0) | 595 | while (of_address_to_resource(np, num_reg, &temp_res) == 0) |
592 | num_reg++; | 596 | num_reg++; |
593 | num_irq = of_irq_count(np); | 597 | num_irq = of_irq_count(np); |
594 | 598 | ||
595 | /* Allocate memory for both the struct device and the resource table */ | ||
596 | dev = kzalloc(sizeof(*dev) + (sizeof(*res) * (num_reg + num_irq)), | ||
597 | GFP_KERNEL); | ||
598 | if (!dev) | ||
599 | return NULL; | ||
600 | res = (struct resource *) &dev[1]; | ||
601 | |||
602 | /* Populate the resource table */ | 599 | /* Populate the resource table */ |
603 | if (num_irq || num_reg) { | 600 | if (num_irq || num_reg) { |
601 | res = kzalloc(sizeof(*res) * (num_irq + num_reg), GFP_KERNEL); | ||
602 | if (!res) { | ||
603 | platform_device_put(dev); | ||
604 | return NULL; | ||
605 | } | ||
606 | |||
604 | dev->num_resources = num_reg + num_irq; | 607 | dev->num_resources = num_reg + num_irq; |
605 | dev->resource = res; | 608 | dev->resource = res; |
606 | for (i = 0; i < num_reg; i++, res++) { | 609 | for (i = 0; i < num_reg; i++, res++) { |
@@ -615,7 +618,6 @@ struct platform_device *of_device_alloc(struct device_node *np, | |||
615 | dev->dev.dma_mask = &dev->archdata.dma_mask; | 618 | dev->dev.dma_mask = &dev->archdata.dma_mask; |
616 | #endif | 619 | #endif |
617 | dev->dev.parent = parent; | 620 | dev->dev.parent = parent; |
618 | dev->dev.release = of_release_dev; | ||
619 | 621 | ||
620 | if (bus_id) | 622 | if (bus_id) |
621 | dev_set_name(&dev->dev, "%s", bus_id); | 623 | dev_set_name(&dev->dev, "%s", bus_id); |
@@ -653,8 +655,8 @@ struct platform_device *of_platform_device_create(struct device_node *np, | |||
653 | * to do such, possibly using a device notifier | 655 | * to do such, possibly using a device notifier |
654 | */ | 656 | */ |
655 | 657 | ||
656 | if (of_device_register(dev) != 0) { | 658 | if (of_device_add(dev) != 0) { |
657 | of_device_free(dev); | 659 | platform_device_put(dev); |
658 | return NULL; | 660 | return NULL; |
659 | } | 661 | } |
660 | 662 | ||
diff --git a/include/linux/of_device.h b/include/linux/of_device.h index 835f85ecd2de..975d347079d9 100644 --- a/include/linux/of_device.h +++ b/include/linux/of_device.h | |||
@@ -27,20 +27,19 @@ static inline int of_driver_match_device(const struct device *dev, | |||
27 | extern struct platform_device *of_dev_get(struct platform_device *dev); | 27 | extern struct platform_device *of_dev_get(struct platform_device *dev); |
28 | extern void of_dev_put(struct platform_device *dev); | 28 | extern void of_dev_put(struct platform_device *dev); |
29 | 29 | ||
30 | extern int of_device_add(struct platform_device *pdev); | ||
30 | extern int of_device_register(struct platform_device *ofdev); | 31 | extern int of_device_register(struct platform_device *ofdev); |
31 | extern void of_device_unregister(struct platform_device *ofdev); | 32 | extern void of_device_unregister(struct platform_device *ofdev); |
32 | extern void of_release_dev(struct device *dev); | ||
33 | |||
34 | static inline void of_device_free(struct platform_device *dev) | ||
35 | { | ||
36 | of_release_dev(&dev->dev); | ||
37 | } | ||
38 | 33 | ||
39 | extern ssize_t of_device_get_modalias(struct device *dev, | 34 | extern ssize_t of_device_get_modalias(struct device *dev, |
40 | char *str, ssize_t len); | 35 | char *str, ssize_t len); |
41 | 36 | ||
42 | extern int of_device_uevent(struct device *dev, struct kobj_uevent_env *env); | 37 | extern int of_device_uevent(struct device *dev, struct kobj_uevent_env *env); |
43 | 38 | ||
39 | static inline void of_device_node_put(struct device *dev) | ||
40 | { | ||
41 | of_node_put(dev->of_node); | ||
42 | } | ||
44 | 43 | ||
45 | #else /* CONFIG_OF_DEVICE */ | 44 | #else /* CONFIG_OF_DEVICE */ |
46 | 45 | ||
@@ -56,6 +55,8 @@ static inline int of_device_uevent(struct device *dev, | |||
56 | return -ENODEV; | 55 | return -ENODEV; |
57 | } | 56 | } |
58 | 57 | ||
58 | static inline void of_device_node_put(struct device *dev) { } | ||
59 | |||
59 | #endif /* CONFIG_OF_DEVICE */ | 60 | #endif /* CONFIG_OF_DEVICE */ |
60 | 61 | ||
61 | #endif /* _LINUX_OF_DEVICE_H */ | 62 | #endif /* _LINUX_OF_DEVICE_H */ |