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

Commit c1d5065a authored by Danny Milosavljevic's avatar Danny Milosavljevic Committed by Mark Brown
Browse files

ASoC: sun4i-codec: Add custom regmap configs



The A20 has a few extra registers that the A10 doesn't have.
Therefore, use different regmaps for A10 as compared to A20.

Signed-off-by: default avatarDanny Milosavljevic <dannym@scratchpost.org>
Acked-by: default avatarMaxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 4f0c4e99
Loading
Loading
Loading
Loading
+35 −3
Original line number Diff line number Diff line
@@ -677,15 +677,40 @@ static struct snd_soc_dai_driver dummy_cpu_dai = {
};

static const struct regmap_config sun4i_codec_regmap_config = {
	.reg_bits	= 32,
	.reg_stride	= 4,
	.val_bits	= 32,
	.max_register	= SUN4I_CODEC_ADC_RXCNT,
};

static const struct regmap_config sun7i_codec_regmap_config = {
	.reg_bits	= 32,
	.reg_stride	= 4,
	.val_bits	= 32,
	.max_register	= SUN7I_CODEC_AC_MIC_PHONE_CAL,
};

struct sun4i_codec_quirks {
	const struct regmap_config *regmap_config;
};

static const struct sun4i_codec_quirks sun4i_codec_quirks = {
	.regmap_config = &sun4i_codec_regmap_config,
};

static const struct sun4i_codec_quirks sun7i_codec_quirks = {
	.regmap_config = &sun7i_codec_regmap_config,
};

static const struct of_device_id sun4i_codec_of_match[] = {
	{ .compatible = "allwinner,sun4i-a10-codec" },
	{ .compatible = "allwinner,sun7i-a20-codec" },
	{
		.compatible = "allwinner,sun4i-a10-codec",
		.data = &sun4i_codec_quirks,
	},
	{
		.compatible = "allwinner,sun7i-a20-codec",
		.data = &sun7i_codec_quirks,
	},
	{}
};
MODULE_DEVICE_TABLE(of, sun4i_codec_of_match);
@@ -758,6 +783,7 @@ static int sun4i_codec_probe(struct platform_device *pdev)
{
	struct snd_soc_card *card;
	struct sun4i_codec *scodec;
	const struct sun4i_codec_quirks *quirks;
	struct resource *res;
	void __iomem *base;
	int ret;
@@ -775,8 +801,14 @@ static int sun4i_codec_probe(struct platform_device *pdev)
		return PTR_ERR(base);
	}

	quirks = of_device_get_match_data(&pdev->dev);
	if (quirks == NULL) {
		dev_err(&pdev->dev, "Failed to determine the quirks to use\n");
		return -ENODEV;
	}

	scodec->regmap = devm_regmap_init_mmio(&pdev->dev, base,
					     &sun4i_codec_regmap_config);
					       quirks->regmap_config);
	if (IS_ERR(scodec->regmap)) {
		dev_err(&pdev->dev, "Failed to create our regmap\n");
		return PTR_ERR(scodec->regmap);