diff options
Diffstat (limited to 'arch/arm/mach-ks8695/gpio.c')
-rw-r--r-- | arch/arm/mach-ks8695/gpio.c | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/arch/arm/mach-ks8695/gpio.c b/arch/arm/mach-ks8695/gpio.c index 9aecf0c4b8b..55fbf7111a5 100644 --- a/arch/arm/mach-ks8695/gpio.c +++ b/arch/arm/mach-ks8695/gpio.c @@ -2,6 +2,8 @@ * arch/arm/mach-ks8695/gpio.c * * Copyright (C) 2006 Andrew Victor + * Updated to GPIOLIB, Copyright 2008 Simtec Electronics + * Daniel Silverstone <dsilvers@simtec.co.uk> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -35,7 +37,7 @@ * Configure a GPIO line for either GPIO function, or its internal * function (Interrupt, Timer, etc). */ -static void __init_or_module ks8695_gpio_mode(unsigned int pin, short gpio) +static void ks8695_gpio_mode(unsigned int pin, short gpio) { unsigned int enable[] = { IOPC_IOEINT0EN, IOPC_IOEINT1EN, IOPC_IOEINT2EN, IOPC_IOEINT3EN, IOPC_IOTIM0EN, IOPC_IOTIM1EN }; unsigned long x, flags; @@ -61,7 +63,7 @@ static unsigned short gpio_irq[] = { KS8695_IRQ_EXTERN0, KS8695_IRQ_EXTERN1, KS8 /* * Configure GPIO pin as external interrupt source. */ -int __init_or_module ks8695_gpio_interrupt(unsigned int pin, unsigned int type) +int ks8695_gpio_interrupt(unsigned int pin, unsigned int type) { unsigned long x, flags; @@ -94,7 +96,7 @@ EXPORT_SYMBOL(ks8695_gpio_interrupt); /* * Configure the GPIO line as an input. */ -int __init_or_module gpio_direction_input(unsigned int pin) +static int ks8695_gpio_direction_input(struct gpio_chip *gc, unsigned int pin) { unsigned long x, flags; @@ -115,13 +117,13 @@ int __init_or_module gpio_direction_input(unsigned int pin) return 0; } -EXPORT_SYMBOL(gpio_direction_input); /* * Configure the GPIO line as an output, with default state. */ -int __init_or_module gpio_direction_output(unsigned int pin, unsigned int state) +static int ks8695_gpio_direction_output(struct gpio_chip *gc, + unsigned int pin, int state) { unsigned long x, flags; @@ -150,13 +152,13 @@ int __init_or_module gpio_direction_output(unsigned int pin, unsigned int state) return 0; } -EXPORT_SYMBOL(gpio_direction_output); /* * Set the state of an output GPIO line. */ -void gpio_set_value(unsigned int pin, unsigned int state) +static void ks8695_gpio_set_value(struct gpio_chip *gc, + unsigned int pin, int state) { unsigned long x, flags; @@ -175,13 +177,12 @@ void gpio_set_value(unsigned int pin, unsigned int state) local_irq_restore(flags); } -EXPORT_SYMBOL(gpio_set_value); /* * Read the state of a GPIO line. */ -int gpio_get_value(unsigned int pin) +static int ks8695_gpio_get_value(struct gpio_chip *gc, unsigned int pin) { unsigned long x; @@ -191,21 +192,18 @@ int gpio_get_value(unsigned int pin) x = __raw_readl(KS8695_GPIO_VA + KS8695_IOPD); return (x & IOPD(pin)) != 0; } -EXPORT_SYMBOL(gpio_get_value); /* * Map GPIO line to IRQ number. */ -int gpio_to_irq(unsigned int pin) +static int ks8695_gpio_to_irq(struct gpio_chip *gc, unsigned int pin) { if (pin > KS8695_GPIO_3) /* only GPIO 0..3 can generate IRQ */ return -EINVAL; return gpio_irq[pin]; } -EXPORT_SYMBOL(gpio_to_irq); - /* * Map IRQ number to GPIO line. @@ -219,6 +217,26 @@ int irq_to_gpio(unsigned int irq) } EXPORT_SYMBOL(irq_to_gpio); +/* GPIOLIB interface */ + +static struct gpio_chip ks8695_gpio_chip = { + .label = "KS8695", + .direction_input = ks8695_gpio_direction_input, + .direction_output = ks8695_gpio_direction_output, + .get = ks8695_gpio_get_value, + .set = ks8695_gpio_set_value, + .to_irq = ks8695_gpio_to_irq, + .base = 0, + .ngpio = 16, + .can_sleep = 0, +}; + +/* Register the GPIOs */ +void ks8695_register_gpios(void) +{ + if (gpiochip_add(&ks8695_gpio_chip)) + printk(KERN_ERR "Unable to register core GPIOs\n"); +} /* .... Debug interface ..................................................... */ |