2007-02-12 11:53:11 +03:00
# ifndef _ASM_GENERIC_GPIO_H
# define _ASM_GENERIC_GPIO_H
2008-05-24 00:04:58 +04:00
# include <linux/types.h>
2008-07-29 02:46:38 +04:00
# include <linux/errno.h>
2008-05-24 00:04:58 +04:00
2008-07-25 12:46:11 +04:00
# ifdef CONFIG_GPIOLIB
2008-02-05 09:28:20 +03:00
2008-05-24 00:04:58 +04:00
# include <linux/compiler.h>
2008-02-05 09:28:20 +03:00
/* Platforms may implement their GPIO interface with library code,
* at a small performance cost for non - inlined operations and some
* extra memory ( for code and for per - GPIO table entries ) .
*
* While the GPIO programming interface defines valid GPIO numbers
* to be in the range 0. . MAX_INT , this library restricts them to the
2008-07-27 02:22:26 +04:00
* smaller range 0. . ARCH_NR_GPIOS - 1.
2008-02-05 09:28:20 +03:00
*/
# ifndef ARCH_NR_GPIOS
# define ARCH_NR_GPIOS 256
# endif
2008-04-28 13:14:46 +04:00
static inline int gpio_is_valid ( int number )
{
/* only some non-negative numbers are valid */
return ( ( unsigned ) number ) < ARCH_NR_GPIOS ;
}
2008-02-05 09:28:20 +03:00
struct seq_file ;
2008-04-28 13:14:44 +04:00
struct module ;
2008-02-05 09:28:20 +03:00
/**
* struct gpio_chip - abstract a GPIO controller
* @ label : for diagnostics
gpio: sysfs interface
This adds a simple sysfs interface for GPIOs.
/sys/class/gpio
/export ... asks the kernel to export a GPIO to userspace
/unexport ... to return a GPIO to the kernel
/gpioN ... for each exported GPIO #N
/value ... always readable, writes fail for input GPIOs
/direction ... r/w as: in, out (default low); write high, low
/gpiochipN ... for each gpiochip; #N is its first GPIO
/base ... (r/o) same as N
/label ... (r/o) descriptive, not necessarily unique
/ngpio ... (r/o) number of GPIOs; numbered N .. N+(ngpio - 1)
GPIOs claimed by kernel code may be exported by its owner using a new
gpio_export() call, which should be most useful for driver debugging.
Such exports may optionally be done without a "direction" attribute.
Userspace may ask to take over a GPIO by writing to a sysfs control file,
helping to cope with incomplete board support or other "one-off"
requirements that don't merit full kernel support:
echo 23 > /sys/class/gpio/export
... will gpio_request(23, "sysfs") and gpio_export(23);
use /sys/class/gpio/gpio-23/direction to (re)configure it,
when that GPIO can be used as both input and output.
echo 23 > /sys/class/gpio/unexport
... will gpio_free(23), when it was exported as above
The extra D-space footprint is a few hundred bytes, except for the sysfs
resources associated with each exported GPIO. The additional I-space
footprint is about two thirds of the current size of gpiolib (!). Since
no /dev node creation is involved, no "udev" support is needed.
Related changes:
* This adds a device pointer to "struct gpio_chip". When GPIO
providers initialize that, sysfs gpio class devices become children of
that device instead of being "virtual" devices.
* The (few) gpio_chip providers which have such a device node have
been updated.
* Some gpio_chip drivers also needed to update their module "owner"
field ... for which missing kerneldoc was added.
* Some gpio_chips don't support input GPIOs. Those GPIOs are now
flagged appropriately when the chip is registered.
Based on previous patches, and discussion both on and off LKML.
A Documentation/ABI/testing/sysfs-gpio update is ready to submit once this
merges to mainline.
[akpm@linux-foundation.org: a few maintenance build fixes]
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Cc: Guennadi Liakhovetski <g.liakhovetski@pengutronix.de>
Cc: Greg KH <greg@kroah.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-07-25 12:46:07 +04:00
* @ dev : optional device providing the GPIOs
* @ owner : helps prevent removal of modules exporting active GPIOs
2008-10-16 09:03:16 +04:00
* @ request : optional hook for chip - specific activation , such as
* enabling module power and clock ; may sleep
* @ free : optional hook for chip - specific deactivation , such as
* disabling module power and clock ; may sleep
2008-02-05 09:28:20 +03:00
* @ direction_input : configures signal " offset " as input , or returns error
* @ get : returns value for signal " offset " ; for output signals this
* returns either the value actually sensed , or zero
* @ direction_output : configures signal " offset " as output , or returns error
* @ set : assigns output value for signal " offset "
2008-10-16 09:03:14 +04:00
* @ to_irq : optional hook supporting non - static gpio_to_irq ( ) mappings ;
* implementation may not sleep
2008-02-05 09:28:20 +03:00
* @ dbg_show : optional routine to show contents in debugfs ; default code
* will be used when this is omitted , but custom code can show extra
* state ( such as pullup / pulldown configuration ) .
* @ base : identifies the first GPIO number handled by this chip ; or , if
* negative during registration , requests dynamic ID allocation .
* @ ngpio : the number of GPIOs handled by this controller ; the last GPIO
* handled is ( base + ngpio - 1 ) .
* @ can_sleep : flag must be set iff get ( ) / set ( ) methods sleep , as they
* must while accessing GPIO expander chips over I2C or SPI
*
* A gpio_chip can help platforms abstract various sources of GPIOs so
* they can all be accessed through a common programing interface .
* Example sources would be SOC controllers , FPGAs , multifunction
* chips , dedicated GPIO expanders , and so on .
*
* Each chip controls a number of signals , identified in method calls
* by " offset " values in the range 0. . ( @ ngpio - 1 ) . When those signals
* are referenced through calls like gpio_get_value ( gpio ) , the offset
* is calculated by subtracting @ base from the gpio number .
*/
struct gpio_chip {
2008-10-16 09:03:10 +04:00
const char * label ;
gpio: sysfs interface
This adds a simple sysfs interface for GPIOs.
/sys/class/gpio
/export ... asks the kernel to export a GPIO to userspace
/unexport ... to return a GPIO to the kernel
/gpioN ... for each exported GPIO #N
/value ... always readable, writes fail for input GPIOs
/direction ... r/w as: in, out (default low); write high, low
/gpiochipN ... for each gpiochip; #N is its first GPIO
/base ... (r/o) same as N
/label ... (r/o) descriptive, not necessarily unique
/ngpio ... (r/o) number of GPIOs; numbered N .. N+(ngpio - 1)
GPIOs claimed by kernel code may be exported by its owner using a new
gpio_export() call, which should be most useful for driver debugging.
Such exports may optionally be done without a "direction" attribute.
Userspace may ask to take over a GPIO by writing to a sysfs control file,
helping to cope with incomplete board support or other "one-off"
requirements that don't merit full kernel support:
echo 23 > /sys/class/gpio/export
... will gpio_request(23, "sysfs") and gpio_export(23);
use /sys/class/gpio/gpio-23/direction to (re)configure it,
when that GPIO can be used as both input and output.
echo 23 > /sys/class/gpio/unexport
... will gpio_free(23), when it was exported as above
The extra D-space footprint is a few hundred bytes, except for the sysfs
resources associated with each exported GPIO. The additional I-space
footprint is about two thirds of the current size of gpiolib (!). Since
no /dev node creation is involved, no "udev" support is needed.
Related changes:
* This adds a device pointer to "struct gpio_chip". When GPIO
providers initialize that, sysfs gpio class devices become children of
that device instead of being "virtual" devices.
* The (few) gpio_chip providers which have such a device node have
been updated.
* Some gpio_chip drivers also needed to update their module "owner"
field ... for which missing kerneldoc was added.
* Some gpio_chips don't support input GPIOs. Those GPIOs are now
flagged appropriately when the chip is registered.
Based on previous patches, and discussion both on and off LKML.
A Documentation/ABI/testing/sysfs-gpio update is ready to submit once this
merges to mainline.
[akpm@linux-foundation.org: a few maintenance build fixes]
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Cc: Guennadi Liakhovetski <g.liakhovetski@pengutronix.de>
Cc: Greg KH <greg@kroah.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-07-25 12:46:07 +04:00
struct device * dev ;
2008-04-28 13:14:44 +04:00
struct module * owner ;
2008-02-05 09:28:20 +03:00
2008-10-16 09:03:16 +04:00
int ( * request ) ( struct gpio_chip * chip ,
unsigned offset ) ;
void ( * free ) ( struct gpio_chip * chip ,
unsigned offset ) ;
2008-02-05 09:28:20 +03:00
int ( * direction_input ) ( struct gpio_chip * chip ,
unsigned offset ) ;
int ( * get ) ( struct gpio_chip * chip ,
unsigned offset ) ;
int ( * direction_output ) ( struct gpio_chip * chip ,
unsigned offset , int value ) ;
void ( * set ) ( struct gpio_chip * chip ,
unsigned offset , int value ) ;
2008-10-16 09:03:14 +04:00
int ( * to_irq ) ( struct gpio_chip * chip ,
unsigned offset ) ;
2008-02-05 09:28:20 +03:00
void ( * dbg_show ) ( struct seq_file * s ,
struct gpio_chip * chip ) ;
int base ;
u16 ngpio ;
unsigned can_sleep : 1 ;
gpio: sysfs interface
This adds a simple sysfs interface for GPIOs.
/sys/class/gpio
/export ... asks the kernel to export a GPIO to userspace
/unexport ... to return a GPIO to the kernel
/gpioN ... for each exported GPIO #N
/value ... always readable, writes fail for input GPIOs
/direction ... r/w as: in, out (default low); write high, low
/gpiochipN ... for each gpiochip; #N is its first GPIO
/base ... (r/o) same as N
/label ... (r/o) descriptive, not necessarily unique
/ngpio ... (r/o) number of GPIOs; numbered N .. N+(ngpio - 1)
GPIOs claimed by kernel code may be exported by its owner using a new
gpio_export() call, which should be most useful for driver debugging.
Such exports may optionally be done without a "direction" attribute.
Userspace may ask to take over a GPIO by writing to a sysfs control file,
helping to cope with incomplete board support or other "one-off"
requirements that don't merit full kernel support:
echo 23 > /sys/class/gpio/export
... will gpio_request(23, "sysfs") and gpio_export(23);
use /sys/class/gpio/gpio-23/direction to (re)configure it,
when that GPIO can be used as both input and output.
echo 23 > /sys/class/gpio/unexport
... will gpio_free(23), when it was exported as above
The extra D-space footprint is a few hundred bytes, except for the sysfs
resources associated with each exported GPIO. The additional I-space
footprint is about two thirds of the current size of gpiolib (!). Since
no /dev node creation is involved, no "udev" support is needed.
Related changes:
* This adds a device pointer to "struct gpio_chip". When GPIO
providers initialize that, sysfs gpio class devices become children of
that device instead of being "virtual" devices.
* The (few) gpio_chip providers which have such a device node have
been updated.
* Some gpio_chip drivers also needed to update their module "owner"
field ... for which missing kerneldoc was added.
* Some gpio_chips don't support input GPIOs. Those GPIOs are now
flagged appropriately when the chip is registered.
Based on previous patches, and discussion both on and off LKML.
A Documentation/ABI/testing/sysfs-gpio update is ready to submit once this
merges to mainline.
[akpm@linux-foundation.org: a few maintenance build fixes]
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Cc: Guennadi Liakhovetski <g.liakhovetski@pengutronix.de>
Cc: Greg KH <greg@kroah.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-07-25 12:46:07 +04:00
unsigned exported : 1 ;
2008-02-05 09:28:20 +03:00
} ;
extern const char * gpiochip_is_requested ( struct gpio_chip * chip ,
unsigned offset ) ;
2008-05-24 00:04:58 +04:00
extern int __must_check gpiochip_reserve ( int start , int ngpio ) ;
2008-02-05 09:28:20 +03:00
/* add/remove chips */
extern int gpiochip_add ( struct gpio_chip * chip ) ;
extern int __must_check gpiochip_remove ( struct gpio_chip * chip ) ;
/* Always use the library code for GPIO management calls,
* or when sleeping may be involved .
*/
extern int gpio_request ( unsigned gpio , const char * label ) ;
extern void gpio_free ( unsigned gpio ) ;
extern int gpio_direction_input ( unsigned gpio ) ;
extern int gpio_direction_output ( unsigned gpio , int value ) ;
extern int gpio_get_value_cansleep ( unsigned gpio ) ;
extern void gpio_set_value_cansleep ( unsigned gpio , int value ) ;
/* A platform's <asm/gpio.h> code may want to inline the I/O calls when
* the GPIO is constant and refers to some always - present controller ,
* giving direct access to chip registers and tight bitbanging loops .
*/
extern int __gpio_get_value ( unsigned gpio ) ;
extern void __gpio_set_value ( unsigned gpio , int value ) ;
extern int __gpio_cansleep ( unsigned gpio ) ;
2008-10-16 09:03:14 +04:00
extern int __gpio_to_irq ( unsigned gpio ) ;
2008-02-05 09:28:20 +03:00
gpio: sysfs interface
This adds a simple sysfs interface for GPIOs.
/sys/class/gpio
/export ... asks the kernel to export a GPIO to userspace
/unexport ... to return a GPIO to the kernel
/gpioN ... for each exported GPIO #N
/value ... always readable, writes fail for input GPIOs
/direction ... r/w as: in, out (default low); write high, low
/gpiochipN ... for each gpiochip; #N is its first GPIO
/base ... (r/o) same as N
/label ... (r/o) descriptive, not necessarily unique
/ngpio ... (r/o) number of GPIOs; numbered N .. N+(ngpio - 1)
GPIOs claimed by kernel code may be exported by its owner using a new
gpio_export() call, which should be most useful for driver debugging.
Such exports may optionally be done without a "direction" attribute.
Userspace may ask to take over a GPIO by writing to a sysfs control file,
helping to cope with incomplete board support or other "one-off"
requirements that don't merit full kernel support:
echo 23 > /sys/class/gpio/export
... will gpio_request(23, "sysfs") and gpio_export(23);
use /sys/class/gpio/gpio-23/direction to (re)configure it,
when that GPIO can be used as both input and output.
echo 23 > /sys/class/gpio/unexport
... will gpio_free(23), when it was exported as above
The extra D-space footprint is a few hundred bytes, except for the sysfs
resources associated with each exported GPIO. The additional I-space
footprint is about two thirds of the current size of gpiolib (!). Since
no /dev node creation is involved, no "udev" support is needed.
Related changes:
* This adds a device pointer to "struct gpio_chip". When GPIO
providers initialize that, sysfs gpio class devices become children of
that device instead of being "virtual" devices.
* The (few) gpio_chip providers which have such a device node have
been updated.
* Some gpio_chip drivers also needed to update their module "owner"
field ... for which missing kerneldoc was added.
* Some gpio_chips don't support input GPIOs. Those GPIOs are now
flagged appropriately when the chip is registered.
Based on previous patches, and discussion both on and off LKML.
A Documentation/ABI/testing/sysfs-gpio update is ready to submit once this
merges to mainline.
[akpm@linux-foundation.org: a few maintenance build fixes]
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Cc: Guennadi Liakhovetski <g.liakhovetski@pengutronix.de>
Cc: Greg KH <greg@kroah.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-07-25 12:46:07 +04:00
# ifdef CONFIG_GPIO_SYSFS
/*
* A sysfs interface can be exported by individual drivers if they want ,
* but more typically is configured entirely from userspace .
*/
extern int gpio_export ( unsigned gpio , bool direction_may_change ) ;
extern void gpio_unexport ( unsigned gpio ) ;
# endif /* CONFIG_GPIO_SYSFS */
# else /* !CONFIG_HAVE_GPIO_LIB */
2008-02-05 09:28:20 +03:00
2008-04-28 13:14:46 +04:00
static inline int gpio_is_valid ( int number )
{
/* only non-negative numbers are valid */
return number > = 0 ;
}
2007-02-12 11:53:11 +03:00
/* platforms that don't directly support access to GPIOs through I2C, SPI,
* or other blocking infrastructure can use these wrappers .
*/
static inline int gpio_cansleep ( unsigned gpio )
{
return 0 ;
}
static inline int gpio_get_value_cansleep ( unsigned gpio )
{
might_sleep ( ) ;
return gpio_get_value ( gpio ) ;
}
static inline void gpio_set_value_cansleep ( unsigned gpio , int value )
{
might_sleep ( ) ;
gpio_set_value ( gpio , value ) ;
}
gpio: sysfs interface
This adds a simple sysfs interface for GPIOs.
/sys/class/gpio
/export ... asks the kernel to export a GPIO to userspace
/unexport ... to return a GPIO to the kernel
/gpioN ... for each exported GPIO #N
/value ... always readable, writes fail for input GPIOs
/direction ... r/w as: in, out (default low); write high, low
/gpiochipN ... for each gpiochip; #N is its first GPIO
/base ... (r/o) same as N
/label ... (r/o) descriptive, not necessarily unique
/ngpio ... (r/o) number of GPIOs; numbered N .. N+(ngpio - 1)
GPIOs claimed by kernel code may be exported by its owner using a new
gpio_export() call, which should be most useful for driver debugging.
Such exports may optionally be done without a "direction" attribute.
Userspace may ask to take over a GPIO by writing to a sysfs control file,
helping to cope with incomplete board support or other "one-off"
requirements that don't merit full kernel support:
echo 23 > /sys/class/gpio/export
... will gpio_request(23, "sysfs") and gpio_export(23);
use /sys/class/gpio/gpio-23/direction to (re)configure it,
when that GPIO can be used as both input and output.
echo 23 > /sys/class/gpio/unexport
... will gpio_free(23), when it was exported as above
The extra D-space footprint is a few hundred bytes, except for the sysfs
resources associated with each exported GPIO. The additional I-space
footprint is about two thirds of the current size of gpiolib (!). Since
no /dev node creation is involved, no "udev" support is needed.
Related changes:
* This adds a device pointer to "struct gpio_chip". When GPIO
providers initialize that, sysfs gpio class devices become children of
that device instead of being "virtual" devices.
* The (few) gpio_chip providers which have such a device node have
been updated.
* Some gpio_chip drivers also needed to update their module "owner"
field ... for which missing kerneldoc was added.
* Some gpio_chips don't support input GPIOs. Those GPIOs are now
flagged appropriately when the chip is registered.
Based on previous patches, and discussion both on and off LKML.
A Documentation/ABI/testing/sysfs-gpio update is ready to submit once this
merges to mainline.
[akpm@linux-foundation.org: a few maintenance build fixes]
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Cc: Guennadi Liakhovetski <g.liakhovetski@pengutronix.de>
Cc: Greg KH <greg@kroah.com>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-07-25 12:46:07 +04:00
# endif /* !CONFIG_HAVE_GPIO_LIB */
# ifndef CONFIG_GPIO_SYSFS
/* sysfs support is only available with gpiolib, where it's optional */
static inline int gpio_export ( unsigned gpio , bool direction_may_change )
{
return - ENOSYS ;
}
static inline void gpio_unexport ( unsigned gpio )
{
}
# endif /* CONFIG_GPIO_SYSFS */
2008-02-05 09:28:20 +03:00
2007-02-12 11:53:11 +03:00
# endif /* _ASM_GENERIC_GPIO_H */