Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 53585
b: refs/heads/master
c: 1addfcd
h: refs/heads/master
i:
  53583: 30197ba
v: v3
  • Loading branch information
Pierre Ossman committed May 1, 2007
1 parent d530012 commit 31a851d
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 9 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 55556da01284af8c2174b786b3eca8e11301b656
refs/heads/master: 1addfcdbe4b23a20f28a097c2469d9f0c21bef23
49 changes: 41 additions & 8 deletions trunk/drivers/mmc/core/sd.c
Original file line number Diff line number Diff line change
Expand Up @@ -183,16 +183,13 @@ static void mmc_decode_scr(struct mmc_card *card)
}

/*
* Test if the card supports high-speed mode and, if so, switch to it.
* Fetches and decodes switch information
*/
static int mmc_switch_hs(struct mmc_card *card)
static int mmc_read_switch(struct mmc_card *card)
{
int err;
u8 *status;

if (!(card->host->caps & MMC_CAP_SD_HIGHSPEED))
return MMC_ERR_NONE;

err = MMC_ERR_FAILED;

status = kmalloc(64, GFP_KERNEL);
Expand All @@ -209,14 +206,43 @@ static int mmc_switch_hs(struct mmc_card *card)
* Card not supporting high-speed will ignore the
* command.
*/
if (err == MMC_ERR_TIMEOUT)
err = MMC_ERR_NONE;
err = MMC_ERR_NONE;
goto out;
}

if (status[13] & 0x02)
card->sw_caps.hs_max_dtr = 50000000;

out:
kfree(status);

return err;
}

/*
* Test if the card supports high-speed mode and, if so, switch to it.
*/
static int mmc_switch_hs(struct mmc_card *card)
{
int err;
u8 *status;

if (!(card->host->caps & MMC_CAP_SD_HIGHSPEED))
return MMC_ERR_NONE;

if (card->sw_caps.hs_max_dtr == 0)
return MMC_ERR_NONE;

err = MMC_ERR_FAILED;

status = kmalloc(64, GFP_KERNEL);
if (!status) {
printk("%s: could not allocate a buffer for switch "
"capabilities.\n",
mmc_hostname(card->host));
return err;
}

err = mmc_sd_switch(card, 1, 0, 1, status);
if (err != MMC_ERR_NONE)
goto out;
Expand Down Expand Up @@ -393,7 +419,14 @@ int mmc_attach_sd(struct mmc_host *host, u32 ocr)
mmc_decode_scr(card);

/*
* Check if card can be switched into high-speed mode.
* Fetch switch information from card.
*/
err = mmc_read_switch(card);
if (err != MMC_ERR_NONE)
goto free_card;

/*
* Attempt to change to high-speed (if supported)
*/
err = mmc_switch_hs(card);
if (err != MMC_ERR_NONE)
Expand Down

0 comments on commit 31a851d

Please sign in to comment.