diff options
author | Grant Likely <grant.likely@secretlab.ca> | 2010-10-20 13:45:13 -0400 |
---|---|---|
committer | Grant Likely <grant.likely@secretlab.ca> | 2010-10-21 13:10:10 -0400 |
commit | 7096d0422153ffcc2264eef652fc3a7bca3e6d3c (patch) | |
tree | 2be6139f1e26acb4d0680e50a87623bc18938147 /drivers/of/platform.c | |
parent | bda80da469a93122121de601dd469ce1aaa6effa (diff) |
of/device: Rework to use common platform_device_alloc() for allocating devices
The current code allocates and manages platform_devices created from
the device tree manually. It also uses an unsafe shortcut for
allocating the platform_device and the resource table at the same
time. (which I added in the last rework; sorry).
This patch refactors the code to use platform_device_alloc() for
allocating new devices. This reduces the amount of custom code
implemented by of_platform, eliminates the unsafe alloc trick, and has
the side benefit of letting the platform_bus code manage freeing the
device data and resources when the device is freed.
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Greg Kroah-Hartman <gregkh@suse.de>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Michal Simek <monstr@monstr.eu>
Diffstat (limited to 'drivers/of/platform.c')
-rw-r--r-- | drivers/of/platform.c | 24 |
1 files changed, 13 insertions, 11 deletions
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 | ||