On 21/09/2021 14:16, Tony Lindgren wrote:
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@xxxxxxxxxxx>
---
drivers/mmc/host/sdhci-omap.c | 19 +++++++++++++++++++
1 file changed, 19 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;
unsigned long context_valid:1;
unsigned long is_runtime_suspended:1;
unsigned long needs_resume:1;
@@ -1360,6 +1363,21 @@ static int sdhci_omap_probe(struct platform_device *pdev)
sdhci_omap_context_save(omap_host);
omap_host->context_valid = 1;
+ of_irq_get_byname(dev->of_node, "wakeup");
No assign to omap_host->wakeirq
+ 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;
+ }
+
pm_runtime_put_sync(dev);
return 0;
@@ -1385,6 +1403,7 @@ static int sdhci_omap_remove(struct platform_device *pdev)
pm_runtime_get_sync(dev);
sdhci_remove_host(host, true);
+ dev_pm_clear_wake_irq(dev);
pm_runtime_put_sync(dev);
pm_runtime_disable(dev);
sdhci_pltfm_free(pdev);
--
Best regards,
grygorii