From patchwork Fri Oct 5 15:31:41 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 12024 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 AEFB524156 for ; Fri, 5 Oct 2012 15:32:09 +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 624D5A18882 for ; Fri, 5 Oct 2012 15:32:09 +0000 (UTC) Received: by mail-ie0-f180.google.com with SMTP id e10so3999259iej.11 for ; Fri, 05 Oct 2012 08:32:09 -0700 (PDT) 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=Jx3mKsfZpSY1xsGkLpj2qQWoaHPxYzDicLaACfCGAPY=; b=XvhWDu6RKM/E1jYq+36hBRh1n/kgAFfTUgD0k/y4REtFmuw6qWVwr3zi90m1U0KaIq VuVoiJSGCPAP9Mo6a8wY06JEoMknLlfpIvDhkSL8NWkSn3IW0yBxjP512cGFEKbisVpY GvaXGanZGmXB2esZWrgDLEfVuLS8+67GSYN1RGYQZj0WH3AaERIHEX4ayHw5CClm2lPy aFACQ/hLHQ6XAfMLe4fzOvoZBxE1TjlCLvz08nCDHlk/YiRtJP1JI/5e5BYkcwnQ/rjO G7Hquf8oNGz5frziqSY72wmPjfm8jsfLTg6W1d9x/Zxt9VtWT55ZDbgPsFgkwaDQgNGC mYMQ== Received: by 10.50.154.137 with SMTP id vo9mr1511949igb.28.1349451129178; Fri, 05 Oct 2012 08:32:09 -0700 (PDT) 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.184.232 with SMTP id ex8csp132550igc; Fri, 5 Oct 2012 08:32:07 -0700 (PDT) Received: by 10.180.76.69 with SMTP id i5mr4141723wiw.9.1349451126902; Fri, 05 Oct 2012 08:32:06 -0700 (PDT) Received: from mail-wi0-f172.google.com (mail-wi0-f172.google.com [209.85.212.172]) by mx.google.com with ESMTPS id i20si2945664wej.51.2012.10.05.08.32.06 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 05 Oct 2012 08:32:06 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.212.172 is neither permitted nor denied by best guess record for domain of lee.jones@linaro.org) client-ip=209.85.212.172; Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.212.172 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-f172.google.com with SMTP id hq12so718500wib.13 for ; Fri, 05 Oct 2012 08:32:06 -0700 (PDT) Received: by 10.216.143.233 with SMTP id l83mr5469411wej.167.1349451126415; Fri, 05 Oct 2012 08:32:06 -0700 (PDT) Received: from localhost.localdomain (cpc1-aztw13-0-0-cust473.18-1.cable.virginmedia.com. [77.102.241.218]) by mx.google.com with ESMTPS id w8sm2906148wif.4.2012.10.05.08.32.05 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 05 Oct 2012 08:32:05 -0700 (PDT) From: Lee Jones To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: arnd@arndb.de, linus.walleij@stericsson.com, Lee Jones , Samuel Ortiz Subject: [PATCH 05/10] mfd: Enable the STMPE MFD for Device Tree Date: Fri, 5 Oct 2012 16:31:41 +0100 Message-Id: <1349451107-8009-6-git-send-email-lee.jones@linaro.org> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1349451107-8009-1-git-send-email-lee.jones@linaro.org> References: <1349451107-8009-1-git-send-email-lee.jones@linaro.org> X-Gm-Message-State: ALoCoQkKTkQRCVF6M1C+IEtmrPOvqb7R+Mnsr7xgEjOI9KlX1MLaadWY3aPe8orwCGFeA4STEOs2 This patch allows the STMPE Multi-Functional Device to be correctly initialised when booting with Device Tree support enabled. Its children are specified by the addition of subordinate devices to the STMPE node in the Device Tree file. Cc: Samuel Ortiz Acked-by: Linus Walleij Signed-off-by: Lee Jones --- drivers/mfd/stmpe.c | 48 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/drivers/mfd/stmpe.c b/drivers/mfd/stmpe.c index e50ebdf..ba157d4 100644 --- a/drivers/mfd/stmpe.c +++ b/drivers/mfd/stmpe.c @@ -885,18 +885,19 @@ static struct irq_domain_ops stmpe_irq_ops = { .xlate = irq_domain_xlate_twocell, }; -static int __devinit stmpe_irq_init(struct stmpe *stmpe) +static int __devinit stmpe_irq_init(struct stmpe *stmpe, + struct device_node *np) { int base = stmpe->irq_base; int num_irqs = stmpe->variant->num_irqs; if (base) { stmpe->domain = irq_domain_add_legacy( - NULL, num_irqs, base, 0, &stmpe_irq_ops, stmpe); + np, num_irqs, base, 0, &stmpe_irq_ops, stmpe); } else { stmpe->domain = irq_domain_add_linear( - NULL, num_irqs, &stmpe_irq_ops, stmpe); + np, num_irqs, &stmpe_irq_ops, stmpe); } if (!stmpe->domain) { @@ -1016,15 +1017,50 @@ static int __devinit stmpe_devices_init(struct stmpe *stmpe) return ret; } +void __devinit stmpe_of_probe(struct stmpe_platform_data *pdata, + struct device_node *np) +{ + struct device_node *child; + + of_property_read_u32(np, "st,autosleep-timeout", + &pdata->autosleep_timeout); + + pdata->autosleep = (pdata->autosleep_timeout) ? true : false; + + for_each_child_of_node(np, child) { + if (!strcmp(child->name, "stmpe_gpio")) { + pdata->blocks |= STMPE_BLOCK_GPIO; + } + if (!strcmp(child->name, "stmpe_keypad")) { + pdata->blocks |= STMPE_BLOCK_KEYPAD; + } + if (!strcmp(child->name, "stmpe_touchscreen")) { + pdata->blocks |= STMPE_BLOCK_TOUCHSCREEN; + } + if (!strcmp(child->name, "stmpe_adc")) { + pdata->blocks |= STMPE_BLOCK_ADC; + } + } +} + /* Called from client specific probe routines */ int __devinit stmpe_probe(struct stmpe_client_info *ci, int partnum) { struct stmpe_platform_data *pdata = dev_get_platdata(ci->dev); + struct device_node *np = ci->dev->of_node; struct stmpe *stmpe; int ret; - if (!pdata) - return -EINVAL; + if (!pdata) { + if (np) { + pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); + if (!pdata) + return -ENOMEM; + + stmpe_of_probe(pdata, np); + } else + return -EINVAL; + } stmpe = kzalloc(sizeof(struct stmpe), GFP_KERNEL); if (!stmpe) @@ -1080,7 +1116,7 @@ int __devinit stmpe_probe(struct stmpe_client_info *ci, int partnum) goto free_gpio; if (stmpe->irq >= 0) { - ret = stmpe_irq_init(stmpe); + ret = stmpe_irq_init(stmpe, np); if (ret) goto free_gpio;