diff options
Diffstat (limited to 'sound/soc/sunxi/sun8i-codec-analog.c')
| -rw-r--r-- | sound/soc/sunxi/sun8i-codec-analog.c | 79 | 
1 files changed, 3 insertions, 76 deletions
| diff --git a/sound/soc/sunxi/sun8i-codec-analog.c b/sound/soc/sunxi/sun8i-codec-analog.c index 485e79f292c4..916a46bbc1c8 100644 --- a/sound/soc/sunxi/sun8i-codec-analog.c +++ b/sound/soc/sunxi/sun8i-codec-analog.c @@ -27,6 +27,8 @@  #include <sound/soc-dapm.h>  #include <sound/tlv.h> +#include "sun8i-adda-pr-regmap.h" +  /* Codec analog control register offsets and bit fields */  #define SUN8I_ADDA_HP_VOLC		0x00  #define SUN8I_ADDA_HP_VOLC_PA_CLK_GATE		7 @@ -120,81 +122,6 @@  #define SUN8I_ADDA_ADC_AP_EN_ADCLEN		6  #define SUN8I_ADDA_ADC_AP_EN_ADCG		0 -/* Analog control register access bits */ -#define ADDA_PR			0x0		/* PRCM base + 0x1c0 */ -#define ADDA_PR_RESET			BIT(28) -#define ADDA_PR_WRITE			BIT(24) -#define ADDA_PR_ADDR_SHIFT		16 -#define ADDA_PR_ADDR_MASK		GENMASK(4, 0) -#define ADDA_PR_DATA_IN_SHIFT		8 -#define ADDA_PR_DATA_IN_MASK		GENMASK(7, 0) -#define ADDA_PR_DATA_OUT_SHIFT		0 -#define ADDA_PR_DATA_OUT_MASK		GENMASK(7, 0) - -/* regmap access bits */ -static int adda_reg_read(void *context, unsigned int reg, unsigned int *val) -{ -	void __iomem *base = (void __iomem *)context; -	u32 tmp; - -	/* De-assert reset */ -	writel(readl(base) | ADDA_PR_RESET, base); - -	/* Clear write bit */ -	writel(readl(base) & ~ADDA_PR_WRITE, base); - -	/* Set register address */ -	tmp = readl(base); -	tmp &= ~(ADDA_PR_ADDR_MASK << ADDA_PR_ADDR_SHIFT); -	tmp |= (reg & ADDA_PR_ADDR_MASK) << ADDA_PR_ADDR_SHIFT; -	writel(tmp, base); - -	/* Read back value */ -	*val = readl(base) & ADDA_PR_DATA_OUT_MASK; - -	return 0; -} - -static int adda_reg_write(void *context, unsigned int reg, unsigned int val) -{ -	void __iomem *base = (void __iomem *)context; -	u32 tmp; - -	/* De-assert reset */ -	writel(readl(base) | ADDA_PR_RESET, base); - -	/* Set register address */ -	tmp = readl(base); -	tmp &= ~(ADDA_PR_ADDR_MASK << ADDA_PR_ADDR_SHIFT); -	tmp |= (reg & ADDA_PR_ADDR_MASK) << ADDA_PR_ADDR_SHIFT; -	writel(tmp, base); - -	/* Set data to write */ -	tmp = readl(base); -	tmp &= ~(ADDA_PR_DATA_IN_MASK << ADDA_PR_DATA_IN_SHIFT); -	tmp |= (val & ADDA_PR_DATA_IN_MASK) << ADDA_PR_DATA_IN_SHIFT; -	writel(tmp, base); - -	/* Set write bit to signal a write */ -	writel(readl(base) | ADDA_PR_WRITE, base); - -	/* Clear write bit */ -	writel(readl(base) & ~ADDA_PR_WRITE, base); - -	return 0; -} - -static const struct regmap_config adda_pr_regmap_cfg = { -	.name		= "adda-pr", -	.reg_bits	= 5, -	.reg_stride	= 1, -	.val_bits	= 8, -	.reg_read	= adda_reg_read, -	.reg_write	= adda_reg_write, -	.fast_io	= true, -	.max_register	= 24, -}; -  /* mixer controls */  static const struct snd_kcontrol_new sun8i_codec_mixer_controls[] = {  	SOC_DAPM_DOUBLE_R("DAC Playback Switch", @@ -912,7 +839,7 @@ static int sun8i_codec_analog_probe(struct platform_device *pdev)  		return PTR_ERR(base);  	} -	regmap = devm_regmap_init(&pdev->dev, NULL, base, &adda_pr_regmap_cfg); +	regmap = sun8i_adda_pr_regmap_init(&pdev->dev, base);  	if (IS_ERR(regmap)) {  		dev_err(&pdev->dev, "Failed to create regmap\n");  		return PTR_ERR(regmap); |