Skip to content

Commit

Permalink
of/device: populate platform_device (of_device) resource table on all…
Browse files Browse the repository at this point in the history
…ocation

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@secretlab.ca>
CC: Michal Simek <monstr@monstr.eu>
CC: Grant Likely <grant.likely@secretlab.ca>
CC: Benjamin Herrenschmidt <benh@kernel.crashing.org>
CC: Stephen Rothwell <sfr@canb.auug.org.au>
CC: microblaze-uclinux@itee.uq.edu.au
CC: linuxppc-dev@ozlabs.org
CC: devicetree-discuss@lists.ozlabs.org
  • Loading branch information
Grant Likely committed Jul 5, 2010
1 parent 94c0931 commit ac80a51
Showing 1 changed file with 27 additions and 2 deletions.
29 changes: 27 additions & 2 deletions drivers/of/platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -475,10 +475,35 @@ 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 memory for both the struct device and the resource table */
dev = kzalloc(sizeof(*dev) + (sizeof(*res) * (num_reg + num_irq)),
GFP_KERNEL);
if (!dev)
return NULL;
res = (struct resource *) &dev[1];

/* Populate the resource table */
if (num_irq || num_reg) {
dev->num_resources = num_reg + num_irq;
dev->resource = res;
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);
}
}

dev->dev.of_node = of_node_get(np);
dev->dev.dma_mask = &dev->archdata.dma_mask;
Expand Down

0 comments on commit ac80a51

Please sign in to comment.