Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5828729b authored by Icenowy Zheng's avatar Icenowy Zheng Committed by Chen-Yu Tsai
Browse files

soc: sunxi: export a regmap for EMAC clock reg on A64



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: default avatarIcenowy Zheng <icenowy@aosc.io>
[wens@csie.org: export whole address range with only EMAC register
		accessible and drop regmap name]
Acked-by: default avatarMaxime Ripard <maxime.ripard@bootlin.com>
Signed-off-by: default avatarChen-Yu Tsai <wens@csie.org>
parent ce397d21
Loading
Loading
Loading
Loading
+55 −2
Original line number Diff line number Diff line
@@ -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,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 +339,26 @@ 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,sun50i-a64-sram-controller",
		.data = &sun50i_a64_sramc_variant,
	},
	{ },
};
MODULE_DEVICE_TABLE(of, sunxi_sram_dt_match);