Pull MMC fixes from Ulf Hansson: - mtk-sd: Fix dma hang issues - sdhci-pci-o2micro: Fix card detect by dealing with debouncing * tag 'mmc-v5.19-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc: mmc: mediatek: wait dma stop bit reset to 0 mmc: sdhci-pci-o2micro: Fix card detect by dealing with debouncing
Unified · Split
| @@ -1356,7 +1356,7 @@ static void msdc_data_xfer_next(struct msdc_host *host, struct mmc_request *mrq) · 1355 unmodified lines | ||
| 1356 | 1356 | msdc_request_done(host, mrq); |
| 1357 | 1357 | } |
| 1358 | 1358 | |
| 1359 | −static bool msdc_data_xfer_done(struct msdc_host *host, u32 events, | |
| 1359 | +static void msdc_data_xfer_done(struct msdc_host *host, u32 events, | |
| 1360 | 1360 | struct mmc_request *mrq, struct mmc_data *data) |
| 1361 | 1361 | { |
| 1362 | 1362 | struct mmc_command *stop; |
| @@ -1376,7 +1376,7 @@ static bool msdc_data_xfer_done(struct msdc_host *host, u32 events, · 13 unmodified lines | ||
| 1376 | 1376 | spin_unlock_irqrestore(&host->lock, flags); |
| 1377 | 1377 | |
| 1378 | 1378 | if (done) |
| 1379 | − return true; | |
| 1379 | + return; | |
| 1380 | 1380 | stop = data->stop; |
| 1381 | 1381 | |
| 1382 | 1382 | if (check_data || (stop && stop->error)) { |
| @@ -1385,12 +1385,15 @@ static bool msdc_data_xfer_done(struct msdc_host *host, u32 events, · 2 unmodified lines | ||
| 1385 | 1385 | sdr_set_field(host->base + MSDC_DMA_CTRL, MSDC_DMA_CTRL_STOP, |
| 1386 | 1386 | 1); |
| 1387 | 1387 | |
| 1388 | + ret = readl_poll_timeout_atomic(host->base + MSDC_DMA_CTRL, val, | |
| 1389 | + !(val & MSDC_DMA_CTRL_STOP), 1, 20000); | |
| 1390 | + if (ret) | |
| 1391 | + dev_dbg(host->dev, "DMA stop timed out\n"); | |
| 1392 | + | |
| 1388 | 1393 | ret = readl_poll_timeout_atomic(host->base + MSDC_DMA_CFG, val, |
| 1389 | 1394 | !(val & MSDC_DMA_CFG_STS), 1, 20000); |
| 1390 | − if (ret) { | |
| 1391 | − dev_dbg(host->dev, "DMA stop timed out\n"); | |
| 1392 | − return false; | |
| 1393 | − } | |
| 1395 | + if (ret) | |
| 1396 | + dev_dbg(host->dev, "DMA inactive timed out\n"); | |
| 1394 | 1397 | |
| 1395 | 1398 | sdr_clr_bits(host->base + MSDC_INTEN, data_ints_mask); |
| 1396 | 1399 | dev_dbg(host->dev, "DMA stop\n"); |
| @@ -1415,9 +1418,7 @@ static bool msdc_data_xfer_done(struct msdc_host *host, u32 events, · 18 unmodified lines | ||
| 1415 | 1418 | } |
| 1416 | 1419 | |
| 1417 | 1420 | msdc_data_xfer_next(host, mrq); |
| 1418 | − done = true; | |
| 1419 | 1421 | } |
| 1420 | − return done; | |
| 1421 | 1422 | } |
| 1422 | 1423 | |
| 1423 | 1424 | static void msdc_set_buswidth(struct msdc_host *host, u32 width) |
| @@ -2416,6 +2417,9 @@ static void msdc_cqe_disable(struct mmc_host *mmc, bool recovery) · 992 unmodified lines | ||
| 2416 | 2417 | if (recovery) { |
| 2417 | 2418 | sdr_set_field(host->base + MSDC_DMA_CTRL, |
| 2418 | 2419 | MSDC_DMA_CTRL_STOP, 1); |
| 2420 | + if (WARN_ON(readl_poll_timeout(host->base + MSDC_DMA_CTRL, val, | |
| 2421 | + !(val & MSDC_DMA_CTRL_STOP), 1, 3000))) | |
| 2422 | + return; | |
| 2419 | 2423 | if (WARN_ON(readl_poll_timeout(host->base + MSDC_DMA_CFG, val, |
| 2420 | 2424 | !(val & MSDC_DMA_CFG_STS), 1, 3000))) |
| 2421 | 2425 | return; |
| @@ -152,6 +152,8 @@ static int sdhci_o2_get_cd(struct mmc_host *mmc) · 151 unmodified lines | ||
| 152 | 152 | |
| 153 | 153 | if (!(sdhci_readw(host, O2_PLL_DLL_WDT_CONTROL1) & O2_PLL_LOCK_STATUS)) |
| 154 | 154 | sdhci_o2_enable_internal_clock(host); |
| 155 | + else | |
| 156 | + sdhci_o2_wait_card_detect_stable(host); | |
| 155 | 157 | |
| 156 | 158 | return !!(sdhci_readl(host, SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT); |
| 157 | 159 | } |