All of lore.kernel.org
 help / color / mirror / Atom feed
From: Javier Martinez Canillas <javier.martinez@collabora.co.uk>
To: Stephen Warren <swarren@wwwdotorg.org>
Cc: Mark Brown <broonie@kernel.org>,
	Lars Poeschel <poeschel@lemonage.de>,
	Linus Walleij <linus.walleij@linaro.org>,
	Lars Poeschel <larsi@wh2.tu-dresden.de>,
	Grant Likely <grant.likely@linaro.org>,
	"linux-gpio@vger.kernel.org" <linux-gpio@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Ian Campbell <ian.campbell@citrix.com>,
	Kumar Gala <galak@codeaurora.org>,
	Pawel Moll <pawel.moll@arm.com>,
	Tomasz Figa <tomasz.figa@gmail.com>,
	Enric Balletbo i Serra <eballetbo@gmail.com>,
	Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>,
	Santosh Shilimkar <santosh.shilimkar@ti.com>,
	Kevin Hilman <khilman@linaro.org>, Balaji T K <balajitk@ti.com>,
	Tony Lindgren <tony@atomide.com>,
	Jon Hunter <jgchunter@gmail.com>,
	joelf@ti.com
Subject: Re: [PATCH v3] gpio: interrupt consistency check for OF GPIO IRQs
Date: Wed, 11 Sep 2013 02:52:41 +0200	[thread overview]
Message-ID: <522FBED9.9000305@collabora.co.uk> (raw)
In-Reply-To: <522F9E6C.2010905@wwwdotorg.org>

On 09/11/2013 12:34 AM, Stephen Warren wrote:
> On 09/10/2013 03:37 PM, Mark Brown wrote:
>> On Tue, Sep 10, 2013 at 01:53:47PM -0600, Stephen Warren wrote:
>> 
>>> Doesn't this patch call gpio_request() on the GPIO first, and
>>> hence prevent the driver's own gpio_request() from succeeding,
>>> since the GPIO is already requested? If this is not a problem, it
>>> sounds like a bug in gpio_request() not ensuring mutual exclusion
>>> for the GPIO.
>> 
>> Or at the very least something that's likely to break in the
>> future.
> 
> Looking at the GPIO code, it already prevents double-requests:
> 
>>         if (test_and_set_bit(FLAG_REQUESTED, &desc->flags) == 0) {
>>                 desc_set_label(desc, label ? : "?");
>>                 status = 0;
>>         } else {
>>                 status = -EBUSY;
>>                 module_put(chip->owner);
>>                 goto done;
>>         }
> 
> And I tested it in practice, and it really does fail.
> 

I'm a bit confused now. Doesn't the fact that gpio_request() prevents
double-requests mean that the use-case that you say that have not been covered
by this patch can't actually happen?

I mean, if when using board files an explicit call to gpio_request() is made by
platform code then a driver can't call gpio_request() for the same gpio. So this
patch shouldn't cause any regression since is just auto-requesting a GPIO when
is mapped as an IRQ in a DT which basically will be the same that was made by
board files before.

To give you an example of an use-case that this patch is trying to solve:

OMAP SoCs have a General-Purpose Memory Controller (GPMC) that can be used to
interface with Pseudo-SRAM devices such as ethernet controllers. So with board
files we currently have this (arch/arm/mach-omap2/gpmc-smsc911x.c):

void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *gpmc_cfg)
{
       ....
       if (gpio_request_one(gpmc_cfg->gpio_irq, GPIOF_IN, "smsc911x irq")) {
                pr_err("Failed to request IRQ GPIO%d\n", gpmc_cfg->gpio_irq);
                goto free1;
       }
       ....
       gpmc_smsc911x_resources[1].start = gpio_to_irq(gpmc_cfg->gpio_irq);
       ...
       pdev = platform_device_register_resndata(NULL, "smsc911x", gpmc_cfg->id,
                 gpmc_smsc911x_resources, ARRAY_SIZE(gpmc_smsc911x_resources),
                 &gpmc_smsc911x_config, sizeof(gpmc_smsc911x_config));
       ...
}

and later in the smsc911x ethernet driver probe function:

static int smsc911x_drv_probe(struct platform_device *pdev)
{
       retval = request_irq(dev->irq, smsc911x_irqhandler,
                             irq_flags | IRQF_SHARED, dev->name, dev);
       ...
       irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
       ...
       dev->irq = irq_res->start;
       ...
       retval = request_irq(dev->irq, smsc911x_irqhandler,
                             irq_flags | IRQF_SHARED, dev->name, dev);
       ...
}

The driver just knows that it has to get the IRQ from a struct resource and it
doesn't care if that is a real IRQ line from an interrupt controller or a GPIO
pin mapped as an IRQ. With linus patch I just can define on a DT (GPMC
properties omitted for simplicity):

        ethernet@5,0 {
                pinctrl-names = "default";
                pinctrl-0 = <&smsc911x_pins>;
                compatible = "smsc,lan9221", "smsc,lan9115";
                reg = <5 0 0xff>;
                bank-width = <2>;
                interrupt-parent = <&gpio6>;
                interrupts = <16 8>;
                vmmc-supply = <&vddvario>;
                vmmc_aux-supply = <&vdd33a>;
                reg-io-width = <4>;

                smsc,save-mac-address;
        };

and it will just work. Without Linus patch the call to request_irq() will fail
because a call to gpio_request() has not been made (and thus the GPIO bank was
not enabled).

