Index: linux-3.12.13/arch/arm/mach-at91/gpio.c =================================================================== --- linux-3.12.13.orig/arch/arm/mach-at91/gpio.c 2014-02-22 15:32:50.000000000 -0600 +++ linux-3.12.13/arch/arm/mach-at91/gpio.c 2014-03-07 09:13:09.931501303 -0600 @@ -294,6 +294,25 @@ } EXPORT_SYMBOL(at91_set_gpio_output); +/* + * configure pin for output and enable/disable pullup + */ +int __init_or_module at91_set_gpio_output_with_pullup(unsigned pin, int value, int use_pullup) +{ + void __iomem *pio = pin_to_controller(pin); + unsigned mask = pin_to_mask(pin); + + if (!pio) + return -EINVAL; + + __raw_writel(mask, pio + PIO_IDR); + __raw_writel(mask, pio + (use_pullup ? PIO_PUER : PIO_PUDR)); + __raw_writel(mask, pio + (value ? PIO_SODR : PIO_CODR)); + __raw_writel(mask, pio + PIO_OER); + __raw_writel(mask, pio + PIO_PER); + return 0; +} +EXPORT_SYMBOL(at91_set_gpio_output_with_pullup); /* * enable/disable the glitch filter; mostly used with IRQ handling. Index: linux-3.12.13/arch/arm/mach-at91/include/mach/gpio.h =================================================================== --- linux-3.12.13.orig/arch/arm/mach-at91/include/mach/gpio.h 2014-02-22 15:32:50.000000000 -0600 +++ linux-3.12.13/arch/arm/mach-at91/include/mach/gpio.h 2014-03-07 09:13:39.331501866 -0600 @@ -195,6 +195,7 @@ extern int __init_or_module at91_set_D_periph(unsigned pin, int use_pullup); extern int __init_or_module at91_set_gpio_input(unsigned pin, int use_pullup); extern int __init_or_module at91_set_gpio_output(unsigned pin, int value); +extern int __init_or_module at91_set_gpio_output_with_pullup(unsigned pin, int value, int use_pullup); extern int __init_or_module at91_set_deglitch(unsigned pin, int is_on); extern int __init_or_module at91_set_debounce(unsigned pin, int is_on, int div); extern int __init_or_module at91_set_multi_drive(unsigned pin, int is_on);