mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: David Brownell <david-b@pacbell.net>
To: "Francis Moreau" <francis.moro@gmail.com>
Cc: linux-kernel@vger.kernel.org
Subject: Re: question on generic gpio interface
Date: Fri, 13 Apr 2007 15:43:32 -0700	[thread overview]
Message-ID: <200704131543.32976.david-b@pacbell.net> (raw)
In-Reply-To: <38b2ab8a0704131351la5085vf0ab58e85cf49879@mail.gmail.com>

On Friday 13 April 2007 1:51 pm, Francis Moreau wrote:
> Hi,
> 
> I'm trying to port my old gpio code to the generic one to see if it
> can fit my needs.

Good .. this is more like an IRQ question though.


> The gpio controller is a home made one and has a really weird
> interface. It has several registers to read the gpio status, to
> configure gpio directions, or to configure if a gpio can trigger an
> interrupt and on which event (level or edge). All gpios use the same
> IRQ and a gpio controller register allows to read which gpio has
> triggered the interrupt.

I'll trust you on "weird", but that sounds quite typical in
terms of functionality.  You'll find that most system-on-chip
GPIO controllers act the same way.

IRQ logic on that platform must do a few things, like:

 - NR_IRQS includes the N interrupts triggered from that chip,
   and their numbers probably fit right sometimes after the
   core set of IRQs (which might include SOC GPIO irqs);

 - You'll provide an irq_chip for this controller, and it will
   handle the relevant irq operations (set trigger type, mask,
   unmask etc);

 - When configuring the IRQ handler for that "same IRQ", you'll
   set it up to use a chained handler that you provide, which
   reads the register to see which gpio(s) triggered the IRQ,
   maybe acks it (if just reading that register isn't enough),
   and then calls whatever handler was instaled for that GPIO.

If that's not familiar to you, look at arch/arm/mach-at91/gpio.c
or arch/arm/mach-pxa/irq.c or arch/arm/plat-omap/gpio.c or a
number of other similar files showing how the "toplevel" IRQ
logic will demux from a "one of these N GPIOs" interrupt down
to the handler for that particular IRQ.


> Now the question is how should irq_to_gpio()  work ?

Normally irq_to_gpio() and gpio_to_irq() are simple arithmetic
operations.  If both identifiers start at zero, irq_to_gpio()
would probably subtract a constant, and gpio_to_irq() would add
the same constant.


> Is it supposed to be called only when a gpio interrupt occure ?

It's not the most commonly used operation, and exactly when
it's used would be the choice of whatever code uses it.  That
would be one common answer ... e.g. for GPIOs that only allow
"both edges" triggering, the driver may actually care about the
level so it's got to check that with gpio_get_value().

If the IRQ handler doesn't like the notion of subtracting that
constant at that time, it's easy to cache the answer ahead of
time.  (Though it might not be a net win to spend extra memory
that way.)

 
> Another question is how can I specify if a gpio interrupt trigger on
> level or on edge ?

That's handled in the irq_chip.set_type() method.  See the above
referenced source files for examples.

- Dave


> thanks
> -- 
> Francis
> 

  reply	other threads:[~2007-04-13 22:43 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-04-13 20:51 Francis Moreau
2007-04-13 22:43 ` David Brownell [this message]
2007-04-16 10:03   ` Francis Moreau
2007-04-16 13:46     ` David Brownell
2007-04-17  7:04       ` Francis Moreau
2007-04-17 16:42         ` David Brownell
2007-04-19  8:05           ` Francis Moreau
2007-04-19 18:06             ` David Brownell

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=200704131543.32976.david-b@pacbell.net \
    --to=david-b@pacbell.net \
    --cc=francis.moro@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    /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

all inboxes | Powered by JetHome®