mmc.c | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-)
--- drivers/mmc/mmc.c.org 2006-01-29 14:27:39.000000000 -0800 +++ drivers/mmc/mmc.c 2006-01-29 17:17:59.000000000 -0800 @@ -366,9 +366,43 @@ return err; host->ios.bus_width = MMC_BUS_WIDTH_4; + } else if (card->csd.mmca_vsn == 4) { + /* + * XXX: There is a defined procedure that should + * be followed to establish whether 4bit and 8bit + * are supported. This involves sending a special + * command and data pattern and then sending another + * command to read it back. The pattern of the + * returned data indicates 4 and 8 bit support. + */ + + struct mmc_command cmd; + cmd.opcode = SD_APP_SET_BUS_WIDTH; + cmd.arg = 0x03B70100; + cmd.flags = MMC_RSP_R1B; + + err = mmc_wait_for_cmd(host, &cmd, CMD_RETRIES); + if (err != MMC_ERR_NONE) + return err; + + host->ios.bus_width = MMC_BUS_WIDTH_4; } } + /* Activate highspeed MMC v4 support. */ + if (card->csd.mmca_vsn == 4) { + struct mmc_command cmd; + cmd.opcode = SD_APP_SET_BUS_WIDTH; + cmd.arg = 0x03B90100; + cmd.flags = MMC_RSP_R1B; + + err = mmc_wait_for_cmd(host, &cmd, CMD_RETRIES); + if (err != MMC_ERR_NONE) + return err; + + /* XXX: Store state to indicate that HS was turned on. */ + } + host->ops->set_ios(host, &host->ios); return MMC_ERR_NONE; @@ -963,9 +997,17 @@ unsigned int max_dtr = host->f_max; list_for_each_entry(card, &host->cards, node) - if (!mmc_card_dead(card) && max_dtr > card->csd.max_dtr) - max_dtr = card->csd.max_dtr; - + if (!mmc_card_dead(card) && max_dtr > card->csd.max_dtr) { + if (card->csd.mmca_vsn == 4) { + /* + * Read EXT_CSD to find highest supported rate + * and check if HS was successfully turned on. + */ + max_dtr = 26000000; + } else { + max_dtr = card->csd.max_dtr; + } + } DBG("MMC: selected %d.%03dMHz transfer rate\n", max_dtr / 1000000, (max_dtr / 1000) % 1000);
Patch auto-colourised by diff.cgi, version 2005-10-10