From patchwork Tue Jun 8 14:26:43 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Grant Likely X-Patchwork-Id: 54990 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from bilbo.ozlabs.org (localhost [127.0.0.1]) by ozlabs.org (Postfix) with ESMTP id B253F101EE4 for ; Wed, 9 Jun 2010 00:27:34 +1000 (EST) Received: from mail-pw0-f51.google.com (mail-pw0-f51.google.com [209.85.160.51]) by ozlabs.org (Postfix) with ESMTP id DA209100CD4; Wed, 9 Jun 2010 00:26:47 +1000 (EST) Received: by mail-pw0-f51.google.com with SMTP id 10so218269pwj.38 for ; Tue, 08 Jun 2010 07:26:47 -0700 (PDT) Received: by 10.141.100.21 with SMTP id c21mr13434252rvm.101.1276007207412; Tue, 08 Jun 2010 07:26:47 -0700 (PDT) Received: from angua (S01060002b3d79728.cg.shawcable.net [70.72.87.49]) by mx.google.com with ESMTPS id k17sm5806322rvh.5.2010.06.08.07.26.44 (version=TLSv1/SSLv3 cipher=RC4-MD5); Tue, 08 Jun 2010 07:26:45 -0700 (PDT) Received: from [127.0.1.1] (unknown [IPv6:::1]) by angua (Postfix) with ESMTP id E947F3C0110; Tue, 8 Jun 2010 08:26:43 -0600 (MDT) Subject: [PATCH 6/6] of/device: populate platform_device (of_device) resource table on allocation To: ben@kernel.crashing.org, sfr@canb.auug.org.au, monstr@monstr.eu, microblaze-uclinux@itee.uq.edu.au, devicetree-discuss@lists.ozlabs.org, jeremy.kerr@canonical.com, linuxppc-dev@lists.ozlabs.org From: Grant Likely Date: Tue, 08 Jun 2010 08:26:43 -0600 Message-ID: <20100608142643.26088.61366.stgit@angua> In-Reply-To: <20100608142152.26088.1108.stgit@angua> References: <20100608142152.26088.1108.stgit@angua> User-Agent: StGit/0.15 MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org 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 CC: Michal Simek CC: Grant Likely CC: Benjamin Herrenschmidt CC: Stephen Rothwell CC: microblaze-uclinux@itee.uq.edu.au CC: linuxppc-dev@ozlabs.org CC: devicetree-discuss@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