[PATCH 6/6] of/device: populate platform_device (of_device) resource table on allocation
Grant Likely
grant.likely at secretlab.ca
Wed Jun 9 00:26:43 EST 2010
When allocating a platform_device to represent an OF node, also allocate
space for the resource table and populate it with IRQ and reg property
information. This change is in preparation for merging the
of_platform_bus_type with the platform_bus_type so that existing
platform_driver code can retrieve base addresses and IRQs data.
Background: a previous commit removed struct of_device and made it a
#define alias for platform_device.
Signed-off-by: Grant Likely <grant.likely at secretlab.ca>
CC: Michal Simek <monstr at monstr.eu>
CC: Grant Likely <grant.likely at secretlab.ca>
CC: Benjamin Herrenschmidt <benh at kernel.crashing.org>
CC: Stephen Rothwell <sfr at canb.auug.org.au>
CC: microblaze-uclinux at itee.uq.edu.au
CC: linuxppc-dev at ozlabs.org
CC: devicetree-discuss at lists.ozlabs.org
---
drivers/of/platform.c | 31 ++++++++++++++++++++++++++++---
1 files changed, 28 insertions(+), 3 deletions(-)
diff --git a/drivers/of/platform.c b/drivers/of/platform.c
index 4bb898d..10ad0b6 100644
--- a/drivers/of/platform.c
+++ b/drivers/of/platform.c
@@ -441,16 +441,41 @@ struct of_device *of_device_alloc(struct device_node *np,
struct device *parent)
{
struct of_device *dev;
-
- dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+ int rc, i, num_reg = 0, num_irq = 0;
+ struct resource *res, temp_res;
+
+ /* First count how many resources are needed */
+ while (of_address_to_resource(np, num_reg, &temp_res) == 0)
+ num_reg++;
+ while (of_irq_to_resource(np, num_irq, &temp_res) != NO_IRQ)
+ num_irq++;
+
+ /* Allocate the device including space for the resource table, and
+ * initialize it. */
+ i = num_reg + num_irq;
+ dev = kzalloc(sizeof(*dev) + (sizeof(struct resource) * i), GFP_KERNEL);
if (!dev)
return NULL;
-
dev->dev.of_node = of_node_get(np);
dev->dev.dma_mask = &dev->archdata.dma_mask;
dev->dev.parent = parent;
dev->dev.release = of_release_dev;
+ /* Populate the resource table */
+ if (num_irq || num_reg) {
+ dev->resource = (void*)&dev[1];
+ dev->num_resources = num_reg + num_irq;
+ res = dev->resource;
+ for (i = 0; i < num_reg; i++, res++) {
+ rc = of_address_to_resource(np, i, res);
+ WARN_ON(rc);
+ }
+ for (i = 0; i < num_irq; i++, res++) {
+ rc = of_irq_to_resource(np, i, res);
+ WARN_ON(rc == NO_IRQ);
+ }
+ }
+
if (bus_id)
dev_set_name(&dev->dev, "%s", bus_id);
else
More information about the devicetree-discuss
mailing list