Hi,
I’d like to wake the modem up from suspend mode from a GPIO edge-triggered event. I’m trying to implement a software-driven ‘power button’ to safely shutdown the system when a button is pressed.
My current setup is as follows.
Module: WP8548
Legato: 16.10.3_4886ffbf7109055d3448bdff81805ff7_modified
The WP8548 technical specification states that a number of pins can be used to wake the device from USB-SS mode:
- GPIO2
- GPIO21
- GPIO36
- GPIO38
- GPIO39
- GPIO42
My application configures GPIO21 as an input with a rising-edge sense using the GPIO API. And this works great provided the system hasn’t already suspended.
If I set GPIO21 to a logic 1 while the system is suspended it doesn’t wake up. Here’s the system log retrieved once it resumed from suspend mode (timer-driven) - it appears to be detecting something (wake-n_gpio77) while suspended but doesn’t wake up.
[ 49.837692] Suspending console(s) (use no_console_suspend to debug)
[ 49.852189] PM: suspend of devices complete after 6.592 msecs
[ 49.854173] PM: late suspend of devices complete after 1.983 msecs
[ 49.855974] PM: noirq suspend of devices complete after 1.800 msecs
[ 49.856218] msm_pm_enter
[ 49.856218] msm_pm_enter: power collapse
[ 49.856218] msm_mpm_irqs_detectable: cannot monitor 000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000
[ 49.856218] msm_pm_enter: return
[ 49.857805] PM: noirq resume of devices complete after 1.251 msecs
[ 49.859850] PM: early resume of devices complete after 1.556 msecs
[ 49.863818] PM: resume of devices complete after 3.937 msecs
[ 49.924462] Restarting tasks ...
[ 49.933801] mbim_read: Requests list is empty. Wait.
[ 49.943598] done.
[ 50.002105] mmc0: Re-init card rc = -110 (retries = 5)
[ 50.111002] qup_i2c qup_i2c.0: QUP: I2C status flags :0x1300c8, irq:187
[ 50.116740] qup_i2c qup_i2c.0: I2C slave addr:0x3a not connected
[ 50.127819] gpio_check_and_wake: wake-n_gpio77 STATE=WAKEUP
[ 50.139996] pm_set_mcu_ulpm_enable: ext pin wu fail 4
[ 50.159926] gpio_check_and_wake: wake-n_gpio77 STATE=SLEEP
[ 50.167037] gpio_check_and_wake: wake-n_gpio77 STATE=WAKEUP
[ 50.174942] enable_store: invalid input 1 ret -5
[ 50.179978] pm_set_mcu_ulpm_enable: no wake sources set
[ 50.185411] enable_store: invalid input 1 ret -1
[ 50.190599] pm_set_mcu_ulpm_enable: no wake sources set
[ 50.195452] enable_store: invalid input 1 ret -1
[ 50.200549] pm_set_mcu_ulpm_enable: no wake sources set
[ 50.209705] enable_store: invalid input 1 ret -1
[ 50.217152] pm_set_mcu_ulpm_enable: no wake sources set
[ 50.221516] enable_store: invalid input 1 ret -1
[ 50.226705] gpio_check_and_wake: wake-n_gpio77 STATE=SLEEP
[ 52.881733] PM: Syncing filesystems ... done.
[ 52.995086] Freezing user space processes ...
[ 53.000488] mbim_read: Waiting failed
[ 53.004120] PM: Wakeup pending, aborting suspend
[ 53.007935] active wakeup source: UNIX
[ 53.011628] active wakeup source: UNIX
[ 53.015687] active wakeup source: UNIX
[ 53.019105] active wakeup source: UNIX
[ 53.022920] active wakeup source: UNIX
[ 53.026552] active wakeup source: UNIX
[ 53.030306] active wakeup source: UNIX
[ 53.034243] active wakeup source: [signalfd]
[ 53.038303]
[ 53.039768] Freezing of tasks aborted after 0.039 seconds (89 tasks refusing to freeze, wq_busy=0):
[ 53.048893]
[ 53.050267] Restarting tasks ...
[ 53.059209] mbim_read: Requests list is empty. Wait.
[ 53.076392] done.
[ 58.038058] gpio_sync_ri: RI owner is Modem
[ 58.041324] gpio_map_name_to_num: gpioRI is not supported
[ 58.958461] msm_serial_hs: Rx break
[ 118.604120] NOHZ: local_softirq_pending 08
[ 118.684236] NOHZ: local_softirq_pending 08
[ 127.107034] PM: Syncing filesystems ... done.
[ 127.221303] Freezing user space processes ...
[ 127.227376] mbim_read: Waiting failed
[ 127.231832] (elapsed 0.006 seconds) done.
[ 127.234793] Freezing remaining freezable tasks ... (elapsed 0.001 seconds) done.
[ 127.242697] Suspending console(s) (use no_console_suspend to debug)
Can the system resume on a GPIO interrupt?