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

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
...@@ -677,15 +677,40 @@ static struct snd_soc_dai_driver dummy_cpu_dai = { ...@@ -677,15 +677,40 @@ static struct snd_soc_dai_driver dummy_cpu_dai = {
}; };
static const struct regmap_config sun4i_codec_regmap_config = { 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_bits = 32,
.reg_stride = 4, .reg_stride = 4,
.val_bits = 32, .val_bits = 32,
.max_register = SUN7I_CODEC_AC_MIC_PHONE_CAL, .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[] = { 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); MODULE_DEVICE_TABLE(of, sun4i_codec_of_match);
...@@ -758,6 +783,7 @@ static int sun4i_codec_probe(struct platform_device *pdev) ...@@ -758,6 +783,7 @@ static int sun4i_codec_probe(struct platform_device *pdev)
{ {
struct snd_soc_card *card; struct snd_soc_card *card;
struct sun4i_codec *scodec; struct sun4i_codec *scodec;
const struct sun4i_codec_quirks *quirks;
struct resource *res; struct resource *res;
void __iomem *base; void __iomem *base;
int ret; int ret;
...@@ -775,8 +801,14 @@ static int sun4i_codec_probe(struct platform_device *pdev) ...@@ -775,8 +801,14 @@ static int sun4i_codec_probe(struct platform_device *pdev)
return PTR_ERR(base); 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, scodec->regmap = devm_regmap_init_mmio(&pdev->dev, base,
&sun4i_codec_regmap_config); quirks->regmap_config);
if (IS_ERR(scodec->regmap)) { if (IS_ERR(scodec->regmap)) {
dev_err(&pdev->dev, "Failed to create our regmap\n"); dev_err(&pdev->dev, "Failed to create our regmap\n");
return PTR_ERR(scodec->regmap); return PTR_ERR(scodec->regmap);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment