Thread (13 messages) 13 messages, 3 authors, 2021-10-15

Re: [PATCH 6/6] mmc: sdhci-omap: Configure optional wakeirq

From: Ulf Hansson <hidden>
Date: 2021-10-12 15:03:02
Also in: linux-mmc, linux-omap

On Tue, 12 Oct 2021 at 12:38, Tony Lindgren [off-list ref] wrote:
quoted hunk ↗ jump to hunk
Configure optional wakeirq. This may be optionally configured for SDIO
dat1 pin for wake-up events for SoCs that support deeper idle states.

Signed-off-by: Tony Lindgren <tony@atomide.com>
---
 drivers/mmc/host/sdhci-omap.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)
diff --git a/drivers/mmc/host/sdhci-omap.c b/drivers/mmc/host/sdhci-omap.c
--- a/drivers/mmc/host/sdhci-omap.c
+++ b/drivers/mmc/host/sdhci-omap.c
@@ -12,8 +12,10 @@
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
+#include <linux/of_irq.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
+#include <linux/pm_wakeirq.h>
 #include <linux/regulator/consumer.h>
 #include <linux/pinctrl/consumer.h>
 #include <linux/sys_soc.h>
@@ -117,6 +119,7 @@ struct sdhci_omap_host {

        struct pinctrl          *pinctrl;
        struct pinctrl_state    **pinctrl_state;
+       int                     wakeirq;
        bool                    is_tuning;

        /* Offset for omap specific registers from base */
@@ -1360,6 +1363,25 @@ static int sdhci_omap_probe(struct platform_device *pdev)

        sdhci_omap_context_save(omap_host);

+       /*
+        * SDIO devices can use the dat1 pin as a wake-up interrupt. Some
+        * devices like wl1xxx, use an out-of-band GPIO interrupt instead.
+        */
Ah, right I recall this now. Very clever.
+       omap_host->wakeirq = of_irq_get_byname(dev->of_node, "wakeup");
+       if (omap_host->wakeirq == -EPROBE_DEFER) {
+               ret = -EPROBE_DEFER;
+               goto err_cleanup_host;
+       }
+       if (omap_host->wakeirq > 0) {
+               device_init_wakeup(dev, true);
+               ret = dev_pm_set_dedicated_wake_irq(dev, omap_host->wakeirq);
+               if (ret) {
+                       device_init_wakeup(dev, false);
+                       goto err_cleanup_host;
+               }
+               host->mmc->pm_caps |= MMC_PM_WAKE_SDIO_IRQ;
To prevent the mmc core from powering off the SDIO card in system
suspend (which certainly must be prevented if wakeups should be
delivered), you need to set MMC_PM_KEEP_POWER, too.

FYI: We also have common mmc DT properties for these caps, which are
being parsed in mmc_of_parse().

These are the DT properties:
"keep-power-in-suspend" - > MMC_PM_KEEP_POWER
"wakeup-source" || "enable-sdio-wakeup" (/* legacy */) -> MMC_PM_WAKE_SDIO_IRQ;
quoted hunk ↗ jump to hunk
+       }
+
        pm_runtime_mark_last_busy(dev);
        pm_runtime_put_autosuspend(dev);
@@ -1387,6 +1409,8 @@ static int sdhci_omap_remove(struct platform_device *pdev)

        pm_runtime_get_sync(dev);
        sdhci_remove_host(host, true);
+       device_init_wakeup(dev, false);
+       dev_pm_clear_wake_irq(dev);
        pm_runtime_dont_use_autosuspend(dev);
        pm_runtime_put_sync(dev);
        /* Ensure device gets idled despite userspace sysfs config */
--
2.33.0
I now think I better understand what is needed during system
suspend/resume to support system wakeups. I will comment on patch 4,
let's see what that brings us to.

Kind regards
Uffe
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help