diff options
Diffstat (limited to 'arch/arm/mach-at91/gpio.c')
| -rw-r--r-- | arch/arm/mach-at91/gpio.c | 14 | 
1 files changed, 14 insertions, 0 deletions
diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c index a5afcf76550..d3f05aaad8b 100644 --- a/arch/arm/mach-at91/gpio.c +++ b/arch/arm/mach-at91/gpio.c @@ -29,6 +29,7 @@  #include <mach/at91_pio.h>  #include "generic.h" +#include "gpio.h"  #define MAX_NB_GPIO_PER_BANK	32 @@ -49,6 +50,7 @@ static int at91_gpiolib_request(struct gpio_chip *chip, unsigned offset);  static void at91_gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip);  static void at91_gpiolib_set(struct gpio_chip *chip, unsigned offset, int val);  static int at91_gpiolib_get(struct gpio_chip *chip, unsigned offset); +static int at91_gpiolib_get_direction(struct gpio_chip *chip, unsigned offset);  static int at91_gpiolib_direction_output(struct gpio_chip *chip,  					 unsigned offset, int val);  static int at91_gpiolib_direction_input(struct gpio_chip *chip, @@ -60,6 +62,7 @@ static int at91_gpiolib_to_irq(struct gpio_chip *chip, unsigned offset);  		.chip = {						\  			.label		  = name,			\  			.request	  = at91_gpiolib_request,	\ +			.get_direction    = at91_gpiolib_get_direction, \  			.direction_input  = at91_gpiolib_direction_input, \  			.direction_output = at91_gpiolib_direction_output, \  			.get		  = at91_gpiolib_get,		\ @@ -799,6 +802,17 @@ static int at91_gpiolib_request(struct gpio_chip *chip, unsigned offset)  	return 0;  } +static int at91_gpiolib_get_direction(struct gpio_chip *chip, unsigned offset) +{ +	struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip); +	void __iomem *pio = at91_gpio->regbase; +	unsigned mask = 1 << offset; +	u32 osr; + +	osr = __raw_readl(pio + PIO_OSR); +	return !(osr & mask); +} +  static int at91_gpiolib_direction_input(struct gpio_chip *chip,  					unsigned offset)  {  | 
