diff mbox series

[5/5] mmc: sdhci-omap: Configure optional wakeirq

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

Commit Message

Tony Lindgren Sept. 21, 2021, 11:16 a.m. UTC
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(+)

Comments

Grygorii Strashko Sept. 22, 2021, 3:23 p.m. UTC | #1
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);
>
Tony Lindgren Sept. 23, 2021, 5:33 a.m. UTC | #2
* 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 Sept. 24, 2021, 7:08 a.m. UTC | #3
* 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 mbox series

Patch

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);