diff options
| -rw-r--r-- | arch/arm/plat-mxc/gpio.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/arch/arm/plat-mxc/gpio.c b/arch/arm/plat-mxc/gpio.c index 9d38da077edb..9c3e36232b5b 100644 --- a/arch/arm/plat-mxc/gpio.c +++ b/arch/arm/plat-mxc/gpio.c | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | */ | 20 | */ |
| 21 | 21 | ||
| 22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
| 23 | #include <linux/interrupt.h> | ||
| 23 | #include <linux/io.h> | 24 | #include <linux/io.h> |
| 24 | #include <linux/irq.h> | 25 | #include <linux/irq.h> |
| 25 | #include <linux/gpio.h> | 26 | #include <linux/gpio.h> |
| @@ -201,11 +202,42 @@ static void mx2_gpio_irq_handler(u32 irq, struct irq_desc *desc) | |||
| 201 | } | 202 | } |
| 202 | } | 203 | } |
| 203 | 204 | ||
| 205 | /* | ||
| 206 | * Set interrupt number "irq" in the GPIO as a wake-up source. | ||
| 207 | * While system is running, all registered GPIO interrupts need to have | ||
| 208 | * wake-up enabled. When system is suspended, only selected GPIO interrupts | ||
| 209 | * need to have wake-up enabled. | ||
| 210 | * @param irq interrupt source number | ||
| 211 | * @param enable enable as wake-up if equal to non-zero | ||
| 212 | * @return This function returns 0 on success. | ||
| 213 | */ | ||
| 214 | static int gpio_set_wake_irq(u32 irq, u32 enable) | ||
| 215 | { | ||
| 216 | u32 gpio = irq_to_gpio(irq); | ||
| 217 | u32 gpio_idx = gpio & 0x1F; | ||
| 218 | struct mxc_gpio_port *port = &mxc_gpio_ports[gpio / 32]; | ||
| 219 | |||
| 220 | if (enable) { | ||
| 221 | if (port->irq_high && (gpio_idx >= 16)) | ||
| 222 | enable_irq_wake(port->irq_high); | ||
| 223 | else | ||
| 224 | enable_irq_wake(port->irq); | ||
| 225 | } else { | ||
| 226 | if (port->irq_high && (gpio_idx >= 16)) | ||
| 227 | disable_irq_wake(port->irq_high); | ||
| 228 | else | ||
| 229 | disable_irq_wake(port->irq); | ||
| 230 | } | ||
| 231 | |||
| 232 | return 0; | ||
| 233 | } | ||
| 234 | |||
| 204 | static struct irq_chip gpio_irq_chip = { | 235 | static struct irq_chip gpio_irq_chip = { |
| 205 | .ack = gpio_ack_irq, | 236 | .ack = gpio_ack_irq, |
| 206 | .mask = gpio_mask_irq, | 237 | .mask = gpio_mask_irq, |
| 207 | .unmask = gpio_unmask_irq, | 238 | .unmask = gpio_unmask_irq, |
| 208 | .set_type = gpio_set_irq_type, | 239 | .set_type = gpio_set_irq_type, |
| 240 | .set_wake = gpio_set_wake_irq, | ||
| 209 | }; | 241 | }; |
| 210 | 242 | ||
| 211 | static void _set_gpio_direction(struct gpio_chip *chip, unsigned offset, | 243 | static void _set_gpio_direction(struct gpio_chip *chip, unsigned offset, |
