|
@@ -143,6 +143,7 @@ struct mmc_omap_host {
|
|
|
unsigned int dma_len;
|
|
|
unsigned int dma_sg_idx;
|
|
|
unsigned char bus_mode;
|
|
|
+ unsigned char power_mode;
|
|
|
u32 *buffer;
|
|
|
u32 bytesleft;
|
|
|
int suspended;
|
|
@@ -863,16 +864,25 @@ static void omap_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|
|
unsigned long regval;
|
|
|
unsigned long timeout;
|
|
|
u32 con;
|
|
|
+ int do_send_init_stream = 0;
|
|
|
|
|
|
mmc_host_enable(host->mmc);
|
|
|
|
|
|
- switch (ios->power_mode) {
|
|
|
- case MMC_POWER_OFF:
|
|
|
- mmc_slot(host).set_power(host->dev, host->slot_id, 0, 0);
|
|
|
- break;
|
|
|
- case MMC_POWER_UP:
|
|
|
- mmc_slot(host).set_power(host->dev, host->slot_id, 1, ios->vdd);
|
|
|
- break;
|
|
|
+ if (ios->power_mode != host->power_mode) {
|
|
|
+ switch (ios->power_mode) {
|
|
|
+ case MMC_POWER_OFF:
|
|
|
+ mmc_slot(host).set_power(host->dev, host->slot_id,
|
|
|
+ 0, 0);
|
|
|
+ break;
|
|
|
+ case MMC_POWER_UP:
|
|
|
+ mmc_slot(host).set_power(host->dev, host->slot_id,
|
|
|
+ 1, ios->vdd);
|
|
|
+ break;
|
|
|
+ case MMC_POWER_ON:
|
|
|
+ do_send_init_stream = 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ host->power_mode = ios->power_mode;
|
|
|
}
|
|
|
|
|
|
con = OMAP_HSMMC_READ(host->base, CON);
|
|
@@ -938,7 +948,7 @@ static void omap_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|
|
OMAP_HSMMC_WRITE(host->base, SYSCTL,
|
|
|
OMAP_HSMMC_READ(host->base, SYSCTL) | CEN);
|
|
|
|
|
|
- if (ios->power_mode == MMC_POWER_ON)
|
|
|
+ if (do_send_init_stream)
|
|
|
send_init_stream(host);
|
|
|
|
|
|
if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN)
|
|
@@ -1116,6 +1126,7 @@ static int __init omap_mmc_probe(struct platform_device *pdev)
|
|
|
host->slot_id = 0;
|
|
|
host->mapbase = res->start;
|
|
|
host->base = ioremap(host->mapbase, SZ_4K);
|
|
|
+ host->power_mode = -1;
|
|
|
|
|
|
platform_set_drvdata(pdev, host);
|
|
|
INIT_WORK(&host->mmc_carddetect_work, mmc_omap_detect);
|