Unverified Commit 9117d0c9 authored by Andre Przywara's avatar Andre Przywara Committed by Maxime Ripard
Browse files

soc: sunxi: sram: Add support for more than one EMAC clock



The Allwinner H616 adds a second EMAC clock register at offset 0x34, for
controlling the second EMAC in this chip.

Allow to extend the regmap in this case, to cover more than the current
4 bytes exported.

Signed-off-by: default avatarAndre Przywara <andre.przywara@arm.com>
Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
Link: https://lore.kernel.org/r/20210127172500.13356-9-andre.przywara@arm.com
parent 59657d55
Loading
Loading
Loading
Loading
+23 −8
Original line number Diff line number Diff line
@@ -283,7 +283,7 @@ int sunxi_sram_release(struct device *dev)
EXPORT_SYMBOL(sunxi_sram_release);

struct sunxi_sramc_variant {
	bool has_emac_clock;
	int num_emac_clocks;
};

static const struct sunxi_sramc_variant sun4i_a10_sramc_variant = {
@@ -291,20 +291,31 @@ static const struct sunxi_sramc_variant sun4i_a10_sramc_variant = {
};

static const struct sunxi_sramc_variant sun8i_h3_sramc_variant = {
	.has_emac_clock = true,
	.num_emac_clocks = 1,
};

static const struct sunxi_sramc_variant sun50i_a64_sramc_variant = {
	.has_emac_clock = true,
	.num_emac_clocks = 1,
};

static const struct sunxi_sramc_variant sun50i_h616_sramc_variant = {
	.num_emac_clocks = 2,
};

#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;
	const struct sunxi_sramc_variant *variant;

	variant = of_device_get_match_data(dev);

	if (reg < SUNXI_SRAM_EMAC_CLOCK_REG)
		return false;
	if (reg > SUNXI_SRAM_EMAC_CLOCK_REG + variant->num_emac_clocks * 4)
		return false;

	return true;
}

static struct regmap_config sunxi_sram_emac_clock_regmap = {
@@ -312,7 +323,7 @@ static struct regmap_config sunxi_sram_emac_clock_regmap = {
	.val_bits       = 32,
	.reg_stride     = 4,
	/* last defined register */
	.max_register   = SUNXI_SRAM_EMAC_CLOCK_REG,
	.max_register   = SUNXI_SRAM_EMAC_CLOCK_REG + 4,
	/* other devices have no business accessing other registers */
	.readable_reg	= sunxi_sram_regmap_accessible_reg,
	.writeable_reg	= sunxi_sram_regmap_accessible_reg,
@@ -343,7 +354,7 @@ static int sunxi_sram_probe(struct platform_device *pdev)
	if (!d)
		return -ENOMEM;

	if (variant->has_emac_clock) {
	if (variant->num_emac_clocks > 0) {
		emac_clock = devm_regmap_init_mmio(&pdev->dev, base,
						   &sunxi_sram_emac_clock_regmap);

@@ -387,6 +398,10 @@ static const struct of_device_id sunxi_sram_dt_match[] = {
		.compatible = "allwinner,sun50i-h5-system-control",
		.data = &sun50i_a64_sramc_variant,
	},
	{
		.compatible = "allwinner,sun50i-h616-system-control",
		.data = &sun50i_h616_sramc_variant,
	},
	{ },
};
MODULE_DEVICE_TABLE(of, sunxi_sram_dt_match);