All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Brownell <david-b@pacbell.net>
To: Pavel Machek <pavel@ucw.cz>
Cc: Linux Kernel list <linux-kernel@vger.kernel.org>,
	Andrew Morton <akpm@osdl.org>,
	Andrew Victor <andrew@sanpeople.com>,
	Bill Gatliff <bgat@billgatliff.com>,
	Haavard Skinnemoen <hskinnemoen@atmel.com>,
	jamey.hicks@hp.com, Kevin Hilman <khilman@mvista.com>,
	Nicolas Pitre <nico@cam.org>, Russell King <rmk@arm.linux.org.uk>,
	Tony Lindgren <tony@atomide.com>,
	pHilipp Zabel <philipp.zabel@gmail.com>
Subject: Re: [patch 2.6.20-rc1 1/6] GPIO core
Date: Thu, 28 Dec 2006 14:05:36 -0800	[thread overview]
Message-ID: <200612281405.37143.david-b@pacbell.net> (raw)
In-Reply-To: <20061227174953.GB4088@ucw.cz>

On Wednesday 27 December 2006 9:49 am, Pavel Machek wrote:
> Hi!

Good afternoon.  :)


> > +Identifying GPIOs
> > +-----------------
> > +GPIOs are identified by unsigned integers in the range 0..MAX_INT.  That
> > +reserves "negative" numbers for other purposes like marking signals as
> > +"not available on this board", or indicating faults.
> > +
> > +Platforms define how they use those integers, and usually #define symbols
> > +for the GPIO lines so that board-specific setup code directly corresponds
> > +to the relevant schematics.  In contrast, drivers should only use GPIO
> 
> Perhaps these should not be integers, then?

Thing is, the platforms **DO** identify them as integers.


Go through OMAP, PXA, StrongARM chip docs ... what you see is
references to GPIO numbers, 0..MAX, and oh by the way those map to
bit offsets within gpio controller banks.

When they don't identify them as integers, as with AT91, AVR32, and
S3C -- all of which present GPIOs as a lettered bank plus a bit offset
within that bank, isn't that structure familiar -- then the Linux
platform support already #defines them as integers.  The naming matches
chip docs, the _numbering_ works much the same as on OMAP, PXA, etc.

Fortunately, only OMAP1 seems to have that ugly many-to-many mapping
between chip pins and GPIOs.  On other current platforms, once you
know the GPIO number you know the pin, and vice versa.  (That does
not matter to drivers at all -- only board setup code talks "pins",
everything else talks about functions such as "GPIO" -- but hairy
board setup code can be a frelling HUGE time sink/waste.)


> typedef struct { int mydata } pin_t; prevents people from looking
> inside, allows you to typecheck, and allows expansion in (unlikely) case where
> more than int is needed? ...hotpluggable gpio pins?

If some system wants that kind of infrastructure, it can easily
implement it behind this API.  There's the IDR infrastructure, for
example, to allocate integers and map them to "more than int" data
for internal uses.

I could very easily imagine platforms that support the spinlock-safe
accessors for the SOC-integrated GPIOs, e.g. numbered below N, and
have a more dynamic "plug in your own external GPIO controller" way
to support GPIOs on i2c expanders, multifunction chips, and suchlike;
with that plugin stuff built over IDR and structures with ops vectors.


> > +Spinlock-Safe GPIO access
> > +-------------------------
> > ...
> > +
> > +	/* GPIO INPUT:  return zero or nonzero */
> > +	int gpio_get_value(unsigned gpio);
> > +
> > +	/* GPIO OUTPUT */
> > +	void gpio_set_value(unsigned gpio, int value);
> > +
> > ...
> > +
> > +The get/set calls have no error returns because "invalid GPIO" should have
> > +been reported earlier in gpio_set_direction().  However, note that not all
> > +platforms can read the value of output pins; those that can't should always
> > +return zero.  Also, these calls will be ignored for GPIOs that can't safely
> > +be accessed without sleeping (see below).
> 
> 'Silently ignored' is ugly. BUG() would be okay there.

The reason for "silently ignored" is that we really don't want to be
cluttering up the code (source or object) with logic to test for this
kind of "can't happen" failure, especially since there's not going to
be any way to _resolve_ such failures cleanly.

And per Linus' rule about BUG(), "silently ignored" is clearly better
than needlessly stopping the whole system.


And for spinlock-unsafe cases, like I2C based GPIO expanders;

