Hi again,

On Thu, Feb 09, 2012 at 08:09:40AM +0200, Felipe Balbi wrote:
> On Wed, Feb 08, 2012 at 04:01:42PM -0800, Kevin Hilman wrote:
> > Felipe Balbi <[email protected]> writes:
> > 
> > > try to keep gpio block suspended as much as possible.
> > >
> > > Tested with pandaboard and a sysfs exported gpio.
> > >
> > > Signed-off-by: Felipe Balbi <[email protected]>
> > > ---
> > 
> > Looks like you need a few more get/puts around other places where
> > registers are accessed.  It currently causes a boot crash on OMAP3 in
> > _set_gpio_triggering().
> 
> it was a missing get/put on gpio_irq_set_type(). Fixed.
> 
> > Did you test GPIO wakeups?  both IO ring wakeups and GPIO module-level
> > wakeups?
> 
> how can I test that easily with panda ?

Ok, I have added gpio-keys to panda's boardfile:

diff --git a/arch/arm/mach-omap2/board-omap4panda.c 
b/arch/arm/mach-omap2/board-omap4panda.c
index 30ad40d..0a38282 100644
--- a/arch/arm/mach-omap2/board-omap4panda.c
+++ b/arch/arm/mach-omap2/board-omap4panda.c
@@ -23,6 +23,7 @@
 #include <linux/io.h>
 #include <linux/leds.h>
 #include <linux/gpio.h>
+#include <linux/gpio_keys.h>
 #include <linux/usb/otg.h>
 #include <linux/i2c/twl.h>
 #include <linux/regulator/machine.h>
@@ -90,7 +91,30 @@ static struct platform_device leds_gpio = {
        },
 };
 
+static struct gpio_keys_button gpio_buttons[] = {
+       {
+               .code           = BTN_EXTRA,
+               .gpio           = 121,
+               .desc           = "user",
+               .wakeup         = 1,
+       },
+};
+
+static struct gpio_keys_platform_data gpio_key_info = {
+       .buttons        = gpio_buttons,
+       .nbuttons       = ARRAY_SIZE(gpio_buttons),
+};
+
+static struct platform_device keys_gpio = {
+       .name   = "gpio-keys",
+       .id     = -1,
+       .dev    = {
+               .platform_data  = &gpio_key_info,
+       },
+};
+
 static struct platform_device *panda_devices[] __initdata = {
+       &keys_gpio,
        &leds_gpio,
        &wl1271_device,
 };

Then I enabled IRQ wake on gpio-keys driver:

diff --git a/drivers/input/keyboard/gpio_keys.c 
b/drivers/input/keyboard/gpio_keys.c
index ed1ed46..e6a0c37a 100644
--- a/drivers/input/keyboard/gpio_keys.c
+++ b/drivers/input/keyboard/gpio_keys.c
@@ -410,6 +410,8 @@ static int __devinit gpio_keys_setup_key(struct 
platform_device *pdev,
                goto fail3;
        }
 
