Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'mmc-v5.19-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc

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

+14 -8
+12 -8
drivers/mmc/host/mtk-sd.c
··· 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 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 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"); ··· 1418 1415 } 1419 1416 1420 1417 msdc_data_xfer_next(host, mrq); 1421 - done = true; 1422 1418 } 1423 - return done; 1424 1419 } 1425 1420 1426 1421 static void msdc_set_buswidth(struct msdc_host *host, u32 width) ··· 2417 2416 if (recovery) { 2418 2417 sdr_set_field(host->base + MSDC_DMA_CTRL, 2419 2418 MSDC_DMA_CTRL_STOP, 1); 2419 + if (WARN_ON(readl_poll_timeout(host->base + MSDC_DMA_CTRL, val, 2420 + !(val & MSDC_DMA_CTRL_STOP), 1, 3000))) 2421 + return; 2420 2422 if (WARN_ON(readl_poll_timeout(host->base + MSDC_DMA_CFG, val, 2421 2423 !(val & MSDC_DMA_CFG_STS), 1, 3000))) 2422 2424 return;
+2
drivers/mmc/host/sdhci-pci-o2micro.c
··· 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 }