mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 11:26:02 +09:00
mmc: dw_mmc: add exynos7870 DW MMC support
[ Upstream commit 7cbe799ac10fd8be85af5e0615c4337f81e575f3 ] Add support for Exynos7870 DW MMC controllers, for both SMU and non-SMU variants. These controllers require a quirk to access 64-bit FIFO in 32-bit accesses (DW_MMC_QUIRK_FIFO64_32). Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org> Link: https://lore.kernel.org/r/20250219-exynos7870-mmc-v2-3-b4255a3e39ed@disroot.org Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
5cdb89f76e
commit
03c9ac48ae
@@ -28,6 +28,8 @@ enum dw_mci_exynos_type {
|
|||||||
DW_MCI_TYPE_EXYNOS5420_SMU,
|
DW_MCI_TYPE_EXYNOS5420_SMU,
|
||||||
DW_MCI_TYPE_EXYNOS7,
|
DW_MCI_TYPE_EXYNOS7,
|
||||||
DW_MCI_TYPE_EXYNOS7_SMU,
|
DW_MCI_TYPE_EXYNOS7_SMU,
|
||||||
|
DW_MCI_TYPE_EXYNOS7870,
|
||||||
|
DW_MCI_TYPE_EXYNOS7870_SMU,
|
||||||
DW_MCI_TYPE_ARTPEC8,
|
DW_MCI_TYPE_ARTPEC8,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -70,6 +72,12 @@ static struct dw_mci_exynos_compatible {
|
|||||||
}, {
|
}, {
|
||||||
.compatible = "samsung,exynos7-dw-mshc-smu",
|
.compatible = "samsung,exynos7-dw-mshc-smu",
|
||||||
.ctrl_type = DW_MCI_TYPE_EXYNOS7_SMU,
|
.ctrl_type = DW_MCI_TYPE_EXYNOS7_SMU,
|
||||||
|
}, {
|
||||||
|
.compatible = "samsung,exynos7870-dw-mshc",
|
||||||
|
.ctrl_type = DW_MCI_TYPE_EXYNOS7870,
|
||||||
|
}, {
|
||||||
|
.compatible = "samsung,exynos7870-dw-mshc-smu",
|
||||||
|
.ctrl_type = DW_MCI_TYPE_EXYNOS7870_SMU,
|
||||||
}, {
|
}, {
|
||||||
.compatible = "axis,artpec8-dw-mshc",
|
.compatible = "axis,artpec8-dw-mshc",
|
||||||
.ctrl_type = DW_MCI_TYPE_ARTPEC8,
|
.ctrl_type = DW_MCI_TYPE_ARTPEC8,
|
||||||
@@ -86,6 +94,8 @@ static inline u8 dw_mci_exynos_get_ciu_div(struct dw_mci *host)
|
|||||||
return EXYNOS4210_FIXED_CIU_CLK_DIV;
|
return EXYNOS4210_FIXED_CIU_CLK_DIV;
|
||||||
else if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
else if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
||||||
return SDMMC_CLKSEL_GET_DIV(mci_readl(host, CLKSEL64)) + 1;
|
return SDMMC_CLKSEL_GET_DIV(mci_readl(host, CLKSEL64)) + 1;
|
||||||
else
|
else
|
||||||
@@ -101,7 +111,8 @@ static void dw_mci_exynos_config_smu(struct dw_mci *host)
|
|||||||
* set for non-ecryption mode at this time.
|
* set for non-ecryption mode at this time.
|
||||||
*/
|
*/
|
||||||
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS5420_SMU ||
|
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS5420_SMU ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU) {
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU) {
|
||||||
mci_writel(host, MPSBEGIN0, 0);
|
mci_writel(host, MPSBEGIN0, 0);
|
||||||
mci_writel(host, MPSEND0, SDMMC_ENDING_SEC_NR_MAX);
|
mci_writel(host, MPSEND0, SDMMC_ENDING_SEC_NR_MAX);
|
||||||
mci_writel(host, MPSCTRL0, SDMMC_MPSCTRL_SECURE_WRITE_BIT |
|
mci_writel(host, MPSCTRL0, SDMMC_MPSCTRL_SECURE_WRITE_BIT |
|
||||||
@@ -127,6 +138,12 @@ static int dw_mci_exynos_priv_init(struct dw_mci *host)
|
|||||||
DQS_CTRL_GET_RD_DELAY(priv->saved_strobe_ctrl);
|
DQS_CTRL_GET_RD_DELAY(priv->saved_strobe_ctrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU) {
|
||||||
|
/* Quirk needed for certain Exynos SoCs */
|
||||||
|
host->quirks |= DW_MMC_QUIRK_FIFO64_32;
|
||||||
|
}
|
||||||
|
|
||||||
if (priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) {
|
if (priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) {
|
||||||
/* Quirk needed for the ARTPEC-8 SoC */
|
/* Quirk needed for the ARTPEC-8 SoC */
|
||||||
host->quirks |= DW_MMC_QUIRK_EXTENDED_TMOUT;
|
host->quirks |= DW_MMC_QUIRK_EXTENDED_TMOUT;
|
||||||
@@ -144,6 +161,8 @@ static void dw_mci_exynos_set_clksel_timing(struct dw_mci *host, u32 timing)
|
|||||||
|
|
||||||
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
||||||
clksel = mci_readl(host, CLKSEL64);
|
clksel = mci_readl(host, CLKSEL64);
|
||||||
else
|
else
|
||||||
@@ -153,6 +172,8 @@ static void dw_mci_exynos_set_clksel_timing(struct dw_mci *host, u32 timing)
|
|||||||
|
|
||||||
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
||||||
mci_writel(host, CLKSEL64, clksel);
|
mci_writel(host, CLKSEL64, clksel);
|
||||||
else
|
else
|
||||||
@@ -223,6 +244,8 @@ static int dw_mci_exynos_resume_noirq(struct device *dev)
|
|||||||
|
|
||||||
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
||||||
clksel = mci_readl(host, CLKSEL64);
|
clksel = mci_readl(host, CLKSEL64);
|
||||||
else
|
else
|
||||||
@@ -231,6 +254,8 @@ static int dw_mci_exynos_resume_noirq(struct device *dev)
|
|||||||
if (clksel & SDMMC_CLKSEL_WAKEUP_INT) {
|
if (clksel & SDMMC_CLKSEL_WAKEUP_INT) {
|
||||||
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
||||||
mci_writel(host, CLKSEL64, clksel);
|
mci_writel(host, CLKSEL64, clksel);
|
||||||
else
|
else
|
||||||
@@ -410,6 +435,8 @@ static inline u8 dw_mci_exynos_get_clksmpl(struct dw_mci *host)
|
|||||||
|
|
||||||
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
||||||
return SDMMC_CLKSEL_CCLK_SAMPLE(mci_readl(host, CLKSEL64));
|
return SDMMC_CLKSEL_CCLK_SAMPLE(mci_readl(host, CLKSEL64));
|
||||||
else
|
else
|
||||||
@@ -423,6 +450,8 @@ static inline void dw_mci_exynos_set_clksmpl(struct dw_mci *host, u8 sample)
|
|||||||
|
|
||||||
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
||||||
clksel = mci_readl(host, CLKSEL64);
|
clksel = mci_readl(host, CLKSEL64);
|
||||||
else
|
else
|
||||||
@@ -430,6 +459,8 @@ static inline void dw_mci_exynos_set_clksmpl(struct dw_mci *host, u8 sample)
|
|||||||
clksel = SDMMC_CLKSEL_UP_SAMPLE(clksel, sample);
|
clksel = SDMMC_CLKSEL_UP_SAMPLE(clksel, sample);
|
||||||
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
||||||
mci_writel(host, CLKSEL64, clksel);
|
mci_writel(host, CLKSEL64, clksel);
|
||||||
else
|
else
|
||||||
@@ -444,6 +475,8 @@ static inline u8 dw_mci_exynos_move_next_clksmpl(struct dw_mci *host)
|
|||||||
|
|
||||||
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
||||||
clksel = mci_readl(host, CLKSEL64);
|
clksel = mci_readl(host, CLKSEL64);
|
||||||
else
|
else
|
||||||
@@ -454,6 +487,8 @@ static inline u8 dw_mci_exynos_move_next_clksmpl(struct dw_mci *host)
|
|||||||
|
|
||||||
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870 ||
|
||||||
|
priv->ctrl_type == DW_MCI_TYPE_EXYNOS7870_SMU ||
|
||||||
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)
|
||||||
mci_writel(host, CLKSEL64, clksel);
|
mci_writel(host, CLKSEL64, clksel);
|
||||||
else
|
else
|
||||||
@@ -633,6 +668,10 @@ static const struct of_device_id dw_mci_exynos_match[] = {
|
|||||||
.data = &exynos_drv_data, },
|
.data = &exynos_drv_data, },
|
||||||
{ .compatible = "samsung,exynos7-dw-mshc-smu",
|
{ .compatible = "samsung,exynos7-dw-mshc-smu",
|
||||||
.data = &exynos_drv_data, },
|
.data = &exynos_drv_data, },
|
||||||
|
{ .compatible = "samsung,exynos7870-dw-mshc",
|
||||||
|
.data = &exynos_drv_data, },
|
||||||
|
{ .compatible = "samsung,exynos7870-dw-mshc-smu",
|
||||||
|
.data = &exynos_drv_data, },
|
||||||
{ .compatible = "axis,artpec8-dw-mshc",
|
{ .compatible = "axis,artpec8-dw-mshc",
|
||||||
.data = &artpec_drv_data, },
|
.data = &artpec_drv_data, },
|
||||||
{},
|
{},
|
||||||
|
|||||||
Reference in New Issue
Block a user