Message ID | 1400833834-15893-2-git-send-email-afenkart@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Friday 23 May 2014 02:00 PM, Andreas Fenkart wrote: > Signed-off-by: Andreas Fenkart <afenkart@gmail.com> > > diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c > index 272e0ee..c62d9dd 100644 > --- a/drivers/mmc/host/omap_hsmmc.c > +++ b/drivers/mmc/host/omap_hsmmc.c > @@ -199,7 +199,9 @@ struct omap_hsmmc_host { > struct dma_chan *rx_chan; > int slot_id; > int response_busy; > +#ifdef CONFIG_PM > int context_loss; > +#endif > int protect_card; > int reqs_blocked; > int use_reg; > @@ -712,14 +714,8 @@ static void omap_hsmmc_context_save(struct omap_hsmmc_host *host) > > #else > > -static int omap_hsmmc_context_restore(struct omap_hsmmc_host *host) > -{ > - return 0; > -} > - > -static void omap_hsmmc_context_save(struct omap_hsmmc_host *host) > -{ > -} > +#define omap_hsmmc_context_restore(host) > +#define omap_hsmmc_context_save(host) > > #endif > > @@ -1700,11 +1696,14 @@ static int omap_hsmmc_regs_show(struct seq_file *s, void *data) > struct mmc_host *mmc = s->private; > struct omap_hsmmc_host *host = mmc_priv(mmc); > > - seq_printf(s, "mmc%d:\n ctx_loss:\t%d\n\nregs:\n", > - mmc->index, host->context_loss); > + seq_printf(s, "mmc%d:\n", mmc->index); > > - pm_runtime_get_sync(host->dev); > +#ifdef CONFIG_PM > + seq_printf(s, "ctx_loss:\t%d\n", host->context_loss); > +#endif > > + pm_runtime_get_sync(host->dev); > + seq_puts(s, "\nregs:\n"); > seq_printf(s, "CON:\t\t0x%08x\n", > OMAP_HSMMC_READ(host->base, CON)); > seq_printf(s, "HCTL:\t\t0x%08x\n", > @@ -2243,6 +2242,7 @@ static int omap_hsmmc_resume(struct device *dev) > #define omap_hsmmc_resume NULL > #endif > > +#ifdef CONFIG_PM_RUNTIME AFAIK, omap_hsmmc can build without these changes, So, I think this patch is not needed. Let me I know If it is not the case. > static int omap_hsmmc_runtime_suspend(struct device *dev) > { > struct omap_hsmmc_host *host; > @@ -2264,6 +2264,10 @@ static int omap_hsmmc_runtime_resume(struct device *dev) > > return 0; > } > +#else > +#define omap_hsmmc_runtime_suspend NULL > +#define omap_hsmmc_runtime_resume NULL > +#endif > > static struct dev_pm_ops omap_hsmmc_dev_pm_ops = { > .suspend = omap_hsmmc_suspend, > -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
2014-05-23 12:16 GMT+02:00 Balaji T K <balajitk@ti.com>: > On Friday 23 May 2014 02:00 PM, Andreas Fenkart wrote: >> >> >> +#ifdef CONFIG_PM_RUNTIME > > > AFAIK, omap_hsmmc can build without these changes, > So, I think this patch is not needed. > > Let me I know If it is not the case. if do not guard suspend/resume then I have to add guards in patch 1/7: > @@ -2200,11 +2346,18 @@ static int omap_hsmmc_suspend(struct device *dev) > pm_runtime_get_sync(host->dev); > > if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER)) { > - omap_hsmmc_disable_irq(host); > + OMAP_HSMMC_WRITE(host->base, ISE, 0); > + OMAP_HSMMC_WRITE(host->base, IE, 0); > + OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR); > OMAP_HSMMC_WRITE(host->base, HCTL, > OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP); > } > > + /* do not wake up due to sdio irq */ > + if ((host->mmc->caps & MMC_CAP_SDIO_IRQ) && > + !(host->mmc->pm_flags & MMC_PM_WAKE_SDIO_IRQ)) > + disable_irq(host->wake_irq); here > + > if (host->dbclk) > clk_disable_unprepare(host->dbclk); > > @@ -2230,6 +2383,10 @@ static int omap_hsmmc_resume(struct device *dev) > > omap_hsmmc_protect_card(host); > > + if ((host->mmc->caps & MMC_CAP_SDIO_IRQ) && > + !(host->mmc->pm_flags & MMC_PM_WAKE_SDIO_IRQ)) > + enable_irq(host->wake_irq); > + > pm_runtime_mark_last_busy(host->dev); > pm_runtime_put_autosuspend(host->dev); > return 0; > @@ -2246,22 +2403,51 @@ static int omap_hsmmc_resume(struct device *dev) > static int omap_hsmmc_runtime_suspend(struct device *dev) > { > struct omap_hsmmc_host *host; > + unsigned long flags; > > host = platform_get_drvdata(to_platform_device(dev)); > omap_hsmmc_context_save(host); > dev_dbg(dev, "disabled\n"); > > + spin_lock_irqsave(&host->irq_lock, flags); > + if ((host->mmc->caps & MMC_CAP_SDIO_IRQ) && > + (host->flags & HSMMC_SDIO_IRQ_ENABLED)) { > + /* disable sdio irq handling to prevent race */ > + OMAP_HSMMC_WRITE(host->base, ISE, 0); > + OMAP_HSMMC_WRITE(host->base, IE, 0); > + OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR); > + > + WARN_ON(host->flags & HSMMC_WAKE_IRQ_ENABLED); > + enable_irq(host->wake_irq); and here > + host->flags |= HSMMC_WAKE_IRQ_ENABLED; > + } > + spin_unlock_irqrestore(&host->irq_lock, flags); > return 0; > } > -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index 272e0ee..c62d9dd 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c @@ -199,7 +199,9 @@ struct omap_hsmmc_host { struct dma_chan *rx_chan; int slot_id; int response_busy; +#ifdef CONFIG_PM int context_loss; +#endif int protect_card; int reqs_blocked; int use_reg; @@ -712,14 +714,8 @@ static void omap_hsmmc_context_save(struct omap_hsmmc_host *host) #else -static int omap_hsmmc_context_restore(struct omap_hsmmc_host *host) -{ - return 0; -} - -static void omap_hsmmc_context_save(struct omap_hsmmc_host *host) -{ -} +#define omap_hsmmc_context_restore(host) +#define omap_hsmmc_context_save(host) #endif @@ -1700,11 +1696,14 @@ static int omap_hsmmc_regs_show(struct seq_file *s, void *data) struct mmc_host *mmc = s->private; struct omap_hsmmc_host *host = mmc_priv(mmc); - seq_printf(s, "mmc%d:\n ctx_loss:\t%d\n\nregs:\n", - mmc->index, host->context_loss); + seq_printf(s, "mmc%d:\n", mmc->index); - pm_runtime_get_sync(host->dev); +#ifdef CONFIG_PM + seq_printf(s, "ctx_loss:\t%d\n", host->context_loss); +#endif + pm_runtime_get_sync(host->dev); + seq_puts(s, "\nregs:\n"); seq_printf(s, "CON:\t\t0x%08x\n", OMAP_HSMMC_READ(host->base, CON)); seq_printf(s, "HCTL:\t\t0x%08x\n", @@ -2243,6 +2242,7 @@ static int omap_hsmmc_resume(struct device *dev) #define omap_hsmmc_resume NULL #endif +#ifdef CONFIG_PM_RUNTIME static int omap_hsmmc_runtime_suspend(struct device *dev) { struct omap_hsmmc_host *host; @@ -2264,6 +2264,10 @@ static int omap_hsmmc_runtime_resume(struct device *dev) return 0; } +#else +#define omap_hsmmc_runtime_suspend NULL +#define omap_hsmmc_runtime_resume NULL +#endif static struct dev_pm_ops omap_hsmmc_dev_pm_ops = { .suspend = omap_hsmmc_suspend,
Signed-off-by: Andreas Fenkart <afenkart@gmail.com>