Hi, On Mon, Oct 22, 2012 at 04:27:08PM +0300, Felipe Balbi wrote: > On Mon, Oct 22, 2012 at 03:59:28PM +0300, Felipe Balbi wrote: > > prepare() is supposed to prevent new children from > > being registered. On the MMC subsystem, children > > (new cards) registration starts with the card > > detect IRQ. > > > > Move card detect IRQ disabling to prepare() so that > > no new cards will be registered while we're trying > > to suspend. > > > > Likewise, move card detect IRQ enabling to complete() > > so we only try to register new children after our MMC > > IP is back up. > > > > Signed-off-by: Felipe Balbi <balbi@xxxxxx> > > --- > > > > Venkat, do you think the patch below makes sense ? > > btw, just checked suspend to ram with beagle and panda. We still have > our filesystem after waking up. > > ps: you will [1] to test it: > > [1] http://marc.info/?l=linux-arm-kernel&m=135090724817604&w=2 ping > > > diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c > > index 54bfd0c..4c8b41e 100644 > > --- a/drivers/mmc/host/omap_hsmmc.c > > +++ b/drivers/mmc/host/omap_hsmmc.c > > @@ -2022,6 +2022,26 @@ static int __devexit omap_hsmmc_remove(struct platform_device *pdev) > > } > > > > #ifdef CONFIG_PM > > +static int omap_hsmmc_prepare(struct device *dev) > > +{ > > + struct omap_hsmmc_host *host = dev_get_drvdata(dev); > > + > > + if (host->pdata->suspend) > > + return host->pdata->suspend(dev, host->slot_id); > > + > > + return 0; > > +} > > + > > +static int omap_hsmmc_complete(struct device *dev) > > +{ > > + struct omap_hsmmc_host *host = dev_get_drvdata(dev); > > + > > + if (host->pdata->resume) > > + return host->pdata->resume(dev, host->slot_id); > > + > > + return 0; > > +} > > + > > static int omap_hsmmc_suspend(struct device *dev) > > { > > int ret = 0; > > @@ -2035,23 +2055,10 @@ static int omap_hsmmc_suspend(struct device *dev) > > > > pm_runtime_get_sync(host->dev); > > host->suspended = 1; > > - if (host->pdata->suspend) { > > - ret = host->pdata->suspend(dev, host->slot_id); > > - if (ret) { > > - dev_dbg(dev, "Unable to handle MMC board" > > - " level suspend\n"); > > - host->suspended = 0; > > - return ret; > > - } > > - } > > ret = mmc_suspend_host(host->mmc); > > > > if (ret) { > > host->suspended = 0; > > - if (host->pdata->resume) { > > - if (host->pdata->resume(dev, host->slot_id)) > > - dev_dbg(dev, "Unmask interrupt failed\n"); > > - } > > goto err; > > } > > > > @@ -2088,12 +2095,6 @@ static int omap_hsmmc_resume(struct device *dev) > > if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER)) > > omap_hsmmc_conf_bus_power(host); > > > > - if (host->pdata->resume) { > > - ret = host->pdata->resume(dev, host->slot_id); > > - if (ret) > > - dev_dbg(dev, "Unmask interrupt failed\n"); > > - } > > - > > omap_hsmmc_protect_card(host); > > > > /* Notify the core to resume the host */ > > @@ -2109,8 +2110,10 @@ static int omap_hsmmc_resume(struct device *dev) > > } > > > > #else > > +#define omap_hsmmc_prepare NULL > > +#define omap_hsmmc_complete NULL > > #define omap_hsmmc_suspend NULL > > -#define omap_hsmmc_resume NULL > > +#define omap_hsmmc_resume NULL > > #endif > > > > static int omap_hsmmc_runtime_suspend(struct device *dev) > > @@ -2138,6 +2141,8 @@ static int omap_hsmmc_runtime_resume(struct device *dev) > > static struct dev_pm_ops omap_hsmmc_dev_pm_ops = { > > .suspend = omap_hsmmc_suspend, > > .resume = omap_hsmmc_resume, > > + .prepare = omap_hsmmc_prepare, > > + .complete = omap_hsmmc_complete, > > .runtime_suspend = omap_hsmmc_runtime_suspend, > > .runtime_resume = omap_hsmmc_runtime_resume, > > }; > > -- > > 1.8.0.rc0 > > -- balbi
Attachment:
signature.asc
Description: Digital signature