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;
        int                     use_reg;
        int                     req_in_progress;
        struct omap_hsmmc_next  next_data;
-
        struct  omap_mmc_platform_data  *pdata;
 };
 
 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)
        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;
 }
 
  */
 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
 {
        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");