Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 45919
b: refs/heads/master
c: 3ea163e
h: refs/heads/master
i:
  45917: d3f1318
  45915: 7b82f54
  45911: cd80f6d
  45903: 1cb2037
  45887: d0c9c38
v: v3
  • Loading branch information
Andrew Victor authored and Russell King committed Jan 24, 2007
1 parent 0cdaaa4 commit ada8b72
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 27 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9b938166907558e664d8fa413e6233a36669e0c0
refs/heads/master: 3ea163e44c041b9e1d7314998dfbfd4fbc6eea20
39 changes: 13 additions & 26 deletions trunk/arch/arm/mach-at91rm9200/gpio.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
#include <asm/io.h>
#include <asm/hardware.h>
#include <asm/arch/at91_pio.h>
#include <asm/arch/at91_pmc.h>
#include <asm/arch/gpio.h>

#include "generic.h"
Expand Down Expand Up @@ -224,17 +223,17 @@ static u32 backups[MAX_GPIO_BANKS];
static int gpio_irq_set_wake(unsigned pin, unsigned state)
{
unsigned mask = pin_to_mask(pin);
unsigned bank = (pin - PIN_BASE) / 32;

pin -= PIN_BASE;
pin /= 32;

if (unlikely(pin >= MAX_GPIO_BANKS))
if (unlikely(bank >= MAX_GPIO_BANKS))
return -EINVAL;

if (state)
wakeups[pin] |= mask;
wakeups[bank] |= mask;
else
wakeups[pin] &= ~mask;
wakeups[bank] &= ~mask;

set_irq_wake(gpio[bank].id, state);

return 0;
}
Expand All @@ -246,29 +245,15 @@ void at91_gpio_suspend(void)
for (i = 0; i < gpio_banks; i++) {
u32 pio = gpio[i].offset;

/*
* Note: drivers should have disabled GPIO interrupts that
* aren't supposed to be wakeup sources.
* But that is not much good on ARM..... disable_irq() does
* not update the hardware immediately, so the hardware mask
* (IMR) has the wrong value (not current, too much is
* permitted).
*
* Our workaround is to disable all non-wakeup IRQs ...
* which is exactly what correct drivers asked for in the
* first place!
*/
backups[i] = at91_sys_read(pio + PIO_IMR);
at91_sys_write(pio + PIO_IDR, backups[i]);
at91_sys_write(pio + PIO_IER, wakeups[i]);

if (!wakeups[i]) {
disable_irq_wake(gpio[i].id);
at91_sys_write(AT91_PMC_PCDR, 1 << gpio[i].id);
} else {
enable_irq_wake(gpio[i].id);
if (!wakeups[i])
clk_disable(gpio[i].clock);
else {
#ifdef CONFIG_PM_DEBUG
printk(KERN_DEBUG "GPIO-%c may wake for %08x\n", "ABCD"[i], wakeups[i]);
printk(KERN_DEBUG "GPIO-%c may wake for %08x\n", 'A'+i, wakeups[i]);
#endif
}
}
Expand All @@ -281,9 +266,11 @@ void at91_gpio_resume(void)
for (i = 0; i < gpio_banks; i++) {
u32 pio = gpio[i].offset;

if (!wakeups[i])
clk_enable(gpio[i].clock);

at91_sys_write(pio + PIO_IDR, wakeups[i]);
at91_sys_write(pio + PIO_IER, backups[i]);
at91_sys_write(AT91_PMC_PCER, 1 << gpio[i].id);
}
}

Expand Down

0 comments on commit ada8b72

Please sign in to comment.