9
0
Fork 0

mci: Use tran_speed field to fix highspeed MMC card clock

The tran_speed field as decoded from csd is valid in most cases,
so use it to determine the maximum clock we can support. It is
not valid though for MMC highspeed cards, in this case the
csd contains invalid values and we have to set tran_speed explicitly
to the maximum speed. As the values passed into mci_set_clock are
now based on tran_speed we no longer have to limit the rate to
tran_speed in mci_set_clock.

The (intended) effect of this patch is that highspeed MMC cards are
no longer limited to non highspeed rates.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Sascha Hauer 2013-06-03 12:27:55 +02:00
parent 9590d6f9f1
commit dee6282fbf
2 changed files with 7 additions and 14 deletions

View File

@ -667,10 +667,6 @@ static void mci_set_clock(struct mci *mci, unsigned clock)
if (clock < host->f_min)
clock = host->f_min;
/* check against the limit at the card's side */
if (mci->tran_speed != 0 && clock > mci->tran_speed)
clock = mci->tran_speed;
host->clock = clock; /* the new target frequency */
mci_set_ios(mci);
}
@ -922,11 +918,8 @@ static int mci_startup_sd(struct mci *mci)
}
mci_set_bus_width(mci, MMC_BUS_WIDTH_4);
}
/* if possible, speed up the transfer */
if (mci_caps(mci) & MMC_CAP_SD_HIGHSPEED)
mci_set_clock(mci, 50000000);
else
mci_set_clock(mci, 25000000);
mci_set_clock(mci, mci->tran_speed);
return 0;
}
@ -948,13 +941,13 @@ static int mci_startup_mmc(struct mci *mci)
/* if possible, speed up the transfer */
if (mci_caps(mci) & MMC_CAP_MMC_HIGHSPEED) {
if (mci->card_caps & MMC_CAP_MMC_HIGHSPEED_52MHZ)
mci_set_clock(mci, 52000000);
mci->tran_speed = 52000000;
else
mci_set_clock(mci, 26000000);
} else {
mci_set_clock(mci, 20000000);
mci->tran_speed = 26000000;
}
mci_set_clock(mci, mci->tran_speed);
/*
* Unlike SD, MMC cards dont have a configuration register to notify
* supported bus width. So bus test command should be run to identify

View File

@ -336,7 +336,7 @@ struct mci {
unsigned csd[4]; /**< card's "card specific data register" */
unsigned cid[4]; /**< card's "card identification register" */
unsigned short rca; /* FIXME */
unsigned tran_speed; /**< not yet used */
unsigned tran_speed; /**< Maximum transfer speed */
/** currently used data block length for read accesses */
unsigned read_bl_len;
/** currently used data block length for write accesses */