From: Andreas Fenkart <andreas.fenkart@streamunlimited.com>
To: Jon Hunter <jon-hunter@ti.com>
Cc: Santosh Shilimkar <santosh.shilimkar@ti.com>,
Andreas Fenkart <andreas.fenkart@streamunlimited.com>,
Kevin Hilman <khilman@deeprootsystems.com>,
grant.likely@secretlab.ca, linus.walleij@linaro.org,
linux-omap@vger.kernel.org, Daniel Mack <daniel@zonque.org>
Subject: Re: [PATCH] gpio/omap: implement irq_enable/disable using mask/unmask.
Date: Mon, 25 Mar 2013 23:24:37 +0100 [thread overview]
Message-ID: <20130325222437.GB6817@blumentopf> (raw)
In-Reply-To: <50D339F8.6050200@ti.com>
Hi,
On Thu, Dec 20, 2012 at 10:16:56AM -0600, Jon Hunter wrote:
>
> On 12/19/2012 11:59 PM, Santosh Shilimkar wrote:
> > On Monday 17 December 2012 02:57 PM, Andreas Fenkart wrote:
> >
> > Please add some changelog here too.
::
In pm suspend the omap_hsmmc driver can't detect SDIO IRQs. This
is worked around by reconfiguring the SDIO IRQ pin (dat1) as a
GPIO before entering suspend and back upon resume. This requires
low overhead functions for enable/disable of GPIO IRQs.
> >
> >> Signed-off-by: Andreas Fenkart <andreas.fenkart@streamunlimited.com>
> >> ---
> > Patch seems straight forward thought will be interesting where you found
> > the need of it.
>
> The only item that I was thinking of if the behaviour of mask/unmask
> should be different from enable/disable?
>
> When a gpio interrupt is masked, the gpio event will still be latched in
> the interrupt status register so when you unmask it later you may get an
> interrupt straight away. However, if the interrupt is disabled then gpio
> events occurring will not be latched/stored.
Thanks for clarification.
The HW seems to support this, see Fig 25-3 in the manual.
https://www.google.com/search?q=spruh73c
This problem though, applies only to edge triggered irqs.
In the case of level triggered the mask/unmask implementation
clears irqs upon resume. This is safe, because if the level still
indicates irq, it will be latched again and if not, the HW needs
no service.
For edge triggered the current implementation of mask/unmask
seems to behave more like enable/disable:
- irq detection is disabled during the masking period, which is
like disable according above description. But leaves a small
window for latching another one that is not served immediately,
which is more like masking
static void gpio_mask_irq(struct irq_data *d)
{
spin_lock_irqsave(&bank->lock, flags);
_set_gpio_irqenable(bank, gpio, 0);
<--- new irqs latched here --->
_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE);
spin_unlock_irqrestore(&bank->lock, flags);
}
- does not clear latched irqs upon resume. So not all irq raised
after unmask are new, on the other hand some irqs that
occured during the masking period might be lost.
> I am also interested in the need for this, and if we should have a true
> enable/disable here.
Since SDIO irqs are level triggered, I'm still okay with my patch.
For edge triggered though, it probably needs some more thoughts.
Suggestions? Should I split masking/disabling functions and make
them behave properly according above semantics or are you fine with
the interim solution of mapping enable/disable to mask/unmask?
rgds,
Andi
> >> drivers/gpio/gpio-omap.c | 2 ++
> >> 1 file changed, 2 insertions(+)
> >>
> >> diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
> >> index d335af1..c1951ec 100644
> >> --- a/drivers/gpio/gpio-omap.c
> >> +++ b/drivers/gpio/gpio-omap.c
> >> @@ -815,6 +815,8 @@ 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_disable = gpio_mask_irq,
> >> + .irq_enable = gpio_unmask_irq,
> >> };
> >>
next prev parent reply other threads:[~2013-03-25 22:24 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-17 9:27 [PATCH] gpio/omap: implement irq_enable/disable using mask/unmask Andreas Fenkart
2012-12-20 5:59 ` Santosh Shilimkar
2012-12-20 16:16 ` Jon Hunter
2013-03-25 22:24 ` Andreas Fenkart [this message]
-- strict thread matches above, loose matches on Subject: below --
2013-04-12 9:13 [PATCH v2] " Andreas Fenkart
2013-04-12 9:13 ` [PATCH] " Andreas Fenkart
2013-04-12 10:19 ` Santosh Shilimkar
2013-04-12 11:07 ` Felipe Balbi
2013-04-19 19:25 ` Andreas Fenkart
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=20130325222437.GB6817@blumentopf \
--to=andreas.fenkart@streamunlimited.com \
--cc=daniel@zonque.org \
--cc=grant.likely@secretlab.ca \
--cc=jon-hunter@ti.com \
--cc=khilman@deeprootsystems.com \
--cc=linus.walleij@linaro.org \
--cc=linux-omap@vger.kernel.org \
--cc=santosh.shilimkar@ti.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).