[Letux-kernel] omap_hsmmc + gta04 + sdio irq + runtime_suspend + 4 bit = trouble

Tony Lindgren tony at atomide.com
Mon Nov 12 19:37:10 CET 2018


* Andreas Kemnade <andreas at kemnade.info> [181108 18:40]:
> On Thu, 8 Nov 2018 09:06:37 -0800
> Tony Lindgren <tony at atomide.com> wrote:
> 
> > * Andreas Kemnade <andreas at kemnade.info> [181106 21:37]:
> > > Hi Tony,
> > > 
> > > On Tue, 6 Nov 2018 12:39:14 -0800
> > > Tony Lindgren <tony at atomide.com> wrote:
> > >   
> > > > * Andreas Kemnade <andreas at kemnade.info> [181106 20:24]:  
> > > > > Mainline kernel gives only about 100KByte/s, with sdio irqs I get >
> > > > > 1000KByte/s.    
> > > > 
> > > > That does not sound right at all. To me it sounds like the SDIO
> > > > irq is not working at all during runtime for your SoC? Is that  
> > > 
> > > no wakeirq, no sdio irq:
> Maybe this could be misunderstood:
> If you do not specify a wakeirq, sdio irq handling is not enabled at all:
> 
> > >         ret = omap_hsmmc_configure_wake_irq(host);
> > >         if (!ret)
> > >                 mmc->caps |= MMC_CAP_SDIO_IRQ;  
> > 
> 
> We are using this here to have at least decent performance, low latency and reliable
> 802.11 psmode (and therefore dramatically reduced power consumption of wifi module):
> http://git.goldelico.com/?p=letux-kernel.git;a=blobdiff;f=drivers/mmc/host/omap_hsmmc.c;h=bbfcef54b88cb534a49b1542e60c99e545a9e8a0;hp=68760d4a5d3da1a53c655d1b33f1c2237273d136;hb=44c8fc73ad8291c821855eaa88c13d5f9f2920f7;hpb=b48b43ee804e840de2e666873675d158b8219473

Looking at the commit above, looks like the sdio irq handling is
missing runtime PM calls.. So I wonder if we can just do the
following?

In theory setting the wlan mmc instance autosuspend_timeout_ms to -1
in sysfs should then do what your patch is doing except for enabling
sdio irq even without a wakeirq configured.

Regards,

Tony

8< -------------------
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -1668,6 +1668,14 @@ static void omap_hsmmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
 	struct omap_hsmmc_host *host = mmc_priv(mmc);
 	u32 irq_mask, con;
 	unsigned long flags;
+	int error;
+
+	error = pm_runtime_get_sync(host->dev);
+	if (error < 0) {
+		pm_runtime_put_noidle(host->dev);
+
+		return;
+	}
 
 	spin_lock_irqsave(&host->irq_lock, flags);
 
@@ -1696,6 +1704,9 @@ static void omap_hsmmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
 	OMAP_HSMMC_READ(host->base, IE);
 
 	spin_unlock_irqrestore(&host->irq_lock, flags);
+
+	pm_runtime_mark_last_busy(host->dev);
+	pm_runtime_put_autosuspend(host->dev);
 }
 
 static int omap_hsmmc_configure_wake_irq(struct omap_hsmmc_host *host)
-- 
2.19.1


More information about the Letux-kernel mailing list