2007-02-12 11:53:11 +03:00
# ifndef _ASM_GENERIC_GPIO_H
# define _ASM_GENERIC_GPIO_H
2009-10-02 02:43:56 +04:00
# include <linux/kernel.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>
2011-12-12 20:25:57 +04:00
# include <linux/of.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>
2013-10-17 21:21:36 +04:00
# include <linux/gpio/driver.h>
# include <linux/gpio/consumer.h>
2008-05-24 00:04:58 +04:00
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.
2010-09-10 03:38:03 +04:00
*
* ARCH_NR_GPIOS is somewhat arbitrary ; it usually reflects the sum of
* builtin / SoC GPIOs plus a number of GPIOs on expanders ; the latter is
* actually an estimate of a board - specific value .
2008-02-05 09:28:20 +03:00
*/
# ifndef ARCH_NR_GPIOS
2016-02-16 18:40:38 +03:00
# if defined(CONFIG_ARCH_NR_GPIO) && CONFIG_ARCH_NR_GPIO > 0
# define ARCH_NR_GPIOS CONFIG_ARCH_NR_GPIO
# else
2014-09-15 18:09:44 +04:00
# define ARCH_NR_GPIOS 512
2008-02-05 09:28:20 +03:00
# endif
2016-02-16 18:40:38 +03:00
# endif
2008-02-05 09:28:20 +03:00
2010-09-10 03:38:03 +04:00
/*
* " valid " GPIO numbers are nonnegative and may be passed to
* setup routines like gpio_request ( ) . only some valid numbers
* can successfully be requested and used .
*
* Invalid GPIO numbers are useful for indicating no - such - GPIO in
* platform data and other tables .
*/
2011-05-11 03:23:07 +04:00
static inline bool gpio_is_valid ( int number )
2008-04-28 13:14:46 +04:00
{
2011-05-11 03:23:07 +04:00
return number > = 0 & & number < ARCH_NR_GPIOS ;
2008-04-28 13:14:46 +04:00
}
2009-12-09 14:53:39 +03:00
struct device ;
2011-10-24 17:24:10 +04:00
struct gpio ;
2008-02-05 09:28:20 +03:00
struct seq_file ;
2008-04-28 13:14:44 +04:00
struct module ;
2010-06-08 17:48:16 +04:00
struct device_node ;
2013-02-02 20:29:30 +04:00
struct gpio_desc ;
2008-02-05 09:28:20 +03:00
2013-10-17 21:21:36 +04:00
/* caller holds gpio_lock *OR* gpio is marked as requested */
static inline struct gpio_chip * gpio_to_chip ( unsigned gpio )
{
return gpiod_to_chip ( gpio_to_desc ( gpio ) ) ;
}
2008-02-05 09:28:20 +03:00
/* Always use the library code for GPIO management calls,
* or when sleeping may be involved .
*/
2011-01-14 04:26:46 +03:00
extern int gpio_request ( unsigned gpio , const char * label ) ;
2008-02-05 09:28:20 +03:00
extern void gpio_free ( unsigned gpio ) ;
2014-07-24 09:51:02 +04:00
static inline int gpio_direction_input ( unsigned gpio )
{
return gpiod_direction_input ( gpio_to_desc ( gpio ) ) ;
}
static inline int gpio_direction_output ( unsigned gpio , int value )
{
return gpiod_direction_output_raw ( gpio_to_desc ( gpio ) , value ) ;
}
2008-02-05 09:28:20 +03:00
2014-07-24 09:51:02 +04:00
static inline int gpio_set_debounce ( unsigned gpio , unsigned debounce )
{
return gpiod_set_debounce ( gpio_to_desc ( gpio ) , debounce ) ;
}
2010-05-27 01:42:23 +04:00
2013-10-17 21:21:36 +04:00
static inline int gpio_get_value_cansleep ( unsigned gpio )
{
return gpiod_get_raw_value_cansleep ( gpio_to_desc ( gpio ) ) ;
}
static inline void gpio_set_value_cansleep ( unsigned gpio , int value )
{
return gpiod_set_raw_value_cansleep ( gpio_to_desc ( gpio ) , value ) ;
}
2008-02-05 09:28:20 +03:00
/* 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 .
*/
2013-10-17 21:21:36 +04:00
static inline int __gpio_get_value ( unsigned gpio )
{
return gpiod_get_raw_value ( gpio_to_desc ( gpio ) ) ;
}
static inline void __gpio_set_value ( unsigned gpio , int value )
{
return gpiod_set_raw_value ( gpio_to_desc ( gpio ) , value ) ;
}
2008-02-05 09:28:20 +03:00
2013-10-17 21:21:36 +04:00
static inline int __gpio_cansleep ( unsigned gpio )
{
return gpiod_cansleep ( gpio_to_desc ( gpio ) ) ;
}
2008-02-05 09:28:20 +03:00
2013-10-17 21:21:36 +04:00
static inline int __gpio_to_irq ( unsigned gpio )
{
return gpiod_to_irq ( gpio_to_desc ( gpio ) ) ;
}
2008-02-05 09:28:20 +03:00
2011-01-14 04:26:46 +03:00
extern int gpio_request_one ( unsigned gpio , unsigned long flags , const char * label ) ;
2011-05-26 03:20:31 +04:00
extern int gpio_request_array ( const struct gpio * array , size_t num ) ;
extern void gpio_free_array ( const struct gpio * array , size_t num ) ;
2010-03-06 00:44:35 +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
/*
* A sysfs interface can be exported by individual drivers if they want ,
* but more typically is configured entirely from userspace .
*/
2013-10-17 21:21:36 +04:00
static inline int gpio_export ( unsigned gpio , bool direction_may_change )
{
return gpiod_export ( gpio_to_desc ( gpio ) , direction_may_change ) ;
}
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
2013-10-17 21:21:36 +04:00
static inline int gpio_export_link ( struct device * dev , const char * name ,
unsigned gpio )
{
return gpiod_export_link ( dev , name , gpio_to_desc ( gpio ) ) ;
}
static inline void gpio_unexport ( unsigned gpio )
{
gpiod_unexport ( gpio_to_desc ( gpio ) ) ;
}
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
2010-10-28 02:33:16 +04:00
# else /* !CONFIG_GPIOLIB */
2008-02-05 09:28:20 +03:00
2011-05-11 03:23:07 +04:00
static inline bool gpio_is_valid ( int number )
2008-04-28 13:14:46 +04:00
{
/* 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 ( ) ;
2011-10-21 05:38:32 +04:00
return __gpio_get_value ( gpio ) ;
2007-02-12 11:53:11 +03:00
}
static inline void gpio_set_value_cansleep ( unsigned gpio , int value )
{
might_sleep ( ) ;
2011-10-21 05:38:32 +04:00
__gpio_set_value ( gpio , value ) ;
2007-02-12 11:53:11 +03:00
}
2010-10-28 02:33:16 +04:00
# endif /* !CONFIG_GPIOLIB */
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
2007-02-12 11:53:11 +03:00
# endif /* _ASM_GENERIC_GPIO_H */