diff options
author | Pierre Ossman <drzeus-list@drzeus.cx> | 2005-09-06 18:18:55 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-07 19:57:51 -0400 |
commit | f218278a456b3c272b480443c89004c3d2a49f18 (patch) | |
tree | 8d9558816488311e06a7ad2434e342418f2c79d5 /drivers/mmc/mmc.c | |
parent | a9c4342beb4cd28b3a05c3401195e2536c37c150 (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.c | 36 |
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 | ||