aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mmc/mmc.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 21d4fb3314f8..6414f071a2a4 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -335,6 +335,40 @@ static int mmc_select_card(struct mmc_host *host, struct mmc_card *card)
335 if (err != MMC_ERR_NONE) 335 if (err != MMC_ERR_NONE)
336 return err; 336 return err;
337 337
338 /*
339 * Default bus width is 1 bit.
340 */
341 host->ios.bus_width = MMC_BUS_WIDTH_1;
342
343 /*
344 * We can only change the bus width of the selected
345 * card so therefore we have to put the handling
346 * here.
347 */
348 if (host->caps & MMC_CAP_4_BIT_DATA) {
349 /*
350 * The card is in 1 bit mode by default so
351 * we only need to change if it supports the
352 * wider version.
353 */
354 if (mmc_card_sd(card) &&
355 (card->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) {
356 struct mmc_command cmd;
357 cmd.opcode = SD_APP_SET_BUS_WIDTH;
358 cmd.arg = SD_BUS_WIDTH_4;
359 cmd.flags = MMC_RSP_R1;
360
361 err = mmc_wait_for_app_cmd(host, card->rca, &cmd,
362 CMD_RETRIES);
363 if (err != MMC_ERR_NONE)
364 return err;
365
366 host->ios.bus_width = MMC_BUS_WIDTH_4;
367 }
368 }
369
370 host->ops->set_ios(host, &host->ios);
371
338 return MMC_ERR_NONE; 372 return MMC_ERR_NONE;
339} 373}
340 374
@@ -653,6 +687,7 @@ static void mmc_power_up(struct mmc_host *host)
653 host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN; 687 host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN;
654 host->ios.chip_select = MMC_CS_DONTCARE; 688 host->ios.chip_select = MMC_CS_DONTCARE;
655 host->ios.power_mode = MMC_POWER_UP; 689 host->ios.power_mode = MMC_POWER_UP;
690 host->ios.bus_width = MMC_BUS_WIDTH_1;
656 host->ops->set_ios(host, &host->ios); 691 host->ops->set_ios(host, &host->ios);
657 692
658 mmc_delay(1); 693 mmc_delay(1);
@@ -671,6 +706,7 @@ static void mmc_power_off(struct mmc_host *host)
671 host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN; 706 host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN;
672 host->ios.chip_select = MMC_CS_DONTCARE; 707 host->ios.chip_select = MMC_CS_DONTCARE;
673 host->ios.power_mode = MMC_POWER_OFF; 708 host->ios.power_mode = MMC_POWER_OFF;
709 host->ios.bus_width = MMC_BUS_WIDTH_1;
674 host->ops->set_ios(host, &host->ios); 710 host->ops->set_ios(host, &host->ios);
675} 711}
676 712