OSDN Git Service

mmc: omap_hsmmc: context save and restore for DT
authorTony Lindgren <tony@atomide.com>
Sun, 20 Oct 2013 18:55:19 +0000 (00:25 +0530)
committerChris Ball <cjb@laptop.org>
Thu, 31 Oct 2013 00:26:18 +0000 (20:26 -0400)
We want to get rid of the omap specific platform init code
callbacks as they don't play nice with device tree.

Convert the context loss check to be based on a
register state detection instead.

Cc: Andreas Fenkart <afenkart@gmail.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
[add check for CON and HCTL in context save and restore function]
Signed-off-by: Balaji T K <balajitk@ti.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
drivers/mmc/host/omap_hsmmc.c

index f5de0b7..53b53b5 100644 (file)
@@ -171,6 +171,10 @@ struct omap_hsmmc_host {
        unsigned char           bus_mode;
        unsigned char           power_mode;
        int                     suspended;
+       u32                     con;
+       u32                     hctl;
+       u32                     sysctl;
+       u32                     capa;
        int                     irq;
        int                     use_dma, dma_ch;
        struct dma_chan         *tx_chan;
@@ -183,7 +187,6 @@ struct omap_hsmmc_host {
        int                     use_reg;
        int                     req_in_progress;
        struct omap_hsmmc_next  next_data;
-
        struct  omap_mmc_platform_data  *pdata;
 };
 
@@ -597,25 +600,20 @@ static void omap_hsmmc_set_bus_mode(struct omap_hsmmc_host *host)
 static int omap_hsmmc_context_restore(struct omap_hsmmc_host *host)
 {
        struct mmc_ios *ios = &host->mmc->ios;
-       struct omap_mmc_platform_data *pdata = host->pdata;
-       int context_loss = 0;
        u32 hctl, capa;
        unsigned long timeout;
 
-       if (pdata->get_context_loss_count) {
-               context_loss = pdata->get_context_loss_count(host->dev);
-               if (context_loss < 0)
-                       return 1;
-       }
-
-       dev_dbg(mmc_dev(host->mmc), "context was %slost\n",
-               context_loss == host->context_loss ? "not " : "");
-       if (host->context_loss == context_loss)
-               return 1;
-
        if (!OMAP_HSMMC_READ(host->base, SYSSTATUS) & RESETDONE)
                return 1;
 
+       if (host->con == OMAP_HSMMC_READ(host->base, CON) &&
+           host->hctl == OMAP_HSMMC_READ(host->base, HCTL) &&
+           host->sysctl == OMAP_HSMMC_READ(host->base, SYSCTL) &&
+           host->capa == OMAP_HSMMC_READ(host->base, CAPA))
+               return 0;
+
+       host->context_loss++;
+
        if (host->pdata->controller_flags & OMAP_HSMMC_SUPPORTS_DUAL_VOLT) {
                if (host->power_mode != MMC_POWER_OFF &&
                    (1 << ios->vdd) <= MMC_VDD_23_24)
@@ -655,9 +653,8 @@ static int omap_hsmmc_context_restore(struct omap_hsmmc_host *host)
        omap_hsmmc_set_bus_mode(host);
 
 out:
-       host->context_loss = context_loss;
-
-       dev_dbg(mmc_dev(host->mmc), "context is restored\n");
+       dev_dbg(mmc_dev(host->mmc), "context is restored: restore count %d\n",
+               host->context_loss);
        return 0;
 }
 
@@ -666,15 +663,10 @@ out:
  */
 static void omap_hsmmc_context_save(struct omap_hsmmc_host *host)
 {
-       struct omap_mmc_platform_data *pdata = host->pdata;
-       int context_loss;
-
-       if (pdata->get_context_loss_count) {
-               context_loss = pdata->get_context_loss_count(host->dev);
-               if (context_loss < 0)
-                       return;
-               host->context_loss = context_loss;
-       }
+       host->con =  OMAP_HSMMC_READ(host->base, CON);
+       host->hctl = OMAP_HSMMC_READ(host->base, HCTL);
+       host->sysctl =  OMAP_HSMMC_READ(host->base, SYSCTL);
+       host->capa = OMAP_HSMMC_READ(host->base, CAPA);
 }
 
 #else
@@ -1635,13 +1627,9 @@ 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);
-       int context_loss = 0;
-
-       if (host->pdata->get_context_loss_count)
-               context_loss = host->pdata->get_context_loss_count(host->dev);
 
-       seq_printf(s, "mmc%d:\n ctx_loss:\t%d:%d\n\nregs:\n",
-                       mmc->index, host->context_loss, context_loss);
+       seq_printf(s, "mmc%d:\n ctx_loss:\t%d\n\nregs:\n",
+                       mmc->index, host->context_loss);
 
        if (host->suspended) {
                seq_printf(s, "host suspended, can't read registers\n");