Thanks a lot and best regards,
Javier

  reply	other threads:[~2013-09-11  0:53 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-26 14:07 [PATCH v3] gpio: interrupt consistency check for OF GPIO IRQs Lars Poeschel
2013-08-27 20:17 ` Stephen Warren
2013-08-27 20:38   ` Santosh Shilimkar
2013-08-27 20:38     ` Santosh Shilimkar
2013-08-29 19:26   ` Linus Walleij
2013-08-30  0:24     ` Javier Martinez Canillas
2013-08-30 19:55       ` Stephen Warren
2013-09-02  9:25         ` Lars Poeschel
2013-09-03 17:27           ` Stephen Warren
2013-09-04  9:05             ` Lars Poeschel
2013-09-04 20:16               ` Stephen Warren
2013-09-09 16:19                 ` Mark Brown
2013-09-10  8:47                   ` Lars Poeschel
2013-09-10 13:56                     ` Javier Martinez Canillas
2013-09-10 19:52                       ` Stephen Warren
2013-09-10 21:23                         ` Javier Martinez Canillas
2013-09-11  5:24                           ` Joel Fernandes
2013-09-11  5:24                             ` Joel Fernandes
2013-09-10 19:53                     ` Stephen Warren
2013-09-10 21:37                       ` Mark Brown
2013-09-10 22:34                         ` Stephen Warren
2013-09-11  0:52                           ` Javier Martinez Canillas [this message]
2013-09-11 19:43                             ` Stephen Warren
     [not found]                               ` <5230C7F6.3080803-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2013-09-16 16:03                                 ` Lars Poeschel
2013-09-16 16:03                                   ` Lars Poeschel
2013-09-16 17:09                                   ` Stephen Warren
     [not found]                                     ` <52373B34.4060709-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2013-09-22 17:01                                       ` Javier Martinez Canillas
2013-09-22 17:01                                         ` Javier Martinez Canillas
2013-09-23 20:01                                     ` Linus Walleij
2013-09-23 20:01                                       ` Linus Walleij
2013-09-23 20:21                                       ` Stephen Warren
2013-09-23 20:21                                         ` Stephen Warren
2013-09-24  8:31                                         ` Linus Walleij
2013-09-24  8:31                                           ` Linus Walleij
     [not found]                                           ` <CACRpkdZ7E7MGppbkTiObvTDHdmphnbysMKVc1OZjsPXKVuKttQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-09-24 16:59                                             ` Stephen Warren
2013-09-24 16:59                                               ` Stephen Warren
     [not found]                                               ` <5241C4DB.9090200-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2013-10-11  8:16                                                 ` Linus Walleij
2013-10-11  8:16                                                   ` Linus Walleij
2013-09-23 19:41                                 ` Linus Walleij
2013-09-23 19:41                                   ` Linus Walleij
2013-09-23 19:53                               ` Linus Walleij
2013-09-23 20:12                                 ` Stephen Warren
2013-09-24  8:26                                   ` Linus Walleij
     [not found]                                     ` <CACRpkdZKqW9veHzc1Rgj4oKsjGRATk+Sz8vJaP3EfT4de+bjQA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-09-24 16:56                                       ` Stephen Warren
2013-09-24 16:56                                         ` Stephen Warren
     [not found]                   ` <20130909161924.GT29403-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2013-11-11 18:28                     ` Gerlando Falauto
2013-11-11 18:28                       ` Gerlando Falauto
2013-11-11 18:53                       ` Stephen Warren
     [not found]                         ` <528127B2.80109-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2013-11-11 19:17                           ` Gerlando Falauto
2013-11-11 19:17                             ` Gerlando Falauto
2013-11-11 19:33                             ` Stephen Warren
2013-11-11 19:33                               ` Stephen Warren
2013-11-11 19:38                               ` Tomasz Figa
2013-11-11 19:38                                 ` Tomasz Figa
2013-11-12 10:29                               ` Linus Walleij
2013-11-12 10:29                                 ` Linus Walleij
2013-09-03 12:43         ` Linus Walleij
2013-09-03 17:32           ` Stephen Warren
2013-08-30 19:53     ` Stephen Warren
2013-09-02  9:38       ` Lars Poeschel
2013-09-03 17:29         ` Stephen Warren
2013-09-04  9:21           ` Lars Poeschel
2013-09-04 20:18             ` Stephen Warren
2013-09-03 12:35       ` Linus Walleij
2013-09-03 17:29         ` Stephen Warren
2013-09-04  8:35           ` Lars Poeschel
2013-09-04 20:13             ` Stephen Warren
     [not found]       ` <CAK7N6vrEXVyLHpY-v+SJ668hC0wvHrWOgtviAQ+w5yis7p_E4Q@mail.gmail.com>
2013-09-03 17:22         ` Stephen Warren
2013-08-29 15:14 ` Strashko, Grygorii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=522FBED9.9000305@collabora.co.uk \
    --to=javier.martinez@collabora.co.uk \
    --cc=balajitk@ti.com \
    --cc=broonie@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=eballetbo@gmail.com \
    --cc=galak@codeaurora.org \
    --cc=grant.likely@linaro.org \
    --cc=ian.campbell@citrix.com \
    --cc=jgchunter@gmail.com \
    --cc=joelf@ti.com \
    --cc=khilman@linaro.org \
    --cc=larsi@wh2.tu-dresden.de \
    --cc=linus.walleij@linaro.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=pawel.moll@arm.com \
    --cc=plagnioj@jcrosoft.com \
    --cc=poeschel@lemonage.de \
    --cc=santosh.shilimkar@ti.com \
    --cc=swarren@wwwdotorg.org \
    --cc=tomasz.figa@gmail.com \
    --cc=tony@atomide.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.