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 | msdc_request_done(host, mrq); | 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 | struct mmc_request *mrq, struct mmc_data *data) | 1360 | struct mmc_request *mrq, struct mmc_data *data) |
| 1361 | { | 1361 | { |
| 1362 | struct mmc_command *stop; | 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 | spin_unlock_irqrestore(&host->lock, flags); | 1376 | spin_unlock_irqrestore(&host->lock, flags); |
| 1377 | 1377 | ||
| 1378 | if (done) | 1378 | if (done) |
| 1379 | return true; | 1379 | return; |
| 1380 | stop = data->stop; | 1380 | stop = data->stop; |
| 1381 | 1381 | ||
| 1382 | if (check_data || (stop && stop->error)) { | 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 | sdr_set_field(host->base + MSDC_DMA_CTRL, MSDC_DMA_CTRL_STOP, | 1385 | sdr_set_field(host->base + MSDC_DMA_CTRL, MSDC_DMA_CTRL_STOP, |
| 1386 | 1); | 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 | ret = readl_poll_timeout_atomic(host->base + MSDC_DMA_CFG, val, | 1393 | ret = readl_poll_timeout_atomic(host->base + MSDC_DMA_CFG, val, |
| 1389 | !(val & MSDC_DMA_CFG_STS), 1, 20000); | 1394 | !(val & MSDC_DMA_CFG_STS), 1, 20000); |
| 1390 | if (ret) { | 1395 | if (ret) |
| 1391 | dev_dbg(host->dev, "DMA stop timed out\n"); | 1396 | dev_dbg(host->dev, "DMA inactive timed out\n"); |
| 1392 | return false; | ||
| 1393 | } | ||
| 1394 | 1397 | ||
| 1395 | sdr_clr_bits(host->base + MSDC_INTEN, data_ints_mask); | 1398 | sdr_clr_bits(host->base + MSDC_INTEN, data_ints_mask); |
| 1396 | dev_dbg(host->dev, "DMA stop\n"); | 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 | msdc_data_xfer_next(host, mrq); | 1420 | msdc_data_xfer_next(host, mrq); |
| 1418 | done = true; | ||
| 1419 | } | 1421 | } |
| 1420 | return done; | ||
| 1421 | } | 1422 | } |
| 1422 | 1423 | ||
| 1423 | static void msdc_set_buswidth(struct msdc_host *host, u32 width) | 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 | if (recovery) { | 2417 | if (recovery) { |
| 2417 | sdr_set_field(host->base + MSDC_DMA_CTRL, | 2418 | sdr_set_field(host->base + MSDC_DMA_CTRL, |
| 2418 | MSDC_DMA_CTRL_STOP, 1); | 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 | if (WARN_ON(readl_poll_timeout(host->base + MSDC_DMA_CFG, val, | 2423 | if (WARN_ON(readl_poll_timeout(host->base + MSDC_DMA_CFG, val, |
| 2420 | !(val & MSDC_DMA_CFG_STS), 1, 3000))) | 2424 | !(val & MSDC_DMA_CFG_STS), 1, 3000))) |
| 2421 | return; | 2425 | return; |
| @@ -152,6 +152,8 @@ static int sdhci_o2_get_cd(struct mmc_host *mmc) · 151 unmodified lines | |||
| 152 | 152 | ||
| 153 | if (!(sdhci_readw(host, O2_PLL_DLL_WDT_CONTROL1) & O2_PLL_LOCK_STATUS)) | 153 | if (!(sdhci_readw(host, O2_PLL_DLL_WDT_CONTROL1) & O2_PLL_LOCK_STATUS)) |
| 154 | sdhci_o2_enable_internal_clock(host); | 154 | sdhci_o2_enable_internal_clock(host); |
| 155 | else | ||
| 156 | sdhci_o2_wait_card_detect_stable(host); | ||
| 155 | 157 | ||
| 156 | return !!(sdhci_readl(host, SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT); | 158 | return !!(sdhci_readl(host, SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT); |
| 157 | } | 159 | } |