aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc
diff options
context:
space:
mode:
authorPierre Ossman <drzeus@drzeus.cx>2007-05-01 08:46:08 -0400
committerPierre Ossman <drzeus@drzeus.cx>2007-05-01 08:46:08 -0400
commit1addfcdbe4b23a20f28a097c2469d9f0c21bef23 (patch)
tree802c1ec9e302b7fff94032f15d5ed0523ddc6c98 /drivers/mmc
parent55556da01284af8c2174b786b3eca8e11301b656 (diff)
mmc: break apart switch function
Break apart the SD switch function into one that reads the capabilities and one that acts on them. Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/core/sd.c49
1 files changed, 41 insertions, 8 deletions
diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
index fb18b301502e..ae54e8eb7fea 100644
--- a/drivers/mmc/core/sd.c
+++ b/drivers/mmc/core/sd.c
@@ -183,16 +183,13 @@ static void mmc_decode_scr(struct mmc_card *card)
183} 183}
184 184
185/* 185/*
186 * Test if the card supports high-speed mode and, if so, switch to it. 186 * Fetches and decodes switch information
187 */ 187 */
188static int mmc_switch_hs(struct mmc_card *card) 188static int mmc_read_switch(struct mmc_card *card)
189{ 189{
190 int err; 190 int err;
191 u8 *status; 191 u8 *status;
192 192
193 if (!(card->host->caps & MMC_CAP_SD_HIGHSPEED))
194 return MMC_ERR_NONE;
195
196 err = MMC_ERR_FAILED; 193 err = MMC_ERR_FAILED;
197 194
198 status = kmalloc(64, GFP_KERNEL); 195 status = kmalloc(64, GFP_KERNEL);
@@ -209,14 +206,43 @@ static int mmc_switch_hs(struct mmc_card *card)
209 * Card not supporting high-speed will ignore the 206 * Card not supporting high-speed will ignore the
210 * command. 207 * command.
211 */ 208 */
212 if (err == MMC_ERR_TIMEOUT) 209 err = MMC_ERR_NONE;
213 err = MMC_ERR_NONE;
214 goto out; 210 goto out;
215 } 211 }
216 212
217 if (status[13] & 0x02) 213 if (status[13] & 0x02)
218 card->sw_caps.hs_max_dtr = 50000000; 214 card->sw_caps.hs_max_dtr = 50000000;
219 215
216out:
217 kfree(status);
218
219 return err;
220}
221
222/*
223 * Test if the card supports high-speed mode and, if so, switch to it.
224 */
225static int mmc_switch_hs(struct mmc_card *card)
226{
227 int err;
228 u8 *status;
229
230 if (!(card->host->caps & MMC_CAP_SD_HIGHSPEED))
231 return MMC_ERR_NONE;
232
233 if (card->sw_caps.hs_max_dtr == 0)
234 return MMC_ERR_NONE;
235
236 err = MMC_ERR_FAILED;
237
238 status = kmalloc(64, GFP_KERNEL);
239 if (!status) {
240 printk("%s: could not allocate a buffer for switch "
241 "capabilities.\n",
242 mmc_hostname(card->host));
243 return err;
244 }
245
220 err = mmc_sd_switch(card, 1, 0, 1, status); 246 err = mmc_sd_switch(card, 1, 0, 1, status);
221 if (err != MMC_ERR_NONE) 247 if (err != MMC_ERR_NONE)
222 goto out; 248 goto out;
@@ -393,7 +419,14 @@ int mmc_attach_sd(struct mmc_host *host, u32 ocr)
393 mmc_decode_scr(card); 419 mmc_decode_scr(card);
394 420
395 /* 421 /*
396 * Check if card can be switched into high-speed mode. 422 * Fetch switch information from card.
423 */
424 err = mmc_read_switch(card);
425 if (err != MMC_ERR_NONE)
426 goto free_card;
427
428 /*
429 * Attempt to change to high-speed (if supported)
397 */ 430 */
398 err = mmc_switch_hs(card); 431 err = mmc_switch_hs(card);
399 if (err != MMC_ERR_NONE) 432 if (err != MMC_ERR_NONE)