Lines Matching +full:codec +full:- +full:2
1 // SPDX-License-Identifier: GPL-2.0
3 // Ingenic JZ4760 CODEC driver
18 #include <sound/soc-dai.h>
19 #include <sound/soc-dapm.h>
72 #define REG_AICR_ADC_SERIAL BIT(2)
87 #define REG_CR3_ADC_INSEL_OFFSET 2
105 #define REG_PMR1_SB_MIC2_OFFSET 2
111 #define REG_PMR2_SB_BTL_OFFSET 2
120 #define REG_ICR_RDO_MASK BIT(2)
129 #define REG_IFR_RDO BIT(2)
139 #define REG_GCR_GIM2_MASK GENMASK(2, 0)
143 #define REG_AGC1_TARGET_MASK GENMASK(5, 2)
161 /* codec private data */
169 static int jz4760_codec_set_bias_level(struct snd_soc_component *codec, in jz4760_codec_set_bias_level() argument
172 struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec); in jz4760_codec_set_bias_level()
173 struct regmap *regmap = jz_codec->regmap; in jz4760_codec_set_bias_level()
199 struct snd_soc_component *codec = dai->component; in jz4760_codec_startup() local
200 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(codec); in jz4760_codec_startup()
204 * SYSCLK output from the codec to the AIC is required to keep the in jz4760_codec_startup()
208 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in jz4760_codec_startup()
216 struct snd_soc_component *codec = dai->component; in jz4760_codec_shutdown() local
217 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(codec); in jz4760_codec_shutdown()
219 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in jz4760_codec_shutdown()
227 struct snd_soc_component *codec = dai->component; in jz4760_codec_pcm_trigger() local
234 if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK) in jz4760_codec_pcm_trigger()
235 snd_soc_component_force_bias_level(codec, SND_SOC_BIAS_ON); in jz4760_codec_pcm_trigger()
243 ret = -EINVAL; in jz4760_codec_pcm_trigger()
251 struct snd_soc_component *codec = dai->component; in jz4760_codec_mute_stream() local
252 struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec); in jz4760_codec_mute_stream()
257 change = snd_soc_component_update_bits(codec, JZ4760_CODEC_REG_CR2, in jz4760_codec_mute_stream()
261 regmap_read(jz_codec->regmap, JZ4760_CODEC_REG_PMR2, &val); in jz4760_codec_mute_stream()
266 err = regmap_read_poll_timeout(jz_codec->regmap, in jz4760_codec_mute_stream()
271 dev_err(jz_codec->dev, in jz4760_codec_mute_stream()
277 regmap_write(jz_codec->regmap, JZ4760_CODEC_REG_IFR, gain_bit); in jz4760_codec_mute_stream()
280 regmap_read(jz_codec->regmap, JZ4760_CODEC_REG_CR2, ®); in jz4760_codec_mute_stream()
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",
353 struct snd_soc_component *codec = snd_soc_dapm_to_component(w->dapm); in hpout_event() local
354 struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec); in hpout_event()
361 regmap_clear_bits(jz_codec->regmap, JZ4760_CODEC_REG_CR1, in hpout_event()
366 /* wait for ramp-up complete (RUP) */ in hpout_event()
367 err = regmap_read_poll_timeout(jz_codec->regmap, in hpout_event()
372 dev_err(jz_codec->dev, "RUP timeout: %d", err); in hpout_event()
377 regmap_set_bits(jz_codec->regmap, JZ4760_CODEC_REG_IFR, in hpout_event()
384 regmap_set_bits(jz_codec->regmap, JZ4760_CODEC_REG_CR1, in hpout_event()
387 err = regmap_read_poll_timeout(jz_codec->regmap, in hpout_event()
392 dev_err(jz_codec->dev, "RDO timeout: %d", err); in hpout_event()
397 regmap_set_bits(jz_codec->regmap, JZ4760_CODEC_REG_IFR, in hpout_event()
407 "PCM", "Line In", "Mic 1", "Mic 2"
410 static const unsigned int jz4760_codec_hp_values[] = { 3, 2, 0, 1 };
422 "Line In", "Mic 1", "Mic 2"
425 static const unsigned int jz4760_codec_cap_values[] = { 2, 0, 1 };
474 SND_SOC_DAPM_PGA("Mic 2", JZ4760_CODEC_REG_PMR1,
529 { "Mic 2", NULL, "MIC2P" },
531 { "Mic 2", NULL, "Mic Diff" },
537 { "Mic", "Stereo Capture Switch", "Mic 2" },
539 { "Headphones Source", "Mic 2", "Mic" },
541 { "Capture Source", "Mic 2", "Mic" },
545 { "Capture Source", "Mic 2", "Mic 2" },
551 { "Headphones Source", "Mic 2", "Mic 2" },
573 static void jz4760_codec_codec_init_regs(struct snd_soc_component *codec) in jz4760_codec_codec_init_regs() argument
575 struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec); in jz4760_codec_codec_init_regs()
576 struct regmap *regmap = jz_codec->regmap; in jz4760_codec_codec_init_regs()
611 regmap_set_bits(jz_codec->regmap, JZ4760_CODEC_REG_CR2, in jz4760_codec_codec_init_regs()
626 static int jz4760_codec_codec_probe(struct snd_soc_component *codec) in jz4760_codec_codec_probe() argument
628 struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec); in jz4760_codec_codec_probe()
630 clk_prepare_enable(jz_codec->clk); in jz4760_codec_codec_probe()
632 jz4760_codec_codec_init_regs(codec); in jz4760_codec_codec_probe()
637 static void jz4760_codec_codec_remove(struct snd_soc_component *codec) in jz4760_codec_codec_remove() argument
639 struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec); in jz4760_codec_codec_remove()
641 clk_disable_unprepare(jz_codec->clk); in jz4760_codec_codec_remove()
668 struct jz_codec *codec = snd_soc_component_get_drvdata(dai->component); in jz4760_codec_hw_params() local
679 bit_width = 2; in jz4760_codec_hw_params()
685 return -EINVAL; in jz4760_codec_hw_params()
694 return -EINVAL; in jz4760_codec_hw_params()
696 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in jz4760_codec_hw_params()
697 regmap_update_bits(codec->regmap, JZ4760_CODEC_REG_AICR, in jz4760_codec_hw_params()
700 regmap_update_bits(codec->regmap, JZ4760_CODEC_REG_CCR2, in jz4760_codec_hw_params()
704 regmap_update_bits(codec->regmap, JZ4760_CODEC_REG_AICR, in jz4760_codec_hw_params()
707 regmap_update_bits(codec->regmap, JZ4760_CODEC_REG_CCR2, in jz4760_codec_hw_params()
730 .name = "jz4760-hifi",
733 .channels_min = 2,
734 .channels_max = 2,
740 .channels_min = 2,
741 .channels_max = 2,
763 static int jz4760_codec_io_wait(struct jz_codec *codec) in jz4760_codec_io_wait() argument
767 return readl_poll_timeout(codec->base + ICDC_RGADW_OFFSET, reg, in jz4760_codec_io_wait()
775 struct jz_codec *codec = context; in jz4760_codec_reg_read() local
780 ret = jz4760_codec_io_wait(codec); in jz4760_codec_reg_read()
784 tmp = readl(codec->base + ICDC_RGADW_OFFSET); in jz4760_codec_reg_read()
787 writel(tmp, codec->base + ICDC_RGADW_OFFSET); in jz4760_codec_reg_read()
791 *val = readl(codec->base + ICDC_RGDATA_OFFSET) & in jz4760_codec_reg_read()
800 struct jz_codec *codec = context; in jz4760_codec_reg_write() local
803 ret = jz4760_codec_io_wait(codec); in jz4760_codec_reg_write()
808 codec->base + ICDC_RGADW_OFFSET); in jz4760_codec_reg_write()
810 ret = jz4760_codec_io_wait(codec); in jz4760_codec_reg_write()
842 struct device *dev = &pdev->dev; in jz4760_codec_probe()
843 struct jz_codec *codec; in jz4760_codec_probe() local
846 codec = devm_kzalloc(dev, sizeof(*codec), GFP_KERNEL); in jz4760_codec_probe()
847 if (!codec) in jz4760_codec_probe()
848 return -ENOMEM; in jz4760_codec_probe()
850 codec->dev = dev; in jz4760_codec_probe()
852 codec->base = devm_platform_ioremap_resource(pdev, 0); in jz4760_codec_probe()
853 if (IS_ERR(codec->base)) in jz4760_codec_probe()
854 return PTR_ERR(codec->base); in jz4760_codec_probe()
856 codec->regmap = devm_regmap_init(dev, NULL, codec, in jz4760_codec_probe()
858 if (IS_ERR(codec->regmap)) in jz4760_codec_probe()
859 return PTR_ERR(codec->regmap); in jz4760_codec_probe()
861 codec->clk = devm_clk_get(dev, "aic"); in jz4760_codec_probe()
862 if (IS_ERR(codec->clk)) in jz4760_codec_probe()
863 return PTR_ERR(codec->clk); in jz4760_codec_probe()
865 platform_set_drvdata(pdev, codec); in jz4760_codec_probe()
870 dev_err(dev, "Failed to register codec: %d\n", ret); in jz4760_codec_probe()
878 { .compatible = "ingenic,jz4760-codec", },
886 .name = "jz4760-codec",
892 MODULE_DESCRIPTION("JZ4760 SoC internal codec driver");