[ARM] 4603/1: KS8695: debugfs interface to view pin state
authorAndrew Victor <andrew@sanpeople.com>
Mon, 15 Oct 2007 13:27:41 +0000 (14:27 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 26 Jan 2008 14:38:48 +0000 (14:38 +0000)
This patch adds a debug interface (if CONFIG_DEBUG_FS is selected) to
display the basic configuration and current state of the GPIO pins on
the Kendin/Micrel KS8695 processor.

Signed-off-by: Andrew Victor <andrew@sanpeople.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mach-ks8695/gpio.c
include/asm-arm/arch-ks8695/regs-gpio.h

index b1aa3cb3d4a3a782132fde8dd0655d94e16dc5c5..5e46191c0af967a8cc9a36b30c49c594af8ebc0a 100644 (file)
@@ -20,6 +20,8 @@
 #include <linux/kernel.h>
 #include <linux/mm.h>
 #include <linux/init.h>
+#include <linux/debugfs.h>
+#include <linux/seq_file.h>
 #include <linux/module.h>
 
 #include <asm/io.h>
@@ -216,3 +218,84 @@ int irq_to_gpio(unsigned int irq)
        return (irq - KS8695_IRQ_EXTERN0);
 }
 EXPORT_SYMBOL(irq_to_gpio);
+
+
+/* .... Debug interface ..................................................... */
+
+#ifdef CONFIG_DEBUG_FS
+
+static int ks8695_gpio_show(struct seq_file *s, void *unused)
+{
+       unsigned int enable[] = { IOPC_IOEINT0EN, IOPC_IOEINT1EN, IOPC_IOEINT2EN, IOPC_IOEINT3EN, IOPC_IOTIM0EN, IOPC_IOTIM1EN };
+       unsigned int intmask[] = { IOPC_IOEINT0TM, IOPC_IOEINT1TM, IOPC_IOEINT2TM, IOPC_IOEINT3TM };
+       unsigned long mode, ctrl, data;
+       int i;
+
+       mode = __raw_readl(KS8695_GPIO_VA + KS8695_IOPM);
+       ctrl = __raw_readl(KS8695_GPIO_VA + KS8695_IOPC);
+       data = __raw_readl(KS8695_GPIO_VA + KS8695_IOPD);
+
+       seq_printf(s, "Pin\tI/O\tFunction\tState\n\n");
+
+       for (i = KS8695_GPIO_0; i <= KS8695_GPIO_15 ; i++) {
+               seq_printf(s, "%i:\t", i);
+
+               seq_printf(s, "%s\t", (mode & IOPM_(i)) ? "Output" : "Input");
+
+               if (i <= KS8695_GPIO_3) {
+                       if (ctrl & enable[i]) {
+                               seq_printf(s, "EXT%i ", i);
+
+                               switch ((ctrl & intmask[i]) >> (4 * i)) {
+                                       case IOPC_TM_LOW:
+                                               seq_printf(s, "(Low)");         break;
+                                       case IOPC_TM_HIGH:
+                                               seq_printf(s, "(High)");        break;
+                                       case IOPC_TM_RISING:
+                                               seq_printf(s, "(Rising)");      break;
+                                       case IOPC_TM_FALLING:
+                                               seq_printf(s, "(Falling)");     break;
+                                       case IOPC_TM_EDGE:
+                                               seq_printf(s, "(Edges)");       break;
+                               }
+                       }
+                       else
+                               seq_printf(s, "GPIO\t");
+               }
+               else if (i <= KS8695_GPIO_5) {
+                       if (ctrl & enable[i])
+                               seq_printf(s, "TOUT%i\t", i - KS8695_GPIO_4);
+                       else
+                               seq_printf(s, "GPIO\t");
+               }
+               else
+                       seq_printf(s, "GPIO\t");
+
+               seq_printf(s, "\t");
+
+               seq_printf(s, "%i\n", (data & IOPD_(i)) ? 1 : 0);
+       }
+       return 0;
+}
+
+static int ks8695_gpio_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, ks8695_gpio_show, NULL);
+}
+
+static const struct file_operations ks8695_gpio_operations = {
+       .open           = ks8695_gpio_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+
+static int __init ks8695_gpio_debugfs_init(void)
+{
+       /* /sys/kernel/debug/ks8695_gpio */
+       (void) debugfs_create_file("ks8695_gpio", S_IFREG | S_IRUGO, NULL, NULL, &ks8695_gpio_operations);
+       return 0;
+}
+postcore_initcall(ks8695_gpio_debugfs_init);
+
+#endif
index 57fcf9fc82e40cfadfe7e9d4994d1dba45b6b6a8..6b95d77aea190e89c233f604461bf945cddc5dfa 100644 (file)
@@ -49,5 +49,7 @@
 #define IOPC_TM_FALLING                (4)             /* Falling Edge Detection */
 #define IOPC_TM_EDGE           (6)             /* Both Edge Detection */
 
+/* Port Data Register */
+#define IOPD_(x)               (1 << (x))      /* Signal Level of GPIO Pin x */
 
 #endif