• Home
  • Raw
  • Download

Lines Matching +full:codec +full:- +full:2

1 // SPDX-License-Identifier: GPL-2.0
3 // Ingenic JZ4770 CODEC driver
17 #include <sound/soc-dai.h>
18 #include <sound/soc-dapm.h>
149 #define REG_IMR_RDO_MASK BIT(2)
158 #define REG_IFR_RDO BIT(2)
177 /* codec private data */
185 static int jz4770_codec_set_bias_level(struct snd_soc_component *codec, in jz4770_codec_set_bias_level() argument
188 struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec); in jz4770_codec_set_bias_level()
189 struct regmap *regmap = jz_codec->regmap; in jz4770_codec_set_bias_level()
216 struct snd_soc_component *codec = dai->component; in jz4770_codec_startup() local
217 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(codec); in jz4770_codec_startup()
220 * SYSCLK output from the codec to the AIC is required to keep the in jz4770_codec_startup()
224 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in jz4770_codec_startup()
233 struct snd_soc_component *codec = dai->component; in jz4770_codec_shutdown() local
234 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(codec); in jz4770_codec_shutdown()
236 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in jz4770_codec_shutdown()
244 struct snd_soc_component *codec = dai->component; in jz4770_codec_pcm_trigger() local
251 if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK) in jz4770_codec_pcm_trigger()
252 snd_soc_component_force_bias_level(codec, in jz4770_codec_pcm_trigger()
261 ret = -EINVAL; in jz4770_codec_pcm_trigger()
269 struct snd_soc_component *codec = dai->component; in jz4770_codec_mute_stream() local
270 struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec); in jz4770_codec_mute_stream()
275 change = snd_soc_component_update_bits(codec, JZ4770_CODEC_REG_CR_DAC, in jz4770_codec_mute_stream()
279 regmap_read(jz_codec->regmap, JZ4770_CODEC_REG_CR_DAC, &val); in jz4770_codec_mute_stream()
284 err = regmap_read_poll_timeout(jz_codec->regmap, in jz4770_codec_mute_stream()
289 dev_err(jz_codec->dev, in jz4770_codec_mute_stream()
295 regmap_update_bits(jz_codec->regmap, JZ4770_CODEC_REG_IFR, in jz4770_codec_mute_stream()
303 static const DECLARE_TLV_DB_MINMAX_MUTE(dac_tlv, -3100, 0);
305 static const DECLARE_TLV_DB_MINMAX(out_tlv, -2500, 600);
306 static const DECLARE_TLV_DB_SCALE(linein_tlv, -2500, 100, 0);
364 struct snd_soc_component *codec = snd_soc_dapm_to_component(w->dapm); in hpout_event() local
365 struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec); in hpout_event()
371 /* set cap-less, unmute HP */ in hpout_event()
372 regmap_update_bits(jz_codec->regmap, JZ4770_CODEC_REG_CR_HP, in hpout_event()
377 /* wait for ramp-up complete (RUP) */ in hpout_event()
378 err = regmap_read_poll_timeout(jz_codec->regmap, in hpout_event()
383 dev_err(jz_codec->dev, "RUP timeout: %d", err); in hpout_event()
388 regmap_update_bits(jz_codec->regmap, JZ4770_CODEC_REG_IFR, in hpout_event()
394 /* set cap-couple, mute HP */ in hpout_event()
395 regmap_update_bits(jz_codec->regmap, JZ4770_CODEC_REG_CR_HP, in hpout_event()
399 err = regmap_read_poll_timeout(jz_codec->regmap, in hpout_event()
404 dev_err(jz_codec->dev, "RDO timeout: %d", err); in hpout_event()
409 regmap_update_bits(jz_codec->regmap, JZ4770_CODEC_REG_IFR, in hpout_event()
428 "PCM", "Line In", "Mic 1", "Mic 2"
430 static const unsigned int jz4770_codec_hp_values[] = { 3, 2, 0, 1 };
450 "Line In", "Mic 1", "Mic 2"
452 static const unsigned int jz4770_codec_cap_values[] = { 2, 0, 1 };
476 SND_SOC_DAPM_PGA("Line Out Switch 2", JZ4770_CODEC_REG_CR_LO,
491 SND_SOC_DAPM_PGA("Mic 2", JZ4770_CODEC_REG_CR_MIC,
542 { "Mic 2", NULL, "MIC2P" },
544 { "Mic 2", NULL, "Mic Diff" },
550 { "Mic", "Stereo Capture Switch", "Mic 2" },
552 { "Headphones Source", "Mic 2", "Mic" },
554 { "Capture Source", "Mic 2", "Mic" },
557 { "Headphones Source", "Mic 2", "Mic 2" },
564 { "Capture Source", "Mic 2", "Mic 2" },
575 { "Line Out Switch 2", NULL, "Line Out" },
577 { "LOUT", NULL, "Line Out Switch 2"},
578 { "ROUT", NULL, "Line Out Switch 2"},
586 static void jz4770_codec_codec_init_regs(struct snd_soc_component *codec) in jz4770_codec_codec_init_regs() argument
588 struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec); in jz4770_codec_codec_init_regs()
589 struct regmap *regmap = jz_codec->regmap; in jz4770_codec_codec_init_regs()
649 /* default to cap-less mode(0) */ in jz4770_codec_codec_init_regs()
661 static int jz4770_codec_codec_probe(struct snd_soc_component *codec) in jz4770_codec_codec_probe() argument
663 struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec); in jz4770_codec_codec_probe()
665 clk_prepare_enable(jz_codec->clk); in jz4770_codec_codec_probe()
667 jz4770_codec_codec_init_regs(codec); in jz4770_codec_codec_probe()
672 static void jz4770_codec_codec_remove(struct snd_soc_component *codec) in jz4770_codec_codec_remove() argument
674 struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec); in jz4770_codec_codec_remove()
676 clk_disable_unprepare(jz_codec->clk); in jz4770_codec_codec_remove()
703 struct jz_codec *codec = snd_soc_component_get_drvdata(dai->component); in jz4770_codec_hw_params() local
714 bit_width = 2; in jz4770_codec_hw_params()
720 return -EINVAL; in jz4770_codec_hw_params()
729 return -EINVAL; in jz4770_codec_hw_params()
731 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in jz4770_codec_hw_params()
732 regmap_update_bits(codec->regmap, JZ4770_CODEC_REG_AICR_DAC, in jz4770_codec_hw_params()
735 regmap_update_bits(codec->regmap, JZ4770_CODEC_REG_FCR_DAC, in jz4770_codec_hw_params()
739 regmap_update_bits(codec->regmap, JZ4770_CODEC_REG_AICR_ADC, in jz4770_codec_hw_params()
742 regmap_update_bits(codec->regmap, JZ4770_CODEC_REG_FCR_ADC, in jz4770_codec_hw_params()
765 .name = "jz4770-hifi",
768 .channels_min = 2,
769 .channels_max = 2,
775 .channels_min = 2,
776 .channels_max = 2,
811 static int jz4770_codec_io_wait(struct jz_codec *codec) in jz4770_codec_io_wait() argument
815 return readl_poll_timeout(codec->base + ICDC_RGADW_OFFSET, reg, in jz4770_codec_io_wait()
823 struct jz_codec *codec = context; in jz4770_codec_reg_read() local
828 ret = jz4770_codec_io_wait(codec); in jz4770_codec_reg_read()
832 tmp = readl(codec->base + ICDC_RGADW_OFFSET); in jz4770_codec_reg_read()
835 writel(tmp, codec->base + ICDC_RGADW_OFFSET); in jz4770_codec_reg_read()
839 *val = readl(codec->base + ICDC_RGDATA_OFFSET) & in jz4770_codec_reg_read()
848 struct jz_codec *codec = context; in jz4770_codec_reg_write() local
851 ret = jz4770_codec_io_wait(codec); in jz4770_codec_reg_write()
856 codec->base + ICDC_RGADW_OFFSET); in jz4770_codec_reg_write()
858 ret = jz4770_codec_io_wait(codec); in jz4770_codec_reg_write()
892 struct device *dev = &pdev->dev; in jz4770_codec_probe()
893 struct jz_codec *codec; in jz4770_codec_probe() local
896 codec = devm_kzalloc(dev, sizeof(*codec), GFP_KERNEL); in jz4770_codec_probe()
897 if (!codec) in jz4770_codec_probe()
898 return -ENOMEM; in jz4770_codec_probe()
900 codec->dev = dev; in jz4770_codec_probe()
902 codec->base = devm_platform_ioremap_resource(pdev, 0); in jz4770_codec_probe()
903 if (IS_ERR(codec->base)) { in jz4770_codec_probe()
904 ret = PTR_ERR(codec->base); in jz4770_codec_probe()
909 codec->regmap = devm_regmap_init(dev, NULL, codec, in jz4770_codec_probe()
911 if (IS_ERR(codec->regmap)) in jz4770_codec_probe()
912 return PTR_ERR(codec->regmap); in jz4770_codec_probe()
914 codec->clk = devm_clk_get(dev, "aic"); in jz4770_codec_probe()
915 if (IS_ERR(codec->clk)) in jz4770_codec_probe()
916 return PTR_ERR(codec->clk); in jz4770_codec_probe()
918 platform_set_drvdata(pdev, codec); in jz4770_codec_probe()
923 dev_err(dev, "Failed to register codec: %d\n", ret); in jz4770_codec_probe()
931 { .compatible = "ingenic,jz4770-codec", },
939 .name = "jz4770-codec",
945 MODULE_DESCRIPTION("JZ4770 SoC internal codec driver");