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