[RFC] Proposal: common kernel-wide GPIO interface

From: Chris Boot
Date: Fri Jul 28 2006 - 16:42:58 EST

Hello all,

More and more devices these days come with some sort of GPIO interface, and more and more drivers within the kernel could make use of a common way of accessing pins on such an interface, not to mention userspace apps. For example, we have the I2C, LED, and SPI subsystems that each could drive a device that's actually connected to some GPIO pins somewhere.

I propose to develop a common way of registering and accessing GPIO pins on various devices. Now I'm no hardware expert, but I do like to dabble a bit and would love to see such a system be developed. Most people tend to attach stuff like LCD displays to their parallel ports, but GPIOs are much better suited to such a purpose than a parallel port. Some (out of tree) drivers even emulate a parallel interface in order that userspace software can be fooled to use the GPIO pins as a parallel port. In my view, this is ugly.

As far as I can tell, GPIO interfaces all share the following attributes:
- One or more ports made up of one or more individual pins
- Value on input or output depending on configuration
- Various configuration bits might be available to influence the pin's behaviour
- Direction
- Push-pull / Open drain
- Pull-up enable
- Possibly others

We'll need some way of assigning pins to different functions I'm guessing as well, especially when we come to write drivers for the interface. It might not fit right into the GPIO driver, but as far as I can see the I2C, LED, and SPI subsystem drivers would need such a method to create generic GPIO<=>{I2C,LED,SPI} drivers.

As well as a kernel interface I propose a userspace interface of some kind. I'm not entirely sure what might be the most efficient way of doing this, but the current standard way seems to be to create a sysfs class interface, although an old-fashioned device interface with IOCTLs and so on might be the best way forward. Any suggestions?

As for drivers, to start with I suggest a parallel port driver as well as drivers for the NSC SCx200 and PC8736x (since I own a board with both of those).

So, if anyone likes this idea and/or has some comments, please voice your opinions! With a little guidance from the masters, I'm willing to put the effort in to code such a system, but I'd really like to hear what people involved both in the hardware side and software side of GPIOs and the kernel have to say about such an interface.

Many thanks,

Chris Boot
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/