diff options
Diffstat (limited to 'drivers/mmc/host/omap.c')
| -rw-r--r-- | drivers/mmc/host/omap.c | 11 | 
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c index adf32682f27a..c60a7625b1fa 100644 --- a/drivers/mmc/host/omap.c +++ b/drivers/mmc/host/omap.c @@ -104,6 +104,7 @@ struct mmc_omap_slot {  	unsigned int		vdd;  	u16			saved_con;  	u16			bus_mode; +	u16			power_mode;  	unsigned int		fclk_freq;  	struct tasklet_struct	cover_tasklet; @@ -1157,7 +1158,7 @@ static void mmc_omap_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)  	struct mmc_omap_slot *slot = mmc_priv(mmc);  	struct mmc_omap_host *host = slot->host;  	int i, dsor; -	int clk_enabled; +	int clk_enabled, init_stream;  	mmc_omap_select_slot(slot, 0); @@ -1167,6 +1168,7 @@ static void mmc_omap_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)  		slot->vdd = ios->vdd;  	clk_enabled = 0; +	init_stream = 0;  	switch (ios->power_mode) {  	case MMC_POWER_OFF:  		mmc_omap_set_power(slot, 0, ios->vdd); @@ -1174,13 +1176,17 @@ static void mmc_omap_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)  	case MMC_POWER_UP:  		/* Cannot touch dsor yet, just power up MMC */  		mmc_omap_set_power(slot, 1, ios->vdd); +		slot->power_mode = ios->power_mode;  		goto exit;  	case MMC_POWER_ON:  		mmc_omap_fclk_enable(host, 1);  		clk_enabled = 1;  		dsor |= 1 << 11; +		if (slot->power_mode != MMC_POWER_ON) +			init_stream = 1;  		break;  	} +	slot->power_mode = ios->power_mode;  	if (slot->bus_mode != ios->bus_mode) {  		if (slot->pdata->set_bus_mode != NULL) @@ -1196,7 +1202,7 @@ static void mmc_omap_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)  	for (i = 0; i < 2; i++)  		OMAP_MMC_WRITE(host, CON, dsor);  	slot->saved_con = dsor; -	if (ios->power_mode == MMC_POWER_ON) { +	if (init_stream) {  		/* worst case at 400kHz, 80 cycles makes 200 microsecs */  		int usecs = 250; @@ -1234,6 +1240,7 @@ static int mmc_omap_new_slot(struct mmc_omap_host *host, int id)  	slot->host = host;  	slot->mmc = mmc;  	slot->id = id; +	slot->power_mode = MMC_POWER_UNDEFINED;  	slot->pdata = &host->pdata->slots[id];  	host->slots[id] = slot;  |