Lines Matching +full:codec +full:- +full:3

1 // SPDX-License-Identifier: GPL-2.0
3 // Ingenic JZ4760 CODEC driver
18 #include <sound/soc-dai.h>
19 #include <sound/soc-dapm.h>
67 #define REG_AICR_DAC_SERIAL BIT(3)
78 #define REG_CR1_BTL_MUTE_OFFSET 3
88 #define REG_CR3_ADC_INSEL_MASK GENMASK(3, REG_CR3_ADC_INSEL_OFFSET)
95 #define REG_CCR1_CRYSTAL_MASK GENMASK(3, 0)
98 #define REG_CCR2_ADC_FREQ_MASK GENMASK(3, 0)
104 #define REG_PMR1_SB_MIC1_OFFSET 3
110 #define REG_PMR2_SB_HP_OFFSET 3
119 #define REG_ICR_RUP_MASK BIT(3)
128 #define REG_IFR_RUP BIT(3)
138 #define REG_GCR_GIM1_MASK GENMASK(5, 3)
146 #define REG_AGC2_HOLD_MASK GENMASK(3, 0)
149 #define REG_AGC3_DCY_MASK GENMASK(3, 0)
161 /* codec private data */
169 static int jz4760_codec_set_bias_level(struct snd_soc_component *codec,
172 struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
173 struct regmap *regmap = jz_codec->regmap;
199 struct snd_soc_component *codec = dai->component;
200 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(codec);
204 * SYSCLK output from the codec to the AIC is required to keep the
208 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
216 struct snd_soc_component *codec = dai->component;
217 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(codec);
219 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
227 struct snd_soc_component *codec = dai->component;
234 if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)
235 snd_soc_component_force_bias_level(codec, SND_SOC_BIAS_ON);
243 ret = -EINVAL;
251 struct snd_soc_component *codec = dai->component;
252 struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
257 change = snd_soc_component_update_bits(codec, JZ4760_CODEC_REG_CR2,
261 regmap_read(jz_codec->regmap, JZ4760_CODEC_REG_PMR2, &val);
266 err = regmap_read_poll_timeout(jz_codec->regmap,
271 dev_err(jz_codec->dev,
277 regmap_write(jz_codec->regmap, JZ4760_CODEC_REG_IFR, gain_bit);
280 regmap_read(jz_codec->regmap, JZ4760_CODEC_REG_CR2, &reg);
286 static const DECLARE_TLV_DB_MINMAX_MUTE(dac_tlv, -3100, 100);
288 static const DECLARE_TLV_DB_MINMAX(out_tlv, -2500, 100);
289 static const DECLARE_TLV_DB_SCALE(linein_tlv, -2500, 100, 0);
290 static const DECLARE_TLV_DB_MINMAX(mixer_tlv, -3100, 0);
311 SOC_SINGLE("High-Pass Filter Capture Switch",
329 struct snd_soc_component *codec = snd_soc_dapm_to_component(w->dapm);
330 struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
337 regmap_clear_bits(jz_codec->regmap, JZ4760_CODEC_REG_CR1,
342 /* wait for ramp-up complete (RUP) */
343 err = regmap_read_poll_timeout(jz_codec->regmap,
348 dev_err(jz_codec->dev, "RUP timeout: %d", err);
353 regmap_set_bits(jz_codec->regmap, JZ4760_CODEC_REG_IFR,
360 regmap_set_bits(jz_codec->regmap, JZ4760_CODEC_REG_CR1,
363 err = regmap_read_poll_timeout(jz_codec->regmap,
368 dev_err(jz_codec->dev, "RDO timeout: %d", err);
373 regmap_set_bits(jz_codec->regmap, JZ4760_CODEC_REG_IFR,
386 static const unsigned int jz4760_codec_hp_values[] = { 3, 2, 0, 1 };
549 static void jz4760_codec_codec_init_regs(struct snd_soc_component *codec)
551 struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
552 struct regmap *regmap = jz_codec->regmap;
587 regmap_set_bits(jz_codec->regmap, JZ4760_CODEC_REG_CR2,
602 static int jz4760_codec_codec_probe(struct snd_soc_component *codec)
604 struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
606 clk_prepare_enable(jz_codec->clk);
608 jz4760_codec_codec_init_regs(codec);
613 static void jz4760_codec_codec_remove(struct snd_soc_component *codec)
615 struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
617 clk_disable_unprepare(jz_codec->clk);
644 struct jz_codec *codec = snd_soc_component_get_drvdata(dai->component);
658 bit_width = 3;
661 return -EINVAL;
670 return -EINVAL;
672 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
673 regmap_update_bits(codec->regmap, JZ4760_CODEC_REG_AICR,
676 regmap_update_bits(codec->regmap, JZ4760_CODEC_REG_CCR2,
680 regmap_update_bits(codec->regmap, JZ4760_CODEC_REG_AICR,
683 regmap_update_bits(codec->regmap, JZ4760_CODEC_REG_CCR2,
706 .name = "jz4760-hifi",
739 static int jz4760_codec_io_wait(struct jz_codec *codec)
743 return readl_poll_timeout(codec->base + ICDC_RGADW_OFFSET, reg,
751 struct jz_codec *codec = context;
756 ret = jz4760_codec_io_wait(codec);
760 tmp = readl(codec->base + ICDC_RGADW_OFFSET);
763 writel(tmp, codec->base + ICDC_RGADW_OFFSET);
767 *val = readl(codec->base + ICDC_RGDATA_OFFSET) &
776 struct jz_codec *codec = context;
779 ret = jz4760_codec_io_wait(codec);
784 codec->base + ICDC_RGADW_OFFSET);
786 ret = jz4760_codec_io_wait(codec);
818 struct device *dev = &pdev->dev;
819 struct jz_codec *codec;
822 codec = devm_kzalloc(dev, sizeof(*codec), GFP_KERNEL);
823 if (!codec)
824 return -ENOMEM;
826 codec->dev = dev;
828 codec->base = devm_platform_ioremap_resource(pdev, 0);
829 if (IS_ERR(codec->base))
830 return PTR_ERR(codec->base);
832 codec->regmap = devm_regmap_init(dev, NULL, codec,
834 if (IS_ERR(codec->regmap))
835 return PTR_ERR(codec->regmap);
837 codec->clk = devm_clk_get(dev, "aic");
838 if (IS_ERR(codec->clk))
839 return PTR_ERR(codec->clk);
841 platform_set_drvdata(pdev, codec);
846 dev_err(dev, "Failed to register codec: %d\n", ret);
854 { .compatible = "ingenic,jz4760-codec", },
862 .name = "jz4760-codec",
868 MODULE_DESCRIPTION("JZ4760 SoC internal codec driver");