> > +Platforms that support this type of GPIO distinguish them from other GPIOs
> > +by returning nonzero from this call:
> > +
> > +	int gpio_cansleep(unsigned gpio);
> 
> This is ugly :-(. But I don't see easy way around...

Me either.  Folk said earlier they want an API that can get/set
both types of GPIO, mostly to support userspace tweaking/config APIs,
but the only way I can see to have one of those is to include a
predicate like gpio_cansleep() to distinguish the two types.

 
> > +GPIOs mapped to IRQs
> > +--------------------
> > +GPIO numbers are unsigned integers; so are IRQ numbers.  These make up
> > +two logically distinct namespaces (GPIO 0 need not use IRQ 0).  You can
> > +map between them using calls like:
> > +
> > +	/* map GPIO numbers to IRQ numbers */
> > +	int gpio_to_irq(unsigned gpio);
> > +
> > +	/* map IRQ numbers to GPIO numbers */
> > +	int irq_to_gpio(unsigned irq);
> 
> . Don't we have irq_t already? 

Nope.  Such a type would likely get in the way of lowlevel IRQ
dispatch code too ... 


> > +Those return either the corresponding number in the other namespace, or
> > +else a negative errno code if the mapping can't be done.  (For example,
> > +some GPIOs can't used as IRQs.)  It is an unchecked error to use a GPIO
> > +number that hasn't been marked as an input using gpio_set_direction(), or
> 
> It should be valid to do irqs on outputs,

Good point -- it _might_ be valid to do that, on some platforms.
Such things have been used as a software IRQ trigger, which can
make bootstrapping some things easier.

That's not incompatible with it being an error for portable code to
try that, or with refusing to check it so that those platforms don't
needlessly cause trouble!

If I submit a patch against 2.6.20-rc2-mm1 to address Russell's
dislike of irq_to_gpio() calls (as yet un-explained), I'll try to
remember to mention this platform-specific issue.


> if those outputs are really 
> tristates (wire-or or how you call it?)?

That's not tristate.  An example of wire-OR would be a signal that
any of three different sources could drive high, but nobody drives
low (except an external pulldown).  Contrariwise, and maybe much
more common because it's what I2C does, is a signal that any source
can drive low, but nobody drives high (except one external pullup).

In both cases, drivers can notice an interesting case:  the value
they read from the pin doesn't match what they expected, meaning
that some other component is driving the signal.

Those kinds of mechanism support bidirectional I/O on one pin.
Examples include the I2C clock stretch mechanism, and also its
multi-master arbitration; and ISTR card address assignment with
pure MMC (if anyone really uses that in bus mode).

- Dave

  reply	other threads:[~2006-12-28 22:05 UTC|newest]

Thread overview: 103+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-11-11 23:41 [patch/rfc 2.6.19-rc5] arch-neutral GPIO calls David Brownell
2006-11-12  1:27 ` H. Peter Anvin
2006-11-12  3:04   ` David Brownell
2006-11-12  3:15     ` H. Peter Anvin
2006-11-13  3:30 ` Bill Gatliff
2006-11-13 17:38 ` Paul Mundt
2006-11-13 17:56   ` Thiago Galesi
2006-11-13 19:25     ` David Brownell
2006-11-13 19:50       ` Bill Gatliff
2006-11-13 18:19   ` Bill Gatliff
2006-11-13 18:38     ` Paul Mundt
2006-11-13 19:29       ` Bill Gatliff
2006-11-13 20:15         ` Paul Mundt
2006-11-20 21:49           ` David Brownell
2006-11-21  3:44             ` Bill Gatliff
2006-11-21  4:45               ` David Brownell
2006-11-21  5:09                 ` Bill Gatliff
2006-11-21  5:35                   ` David Brownell
2006-11-21  6:09                     ` Paul Mundt
2006-11-21 18:13                       ` David Brownell
2006-11-22  3:36                         ` Bill Gatliff
2006-11-22  3:55                           ` Paul Mundt
2006-11-22  4:45                           ` [Bulk] " David Brownell
2006-11-22  4:47                             ` Bill Gatliff
2006-11-21 15:57                     ` Bill Gatliff
2006-11-23  0:40                       ` David Brownell
2006-11-30  6:57                         ` pHilipp Zabel
2006-11-30  7:29                           ` pHilipp Zabel
2006-11-30 22:24                           ` David Brownell
2006-11-20 22:15           ` David Brownell
2006-11-21  2:56             ` Bill Gatliff
2006-11-13 20:00       ` David Brownell
2006-11-13 21:30         ` Paul Mundt
2006-11-14  3:21           ` David Brownell
2006-11-13 19:21   ` David Brownell
2006-11-13 19:43     ` Bill Gatliff
2006-11-13 20:15       ` David Brownell
2006-11-13 20:26         ` Bill Gatliff
2006-11-13 20:53           ` David Brownell
2006-11-13 20:58             ` Bill Gatliff
2006-11-13 20:29         ` Bill Gatliff
2006-11-16 14:54 ` [RFC/PATCH] arch-neutral GPIO calls: AVR32 implementation Haavard Skinnemoen
2006-11-20 21:47   ` David Brownell
2006-11-21  3:11     ` Bill Gatliff
2006-11-21  5:06       ` David Brownell
2006-11-21  5:51         ` Bill Gatliff
2006-11-21 18:19           ` David Brownell
2006-11-21  9:11     ` Haavard Skinnemoen
2006-11-21 19:03       ` David Brownell
2006-11-28 12:36         ` [RFC/PATCH] arch-neutral GPIO calls: AVR32 implementation [take 2] Haavard Skinnemoen
2006-11-30 19:05           ` David Brownell
2006-12-01  9:51             ` Haavard Skinnemoen
2006-12-20 21:04 ` [patch 2.6.20-rc1 0/6] arch-neutral GPIO calls David Brownell
2006-12-20 21:08   ` [patch 2.6.20-rc1 1/6] GPIO core David Brownell
2006-12-27 17:49     ` Pavel Machek
2006-12-28 22:05       ` David Brownell [this message]
2006-12-29  0:27         ` Pavel Machek
2006-12-30  1:18           ` David Brownell
2007-01-01 20:55             ` Pavel Machek
2007-01-01 21:27               ` David Brownell
2007-01-02 14:18                 ` Pavel Machek
2006-12-20 21:09   ` [patch 2.6.20-rc1 2/6] OMAP GPIO wrappers David Brownell
2006-12-20 21:11   ` [patch 2.6.20-rc1 3/6] AT91 " David Brownell
2006-12-21  6:10     ` Andrew Morton
2006-12-21  6:45       ` David Brownell
2006-12-20 21:12   ` [patch 2.6.20-rc1 4/6] PXA " David Brownell
2006-12-21  6:12     ` Andrew Morton
2006-12-21  6:44       ` David Brownell
2006-12-21 14:27         ` Nicolas Pitre
2006-12-21 15:03           ` pHilipp Zabel
2006-12-21 17:25             ` Nicolas Pitre
2006-12-21 19:32               ` pHilipp Zabel
2006-12-21 20:10                 ` Nicolas Pitre
2006-12-21 20:32                   ` Bill Gatliff
2006-12-22  6:53                   ` pHilipp Zabel
2006-12-28 20:47                     ` David Brownell
2006-12-30  2:15                       ` Nicolas Pitre
2006-12-30  2:38                         ` David Brownell
2007-01-01 19:43                         ` David Brownell
2006-12-30  1:13                     ` David Brownell
2006-12-21 19:25             ` David Brownell
2006-12-27 17:53     ` Pavel Machek
2006-12-28 20:48       ` David Brownell
2006-12-28 20:50         ` Pavel Machek
2006-12-28 20:53           ` Pavel Machek
2006-12-20 21:13   ` [patch 2.6.20-rc1 5/6] SA1100 " David Brownell
2006-12-21  6:13     ` Andrew Morton
2006-12-22  7:16       ` pHilipp Zabel
2006-12-22 15:05         ` Nicolas Pitre
2006-12-30  2:21         ` David Brownell
2006-12-30  3:15           ` Nicolas Pitre
2006-12-30  6:01             ` David Brownell
2006-12-30 13:59               ` pHilipp Zabel
2006-12-30 15:08                 ` Russell King
2006-12-23 11:37     ` Russell King
2006-12-23 20:39       ` David Brownell
2006-12-27 18:24     ` Pavel Machek
2006-12-20 21:14   ` [patch 2.6.20-rc1 6/6] S3C2410 " David Brownell
2006-12-21 10:33     ` Arnaud Patard
2006-12-21 15:29       ` pHilipp Zabel
2006-12-23 11:40       ` Russell King
2006-12-20 23:30   ` [patch 2.6.20-rc1 0/6] arch-neutral GPIO calls Håvard Skinnemoen
2006-12-20 23:46     ` 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=200612281405.37143.david-b@pacbell.net \
    --to=david-b@pacbell.net \
    --cc=akpm@osdl.org \
    --cc=andrew@sanpeople.com \
    --cc=bgat@billgatliff.com \
    --cc=hskinnemoen@atmel.com \
    --cc=jamey.hicks@hp.com \
    --cc=khilman@mvista.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nico@cam.org \
    --cc=pavel@ucw.cz \
    --cc=philipp.zabel@gmail.com \
    --cc=rmk@arm.linux.org.uk \
    --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.