This pacth enables acpi support in esdhc driver Signed-off-by: Udit Kumar <udit.kumar@xxxxxxx> --- drivers/mmc/host/sdhci-of-esdhc.c | 55 +++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c index e20c00f..11d9f48 100644 --- a/drivers/mmc/host/sdhci-of-esdhc.c +++ b/drivers/mmc/host/sdhci-of-esdhc.c @@ -3,6 +3,7 @@ * * Copyright (c) 2007, 2010, 2012 Freescale Semiconductor, Inc. * Copyright (c) 2009 MontaVista Software, Inc. + * Copyright 2019 NXP * * Authors: Xiaobo Xie <X.Xie@xxxxxxxxxxxxx> * Anton Vorontsov <avorontsov@xxxxxxxxxxxxx> @@ -13,6 +14,7 @@ * your option) any later version. */ +#include <linux/acpi.h> #include <linux/err.h> #include <linux/io.h> #include <linux/of.h> @@ -75,6 +77,12 @@ struct esdhc_clk_fixup { }; MODULE_DEVICE_TABLE(of, sdhci_esdhc_of_match); +static const struct acpi_device_id sdhci_esdhc_ids[] = { + {"NXP0003" }, + { /* sentinel */ }, +}; +MODULE_DEVICE_TABLE(acpi, sdhci_esdhc_ids); + struct sdhci_esdhc { u8 vendor_ver; u8 spec_ver; @@ -1038,22 +1046,28 @@ static void esdhc_init(struct platform_device *pdev, struct sdhci_host *host) match = of_match_node(sdhci_esdhc_of_match, pdev->dev.of_node); if (match) esdhc->clk_fixup = match->data; - np = pdev->dev.of_node; - clk = of_clk_get(np, 0); - if (!IS_ERR(clk)) { - /* - * esdhc->peripheral_clock would be assigned with a value - * which is eSDHC base clock when use periperal clock. - * For ls1046a, the clock value got by common clk API is - * peripheral clock while the eSDHC base clock is 1/2 - * peripheral clock. - */ - if (of_device_is_compatible(np, "fsl,ls1046a-esdhc")) - esdhc->peripheral_clock = clk_get_rate(clk) / 2; - else - esdhc->peripheral_clock = clk_get_rate(clk); - clk_put(clk); + np = pdev->dev.of_node; + // in case of device tree, get clock frame work + if (np) { + clk = of_clk_get(np, 0); + if (!IS_ERR(clk)) { + /* + * esdhc->peripheral_clock would be assigned a value + * which is eSDHC base clock when use periperal clock. + * For ls1046a, the clock value got by common clk API is + * peripheral clock while the eSDHC base clock is 1/2 + * peripheral clock. + */ + if (of_device_is_compatible(np, "fsl,ls1046a-esdhc")) + esdhc->peripheral_clock = clk_get_rate(clk) / 2; + else + esdhc->peripheral_clock = clk_get_rate(clk); + clk_put(clk); + } + } else { + device_property_read_u32(&pdev->dev, "clock-frequency", + &esdhc->peripheral_clock); } if (esdhc->peripheral_clock) { @@ -1062,7 +1076,8 @@ static void esdhc_init(struct platform_device *pdev, struct sdhci_host *host) val |= ESDHC_PERIPHERAL_CLK_SEL; sdhci_writel(host, val, ESDHC_DMA_SYSCTL); esdhc_clock_enable(host, true); - } + } else + WARN_ON(1); } static int esdhc_hs400_prepare_ddr(struct mmc_host *mmc) @@ -1081,9 +1096,10 @@ static int sdhci_esdhc_probe(struct platform_device *pdev) np = pdev->dev.of_node; - if (of_property_read_bool(np, "little-endian")) + if (device_property_read_bool(&pdev->dev, "little-endian")) { host = sdhci_pltfm_init(pdev, &sdhci_esdhc_le_pdata, sizeof(struct sdhci_esdhc)); + } else host = sdhci_pltfm_init(pdev, &sdhci_esdhc_be_pdata, sizeof(struct sdhci_esdhc)); @@ -1143,8 +1159,8 @@ static int sdhci_esdhc_probe(struct platform_device *pdev) ret = mmc_of_parse(host->mmc); if (ret) goto err; - - mmc_of_parse_voltage(np, &host->ocr_mask); + if (np) + mmc_of_parse_voltage(np, &host->ocr_mask); ret = sdhci_add_host(host); if (ret) @@ -1160,6 +1176,7 @@ static int sdhci_esdhc_probe(struct platform_device *pdev) .driver = { .name = "sdhci-esdhc", .of_match_table = sdhci_esdhc_of_match, + .acpi_match_table = sdhci_esdhc_ids, .pm = &esdhc_of_dev_pm_ops, }, .probe = sdhci_esdhc_probe, -- 1.9.1