| .. | .. |
|---|
| 124 | 124 | EXPORT_SYMBOL(rv1106_sdmmc_put_lock); |
|---|
| 125 | 125 | #endif |
|---|
| 126 | 126 | |
|---|
| 127 | +#define RV1106_RAMDON_DATA_SIZE 508 |
|---|
| 128 | + |
|---|
| 127 | 129 | #if defined(CONFIG_DEBUG_FS) |
|---|
| 128 | 130 | static int dw_mci_req_show(struct seq_file *s, void *v) |
|---|
| 129 | 131 | { |
|---|
| .. | .. |
|---|
| 525 | 527 | tasklet_schedule(&host->tasklet); |
|---|
| 526 | 528 | } |
|---|
| 527 | 529 | |
|---|
| 528 | | - if (host->need_xfer_timer && |
|---|
| 529 | | - host->dir_status == DW_MCI_RECV_STATUS) |
|---|
| 530 | + if (host->need_xfer_timer) |
|---|
| 530 | 531 | del_timer(&host->xfer_timer); |
|---|
| 531 | 532 | } |
|---|
| 532 | 533 | |
|---|
| .. | .. |
|---|
| 739 | 740 | if (host->is_rv1106_sd && (data->flags & MMC_DATA_WRITE)) { |
|---|
| 740 | 741 | desc->des0 = desc_last->des0; |
|---|
| 741 | 742 | desc->des2 = desc_last->des2; |
|---|
| 742 | | - desc->des1 = 0x8; /* Random dirty data for last one desc */ |
|---|
| 743 | + desc->des1 = RV1106_RAMDON_DATA_SIZE; /* Random dirty data for last one desc */ |
|---|
| 743 | 744 | desc_last = desc; |
|---|
| 744 | 745 | } |
|---|
| 745 | 746 | |
|---|
| .. | .. |
|---|
| 1447 | 1448 | return; |
|---|
| 1448 | 1449 | } |
|---|
| 1449 | 1450 | |
|---|
| 1450 | | - if (host->is_rv1106_sd) { |
|---|
| 1451 | | - u32 reg; |
|---|
| 1452 | | - |
|---|
| 1453 | | - readl_poll_timeout(host->regs + SDMMC_STATUS, reg, |
|---|
| 1454 | | - reg & BIT(2), USEC_PER_MSEC, 500 * USEC_PER_MSEC); |
|---|
| 1455 | | - } |
|---|
| 1456 | | - |
|---|
| 1457 | 1451 | spin_lock_bh(&host->lock); |
|---|
| 1458 | 1452 | |
|---|
| 1459 | 1453 | if (host->is_rv1106_sd) |
|---|
| .. | .. |
|---|
| 1549 | 1543 | slot->host->vqmmc_enabled = true; |
|---|
| 1550 | 1544 | } |
|---|
| 1551 | 1545 | |
|---|
| 1546 | +#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC |
|---|
| 1552 | 1547 | /* Reset our state machine after powering on */ |
|---|
| 1553 | 1548 | dw_mci_ctrl_reset(slot->host, |
|---|
| 1554 | 1549 | SDMMC_CTRL_ALL_RESET_FLAGS); |
|---|
| 1550 | +#endif |
|---|
| 1555 | 1551 | } |
|---|
| 1556 | 1552 | |
|---|
| 1557 | 1553 | /* Adjust clock / bus width after power is up */ |
|---|
| .. | .. |
|---|
| 1874 | 1870 | |
|---|
| 1875 | 1871 | WARN_ON(host->cmd || host->data); |
|---|
| 1876 | 1872 | |
|---|
| 1873 | + if (host->need_xfer_timer) |
|---|
| 1874 | + del_timer(&host->xfer_timer); |
|---|
| 1875 | + |
|---|
| 1877 | 1876 | host->slot->mrq = NULL; |
|---|
| 1878 | 1877 | host->mrq = NULL; |
|---|
| 1879 | 1878 | if (!list_empty(&host->queue)) { |
|---|
| .. | .. |
|---|
| 2019 | 2018 | host->bus_hz); |
|---|
| 2020 | 2019 | |
|---|
| 2021 | 2020 | /* add a bit spare time */ |
|---|
| 2022 | | - xfer_ms += 100; |
|---|
| 2023 | | - |
|---|
| 2021 | + if (host->dir_status == DW_MCI_RECV_STATUS) |
|---|
| 2022 | + xfer_ms += 100; |
|---|
| 2023 | + else |
|---|
| 2024 | + xfer_ms += 2500; |
|---|
| 2024 | 2025 | spin_lock_irqsave(&host->irq_lock, irqflags); |
|---|
| 2025 | 2026 | if (!test_bit(EVENT_XFER_COMPLETE, &host->pending_events)) |
|---|
| 2026 | 2027 | mod_timer(&host->xfer_timer, |
|---|
| .. | .. |
|---|
| 2155 | 2156 | send_stop_abort(host, data); |
|---|
| 2156 | 2157 | dw_mci_stop_dma(host); |
|---|
| 2157 | 2158 | state = STATE_DATA_ERROR; |
|---|
| 2159 | + if (host->dir_status == DW_MCI_SEND_STATUS) { |
|---|
| 2160 | + data->bytes_xfered = 0; |
|---|
| 2161 | + data->error = -ETIMEDOUT; |
|---|
| 2162 | + host->data = NULL; |
|---|
| 2163 | + dw_mci_request_end(host, mrq); |
|---|
| 2164 | + goto unlock; |
|---|
| 2165 | + } |
|---|
| 2158 | 2166 | break; |
|---|
| 2159 | 2167 | } |
|---|
| 2160 | 2168 | |
|---|
| .. | .. |
|---|
| 2166 | 2174 | */ |
|---|
| 2167 | 2175 | if (host->dir_status == DW_MCI_RECV_STATUS) |
|---|
| 2168 | 2176 | dw_mci_set_drto(host); |
|---|
| 2169 | | - if (host->need_xfer_timer && |
|---|
| 2170 | | - host->dir_status == DW_MCI_RECV_STATUS) |
|---|
| 2177 | + if (host->need_xfer_timer) |
|---|
| 2171 | 2178 | dw_mci_set_xfer_timeout(host); |
|---|
| 2172 | 2179 | break; |
|---|
| 2173 | 2180 | } |
|---|
| .. | .. |
|---|
| 2209 | 2216 | */ |
|---|
| 2210 | 2217 | if (host->dir_status == DW_MCI_RECV_STATUS) |
|---|
| 2211 | 2218 | dw_mci_set_drto(host); |
|---|
| 2219 | + if (host->need_xfer_timer && host->dir_status == DW_MCI_SEND_STATUS) |
|---|
| 2220 | + dw_mci_set_xfer_timeout(host); |
|---|
| 2212 | 2221 | break; |
|---|
| 2213 | 2222 | } |
|---|
| 2214 | 2223 | |
|---|
| .. | .. |
|---|
| 2225 | 2234 | } |
|---|
| 2226 | 2235 | |
|---|
| 2227 | 2236 | /* stop command for open-ended transfer*/ |
|---|
| 2228 | | - if (data->stop) |
|---|
| 2237 | + if (data->stop) { |
|---|
| 2238 | + if (host->is_rv1106_sd && (data->flags & MMC_DATA_WRITE)) { |
|---|
| 2239 | + int fifo_count; |
|---|
| 2240 | + |
|---|
| 2241 | + if (readl_poll_timeout_atomic(host->regs + SDMMC_STATUS, fifo_count, |
|---|
| 2242 | + ((fifo_count >> 17) & 0x7FF) <= RV1106_RAMDON_DATA_SIZE / 4, |
|---|
| 2243 | + 0, 5000 * USEC_PER_MSEC)) |
|---|
| 2244 | + data->error = -ETIMEDOUT; |
|---|
| 2245 | + udelay(1); |
|---|
| 2246 | + dw_mci_reset(host); |
|---|
| 2247 | + } |
|---|
| 2229 | 2248 | send_stop_abort(host, data); |
|---|
| 2249 | + } |
|---|
| 2230 | 2250 | } else { |
|---|
| 2231 | 2251 | /* |
|---|
| 2232 | 2252 | * If we don't have a command complete now we'll |
|---|
| .. | .. |
|---|
| 2757 | 2777 | del_timer(&host->cto_timer); |
|---|
| 2758 | 2778 | mci_writel(host, RINTSTS, DW_MCI_CMD_ERROR_FLAGS); |
|---|
| 2759 | 2779 | host->cmd_status = pending; |
|---|
| 2760 | | - if ((host->need_xfer_timer) && |
|---|
| 2761 | | - host->dir_status == DW_MCI_RECV_STATUS) |
|---|
| 2780 | + if (host->need_xfer_timer) |
|---|
| 2762 | 2781 | del_timer(&host->xfer_timer); |
|---|
| 2763 | 2782 | smp_wmb(); /* drain writebuffer */ |
|---|
| 2764 | 2783 | set_bit(EVENT_CMD_COMPLETE, &host->pending_events); |
|---|
| .. | .. |
|---|
| 3663 | 3682 | mci_writel(host, INTMASK, ret); |
|---|
| 3664 | 3683 | } |
|---|
| 3665 | 3684 | |
|---|
| 3666 | | - if (host->slot->mmc->pm_flags & MMC_PM_KEEP_POWER) |
|---|
| 3685 | + if (host->slot && host->slot->mmc->pm_flags & MMC_PM_KEEP_POWER) |
|---|
| 3667 | 3686 | dw_mci_set_ios(host->slot->mmc, &host->slot->mmc->ios); |
|---|
| 3668 | 3687 | |
|---|
| 3669 | 3688 | /* Force setup bus to guarantee available clock output */ |
|---|