[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 <dsilvers@simtec.co.uk>
Signed-off-by: Vincent Sanders <vince@simtec.co.uk>
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
This commit is contained in:
Daniel Silverstone 2008-12-13 20:44:12 +00:00 committed by Ben Dooks
parent fbd627100b
commit 72880ad866
4 changed files with 45 additions and 43 deletions

View File

@ -397,6 +397,7 @@ config ARCH_KS8695
bool "Micrel/Kendin KS8695"
select CPU_ARM922T
select GENERIC_GPIO
select ARCH_REQUIRE_GPIOLIB
help
Support for Micrel/Kendin KS8695 "Centaur" (ARM922T) based
System-on-Chip devices.

View File

@ -18,6 +18,7 @@
#include <asm/mach/map.h>
#include <asm/mach/irq.h>
#include <mach/gpio.h>
#include <mach/devices.h>
#include "generic.h"
@ -39,6 +40,8 @@ static void __init micrel_init(void)
{
printk(KERN_INFO "Micrel KS8695 Development Board initializing\n");
ks8695_register_gpios();
#ifdef CONFIG_PCI
ks8695_init_pci(&micrel_pci);
#endif

View File

@ -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,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 ..................................................... */

View File

@ -30,53 +30,32 @@
#define KS8695_GPIO_14 14
#define KS8695_GPIO_15 15
/*
* Configure GPIO pin as external interrupt source.
*/
int __init_or_module 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);
extern int ks8695_gpio_interrupt(unsigned int pin, unsigned int type);
/*
* 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.
*/
int irq_to_gpio(unsigned int irq);
extern int irq_to_gpio(unsigned int irq);
#include <asm-generic/gpio.h>
static inline int gpio_request(unsigned int pin, const char *label)
{
return 0;
}
/* 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
* 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)
{
might_sleep();
}
/* Register the GPIOs */
extern void ks8695_register_gpios(void);
#endif