--- a/drivers/mmc/core/sd.c 2012-01-24 09:43:31.173250323 -0500 +++ b/drivers/mmc/core/sd.c 2012-01-28 19:12:53.581602729 -0500 @@ -22,7 +22,6 @@ #include "core.h" #include "bus.h" #include "mmc_ops.h" -#include "sd.h" #include "sd_ops.h" static const unsigned int tran_exp[] = { @@ -131,7 +130,7 @@ break; case 1: /* - * This is a block-addressed SDHC or SDXC card. Most + * This is a block-addressed SDHC card. Most * interesting fields are unused and have fixed * values. To avoid getting tripped by buggy cards, * we assume those fixed values ourselves. @@ -145,11 +144,6 @@ e = UNSTUFF_BITS(resp, 96, 3); csd->max_dtr = tran_exp[e] * tran_mant[m]; csd->cmdclass = UNSTUFF_BITS(resp, 84, 12); - csd->c_size = UNSTUFF_BITS(resp, 48, 22); - - /* SDXC cards have a minimum C_SIZE of 0x00FFFF */ - if (csd->c_size >= 0xFFFF) - mmc_card_set_ext_capacity(card); m = UNSTUFF_BITS(resp, 48, 22); csd->capacity = (1 + m) << 10; @@ -164,7 +158,7 @@ csd->erase_size = 1; break; default: - pr_err("%s: unrecognised CSD structure version %d\n", + printk(KERN_ERR "%s: unrecognised CSD structure version %d\n", mmc_hostname(card->host), csd_struct); return -EINVAL; } @@ -188,24 +182,19 @@ scr_struct = UNSTUFF_BITS(resp, 60, 4); if (scr_struct != 0) { - pr_err("%s: unrecognised SCR structure version %d\n", + printk(KERN_ERR "%s: unrecognised SCR structure version %d\n", mmc_hostname(card->host), scr_struct); return -EINVAL; } scr->sda_vsn = UNSTUFF_BITS(resp, 56, 4); scr->bus_widths = UNSTUFF_BITS(resp, 48, 4); - if (scr->sda_vsn == SCR_SPEC_VER_2) - /* Check if Physical Layer Spec v3.0 is supported */ - scr->sda_spec3 = UNSTUFF_BITS(resp, 47, 1); if (UNSTUFF_BITS(resp, 55, 1)) card->erased_byte = 0xFF; else card->erased_byte = 0x0; - if (scr->sda_spec3) - scr->cmds = UNSTUFF_BITS(resp, 32, 2); return 0; } @@ -219,7 +208,7 @@ u32 *ssr; if (!(card->csd.cmdclass & CCC_APP_SPEC)) { - pr_warning("%s: card lacks mandatory SD Status " + printk(KERN_WARNING "%s: card lacks mandatory SD Status " "function.\n", mmc_hostname(card->host)); return 0; } @@ -230,7 +219,7 @@ err = mmc_app_sd_status(card, ssr); if (err) { - pr_warning("%s: problem reading SD Status " + printk(KERN_WARNING "%s: problem reading SD Status " "register.\n", mmc_hostname(card->host)); err = 0; goto out; @@ -254,7 +243,7 @@ card->ssr.erase_offset = eo * 1000; } } else { - pr_warning("%s: SD Status: Invalid Allocation Unit " + printk(KERN_WARNING "%s: SD Status: Invalid Allocation Unit " "size.\n", mmc_hostname(card->host)); } out: @@ -274,7 +263,7 @@ return 0; if (!(card->csd.cmdclass & CCC_SWITCH)) { - pr_warning("%s: card lacks mandatory switch " + printk(KERN_WARNING "%s: card lacks mandatory switch " "function, performance might suffer.\n", mmc_hostname(card->host)); return 0; @@ -284,76 +273,31 @@ status = kmalloc(64, GFP_KERNEL); if (!status) { - pr_err("%s: could not allocate a buffer for " - "switch capabilities.\n", - mmc_hostname(card->host)); + printk(KERN_ERR "%s: could not allocate a buffer for " + "switch capabilities.\n", mmc_hostname(card->host)); return -ENOMEM; } - /* Find out the supported Bus Speed Modes. */ err = mmc_sd_switch(card, 0, 0, 1, status); if (err) { - /* - * If the host or the card can't do the switch, - * fail more gracefully. - */ - if (err != -EINVAL && err != -ENOSYS && err != -EFAULT) + /* If the host or the card can't do the switch, + * fail more gracefully. */ + if ((err != -EINVAL) + && (err != -ENOSYS) + && (err != -EFAULT)) goto out; - pr_warning("%s: problem reading Bus Speed modes.\n", + printk(KERN_WARNING "%s: problem reading switch " + "capabilities, performance might suffer.\n", mmc_hostname(card->host)); err = 0; goto out; } - if (status[13] & UHS_SDR50_BUS_SPEED) + if (status[13] & 0x02) card->sw_caps.hs_max_dtr = 50000000; - if (card->scr.sda_spec3) { - card->sw_caps.sd3_bus_mode = status[13]; - - /* Find out Driver Strengths supported by the card */ - err = mmc_sd_switch(card, 0, 2, 1, status); - if (err) { - /* - * If the host or the card can't do the switch, - * fail more gracefully. - */ - if (err != -EINVAL && err != -ENOSYS && err != -EFAULT) - goto out; - - pr_warning("%s: problem reading " - "Driver Strength.\n", - mmc_hostname(card->host)); - err = 0; - - goto out; - } - - card->sw_caps.sd3_drv_type = status[9]; - - /* Find out Current Limits supported by the card */ - err = mmc_sd_switch(card, 0, 3, 1, status); - if (err) { - /* - * If the host or the card can't do the switch, - * fail more gracefully. - */ - if (err != -EINVAL && err != -ENOSYS && err != -EFAULT) - goto out; - - pr_warning("%s: problem reading " - "Current Limit.\n", - mmc_hostname(card->host)); - err = 0; - - goto out; - } - - card->sw_caps.sd3_curr_limit = status[7]; - } - out: kfree(status); @@ -384,7 +328,7 @@ status = kmalloc(64, GFP_KERNEL); if (!status) { - pr_err("%s: could not allocate a buffer for " + printk(KERN_ERR "%s: could not allocate a buffer for " "switch capabilities.\n", mmc_hostname(card->host)); return -ENOMEM; } @@ -394,7 +338,7 @@ goto out; if ((status[16] & 0xF) != 1) { - pr_warning("%s: Problem switching card " + printk(KERN_WARNING "%s: Problem switching card " "into high-speed mode!\n", mmc_hostname(card->host)); err = 0; @@ -408,267 +352,6 @@ return err; } -static int sd_select_driver_type(struct mmc_card *card, u8 *status) -{ - int host_drv_type = SD_DRIVER_TYPE_B; - int card_drv_type = SD_DRIVER_TYPE_B; - int drive_strength; - int err; - - /* - * If the host doesn't support any of the Driver Types A,C or D, - * or there is no board specific handler then default Driver - * Type B is used. - */ - if (!(card->host->caps & (MMC_CAP_DRIVER_TYPE_A | MMC_CAP_DRIVER_TYPE_C - | MMC_CAP_DRIVER_TYPE_D))) - return 0; - - if (!card->host->ops->select_drive_strength) - return 0; - - if (card->host->caps & MMC_CAP_DRIVER_TYPE_A) - host_drv_type |= SD_DRIVER_TYPE_A; - - if (card->host->caps & MMC_CAP_DRIVER_TYPE_C) - host_drv_type |= SD_DRIVER_TYPE_C; - - if (card->host->caps & MMC_CAP_DRIVER_TYPE_D) - host_drv_type |= SD_DRIVER_TYPE_D; - - if (card->sw_caps.sd3_drv_type & SD_DRIVER_TYPE_A) - card_drv_type |= SD_DRIVER_TYPE_A; - - if (card->sw_caps.sd3_drv_type & SD_DRIVER_TYPE_C) - card_drv_type |= SD_DRIVER_TYPE_C; - - if (card->sw_caps.sd3_drv_type & SD_DRIVER_TYPE_D) - card_drv_type |= SD_DRIVER_TYPE_D; - - /* - * The drive strength that the hardware can support - * depends on the board design. Pass the appropriate - * information and let the hardware specific code - * return what is possible given the options - */ - drive_strength = card->host->ops->select_drive_strength( - card->sw_caps.uhs_max_dtr, - host_drv_type, card_drv_type); - - err = mmc_sd_switch(card, 1, 2, drive_strength, status); - if (err) - return err; - - if ((status[15] & 0xF) != drive_strength) { - pr_warning("%s: Problem setting drive strength!\n", - mmc_hostname(card->host)); - return 0; - } - - mmc_set_driver_type(card->host, drive_strength); - - return 0; -} - -static void sd_update_bus_speed_mode(struct mmc_card *card) -{ - /* - * If the host doesn't support any of the UHS-I modes, fallback on - * default speed. - */ - if (!(card->host->caps & (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | - MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR104 | MMC_CAP_UHS_DDR50))) { - card->sd_bus_speed = 0; - return; - } - - if ((card->host->caps & MMC_CAP_UHS_SDR104) && - (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR104)) { - card->sd_bus_speed = UHS_SDR104_BUS_SPEED; - } else if ((card->host->caps & MMC_CAP_UHS_DDR50) && - (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_DDR50)) { - card->sd_bus_speed = UHS_DDR50_BUS_SPEED; - } else if ((card->host->caps & (MMC_CAP_UHS_SDR104 | - MMC_CAP_UHS_SDR50)) && (card->sw_caps.sd3_bus_mode & - SD_MODE_UHS_SDR50)) { - card->sd_bus_speed = UHS_SDR50_BUS_SPEED; - } else if ((card->host->caps & (MMC_CAP_UHS_SDR104 | - MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR25)) && - (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR25)) { - card->sd_bus_speed = UHS_SDR25_BUS_SPEED; - } else if ((card->host->caps & (MMC_CAP_UHS_SDR104 | - MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR25 | - MMC_CAP_UHS_SDR12)) && (card->sw_caps.sd3_bus_mode & - SD_MODE_UHS_SDR12)) { - card->sd_bus_speed = UHS_SDR12_BUS_SPEED; - } -} - -static int sd_set_bus_speed_mode(struct mmc_card *card, u8 *status) -{ - int err; - unsigned int timing = 0; - - switch (card->sd_bus_speed) { - case UHS_SDR104_BUS_SPEED: - timing = MMC_TIMING_UHS_SDR104; - card->sw_caps.uhs_max_dtr = UHS_SDR104_MAX_DTR; - break; - case UHS_DDR50_BUS_SPEED: - timing = MMC_TIMING_UHS_DDR50; - card->sw_caps.uhs_max_dtr = UHS_DDR50_MAX_DTR; - break; - case UHS_SDR50_BUS_SPEED: - timing = MMC_TIMING_UHS_SDR50; - card->sw_caps.uhs_max_dtr = UHS_SDR50_MAX_DTR; - break; - case UHS_SDR25_BUS_SPEED: - timing = MMC_TIMING_UHS_SDR25; - card->sw_caps.uhs_max_dtr = UHS_SDR25_MAX_DTR; - break; - case UHS_SDR12_BUS_SPEED: - timing = MMC_TIMING_UHS_SDR12; - card->sw_caps.uhs_max_dtr = UHS_SDR12_MAX_DTR; - break; - default: - return 0; - } - - err = mmc_sd_switch(card, 1, 0, card->sd_bus_speed, status); - if (err) - return err; - - if ((status[16] & 0xF) != card->sd_bus_speed) - pr_warning("%s: Problem setting bus speed mode!\n", - mmc_hostname(card->host)); - else { - mmc_set_timing(card->host, timing); - mmc_set_clock(card->host, card->sw_caps.uhs_max_dtr); - } - - return 0; -} - -static int sd_set_current_limit(struct mmc_card *card, u8 *status) -{ - int current_limit = 0; - int err; - - /* - * Current limit switch is only defined for SDR50, SDR104, and DDR50 - * bus speed modes. For other bus speed modes, we set the default - * current limit of 200mA. - */ - if ((card->sd_bus_speed == UHS_SDR50_BUS_SPEED) || - (card->sd_bus_speed == UHS_SDR104_BUS_SPEED) || - (card->sd_bus_speed == UHS_DDR50_BUS_SPEED)) { - if (card->host->caps & MMC_CAP_MAX_CURRENT_800) { - if (card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_800) - current_limit = SD_SET_CURRENT_LIMIT_800; - else if (card->sw_caps.sd3_curr_limit & - SD_MAX_CURRENT_600) - current_limit = SD_SET_CURRENT_LIMIT_600; - else if (card->sw_caps.sd3_curr_limit & - SD_MAX_CURRENT_400) - current_limit = SD_SET_CURRENT_LIMIT_400; - else if (card->sw_caps.sd3_curr_limit & - SD_MAX_CURRENT_200) - current_limit = SD_SET_CURRENT_LIMIT_200; - } else if (card->host->caps & MMC_CAP_MAX_CURRENT_600) { - if (card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_600) - current_limit = SD_SET_CURRENT_LIMIT_600; - else if (card->sw_caps.sd3_curr_limit & - SD_MAX_CURRENT_400) - current_limit = SD_SET_CURRENT_LIMIT_400; - else if (card->sw_caps.sd3_curr_limit & - SD_MAX_CURRENT_200) - current_limit = SD_SET_CURRENT_LIMIT_200; - } else if (card->host->caps & MMC_CAP_MAX_CURRENT_400) { - if (card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_400) - current_limit = SD_SET_CURRENT_LIMIT_400; - else if (card->sw_caps.sd3_curr_limit & - SD_MAX_CURRENT_200) - current_limit = SD_SET_CURRENT_LIMIT_200; - } else if (card->host->caps & MMC_CAP_MAX_CURRENT_200) { - if (card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_200) - current_limit = SD_SET_CURRENT_LIMIT_200; - } - } else - current_limit = SD_SET_CURRENT_LIMIT_200; - - err = mmc_sd_switch(card, 1, 3, current_limit, status); - if (err) - return err; - - if (((status[15] >> 4) & 0x0F) != current_limit) - pr_warning("%s: Problem setting current limit!\n", - mmc_hostname(card->host)); - - return 0; -} - -/* - * UHS-I specific initialization procedure - */ -static int mmc_sd_init_uhs_card(struct mmc_card *card) -{ - int err; - u8 *status; - - if (!card->scr.sda_spec3) - return 0; - - if (!(card->csd.cmdclass & CCC_SWITCH)) - return 0; - - status = kmalloc(64, GFP_KERNEL); - if (!status) { - pr_err("%s: could not allocate a buffer for " - "switch capabilities.\n", mmc_hostname(card->host)); - return -ENOMEM; - } - - /* Set 4-bit bus width */ - if ((card->host->caps & MMC_CAP_4_BIT_DATA) && - (card->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) { - err = mmc_app_set_bus_width(card, MMC_BUS_WIDTH_4); - if (err) - goto out; - - mmc_set_bus_width(card->host, MMC_BUS_WIDTH_4); - } - - /* - * Select the bus speed mode depending on host - * and card capability. - */ - sd_update_bus_speed_mode(card); - - /* Set the driver strength for the card */ - err = sd_select_driver_type(card, status); - if (err) - goto out; - - /* Set current limit for the card */ - err = sd_set_current_limit(card, status); - if (err) - goto out; - - /* Set bus speed mode of the card */ - err = sd_set_bus_speed_mode(card, status); - if (err) - goto out; - - /* SPI mode doesn't define CMD19 */ - if (!mmc_host_is_spi(card->host) && card->host->ops->execute_tuning) - err = card->host->ops->execute_tuning(card->host); - -out: - kfree(status); - - return err; -} - MMC_DEV_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1], card->raw_cid[2], card->raw_cid[3]); MMC_DEV_ATTR(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1], @@ -717,7 +400,7 @@ /* * Fetch CID from card. */ -int mmc_sd_get_cid(struct mmc_host *host, u32 ocr, u32 *cid, u32 *rocr) +int mmc_sd_get_cid(struct mmc_host *host, u32 ocr, u32 *cid) { int err; @@ -737,39 +420,12 @@ */ err = mmc_send_if_cond(host, ocr); if (!err) - ocr |= SD_OCR_CCS; - - /* - * If the host supports one of UHS-I modes, request the card - * to switch to 1.8V signaling level. - */ - if (host->caps & (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | - MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR104 | MMC_CAP_UHS_DDR50)) - ocr |= SD_OCR_S18R; - - /* If the host can supply more than 150mA, XPC should be set to 1. */ - if (host->caps & (MMC_CAP_SET_XPC_330 | MMC_CAP_SET_XPC_300 | - MMC_CAP_SET_XPC_180)) - ocr |= SD_OCR_XPC; + ocr |= 1 << 30; -try_again: - err = mmc_send_app_op_cond(host, ocr, rocr); + err = mmc_send_app_op_cond(host, ocr, NULL); if (err) return err; - /* - * In case CCS and S18A in the response is set, start Signal Voltage - * Switch procedure. SPI mode doesn't support CMD11. - */ - if (!mmc_host_is_spi(host) && rocr && - ((*rocr & 0x41000000) == 0x41000000)) { - err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180, true); - if (err) { - ocr &= ~SD_OCR_S18R; - goto try_again; - } - } - if (mmc_host_is_spi(host)) err = mmc_send_cid(host, cid); else @@ -853,7 +509,7 @@ ro = host->ops->get_ro(host); if (ro < 0) { - pr_warning("%s: host does not " + printk(KERN_WARNING "%s: host does not " "support reading read-only " "switch. assuming write-enable.\n", mmc_hostname(host)); @@ -897,12 +553,11 @@ struct mmc_card *card; int err; u32 cid[4]; - u32 rocr = 0; BUG_ON(!host); WARN_ON(!host->claimed); - err = mmc_sd_get_cid(host, ocr, cid, &rocr); + err = mmc_sd_get_cid(host, ocr, cid); if (err) return err; @@ -930,6 +585,8 @@ err = mmc_send_relative_addr(host, &card->rca); if (err) return err; + + mmc_set_bus_mode(host, MMC_BUSMODE_PUSHPULL); } if (!oldcard) { @@ -953,47 +610,30 @@ if (err) goto free_card; - /* Initialization sequence for UHS-I cards */ - if (rocr & SD_ROCR_S18A) { - err = mmc_sd_init_uhs_card(card); - if (err) - goto free_card; + /* + * Attempt to change to high-speed (if supported) + */ + err = mmc_sd_switch_hs(card); + if (err > 0) + mmc_sd_go_highspeed(card); + else if (err) + goto free_card; - /* Card is an ultra-high-speed card */ - mmc_sd_card_set_uhs(card); + /* + * Set bus speed. + */ + mmc_set_clock(host, mmc_sd_get_max_clock(card)); - /* - * Since initialization is now complete, enable preset - * value registers for UHS-I cards. - */ - if (host->ops->enable_preset_value) - host->ops->enable_preset_value(host, true); - } else { - /* - * Attempt to change to high-speed (if supported) - */ - err = mmc_sd_switch_hs(card); - if (err > 0) - mmc_sd_go_highspeed(card); - else if (err) + /* + * Switch to wider bus (if supported). + */ + if ((host->caps & MMC_CAP_4_BIT_DATA) && + (card->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) { + err = mmc_app_set_bus_width(card, MMC_BUS_WIDTH_4); + if (err) goto free_card; - /* - * Set bus speed. - */ - mmc_set_clock(host, mmc_sd_get_max_clock(card)); - - /* - * Switch to wider bus (if supported). - */ - if ((host->caps & MMC_CAP_4_BIT_DATA) && - (card->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) { - err = mmc_app_set_bus_width(card, MMC_BUS_WIDTH_4); - if (err) - goto free_card; - - mmc_set_bus_width(host, MMC_BUS_WIDTH_4); - } + mmc_set_bus_width(host, MMC_BUS_WIDTH_4); } host->card = card; @@ -1042,7 +682,6 @@ mmc_claim_host(host); mmc_detach_bus(host); - mmc_power_off(host); mmc_release_host(host); } } @@ -1134,15 +773,6 @@ BUG_ON(!host); WARN_ON(!host->claimed); - /* Make sure we are at 3.3V signalling voltage */ - err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, false); - if (err) - return err; - - /* Disable preset value enable if already set since last time */ - if (host->ops->enable_preset_value) - host->ops->enable_preset_value(host, false); - err = mmc_send_app_op_cond(host, 0, &ocr); if (err) return err; @@ -1167,7 +797,7 @@ * support. */ if (ocr & 0x7F) { - pr_warning("%s: card claims to support voltages " + printk(KERN_WARNING "%s: card claims to support voltages " "below the defined range. These will be ignored.\n", mmc_hostname(host)); ocr &= ~0x7F; @@ -1175,7 +805,7 @@ if ((ocr & MMC_VDD_165_195) && !(host->ocr_avail_sd & MMC_VDD_165_195)) { - pr_warning("%s: SD card claims to support the " + printk(KERN_WARNING "%s: SD card claims to support the " "incompletely defined 'low voltage range'. This " "will be ignored.\n", mmc_hostname(host)); ocr &= ~MMC_VDD_165_195; @@ -1214,7 +844,7 @@ err: mmc_detach_bus(host); - pr_err("%s: error %d whilst initialising SD card\n", + printk(KERN_ERR "%s: error %d whilst initialising SD card\n", mmc_hostname(host), err); return err;