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