Commit a2e34ac1 authored by Chen Wang's avatar Chen Wang Committed by Ulf Hansson

mmc: sdhci-of-dwcmshc: add dwcmshc_pltfm_data

Abstract dwcmshc_pltfm_data to hold the sdhci_pltfm_data
plus some comoon operations of soc such as init/postinit.
Signed-off-by: default avatarChen Wang <unicorn_wang@outlook.com>
Tested-by: Drew Fustini <drew@pdp7.com> # TH1520
Tested-by: Inochi Amaoto <inochiama@outlook.com> # Duo and Huashan Pi
Acked-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Link: https://lore.kernel.org/r/cb2c68c594286e9588c53acb76163e60c140c02b.1722847198.git.unicorn_wang@outlook.comSigned-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 9676a7ef
...@@ -218,6 +218,12 @@ struct dwcmshc_priv { ...@@ -218,6 +218,12 @@ struct dwcmshc_priv {
u16 flags; u16 flags;
}; };
struct dwcmshc_pltfm_data {
const struct sdhci_pltfm_data pdata;
int (*init)(struct device *dev, struct sdhci_host *host, struct dwcmshc_priv *dwc_priv);
void (*postinit)(struct sdhci_host *host, struct dwcmshc_priv *dwc_priv);
};
static int dwcmshc_get_enable_other_clks(struct device *dev, static int dwcmshc_get_enable_other_clks(struct device *dev,
struct dwcmshc_priv *priv, struct dwcmshc_priv *priv,
int num_clks, int num_clks,
...@@ -1048,39 +1054,52 @@ static const struct sdhci_ops sdhci_dwcmshc_cv18xx_ops = { ...@@ -1048,39 +1054,52 @@ static const struct sdhci_ops sdhci_dwcmshc_cv18xx_ops = {
.platform_execute_tuning = cv18xx_sdhci_execute_tuning, .platform_execute_tuning = cv18xx_sdhci_execute_tuning,
}; };
static const struct sdhci_pltfm_data sdhci_dwcmshc_pdata = { static const struct dwcmshc_pltfm_data sdhci_dwcmshc_pdata = {
.ops = &sdhci_dwcmshc_ops, .pdata = {
.quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN, .ops = &sdhci_dwcmshc_ops,
.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN, .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
},
}; };
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
static const struct sdhci_pltfm_data sdhci_dwcmshc_bf3_pdata = { static const struct dwcmshc_pltfm_data sdhci_dwcmshc_bf3_pdata = {
.ops = &sdhci_dwcmshc_ops, .pdata = {
.quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN, .ops = &sdhci_dwcmshc_ops,
.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN | .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
SDHCI_QUIRK2_ACMD23_BROKEN, .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
SDHCI_QUIRK2_ACMD23_BROKEN,
},
}; };
#endif #endif
static const struct sdhci_pltfm_data sdhci_dwcmshc_rk35xx_pdata = { static const struct dwcmshc_pltfm_data sdhci_dwcmshc_rk35xx_pdata = {
.ops = &sdhci_dwcmshc_rk35xx_ops, .pdata = {
.quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN | .ops = &sdhci_dwcmshc_rk35xx_ops,
SDHCI_QUIRK_BROKEN_TIMEOUT_VAL, .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN |
.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN | SDHCI_QUIRK_BROKEN_TIMEOUT_VAL,
SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN, .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN,
},
.init = dwcmshc_rk35xx_init,
.postinit = dwcmshc_rk35xx_postinit,
}; };
static const struct sdhci_pltfm_data sdhci_dwcmshc_th1520_pdata = { static const struct dwcmshc_pltfm_data sdhci_dwcmshc_th1520_pdata = {
.ops = &sdhci_dwcmshc_th1520_ops, .pdata = {
.quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN, .ops = &sdhci_dwcmshc_th1520_ops,
.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN, .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
},
.init = th1520_init,
}; };
static const struct sdhci_pltfm_data sdhci_dwcmshc_cv18xx_pdata = { static const struct dwcmshc_pltfm_data sdhci_dwcmshc_cv18xx_pdata = {
.ops = &sdhci_dwcmshc_cv18xx_ops, .pdata = {
.quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN, .ops = &sdhci_dwcmshc_cv18xx_ops,
.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN, .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
},
}; };
static const struct cqhci_host_ops dwcmshc_cqhci_ops = { static const struct cqhci_host_ops dwcmshc_cqhci_ops = {
...@@ -1196,7 +1215,7 @@ static int dwcmshc_probe(struct platform_device *pdev) ...@@ -1196,7 +1215,7 @@ static int dwcmshc_probe(struct platform_device *pdev)
struct sdhci_pltfm_host *pltfm_host; struct sdhci_pltfm_host *pltfm_host;
struct sdhci_host *host; struct sdhci_host *host;
struct dwcmshc_priv *priv; struct dwcmshc_priv *priv;
const struct sdhci_pltfm_data *pltfm_data; const struct dwcmshc_pltfm_data *pltfm_data;
int err; int err;
u32 extra, caps; u32 extra, caps;
...@@ -1206,7 +1225,7 @@ static int dwcmshc_probe(struct platform_device *pdev) ...@@ -1206,7 +1225,7 @@ static int dwcmshc_probe(struct platform_device *pdev)
return -ENODEV; return -ENODEV;
} }
host = sdhci_pltfm_init(pdev, pltfm_data, host = sdhci_pltfm_init(pdev, &pltfm_data->pdata,
sizeof(struct dwcmshc_priv)); sizeof(struct dwcmshc_priv));
if (IS_ERR(host)) if (IS_ERR(host))
return PTR_ERR(host); return PTR_ERR(host);
...@@ -1251,16 +1270,12 @@ static int dwcmshc_probe(struct platform_device *pdev) ...@@ -1251,16 +1270,12 @@ static int dwcmshc_probe(struct platform_device *pdev)
host->mmc_host_ops.hs400_enhanced_strobe = dwcmshc_hs400_enhanced_strobe; host->mmc_host_ops.hs400_enhanced_strobe = dwcmshc_hs400_enhanced_strobe;
host->mmc_host_ops.execute_tuning = dwcmshc_execute_tuning; host->mmc_host_ops.execute_tuning = dwcmshc_execute_tuning;
if (pltfm_data == &sdhci_dwcmshc_rk35xx_pdata) { if (pltfm_data->init) {
err = dwcmshc_rk35xx_init(dev, host, priv); err = pltfm_data->init(&pdev->dev, host, priv);
if (err) if (err)
goto err_clk; goto err_clk;
} }
if (pltfm_data == &sdhci_dwcmshc_th1520_pdata) {
th1520_init(dev, host, priv);
}
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
if (pltfm_data == &sdhci_dwcmshc_bf3_pdata) if (pltfm_data == &sdhci_dwcmshc_bf3_pdata)
sdhci_enable_v4_mode(host); sdhci_enable_v4_mode(host);
...@@ -1288,8 +1303,8 @@ static int dwcmshc_probe(struct platform_device *pdev) ...@@ -1288,8 +1303,8 @@ static int dwcmshc_probe(struct platform_device *pdev)
dwcmshc_cqhci_init(host, pdev); dwcmshc_cqhci_init(host, pdev);
} }
if (pltfm_data == &sdhci_dwcmshc_rk35xx_pdata) if (pltfm_data->postinit)
dwcmshc_rk35xx_postinit(host, priv); pltfm_data->postinit(host, priv);
err = __sdhci_add_host(host); err = __sdhci_add_host(host);
if (err) if (err)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment