Commit 72880ad8 authored by Daniel Silverstone's avatar Daniel Silverstone Committed by Ben Dooks

[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: default avatarDaniel Silverstone <dsilvers@simtec.co.uk>
Signed-off-by: default avatarVincent Sanders <vince@simtec.co.uk>
Signed-off-by: default avatarBen Dooks <ben-linux@fluff.org>
parent fbd62710
...@@ -397,6 +397,7 @@ config ARCH_KS8695 ...@@ -397,6 +397,7 @@ config ARCH_KS8695
bool "Micrel/Kendin KS8695" bool "Micrel/Kendin KS8695"
select CPU_ARM922T select CPU_ARM922T
select GENERIC_GPIO select GENERIC_GPIO
select ARCH_REQUIRE_GPIOLIB
help help
Support for Micrel/Kendin KS8695 "Centaur" (ARM922T) based Support for Micrel/Kendin KS8695 "Centaur" (ARM922T) based
System-on-Chip devices. System-on-Chip devices.
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <asm/mach/irq.h> #include <asm/mach/irq.h>
#include <mach/gpio.h>
#include <mach/devices.h> #include <mach/devices.h>
#include "generic.h" #include "generic.h"
...@@ -39,6 +40,8 @@ static void __init micrel_init(void) ...@@ -39,6 +40,8 @@ static void __init micrel_init(void)
{ {
printk(KERN_INFO "Micrel KS8695 Development Board initializing\n"); printk(KERN_INFO "Micrel KS8695 Development Board initializing\n");
ks8695_register_gpios();
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
ks8695_init_pci(&micrel_pci); ks8695_init_pci(&micrel_pci);
#endif #endif
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
* arch/arm/mach-ks8695/gpio.c * arch/arm/mach-ks8695/gpio.c
* *
* Copyright (C) 2006 Andrew Victor * 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 * 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 * it under the terms of the GNU General Public License version 2 as
...@@ -35,7 +37,7 @@ ...@@ -35,7 +37,7 @@
* Configure a GPIO line for either GPIO function, or its internal * Configure a GPIO line for either GPIO function, or its internal
* function (Interrupt, Timer, etc). * 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 int enable[] = { IOPC_IOEINT0EN, IOPC_IOEINT1EN, IOPC_IOEINT2EN, IOPC_IOEINT3EN, IOPC_IOTIM0EN, IOPC_IOTIM1EN };
unsigned long x, flags; unsigned long x, flags;
...@@ -61,7 +63,7 @@ static unsigned short gpio_irq[] = { KS8695_IRQ_EXTERN0, KS8695_IRQ_EXTERN1, KS8 ...@@ -61,7 +63,7 @@ static unsigned short gpio_irq[] = { KS8695_IRQ_EXTERN0, KS8695_IRQ_EXTERN1, KS8
/* /*
* Configure GPIO pin as external interrupt source. * 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; unsigned long x, flags;
...@@ -94,7 +96,7 @@ EXPORT_SYMBOL(ks8695_gpio_interrupt); ...@@ -94,7 +96,7 @@ EXPORT_SYMBOL(ks8695_gpio_interrupt);
/* /*
* Configure the GPIO line as an input. * 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; unsigned long x, flags;
...@@ -115,13 +117,13 @@ int __init_or_module gpio_direction_input(unsigned int pin) ...@@ -115,13 +117,13 @@ int __init_or_module gpio_direction_input(unsigned int pin)
return 0; return 0;
} }
EXPORT_SYMBOL(gpio_direction_input);
/* /*
* Configure the GPIO line as an output, with default state. * 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; unsigned long x, flags;
...@@ -150,13 +152,13 @@ int __init_or_module gpio_direction_output(unsigned int pin, unsigned int state) ...@@ -150,13 +152,13 @@ int __init_or_module gpio_direction_output(unsigned int pin, unsigned int state)
return 0; return 0;
} }
EXPORT_SYMBOL(gpio_direction_output);
/* /*
* Set the state of an output GPIO line. * 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; unsigned long x, flags;
...@@ -175,13 +177,12 @@ void gpio_set_value(unsigned int pin, unsigned int state) ...@@ -175,13 +177,12 @@ void gpio_set_value(unsigned int pin, unsigned int state)
local_irq_restore(flags); local_irq_restore(flags);
} }
EXPORT_SYMBOL(gpio_set_value);
/* /*
* Read the state of a GPIO line. * 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; unsigned long x;
...@@ -191,7 +192,6 @@ int gpio_get_value(unsigned int pin) ...@@ -191,7 +192,6 @@ int gpio_get_value(unsigned int pin)
x = __raw_readl(KS8695_GPIO_VA + KS8695_IOPD); x = __raw_readl(KS8695_GPIO_VA + KS8695_IOPD);
return (x & IOPD(pin)) != 0; return (x & IOPD(pin)) != 0;
} }
EXPORT_SYMBOL(gpio_get_value);
/* /*
...@@ -219,6 +219,25 @@ int irq_to_gpio(unsigned int irq) ...@@ -219,6 +219,25 @@ int irq_to_gpio(unsigned int irq)
} }
EXPORT_SYMBOL(irq_to_gpio); 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 ..................................................... */ /* .... Debug interface ..................................................... */
......
...@@ -30,53 +30,32 @@ ...@@ -30,53 +30,32 @@
#define KS8695_GPIO_14 14 #define KS8695_GPIO_14 14
#define KS8695_GPIO_15 15 #define KS8695_GPIO_15 15
/* /*
* Configure GPIO pin as external interrupt source. * Configure GPIO pin as external interrupt source.
*/ */
int __init_or_module ks8695_gpio_interrupt(unsigned int pin, unsigned int type); extern int ks8695_gpio_interrupt(unsigned int pin, unsigned int type);
/*
* Configure the GPIO line as an input.
*/
int __init_or_module gpio_direction_input(unsigned int pin);
/*
* Configure the GPIO line as an output, with default state.
*/
int __init_or_module gpio_direction_output(unsigned int pin, unsigned int state);
/*
* Set the state of an output GPIO line.
*/
void gpio_set_value(unsigned int pin, unsigned int state);
/*
* Read the state of a GPIO line.
*/
int gpio_get_value(unsigned int pin);
/* /*
* Map GPIO line to IRQ number. * Map GPIO line to IRQ number.
*/ */
int gpio_to_irq(unsigned int pin); extern int gpio_to_irq(unsigned int pin);
/* /*
* Map IRQ number to GPIO line. * Map IRQ number to GPIO line.
*/ */
int irq_to_gpio(unsigned int irq); extern int irq_to_gpio(unsigned int irq);
#include <asm-generic/gpio.h> #include <asm-generic/gpio.h>
static inline int gpio_request(unsigned int pin, const char *label) /* If it turns out that we need to optimise GPIO access for the
{ * Micrel's GPIOs, then these can be changed to check their argument
return 0; * directly as static inlines. However for now it's probably not
} * worthwhile.
*/
#define gpio_get_value __gpio_get_value
#define gpio_set_value __gpio_set_value
static inline void gpio_free(unsigned int pin) /* Register the GPIOs */
{ extern void ks8695_register_gpios(void);
might_sleep();
}
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment