Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=8a87a996eae3d25b0670a243f4829ea4aa9eb63d
Commit:     8a87a996eae3d25b0670a243f4829ea4aa9eb63d
Parent:     7dcca30a32aadb0520417521b0c44f42d09fe05c
Author:     Andrew Victor <[EMAIL PROTECTED]>
AuthorDate: Mon May 14 14:30:15 2007 +0100
Committer:  Russell King <[EMAIL PROTECTED]>
CommitDate: Thu Jul 12 11:12:34 2007 +0100

    [ARM] 4377/1: KS8695: GPIO driver
    
    Driver to control the GPIO pins on the KS8695 processor.
    The driver natively supports the Generic GPIO interface.
    
    Signed-off-by: Andrew Victor <[EMAIL PROTECTED]>
    Signed-off-by: Russell King <[EMAIL PROTECTED]>
---
 arch/arm/Kconfig                   |    1 +
 arch/arm/mach-ks8695/Makefile      |    2 +-
 arch/arm/mach-ks8695/gpio.c        |  218 ++++++++++++++++++++++++++++++++++++
 include/asm-arm/arch-ks8695/gpio.h |   79 +++++++++++++
 4 files changed, 299 insertions(+), 1 deletions(-)

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 50d9f3e..68f2006 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -308,6 +308,7 @@ config ARCH_L7200
 
 config ARCH_KS8695
        bool "Micrel/Kendin KS8695"
+       select GENERIC_GPIO
        help
          Support for Micrel/Kendin KS8695 "Centaur" (ARM922T) based
          System-on-Chip devices.
diff --git a/arch/arm/mach-ks8695/Makefile b/arch/arm/mach-ks8695/Makefile
index 56b7d33..2a07a28 100644
--- a/arch/arm/mach-ks8695/Makefile
+++ b/arch/arm/mach-ks8695/Makefile
@@ -3,7 +3,7 @@
 # Makefile for KS8695 architecture support
 #
 
-obj-y                          := cpu.o irq.o time.o devices.o
+obj-y                          := cpu.o irq.o time.o gpio.o devices.o
 obj-m                          :=
 obj-n                          :=
 obj-                           :=
diff --git a/arch/arm/mach-ks8695/gpio.c b/arch/arm/mach-ks8695/gpio.c
new file mode 100644
index 0000000..b1aa3cb
--- /dev/null
+++ b/arch/arm/mach-ks8695/gpio.c
@@ -0,0 +1,218 @@
+/*
+ * arch/arm/mach-ks8695/gpio.c
+ *
+ * Copyright (C) 2006 Andrew Victor
+ *
+ * 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
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/init.h>
+#include <linux/module.h>
+
+#include <asm/io.h>
+#include <asm/hardware.h>
+#include <asm/mach/irq.h>
+
+#include <asm/arch/regs-gpio.h>
+#include <asm/arch/gpio.h>
+
+/*
+ * 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)
+{
+       unsigned int enable[] = { IOPC_IOEINT0EN, IOPC_IOEINT1EN, 
IOPC_IOEINT2EN, IOPC_IOEINT3EN, IOPC_IOTIM0EN, IOPC_IOTIM1EN };
+       unsigned long x, flags;
+
+       if (pin > KS8695_GPIO_5)        /* only GPIO 0..5 have internal 
functions */
+               return;
+
+       local_irq_save(flags);
+
+       x = __raw_readl(KS8695_GPIO_VA + KS8695_IOPC);
+       if (gpio)                       /* GPIO: set bit to 0 */
+               x &= ~enable[pin];
+       else                            /* Internal function: set bit to 1 */
+               x |= enable[pin];
+       __raw_writel(x, KS8695_GPIO_VA + KS8695_IOPC);
+
+       local_irq_restore(flags);
+}
+
+
+static unsigned short gpio_irq[] = { KS8695_IRQ_EXTERN0, KS8695_IRQ_EXTERN1, 
KS8695_IRQ_EXTERN2, KS8695_IRQ_EXTERN3 };
+
+/*
+ * Configure GPIO pin as external interrupt source.
+ */
+int __init_or_module ks8695_gpio_interrupt(unsigned int pin, unsigned int type)
+{
+       unsigned long x, flags;
+
+       if (pin > KS8695_GPIO_3)        /* only GPIO 0..3 can generate IRQ */
+               return -EINVAL;
+
+       local_irq_save(flags);
+
+       /* set pin as input */
+       x = __raw_readl(KS8695_GPIO_VA + KS8695_IOPM);
+       x &= ~IOPM_(pin);
+       __raw_writel(x, KS8695_GPIO_VA + KS8695_IOPM);
+
+       local_irq_restore(flags);
+
+       /* Set IRQ triggering type */
+       set_irq_type(gpio_irq[pin], type);
+
+       /* enable interrupt mode */
+       ks8695_gpio_mode(pin, 0);
+
+       return 0;
+}
+EXPORT_SYMBOL(ks8695_gpio_interrupt);
+
+
+
+/* .... Generic GPIO interface .............................................. 
*/
+
+/*
+ * Configure the GPIO line as an input.
+ */
+int __init_or_module gpio_direction_input(unsigned int pin)
+{
+       unsigned long x, flags;
+
+       if (pin > KS8695_GPIO_15)
+               return -EINVAL;
+
+       /* set pin to GPIO mode */
+       ks8695_gpio_mode(pin, 1);
+
+       local_irq_save(flags);
+
+       /* set pin as input */
+       x = __raw_readl(KS8695_GPIO_VA + KS8695_IOPM);
+       x &= ~IOPM_(pin);
+       __raw_writel(x, KS8695_GPIO_VA + KS8695_IOPM);
+
+       local_irq_restore(flags);
+
+       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)
+{
+       unsigned long x, flags;
+
+       if (pin > KS8695_GPIO_15)
+               return -EINVAL;
+
+       /* set pin to GPIO mode */
+       ks8695_gpio_mode(pin, 1);
+
+       local_irq_save(flags);
+
+       /* set line state */
+       x = __raw_readl(KS8695_GPIO_VA + KS8695_IOPD);
+       if (state)
+               x |= (1 << pin);
+       else
+               x &= ~(1 << pin);
+       __raw_writel(x, KS8695_GPIO_VA + KS8695_IOPD);
+
+       /* set pin as output */
+       x = __raw_readl(KS8695_GPIO_VA + KS8695_IOPM);
+       x |= IOPM_(pin);
+       __raw_writel(x, KS8695_GPIO_VA + KS8695_IOPM);
+
+       local_irq_restore(flags);
+
+       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)
+{
+       unsigned long x, flags;
+
+       if (pin > KS8695_GPIO_15)
+               return;
+
+       local_irq_save(flags);
+
+       /* set output line state */
+       x = __raw_readl(KS8695_GPIO_VA + KS8695_IOPD);
+       if (state)
+               x |= (1 << pin);
+       else
+               x &= ~(1 << pin);
+       __raw_writel(x, KS8695_GPIO_VA + KS8695_IOPD);
+
+       local_irq_restore(flags);
+}
+EXPORT_SYMBOL(gpio_set_value);
+
+
+/*
+ * Read the state of a GPIO line.
+ */
+int gpio_get_value(unsigned int pin)
+{
+       unsigned long x;
+
+       if (pin > KS8695_GPIO_15)
+               return -EINVAL;
+
+       x = __raw_readl(KS8695_GPIO_VA + KS8695_IOPD);
+       return (x & (1 << pin)) != 0;
+}
+EXPORT_SYMBOL(gpio_get_value);
+
+
+/*
+ * Map GPIO line to IRQ number.
+ */
+int gpio_to_irq(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.
+ */
+int irq_to_gpio(unsigned int irq)
+{
+       if ((irq < KS8695_IRQ_EXTERN0) || (irq > KS8695_IRQ_EXTERN3))
+               return -EINVAL;
+
+       return (irq - KS8695_IRQ_EXTERN0);
+}
+EXPORT_SYMBOL(irq_to_gpio);
diff --git a/include/asm-arm/arch-ks8695/gpio.h 
b/include/asm-arm/arch-ks8695/gpio.h
new file mode 100644
index 0000000..65ceea2
--- /dev/null
+++ b/include/asm-arm/arch-ks8695/gpio.h
@@ -0,0 +1,79 @@
+/*
+ * include/asm-arm/arch-ks8695/gpio.h
+ *
+ * Copyright (C) 2006 Andrew Victor
+ *
+ * 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
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __ASM_ARCH_GPIO_H_
+#define __ASM_ARCH_GPIO_H_
+
+#define KS8695_GPIO_0          0
+#define KS8695_GPIO_1          1
+#define KS8695_GPIO_2          2
+#define KS8695_GPIO_3          3
+#define KS8695_GPIO_4          4
+#define KS8695_GPIO_5          5
+#define KS8695_GPIO_6          6
+#define KS8695_GPIO_7          7
+#define KS8695_GPIO_8          8
+#define KS8695_GPIO_9          9
+#define KS8695_GPIO_10         10
+#define KS8695_GPIO_11         11
+#define KS8695_GPIO_12         12
+#define KS8695_GPIO_13         13
+#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);
+
+/*
+ * Map GPIO line to IRQ number.
+ */
+int gpio_to_irq(unsigned int pin);
+
+/*
+ * Map IRQ number to GPIO line.
+ */
+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;
+}
+
+static inline void gpio_free(unsigned int pin)
+{
+}
+
+#endif
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to