|
@@ -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>
|
|
|
|
|
@@ -63,6 +64,12 @@ static struct sunxi_sram_desc sun4i_a10_sram_a3_a4 = {
|
|
|
SUNXI_SRAM_MAP(1, 1, "emac")),
|
|
|
};
|
|
|
|
|
|
+static struct sunxi_sram_desc sun4i_a10_sram_c1 = {
|
|
|
+ .data = SUNXI_SRAM_DATA("C1", 0x0, 0x0, 31,
|
|
|
+ SUNXI_SRAM_MAP(0, 0, "cpu"),
|
|
|
+ SUNXI_SRAM_MAP(0x7fffffff, 1, "ve")),
|
|
|
+};
|
|
|
+
|
|
|
static struct sunxi_sram_desc sun4i_a10_sram_d = {
|
|
|
.data = SUNXI_SRAM_DATA("D", 0x4, 0x0, 1,
|
|
|
SUNXI_SRAM_MAP(0, 0, "cpu"),
|
|
@@ -80,6 +87,10 @@ static const struct of_device_id sunxi_sram_dt_ids[] = {
|
|
|
.compatible = "allwinner,sun4i-a10-sram-a3-a4",
|
|
|
.data = &sun4i_a10_sram_a3_a4.data,
|
|
|
},
|
|
|
+ {
|
|
|
+ .compatible = "allwinner,sun4i-a10-sram-c1",
|
|
|
+ .data = &sun4i_a10_sram_c1.data,
|
|
|
+ },
|
|
|
{
|
|
|
.compatible = "allwinner,sun4i-a10-sram-d",
|
|
|
.data = &sun4i_a10_sram_d.data,
|
|
@@ -281,13 +292,51 @@ 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,
|
|
|
+};
|
|
|
+
|
|
|
+#define SUNXI_SRAM_EMAC_CLOCK_REG 0x30
|
|
|
+static bool sunxi_sram_regmap_accessible_reg(struct device *dev,
|
|
|
+ unsigned int reg)
|
|
|
+{
|
|
|
+ if (reg == SUNXI_SRAM_EMAC_CLOCK_REG)
|
|
|
+ return true;
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+static struct regmap_config sunxi_sram_emac_clock_regmap = {
|
|
|
+ .reg_bits = 32,
|
|
|
+ .val_bits = 32,
|
|
|
+ .reg_stride = 4,
|
|
|
+ /* last defined register */
|
|
|
+ .max_register = SUNXI_SRAM_EMAC_CLOCK_REG,
|
|
|
+ /* other devices have no business accessing other registers */
|
|
|
+ .readable_reg = sunxi_sram_regmap_accessible_reg,
|
|
|
+ .writeable_reg = sunxi_sram_regmap_accessible_reg,
|
|
|
+};
|
|
|
+
|
|
|
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 +349,46 @@ 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_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,sun4i-a10-system-control",
|
|
|
+ .data = &sun4i_a10_sramc_variant,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .compatible = "allwinner,sun5i-a13-system-control",
|
|
|
+ .data = &sun4i_a10_sramc_variant,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .compatible = "allwinner,sun8i-a23-system-control",
|
|
|
+ .data = &sun4i_a10_sramc_variant,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .compatible = "allwinner,sun8i-h3-system-control",
|
|
|
+ .data = &sun4i_a10_sramc_variant,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .compatible = "allwinner,sun50i-a64-sram-controller",
|
|
|
+ .data = &sun50i_a64_sramc_variant,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .compatible = "allwinner,sun50i-a64-system-control",
|
|
|
+ .data = &sun50i_a64_sramc_variant,
|
|
|
+ },
|
|
|
{ },
|
|
|
};
|
|
|
MODULE_DEVICE_TABLE(of, sunxi_sram_dt_match);
|