mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-03 07:26:45 +07:00
MMC core:
- Fixup devname in /proc/interrupts for card detect GPIO MMC host: - sdhci-esdhc-imx: Allow 1.8V speed-modes without 100/200MHz pinctrls - sunxi: Disable IRQ in low power state to prevent IRQ storm - dw_mmc: Fix card threshold control configuration - renesas_sdhi_internal_dmac: Fixup DMA error paths -----BEGIN PGP SIGNATURE----- iQJLBAABCgA1FiEEugLDXPmKSktSkQsV/iaEJXNYjCkFAltE40MXHHVsZi5oYW5z c29uQGxpbmFyby5vcmcACgkQ/iaEJXNYjCmathAAlDlEMDV9qNR0n8ZfNW7m5R2R yYAKjoP+VTs1oVy88aiQJfnFjEGxVTnusqYlmX1MCqk4z708di6oue37NavXdS7K Z8uYEqYFlUhRCEd5DIze2JKJNTr3zOv3VPaP5r9/nENYKnZRh3MDo4GxyAlQ8S/n rH9ueTlB3DzJuYzMtZOVbrth1uGM5RzxwxRV5jUxNRZ09bFmIm1nsD1N9uNYNVVU GGUyaTKG6/7xKOczrF2w0tOgiaJxGXyYrZzkEpOUsS1RrwSEysf17keYtsp9akyN 3jtC7YEscUpy2VigifrvsBu1D0oQP73Cuz7FAPEf3Kbauo+qyKK0gnJG/j60BuqW 6K8R2DXtBPUofV5Uy4tx3rmElQ83jwzH8uE0Z0Cdt8uchoSrwK6alyqx9bLrldTh cz68xsR2s+jJQkIosmqmn9jBQaWxP6yA9OhDhP7CztqWANxc/N4g9h/3tOyZvQpv nBttAWAZfb55Y1W6Uh4o80vPnsYP4QRuhRjS0IogYXbr6NsJlM5ZKvmtGmNpyx98 MTJBhw8fFh61r5hWBH8R/I+4ZJJIsIjVlQZm1Y91u8icvD32yO+bX3FryqfuCF86 9KO94g4yu9jqg/5RqFeHg6AlEAwLld2nmhzXshrEE6rGo85wR5XXXOARWUeLh9Ag 78BF/H95D4qVdPn5Hh8= =MKrd -----END PGP SIGNATURE----- Merge tag 'mmc-v4.18-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc Pull MMC fixes from Ulf Hansson: "MMC core: - Fixup devname in /proc/interrupts for card detect GPIO MMC host: - sdhci-esdhc-imx: Allow 1.8V speed-modes without 100/200MHz pinctrls - sunxi: Disable IRQ in low power state to prevent IRQ storm - dw_mmc: Fix card threshold control configuration - renesas_sdhi_internal_dmac: Fixup DMA error paths" * tag 'mmc-v4.18-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc: mmc: sdhci-esdhc-imx: allow 1.8V modes without 100/200MHz pinctrl states mmc: sunxi: Disable irq during pm_suspend mmc: dw_mmc: fix card threshold control configuration mmc: core: cd_label must be last entry of mmc_gpio struct mmc: renesas_sdhi_internal_dmac: Cannot clear the RX_IN_USE in abort mmc: renesas_sdhi_internal_dmac: Fix missing unmap in error patch
This commit is contained in:
commit
f1454959ad
@ -27,8 +27,8 @@ struct mmc_gpio {
|
||||
bool override_cd_active_level;
|
||||
irqreturn_t (*cd_gpio_isr)(int irq, void *dev_id);
|
||||
char *ro_label;
|
||||
char cd_label[0];
|
||||
u32 cd_debounce_delay_ms;
|
||||
char cd_label[];
|
||||
};
|
||||
|
||||
static irqreturn_t mmc_gpio_cd_irqt(int irq, void *dev_id)
|
||||
|
@ -1065,8 +1065,8 @@ static void dw_mci_ctrl_thld(struct dw_mci *host, struct mmc_data *data)
|
||||
* It's used when HS400 mode is enabled.
|
||||
*/
|
||||
if (data->flags & MMC_DATA_WRITE &&
|
||||
!(host->timing != MMC_TIMING_MMC_HS400))
|
||||
return;
|
||||
host->timing != MMC_TIMING_MMC_HS400)
|
||||
goto disable;
|
||||
|
||||
if (data->flags & MMC_DATA_WRITE)
|
||||
enable = SDMMC_CARD_WR_THR_EN;
|
||||
@ -1074,7 +1074,8 @@ static void dw_mci_ctrl_thld(struct dw_mci *host, struct mmc_data *data)
|
||||
enable = SDMMC_CARD_RD_THR_EN;
|
||||
|
||||
if (host->timing != MMC_TIMING_MMC_HS200 &&
|
||||
host->timing != MMC_TIMING_UHS_SDR104)
|
||||
host->timing != MMC_TIMING_UHS_SDR104 &&
|
||||
host->timing != MMC_TIMING_MMC_HS400)
|
||||
goto disable;
|
||||
|
||||
blksz_depth = blksz / (1 << host->data_shift);
|
||||
|
@ -139,8 +139,7 @@ renesas_sdhi_internal_dmac_abort_dma(struct tmio_mmc_host *host) {
|
||||
renesas_sdhi_internal_dmac_dm_write(host, DM_CM_RST,
|
||||
RST_RESERVED_BITS | val);
|
||||
|
||||
if (host->data && host->data->flags & MMC_DATA_READ)
|
||||
clear_bit(SDHI_INTERNAL_DMAC_RX_IN_USE, &global_flags);
|
||||
clear_bit(SDHI_INTERNAL_DMAC_RX_IN_USE, &global_flags);
|
||||
|
||||
renesas_sdhi_internal_dmac_enable_dma(host, true);
|
||||
}
|
||||
@ -164,17 +163,14 @@ renesas_sdhi_internal_dmac_start_dma(struct tmio_mmc_host *host,
|
||||
goto force_pio;
|
||||
|
||||
/* This DMAC cannot handle if buffer is not 8-bytes alignment */
|
||||
if (!IS_ALIGNED(sg_dma_address(sg), 8)) {
|
||||
dma_unmap_sg(&host->pdev->dev, sg, host->sg_len,
|
||||
mmc_get_dma_dir(data));
|
||||
goto force_pio;
|
||||
}
|
||||
if (!IS_ALIGNED(sg_dma_address(sg), 8))
|
||||
goto force_pio_with_unmap;
|
||||
|
||||
if (data->flags & MMC_DATA_READ) {
|
||||
dtran_mode |= DTRAN_MODE_CH_NUM_CH1;
|
||||
if (test_bit(SDHI_INTERNAL_DMAC_ONE_RX_ONLY, &global_flags) &&
|
||||
test_and_set_bit(SDHI_INTERNAL_DMAC_RX_IN_USE, &global_flags))
|
||||
goto force_pio;
|
||||
goto force_pio_with_unmap;
|
||||
} else {
|
||||
dtran_mode |= DTRAN_MODE_CH_NUM_CH0;
|
||||
}
|
||||
@ -189,6 +185,9 @@ renesas_sdhi_internal_dmac_start_dma(struct tmio_mmc_host *host,
|
||||
|
||||
return;
|
||||
|
||||
force_pio_with_unmap:
|
||||
dma_unmap_sg(&host->pdev->dev, sg, host->sg_len, mmc_get_dma_dir(data));
|
||||
|
||||
force_pio:
|
||||
host->force_pio = true;
|
||||
renesas_sdhi_internal_dmac_enable_dma(host, false);
|
||||
|
@ -312,6 +312,15 @@ static u32 esdhc_readl_le(struct sdhci_host *host, int reg)
|
||||
|
||||
if (imx_data->socdata->flags & ESDHC_FLAG_HS400)
|
||||
val |= SDHCI_SUPPORT_HS400;
|
||||
|
||||
/*
|
||||
* Do not advertise faster UHS modes if there are no
|
||||
* pinctrl states for 100MHz/200MHz.
|
||||
*/
|
||||
if (IS_ERR_OR_NULL(imx_data->pins_100mhz) ||
|
||||
IS_ERR_OR_NULL(imx_data->pins_200mhz))
|
||||
val &= ~(SDHCI_SUPPORT_SDR50 | SDHCI_SUPPORT_DDR50
|
||||
| SDHCI_SUPPORT_SDR104 | SDHCI_SUPPORT_HS400);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1158,18 +1167,6 @@ sdhci_esdhc_imx_probe_dt(struct platform_device *pdev,
|
||||
ESDHC_PINCTRL_STATE_100MHZ);
|
||||
imx_data->pins_200mhz = pinctrl_lookup_state(imx_data->pinctrl,
|
||||
ESDHC_PINCTRL_STATE_200MHZ);
|
||||
if (IS_ERR(imx_data->pins_100mhz) ||
|
||||
IS_ERR(imx_data->pins_200mhz)) {
|
||||
dev_warn(mmc_dev(host->mmc),
|
||||
"could not get ultra high speed state, work on normal mode\n");
|
||||
/*
|
||||
* fall back to not supporting uhs by specifying no
|
||||
* 1.8v quirk
|
||||
*/
|
||||
host->quirks2 |= SDHCI_QUIRK2_NO_1_8_V;
|
||||
}
|
||||
} else {
|
||||
host->quirks2 |= SDHCI_QUIRK2_NO_1_8_V;
|
||||
}
|
||||
|
||||
/* call to generic mmc_of_parse to support additional capabilities */
|
||||
|
@ -1446,6 +1446,7 @@ static int sunxi_mmc_runtime_resume(struct device *dev)
|
||||
sunxi_mmc_init_host(host);
|
||||
sunxi_mmc_set_bus_width(host, mmc->ios.bus_width);
|
||||
sunxi_mmc_set_clk(host, &mmc->ios);
|
||||
enable_irq(host->irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1455,6 +1456,12 @@ static int sunxi_mmc_runtime_suspend(struct device *dev)
|
||||
struct mmc_host *mmc = dev_get_drvdata(dev);
|
||||
struct sunxi_mmc_host *host = mmc_priv(mmc);
|
||||
|
||||
/*
|
||||
* When clocks are off, it's possible receiving
|
||||
* fake interrupts, which will stall the system.
|
||||
* Disabling the irq will prevent this.
|
||||
*/
|
||||
disable_irq(host->irq);
|
||||
sunxi_mmc_reset_host(host);
|
||||
sunxi_mmc_disable(host);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user