This patch series adds
- Feature to get generic device properties in the
place of DT properties.
- ACPI support to IPROC SDHCI varients
This patch series is based off v4.18-rc3
Changes from v3:
- Replaced separate device tree and ACPI get match data APIs
with single device_get_match_data API.
Changes from v2:
- Added patch "Convert DT properties to generic device properties"
given by Adrian Hunter to this patch series because
"Add ACPI support to IPROC SDHCI" patch is depends on this.
Changes from v1:
- Removed sdhci_iproc_data array change and add directly
into of and acpi id tables.
- Add a change to get match data directly.
- Removed clock-frequency property read change.
- Used sdhci_get_property to get properties.
- Verified with patch given by Adrian Hunter
mmc: sdhci-pltfm: Convert DT properties to generic device properties
Adrian Hunter (1):
mmc: sdhci-pltfm: Convert DT properties to generic device properties
Srinath Mannam (1):
mmc: host: iproc: Add ACPI support to IPROC SDHCI
drivers/mmc/host/Kconfig | 1 +
drivers/mmc/host/sdhci-iproc.c | 59 ++++++++++++++++++++++++------------
drivers/mmc/host/sdhci-pltfm.c | 68 +++++++++++++++++++++++++-----------------
drivers/mmc/host/sdhci-pltfm.h | 7 ++++-
4 files changed, 87 insertions(+), 48 deletions(-)
--
2.7.4
From: Adrian Hunter <[email protected]>
Convert DT properties to generic device properties
so that drivers can get properties from DT or ACPI.
Signed-off-by: Adrian Hunter <[email protected]>
Tested-by: Srinath Mannam <[email protected]>
---
drivers/mmc/host/sdhci-pltfm.c | 68 +++++++++++++++++++++++++-----------------
drivers/mmc/host/sdhci-pltfm.h | 7 ++++-
2 files changed, 46 insertions(+), 29 deletions(-)
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c
index 02bea61..b231c9a 100644
--- a/drivers/mmc/host/sdhci-pltfm.c
+++ b/drivers/mmc/host/sdhci-pltfm.c
@@ -30,6 +30,7 @@
#include <linux/err.h>
#include <linux/module.h>
+#include <linux/property.h>
#include <linux/of.h>
#ifdef CONFIG_PPC
#include <asm/machdep.h>
@@ -51,11 +52,10 @@ static const struct sdhci_ops sdhci_pltfm_ops = {
.set_uhs_signaling = sdhci_set_uhs_signaling,
};
-#ifdef CONFIG_OF
-static bool sdhci_of_wp_inverted(struct device_node *np)
+static bool sdhci_wp_inverted(struct device *dev)
{
- if (of_get_property(np, "sdhci,wp-inverted", NULL) ||
- of_get_property(np, "wp-inverted", NULL))
+ if (device_property_present(dev, "sdhci,wp-inverted") ||
+ device_property_present(dev, "wp-inverted"))
return true;
/* Old device trees don't have the wp-inverted property. */
@@ -66,52 +66,64 @@ static bool sdhci_of_wp_inverted(struct device_node *np)
#endif /* CONFIG_PPC */
}
-void sdhci_get_of_property(struct platform_device *pdev)
+#ifdef CONFIG_OF
+static void sdhci_get_compatibility(struct platform_device *pdev)
{
+ struct sdhci_host *host = platform_get_drvdata(pdev);
struct device_node *np = pdev->dev.of_node;
+
+ if (!np)
+ return;
+
+ if (of_device_is_compatible(np, "fsl,p2020-rev1-esdhc"))
+ host->quirks |= SDHCI_QUIRK_BROKEN_DMA;
+
+ if (of_device_is_compatible(np, "fsl,p2020-esdhc") ||
+ of_device_is_compatible(np, "fsl,p1010-esdhc") ||
+ of_device_is_compatible(np, "fsl,t4240-esdhc") ||
+ of_device_is_compatible(np, "fsl,mpc8536-esdhc"))
+ host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
+}
+#else
+void sdhci_get_compatibility(struct platform_device *pdev) {}
+#endif /* CONFIG_OF */
+
+void sdhci_get_property(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
struct sdhci_host *host = platform_get_drvdata(pdev);
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
u32 bus_width;
- if (of_get_property(np, "sdhci,auto-cmd12", NULL))
+ if (device_property_present(dev, "sdhci,auto-cmd12"))
host->quirks |= SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12;
- if (of_get_property(np, "sdhci,1-bit-only", NULL) ||
- (of_property_read_u32(np, "bus-width", &bus_width) == 0 &&
+ if (device_property_present(dev, "sdhci,1-bit-only") ||
+ (device_property_read_u32(dev, "bus-width", &bus_width) == 0 &&
bus_width == 1))
host->quirks |= SDHCI_QUIRK_FORCE_1_BIT_DATA;
- if (sdhci_of_wp_inverted(np))
+ if (sdhci_wp_inverted(dev))
host->quirks |= SDHCI_QUIRK_INVERTED_WRITE_PROTECT;
- if (of_get_property(np, "broken-cd", NULL))
+ if (device_property_present(dev, "broken-cd"))
host->quirks |= SDHCI_QUIRK_BROKEN_CARD_DETECTION;
- if (of_get_property(np, "no-1-8-v", NULL))
+ if (device_property_present(dev, "no-1-8-v"))
host->quirks2 |= SDHCI_QUIRK2_NO_1_8_V;
- if (of_device_is_compatible(np, "fsl,p2020-rev1-esdhc"))
- host->quirks |= SDHCI_QUIRK_BROKEN_DMA;
-
- if (of_device_is_compatible(np, "fsl,p2020-esdhc") ||
- of_device_is_compatible(np, "fsl,p1010-esdhc") ||
- of_device_is_compatible(np, "fsl,t4240-esdhc") ||
- of_device_is_compatible(np, "fsl,mpc8536-esdhc"))
- host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
+ sdhci_get_compatibility(pdev);
- of_property_read_u32(np, "clock-frequency", &pltfm_host->clock);
+ device_property_read_u32(dev, "clock-frequency", &pltfm_host->clock);
- if (of_find_property(np, "keep-power-in-suspend", NULL))
+ if (device_property_present(dev, "keep-power-in-suspend"))
host->mmc->pm_caps |= MMC_PM_KEEP_POWER;
- if (of_property_read_bool(np, "wakeup-source") ||
- of_property_read_bool(np, "enable-sdio-wakeup")) /* legacy */
+ if (device_property_read_bool(dev, "wakeup-source") ||
+ device_property_read_bool(dev, "enable-sdio-wakeup")) /* legacy */
host->mmc->pm_caps |= MMC_PM_WAKE_SDIO_IRQ;
}
-#else
-void sdhci_get_of_property(struct platform_device *pdev) {}
-#endif /* CONFIG_OF */
-EXPORT_SYMBOL_GPL(sdhci_get_of_property);
+EXPORT_SYMBOL_GPL(sdhci_get_property);
struct sdhci_host *sdhci_pltfm_init(struct platform_device *pdev,
const struct sdhci_pltfm_data *pdata,
@@ -184,7 +196,7 @@ int sdhci_pltfm_register(struct platform_device *pdev,
if (IS_ERR(host))
return PTR_ERR(host);
- sdhci_get_of_property(pdev);
+ sdhci_get_property(pdev);
ret = sdhci_add_host(host);
if (ret)
diff --git a/drivers/mmc/host/sdhci-pltfm.h b/drivers/mmc/host/sdhci-pltfm.h
index 1e91fb1..6109987 100644
--- a/drivers/mmc/host/sdhci-pltfm.h
+++ b/drivers/mmc/host/sdhci-pltfm.h
@@ -90,7 +90,12 @@ static inline void sdhci_be32bs_writeb(struct sdhci_host *host, u8 val, int reg)
}
#endif /* CONFIG_MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER */
-extern void sdhci_get_of_property(struct platform_device *pdev);
+void sdhci_get_property(struct platform_device *pdev);
+
+static inline void sdhci_get_of_property(struct platform_device *pdev)
+{
+ return sdhci_get_property(pdev);
+}
extern struct sdhci_host *sdhci_pltfm_init(struct platform_device *pdev,
const struct sdhci_pltfm_data *pdata,
--
2.7.4
Add ACPI support to all IPROC SDHCI varients
Signed-off-by: Srinath Mannam <[email protected]>
Reviewed-by: Ray Jui <[email protected]>
Reviewed-by: Scott Branden <[email protected]>
Reviewed-by: Vladimir Olovyannikov <[email protected]>
---
drivers/mmc/host/Kconfig | 1 +
drivers/mmc/host/sdhci-iproc.c | 59 ++++++++++++++++++++++++++++--------------
2 files changed, 41 insertions(+), 19 deletions(-)
diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index 0581c19..bc6702e 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -334,6 +334,7 @@ config MMC_SDHCI_IPROC
tristate "SDHCI support for the BCM2835 & iProc SD/MMC Controller"
depends on ARCH_BCM2835 || ARCH_BCM_IPROC || COMPILE_TEST
depends on MMC_SDHCI_PLTFM
+ depends on OF || ACPI
default ARCH_BCM_IPROC
select MMC_SDHCI_IO_ACCESSORS
help
diff --git a/drivers/mmc/host/sdhci-iproc.c b/drivers/mmc/host/sdhci-iproc.c
index d0e83db..0db9905 100644
--- a/drivers/mmc/host/sdhci-iproc.c
+++ b/drivers/mmc/host/sdhci-iproc.c
@@ -15,6 +15,7 @@
* iProc SDHCI platform driver
*/
+#include <linux/acpi.h>
#include <linux/delay.h>
#include <linux/module.h>
#include <linux/mmc/host.h>
@@ -162,9 +163,19 @@ static void sdhci_iproc_writeb(struct sdhci_host *host, u8 val, int reg)
sdhci_iproc_writel(host, newval, reg & ~3);
}
+static unsigned int sdhci_iproc_get_max_clock(struct sdhci_host *host)
+{
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+ if (pltfm_host->clk)
+ return sdhci_pltfm_clk_get_max_clock(host);
+ else
+ return pltfm_host->clock;
+}
+
static const struct sdhci_ops sdhci_iproc_ops = {
.set_clock = sdhci_set_clock,
- .get_max_clock = sdhci_pltfm_clk_get_max_clock,
+ .get_max_clock = sdhci_iproc_get_max_clock,
.set_bus_width = sdhci_set_bus_width,
.reset = sdhci_reset,
.set_uhs_signaling = sdhci_set_uhs_signaling,
@@ -178,7 +189,7 @@ static const struct sdhci_ops sdhci_iproc_32only_ops = {
.write_w = sdhci_iproc_writew,
.write_b = sdhci_iproc_writeb,
.set_clock = sdhci_set_clock,
- .get_max_clock = sdhci_pltfm_clk_get_max_clock,
+ .get_max_clock = sdhci_iproc_get_max_clock,
.set_bus_width = sdhci_set_bus_width,
.reset = sdhci_reset,
.set_uhs_signaling = sdhci_set_uhs_signaling,
@@ -256,19 +267,25 @@ static const struct of_device_id sdhci_iproc_of_match[] = {
};
MODULE_DEVICE_TABLE(of, sdhci_iproc_of_match);
+static const struct acpi_device_id sdhci_iproc_acpi_ids[] = {
+ { .id = "BRCM5871", .driver_data = (kernel_ulong_t)&iproc_cygnus_data },
+ { .id = "BRCM5872", .driver_data = (kernel_ulong_t)&iproc_data },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(acpi, sdhci_iproc_acpi_ids);
+
static int sdhci_iproc_probe(struct platform_device *pdev)
{
- const struct of_device_id *match;
- const struct sdhci_iproc_data *iproc_data;
+ struct device *dev = &pdev->dev;
+ const struct sdhci_iproc_data *iproc_data = NULL;
struct sdhci_host *host;
struct sdhci_iproc_host *iproc_host;
struct sdhci_pltfm_host *pltfm_host;
int ret;
- match = of_match_device(sdhci_iproc_of_match, &pdev->dev);
- if (!match)
- return -EINVAL;
- iproc_data = match->data;
+ iproc_data = device_get_match_data(dev);
+ if (!iproc_data)
+ return -ENODEV;
host = sdhci_pltfm_init(pdev, iproc_data->pdata, sizeof(*iproc_host));
if (IS_ERR(host))
@@ -280,19 +297,21 @@ static int sdhci_iproc_probe(struct platform_device *pdev)
iproc_host->data = iproc_data;
mmc_of_parse(host->mmc);
- sdhci_get_of_property(pdev);
+ sdhci_get_property(pdev);
host->mmc->caps |= iproc_host->data->mmc_caps;
- pltfm_host->clk = devm_clk_get(&pdev->dev, NULL);
- if (IS_ERR(pltfm_host->clk)) {
- ret = PTR_ERR(pltfm_host->clk);
- goto err;
- }
- ret = clk_prepare_enable(pltfm_host->clk);
- if (ret) {
- dev_err(&pdev->dev, "failed to enable host clk\n");
- goto err;
+ if (dev->of_node) {
+ pltfm_host->clk = devm_clk_get(dev, NULL);
+ if (IS_ERR(pltfm_host->clk)) {
+ ret = PTR_ERR(pltfm_host->clk);
+ goto err;
+ }
+ ret = clk_prepare_enable(pltfm_host->clk);
+ if (ret) {
+ dev_err(dev, "failed to enable host clk\n");
+ goto err;
+ }
}
if (iproc_host->data->pdata->quirks & SDHCI_QUIRK_MISSING_CAPS) {
@@ -307,7 +326,8 @@ static int sdhci_iproc_probe(struct platform_device *pdev)
return 0;
err_clk:
- clk_disable_unprepare(pltfm_host->clk);
+ if (dev->of_node)
+ clk_disable_unprepare(pltfm_host->clk);
err:
sdhci_pltfm_free(pdev);
return ret;
@@ -317,6 +337,7 @@ static struct platform_driver sdhci_iproc_driver = {
.driver = {
.name = "sdhci-iproc",
.of_match_table = sdhci_iproc_of_match,
+ .acpi_match_table = ACPI_PTR(sdhci_iproc_acpi_ids),
.pm = &sdhci_pltfm_pmops,
},
.probe = sdhci_iproc_probe,
--
2.7.4
Acked-by: Adrian Hunter <[email protected]>
> -----Original Message-----
> From: Srinath Mannam [mailto:[email protected]]
> Sent: Sunday, August 5, 2018 10:53 AM
> To: Ulf Hansson <[email protected]>; Hunter, Adrian
> <[email protected]>; Ray Jui <[email protected]>; Scott Branden
> <[email protected]>; [email protected]
> Cc: [email protected]; [email protected];
> [email protected]; Srinath Mannam
> <[email protected]>
> Subject: [PATCH v4 2/2] mmc: host: iproc: Add ACPI support to IPROC SDHCI
>
> Add ACPI support to all IPROC SDHCI varients
>
> Signed-off-by: Srinath Mannam <[email protected]>
> Reviewed-by: Ray Jui <[email protected]>
> Reviewed-by: Scott Branden <[email protected]>
> Reviewed-by: Vladimir Olovyannikov
> <[email protected]>
> ---
> drivers/mmc/host/Kconfig | 1 +
> drivers/mmc/host/sdhci-iproc.c | 59 ++++++++++++++++++++++++++++----
> ----------
> 2 files changed, 41 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig index
> 0581c19..bc6702e 100644
> --- a/drivers/mmc/host/Kconfig
> +++ b/drivers/mmc/host/Kconfig
> @@ -334,6 +334,7 @@ config MMC_SDHCI_IPROC
> tristate "SDHCI support for the BCM2835 & iProc SD/MMC Controller"
> depends on ARCH_BCM2835 || ARCH_BCM_IPROC ||
> COMPILE_TEST
> depends on MMC_SDHCI_PLTFM
> + depends on OF || ACPI
> default ARCH_BCM_IPROC
> select MMC_SDHCI_IO_ACCESSORS
> help
> diff --git a/drivers/mmc/host/sdhci-iproc.c b/drivers/mmc/host/sdhci-iproc.c
> index d0e83db..0db9905 100644
> --- a/drivers/mmc/host/sdhci-iproc.c
> +++ b/drivers/mmc/host/sdhci-iproc.c
> @@ -15,6 +15,7 @@
> * iProc SDHCI platform driver
> */
>
> +#include <linux/acpi.h>
> #include <linux/delay.h>
> #include <linux/module.h>
> #include <linux/mmc/host.h>
> @@ -162,9 +163,19 @@ static void sdhci_iproc_writeb(struct sdhci_host
> *host, u8 val, int reg)
> sdhci_iproc_writel(host, newval, reg & ~3); }
>
> +static unsigned int sdhci_iproc_get_max_clock(struct sdhci_host *host)
> +{
> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
> +
> + if (pltfm_host->clk)
> + return sdhci_pltfm_clk_get_max_clock(host);
> + else
> + return pltfm_host->clock;
> +}
> +
> static const struct sdhci_ops sdhci_iproc_ops = {
> .set_clock = sdhci_set_clock,
> - .get_max_clock = sdhci_pltfm_clk_get_max_clock,
> + .get_max_clock = sdhci_iproc_get_max_clock,
> .set_bus_width = sdhci_set_bus_width,
> .reset = sdhci_reset,
> .set_uhs_signaling = sdhci_set_uhs_signaling, @@ -178,7 +189,7 @@
> static const struct sdhci_ops sdhci_iproc_32only_ops = {
> .write_w = sdhci_iproc_writew,
> .write_b = sdhci_iproc_writeb,
> .set_clock = sdhci_set_clock,
> - .get_max_clock = sdhci_pltfm_clk_get_max_clock,
> + .get_max_clock = sdhci_iproc_get_max_clock,
> .set_bus_width = sdhci_set_bus_width,
> .reset = sdhci_reset,
> .set_uhs_signaling = sdhci_set_uhs_signaling, @@ -256,19 +267,25
> @@ static const struct of_device_id sdhci_iproc_of_match[] = { };
> MODULE_DEVICE_TABLE(of, sdhci_iproc_of_match);
>
> +static const struct acpi_device_id sdhci_iproc_acpi_ids[] = {
> + { .id = "BRCM5871", .driver_data =
> (kernel_ulong_t)&iproc_cygnus_data },
> + { .id = "BRCM5872", .driver_data = (kernel_ulong_t)&iproc_data },
> + { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(acpi, sdhci_iproc_acpi_ids);
> +
> static int sdhci_iproc_probe(struct platform_device *pdev) {
> - const struct of_device_id *match;
> - const struct sdhci_iproc_data *iproc_data;
> + struct device *dev = &pdev->dev;
> + const struct sdhci_iproc_data *iproc_data = NULL;
> struct sdhci_host *host;
> struct sdhci_iproc_host *iproc_host;
> struct sdhci_pltfm_host *pltfm_host;
> int ret;
>
> - match = of_match_device(sdhci_iproc_of_match, &pdev->dev);
> - if (!match)
> - return -EINVAL;
> - iproc_data = match->data;
> + iproc_data = device_get_match_data(dev);
> + if (!iproc_data)
> + return -ENODEV;
>
> host = sdhci_pltfm_init(pdev, iproc_data->pdata,
> sizeof(*iproc_host));
> if (IS_ERR(host))
> @@ -280,19 +297,21 @@ static int sdhci_iproc_probe(struct platform_device
> *pdev)
> iproc_host->data = iproc_data;
>
> mmc_of_parse(host->mmc);
> - sdhci_get_of_property(pdev);
> + sdhci_get_property(pdev);
>
> host->mmc->caps |= iproc_host->data->mmc_caps;
>
> - pltfm_host->clk = devm_clk_get(&pdev->dev, NULL);
> - if (IS_ERR(pltfm_host->clk)) {
> - ret = PTR_ERR(pltfm_host->clk);
> - goto err;
> - }
> - ret = clk_prepare_enable(pltfm_host->clk);
> - if (ret) {
> - dev_err(&pdev->dev, "failed to enable host clk\n");
> - goto err;
> + if (dev->of_node) {
> + pltfm_host->clk = devm_clk_get(dev, NULL);
> + if (IS_ERR(pltfm_host->clk)) {
> + ret = PTR_ERR(pltfm_host->clk);
> + goto err;
> + }
> + ret = clk_prepare_enable(pltfm_host->clk);
> + if (ret) {
> + dev_err(dev, "failed to enable host clk\n");
> + goto err;
> + }
> }
>
> if (iproc_host->data->pdata->quirks &
> SDHCI_QUIRK_MISSING_CAPS) { @@ -307,7 +326,8 @@ static int
> sdhci_iproc_probe(struct platform_device *pdev)
> return 0;
>
> err_clk:
> - clk_disable_unprepare(pltfm_host->clk);
> + if (dev->of_node)
> + clk_disable_unprepare(pltfm_host->clk);
> err:
> sdhci_pltfm_free(pdev);
> return ret;
> @@ -317,6 +337,7 @@ static struct platform_driver sdhci_iproc_driver = {
> .driver = {
> .name = "sdhci-iproc",
> .of_match_table = sdhci_iproc_of_match,
> + .acpi_match_table = ACPI_PTR(sdhci_iproc_acpi_ids),
> .pm = &sdhci_pltfm_pmops,
> },
> .probe = sdhci_iproc_probe,
> --
> 2.7.4
Hi Ulf Hansson,
Please kindly provide your inputs.
Regards,
Srinath.
On Mon, Aug 6, 2018 at 12:13 PM, Hunter, Adrian <[email protected]> wrote:
> Acked-by: Adrian Hunter <[email protected]>
>
>> -----Original Message-----
>> From: Srinath Mannam [mailto:[email protected]]
>> Sent: Sunday, August 5, 2018 10:53 AM
>> To: Ulf Hansson <[email protected]>; Hunter, Adrian
>> <[email protected]>; Ray Jui <[email protected]>; Scott Branden
>> <[email protected]>; [email protected]
>> Cc: [email protected]; [email protected];
>> [email protected]; Srinath Mannam
>> <[email protected]>
>> Subject: [PATCH v4 2/2] mmc: host: iproc: Add ACPI support to IPROC SDHCI
>>
>> Add ACPI support to all IPROC SDHCI varients
>>
>> Signed-off-by: Srinath Mannam <[email protected]>
>> Reviewed-by: Ray Jui <[email protected]>
>> Reviewed-by: Scott Branden <[email protected]>
>> Reviewed-by: Vladimir Olovyannikov
>> <[email protected]>
>> ---
>> drivers/mmc/host/Kconfig | 1 +
>> drivers/mmc/host/sdhci-iproc.c | 59 ++++++++++++++++++++++++++++----
>> ----------
>> 2 files changed, 41 insertions(+), 19 deletions(-)
>>
>> diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig index
>> 0581c19..bc6702e 100644
>> --- a/drivers/mmc/host/Kconfig
>> +++ b/drivers/mmc/host/Kconfig
>> @@ -334,6 +334,7 @@ config MMC_SDHCI_IPROC
>> tristate "SDHCI support for the BCM2835 & iProc SD/MMC Controller"
>> depends on ARCH_BCM2835 || ARCH_BCM_IPROC ||
>> COMPILE_TEST
>> depends on MMC_SDHCI_PLTFM
>> + depends on OF || ACPI
>> default ARCH_BCM_IPROC
>> select MMC_SDHCI_IO_ACCESSORS
>> help
>> diff --git a/drivers/mmc/host/sdhci-iproc.c b/drivers/mmc/host/sdhci-iproc.c
>> index d0e83db..0db9905 100644
>> --- a/drivers/mmc/host/sdhci-iproc.c
>> +++ b/drivers/mmc/host/sdhci-iproc.c
>> @@ -15,6 +15,7 @@
>> * iProc SDHCI platform driver
>> */
>>
>> +#include <linux/acpi.h>
>> #include <linux/delay.h>
>> #include <linux/module.h>
>> #include <linux/mmc/host.h>
>> @@ -162,9 +163,19 @@ static void sdhci_iproc_writeb(struct sdhci_host
>> *host, u8 val, int reg)
>> sdhci_iproc_writel(host, newval, reg & ~3); }
>>
>> +static unsigned int sdhci_iproc_get_max_clock(struct sdhci_host *host)
>> +{
>> + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
>> +
>> + if (pltfm_host->clk)
>> + return sdhci_pltfm_clk_get_max_clock(host);
>> + else
>> + return pltfm_host->clock;
>> +}
>> +
>> static const struct sdhci_ops sdhci_iproc_ops = {
>> .set_clock = sdhci_set_clock,
>> - .get_max_clock = sdhci_pltfm_clk_get_max_clock,
>> + .get_max_clock = sdhci_iproc_get_max_clock,
>> .set_bus_width = sdhci_set_bus_width,
>> .reset = sdhci_reset,
>> .set_uhs_signaling = sdhci_set_uhs_signaling, @@ -178,7 +189,7 @@
>> static const struct sdhci_ops sdhci_iproc_32only_ops = {
>> .write_w = sdhci_iproc_writew,
>> .write_b = sdhci_iproc_writeb,
>> .set_clock = sdhci_set_clock,
>> - .get_max_clock = sdhci_pltfm_clk_get_max_clock,
>> + .get_max_clock = sdhci_iproc_get_max_clock,
>> .set_bus_width = sdhci_set_bus_width,
>> .reset = sdhci_reset,
>> .set_uhs_signaling = sdhci_set_uhs_signaling, @@ -256,19 +267,25
>> @@ static const struct of_device_id sdhci_iproc_of_match[] = { };
>> MODULE_DEVICE_TABLE(of, sdhci_iproc_of_match);
>>
>> +static const struct acpi_device_id sdhci_iproc_acpi_ids[] = {
>> + { .id = "BRCM5871", .driver_data =
>> (kernel_ulong_t)&iproc_cygnus_data },
>> + { .id = "BRCM5872", .driver_data = (kernel_ulong_t)&iproc_data },
>> + { /* sentinel */ }
>> +};
>> +MODULE_DEVICE_TABLE(acpi, sdhci_iproc_acpi_ids);
>> +
>> static int sdhci_iproc_probe(struct platform_device *pdev) {
>> - const struct of_device_id *match;
>> - const struct sdhci_iproc_data *iproc_data;
>> + struct device *dev = &pdev->dev;
>> + const struct sdhci_iproc_data *iproc_data = NULL;
>> struct sdhci_host *host;
>> struct sdhci_iproc_host *iproc_host;
>> struct sdhci_pltfm_host *pltfm_host;
>> int ret;
>>
>> - match = of_match_device(sdhci_iproc_of_match, &pdev->dev);
>> - if (!match)
>> - return -EINVAL;
>> - iproc_data = match->data;
>> + iproc_data = device_get_match_data(dev);
>> + if (!iproc_data)
>> + return -ENODEV;
>>
>> host = sdhci_pltfm_init(pdev, iproc_data->pdata,
>> sizeof(*iproc_host));
>> if (IS_ERR(host))
>> @@ -280,19 +297,21 @@ static int sdhci_iproc_probe(struct platform_device
>> *pdev)
>> iproc_host->data = iproc_data;
>>
>> mmc_of_parse(host->mmc);
>> - sdhci_get_of_property(pdev);
>> + sdhci_get_property(pdev);
>>
>> host->mmc->caps |= iproc_host->data->mmc_caps;
>>
>> - pltfm_host->clk = devm_clk_get(&pdev->dev, NULL);
>> - if (IS_ERR(pltfm_host->clk)) {
>> - ret = PTR_ERR(pltfm_host->clk);
>> - goto err;
>> - }
>> - ret = clk_prepare_enable(pltfm_host->clk);
>> - if (ret) {
>> - dev_err(&pdev->dev, "failed to enable host clk\n");
>> - goto err;
>> + if (dev->of_node) {
>> + pltfm_host->clk = devm_clk_get(dev, NULL);
>> + if (IS_ERR(pltfm_host->clk)) {
>> + ret = PTR_ERR(pltfm_host->clk);
>> + goto err;
>> + }
>> + ret = clk_prepare_enable(pltfm_host->clk);
>> + if (ret) {
>> + dev_err(dev, "failed to enable host clk\n");
>> + goto err;
>> + }
>> }
>>
>> if (iproc_host->data->pdata->quirks &
>> SDHCI_QUIRK_MISSING_CAPS) { @@ -307,7 +326,8 @@ static int
>> sdhci_iproc_probe(struct platform_device *pdev)
>> return 0;
>>
>> err_clk:
>> - clk_disable_unprepare(pltfm_host->clk);
>> + if (dev->of_node)
>> + clk_disable_unprepare(pltfm_host->clk);
>> err:
>> sdhci_pltfm_free(pdev);
>> return ret;
>> @@ -317,6 +337,7 @@ static struct platform_driver sdhci_iproc_driver = {
>> .driver = {
>> .name = "sdhci-iproc",
>> .of_match_table = sdhci_iproc_of_match,
>> + .acpi_match_table = ACPI_PTR(sdhci_iproc_acpi_ids),
>> .pm = &sdhci_pltfm_pmops,
>> },
>> .probe = sdhci_iproc_probe,
>> --
>> 2.7.4
>
On 5 August 2018 at 09:52, Srinath Mannam <[email protected]> wrote:
> This patch series adds
> - Feature to get generic device properties in the
> place of DT properties.
> - ACPI support to IPROC SDHCI varients
>
> This patch series is based off v4.18-rc3
>
> Changes from v3:
> - Replaced separate device tree and ACPI get match data APIs
> with single device_get_match_data API.
>
> Changes from v2:
> - Added patch "Convert DT properties to generic device properties"
> given by Adrian Hunter to this patch series because
> "Add ACPI support to IPROC SDHCI" patch is depends on this.
>
> Changes from v1:
> - Removed sdhci_iproc_data array change and add directly
> into of and acpi id tables.
> - Add a change to get match data directly.
> - Removed clock-frequency property read change.
> - Used sdhci_get_property to get properties.
> - Verified with patch given by Adrian Hunter
> mmc: sdhci-pltfm: Convert DT properties to generic device properties
>
> Adrian Hunter (1):
> mmc: sdhci-pltfm: Convert DT properties to generic device properties
>
> Srinath Mannam (1):
> mmc: host: iproc: Add ACPI support to IPROC SDHCI
>
> drivers/mmc/host/Kconfig | 1 +
> drivers/mmc/host/sdhci-iproc.c | 59 ++++++++++++++++++++++++------------
> drivers/mmc/host/sdhci-pltfm.c | 68 +++++++++++++++++++++++++-----------------
> drivers/mmc/host/sdhci-pltfm.h | 7 ++++-
> 4 files changed, 87 insertions(+), 48 deletions(-)
>
> --
> 2.7.4
>
Thanks, queued for v4.20!
Kind regards
Uffe