|
@@ -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");
|