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: 12669 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 3B25A23EF8 for ; Mon, 5 Nov 2012 15:11:01 +0000 (UTC) Received: from mail-ia0-f180.google.com (mail-ia0-f180.google.com [209.85.210.180]) by fiordland.canonical.com (Postfix) with ESMTP id 038B7A19A1D for ; Mon, 5 Nov 2012 15:11:00 +0000 (UTC) Received: by mail-ia0-f180.google.com with SMTP id f6so4196858iag.11 for ; Mon, 05 Nov 2012 07:11:00 -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=Lgj9sLo/ulrO+ZhIn85omf1sSaDpIkL8YTuXln7eV10=; b=T+8kZfUayFJCTXKaCDdY5rzdtYFv+sIuVC3ztao7ARRrS/+pM04frjnMx1XgmT/t+g lvtiNzlT1Dp46Y2FtoX4jzocJdzUcYXmmu1aA0oAfSLP3fWnTKtDk0dvMq4vsk+/diOc EfVzyoTRaHW+4hzLKkk+rtmTsd5xOwKUNJ9CTzaFL7xQCzs7un39+0ZGhFsOujAvXzzN xCcKf2tAMsmz/Hs/w7fzWKWDAQvGhz5WbSzQEhyWQ6vBwtXRC/sW2+imMcWEAz2coQA2 vIToq5lxLV73O52g6pr5ilgTa4vDmzdwBHBOBkiltBbUPZ6wYCT+FudS9y5qlwFzSr5r 06rg== Received: by 10.50.237.69 with SMTP id va5mr5124442igc.62.1352128260734; Mon, 05 Nov 2012 07:11:00 -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 n20csp231251igt; Mon, 5 Nov 2012 07:11:00 -0800 (PST) Received: by 10.180.79.37 with SMTP id g5mr13849250wix.7.1352128259585; Mon, 05 Nov 2012 07:10:59 -0800 (PST) Received: from mail-we0-f169.google.com (mail-we0-f169.google.com [74.125.82.169]) by mx.google.com with ESMTPS id g54si1366923wep.64.2012.11.05.07.10.59 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 05 Nov 2012 07:10:59 -0800 (PST) Received-SPF: neutral (google.com: 74.125.82.169 is neither permitted nor denied by best guess record for domain of lee.jones@linaro.org) client-ip=74.125.82.169; Authentication-Results: mx.google.com; spf=neutral (google.com: 74.125.82.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-we0-f169.google.com with SMTP id u3so3242885wey.14 for ; Mon, 05 Nov 2012 07:10:59 -0800 (PST) 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 Cc: arnd@arndb.de, linus.walleij@stericsson.com, Lee Jones 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: ALoCoQn7Bf6bmvJi+HG3RirP4kcMJSjgjAht0GoGNh5ERTP1sxxDG1yfqBti/QuUOZpogmUXzQUk 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;