Merge branch 'fix/misc' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
[sfrench/cifs-2.6.git] / arch / arm / mach-ep93xx / gpio.c
index 482cf3d2fbcd5de4c6e841590c200bb4d5d9df8c..1ea8871e03a96db862ef27ebca06fc325baeb6aa 100644 (file)
 #include <linux/module.h>
 #include <linux/seq_file.h>
 #include <linux/io.h>
+#include <linux/gpio.h>
+#include <linux/irq.h>
 
-#include <mach/ep93xx-regs.h>
-#include <asm/gpio.h>
+#include <mach/hardware.h>
 
 struct ep93xx_gpio_chip {
        struct gpio_chip        chip;
 
-       unsigned int            data_reg;
-       unsigned int            data_dir_reg;
+       void __iomem            *data_reg;
+       void __iomem            *data_dir_reg;
 };
 
 #define to_ep93xx_gpio_chip(c) container_of(c, struct ep93xx_gpio_chip, chip)
@@ -111,15 +112,61 @@ static void ep93xx_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
 {
        struct ep93xx_gpio_chip *ep93xx_chip = to_ep93xx_gpio_chip(chip);
        u8 data_reg, data_dir_reg;
-       int i;
+       int gpio, i;
 
        data_reg = __raw_readb(ep93xx_chip->data_reg);
        data_dir_reg = __raw_readb(ep93xx_chip->data_dir_reg);
 
-       for (i = 0; i < chip->ngpio; i++)
-               seq_printf(s, "GPIO %s%d: %s %s\n", chip->label, i,
-                          (data_reg & (1 << i)) ? "set" : "clear",
-                          (data_dir_reg & (1 << i)) ? "out" : "in");
+       gpio = ep93xx_chip->chip.base;
+       for (i = 0; i < chip->ngpio; i++, gpio++) {
+               int is_out = data_dir_reg & (1 << i);
+
+               seq_printf(s, " %s%d gpio-%-3d (%-12s) %s %s",
+                               chip->label, i, gpio,
+                               gpiochip_is_requested(chip, i) ? : "",
+                               is_out ? "out" : "in ",
+                               (data_reg & (1 << i)) ? "hi" : "lo");
+
+               if (!is_out) {
+                       int irq = gpio_to_irq(gpio);
+                       struct irq_desc *desc = irq_desc + irq;
+
+                       if (irq >= 0 && desc->action) {
+                               char *trigger;
+
+                               switch (desc->status & IRQ_TYPE_SENSE_MASK) {
+                               case IRQ_TYPE_NONE:
+                                       trigger = "(default)";
+                                       break;
+                               case IRQ_TYPE_EDGE_FALLING:
+                                       trigger = "edge-falling";
+                                       break;
+                               case IRQ_TYPE_EDGE_RISING:
+                                       trigger = "edge-rising";
+                                       break;
+                               case IRQ_TYPE_EDGE_BOTH:
+                                       trigger = "edge-both";
+                                       break;
+                               case IRQ_TYPE_LEVEL_HIGH:
+                                       trigger = "level-high";
+                                       break;
+                               case IRQ_TYPE_LEVEL_LOW:
+                                       trigger = "level-low";
+                                       break;
+                               default:
+                                       trigger = "?trigger?";
+                                       break;
+                               }
+
+                               seq_printf(s, " irq-%d %s%s",
+                                               irq, trigger,
+                                               (desc->status & IRQ_WAKEUP)
+                                                       ? " wakeup" : "");
+                       }
+               }
+
+               seq_printf(s, "\n");
+       }
 }
 
 #define EP93XX_GPIO_BANK(name, dr, ddr, base_gpio)                     \