From patchwork Sun Apr 14 01:35:44 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Javier Martinez Canillas X-Patchwork-Id: 2441501 Return-Path: X-Original-To: patchwork-linux-omap@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id 5D2E33FC71 for ; Sun, 14 Apr 2013 01:36:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754125Ab3DNBgH (ORCPT ); Sat, 13 Apr 2013 21:36:07 -0400 Received: from mail-ia0-f176.google.com ([209.85.210.176]:37593 "EHLO mail-ia0-f176.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754055Ab3DNBgG (ORCPT ); Sat, 13 Apr 2013 21:36:06 -0400 Received: by mail-ia0-f176.google.com with SMTP id i9so1121186iad.21 for ; Sat, 13 Apr 2013 18:36:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:mime-version:in-reply-to:references:from:date:message-id :subject:to:cc:content-type; bh=D6Az+leWu1r0ZF1OvYt1BJtccBY75iUqlx7AyWlGWEg=; b=KlPTz7ReEU/RODvTKFPNSSC0rW6XqZyOmHYiZeoQXn18W4KOSGTpw9KxGcP1b+8nny /tigWkJToHRWO4hwoZgNibiK0v9Yv9JPY2cXzIg8LmBLOA7TF4DAFAHBaxxeTXd4yLZg Gb6Gm1cYbDYdV8K4HjGOp1NyO/LL3W0meeh1gCJNqv+dmAWS7z6LdH2K5mKIY8wSCHRx iejach9mSZprBNa2CGEpTG1Oe2goy4NcOTOK9mXp1uOn+/a4dmJfTsY6XdWojJSvhWzL ucZcc8UfUfiEryMBzxszsrysJA8toMJyKNy4LXhXV+4tqKyDBWxJ48cCO0gZZnIK15Ua U/vA== X-Received: by 10.50.45.230 with SMTP id q6mr2489087igm.39.1365903364888; Sat, 13 Apr 2013 18:36:04 -0700 (PDT) MIME-Version: 1.0 Received: by 10.64.71.2 with HTTP; Sat, 13 Apr 2013 18:35:44 -0700 (PDT) In-Reply-To: <51673D70.3010503@wwwdotorg.org> References: <1329321854-24490-1-git-send-email-b-cousson@ti.com> <4F47AD08.4030504@ti.com> <512D39DA.7020306@ti.com> <512D3AB1.1080202@wwwdotorg.org> <512D3EC2.6050408@ti.com> <20130302200524.D230F3E1571@localhost> <51391F41.5000303@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> From: Javier Martinez Canillas Date: Sun, 14 Apr 2013 03:35:44 +0200 Message-ID: Subject: Re: [PATCH 3/5] gpio/omap: Add DT support to GPIO driver To: Stephen Warren Cc: Linus Walleij , Jon Hunter , Grant Likely , Alexandre Courbot , Stephen Warren , Kevin Hilman , "devicetree-discuss@lists.ozlabs.org" , "linux-omap@vger.kernel.org" , Tarun Kanti DebBarma , "linux-arm-kernel@lists.infradead.org" Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org On Fri, Apr 12, 2013 at 12:47 AM, Stephen Warren wrote: > On 04/11/2013 04:16 PM, Linus Walleij wrote: >> On Thu, Apr 11, 2013 at 10:30 PM, Stephen Warren wrote: >>> On 04/10/2013 03:28 PM, Linus Walleij wrote: >> >>>> So the only reason I'm rambing on about this is that it breaks the >>> >>> I'm not sure I understand this paragraph; what is "it" in the line above. >>> >>> If "it" is this patch, then should "breaks" be re-establishes? >> >> No I'm replying to Javier Martinez Canillas mail in this thread: >> http://marc.info/?l=linux-arm-kernel&m=136334655902407&w=2 >> which is stating a question to grand, and contains the below >> hunk: >> >>> +static int gpio_irq_request(struct irq_data *d) >>> +{ >>> + struct gpio_bank *bank = irq_data_get_irq_chip_data(d); >>> + >>> + return gpio_request(irq_to_gpio(bank, d->irq), "gpio-irq"); >>> +} >> >> irq_to_gpio(). Notice that. not my_funny_driver_irq_to_gpio(). > > OK, right. sorry for being so confused/confusing. > > Yes, that code should certainly call e.g. omap_gpio__irq_to_gpio() not > irq_to_gpio(). Probably gpio_irq_request() wants renaming to something > more like omap_gpio__irq_request() too, so the names don't look like > they'd clash with global functions. (__ added for clarity but probably > only one _ at a time) Stephen, Linus, Is the following inlined patch [1] what you were thinking that would be the right approach? With this patch an explicit call to call gpio_request() before a call to chip->irq_set_type() is needed. I've tested both with DT and without DT where a explicit call to gpio_request() is made and it works in both cases. So it shouldn't have a functional change for non-DT cases as far as I know. If you agree with [1] then I'll split in two patches (one that adds the irq_request function pointer to irq_chip and another one that adds the implementation for gpio-omap) and send as a patch-set. I just thought that it would be easier for you if I posted here an inlined patch so you could have context. Thanks a lot for your feedback and best regards, Javier [1] --- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index 685e850..e035e64 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c @@ -811,6 +811,13 @@ static void gpio_unmask_irq(struct irq_data *d) spin_unlock_irqrestore(&bank->lock, flags); } +static int omap_gpio_irq_request(struct irq_data *d) +{ + struct gpio_bank *bank = irq_data_get_irq_chip_data(d); + + return omap_gpio_request(&bank->chip, d->hwirq); +} + static struct irq_chip gpio_irq_chip = { .name = "GPIO", .irq_shutdown = gpio_irq_shutdown, @@ -819,6 +826,7 @@ static struct irq_chip gpio_irq_chip = { .irq_unmask = gpio_unmask_irq, .irq_set_type = gpio_irq_type, .irq_set_wake = gpio_wake_enable, + .irq_request = omap_gpio_irq_request, }; /*---------------------------------------------------------------------*/ @@ -1028,6 +1036,7 @@ omap_mpuio_alloc_gc(struct gpio_bank *bank, unsigned int irq_start, ct->chip.irq_mask = irq_gc_mask_set_bit; ct->chip.irq_unmask = irq_gc_mask_clr_bit; ct->chip.irq_set_type = gpio_irq_type; + ct->chip.irq_request = omap_gpio_irq_request; if (bank->regs->wkup_en) ct->chip.irq_set_wake = gpio_wake_enable, diff --git a/include/linux/irq.h b/include/linux/irq.h index 0e8e3a6..85596cc 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -303,6 +303,7 @@ struct irq_chip { void (*irq_shutdown)(struct irq_data *data); void (*irq_enable)(struct irq_data *data); void (*irq_disable)(struct irq_data *data); + int (*irq_request)(struct irq_data *data); void (*irq_ack)(struct irq_data *data); void (*irq_mask)(struct irq_data *data); diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index fa17855..a4bd4f7 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -588,6 +588,12 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq, unmask = 1; } + if (chip->irq_request) { + ret = chip->irq_request(&desc->irq_data); + if (ret) + return ret; + } + /* caller masked out all except trigger mode flags */ ret = chip->irq_set_type(&desc->irq_data, flags);