update rk29 gpio
authorlhh <lhh@rock-chips.com>
Tue, 16 Nov 2010 07:16:11 +0000 (15:16 +0800)
committerlhh <lhh@rock-chips.com>
Tue, 16 Nov 2010 07:16:11 +0000 (15:16 +0800)
arch/arm/mach-rk29/gpio.c

index 4ba962238508e5c0af4323dbbc43db6c37b58341..2fb1b07f03eaa138a162204f43b7cf93f37cf71d 100755 (executable)
@@ -328,6 +328,20 @@ static int GPIOInmarkIntr(struct gpio_chip *chip, unsigned int mask)
        return 0;
 }
 
+static int GPIOAckIntr(struct gpio_chip *chip, unsigned int mask)
+{
+       struct rk29_gpio_chip *rk29_gpio = to_rk29_gpio_chip(chip);
+       unsigned char  __iomem  *gpioRegBase = rk29_gpio->regbase;
+
+       if(!rk29_gpio || !gpioRegBase)
+       {
+               return -1;
+       }
+       
+       rk29_gpio_bitOp(gpioRegBase,GPIO_PORTS_EOI,mask,1);
+       return 0;
+}
+
 static void gpio_irq_unmask(unsigned irq)
 {
        unsigned int pin = irq_to_gpio(irq);
@@ -348,6 +362,16 @@ static void gpio_irq_mask(unsigned irq)
                GPIOInmarkIntr(chip,mask);
 }
 
+static void gpio_ack_irq(u32 irq)
+{
+       unsigned int pin = irq_to_gpio(irq);
+       struct gpio_chip *chip = pin_to_gpioChip(pin);
+       unsigned        mask = pin_to_mask(pin);
+
+       if(chip && mask)
+               GPIOAckIntr(chip,mask);
+}
+
 static int GPIODisableIntr(struct gpio_chip *chip, unsigned int mask)
 {
        struct rk29_gpio_chip *rk29_gpio = to_rk29_gpio_chip(chip);
@@ -554,6 +578,7 @@ static void gpio_irq_handler(unsigned irq, struct irq_desc *desc)
 
 static struct irq_chip rk29gpio_irqchip = {
        .name           = "RK29_GPIOIRQ",
+       .ack            = gpio_ack_irq,
        .enable         = gpio_irq_enable,
        .disable        = gpio_irq_disable,
        .mask           = gpio_irq_mask,
@@ -576,7 +601,7 @@ void __init rk29_gpio_irq_setup(void)
                {
                        lockdep_set_class(&irq_desc[pin+j].lock, &gpio_lock_class);
                        set_irq_chip(pin+j, &rk29gpio_irqchip);
-                       set_irq_handler(pin+j, handle_simple_irq);
+                       set_irq_handler(pin+j, handle_edge_irq);
                        set_irq_flags(pin+j, IRQF_VALID);
                }