+       enable_irq_wake(irq);
+
        irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING;
        /*
         * If platform has specified that the button can be disabled,


and enabled wakeup on the gpio-keys:

# echo enabled > /sys/devices/platform/gpio-keys/power/wakeup

suspended the device, and woke it up by pressing S2 (user button). It
almost works, hehe. I can suspend and wake pandaboard up with the user
button. But after that, GPIO module is dead. BTW, I had to prevent
gpio's suspend/resume functions from being called. For some reason,
pm-core is still calling them:

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index db5dcca..d6c1fef 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -1170,6 +1170,9 @@ static int omap_gpio_suspend(struct device *dev)
        void __iomem *wakeup_enable;
        unsigned long flags;
 
+       if (pm_runtime_suspended(dev))
+               return 0;
+
        if (!bank->mod_usage || !bank->loses_context)
                return 0;
 
@@ -1194,6 +1197,9 @@ static int omap_gpio_resume(struct device *dev)
        void __iomem *base = bank->base;
        unsigned long flags;
 
+       if (pm_runtime_suspended(dev))
+               return 0;
+
        if (!bank->mod_usage || !bank->loses_context)
                return 0;
 

I will continue debugging this, I think it's just something stupid that
I did. Here's entire log:

root@legalas:~# echo enabled > /sys/devices/platform/gpio-keys/power/wakeup
root@legolas:~# echo enabled > 
/sys/devices/platform/omap/omap_uart.2/power/wakeup
root@legolas:~# grep user /proc/interrupts 
281:          0          0      GPIO  user
root@legolas:~# grep user /proc/interrupts 
281:          2          0      GPIO  user
root@legolas:~# grep user /proc/interrupts 
281:          5          0      GPIO  user
root@legolas:~# grep user /proc/interrupts 
281:          7          0      GPIO  user
root@legolas:~# grep user /proc/interrupts 
281:          8          0      GPIO  user
root@legolas:~# grep user /proc/interrupts 
281:          9          0      GPIO  user
root@legolas:~# 
root@legolas:~# 
root@legolas:~# echo mem > /sys/power/state 
[   62.593200] PM: Syncing filesystems ... done.
[   62.605743] Freezing user space processes ... (elapsed 0.03 seconds) done.
[   62.636230] Freezing remaining freezable tasks ... (elapsed 0.04 seconds) 
done.
[   62.692993] Suspending console(s) (use no_console_suspend to debug)
[   62.709960] PM: suspend of devices complete after 8.270 msecs
[   62.711853] PM: late suspend of devices complete after 1.770 msecs
[   62.711853] Disabling non-boot CPUs ...
[   62.715118] CPU1: shutdown
[   65.369873] Successfully put all powerdomains to target state
[   65.369995] Enabling non-boot CPUs ...
[   65.371612] CPU1: Booted secondary processor
[   65.372161] Calibrating delay loop (skipped) already calibrated this CPU
[   65.372741] CPU1 is up
[   65.373962] PM: early resume of devices complete after 1.220 msecs
[   65.373962] ------------[ cut here ]------------
[   65.374114] WARNING: at arch/arm/mach-omap2/omap_l3_noc.c:113 
l3_interrupt_handler+0x184/0x1c4()
[   65.374114] L3 custom error: MASTER:MPU TARGET:L4 PER2
[   65.374114] Modules linked in:
[   65.374114] [<c001b824>] (unwind_backtrace+0x0/0xf0) from [<c0042a60>] 
(warn_slowpath_common+0x4c/0x64)
[   65.374206] [<c0042a60>] (warn_slowpath_common+0x4c/0x64) from [<c0042b0c>] 
(warn_slowpath_fmt+0x30/0x40)
[   65.374206] [<c0042b0c>] (warn_slowpath_fmt+0x30/0x40) from [<c0034a88>] 
(l3_interrupt_handler+0x184/0x1c4)
[   65.374267] [<c0034a88>] (l3_interrupt_handler+0x184/0x1c4) from 
[<c00a1ef8>] (handle_irq_event_percpu+0x5c/0x22c)
[   65.374267] [<c00a1ef8>] (handle_irq_event_percpu+0x5c/0x22c) from 
[<c00a2104>] (handle_irq_event+0x3c/0x5c)
[   65.374298] [<c00a2104>] (handle_irq_event+0x3c/0x5c) from [<c00a4ba0>] 
(handle_fasteoi_irq+0x98/0x140)
[   65.374328] [<c00a4ba0>] (handle_fasteoi_irq+0x98/0x140) from [<c00a170c>] 
(generic_handle_irq+0x30/0x48)
[   65.374328] [<c00a170c>] (generic_handle_irq+0x30/0x48) from [<c0014bd8>] 
(handle_IRQ+0x4c/0xac)
[   65.374389] [<c0014bd8>] (handle_IRQ+0x4c/0xac) from [<c000848c>] 
(gic_handle_irq+0x28/0xac)
[   65.374389] [<c000848c>] (gic_handle_irq+0x28/0xac) from [<c04809e4>] 
(__irq_svc+0x44/0x60)
[   65.374389] Exception stack(0xee147e60 to 0xee147ea8)
[   65.374450] 7e60: 00011de7 00000003 00000000 ee0f7580 60000113 c068c194 
00000000 c068c194
[   65.374450] 7e80: 60000113 ee04d780 c068c140 000d7518 00001584 ee147ea8 
00011de8 c04807a4
[   65.374450] 7ea0: 20000113 ffffffff
[   65.374481] [<c04809e4>] (__irq_svc+0x44/0x60) from [<c04807a4>] 
(_raw_spin_unlock_irqrestore+0x34/0x44)
[   65.374481] [<c04807a4>] (_raw_spin_unlock_irqrestore+0x34/0x44) from 
[<c00a717c>] (resume_irqs+0x9c/0xbc)
[   65.374511] [<c00a717c>] (resume_irqs+0x9c/0xbc) from [<c0080998>] 
(suspend_enter+0xa4/0x168)
[   65.374542] [<c0080998>] (suspend_enter+0xa4/0x168) from [<c0080b0c>] 
(suspend_devices_and_enter+0xb0/0x18c)
[   65.374542] [<c0080b0c>] (suspend_devices_and_enter+0xb0/0x18c) from 
[<c0080d24>] (enter_state+0x13c/0x17c)
[   65.374572] [<c0080d24>] (enter_state+0x13c/0x17c) from [<c007fa1c>] 
(state_store+0xd0/0x178)
[   65.374603] [<c007fa1c>] (state_store+0xd0/0x178) from [<c0258f48>] 
(kobj_attr_store+0x14/0x20)
[   65.374603] [<c0258f48>] (kobj_attr_store+0x14/0x20) from [<c0169958>] 
(sysfs_write_file+0x100/0x184)
[   65.374633] [<c0169958>] (sysfs_write_file+0x100/0x184) from [<c0109d10>] 
(vfs_write+0xb4/0x148)
[   65.374664] [<c0109d10>] (vfs_write+0xb4/0x148) from [<c0109f98>] 
(sys_write+0x40/0x70)
[   65.374664] [<c0109f98>] (sys_write+0x40/0x70) from [<c0013cc0>] 
(ret_fast_syscall+0x0/0x3c)
[   65.374694] ---[ end trace 4898b0d1d1bc4fab ]---
[   65.374694] ------------[ cut here ]------------
[   65.374694] WARNING: at arch/arm/mach-omap2/omap_l3_noc.c:113 
l3_interrupt_handler+0x184/0x1c4()
[   65.374694] L3 custom error: MASTER:MPU TARGET:L4 PER2
[   65.375305] Modules linked in:
[   65.375305] [<c001b824>] (unwind_backtrace+0x0/0xf0) from [<c0042a60>] 
(warn_slowpath_common+0x4c/0x64)
[   65.375335] [<c0042a60>] (warn_slowpath_common+0x4c/0x64) from [<c0042b0c>] 
(warn_slowpath_fmt+0x30/0x40)
[   65.375335] [<c0042b0c>] (warn_slowpath_fmt+0x30/0x40) from [<c0034a88>] 
(l3_interrupt_handler+0x184/0x1c4)
[   65.375366] [<c0034a88>] (l3_interrupt_handler+0x184/0x1c4) from 
[<c00a1ef8>] (handle_irq_event_percpu+0x5c/0x22c)
[   65.375396] [<c00a1ef8>] (handle_irq_event_percpu+0x5c/0x22c) from 
[<c00a2104>] (handle_irq_event+0x3c/0x5c)
[   65.375396] [<c00a2104>] (handle_irq_event+0x3c/0x5c) from [<c00a4ba0>] 
(handle_fasteoi_irq+0x98/0x140)
[   65.375427] [<c00a4ba0>] (handle_fasteoi_irq+0x98/0x140) from [<c00a170c>] 
(generic_handle_irq+0x30/0x48)
[   65.375427] [<c00a170c>] (generic_handle_irq+0x30/0x48) from [<c0014bd8>] 
(handle_IRQ+0x4c/0xac)
[   65.375457] [<c0014bd8>] (handle_IRQ+0x4c/0xac) from [<c000848c>] 
(gic_handle_irq+0x28/0xac)
[   65.375457] [<c000848c>] (gic_handle_irq+0x28/0xac) from [<c04809e4>] 
(__irq_svc+0x44/0x60)
[   65.375488] Exception stack(0xee147e60 to 0xee147ea8)
[   65.375488] 7e60: 00011fc7 00000003 00000000 ee0f7580 60000113 c06974d4 
00000000 c06974d4
[   65.375488] 7e80: 60000113 ee04d780 c0697480 000d7518 00001584 ee147ea8 
00011fc8 c04807a4
[   65.375518] 7ea0: 20000113 ffffffff
[   65.375518] [<c04809e4>] (__irq_svc+0x44/0x60) from [<c04807a4>] 
(_raw_spin_unlock_irqrestore+0x34/0x44)
[   65.375549] [<c04807a4>] (_raw_spin_unlock_irqrestore+0x34/0x44) from 
[<c00a717c>] (resume_irqs+0x9c/0xbc)
[   65.375549] [<c00a717c>] (resume_irqs+0x9c/0xbc) from [<c0080998>] 
(suspend_enter+0xa4/0x168)
[   65.375579] [<c0080998>] (suspend_enter+0xa4/0x168) from [<c0080b0c>] 
(suspend_devices_and_enter+0xb0/0x18c)
[   65.375579] [<c0080b0c>] (suspend_devices_and_enter+0xb0/0x18c) from 
[<c0080d24>] (enter_state+0x13c/0x17c)
[   65.375610] [<c0080d24>] (enter_state+0x13c/0x17c) from [<c007fa1c>] 
(state_store+0xd0/0x178)
[   65.375610] [<c007fa1c>] (state_store+0xd0/0x178) from [<c0258f48>] 
(kobj_attr_store+0x14/0x20)
[   65.375640] [<c0258f48>] (kobj_attr_store+0x14/0x20) from [<c0169958>] 
(sysfs_write_file+0x100/0x184)
[   65.375640] [<c0169958>] (sysfs_write_file+0x100/0x184) from [<c0109d10>] 
(vfs_write+0xb4/0x148)
[   65.375671] [<c0109d10>] (vfs_write+0xb4/0x148) from [<c0109f98>] 
(sys_write+0x40/0x70)
[   65.375671] [<c0109f98>] (sys_write+0x40/0x70) from [<c0013cc0>] 
(ret_fast_syscall+0x0/0x3c)
[   65.375671] ---[ end trace 4898b0d1d1bc4fac ]---
[   65.375701] ------------[ cut here ]------------
[   65.375762] WARNING: at arch/arm/mach-omap2/omap_l3_noc.c:113 
l3_interrupt_handler+0x184/0x1c4()
[   65.375762] L3 custom error: MASTER:MPU TARGET:L4 PER2
[   65.375762] Modules linked in:
[   65.375793] [<c001b824>] (unwind_backtrace+0x0/0xf0) from [<c0042a60>] 
(warn_slowpath_common+0x4c/0x64)
[   65.375793] [<c0042a60>] (warn_slowpath_common+0x4c/0x64) from [<c0042b0c>] 
(warn_slowpath_fmt+0x30/0x40)
[   65.375823] [<c0042b0c>] (warn_slowpath_fmt+0x30/0x40) from [<c0034a88>] 
(l3_interrupt_handler+0x184/0x1c4)
[   65.375854] [<c0034a88>] (l3_interrupt_handler+0x184/0x1c4) from 
[<c00a1ef8>] (handle_irq_event_percpu+0x5c/0x22c)
[   65.375854] [<c00a1ef8>] (handle_irq_event_percpu+0x5c/0x22c) from 
[<c00a2104>] (handle_irq_event+0x3c/0x5c)
[   65.375885] [<c00a2104>] (handle_irq_event+0x3c/0x5c) from [<c00a4ba0>] 
(handle_fasteoi_irq+0x98/0x140)
[   65.375885] [<c00a4ba0>] (handle_fasteoi_irq+0x98/0x140) from [<c00a170c>] 
(generic_handle_irq+0x30/0x48)
[   65.375915] [<c00a170c>] (generic_handle_irq+0x30/0x48) from [<c0014bd8>] 
(handle_IRQ+0x4c/0xac)
[   65.375915] [<c0014bd8>] (handle_IRQ+0x4c/0xac) from [<c000848c>] 
(gic_handle_irq+0x28/0xac)
[   65.375946] [<c000848c>] (gic_handle_irq+0x28/0xac) from [<c04809e4>] 
(__irq_svc+0x44/0x60)
[   65.375946] Exception stack(0xee147d60 to 0xee147da8)
[   65.375946] 7d60: 00011fce 00000003 00000000 ee0f7580 c0697480 00000119 
c06e669c c06e669c
[   65.375976] 7d80: 00000000 c06854a8 c069f108 c0723300 00000000 ee147da8 
00011fcf c00a4224
[   65.375976] 7da0: 60000113 ffffffff
[   65.375976] [<c04809e4>] (__irq_svc+0x44/0x60) from [<c00a4224>] 
(resend_irqs+0x50/0x74)
[   65.376007] [<c00a4224>] (resend_irqs+0x50/0x74) from [<c0049990>] 
(tasklet_action+0x80/0x180)
[   65.376037] [<c0049990>] (tasklet_action+0x80/0x180) from [<c0049f04>] 
(__do_softirq+0xd0/0x200)
[   65.376037] [<c0049f04>] (__do_softirq+0xd0/0x200) from [<c004a4c0>] 
(irq_exit+0x94/0x9c)
[   65.376068] [<c004a4c0>] (irq_exit+0x94/0x9c) from [<c0014bdc>] 
(handle_IRQ+0x50/0xac)
[   65.376068] [<c0014bdc>] (handle_IRQ+0x50/0xac) from [<c000848c>] 
(gic_handle_irq+0x28/0xac)
[   65.376098] [<c000848c>] (gic_handle_irq+0x28/0xac) from [<c04809e4>] 
(__irq_svc+0x44/0x60)
[   65.376098] Exception stack(0xee147e60 to 0xee147ea8)
[   65.376098] 7e60: 00011fc7 00000003 00000000 ee0f7580 60000113 c06974d4 
00000000 c06974d4
[   65.376129] 7e80: 60000113 ee04d780 c0697480 000d7518 00001584 ee147ea8 
00011fc8 c04807a4
[   65.376129] 7ea0: 20000113 ffffffff
[   65.376159] [<c04809e4>] (__irq_svc+0x44/0x60) from [<c04807a4>] 
(_raw_spin_unlock_irqrestore+0x34/0x44)
[   65.376159] [<c04807a4>] (_raw_spin_unlock_irqrestore+0x34/0x44) from 
[<c00a717c>] (resume_irqs+0x9c/0xbc)
[   65.376190] [<c00a717c>] (resume_irqs+0x9c/0xbc) from [<c0080998>] 
(suspend_enter+0xa4/0x168)
[   65.376190] [<c0080998>] (suspend_enter+0xa4/0x168) from [<c0080b0c>] 
(suspend_devices_and_enter+0xb0/0x18c)
[   65.376220] [<c0080b0c>] (suspend_devices_and_enter+0xb0/0x18c) from 
[<c0080d24>] (enter_state+0x13c/0x17c)
[   65.376220] [<c0080d24>] (enter_state+0x13c/0x17c) from [<c007fa1c>] 
(state_store+0xd0/0x178)
[   65.376220] [<c007fa1c>] (state_store+0xd0/0x178) from [<c0258f48>] 
(kobj_attr_store+0x14/0x20)
[   65.376251] [<c0258f48>] (kobj_attr_store+0x14/0x20) from [<c0169958>] 
(sysfs_write_file+0x100/0x184)
[   65.376281] [<c0169958>] (sysfs_write_file+0x100/0x184) from [<c0109d10>] 
(vfs_write+0xb4/0x148)
[   65.376281] [<c0109d10>] (vfs_write+0xb4/0x148) from [<c0109f98>] 
(sys_write+0x40/0x70)
[   65.376312] [<c0109f98>] (sys_write+0x40/0x70) from [<c0013cc0>] 
(ret_fast_syscall+0x0/0x3c)
[   65.376312] ---[ end trace 4898b0d1d1bc4fad ]---
[   66.479217] PM: resume of devices complete after 1102.905 msecs
[   67.393280] Restarting tasks ... done.
root@legolas:~# [   71.719665] mmcblk0: error -110 transferring data, sector 
3557217, nr 72, cmd response 0x900, card status 0xc00
[   71.730468] end_request: I/O error, dev mmcblk0, sector 3557280
[   71.730651] end_request: I/O error, dev mmcblk0, sector 3557281
[   71.743591] Aborting journal on device mmcblk0p2.
[   71.753845] EXT3-fs (mmcblk0p2): error: ext3_journal_start_sb: Detected 
aborted journal
[   71.753845] EXT3-fs (mmcblk0p2): error: remounting filesystem read-only

root@legolas:~# grep user /proc/interrupts 
281:         10          0      GPIO  user
root@legolas:~# grep user /proc/interrupts 
281:         10          0      GPIO  user
root@legolas:~# grep user /proc/interrupts 
281:         10          0      GPIO  user
root@legolas:~# grep user /proc/interrupts 
281:         10          0      GPIO  user
root@legolas:~# grep user /proc/interrupts 
281:         10          0      GPIO  user
root@legolas:~# grep user /proc/interrupts 
281:         10          0      GPIO  user
root@legolas:~# grep user /proc/interrupts 
281:         10          0      GPIO  user
root@legolas:~# grep user /proc/interrupts 
281:         10          0      GPIO  user
root@legolas:~# grep user /proc/interrupts 
281:         10          0      GPIO  user
root@legolas:~# grep user /proc/interrupts 
281:         10          0      GPIO  user
root@legolas:~# grep user /proc/interrupts 
281:         10          0      GPIO  user
root@legolas:~# grep user /proc/interrupts 
281:         10          0      GPIO  user
root@legolas:~# grep user /proc/interrupts 
281:         10          0      GPIO  user

-- 
balbi

Attachment: signature.asc
Description: Digital signature

Reply via email to