From 72880ad866c21badace4d8026c1e58f2fde087fb Mon Sep 17 00:00:00 2001 From: Daniel Silverstone Date: Sat, 13 Dec 2008 20:44:12 +0000 Subject: [ARM] KS8695: Fixup the KS8695 GPIO to be GPIOLIB This patch is as small a change as possible to the KS8695 GPIO layer to use GPIOLIB to allow the generic GPIO expanders and the like to be compiled. As a side-effect, we also remove __init_or_module from several functions which could be called by drivers such as i2c-gpio which could plausibly be compiled into a non-modular kernel. Signed-off-by: Daniel Silverstone Signed-off-by: Vincent Sanders Signed-off-by: Ben Dooks --- arch/arm/mach-ks8695/gpio.c | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) (limited to 'arch/arm/mach-ks8695/gpio.c') diff --git a/arch/arm/mach-ks8695/gpio.c b/arch/arm/mach-ks8695/gpio.c index 9aecf0c4b8b..26d6346f38f 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 * * 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,7 +192,6 @@ 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); /* @@ -219,6 +219,25 @@ 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, + .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 ..................................................... */ -- cgit v1.2.3 From 7ef71320eba8933275be10bfa44e083bec95b3f1 Mon Sep 17 00:00:00 2001 From: Ben Dooks Date: Sat, 13 Dec 2008 20:44:13 +0000 Subject: [ARM] KS8695: Add GPIO to IRQ mapping function Use the GPIOlib .to_irq call to map KS8695 GPIOs to the relevant IRQ line. Signed-off-by: Ben Dooks --- arch/arm/mach-ks8695/gpio.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'arch/arm/mach-ks8695/gpio.c') diff --git a/arch/arm/mach-ks8695/gpio.c b/arch/arm/mach-ks8695/gpio.c index 26d6346f38f..55fbf7111a5 100644 --- a/arch/arm/mach-ks8695/gpio.c +++ b/arch/arm/mach-ks8695/gpio.c @@ -197,15 +197,13 @@ static int ks8695_gpio_get_value(struct gpio_chip *gc, unsigned int pin) /* * 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. @@ -227,6 +225,7 @@ static struct gpio_chip ks8695_gpio_chip = { .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, -- cgit v1.2.3