From patchwork Mon Nov 5 15:10:33 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 1698441 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) by patchwork1.kernel.org (Postfix) with ESMTP id BF2583FCA5 for ; Mon, 5 Nov 2012 15:14:21 +0000 (UTC) Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1TVOLQ-000602-EY; Mon, 05 Nov 2012 15:12:08 +0000 Received: from mail-we0-f177.google.com ([74.125.82.177]) by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1TVOKK-0005Xv-7W for linux-arm-kernel@lists.infradead.org; Mon, 05 Nov 2012 15:11:01 +0000 Received: by mail-we0-f177.google.com with SMTP id u50so2589600wey.36 for ; Mon, 05 Nov 2012 07:10:59 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references :x-gm-message-state; bh=Lgj9sLo/ulrO+ZhIn85omf1sSaDpIkL8YTuXln7eV10=; b=afhWpmdGS43tSj0JmTFQbGhnIRDLYH7t4YjjHUgfG/5t5OjvpH2A89rmYq4sbf2VZa 0nVQYL1n62NKLcVRxlkgHfbTOhuiP7sTg0NlTDkL1ozgelPomP3U7QAfHJcjmqYh/pD8 AuhYx7AjosgX+V4WtstQgWInSpNXI/q683nLH63KWADeCtRormXNjVsqYtvFJeE3C0/Z y+RTsvw9tFBOxZgeZ48pTYdtqfYoFvWIxg6YSKQgB97ULxoqEWkh5k/hcDgK+CSQSO4n fpzk2MqiNi6q8w64eyPbeQDKmuvaLT9dmLNxY1ZulRXDB+flCbcBHeZpDKgY96GSr2bE sbzw== Received: by 10.181.11.233 with SMTP id el9mr13121056wid.3.1352128259100; Mon, 05 Nov 2012 07:10:59 -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.56 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 05 Nov 2012 07:10:58 -0800 (PST) From: Lee Jones To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, sameo@linux.intel.com Subject: [PATCH 5/8] mfd: Enable the STMPE MFD for Device Tree Date: Mon, 5 Nov 2012 16:10:33 +0100 Message-Id: <1352128236-11554-6-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: ALoCoQnegtCsRYSous9eZI2s4grQbvtdodm9MNfysR6eX17bT9bhKh4e9F3Ty+IKyhQYNhTRQo9q X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20121105_101100_450128_C476A943 X-CRM114-Status: GOOD ( 17.32 ) X-Spam-Score: -2.6 (--) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (-2.6 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at http://www.dnswl.org/, low trust [74.125.82.177 listed in list.dnswl.org] -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] Cc: Lee Jones , linus.walleij@stericsson.com, arnd@arndb.de X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: linux-arm-kernel-bounces@lists.infradead.org Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org 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: Arnd Bergmann 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;