On 8/6/2021 1:10 AM, Stephen Boyd wrote:
Quoting Deepak Kumar Singh (2021-08-05 09:17:33)
Some use cases require SMP2P interrupts to wake up the host
from suspend.
Please elaborate on this point so we understand what sort of scenarios
want to wakeup from suspend.
Once such scenario is where WiFi/modem crashes and notifies crash to
local host through smp2p
if local host is in suspend it should wake up to handle the crash and
reboot the WiFi/modem.
Mark smp2p interrupt as wakeup capable to abort
the suspend.
Signed-off-by: Deepak Kumar Singh <deesin@xxxxxxxxxxxxxx>
---
drivers/soc/qcom/smp2p.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/drivers/soc/qcom/smp2p.c b/drivers/soc/qcom/smp2p.c
index 2df4883..f8659b0 100644
--- a/drivers/soc/qcom/smp2p.c
+++ b/drivers/soc/qcom/smp2p.c
@@ -18,6 +18,7 @@
#include <linux/soc/qcom/smem.h>
#include <linux/soc/qcom/smem_state.h>
#include <linux/spinlock.h>
+#include <linux/pm_wakeirq.h>
/*
* The Shared Memory Point to Point (SMP2P) protocol facilitates communication
@@ -538,9 +539,19 @@ static int qcom_smp2p_probe(struct platform_device *pdev)
goto unwind_interfaces;
}
+ ret = device_init_wakeup(&pdev->dev, true);
Is smp2p supposed to wake up the device by default? If not, then this
should be device_set_wakeup_capable() instead so that userspace can
decide if it wants to get the wakeup.
yes, we want smp2p to be wake up capable by default.
+ if (ret)
+ goto unwind_interfaces;
+
+ ret = dev_pm_set_wake_irq(&pdev->dev, irq);
+ if (ret)
+ goto set_wakeup_failed;
Otherwise this looks good to me.
return 0;
+set_wakeup_failed:
+ device_init_wakeup(&pdev->dev, false);
+
unwind_interfaces:
list_for_each_entry(entry, &smp2p->inbound, node)
irq_domain_remove(entry->domain);