From patchwork Mon Nov 5 15:10:30 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 12666 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id 703F723EF8 for ; Mon, 5 Nov 2012 15:10:55 +0000 (UTC) Received: from mail-ie0-f180.google.com (mail-ie0-f180.google.com [209.85.223.180]) by fiordland.canonical.com (Postfix) with ESMTP id ECF1AA19A14 for ; Mon, 5 Nov 2012 15:10:54 +0000 (UTC) Received: by mail-ie0-f180.google.com with SMTP id e10so7810038iej.11 for ; Mon, 05 Nov 2012 07:10:54 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-forwarded-to:x-forwarded-for:delivered-to:received-spf:from:to:cc :subject:date:message-id:x-mailer:in-reply-to:references :x-gm-message-state; bh=3T/uWALXUXWoRZOGtddJgNySm0nW1WoJC2PwA1dCJLs=; b=R1IqCP1I6auTLxqMFDx2lMvuagJObEhxGL6BKgVfLxNCej9uYcH/HtoBmpOY/vem+P y9oX+CAzAr3l4X9Yn9UIVLJtQZsl5c9dbG3XRkTCL5SrZED9dYiHdHO2RfdrXu26TN5q XZOB0Kk7EjFuMUzhYowinJWt8NgSUiUJrzAPl9WRKDGeEnx2MIQKl9lz65XWKMz5TA1v B/ZveAcha8jrQG9WsiNdQi0uKEVcD3bwIe8zI3aO/Nxla/ix9e66EA/R4GdddPUFt6Ml mKFnq9F/QRkPNPWke8jIHJoYDMU+81+Cu2/2eLlooqmm+A01GwhpIR5s48me2iOncvCe ioDw== Received: by 10.43.7.132 with SMTP id oo4mr8506799icb.6.1352128254744; Mon, 05 Nov 2012 07:10:54 -0800 (PST) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.50.67.148 with SMTP id n20csp231234igt; Mon, 5 Nov 2012 07:10:54 -0800 (PST) Received: by 10.180.102.131 with SMTP id fo3mr13887648wib.1.1352128253449; Mon, 05 Nov 2012 07:10:53 -0800 (PST) Received: from mail-wi0-f169.google.com (mail-wi0-f169.google.com [209.85.212.169]) by mx.google.com with ESMTPS id s63si2418816weo.10.2012.11.05.07.10.53 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 05 Nov 2012 07:10:53 -0800 (PST) Received-SPF: neutral (google.com: 209.85.212.169 is neither permitted nor denied by best guess record for domain of lee.jones@linaro.org) client-ip=209.85.212.169; Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.212.169 is neither permitted nor denied by best guess record for domain of lee.jones@linaro.org) smtp.mail=lee.jones@linaro.org Received: by mail-wi0-f169.google.com with SMTP id hq4so2499921wib.4 for ; Mon, 05 Nov 2012 07:10:53 -0800 (PST) Received: by 10.180.100.97 with SMTP id ex1mr13657599wib.17.1352128252973; Mon, 05 Nov 2012 07:10:52 -0800 (PST) Received: from laptop.vlan14.pylonone.local (78.Red-88-2-49.staticIP.rima-tde.net. [88.2.49.78]) by mx.google.com with ESMTPS id ea9sm12275388wib.11.2012.11.05.07.10.51 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 05 Nov 2012 07:10:52 -0800 (PST) From: Lee Jones To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, sameo@linux.intel.com Cc: arnd@arndb.de, linus.walleij@stericsson.com, Lee Jones Subject: [PATCH 2/8] mfd: Prevent STMPE from abusing mfd_add_devices' irq_base parameter Date: Mon, 5 Nov 2012 16:10:30 +0100 Message-Id: <1352128236-11554-3-git-send-email-lee.jones@linaro.org> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1352128236-11554-1-git-send-email-lee.jones@linaro.org> References: <1352128236-11554-1-git-send-email-lee.jones@linaro.org> X-Gm-Message-State: ALoCoQl24bzDUMwxqgS0wWk9eKBMrbXF8pL7ze40p+UvEIJYEzlIus7kq4RdxDheT/esERr80YJE Originally IRQ incrementers were provided in some template resource structures for keypad and touchscreen devices. These were passed as IORESOURCE_IRQs to MFD core in the usual way. The true device IRQs were instead added to the irq_base when mfd_add_devices was invoked. This is clearly an abuse of the call, and does not scale when IRQ Domains are brought into play. Before we can provide the STMPE with its own IRQ Domain we must first fix this. This patche keeps most of the driver's structure, keeping the template strategy. However, instead of providing the IRQ as an increment to irq_base, we dynamically populate the IORESOURCE_IRQ with the correct device IRQ. Cc: Samuel Ortiz Acked-by: Arnd Bergmann Acked-by: Linus Walleij Signed-off-by: Lee Jones --- drivers/mfd/stmpe.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/drivers/mfd/stmpe.c b/drivers/mfd/stmpe.c index c94f521..ad13cb0 100644 --- a/drivers/mfd/stmpe.c +++ b/drivers/mfd/stmpe.c @@ -310,14 +310,10 @@ static struct mfd_cell stmpe_gpio_cell_noirq = { static struct resource stmpe_keypad_resources[] = { { .name = "KEYPAD", - .start = 0, - .end = 0, .flags = IORESOURCE_IRQ, }, { .name = "KEYPAD_OVER", - .start = 1, - .end = 1, .flags = IORESOURCE_IRQ, }, }; @@ -397,14 +393,10 @@ static struct stmpe_variant_info stmpe801_noirq = { static struct resource stmpe_ts_resources[] = { { .name = "TOUCH_DET", - .start = 0, - .end = 0, .flags = IORESOURCE_IRQ, }, { .name = "FIFO_TH", - .start = 1, - .end = 1, .flags = IORESOURCE_IRQ, }, }; @@ -959,10 +951,10 @@ static int __devinit stmpe_chip_init(struct stmpe *stmpe) } static int __devinit stmpe_add_device(struct stmpe *stmpe, - struct mfd_cell *cell, int irq) + struct mfd_cell *cell) { return mfd_add_devices(stmpe->dev, stmpe->pdata->id, cell, 1, - NULL, stmpe->irq_base + irq, NULL); + NULL, stmpe->irq_base, NULL); } static int __devinit stmpe_devices_init(struct stmpe *stmpe) @@ -970,7 +962,7 @@ static int __devinit stmpe_devices_init(struct stmpe *stmpe) struct stmpe_variant_info *variant = stmpe->variant; unsigned int platform_blocks = stmpe->pdata->blocks; int ret = -EINVAL; - int i; + int i, j; for (i = 0; i < variant->num_blocks; i++) { struct stmpe_variant_block *block = &variant->blocks[i]; @@ -978,8 +970,17 @@ static int __devinit stmpe_devices_init(struct stmpe *stmpe) if (!(platform_blocks & block->block)) continue; + for (j = 0; j < block->cell->num_resources; j++) { + struct resource *res = + (struct resource *) &block->cell->resources[j]; + + /* Dynamically fill in a variant's IRQ. */ + if (res->flags & IORESOURCE_IRQ) + res->start = res->end = block->irq + j; + } + platform_blocks &= ~block->block; - ret = stmpe_add_device(stmpe, block->cell, block->irq); + ret = stmpe_add_device(stmpe, block->cell); if (ret) return ret; }