From patchwork Tue Apr 16 21:57:02 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Hunter, Jon" X-Patchwork-Id: 2451261 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by patchwork1.kernel.org (Postfix) with ESMTP id 7C7883FD40 for ; Tue, 16 Apr 2013 21:57:23 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1USDsJ-000494-UK; Tue, 16 Apr 2013 21:57:16 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1USDsH-0008MF-Ec; Tue, 16 Apr 2013 21:57:13 +0000 Received: from arroyo.ext.ti.com ([192.94.94.40]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1USDsC-0008Lv-Fv for linux-arm-kernel@lists.infradead.org; Tue, 16 Apr 2013 21:57:10 +0000 Received: from dflxv15.itg.ti.com ([128.247.5.124]) by arroyo.ext.ti.com (8.13.7/8.13.7) with ESMTP id r3GLv3Oj028358; Tue, 16 Apr 2013 16:57:03 -0500 Received: from DLEE70.ent.ti.com (dlee70.ent.ti.com [157.170.170.113]) by dflxv15.itg.ti.com (8.14.3/8.13.8) with ESMTP id r3GLv3FX010701; Tue, 16 Apr 2013 16:57:03 -0500 Received: from [172.24.16.27] (172.24.16.27) by DLEE70.ent.ti.com (157.170.170.113) with Microsoft SMTP Server id 14.2.342.3; Tue, 16 Apr 2013 16:57:03 -0500 Message-ID: <516DC92E.106@ti.com> Date: Tue, 16 Apr 2013 16:57:02 -0500 From: Jon Hunter User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130329 Thunderbird/17.0.5 MIME-Version: 1.0 To: Stephen Warren Subject: Re: [PATCH 3/5] gpio/omap: Add DT support to GPIO driver References: <1329321854-24490-1-git-send-email-b-cousson@ti.com> <514C79E1.4090106@wwwdotorg.org> <514CE0AB.6060207@ti.com> <515319D5.20105@wwwdotorg.org> <5155C902.7080207@wwwdotorg.org> <5165CB9D.1090202@wwwdotorg.org> <51671D7B.5060303@wwwdotorg.org> <51673D70.3010503@wwwdotorg.org> <516C31C3.9040505@wwwdotorg.org> <516C73C6.5050409@ti.co m> <516C7C43.3040105@wwwdotorg.org> <516C8760.2050500@ti.com> <516D9B05.1000501@wwwdotorg.org> <516DA60A.5070000@ti.com> In-Reply-To: <516DA60A.5070000@ti.com> X-Originating-IP: [172.24.16.27] X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130416_175708_639109_C6B8B95F X-CRM114-Status: GOOD ( 18.38 ) X-Spam-Score: -7.6 (-------) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (-7.6 points) pts rule name description ---- ---------------------- -------------------------------------------------- -5.0 RCVD_IN_DNSWL_HI RBL: Sender listed at http://www.dnswl.org/, high trust [192.94.94.40 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.7 RP_MATCHES_RCVD Envelope sender domain matches handover relay domain -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] Cc: Javier Martinez Canillas , Stephen Warren , Kevin Hilman , "devicetree-discuss@lists.ozlabs.org" , Alexandre Courbot , "linux-omap@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org On 04/16/2013 02:27 PM, Jon Hunter wrote: ... > Right. In the DT case though, if someone does provide the IRQ and GPIO > IDs then at least they would use a different xlate function. Another > option to consider would be defining the #interrupt-cells = <3> where we > would have ... > > cell-#1 --> IRQ domain ID > cell-#2 --> Trigger type > cell-#3 --> GPIO ID > > Then we could have a generic xlate for 3 cells that would also request > the GPIO. Again not sure if people are against a gpio being requested in > the xlate but just an idea. Or given that irq_of_parse_and_map() calls > the xlate, we could have this function call gpio_request() if the > interrupt controller is a gpio and there are 3 cells. So basically some like the following (note I have only included the omap portion in here for an example). The other benefit being no need to re-introduce irq_to_gpio. Jon From f01ce047075a922969fcbe904b339fe8d03a997b Mon Sep 17 00:00:00 2001 From: Jon Hunter Date: Tue, 16 Apr 2013 09:54:28 -0500 Subject: [PATCH] gpio: add custom xlate for gpio irqs --- drivers/gpio/gpio-omap.c | 3 ++- drivers/gpio/gpiolib-of.c | 24 ++++++++++++++++++++++++ include/linux/of_gpio.h | 1 + 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index d337318..b3d7d43 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -1135,7 +1136,7 @@ static int omap_gpio_probe(struct platform_device *pdev) bank->domain = irq_domain_add_linear(node, bank->width, - &irq_domain_simple_ops, NULL); + &of_gpio_irq_domain_ops, NULL); if (!bank->domain) return -ENODEV; diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c index 5150df6..fc01ec1 100644 --- a/drivers/gpio/gpiolib-of.c +++ b/drivers/gpio/gpiolib-of.c @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include #include #include @@ -253,3 +255,25 @@ void of_gpiochip_remove(struct gpio_chip *chip) if (chip->of_node) of_node_put(chip->of_node); } + +int of_gpio_irq_domain_xlate(struct irq_domain *d, struct device_node *ctrlr, + const u32 *intspec, unsigned int intsize, + unsigned long *out_hwirq, unsigned int *out_type) +{ + int ret; + + if (WARN_ON(intsize < 3)) + return -EINVAL; + + ret = gpio_request_one(intspec[2], GPIOF_IN, NULL); + if (ret) + return ret; + + *out_hwirq = intspec[0]; + *out_type = (intsize > 1) ? intspec[1] : IRQ_TYPE_NONE; + return 0; +} + +const struct irq_domain_ops of_gpio_irq_domain_ops = { + .xlate = of_gpio_irq_domain_xlate, +}; diff --git a/include/linux/of_gpio.h b/include/linux/of_gpio.h index a83dc6f..ad2b962 100644 --- a/include/linux/of_gpio.h +++ b/include/linux/of_gpio.h @@ -58,6 +58,7 @@ extern void of_gpiochip_remove(struct gpio_chip *gc); extern int of_gpio_simple_xlate(struct gpio_chip *gc, const struct of_phandle_args *gpiospec, u32 *flags); +extern const struct irq_domain_ops of_gpio_irq_domain_ops; #else /* CONFIG_OF_GPIO */