Message ID | 20210921111600.24577-6-tony@atomide.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | More SoCs for sdhci-omap to deprecate omap_hsmmc | expand |
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@atomide.com> > --- > 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); >
* Grygorii Strashko <grygorii.strashko@ti.com> [210922 15:23]: > > @@ -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 Oops. Thanks for spotting it, will fix. Regards, Tony
* Tony Lindgren <tony@atomide.com> [210923 05:34]: > * Grygorii Strashko <grygorii.strashko@ti.com> [210922 15:23]: > > > @@ -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 > > Oops. Thanks for spotting it, will fix. Ah I forgot that wlcore does not use the dat1 interrupt but has a separate gpio interrupt for wake-up. And that's why grep wake /proc/interrupts was increasing for me.. I'll ad a comment about that and will also test with mwifiex_sdio device I have. Regards, Tony
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"); + 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);
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 | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)