1/* 2 * linux/arch/arm/mach-sa1100/gpio.c 3 * 4 * Generic SA-1100 GPIO handling 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 */ 10 11#include <linux/init.h> 12#include <linux/module.h> 13 14#include <asm/gpio.h> 15#include <mach/hardware.h> 16#include "generic.h" 17 18static int sa1100_gpio_get(struct gpio_chip *chip, unsigned offset) 19{ 20 return GPLR & GPIO_GPIO(offset); 21} 22 23static void sa1100_gpio_set(struct gpio_chip *chip, unsigned offset, int value) 24{ 25 if (value) 26 GPSR = GPIO_GPIO(offset); 27 else 28 GPCR = GPIO_GPIO(offset); 29} 30 31static int sa1100_direction_input(struct gpio_chip *chip, unsigned offset) 32{ 33 unsigned long flags; 34 35 local_irq_save(flags); 36 GPDR &= ~GPIO_GPIO(offset); 37 local_irq_restore(flags); 38 return 0; 39} 40 41static int sa1100_direction_output(struct gpio_chip *chip, unsigned offset, int value) 42{ 43 unsigned long flags; 44 45 local_irq_save(flags); 46 sa1100_gpio_set(chip, offset, value); 47 GPDR |= GPIO_GPIO(offset); 48 local_irq_restore(flags); 49 return 0; 50} 51 52static struct gpio_chip sa1100_gpio_chip = { 53 .label = "gpio", 54 .direction_input = sa1100_direction_input, 55 .direction_output = sa1100_direction_output, 56 .set = sa1100_gpio_set, 57 .get = sa1100_gpio_get, 58 .base = 0, 59 .ngpio = GPIO_MAX + 1, 60}; 61 62void __init sa1100_init_gpio(void) 63{ 64 gpiochip_add(&sa1100_gpio_chip); 65} 66