1*7ea239d9SPierre Ossman /* 2*7ea239d9SPierre Ossman * linux/drivers/mmc/sd.c 3*7ea239d9SPierre Ossman * 4*7ea239d9SPierre Ossman * Copyright (C) 2003-2004 Russell King, All Rights Reserved. 5*7ea239d9SPierre Ossman * SD support Copyright (C) 2004 Ian Molton, All Rights Reserved. 6*7ea239d9SPierre Ossman * Copyright (C) 2005-2007 Pierre Ossman, All Rights Reserved. 7*7ea239d9SPierre Ossman * 8*7ea239d9SPierre Ossman * This program is free software; you can redistribute it and/or modify 9*7ea239d9SPierre Ossman * it under the terms of the GNU General Public License version 2 as 10*7ea239d9SPierre Ossman * published by the Free Software Foundation. 11*7ea239d9SPierre Ossman */ 12*7ea239d9SPierre Ossman 13*7ea239d9SPierre Ossman #include <linux/err.h> 14*7ea239d9SPierre Ossman 15*7ea239d9SPierre Ossman #include <linux/mmc/host.h> 16*7ea239d9SPierre Ossman #include <linux/mmc/card.h> 17*7ea239d9SPierre Ossman #include <linux/mmc/mmc.h> 18*7ea239d9SPierre Ossman 19*7ea239d9SPierre Ossman #include "core.h" 20*7ea239d9SPierre Ossman #include "sysfs.h" 21*7ea239d9SPierre Ossman #include "mmc_ops.h" 22*7ea239d9SPierre Ossman #include "sd_ops.h" 23*7ea239d9SPierre Ossman 24*7ea239d9SPierre Ossman #include "core.h" 25*7ea239d9SPierre Ossman 26*7ea239d9SPierre Ossman static const unsigned int tran_exp[] = { 27*7ea239d9SPierre Ossman 10000, 100000, 1000000, 10000000, 28*7ea239d9SPierre Ossman 0, 0, 0, 0 29*7ea239d9SPierre Ossman }; 30*7ea239d9SPierre Ossman 31*7ea239d9SPierre Ossman static const unsigned char tran_mant[] = { 32*7ea239d9SPierre Ossman 0, 10, 12, 13, 15, 20, 25, 30, 33*7ea239d9SPierre Ossman 35, 40, 45, 50, 55, 60, 70, 80, 34*7ea239d9SPierre Ossman }; 35*7ea239d9SPierre Ossman 36*7ea239d9SPierre Ossman static const unsigned int tacc_exp[] = { 37*7ea239d9SPierre Ossman 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 38*7ea239d9SPierre Ossman }; 39*7ea239d9SPierre Ossman 40*7ea239d9SPierre Ossman static const unsigned int tacc_mant[] = { 41*7ea239d9SPierre Ossman 0, 10, 12, 13, 15, 20, 25, 30, 42*7ea239d9SPierre Ossman 35, 40, 45, 50, 55, 60, 70, 80, 43*7ea239d9SPierre Ossman }; 44*7ea239d9SPierre Ossman 45*7ea239d9SPierre Ossman #define UNSTUFF_BITS(resp,start,size) \ 46*7ea239d9SPierre Ossman ({ \ 47*7ea239d9SPierre Ossman const int __size = size; \ 48*7ea239d9SPierre Ossman const u32 __mask = (__size < 32 ? 1 << __size : 0) - 1; \ 49*7ea239d9SPierre Ossman const int __off = 3 - ((start) / 32); \ 50*7ea239d9SPierre Ossman const int __shft = (start) & 31; \ 51*7ea239d9SPierre Ossman u32 __res; \ 52*7ea239d9SPierre Ossman \ 53*7ea239d9SPierre Ossman __res = resp[__off] >> __shft; \ 54*7ea239d9SPierre Ossman if (__size + __shft > 32) \ 55*7ea239d9SPierre Ossman __res |= resp[__off-1] << ((32 - __shft) % 32); \ 56*7ea239d9SPierre Ossman __res & __mask; \ 57*7ea239d9SPierre Ossman }) 58*7ea239d9SPierre Ossman 59*7ea239d9SPierre Ossman /* 60*7ea239d9SPierre Ossman * Given the decoded CSD structure, decode the raw CID to our CID structure. 61*7ea239d9SPierre Ossman */ 62*7ea239d9SPierre Ossman static void mmc_decode_cid(struct mmc_card *card) 63*7ea239d9SPierre Ossman { 64*7ea239d9SPierre Ossman u32 *resp = card->raw_cid; 65*7ea239d9SPierre Ossman 66*7ea239d9SPierre Ossman memset(&card->cid, 0, sizeof(struct mmc_cid)); 67*7ea239d9SPierre Ossman 68*7ea239d9SPierre Ossman /* 69*7ea239d9SPierre Ossman * SD doesn't currently have a version field so we will 70*7ea239d9SPierre Ossman * have to assume we can parse this. 71*7ea239d9SPierre Ossman */ 72*7ea239d9SPierre Ossman card->cid.manfid = UNSTUFF_BITS(resp, 120, 8); 73*7ea239d9SPierre Ossman card->cid.oemid = UNSTUFF_BITS(resp, 104, 16); 74*7ea239d9SPierre Ossman card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8); 75*7ea239d9SPierre Ossman card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8); 76*7ea239d9SPierre Ossman card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8); 77*7ea239d9SPierre Ossman card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8); 78*7ea239d9SPierre Ossman card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8); 79*7ea239d9SPierre Ossman card->cid.hwrev = UNSTUFF_BITS(resp, 60, 4); 80*7ea239d9SPierre Ossman card->cid.fwrev = UNSTUFF_BITS(resp, 56, 4); 81*7ea239d9SPierre Ossman card->cid.serial = UNSTUFF_BITS(resp, 24, 32); 82*7ea239d9SPierre Ossman card->cid.year = UNSTUFF_BITS(resp, 12, 8); 83*7ea239d9SPierre Ossman card->cid.month = UNSTUFF_BITS(resp, 8, 4); 84*7ea239d9SPierre Ossman 85*7ea239d9SPierre Ossman card->cid.year += 2000; /* SD cards year offset */ 86*7ea239d9SPierre Ossman } 87*7ea239d9SPierre Ossman 88*7ea239d9SPierre Ossman /* 89*7ea239d9SPierre Ossman * Given a 128-bit response, decode to our card CSD structure. 90*7ea239d9SPierre Ossman */ 91*7ea239d9SPierre Ossman static void mmc_decode_csd(struct mmc_card *card) 92*7ea239d9SPierre Ossman { 93*7ea239d9SPierre Ossman struct mmc_csd *csd = &card->csd; 94*7ea239d9SPierre Ossman unsigned int e, m, csd_struct; 95*7ea239d9SPierre Ossman u32 *resp = card->raw_csd; 96*7ea239d9SPierre Ossman 97*7ea239d9SPierre Ossman csd_struct = UNSTUFF_BITS(resp, 126, 2); 98*7ea239d9SPierre Ossman 99*7ea239d9SPierre Ossman switch (csd_struct) { 100*7ea239d9SPierre Ossman case 0: 101*7ea239d9SPierre Ossman m = UNSTUFF_BITS(resp, 115, 4); 102*7ea239d9SPierre Ossman e = UNSTUFF_BITS(resp, 112, 3); 103*7ea239d9SPierre Ossman csd->tacc_ns = (tacc_exp[e] * tacc_mant[m] + 9) / 10; 104*7ea239d9SPierre Ossman csd->tacc_clks = UNSTUFF_BITS(resp, 104, 8) * 100; 105*7ea239d9SPierre Ossman 106*7ea239d9SPierre Ossman m = UNSTUFF_BITS(resp, 99, 4); 107*7ea239d9SPierre Ossman e = UNSTUFF_BITS(resp, 96, 3); 108*7ea239d9SPierre Ossman csd->max_dtr = tran_exp[e] * tran_mant[m]; 109*7ea239d9SPierre Ossman csd->cmdclass = UNSTUFF_BITS(resp, 84, 12); 110*7ea239d9SPierre Ossman 111*7ea239d9SPierre Ossman e = UNSTUFF_BITS(resp, 47, 3); 112*7ea239d9SPierre Ossman m = UNSTUFF_BITS(resp, 62, 12); 113*7ea239d9SPierre Ossman csd->capacity = (1 + m) << (e + 2); 114*7ea239d9SPierre Ossman 115*7ea239d9SPierre Ossman csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4); 116*7ea239d9SPierre Ossman csd->read_partial = UNSTUFF_BITS(resp, 79, 1); 117*7ea239d9SPierre Ossman csd->write_misalign = UNSTUFF_BITS(resp, 78, 1); 118*7ea239d9SPierre Ossman csd->read_misalign = UNSTUFF_BITS(resp, 77, 1); 119*7ea239d9SPierre Ossman csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3); 120*7ea239d9SPierre Ossman csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4); 121*7ea239d9SPierre Ossman csd->write_partial = UNSTUFF_BITS(resp, 21, 1); 122*7ea239d9SPierre Ossman break; 123*7ea239d9SPierre Ossman case 1: 124*7ea239d9SPierre Ossman /* 125*7ea239d9SPierre Ossman * This is a block-addressed SDHC card. Most 126*7ea239d9SPierre Ossman * interesting fields are unused and have fixed 127*7ea239d9SPierre Ossman * values. To avoid getting tripped by buggy cards, 128*7ea239d9SPierre Ossman * we assume those fixed values ourselves. 129*7ea239d9SPierre Ossman */ 130*7ea239d9SPierre Ossman mmc_card_set_blockaddr(card); 131*7ea239d9SPierre Ossman 132*7ea239d9SPierre Ossman csd->tacc_ns = 0; /* Unused */ 133*7ea239d9SPierre Ossman csd->tacc_clks = 0; /* Unused */ 134*7ea239d9SPierre Ossman 135*7ea239d9SPierre Ossman m = UNSTUFF_BITS(resp, 99, 4); 136*7ea239d9SPierre Ossman e = UNSTUFF_BITS(resp, 96, 3); 137*7ea239d9SPierre Ossman csd->max_dtr = tran_exp[e] * tran_mant[m]; 138*7ea239d9SPierre Ossman csd->cmdclass = UNSTUFF_BITS(resp, 84, 12); 139*7ea239d9SPierre Ossman 140*7ea239d9SPierre Ossman m = UNSTUFF_BITS(resp, 48, 22); 141*7ea239d9SPierre Ossman csd->capacity = (1 + m) << 10; 142*7ea239d9SPierre Ossman 143*7ea239d9SPierre Ossman csd->read_blkbits = 9; 144*7ea239d9SPierre Ossman csd->read_partial = 0; 145*7ea239d9SPierre Ossman csd->write_misalign = 0; 146*7ea239d9SPierre Ossman csd->read_misalign = 0; 147*7ea239d9SPierre Ossman csd->r2w_factor = 4; /* Unused */ 148*7ea239d9SPierre Ossman csd->write_blkbits = 9; 149*7ea239d9SPierre Ossman csd->write_partial = 0; 150*7ea239d9SPierre Ossman break; 151*7ea239d9SPierre Ossman default: 152*7ea239d9SPierre Ossman printk("%s: unrecognised CSD structure version %d\n", 153*7ea239d9SPierre Ossman mmc_hostname(card->host), csd_struct); 154*7ea239d9SPierre Ossman mmc_card_set_bad(card); 155*7ea239d9SPierre Ossman return; 156*7ea239d9SPierre Ossman } 157*7ea239d9SPierre Ossman } 158*7ea239d9SPierre Ossman 159*7ea239d9SPierre Ossman /* 160*7ea239d9SPierre Ossman * Given a 64-bit response, decode to our card SCR structure. 161*7ea239d9SPierre Ossman */ 162*7ea239d9SPierre Ossman static void mmc_decode_scr(struct mmc_card *card) 163*7ea239d9SPierre Ossman { 164*7ea239d9SPierre Ossman struct sd_scr *scr = &card->scr; 165*7ea239d9SPierre Ossman unsigned int scr_struct; 166*7ea239d9SPierre Ossman u32 resp[4]; 167*7ea239d9SPierre Ossman 168*7ea239d9SPierre Ossman BUG_ON(!mmc_card_sd(card)); 169*7ea239d9SPierre Ossman 170*7ea239d9SPierre Ossman resp[3] = card->raw_scr[1]; 171*7ea239d9SPierre Ossman resp[2] = card->raw_scr[0]; 172*7ea239d9SPierre Ossman 173*7ea239d9SPierre Ossman scr_struct = UNSTUFF_BITS(resp, 60, 4); 174*7ea239d9SPierre Ossman if (scr_struct != 0) { 175*7ea239d9SPierre Ossman printk("%s: unrecognised SCR structure version %d\n", 176*7ea239d9SPierre Ossman mmc_hostname(card->host), scr_struct); 177*7ea239d9SPierre Ossman mmc_card_set_bad(card); 178*7ea239d9SPierre Ossman return; 179*7ea239d9SPierre Ossman } 180*7ea239d9SPierre Ossman 181*7ea239d9SPierre Ossman scr->sda_vsn = UNSTUFF_BITS(resp, 56, 4); 182*7ea239d9SPierre Ossman scr->bus_widths = UNSTUFF_BITS(resp, 48, 4); 183*7ea239d9SPierre Ossman } 184*7ea239d9SPierre Ossman 185*7ea239d9SPierre Ossman /* 186*7ea239d9SPierre Ossman * Test if the card supports high-speed mode and, if so, switch to it. 187*7ea239d9SPierre Ossman */ 188*7ea239d9SPierre Ossman static int mmc_switch_hs(struct mmc_card *card) 189*7ea239d9SPierre Ossman { 190*7ea239d9SPierre Ossman int err; 191*7ea239d9SPierre Ossman u8 *status; 192*7ea239d9SPierre Ossman 193*7ea239d9SPierre Ossman if (!(card->host->caps & MMC_CAP_SD_HIGHSPEED)) 194*7ea239d9SPierre Ossman return MMC_ERR_NONE; 195*7ea239d9SPierre Ossman 196*7ea239d9SPierre Ossman err = MMC_ERR_FAILED; 197*7ea239d9SPierre Ossman 198*7ea239d9SPierre Ossman status = kmalloc(64, GFP_KERNEL); 199*7ea239d9SPierre Ossman if (!status) { 200*7ea239d9SPierre Ossman printk("%s: could not allocate a buffer for switch " 201*7ea239d9SPierre Ossman "capabilities.\n", 202*7ea239d9SPierre Ossman mmc_hostname(card->host)); 203*7ea239d9SPierre Ossman return err; 204*7ea239d9SPierre Ossman } 205*7ea239d9SPierre Ossman 206*7ea239d9SPierre Ossman err = mmc_sd_switch(card, 0, 0, 1, status); 207*7ea239d9SPierre Ossman if (err != MMC_ERR_NONE) { 208*7ea239d9SPierre Ossman /* 209*7ea239d9SPierre Ossman * Card not supporting high-speed will ignore the 210*7ea239d9SPierre Ossman * command. 211*7ea239d9SPierre Ossman */ 212*7ea239d9SPierre Ossman if (err == MMC_ERR_TIMEOUT) 213*7ea239d9SPierre Ossman err = MMC_ERR_NONE; 214*7ea239d9SPierre Ossman goto out; 215*7ea239d9SPierre Ossman } 216*7ea239d9SPierre Ossman 217*7ea239d9SPierre Ossman if (status[13] & 0x02) 218*7ea239d9SPierre Ossman card->sw_caps.hs_max_dtr = 50000000; 219*7ea239d9SPierre Ossman 220*7ea239d9SPierre Ossman err = mmc_sd_switch(card, 1, 0, 1, status); 221*7ea239d9SPierre Ossman if (err != MMC_ERR_NONE) 222*7ea239d9SPierre Ossman goto out; 223*7ea239d9SPierre Ossman 224*7ea239d9SPierre Ossman if ((status[16] & 0xF) != 1) { 225*7ea239d9SPierre Ossman printk(KERN_WARNING "%s: Problem switching card " 226*7ea239d9SPierre Ossman "into high-speed mode!\n", 227*7ea239d9SPierre Ossman mmc_hostname(card->host)); 228*7ea239d9SPierre Ossman } else { 229*7ea239d9SPierre Ossman mmc_card_set_highspeed(card); 230*7ea239d9SPierre Ossman mmc_set_timing(card->host, MMC_TIMING_SD_HS); 231*7ea239d9SPierre Ossman } 232*7ea239d9SPierre Ossman 233*7ea239d9SPierre Ossman out: 234*7ea239d9SPierre Ossman kfree(status); 235*7ea239d9SPierre Ossman 236*7ea239d9SPierre Ossman return err; 237*7ea239d9SPierre Ossman } 238*7ea239d9SPierre Ossman 239*7ea239d9SPierre Ossman /* 240*7ea239d9SPierre Ossman * Host is being removed. Free up the current card. 241*7ea239d9SPierre Ossman */ 242*7ea239d9SPierre Ossman static void mmc_sd_remove(struct mmc_host *host) 243*7ea239d9SPierre Ossman { 244*7ea239d9SPierre Ossman BUG_ON(!host); 245*7ea239d9SPierre Ossman BUG_ON(!host->card); 246*7ea239d9SPierre Ossman 247*7ea239d9SPierre Ossman mmc_remove_card(host->card); 248*7ea239d9SPierre Ossman host->card = NULL; 249*7ea239d9SPierre Ossman } 250*7ea239d9SPierre Ossman 251*7ea239d9SPierre Ossman /* 252*7ea239d9SPierre Ossman * Card detection callback from host. 253*7ea239d9SPierre Ossman */ 254*7ea239d9SPierre Ossman static void mmc_sd_detect(struct mmc_host *host) 255*7ea239d9SPierre Ossman { 256*7ea239d9SPierre Ossman int err; 257*7ea239d9SPierre Ossman 258*7ea239d9SPierre Ossman BUG_ON(!host); 259*7ea239d9SPierre Ossman BUG_ON(!host->card); 260*7ea239d9SPierre Ossman 261*7ea239d9SPierre Ossman mmc_claim_host(host); 262*7ea239d9SPierre Ossman 263*7ea239d9SPierre Ossman /* 264*7ea239d9SPierre Ossman * Just check if our card has been removed. 265*7ea239d9SPierre Ossman */ 266*7ea239d9SPierre Ossman err = mmc_send_status(host->card, NULL); 267*7ea239d9SPierre Ossman 268*7ea239d9SPierre Ossman mmc_release_host(host); 269*7ea239d9SPierre Ossman 270*7ea239d9SPierre Ossman if (err != MMC_ERR_NONE) { 271*7ea239d9SPierre Ossman mmc_remove_card(host->card); 272*7ea239d9SPierre Ossman host->card = NULL; 273*7ea239d9SPierre Ossman 274*7ea239d9SPierre Ossman mmc_claim_host(host); 275*7ea239d9SPierre Ossman mmc_detach_bus(host); 276*7ea239d9SPierre Ossman mmc_release_host(host); 277*7ea239d9SPierre Ossman } 278*7ea239d9SPierre Ossman } 279*7ea239d9SPierre Ossman 280*7ea239d9SPierre Ossman static const struct mmc_bus_ops mmc_sd_ops = { 281*7ea239d9SPierre Ossman .remove = mmc_sd_remove, 282*7ea239d9SPierre Ossman .detect = mmc_sd_detect, 283*7ea239d9SPierre Ossman }; 284*7ea239d9SPierre Ossman 285*7ea239d9SPierre Ossman /* 286*7ea239d9SPierre Ossman * Starting point for SD card init. 287*7ea239d9SPierre Ossman */ 288*7ea239d9SPierre Ossman int mmc_attach_sd(struct mmc_host *host, u32 ocr) 289*7ea239d9SPierre Ossman { 290*7ea239d9SPierre Ossman struct mmc_card *card; 291*7ea239d9SPierre Ossman int err; 292*7ea239d9SPierre Ossman u32 cid[4]; 293*7ea239d9SPierre Ossman unsigned int max_dtr; 294*7ea239d9SPierre Ossman 295*7ea239d9SPierre Ossman BUG_ON(!host); 296*7ea239d9SPierre Ossman BUG_ON(!host->claimed); 297*7ea239d9SPierre Ossman 298*7ea239d9SPierre Ossman mmc_attach_bus(host, &mmc_sd_ops); 299*7ea239d9SPierre Ossman 300*7ea239d9SPierre Ossman host->ocr = mmc_select_voltage(host, ocr); 301*7ea239d9SPierre Ossman 302*7ea239d9SPierre Ossman /* 303*7ea239d9SPierre Ossman * Can we support the voltage(s) of the card(s)? 304*7ea239d9SPierre Ossman */ 305*7ea239d9SPierre Ossman if (!host->ocr) 306*7ea239d9SPierre Ossman goto err; 307*7ea239d9SPierre Ossman 308*7ea239d9SPierre Ossman /* 309*7ea239d9SPierre Ossman * Since we're changing the OCR value, we seem to 310*7ea239d9SPierre Ossman * need to tell some cards to go back to the idle 311*7ea239d9SPierre Ossman * state. We wait 1ms to give cards time to 312*7ea239d9SPierre Ossman * respond. 313*7ea239d9SPierre Ossman */ 314*7ea239d9SPierre Ossman mmc_go_idle(host); 315*7ea239d9SPierre Ossman 316*7ea239d9SPierre Ossman /* 317*7ea239d9SPierre Ossman * If SD_SEND_IF_COND indicates an SD 2.0 318*7ea239d9SPierre Ossman * compliant card and we should set bit 30 319*7ea239d9SPierre Ossman * of the ocr to indicate that we can handle 320*7ea239d9SPierre Ossman * block-addressed SDHC cards. 321*7ea239d9SPierre Ossman */ 322*7ea239d9SPierre Ossman err = mmc_send_if_cond(host, host->ocr); 323*7ea239d9SPierre Ossman if (err == MMC_ERR_NONE) 324*7ea239d9SPierre Ossman ocr = host->ocr | (1 << 30); 325*7ea239d9SPierre Ossman 326*7ea239d9SPierre Ossman mmc_send_app_op_cond(host, ocr, NULL); 327*7ea239d9SPierre Ossman 328*7ea239d9SPierre Ossman /* 329*7ea239d9SPierre Ossman * Fetch CID from card. 330*7ea239d9SPierre Ossman */ 331*7ea239d9SPierre Ossman err = mmc_all_send_cid(host, cid); 332*7ea239d9SPierre Ossman if (err != MMC_ERR_NONE) 333*7ea239d9SPierre Ossman goto err; 334*7ea239d9SPierre Ossman 335*7ea239d9SPierre Ossman /* 336*7ea239d9SPierre Ossman * Allocate card structure. 337*7ea239d9SPierre Ossman */ 338*7ea239d9SPierre Ossman card = mmc_alloc_card(host); 339*7ea239d9SPierre Ossman if (IS_ERR(card)) 340*7ea239d9SPierre Ossman goto err; 341*7ea239d9SPierre Ossman 342*7ea239d9SPierre Ossman card->type = MMC_TYPE_SD; 343*7ea239d9SPierre Ossman memcpy(card->raw_cid, cid, sizeof(card->raw_cid)); 344*7ea239d9SPierre Ossman 345*7ea239d9SPierre Ossman /* 346*7ea239d9SPierre Ossman * Set card RCA. 347*7ea239d9SPierre Ossman */ 348*7ea239d9SPierre Ossman err = mmc_send_relative_addr(host, &card->rca); 349*7ea239d9SPierre Ossman if (err != MMC_ERR_NONE) 350*7ea239d9SPierre Ossman goto free_card; 351*7ea239d9SPierre Ossman 352*7ea239d9SPierre Ossman mmc_set_bus_mode(host, MMC_BUSMODE_PUSHPULL); 353*7ea239d9SPierre Ossman 354*7ea239d9SPierre Ossman /* 355*7ea239d9SPierre Ossman * Fetch CSD from card. 356*7ea239d9SPierre Ossman */ 357*7ea239d9SPierre Ossman err = mmc_send_csd(card, card->raw_csd); 358*7ea239d9SPierre Ossman if (err != MMC_ERR_NONE) 359*7ea239d9SPierre Ossman goto free_card; 360*7ea239d9SPierre Ossman 361*7ea239d9SPierre Ossman mmc_decode_csd(card); 362*7ea239d9SPierre Ossman mmc_decode_cid(card); 363*7ea239d9SPierre Ossman 364*7ea239d9SPierre Ossman /* 365*7ea239d9SPierre Ossman * Fetch SCR from card. 366*7ea239d9SPierre Ossman */ 367*7ea239d9SPierre Ossman err = mmc_select_card(card); 368*7ea239d9SPierre Ossman if (err != MMC_ERR_NONE) 369*7ea239d9SPierre Ossman goto free_card; 370*7ea239d9SPierre Ossman 371*7ea239d9SPierre Ossman err = mmc_app_send_scr(card, card->raw_scr); 372*7ea239d9SPierre Ossman if (err != MMC_ERR_NONE) 373*7ea239d9SPierre Ossman goto free_card; 374*7ea239d9SPierre Ossman 375*7ea239d9SPierre Ossman mmc_decode_scr(card); 376*7ea239d9SPierre Ossman 377*7ea239d9SPierre Ossman /* 378*7ea239d9SPierre Ossman * Check if card can be switched into high-speed mode. 379*7ea239d9SPierre Ossman */ 380*7ea239d9SPierre Ossman err = mmc_switch_hs(card); 381*7ea239d9SPierre Ossman if (err != MMC_ERR_NONE) 382*7ea239d9SPierre Ossman goto free_card; 383*7ea239d9SPierre Ossman 384*7ea239d9SPierre Ossman /* 385*7ea239d9SPierre Ossman * Compute bus speed. 386*7ea239d9SPierre Ossman */ 387*7ea239d9SPierre Ossman max_dtr = (unsigned int)-1; 388*7ea239d9SPierre Ossman 389*7ea239d9SPierre Ossman if (mmc_card_highspeed(card)) { 390*7ea239d9SPierre Ossman if (max_dtr > card->sw_caps.hs_max_dtr) 391*7ea239d9SPierre Ossman max_dtr = card->sw_caps.hs_max_dtr; 392*7ea239d9SPierre Ossman } else if (max_dtr > card->csd.max_dtr) { 393*7ea239d9SPierre Ossman max_dtr = card->csd.max_dtr; 394*7ea239d9SPierre Ossman } 395*7ea239d9SPierre Ossman 396*7ea239d9SPierre Ossman mmc_set_clock(host, max_dtr); 397*7ea239d9SPierre Ossman 398*7ea239d9SPierre Ossman /* 399*7ea239d9SPierre Ossman * Switch to wider bus (if supported). 400*7ea239d9SPierre Ossman */ 401*7ea239d9SPierre Ossman if ((host->caps && MMC_CAP_4_BIT_DATA) && 402*7ea239d9SPierre Ossman (card->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) { 403*7ea239d9SPierre Ossman err = mmc_app_set_bus_width(card, MMC_BUS_WIDTH_4); 404*7ea239d9SPierre Ossman if (err != MMC_ERR_NONE) 405*7ea239d9SPierre Ossman goto free_card; 406*7ea239d9SPierre Ossman 407*7ea239d9SPierre Ossman mmc_set_bus_width(host, MMC_BUS_WIDTH_4); 408*7ea239d9SPierre Ossman } 409*7ea239d9SPierre Ossman 410*7ea239d9SPierre Ossman host->card = card; 411*7ea239d9SPierre Ossman 412*7ea239d9SPierre Ossman mmc_release_host(host); 413*7ea239d9SPierre Ossman 414*7ea239d9SPierre Ossman err = mmc_register_card(card); 415*7ea239d9SPierre Ossman if (err) 416*7ea239d9SPierre Ossman goto reclaim_host; 417*7ea239d9SPierre Ossman 418*7ea239d9SPierre Ossman return 0; 419*7ea239d9SPierre Ossman 420*7ea239d9SPierre Ossman reclaim_host: 421*7ea239d9SPierre Ossman mmc_claim_host(host); 422*7ea239d9SPierre Ossman free_card: 423*7ea239d9SPierre Ossman mmc_remove_card(card); 424*7ea239d9SPierre Ossman host->card = NULL; 425*7ea239d9SPierre Ossman err: 426*7ea239d9SPierre Ossman mmc_detach_bus(host); 427*7ea239d9SPierre Ossman mmc_release_host(host); 428*7ea239d9SPierre Ossman 429*7ea239d9SPierre Ossman return 0; 430*7ea239d9SPierre Ossman } 431*7ea239d9SPierre Ossman 432