From 518b2b249930b5f75587e8599a30dad27fdeeee4 Mon Sep 17 00:00:00 2001 From: lhh Date: Tue, 16 Nov 2010 15:16:11 +0800 Subject: [PATCH] update rk29 gpio --- arch/arm/mach-rk29/gpio.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/arch/arm/mach-rk29/gpio.c b/arch/arm/mach-rk29/gpio.c index 4ba962238508..2fb1b07f03ea 100755 --- a/arch/arm/mach-rk29/gpio.c +++ b/arch/arm/mach-rk29/gpio.c @@ -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); } -- 2.34.1