aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc/mmc.c
diff options
context:
space:
mode:
authorPierre Ossman <drzeus-list@drzeus.cx>2005-09-06 18:18:55 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2005-09-07 19:57:51 -0400
commitf218278a456b3c272b480443c89004c3d2a49f18 (patch)
tree8d9558816488311e06a7ad2434e342418f2c79d5 /drivers/mmc/mmc.c
parenta9c4342beb4cd28b3a05c3401195e2536c37c150 (diff)
[PATCH] sd: SD 4-bit bus
Infrastructure for 4-bit bus transfers with SD cards. Signed-off-by: Pierre Ossman <drzeus@drzeus.cx> Cc: Russell King <rmk@arm.linux.org.uk> Cc: David Brownell <david-b@pacbell.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/mmc/mmc.c')
-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