diff options
Diffstat (limited to 'drivers/mmc')
| -rw-r--r-- | drivers/mmc/at91_mci.c | 3 | ||||
| -rw-r--r-- | drivers/mmc/au1xmmc.c | 10 | ||||
| -rw-r--r-- | drivers/mmc/imxmmc.c | 84 | ||||
| -rw-r--r-- | drivers/mmc/mmc.c | 63 | ||||
| -rw-r--r-- | drivers/mmc/mmc_block.c | 7 | ||||
| -rw-r--r-- | drivers/mmc/mmci.c | 3 | ||||
| -rw-r--r-- | drivers/mmc/pxamci.c | 17 | ||||
| -rw-r--r-- | drivers/mmc/sdhci.c | 4 | ||||
| -rw-r--r-- | drivers/mmc/wbsd.c | 12 |
9 files changed, 118 insertions, 85 deletions
diff --git a/drivers/mmc/at91_mci.c b/drivers/mmc/at91_mci.c index 6061c2d101a0..88f0eef9cf33 100644 --- a/drivers/mmc/at91_mci.c +++ b/drivers/mmc/at91_mci.c | |||
| @@ -621,9 +621,6 @@ static void at91_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 621 | struct at91mci_host *host = mmc_priv(mmc); | 621 | struct at91mci_host *host = mmc_priv(mmc); |
| 622 | unsigned long at91_master_clock = clk_get_rate(mci_clk); | 622 | unsigned long at91_master_clock = clk_get_rate(mci_clk); |
| 623 | 623 | ||
| 624 | DBG("Clock %uHz, busmode %u, powermode %u, Vdd %u\n", | ||
| 625 | ios->clock, ios->bus_mode, ios->power_mode, ios->vdd); | ||
| 626 | |||
| 627 | if (host) | 624 | if (host) |
| 628 | host->bus_mode = ios->bus_mode; | 625 | host->bus_mode = ios->bus_mode; |
| 629 | else | 626 | else |
diff --git a/drivers/mmc/au1xmmc.c b/drivers/mmc/au1xmmc.c index c0326bbc5f28..5dc4bee7abeb 100644 --- a/drivers/mmc/au1xmmc.c +++ b/drivers/mmc/au1xmmc.c | |||
| @@ -310,7 +310,7 @@ static void au1xmmc_data_complete(struct au1xmmc_host *host, u32 status) | |||
| 310 | } | 310 | } |
| 311 | else | 311 | else |
| 312 | data->bytes_xfered = | 312 | data->bytes_xfered = |
| 313 | (data->blocks * (1 << data->blksz_bits)) - | 313 | (data->blocks * data->blksz) - |
| 314 | host->pio.len; | 314 | host->pio.len; |
| 315 | } | 315 | } |
| 316 | 316 | ||
| @@ -575,7 +575,7 @@ static int | |||
| 575 | au1xmmc_prepare_data(struct au1xmmc_host *host, struct mmc_data *data) | 575 | au1xmmc_prepare_data(struct au1xmmc_host *host, struct mmc_data *data) |
| 576 | { | 576 | { |
| 577 | 577 | ||
| 578 | int datalen = data->blocks * (1 << data->blksz_bits); | 578 | int datalen = data->blocks * data->blksz; |
| 579 | 579 | ||
| 580 | if (dma != 0) | 580 | if (dma != 0) |
| 581 | host->flags |= HOST_F_DMA; | 581 | host->flags |= HOST_F_DMA; |
| @@ -596,7 +596,7 @@ au1xmmc_prepare_data(struct au1xmmc_host *host, struct mmc_data *data) | |||
| 596 | if (host->dma.len == 0) | 596 | if (host->dma.len == 0) |
| 597 | return MMC_ERR_TIMEOUT; | 597 | return MMC_ERR_TIMEOUT; |
| 598 | 598 | ||
| 599 | au_writel((1 << data->blksz_bits) - 1, HOST_BLKSIZE(host)); | 599 | au_writel(data->blksz - 1, HOST_BLKSIZE(host)); |
| 600 | 600 | ||
| 601 | if (host->flags & HOST_F_DMA) { | 601 | if (host->flags & HOST_F_DMA) { |
| 602 | int i; | 602 | int i; |
| @@ -720,10 +720,6 @@ static void au1xmmc_set_ios(struct mmc_host* mmc, struct mmc_ios* ios) | |||
| 720 | { | 720 | { |
| 721 | struct au1xmmc_host *host = mmc_priv(mmc); | 721 | struct au1xmmc_host *host = mmc_priv(mmc); |
| 722 | 722 | ||
| 723 | DBG("set_ios (power=%u, clock=%uHz, vdd=%u, mode=%u)\n", | ||
| 724 | host->id, ios->power_mode, ios->clock, ios->vdd, | ||
| 725 | ios->bus_mode); | ||
| 726 | |||
| 727 | if (ios->power_mode == MMC_POWER_OFF) | 723 | if (ios->power_mode == MMC_POWER_OFF) |
| 728 | au1xmmc_set_power(host, 0); | 724 | au1xmmc_set_power(host, 0); |
| 729 | else if (ios->power_mode == MMC_POWER_ON) { | 725 | else if (ios->power_mode == MMC_POWER_ON) { |
diff --git a/drivers/mmc/imxmmc.c b/drivers/mmc/imxmmc.c index ffb7f55d3467..a4eb1d0e7a71 100644 --- a/drivers/mmc/imxmmc.c +++ b/drivers/mmc/imxmmc.c | |||
| @@ -102,6 +102,7 @@ struct imxmci_host { | |||
| 102 | #define IMXMCI_PEND_CPU_DATA_b 5 | 102 | #define IMXMCI_PEND_CPU_DATA_b 5 |
| 103 | #define IMXMCI_PEND_CARD_XCHG_b 6 | 103 | #define IMXMCI_PEND_CARD_XCHG_b 6 |
| 104 | #define IMXMCI_PEND_SET_INIT_b 7 | 104 | #define IMXMCI_PEND_SET_INIT_b 7 |
| 105 | #define IMXMCI_PEND_STARTED_b 8 | ||
| 105 | 106 | ||
| 106 | #define IMXMCI_PEND_IRQ_m (1 << IMXMCI_PEND_IRQ_b) | 107 | #define IMXMCI_PEND_IRQ_m (1 << IMXMCI_PEND_IRQ_b) |
| 107 | #define IMXMCI_PEND_DMA_END_m (1 << IMXMCI_PEND_DMA_END_b) | 108 | #define IMXMCI_PEND_DMA_END_m (1 << IMXMCI_PEND_DMA_END_b) |
| @@ -111,6 +112,7 @@ struct imxmci_host { | |||
| 111 | #define IMXMCI_PEND_CPU_DATA_m (1 << IMXMCI_PEND_CPU_DATA_b) | 112 | #define IMXMCI_PEND_CPU_DATA_m (1 << IMXMCI_PEND_CPU_DATA_b) |
| 112 | #define IMXMCI_PEND_CARD_XCHG_m (1 << IMXMCI_PEND_CARD_XCHG_b) | 113 | #define IMXMCI_PEND_CARD_XCHG_m (1 << IMXMCI_PEND_CARD_XCHG_b) |
| 113 | #define IMXMCI_PEND_SET_INIT_m (1 << IMXMCI_PEND_SET_INIT_b) | 114 | #define IMXMCI_PEND_SET_INIT_m (1 << IMXMCI_PEND_SET_INIT_b) |
| 115 | #define IMXMCI_PEND_STARTED_m (1 << IMXMCI_PEND_STARTED_b) | ||
| 114 | 116 | ||
| 115 | static void imxmci_stop_clock(struct imxmci_host *host) | 117 | static void imxmci_stop_clock(struct imxmci_host *host) |
| 116 | { | 118 | { |
| @@ -131,23 +133,52 @@ static void imxmci_stop_clock(struct imxmci_host *host) | |||
| 131 | dev_dbg(mmc_dev(host->mmc), "imxmci_stop_clock blocked, no luck\n"); | 133 | dev_dbg(mmc_dev(host->mmc), "imxmci_stop_clock blocked, no luck\n"); |
| 132 | } | 134 | } |
| 133 | 135 | ||
| 134 | static void imxmci_start_clock(struct imxmci_host *host) | 136 | static int imxmci_start_clock(struct imxmci_host *host) |
| 135 | { | 137 | { |
| 136 | int i = 0; | 138 | unsigned int trials = 0; |
| 139 | unsigned int delay_limit = 128; | ||
| 140 | unsigned long flags; | ||
| 141 | |||
| 137 | MMC_STR_STP_CLK &= ~STR_STP_CLK_STOP_CLK; | 142 | MMC_STR_STP_CLK &= ~STR_STP_CLK_STOP_CLK; |
| 138 | while(i < 0x1000) { | ||
| 139 | if(!(i & 0x7f)) | ||
| 140 | MMC_STR_STP_CLK |= STR_STP_CLK_START_CLK; | ||
| 141 | 143 | ||
| 142 | if(MMC_STATUS & STATUS_CARD_BUS_CLK_RUN) { | 144 | clear_bit(IMXMCI_PEND_STARTED_b, &host->pending_events); |
| 143 | /* Check twice before cut */ | 145 | |
| 146 | /* | ||
| 147 | * Command start of the clock, this usually succeeds in less | ||
| 148 | * then 6 delay loops, but during card detection (low clockrate) | ||
| 149 | * it takes up to 5000 delay loops and sometimes fails for the first time | ||
| 150 | */ | ||
| 151 | MMC_STR_STP_CLK |= STR_STP_CLK_START_CLK; | ||
| 152 | |||
| 153 | do { | ||
| 154 | unsigned int delay = delay_limit; | ||
| 155 | |||
| 156 | while(delay--){ | ||
| 144 | if(MMC_STATUS & STATUS_CARD_BUS_CLK_RUN) | 157 | if(MMC_STATUS & STATUS_CARD_BUS_CLK_RUN) |
| 145 | return; | 158 | /* Check twice before cut */ |
| 159 | if(MMC_STATUS & STATUS_CARD_BUS_CLK_RUN) | ||
| 160 | return 0; | ||
| 161 | |||
| 162 | if(test_bit(IMXMCI_PEND_STARTED_b, &host->pending_events)) | ||
| 163 | return 0; | ||
| 146 | } | 164 | } |
| 147 | 165 | ||
| 148 | i++; | 166 | local_irq_save(flags); |
| 149 | } | 167 | /* |
| 150 | dev_dbg(mmc_dev(host->mmc), "imxmci_start_clock blocked, no luck\n"); | 168 | * Ensure, that request is not doubled under all possible circumstances. |
| 169 | * It is possible, that cock running state is missed, because some other | ||
| 170 | * IRQ or schedule delays this function execution and the clocks has | ||
| 171 | * been already stopped by other means (response processing, SDHC HW) | ||
| 172 | */ | ||
| 173 | if(!test_bit(IMXMCI_PEND_STARTED_b, &host->pending_events)) | ||
| 174 | MMC_STR_STP_CLK |= STR_STP_CLK_START_CLK; | ||
| 175 | local_irq_restore(flags); | ||
| 176 | |||
| 177 | } while(++trials<256); | ||
| 178 | |||
| 179 | dev_err(mmc_dev(host->mmc), "imxmci_start_clock blocked, no luck\n"); | ||
| 180 | |||
| 181 | return -1; | ||
| 151 | } | 182 | } |
| 152 | 183 | ||
| 153 | static void imxmci_softreset(void) | 184 | static void imxmci_softreset(void) |
| @@ -187,8 +218,10 @@ static int imxmci_busy_wait_for_status(struct imxmci_host *host, | |||
| 187 | if(!loops) | 218 | if(!loops) |
| 188 | return 0; | 219 | return 0; |
| 189 | 220 | ||
| 190 | dev_info(mmc_dev(host->mmc), "busy wait for %d usec in %s, STATUS = 0x%x (0x%x)\n", | 221 | /* The busy-wait is expected there for clock <8MHz due to SDHC hardware flaws */ |
| 191 | loops, where, *pstat, stat_mask); | 222 | if(!(stat_mask & STATUS_END_CMD_RESP) || (host->mmc->ios.clock>=8000000)) |
| 223 | dev_info(mmc_dev(host->mmc), "busy wait for %d usec in %s, STATUS = 0x%x (0x%x)\n", | ||
| 224 | loops, where, *pstat, stat_mask); | ||
| 192 | return loops; | 225 | return loops; |
| 193 | } | 226 | } |
| 194 | 227 | ||
| @@ -302,6 +335,9 @@ static void imxmci_start_cmd(struct imxmci_host *host, struct mmc_command *cmd, | |||
| 302 | WARN_ON(host->cmd != NULL); | 335 | WARN_ON(host->cmd != NULL); |
| 303 | host->cmd = cmd; | 336 | host->cmd = cmd; |
| 304 | 337 | ||
| 338 | /* Ensure, that clock are stopped else command programming and start fails */ | ||
| 339 | imxmci_stop_clock(host); | ||
| 340 | |||
| 305 | if (cmd->flags & MMC_RSP_BUSY) | 341 | if (cmd->flags & MMC_RSP_BUSY) |
| 306 | cmdat |= CMD_DAT_CONT_BUSY; | 342 | cmdat |= CMD_DAT_CONT_BUSY; |
| 307 | 343 | ||
| @@ -498,7 +534,7 @@ static int imxmci_data_done(struct imxmci_host *host, unsigned int stat) | |||
| 498 | 534 | ||
| 499 | data_error = imxmci_finish_data(host, stat); | 535 | data_error = imxmci_finish_data(host, stat); |
| 500 | 536 | ||
| 501 | if (host->req->stop && (data_error == MMC_ERR_NONE)) { | 537 | if (host->req->stop) { |
| 502 | imxmci_stop_clock(host); | 538 | imxmci_stop_clock(host); |
| 503 | imxmci_start_cmd(host, host->req->stop, 0); | 539 | imxmci_start_cmd(host, host->req->stop, 0); |
| 504 | } else { | 540 | } else { |
| @@ -522,7 +558,7 @@ static int imxmci_cpu_driven_data(struct imxmci_host *host, unsigned int *pstat) | |||
| 522 | int trans_done = 0; | 558 | int trans_done = 0; |
| 523 | unsigned int stat = *pstat; | 559 | unsigned int stat = *pstat; |
| 524 | 560 | ||
| 525 | if(host->actual_bus_width == MMC_BUS_WIDTH_4) | 561 | if(host->actual_bus_width != MMC_BUS_WIDTH_4) |
| 526 | burst_len = 16; | 562 | burst_len = 16; |
| 527 | else | 563 | else |
| 528 | burst_len = 64; | 564 | burst_len = 64; |
| @@ -560,8 +596,7 @@ static int imxmci_cpu_driven_data(struct imxmci_host *host, unsigned int *pstat) | |||
| 560 | stat = MMC_STATUS; | 596 | stat = MMC_STATUS; |
| 561 | 597 | ||
| 562 | /* Flush extra bytes from FIFO */ | 598 | /* Flush extra bytes from FIFO */ |
| 563 | while(flush_len >= 2){ | 599 | while(flush_len && !(stat & STATUS_DATA_TRANS_DONE)){ |
| 564 | flush_len -= 2; | ||
| 565 | i = MMC_BUFFER_ACCESS; | 600 | i = MMC_BUFFER_ACCESS; |
| 566 | stat = MMC_STATUS; | 601 | stat = MMC_STATUS; |
| 567 | stat &= ~STATUS_CRC_READ_ERR; /* Stupid but required there */ | 602 | stat &= ~STATUS_CRC_READ_ERR; /* Stupid but required there */ |
| @@ -622,6 +657,7 @@ static irqreturn_t imxmci_irq(int irq, void *devid, struct pt_regs *regs) | |||
| 622 | atomic_set(&host->stuck_timeout, 0); | 657 | atomic_set(&host->stuck_timeout, 0); |
| 623 | host->status_reg = stat; | 658 | host->status_reg = stat; |
| 624 | set_bit(IMXMCI_PEND_IRQ_b, &host->pending_events); | 659 | set_bit(IMXMCI_PEND_IRQ_b, &host->pending_events); |
| 660 | set_bit(IMXMCI_PEND_STARTED_b, &host->pending_events); | ||
| 625 | tasklet_schedule(&host->tasklet); | 661 | tasklet_schedule(&host->tasklet); |
| 626 | 662 | ||
| 627 | return IRQ_RETVAL(handled);; | 663 | return IRQ_RETVAL(handled);; |
| @@ -714,10 +750,6 @@ static void imxmci_tasklet_fnc(unsigned long data) | |||
| 714 | data_dir_mask = STATUS_DATA_TRANS_DONE; | 750 | data_dir_mask = STATUS_DATA_TRANS_DONE; |
| 715 | } | 751 | } |
| 716 | 752 | ||
| 717 | imxmci_busy_wait_for_status(host, &stat, | ||
| 718 | data_dir_mask, | ||
| 719 | 50, "imxmci_tasklet_fnc data"); | ||
| 720 | |||
| 721 | if(stat & data_dir_mask) { | 753 | if(stat & data_dir_mask) { |
| 722 | clear_bit(IMXMCI_PEND_DMA_END_b, &host->pending_events); | 754 | clear_bit(IMXMCI_PEND_DMA_END_b, &host->pending_events); |
| 723 | imxmci_data_done(host, stat); | 755 | imxmci_data_done(host, stat); |
| @@ -775,10 +807,6 @@ static void imxmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 775 | struct imxmci_host *host = mmc_priv(mmc); | 807 | struct imxmci_host *host = mmc_priv(mmc); |
| 776 | int prescaler; | 808 | int prescaler; |
| 777 | 809 | ||
| 778 | dev_dbg(mmc_dev(host->mmc), "clock %u power %u vdd %u width %u\n", | ||
| 779 | ios->clock, ios->power_mode, ios->vdd, | ||
| 780 | (ios->bus_width==MMC_BUS_WIDTH_4)?4:1); | ||
| 781 | |||
| 782 | if( ios->bus_width==MMC_BUS_WIDTH_4 ) { | 810 | if( ios->bus_width==MMC_BUS_WIDTH_4 ) { |
| 783 | host->actual_bus_width = MMC_BUS_WIDTH_4; | 811 | host->actual_bus_width = MMC_BUS_WIDTH_4; |
| 784 | imx_gpio_mode(PB11_PF_SD_DAT3); | 812 | imx_gpio_mode(PB11_PF_SD_DAT3); |
| @@ -837,7 +865,11 @@ static void imxmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 837 | 865 | ||
| 838 | imxmci_stop_clock(host); | 866 | imxmci_stop_clock(host); |
| 839 | MMC_CLK_RATE = (prescaler<<3) | clk; | 867 | MMC_CLK_RATE = (prescaler<<3) | clk; |
| 840 | imxmci_start_clock(host); | 868 | /* |
| 869 | * Under my understanding, clock should not be started there, because it would | ||
| 870 | * initiate SDHC sequencer and send last or random command into card | ||
| 871 | */ | ||
| 872 | /*imxmci_start_clock(host);*/ | ||
| 841 | 873 | ||
| 842 | dev_dbg(mmc_dev(host->mmc), "MMC_CLK_RATE: 0x%08x\n", MMC_CLK_RATE); | 874 | dev_dbg(mmc_dev(host->mmc), "MMC_CLK_RATE: 0x%08x\n", MMC_CLK_RATE); |
| 843 | } else { | 875 | } else { |
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index da6ddd910fc5..6201f3086a02 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c | |||
| @@ -59,21 +59,23 @@ static const unsigned int tacc_mant[] = { | |||
| 59 | 59 | ||
| 60 | 60 | ||
| 61 | /** | 61 | /** |
| 62 | * mmc_request_done - finish processing an MMC command | 62 | * mmc_request_done - finish processing an MMC request |
| 63 | * @host: MMC host which completed command | 63 | * @host: MMC host which completed request |
| 64 | * @mrq: MMC request which completed | 64 | * @mrq: MMC request which request |
| 65 | * | 65 | * |
| 66 | * MMC drivers should call this function when they have completed | 66 | * MMC drivers should call this function when they have completed |
| 67 | * their processing of a command. This should be called before the | 67 | * their processing of a request. |
| 68 | * data part of the command has completed. | ||
| 69 | */ | 68 | */ |
| 70 | void mmc_request_done(struct mmc_host *host, struct mmc_request *mrq) | 69 | void mmc_request_done(struct mmc_host *host, struct mmc_request *mrq) |
| 71 | { | 70 | { |
| 72 | struct mmc_command *cmd = mrq->cmd; | 71 | struct mmc_command *cmd = mrq->cmd; |
| 73 | int err = mrq->cmd->error; | 72 | int err = cmd->error; |
| 74 | pr_debug("MMC: req done (%02x): %d: %08x %08x %08x %08x\n", | 73 | |
| 75 | cmd->opcode, err, cmd->resp[0], cmd->resp[1], | 74 | pr_debug("%s: req done (CMD%u): %d/%d/%d: %08x %08x %08x %08x\n", |
| 76 | cmd->resp[2], cmd->resp[3]); | 75 | mmc_hostname(host), cmd->opcode, err, |
| 76 | mrq->data ? mrq->data->error : 0, | ||
| 77 | mrq->stop ? mrq->stop->error : 0, | ||
| 78 | cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]); | ||
| 77 | 79 | ||
| 78 | if (err && cmd->retries) { | 80 | if (err && cmd->retries) { |
| 79 | cmd->retries--; | 81 | cmd->retries--; |
| @@ -97,8 +99,9 @@ EXPORT_SYMBOL(mmc_request_done); | |||
| 97 | void | 99 | void |
| 98 | mmc_start_request(struct mmc_host *host, struct mmc_request *mrq) | 100 | mmc_start_request(struct mmc_host *host, struct mmc_request *mrq) |
| 99 | { | 101 | { |
| 100 | pr_debug("MMC: starting cmd %02x arg %08x flags %08x\n", | 102 | pr_debug("%s: starting CMD%u arg %08x flags %08x\n", |
| 101 | mrq->cmd->opcode, mrq->cmd->arg, mrq->cmd->flags); | 103 | mmc_hostname(host), mrq->cmd->opcode, |
| 104 | mrq->cmd->arg, mrq->cmd->flags); | ||
| 102 | 105 | ||
| 103 | WARN_ON(host->card_busy == NULL); | 106 | WARN_ON(host->card_busy == NULL); |
| 104 | 107 | ||
| @@ -312,6 +315,18 @@ void mmc_release_host(struct mmc_host *host) | |||
| 312 | 315 | ||
| 313 | EXPORT_SYMBOL(mmc_release_host); | 316 | EXPORT_SYMBOL(mmc_release_host); |
| 314 | 317 | ||
| 318 | static inline void mmc_set_ios(struct mmc_host *host) | ||
| 319 | { | ||
| 320 | struct mmc_ios *ios = &host->ios; | ||
| 321 | |||
| 322 | pr_debug("%s: clock %uHz busmode %u powermode %u cs %u Vdd %u width %u\n", | ||
| 323 | mmc_hostname(host), ios->clock, ios->bus_mode, | ||
| 324 | ios->power_mode, ios->chip_select, ios->vdd, | ||
| 325 | ios->bus_width); | ||
| 326 | |||
| 327 | host->ops->set_ios(host, ios); | ||
| 328 | } | ||
| 329 | |||
| 315 | static int mmc_select_card(struct mmc_host *host, struct mmc_card *card) | 330 | static int mmc_select_card(struct mmc_host *host, struct mmc_card *card) |
| 316 | { | 331 | { |
| 317 | int err; | 332 | int err; |
| @@ -364,7 +379,7 @@ static int mmc_select_card(struct mmc_host *host, struct mmc_card *card) | |||
| 364 | } | 379 | } |
| 365 | } | 380 | } |
| 366 | 381 | ||
| 367 | host->ops->set_ios(host, &host->ios); | 382 | mmc_set_ios(host); |
| 368 | 383 | ||
| 369 | return MMC_ERR_NONE; | 384 | return MMC_ERR_NONE; |
| 370 | } | 385 | } |
| @@ -415,7 +430,7 @@ static u32 mmc_select_voltage(struct mmc_host *host, u32 ocr) | |||
| 415 | ocr = 3 << bit; | 430 | ocr = 3 << bit; |
| 416 | 431 | ||
| 417 | host->ios.vdd = bit; | 432 | host->ios.vdd = bit; |
| 418 | host->ops->set_ios(host, &host->ios); | 433 | mmc_set_ios(host); |
| 419 | } else { | 434 | } else { |
| 420 | ocr = 0; | 435 | ocr = 0; |
| 421 | } | 436 | } |
| @@ -549,6 +564,7 @@ static void mmc_decode_csd(struct mmc_card *card) | |||
| 549 | csd->read_partial = UNSTUFF_BITS(resp, 79, 1); | 564 | csd->read_partial = UNSTUFF_BITS(resp, 79, 1); |
| 550 | csd->write_misalign = UNSTUFF_BITS(resp, 78, 1); | 565 | csd->write_misalign = UNSTUFF_BITS(resp, 78, 1); |
| 551 | csd->read_misalign = UNSTUFF_BITS(resp, 77, 1); | 566 | csd->read_misalign = UNSTUFF_BITS(resp, 77, 1); |
| 567 | csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3); | ||
| 552 | csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4); | 568 | csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4); |
| 553 | csd->write_partial = UNSTUFF_BITS(resp, 21, 1); | 569 | csd->write_partial = UNSTUFF_BITS(resp, 21, 1); |
| 554 | } else { | 570 | } else { |
| @@ -583,6 +599,7 @@ static void mmc_decode_csd(struct mmc_card *card) | |||
| 583 | csd->read_partial = UNSTUFF_BITS(resp, 79, 1); | 599 | csd->read_partial = UNSTUFF_BITS(resp, 79, 1); |
| 584 | csd->write_misalign = UNSTUFF_BITS(resp, 78, 1); | 600 | csd->write_misalign = UNSTUFF_BITS(resp, 78, 1); |
| 585 | csd->read_misalign = UNSTUFF_BITS(resp, 77, 1); | 601 | csd->read_misalign = UNSTUFF_BITS(resp, 77, 1); |
| 602 | csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3); | ||
| 586 | csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4); | 603 | csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4); |
| 587 | csd->write_partial = UNSTUFF_BITS(resp, 21, 1); | 604 | csd->write_partial = UNSTUFF_BITS(resp, 21, 1); |
| 588 | } | 605 | } |
| @@ -666,7 +683,7 @@ static void mmc_idle_cards(struct mmc_host *host) | |||
| 666 | struct mmc_command cmd; | 683 | struct mmc_command cmd; |
| 667 | 684 | ||
| 668 | host->ios.chip_select = MMC_CS_HIGH; | 685 | host->ios.chip_select = MMC_CS_HIGH; |
| 669 | host->ops->set_ios(host, &host->ios); | 686 | mmc_set_ios(host); |
| 670 | 687 | ||
| 671 | mmc_delay(1); | 688 | mmc_delay(1); |
| 672 | 689 | ||
| @@ -679,7 +696,7 @@ static void mmc_idle_cards(struct mmc_host *host) | |||
| 679 | mmc_delay(1); | 696 | mmc_delay(1); |
| 680 | 697 | ||
| 681 | host->ios.chip_select = MMC_CS_DONTCARE; | 698 | host->ios.chip_select = MMC_CS_DONTCARE; |
| 682 | host->ops->set_ios(host, &host->ios); | 699 | mmc_set_ios(host); |
| 683 | 700 | ||
| 684 | mmc_delay(1); | 701 | mmc_delay(1); |
| 685 | } | 702 | } |
| @@ -704,13 +721,13 @@ static void mmc_power_up(struct mmc_host *host) | |||
| 704 | host->ios.chip_select = MMC_CS_DONTCARE; | 721 | host->ios.chip_select = MMC_CS_DONTCARE; |
| 705 | host->ios.power_mode = MMC_POWER_UP; | 722 | host->ios.power_mode = MMC_POWER_UP; |
| 706 | host->ios.bus_width = MMC_BUS_WIDTH_1; | 723 | host->ios.bus_width = MMC_BUS_WIDTH_1; |
| 707 | host->ops->set_ios(host, &host->ios); | 724 | mmc_set_ios(host); |
| 708 | 725 | ||
| 709 | mmc_delay(1); | 726 | mmc_delay(1); |
| 710 | 727 | ||
| 711 | host->ios.clock = host->f_min; | 728 | host->ios.clock = host->f_min; |
| 712 | host->ios.power_mode = MMC_POWER_ON; | 729 | host->ios.power_mode = MMC_POWER_ON; |
| 713 | host->ops->set_ios(host, &host->ios); | 730 | mmc_set_ios(host); |
| 714 | 731 | ||
| 715 | mmc_delay(2); | 732 | mmc_delay(2); |
| 716 | } | 733 | } |
| @@ -723,7 +740,7 @@ static void mmc_power_off(struct mmc_host *host) | |||
| 723 | host->ios.chip_select = MMC_CS_DONTCARE; | 740 | host->ios.chip_select = MMC_CS_DONTCARE; |
| 724 | host->ios.power_mode = MMC_POWER_OFF; | 741 | host->ios.power_mode = MMC_POWER_OFF; |
| 725 | host->ios.bus_width = MMC_BUS_WIDTH_1; | 742 | host->ios.bus_width = MMC_BUS_WIDTH_1; |
| 726 | host->ops->set_ios(host, &host->ios); | 743 | mmc_set_ios(host); |
| 727 | } | 744 | } |
| 728 | 745 | ||
| 729 | static int mmc_send_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr) | 746 | static int mmc_send_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr) |
| @@ -934,6 +951,7 @@ static void mmc_read_scrs(struct mmc_host *host) | |||
| 934 | data.timeout_ns = card->csd.tacc_ns * 10; | 951 | data.timeout_ns = card->csd.tacc_ns * 10; |
| 935 | data.timeout_clks = card->csd.tacc_clks * 10; | 952 | data.timeout_clks = card->csd.tacc_clks * 10; |
| 936 | data.blksz_bits = 3; | 953 | data.blksz_bits = 3; |
| 954 | data.blksz = 1 << 3; | ||
| 937 | data.blocks = 1; | 955 | data.blocks = 1; |
| 938 | data.flags = MMC_DATA_READ; | 956 | data.flags = MMC_DATA_READ; |
| 939 | data.sg = &sg; | 957 | data.sg = &sg; |
| @@ -971,7 +989,8 @@ static unsigned int mmc_calculate_clock(struct mmc_host *host) | |||
| 971 | if (!mmc_card_dead(card) && max_dtr > card->csd.max_dtr) | 989 | if (!mmc_card_dead(card) && max_dtr > card->csd.max_dtr) |
| 972 | max_dtr = card->csd.max_dtr; | 990 | max_dtr = card->csd.max_dtr; |
| 973 | 991 | ||
| 974 | pr_debug("MMC: selected %d.%03dMHz transfer rate\n", | 992 | pr_debug("%s: selected %d.%03dMHz transfer rate\n", |
| 993 | mmc_hostname(host), | ||
| 975 | max_dtr / 1000000, (max_dtr / 1000) % 1000); | 994 | max_dtr / 1000000, (max_dtr / 1000) % 1000); |
| 976 | 995 | ||
| 977 | return max_dtr; | 996 | return max_dtr; |
| @@ -1046,7 +1065,7 @@ static void mmc_setup(struct mmc_host *host) | |||
| 1046 | } else { | 1065 | } else { |
| 1047 | host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN; | 1066 | host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN; |
| 1048 | host->ios.clock = host->f_min; | 1067 | host->ios.clock = host->f_min; |
| 1049 | host->ops->set_ios(host, &host->ios); | 1068 | mmc_set_ios(host); |
| 1050 | 1069 | ||
| 1051 | /* | 1070 | /* |
| 1052 | * We should remember the OCR mask from the existing | 1071 | * We should remember the OCR mask from the existing |
| @@ -1082,7 +1101,7 @@ static void mmc_setup(struct mmc_host *host) | |||
| 1082 | * Ok, now switch to push-pull mode. | 1101 | * Ok, now switch to push-pull mode. |
| 1083 | */ | 1102 | */ |
| 1084 | host->ios.bus_mode = MMC_BUSMODE_PUSHPULL; | 1103 | host->ios.bus_mode = MMC_BUSMODE_PUSHPULL; |
| 1085 | host->ops->set_ios(host, &host->ios); | 1104 | mmc_set_ios(host); |
| 1086 | 1105 | ||
| 1087 | mmc_read_csds(host); | 1106 | mmc_read_csds(host); |
| 1088 | 1107 | ||
| @@ -1128,7 +1147,7 @@ static void mmc_rescan(void *data) | |||
| 1128 | * attached cards and the host support. | 1147 | * attached cards and the host support. |
| 1129 | */ | 1148 | */ |
| 1130 | host->ios.clock = mmc_calculate_clock(host); | 1149 | host->ios.clock = mmc_calculate_clock(host); |
| 1131 | host->ops->set_ios(host, &host->ios); | 1150 | mmc_set_ios(host); |
| 1132 | } | 1151 | } |
| 1133 | 1152 | ||
| 1134 | mmc_release_host(host); | 1153 | mmc_release_host(host); |
diff --git a/drivers/mmc/mmc_block.c b/drivers/mmc/mmc_block.c index 8eb2a2ede64b..e39cc05c64c2 100644 --- a/drivers/mmc/mmc_block.c +++ b/drivers/mmc/mmc_block.c | |||
| @@ -175,6 +175,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) | |||
| 175 | brq.data.timeout_ns = card->csd.tacc_ns * 10; | 175 | brq.data.timeout_ns = card->csd.tacc_ns * 10; |
| 176 | brq.data.timeout_clks = card->csd.tacc_clks * 10; | 176 | brq.data.timeout_clks = card->csd.tacc_clks * 10; |
| 177 | brq.data.blksz_bits = md->block_bits; | 177 | brq.data.blksz_bits = md->block_bits; |
| 178 | brq.data.blksz = 1 << md->block_bits; | ||
| 178 | brq.data.blocks = req->nr_sectors >> (md->block_bits - 9); | 179 | brq.data.blocks = req->nr_sectors >> (md->block_bits - 9); |
| 179 | brq.stop.opcode = MMC_STOP_TRANSMISSION; | 180 | brq.stop.opcode = MMC_STOP_TRANSMISSION; |
| 180 | brq.stop.arg = 0; | 181 | brq.stop.arg = 0; |
| @@ -187,6 +188,12 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) | |||
| 187 | brq.cmd.opcode = MMC_WRITE_BLOCK; | 188 | brq.cmd.opcode = MMC_WRITE_BLOCK; |
| 188 | brq.data.flags |= MMC_DATA_WRITE; | 189 | brq.data.flags |= MMC_DATA_WRITE; |
| 189 | brq.data.blocks = 1; | 190 | brq.data.blocks = 1; |
| 191 | |||
| 192 | /* | ||
| 193 | * Scale up the timeout by the r2w factor | ||
| 194 | */ | ||
| 195 | brq.data.timeout_ns <<= card->csd.r2w_factor; | ||
| 196 | brq.data.timeout_clks <<= card->csd.r2w_factor; | ||
| 190 | } | 197 | } |
| 191 | 198 | ||
| 192 | if (brq.data.blocks > 1) { | 199 | if (brq.data.blocks > 1) { |
diff --git a/drivers/mmc/mmci.c b/drivers/mmc/mmci.c index df7e861e2fc7..da8e4d7339cc 100644 --- a/drivers/mmc/mmci.c +++ b/drivers/mmc/mmci.c | |||
| @@ -402,9 +402,6 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 402 | struct mmci_host *host = mmc_priv(mmc); | 402 | struct mmci_host *host = mmc_priv(mmc); |
| 403 | u32 clk = 0, pwr = 0; | 403 | u32 clk = 0, pwr = 0; |
| 404 | 404 | ||
| 405 | DBG(host, "clock %uHz busmode %u powermode %u Vdd %u\n", | ||
| 406 | ios->clock, ios->bus_mode, ios->power_mode, ios->vdd); | ||
| 407 | |||
| 408 | if (ios->clock) { | 405 | if (ios->clock) { |
| 409 | if (ios->clock >= host->mclk) { | 406 | if (ios->clock >= host->mclk) { |
| 410 | clk = MCI_CLK_BYPASS; | 407 | clk = MCI_CLK_BYPASS; |
diff --git a/drivers/mmc/pxamci.c b/drivers/mmc/pxamci.c index eb42cb349420..b49368fd96b8 100644 --- a/drivers/mmc/pxamci.c +++ b/drivers/mmc/pxamci.c | |||
| @@ -119,7 +119,7 @@ static void pxamci_setup_data(struct pxamci_host *host, struct mmc_data *data) | |||
| 119 | nob = 0xffff; | 119 | nob = 0xffff; |
| 120 | 120 | ||
| 121 | writel(nob, host->base + MMC_NOB); | 121 | writel(nob, host->base + MMC_NOB); |
| 122 | writel(1 << data->blksz_bits, host->base + MMC_BLKLEN); | 122 | writel(data->blksz, host->base + MMC_BLKLEN); |
| 123 | 123 | ||
| 124 | clks = (unsigned long long)data->timeout_ns * CLOCKRATE; | 124 | clks = (unsigned long long)data->timeout_ns * CLOCKRATE; |
| 125 | do_div(clks, 1000000000UL); | 125 | do_div(clks, 1000000000UL); |
| @@ -198,7 +198,6 @@ static void pxamci_start_cmd(struct pxamci_host *host, struct mmc_command *cmd, | |||
| 198 | 198 | ||
| 199 | static void pxamci_finish_request(struct pxamci_host *host, struct mmc_request *mrq) | 199 | static void pxamci_finish_request(struct pxamci_host *host, struct mmc_request *mrq) |
| 200 | { | 200 | { |
| 201 | pr_debug("PXAMCI: request done\n"); | ||
| 202 | host->mrq = NULL; | 201 | host->mrq = NULL; |
| 203 | host->cmd = NULL; | 202 | host->cmd = NULL; |
| 204 | host->data = NULL; | 203 | host->data = NULL; |
| @@ -284,14 +283,14 @@ static int pxamci_data_done(struct pxamci_host *host, unsigned int stat) | |||
| 284 | * data blocks as being in error. | 283 | * data blocks as being in error. |
| 285 | */ | 284 | */ |
| 286 | if (data->error == MMC_ERR_NONE) | 285 | if (data->error == MMC_ERR_NONE) |
| 287 | data->bytes_xfered = data->blocks << data->blksz_bits; | 286 | data->bytes_xfered = data->blocks * data->blksz; |
| 288 | else | 287 | else |
| 289 | data->bytes_xfered = 0; | 288 | data->bytes_xfered = 0; |
| 290 | 289 | ||
| 291 | pxamci_disable_irq(host, DATA_TRAN_DONE); | 290 | pxamci_disable_irq(host, DATA_TRAN_DONE); |
| 292 | 291 | ||
| 293 | host->data = NULL; | 292 | host->data = NULL; |
| 294 | if (host->mrq->stop && data->error == MMC_ERR_NONE) { | 293 | if (host->mrq->stop) { |
| 295 | pxamci_stop_clock(host); | 294 | pxamci_stop_clock(host); |
| 296 | pxamci_start_cmd(host, host->mrq->stop, 0); | 295 | pxamci_start_cmd(host, host->mrq->stop, 0); |
| 297 | } else { | 296 | } else { |
| @@ -309,12 +308,10 @@ static irqreturn_t pxamci_irq(int irq, void *devid, struct pt_regs *regs) | |||
| 309 | 308 | ||
| 310 | ireg = readl(host->base + MMC_I_REG); | 309 | ireg = readl(host->base + MMC_I_REG); |
| 311 | 310 | ||
| 312 | pr_debug("PXAMCI: irq %08x\n", ireg); | ||
| 313 | |||
| 314 | if (ireg) { | 311 | if (ireg) { |
| 315 | unsigned stat = readl(host->base + MMC_STAT); | 312 | unsigned stat = readl(host->base + MMC_STAT); |
| 316 | 313 | ||
| 317 | pr_debug("PXAMCI: stat %08x\n", stat); | 314 | pr_debug("PXAMCI: irq %08x stat %08x\n", ireg, stat); |
| 318 | 315 | ||
| 319 | if (ireg & END_CMD_RES) | 316 | if (ireg & END_CMD_RES) |
| 320 | handled |= pxamci_cmd_done(host, stat); | 317 | handled |= pxamci_cmd_done(host, stat); |
| @@ -368,10 +365,6 @@ static void pxamci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 368 | { | 365 | { |
| 369 | struct pxamci_host *host = mmc_priv(mmc); | 366 | struct pxamci_host *host = mmc_priv(mmc); |
| 370 | 367 | ||
| 371 | pr_debug("pxamci_set_ios: clock %u power %u vdd %u.%02u\n", | ||
| 372 | ios->clock, ios->power_mode, ios->vdd / 100, | ||
| 373 | ios->vdd % 100); | ||
| 374 | |||
| 375 | if (ios->clock) { | 368 | if (ios->clock) { |
| 376 | unsigned int clk = CLOCKRATE / ios->clock; | 369 | unsigned int clk = CLOCKRATE / ios->clock; |
| 377 | if (CLOCKRATE / clk > ios->clock) | 370 | if (CLOCKRATE / clk > ios->clock) |
| @@ -397,7 +390,7 @@ static void pxamci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 397 | host->cmdat |= CMDAT_INIT; | 390 | host->cmdat |= CMDAT_INIT; |
| 398 | } | 391 | } |
| 399 | 392 | ||
| 400 | pr_debug("pxamci_set_ios: clkrt = %x cmdat = %x\n", | 393 | pr_debug("PXAMCI: clkrt = %x cmdat = %x\n", |
| 401 | host->clkrt, host->cmdat); | 394 | host->clkrt, host->cmdat); |
| 402 | } | 395 | } |
| 403 | 396 | ||
diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c index bdbfca050029..b0053280ff2d 100644 --- a/drivers/mmc/sdhci.c +++ b/drivers/mmc/sdhci.c | |||
| @@ -570,10 +570,6 @@ static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 570 | 570 | ||
| 571 | spin_lock_irqsave(&host->lock, flags); | 571 | spin_lock_irqsave(&host->lock, flags); |
| 572 | 572 | ||
| 573 | DBG("clock %uHz busmode %u powermode %u cs %u Vdd %u width %u\n", | ||
| 574 | ios->clock, ios->bus_mode, ios->power_mode, ios->chip_select, | ||
| 575 | ios->vdd, ios->bus_width); | ||
| 576 | |||
| 577 | /* | 573 | /* |
| 578 | * Reset the chip on each power off. | 574 | * Reset the chip on each power off. |
| 579 | * Should clear out any weird states. | 575 | * Should clear out any weird states. |
diff --git a/drivers/mmc/wbsd.c b/drivers/mmc/wbsd.c index 511f7b0b31d2..8167332d4013 100644 --- a/drivers/mmc/wbsd.c +++ b/drivers/mmc/wbsd.c | |||
| @@ -662,14 +662,14 @@ static void wbsd_prepare_data(struct wbsd_host *host, struct mmc_data *data) | |||
| 662 | unsigned long dmaflags; | 662 | unsigned long dmaflags; |
| 663 | 663 | ||
| 664 | DBGF("blksz %04x blks %04x flags %08x\n", | 664 | DBGF("blksz %04x blks %04x flags %08x\n", |
| 665 | 1 << data->blksz_bits, data->blocks, data->flags); | 665 | data->blksz, data->blocks, data->flags); |
| 666 | DBGF("tsac %d ms nsac %d clk\n", | 666 | DBGF("tsac %d ms nsac %d clk\n", |
| 667 | data->timeout_ns / 1000000, data->timeout_clks); | 667 | data->timeout_ns / 1000000, data->timeout_clks); |
| 668 | 668 | ||
| 669 | /* | 669 | /* |
| 670 | * Calculate size. | 670 | * Calculate size. |
| 671 | */ | 671 | */ |
| 672 | host->size = data->blocks << data->blksz_bits; | 672 | host->size = data->blocks * data->blksz; |
| 673 | 673 | ||
| 674 | /* | 674 | /* |
| 675 | * Check timeout values for overflow. | 675 | * Check timeout values for overflow. |
| @@ -696,12 +696,12 @@ static void wbsd_prepare_data(struct wbsd_host *host, struct mmc_data *data) | |||
| 696 | * Two bytes are needed for each data line. | 696 | * Two bytes are needed for each data line. |
| 697 | */ | 697 | */ |
| 698 | if (host->bus_width == MMC_BUS_WIDTH_1) { | 698 | if (host->bus_width == MMC_BUS_WIDTH_1) { |
| 699 | blksize = (1 << data->blksz_bits) + 2; | 699 | blksize = data->blksz + 2; |
| 700 | 700 | ||
| 701 | wbsd_write_index(host, WBSD_IDX_PBSMSB, (blksize >> 4) & 0xF0); | 701 | wbsd_write_index(host, WBSD_IDX_PBSMSB, (blksize >> 4) & 0xF0); |
| 702 | wbsd_write_index(host, WBSD_IDX_PBSLSB, blksize & 0xFF); | 702 | wbsd_write_index(host, WBSD_IDX_PBSLSB, blksize & 0xFF); |
| 703 | } else if (host->bus_width == MMC_BUS_WIDTH_4) { | 703 | } else if (host->bus_width == MMC_BUS_WIDTH_4) { |
| 704 | blksize = (1 << data->blksz_bits) + 2 * 4; | 704 | blksize = data->blksz + 2 * 4; |
| 705 | 705 | ||
| 706 | wbsd_write_index(host, WBSD_IDX_PBSMSB, | 706 | wbsd_write_index(host, WBSD_IDX_PBSMSB, |
| 707 | ((blksize >> 4) & 0xF0) | WBSD_DATA_WIDTH); | 707 | ((blksize >> 4) & 0xF0) | WBSD_DATA_WIDTH); |
| @@ -931,10 +931,6 @@ static void wbsd_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 931 | struct wbsd_host *host = mmc_priv(mmc); | 931 | struct wbsd_host *host = mmc_priv(mmc); |
| 932 | u8 clk, setup, pwr; | 932 | u8 clk, setup, pwr; |
| 933 | 933 | ||
| 934 | DBGF("clock %uHz busmode %u powermode %u cs %u Vdd %u width %u\n", | ||
| 935 | ios->clock, ios->bus_mode, ios->power_mode, ios->chip_select, | ||
| 936 | ios->vdd, ios->bus_width); | ||
| 937 | |||
| 938 | spin_lock_bh(&host->lock); | 934 | spin_lock_bh(&host->lock); |
| 939 | 935 | ||
| 940 | /* | 936 | /* |
