mmc: renesas-sdhi: provide a whitelist for Gen3 SoC ES versions
authorSimon Horman <horms+renesas@verge.net.au>
Wed, 2 Aug 2017 12:48:42 +0000 (14:48 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Wed, 30 Aug 2017 12:01:47 +0000 (14:01 +0200)
Provide a whitelist for Gen3 SoC ES versions for both the SYS DMAC and
internal DMAC variants of the SDHI driver.  This is to allow drivers to
only initialise for Gen3 SoC ES versions for which they are the appropriate
DMAC implementation.  Currently internal DMAC is the appropriate
implementation for all supported Gen3 SoC ES versions.

Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/renesas_sdhi_internal_dmac.c
drivers/mmc/host/renesas_sdhi_sys_dmac.c

index a26c6ed8e02971d6471e276ba9dbf1a1a1ea1ef2..6717003888e2923c3a3798ad45ae3d57b1d5b14c 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/module.h>
 #include <linux/pagemap.h>
 #include <linux/scatterlist.h>
+#include <linux/sys_soc.h>
 
 #include "renesas_sdhi.h"
 #include "tmio_mmc.h"
@@ -241,8 +242,22 @@ static struct tmio_mmc_dma_ops renesas_sdhi_internal_dmac_dma_ops = {
        .dataend = renesas_sdhi_internal_dmac_dataend_dma,
 };
 
+/*
+ * Whitelist of specific R-Car Gen3 SoC ES versions to use this DMAC
+ * implementation as others may use a different implementation.
+ */
+static const struct soc_device_attribute gen3_soc_whitelist[] = {
+        { .soc_id = "r8a7795", .revision = "ES1.*" },
+        { .soc_id = "r8a7795", .revision = "ES2.0" },
+        { .soc_id = "r8a7796", .revision = "ES1.0" },
+        { /* sentinel */ }
+};
+
 static int renesas_sdhi_internal_dmac_probe(struct platform_device *pdev)
 {
+       if (!soc_device_match(gen3_soc_whitelist))
+               return -ENODEV;
+
        return renesas_sdhi_probe(pdev, &renesas_sdhi_internal_dmac_dma_ops);
 }
 
index b6789f5197b33293adf01a18da2203fe6acfe79b..718cb8a9d2ce8d94d6e914f3746fd91b1e9ae0d0 100644 (file)
 #include <linux/mmc/host.h>
 #include <linux/mod_devicetable.h>
 #include <linux/module.h>
+#include <linux/of_device.h>
 #include <linux/pagemap.h>
 #include <linux/scatterlist.h>
+#include <linux/sys_soc.h>
 
 #include "renesas_sdhi.h"
 #include "tmio_mmc.h"
@@ -459,8 +461,21 @@ static const struct tmio_mmc_dma_ops renesas_sdhi_sys_dmac_dma_ops = {
        .dataend = renesas_sdhi_sys_dmac_dataend_dma,
 };
 
+/*
+ * Whitelist of specific R-Car Gen3 SoC ES versions to use this DMAC
+ * implementation. Currently empty as all supported ES versions use
+ * the internal DMAC.
+ */
+static const struct soc_device_attribute gen3_soc_whitelist[] = {
+        { /* sentinel */ }
+};
+
 static int renesas_sdhi_sys_dmac_probe(struct platform_device *pdev)
 {
+       if (of_device_get_match_data(&pdev->dev) == &of_rcar_gen3_compatible &&
+           !soc_device_match(gen3_soc_whitelist))
+               return -ENODEV;
+
        return renesas_sdhi_probe(pdev, &renesas_sdhi_sys_dmac_dma_ops);
 }