diff options
Diffstat (limited to 'drivers/mmc/mmc.c')
-rw-r--r-- | drivers/mmc/mmc.c | 83 |
1 files changed, 48 insertions, 35 deletions
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 5046a1661342..4a73e8b2428d 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c | |||
@@ -376,10 +376,11 @@ static inline void mmc_set_ios(struct mmc_host *host) | |||
376 | { | 376 | { |
377 | struct mmc_ios *ios = &host->ios; | 377 | struct mmc_ios *ios = &host->ios; |
378 | 378 | ||
379 | pr_debug("%s: clock %uHz busmode %u powermode %u cs %u Vdd %u width %u\n", | 379 | pr_debug("%s: clock %uHz busmode %u powermode %u cs %u Vdd %u " |
380 | "width %u timing %u\n", | ||
380 | mmc_hostname(host), ios->clock, ios->bus_mode, | 381 | mmc_hostname(host), ios->clock, ios->bus_mode, |
381 | ios->power_mode, ios->chip_select, ios->vdd, | 382 | ios->power_mode, ios->chip_select, ios->vdd, |
382 | ios->bus_width); | 383 | ios->bus_width, ios->timing); |
383 | 384 | ||
384 | host->ops->set_ios(host, ios); | 385 | host->ops->set_ios(host, ios); |
385 | } | 386 | } |
@@ -809,6 +810,7 @@ static void mmc_power_up(struct mmc_host *host) | |||
809 | host->ios.chip_select = MMC_CS_DONTCARE; | 810 | host->ios.chip_select = MMC_CS_DONTCARE; |
810 | host->ios.power_mode = MMC_POWER_UP; | 811 | host->ios.power_mode = MMC_POWER_UP; |
811 | host->ios.bus_width = MMC_BUS_WIDTH_1; | 812 | host->ios.bus_width = MMC_BUS_WIDTH_1; |
813 | host->ios.timing = MMC_TIMING_LEGACY; | ||
812 | mmc_set_ios(host); | 814 | mmc_set_ios(host); |
813 | 815 | ||
814 | mmc_delay(1); | 816 | mmc_delay(1); |
@@ -828,6 +830,7 @@ static void mmc_power_off(struct mmc_host *host) | |||
828 | host->ios.chip_select = MMC_CS_DONTCARE; | 830 | host->ios.chip_select = MMC_CS_DONTCARE; |
829 | host->ios.power_mode = MMC_POWER_OFF; | 831 | host->ios.power_mode = MMC_POWER_OFF; |
830 | host->ios.bus_width = MMC_BUS_WIDTH_1; | 832 | host->ios.bus_width = MMC_BUS_WIDTH_1; |
833 | host->ios.timing = MMC_TIMING_LEGACY; | ||
831 | mmc_set_ios(host); | 834 | mmc_set_ios(host); |
832 | } | 835 | } |
833 | 836 | ||
@@ -1112,46 +1115,50 @@ static void mmc_process_ext_csds(struct mmc_host *host) | |||
1112 | continue; | 1115 | continue; |
1113 | } | 1116 | } |
1114 | 1117 | ||
1115 | /* Activate highspeed support. */ | 1118 | if (host->caps & MMC_CAP_MMC_HIGHSPEED) { |
1116 | cmd.opcode = MMC_SWITCH; | 1119 | /* Activate highspeed support. */ |
1117 | cmd.arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) | | 1120 | cmd.opcode = MMC_SWITCH; |
1118 | (EXT_CSD_HS_TIMING << 16) | | 1121 | cmd.arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) | |
1119 | (1 << 8) | | 1122 | (EXT_CSD_HS_TIMING << 16) | |
1120 | EXT_CSD_CMD_SET_NORMAL; | 1123 | (1 << 8) | |
1121 | cmd.flags = MMC_RSP_R1B | MMC_CMD_AC; | 1124 | EXT_CSD_CMD_SET_NORMAL; |
1125 | cmd.flags = MMC_RSP_R1B | MMC_CMD_AC; | ||
1122 | 1126 | ||
1123 | err = mmc_wait_for_cmd(host, &cmd, CMD_RETRIES); | 1127 | err = mmc_wait_for_cmd(host, &cmd, CMD_RETRIES); |
1124 | if (err != MMC_ERR_NONE) { | 1128 | if (err != MMC_ERR_NONE) { |
1125 | printk("%s: failed to switch card to mmc v4 " | 1129 | printk("%s: failed to switch card to mmc v4 " |
1126 | "high-speed mode.\n", | 1130 | "high-speed mode.\n", |
1127 | mmc_hostname(card->host)); | 1131 | mmc_hostname(card->host)); |
1128 | continue; | 1132 | continue; |
1129 | } | 1133 | } |
1130 | 1134 | ||
1131 | mmc_card_set_highspeed(card); | 1135 | mmc_card_set_highspeed(card); |
1132 | 1136 | ||
1133 | /* Check for host support for wide-bus modes. */ | 1137 | host->ios.timing = MMC_TIMING_SD_HS; |
1134 | if (!(host->caps & MMC_CAP_4_BIT_DATA)) { | 1138 | mmc_set_ios(host); |
1135 | continue; | ||
1136 | } | 1139 | } |
1137 | 1140 | ||
1138 | /* Activate 4-bit support. */ | 1141 | /* Check for host support for wide-bus modes. */ |
1139 | cmd.opcode = MMC_SWITCH; | 1142 | if (host->caps & MMC_CAP_4_BIT_DATA) { |
1140 | cmd.arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) | | 1143 | /* Activate 4-bit support. */ |
1141 | (EXT_CSD_BUS_WIDTH << 16) | | 1144 | cmd.opcode = MMC_SWITCH; |
1142 | (EXT_CSD_BUS_WIDTH_4 << 8) | | 1145 | cmd.arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) | |
1143 | EXT_CSD_CMD_SET_NORMAL; | 1146 | (EXT_CSD_BUS_WIDTH << 16) | |
1144 | cmd.flags = MMC_RSP_R1B | MMC_CMD_AC; | 1147 | (EXT_CSD_BUS_WIDTH_4 << 8) | |
1148 | EXT_CSD_CMD_SET_NORMAL; | ||
1149 | cmd.flags = MMC_RSP_R1B | MMC_CMD_AC; | ||
1145 | 1150 | ||
1146 | err = mmc_wait_for_cmd(host, &cmd, CMD_RETRIES); | 1151 | err = mmc_wait_for_cmd(host, &cmd, CMD_RETRIES); |
1147 | if (err != MMC_ERR_NONE) { | 1152 | if (err != MMC_ERR_NONE) { |
1148 | printk("%s: failed to switch card to " | 1153 | printk("%s: failed to switch card to " |
1149 | "mmc v4 4-bit bus mode.\n", | 1154 | "mmc v4 4-bit bus mode.\n", |
1150 | mmc_hostname(card->host)); | 1155 | mmc_hostname(card->host)); |
1151 | continue; | 1156 | continue; |
1152 | } | 1157 | } |
1153 | 1158 | ||
1154 | host->ios.bus_width = MMC_BUS_WIDTH_4; | 1159 | host->ios.bus_width = MMC_BUS_WIDTH_4; |
1160 | mmc_set_ios(host); | ||
1161 | } | ||
1155 | } | 1162 | } |
1156 | 1163 | ||
1157 | kfree(ext_csd); | 1164 | kfree(ext_csd); |
@@ -1241,6 +1248,9 @@ static void mmc_read_switch_caps(struct mmc_host *host) | |||
1241 | unsigned char *status; | 1248 | unsigned char *status; |
1242 | struct scatterlist sg; | 1249 | struct scatterlist sg; |
1243 | 1250 | ||
1251 | if (!(host->caps & MMC_CAP_SD_HIGHSPEED)) | ||
1252 | return; | ||
1253 | |||
1244 | status = kmalloc(64, GFP_KERNEL); | 1254 | status = kmalloc(64, GFP_KERNEL); |
1245 | if (!status) { | 1255 | if (!status) { |
1246 | printk(KERN_WARNING "%s: Unable to allocate buffer for " | 1256 | printk(KERN_WARNING "%s: Unable to allocate buffer for " |
@@ -1332,6 +1342,9 @@ static void mmc_read_switch_caps(struct mmc_host *host) | |||
1332 | } | 1342 | } |
1333 | 1343 | ||
1334 | mmc_card_set_highspeed(card); | 1344 | mmc_card_set_highspeed(card); |
1345 | |||
1346 | host->ios.timing = MMC_TIMING_SD_HS; | ||
1347 | mmc_set_ios(host); | ||
1335 | } | 1348 | } |
1336 | 1349 | ||
1337 | kfree(status); | 1350 | kfree(status); |