]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mmc: sdhci-of-dwcmshc: add dwcmshc_pltfm_data
authorChen Wang <unicorn_wang@outlook.com>
Mon, 5 Aug 2024 09:18:43 +0000 (17:18 +0800)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 26 Aug 2024 11:01:50 +0000 (13:01 +0200)
Abstract dwcmshc_pltfm_data to hold the sdhci_pltfm_data
plus some comoon operations of soc such as init/postinit.

Signed-off-by: Chen 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: Adrian Hunter <adrian.hunter@intel.com>
Link: https://lore.kernel.org/r/cb2c68c594286e9588c53acb76163e60c140c02b.1722847198.git.unicorn_wang@outlook.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci-of-dwcmshc.c

index 55fba5ef37ba1ec96a32f0012839736113185806..16f420994519e5ca0438342d7bb65960eb4dff8f 100644 (file)
@@ -218,6 +218,12 @@ struct dwcmshc_priv {
        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,
                                         struct dwcmshc_priv *priv,
                                         int num_clks,
@@ -1048,39 +1054,52 @@ static const struct sdhci_ops sdhci_dwcmshc_cv18xx_ops = {
        .platform_execute_tuning = cv18xx_sdhci_execute_tuning,
 };
 
-static const struct sdhci_pltfm_data sdhci_dwcmshc_pdata = {
-       .ops = &sdhci_dwcmshc_ops,
-       .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
-       .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
+static const struct dwcmshc_pltfm_data sdhci_dwcmshc_pdata = {
+       .pdata = {
+               .ops = &sdhci_dwcmshc_ops,
+               .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
+               .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
+       },
 };
 
 #ifdef CONFIG_ACPI
-static const struct sdhci_pltfm_data sdhci_dwcmshc_bf3_pdata = {
-       .ops = &sdhci_dwcmshc_ops,
-       .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
-       .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
-                  SDHCI_QUIRK2_ACMD23_BROKEN,
+static const struct dwcmshc_pltfm_data sdhci_dwcmshc_bf3_pdata = {
+       .pdata = {
+               .ops = &sdhci_dwcmshc_ops,
+               .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
+               .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
+                          SDHCI_QUIRK2_ACMD23_BROKEN,
+       },
 };
 #endif
 
-static const struct sdhci_pltfm_data sdhci_dwcmshc_rk35xx_pdata = {
-       .ops = &sdhci_dwcmshc_rk35xx_ops,
-       .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN |
-                 SDHCI_QUIRK_BROKEN_TIMEOUT_VAL,
-       .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
-                  SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN,
+static const struct dwcmshc_pltfm_data sdhci_dwcmshc_rk35xx_pdata = {
+       .pdata = {
+               .ops = &sdhci_dwcmshc_rk35xx_ops,
+               .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN |
+                         SDHCI_QUIRK_BROKEN_TIMEOUT_VAL,
+               .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 = {
-       .ops = &sdhci_dwcmshc_th1520_ops,
-       .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
-       .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
+static const struct dwcmshc_pltfm_data sdhci_dwcmshc_th1520_pdata = {
+       .pdata = {
+               .ops = &sdhci_dwcmshc_th1520_ops,
+               .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 = {
-       .ops = &sdhci_dwcmshc_cv18xx_ops,
-       .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
-       .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
+static const struct dwcmshc_pltfm_data sdhci_dwcmshc_cv18xx_pdata = {
+       .pdata = {
+               .ops = &sdhci_dwcmshc_cv18xx_ops,
+               .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
+               .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
+       },
 };
 
 static const struct cqhci_host_ops dwcmshc_cqhci_ops = {
@@ -1196,7 +1215,7 @@ static int dwcmshc_probe(struct platform_device *pdev)
        struct sdhci_pltfm_host *pltfm_host;
        struct sdhci_host *host;
        struct dwcmshc_priv *priv;
-       const struct sdhci_pltfm_data *pltfm_data;
+       const struct dwcmshc_pltfm_data *pltfm_data;
        int err;
        u32 extra, caps;
 
@@ -1206,7 +1225,7 @@ static int dwcmshc_probe(struct platform_device *pdev)
                return -ENODEV;
        }
 
-       host = sdhci_pltfm_init(pdev, pltfm_data,
+       host = sdhci_pltfm_init(pdev, &pltfm_data->pdata,
                                sizeof(struct dwcmshc_priv));
        if (IS_ERR(host))
                return PTR_ERR(host);
@@ -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.execute_tuning = dwcmshc_execute_tuning;
 
-       if (pltfm_data == &sdhci_dwcmshc_rk35xx_pdata) {
-               err = dwcmshc_rk35xx_init(dev, host, priv);
+       if (pltfm_data->init) {
+               err = pltfm_data->init(&pdev->dev, host, priv);
                if (err)
                        goto err_clk;
        }
 
-       if (pltfm_data == &sdhci_dwcmshc_th1520_pdata) {
-               th1520_init(dev, host, priv);
-       }
-
 #ifdef CONFIG_ACPI
        if (pltfm_data == &sdhci_dwcmshc_bf3_pdata)
                sdhci_enable_v4_mode(host);
@@ -1288,8 +1303,8 @@ static int dwcmshc_probe(struct platform_device *pdev)
                dwcmshc_cqhci_init(host, pdev);
        }
 
-       if (pltfm_data == &sdhci_dwcmshc_rk35xx_pdata)
-               dwcmshc_rk35xx_postinit(host, priv);
+       if (pltfm_data->postinit)
+               pltfm_data->postinit(host, priv);
 
        err = __sdhci_add_host(host);
        if (err)