diff options
Diffstat (limited to 'arm64-mmc-sdhci_f_sdh30-add-ACPI-support.patch')
-rw-r--r-- | arm64-mmc-sdhci_f_sdh30-add-ACPI-support.patch | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/arm64-mmc-sdhci_f_sdh30-add-ACPI-support.patch b/arm64-mmc-sdhci_f_sdh30-add-ACPI-support.patch new file mode 100644 index 000000000..4eaf67e33 --- /dev/null +++ b/arm64-mmc-sdhci_f_sdh30-add-ACPI-support.patch @@ -0,0 +1,146 @@ +From patchwork Mon Jan 8 15:44:19 2018 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: [v2] mmc: sdhci_f_sdh30: add ACPI support +From: Ard Biesheuvel <ard.biesheuvel@linaro.org> +X-Patchwork-Id: 10149775 +Message-Id: <20180108154419.2821-1-ard.biesheuvel@linaro.org> +To: linux-mmc@vger.kernel.org +Cc: adrian.hunter@intel.com, ulf.hansson@linaro.org, + Ard Biesheuvel <ard.biesheuvel@linaro.org> +Date: Mon, 8 Jan 2018 15:44:19 +0000 + +The Fujitsu SDH30 SDHCI controller may be described as a SCX0002 ACPI +device on ACPI platforms incorporating the Socionext SynQuacer SoC. + +Given that mmc_of_parse() has already been made ACPI/DT agnostic, +making the SDH30 driver ACPI capable is actually rather simple: +all we need to do is make the call to sdhci_get_of_property() [which +does not set any properties we care about] and the clock handling +dependent on whether we are dealing with a DT device, and exposing +the ACPI id via the platform_driver struct and the module metadata. + +Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> +Acked-by: Adrian Hunter <adrian.hunter@intel.com> +--- +v2: make OF optional now that ACPI is supported + drop dev_of_node() check when disabling the clocks - those routines + tolerate NULL pointers so there's no need + + drivers/mmc/host/Kconfig | 2 +- + drivers/mmc/host/sdhci_f_sdh30.c | 52 +++++++++++++------- + 2 files changed, 35 insertions(+), 19 deletions(-) + +diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig +index 567028c9219a..07ed947ed10b 100644 +--- a/drivers/mmc/host/Kconfig ++++ b/drivers/mmc/host/Kconfig +@@ -320,7 +320,7 @@ config MMC_SDHCI_BCM_KONA + config MMC_SDHCI_F_SDH30 + tristate "SDHCI support for Fujitsu Semiconductor F_SDH30" + depends on MMC_SDHCI_PLTFM +- depends on OF ++ depends on OF || ACPI + help + This selects the Secure Digital Host Controller Interface (SDHCI) + Needed by some Fujitsu SoC for MMC / SD / SDIO support. +diff --git a/drivers/mmc/host/sdhci_f_sdh30.c b/drivers/mmc/host/sdhci_f_sdh30.c +index 04ca0d33a521..485f7591fae4 100644 +--- a/drivers/mmc/host/sdhci_f_sdh30.c ++++ b/drivers/mmc/host/sdhci_f_sdh30.c +@@ -10,9 +10,11 @@ + * the Free Software Foundation, version 2 of the License. + */ + ++#include <linux/acpi.h> + #include <linux/err.h> + #include <linux/delay.h> + #include <linux/module.h> ++#include <linux/of.h> + #include <linux/property.h> + #include <linux/clk.h> + +@@ -146,7 +148,6 @@ static int sdhci_f_sdh30_probe(struct platform_device *pdev) + + platform_set_drvdata(pdev, host); + +- sdhci_get_of_property(pdev); + host->hw_name = "f_sdh30"; + host->ops = &sdhci_f_sdh30_ops; + host->irq = irq; +@@ -158,25 +159,29 @@ static int sdhci_f_sdh30_probe(struct platform_device *pdev) + goto err; + } + +- priv->clk_iface = devm_clk_get(&pdev->dev, "iface"); +- if (IS_ERR(priv->clk_iface)) { +- ret = PTR_ERR(priv->clk_iface); +- goto err; +- } ++ if (dev_of_node(dev)) { ++ sdhci_get_of_property(pdev); + +- ret = clk_prepare_enable(priv->clk_iface); +- if (ret) +- goto err; ++ priv->clk_iface = devm_clk_get(&pdev->dev, "iface"); ++ if (IS_ERR(priv->clk_iface)) { ++ ret = PTR_ERR(priv->clk_iface); ++ goto err; ++ } + +- priv->clk = devm_clk_get(&pdev->dev, "core"); +- if (IS_ERR(priv->clk)) { +- ret = PTR_ERR(priv->clk); +- goto err_clk; +- } ++ ret = clk_prepare_enable(priv->clk_iface); ++ if (ret) ++ goto err; + +- ret = clk_prepare_enable(priv->clk); +- if (ret) +- goto err_clk; ++ priv->clk = devm_clk_get(&pdev->dev, "core"); ++ if (IS_ERR(priv->clk)) { ++ ret = PTR_ERR(priv->clk); ++ goto err_clk; ++ } ++ ++ ret = clk_prepare_enable(priv->clk); ++ if (ret) ++ goto err_clk; ++ } + + /* init vendor specific regs */ + ctrl = sdhci_readw(host, F_SDH30_AHB_CONFIG); +@@ -226,16 +231,27 @@ static int sdhci_f_sdh30_remove(struct platform_device *pdev) + return 0; + } + ++#ifdef CONFIG_OF + static const struct of_device_id f_sdh30_dt_ids[] = { + { .compatible = "fujitsu,mb86s70-sdhci-3.0" }, + { /* sentinel */ } + }; + MODULE_DEVICE_TABLE(of, f_sdh30_dt_ids); ++#endif ++ ++#ifdef CONFIG_ACPI ++static const struct acpi_device_id f_sdh30_acpi_ids[] = { ++ { "SCX0002" }, ++ { /* sentinel */ } ++}; ++MODULE_DEVICE_TABLE(acpi, f_sdh30_acpi_ids); ++#endif + + static struct platform_driver sdhci_f_sdh30_driver = { + .driver = { + .name = "f_sdh30", +- .of_match_table = f_sdh30_dt_ids, ++ .of_match_table = of_match_ptr(f_sdh30_dt_ids), ++ .acpi_match_table = ACPI_PTR(f_sdh30_acpi_ids), + .pm = &sdhci_pltfm_pmops, + }, + .probe = sdhci_f_sdh30_probe, |