The A64 SRAM controller memory zone has a EMAC clock register, which is
needed by the Ethernet MAC driver (dwmac-sun8i).

Export a regmap for this register on A64.

Signed-off-by: Icenowy Zheng <icen...@aosc.io>
---
 drivers/soc/sunxi/sunxi_sram.c | 48 ++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 46 insertions(+), 2 deletions(-)

diff --git a/drivers/soc/sunxi/sunxi_sram.c b/drivers/soc/sunxi/sunxi_sram.c
index 882be5ed7e84..35ab5f334bb1 100644
--- a/drivers/soc/sunxi/sunxi_sram.c
+++ b/drivers/soc/sunxi/sunxi_sram.c
@@ -17,6 +17,7 @@
 #include <linux/of_address.h>
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
+#include <linux/regmap.h>
 
 #include <linux/soc/sunxi/sunxi_sram.h>
 
@@ -281,13 +282,41 @@ int sunxi_sram_release(struct device *dev)
 }
 EXPORT_SYMBOL(sunxi_sram_release);
 
+struct sunxi_sramc_variant {
+       bool has_emac_clock;
+};
+
+static const struct sunxi_sramc_variant sun4i_a10_sramc_variant = {
+       /* Nothing special */
+};
+
+static const struct sunxi_sramc_variant sun50i_a64_sramc_variant = {
+       .has_emac_clock = true,
+};
+
+static struct regmap_config sunxi_sram_emac_clock_regmap = {
+       .reg_bits       = 32,
+       .val_bits       = 32,
+       .reg_stride     = 4,
+       .max_register   = 0x0,  /* only single register */
+       .name           = "emac-clock",
+};
+
+#define SUNXI_SRAM_EMAC_CLOCK_REG      0x30
+
 static int sunxi_sram_probe(struct platform_device *pdev)
 {
        struct resource *res;
        struct dentry *d;
+       struct regmap *emac_clock;
+       const struct sunxi_sramc_variant *variant;
 
        sram_dev = &pdev->dev;
 
+       variant = of_device_get_match_data(&pdev->dev);
+       if (!variant)
+               return -EINVAL;
+
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        base = devm_ioremap_resource(&pdev->dev, res);
        if (IS_ERR(base))
@@ -300,12 +329,27 @@ static int sunxi_sram_probe(struct platform_device *pdev)
        if (!d)
                return -ENOMEM;
 
+       if (variant->has_emac_clock) {
+               emac_clock = devm_regmap_init_mmio(&pdev->dev,
+                                                  base + 
SUNXI_SRAM_EMAC_CLOCK_REG,
+                                                  
&sunxi_sram_emac_clock_regmap);
+
+               if (IS_ERR(emac_clock))
+                       return PTR_ERR(emac_clock);
+       }
+
        return 0;
 }
 
 static const struct of_device_id sunxi_sram_dt_match[] = {
-       { .compatible = "allwinner,sun4i-a10-sram-controller" },
-       { .compatible = "allwinner,sun50i-a64-sram-controller" },
+       {
+               .compatible = "allwinner,sun4i-a10-sram-controller",
+               .data = &sun4i_a10_sramc_variant,
+       },
+       {
+               .compatible = "allwinner,sun50i-a64-sram-controller",
+               .data = &sun50i_a64_sramc_variant,
+       },
        { },
 };
 MODULE_DEVICE_TABLE(of, sunxi_sram_dt_match);
-- 
2.15.1

Reply via email to