Lines Matching +full:dsp +full:- +full:aif1 +full:- +full:bclk
1 // SPDX-License-Identifier: GPL-2.0
3 // es8396.c -- ES8396 ALSA SoC Audio Codec
7 // Authors: David Yang(yangxiaohua@everest-semi.com)
227 * Add a delay work-quenue, to debug DC calibration
308 struct snd_soc_component *component = es8396->component; in pcm_shutdown_depop_events()
310 mutex_lock(&es8396->pcm_shutdown_depop_mlock); in pcm_shutdown_depop_events()
313 es8396->aif1_select &= 0xfe; in pcm_shutdown_depop_events()
314 mutex_unlock(&es8396->pcm_shutdown_depop_mlock); in pcm_shutdown_depop_events()
321 struct snd_soc_component *component = es8396->component; in voice_shutdown_depop_events()
323 mutex_lock(&es8396->voice_shutdown_depop_mlock); in voice_shutdown_depop_events()
326 es8396->aif2_select &= 0xfe; in voice_shutdown_depop_events()
327 if (es8396->aif1_select != 0) { in voice_shutdown_depop_events()
333 mutex_unlock(&es8396->voice_shutdown_depop_mlock); in voice_shutdown_depop_events()
340 struct snd_soc_component *component = es8396->component; in init_cali_work_events()
342 mutex_lock(&es8396->init_cali_mlock); in init_cali_work_events()
344 if (es8396->pcm_pop_work_retry > 0) { in init_cali_work_events()
345 es8396->pcm_pop_work_retry--; in init_cali_work_events()
348 if (es8396->pcm_pop_work_retry) { in init_cali_work_events()
349 schedule_delayed_work(&es8396->init_cali_work, in init_cali_work_events()
362 mutex_unlock(&es8396->init_cali_mlock); in init_cali_work_events()
369 struct snd_soc_component *component = es8396->component; in voice_pop_work_events()
372 mutex_lock(&es8396->voice_depop_mlock); in voice_pop_work_events()
395 snd_soc_component_write(component, 0x6A, 120 - i); in voice_pop_work_events()
396 snd_soc_component_write(component, 0x6B, 120 - i); in voice_pop_work_events()
400 mutex_unlock(&es8396->voice_depop_mlock); in voice_pop_work_events()
407 struct snd_soc_component *component = es8396->component; in pcm_pop_work_events()
410 mutex_lock(&es8396->pcm_depop_mlock); in pcm_pop_work_events()
423 snd_soc_component_write(component, 0x6A, 120 - i); in pcm_pop_work_events()
424 snd_soc_component_write(component, 0x6B, 120 - i); in pcm_pop_work_events()
427 mutex_unlock(&es8396->pcm_depop_mlock); in pcm_pop_work_events()
437 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in classd_event()
457 if (es8396_valid_spkldo(es8396->spk_ldo_lvl) == false) { in classd_event()
459 return -EINVAL; in classd_event()
462 lvl = es8396->spk_ldo_lvl; in classd_event()
467 if (es8396->spkmono == 1) { /* speaker in mono mode */ in classd_event()
483 /* L&R DAC Vol=-6db */ in classd_event()
502 es8396->output_device_selected = 0; in classd_event()
506 schedule_delayed_work(&es8396->pcm_pop_work, in classd_event()
517 /* snd_soc_component_update_bits(w->component, ES8396_DAC_CSM_REG66, in classd_event()
546 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in micbias_event()
552 if (es8396_valid_micbias(es8396->mic_bias_lvl) == false) { in micbias_event()
554 return -EINVAL; in micbias_event()
556 regv = es8396->mic_bias_lvl; in micbias_event()
564 if (es8396->dmic_amic == MIC_DMIC) { in micbias_event()
588 struct snd_soc_component *component = es8396->component; in adc_depop_work_events()
591 mutex_lock(&es8396->adc_depop_mlock); in adc_depop_work_events()
593 mutex_unlock(&es8396->adc_depop_mlock); in adc_depop_work_events()
600 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in adc_event()
649 schedule_delayed_work(&es8396->adc_depop_work, in adc_event()
672 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in hpamp_event()
680 es8396->output_device_selected = 1; in hpamp_event()
685 schedule_delayed_work(&es8396->pcm_pop_work, in hpamp_event()
723 0, 4, TLV_DB_SCALE_ITEM(-1200, 150, 0),
724 8, 11, TLV_DB_SCALE_ITEM(-600, 150, 0));
729 /* -34.5db min scale, 1.5db steps, no mute */
730 static const DECLARE_TLV_DB_SCALE(vol_tlv, -600, 150, 0);
731 /* -34.5db min scale, 1.5db steps, no mute */
733 /* -46.5db min scale, 1.5db steps, no mute */
734 static const DECLARE_TLV_DB_SCALE(hp_tlv, -4800, 1200, 0);
735 /* -16.5db min scale, 1.5db steps, no mute */
736 static const DECLARE_TLV_DB_SCALE(adc_rec_tlv, -9600, 50, 0);
738 static const DECLARE_TLV_DB_SCALE(lineout_tlv, -1200, 1200, 0);
743 static const DECLARE_TLV_DB_SCALE(vdac_tlv, -9600, 50, 0);
751 *define the line in,mic in, phone in ,and aif1-2 in volume/switch
1948 struct snd_soc_component *component = dai->component; in es8396_set_pll()
1957 return -EINVAL; in es8396_set_pll()
1969 return -EINVAL; in es8396_set_pll()
1997 reg |= 0x0c; /* clksrc2= bclk, */ in es8396_set_pll()
2003 pr_debug("ES8396 PLL Clock Source from BCLK signal\n"); in es8396_set_pll()
2006 return -EINVAL; in es8396_set_pll()
2053 switch (priv->dvdd_pwr_vol) { in es8396_set_pll()
2085 priv->mclk[dai->id - 1] = freq_out; in es8396_set_pll()
2104 struct snd_soc_component *component = dai->component; in es8396_set_dai_sysclk()
2108 switch (dai->id) { in es8396_set_dai_sysclk()
2114 return -EINVAL; in es8396_set_dai_sysclk()
2129 priv->sysclk[dai->id] = clk_id; in es8396_set_dai_sysclk()
2130 priv->mclk[dai->id] = freq; in es8396_set_dai_sysclk()
2136 switch (dai->id) { in es8396_set_dai_sysclk()
2159 /* the clock source form internal BCLK signal, don't use PLL */ in es8396_set_dai_sysclk()
2163 reg |= 0x03; /* clksrc1= bclk */ in es8396_set_dai_sysclk()
2170 priv->sysclk[dai->id] = clk_id; in es8396_set_dai_sysclk()
2171 priv->mclk[dai->id] = freq; in es8396_set_dai_sysclk()
2177 switch (dai->id) { in es8396_set_dai_sysclk()
2198 pr_debug("ES8396 using BCLK as SYSCLK at %uHz\n", freq); in es8396_set_dai_sysclk()
2201 priv->sysclk[dai->id] = ES8396_CLKID_PLLO; in es8396_set_dai_sysclk()
2202 switch (dai->id) { in es8396_set_dai_sysclk()
2234 return -EINVAL; in es8396_set_dai_sysclk()
2296 struct snd_soc_component *component = codec_dai->component; in es8396_set_dai_fmt()
2298 u8 id = codec_dai->id; in es8396_set_dai_fmt()
2316 return -EINVAL; in es8396_set_dai_fmt()
2336 return -EINVAL; in es8396_set_dai_fmt()
2345 /* lrck polarity normal, TO CHECK THE L&R Inverted for i-net */ in es8396_set_dai_fmt()
2358 return -EINVAL; in es8396_set_dai_fmt()
2371 return -EINVAL; in es8396_set_dai_fmt()
2375 pr_debug("es8396_set_dai_fmt-->\n"); in es8396_set_dai_fmt()
2377 priv->config[id].spc = spc; in es8396_set_dai_fmt()
2378 priv->config[id].mmcc = mmcc; in es8396_set_dai_fmt()
2387 struct snd_soc_component *component = dai->component; in es8396_pcm_hw_params()
2389 int id = dai->id; in es8396_pcm_hw_params()
2395 id, priv->mclk[0], srate, in es8396_pcm_hw_params()
2409 priv->config[id].srate = srate; in es8396_pcm_hw_params()
2410 priv->config[id].lrcdiv = lrdiv; in es8396_pcm_hw_params()
2411 priv->config[id].sclkdiv = bdiv; in es8396_pcm_hw_params()
2423 priv->config[id].srate = srate; in es8396_pcm_hw_params()
2424 priv->config[id].lrcdiv = lrdiv; in es8396_pcm_hw_params()
2425 priv->config[id].sclkdiv = bdiv; in es8396_pcm_hw_params()
2428 return -EINVAL; in es8396_pcm_hw_params()
2457 if (es8396->aif1_select == 0 && es8396->aif2_select == 0) { in es8396_set_bias_level()
2461 if (es8396_valid_analdo(es8396->ana_ldo_lvl)) { in es8396_set_bias_level()
2462 value = es8396->ana_ldo_lvl; in es8396_set_bias_level()
2485 struct snd_soc_component *component = dai->component; in es8396_set_tristate()
2486 int id = dai->id; in es8396_set_tristate()
2497 return -EINVAL; in es8396_set_tristate()
2499 return -EINVAL; in es8396_set_tristate()
2506 bool playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); in es8396_pcm_startup()
2507 struct snd_soc_component *component = dai->component; in es8396_pcm_startup()
2521 if ((es8396->aif2_select & 0x01) == 0) { in es8396_pcm_startup()
2545 es8396->aif1_select |= 0x01; in es8396_pcm_startup()
2552 if (es8396->calibrate == 0) { in es8396_pcm_startup()
2554 es8396->calibrate = true; in es8396_pcm_startup()
2556 schedule_delayed_work(&es8396->pcm_pop_work, in es8396_pcm_startup()
2600 es8396->aif1_select |= 0x02; in es8396_pcm_startup()
2601 schedule_delayed_work(&es8396->adc_depop_work, in es8396_pcm_startup()
2610 bool playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); in es8396_pcm_shutdown()
2611 struct snd_soc_component *component = dai->component; in es8396_pcm_shutdown()
2621 schedule_delayed_work(&es8396->pcm_shutdown_depop_work, in es8396_pcm_shutdown()
2627 es8396->aif1_select &= 0xfd; in es8396_pcm_shutdown()
2635 bool playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); in es8396_voice_startup()
2636 struct snd_soc_component *component = dai->component; in es8396_voice_startup()
2645 es8396->aif2_select |= 0x01; in es8396_voice_startup()
2657 /* DSP-B, 1st SCLK after LRCK edge, I2S2 SDPIN */ in es8396_voice_startup()
2665 if ((es8396->aif1_select & 0x01) == 0) { in es8396_voice_startup()
2685 schedule_delayed_work(&es8396->voice_pop_work, in es8396_voice_startup()
2689 es8396->aif2_select |= 0x02; in es8396_voice_startup()
2736 struct snd_soc_component *component = dai->component; in es8396_voice_shutdown()
2738 bool playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); in es8396_voice_shutdown()
2742 /* DSP-B, 1st SCLK after LRCK edge, I2S2 SDPIN */ in es8396_voice_shutdown()
2746 schedule_delayed_work(&es8396->voice_shutdown_depop_work, in es8396_voice_shutdown()
2750 /* //DSP-B, 1st SCLK after LRCK edge, I2S2 SDPO */ in es8396_voice_shutdown()
2753 es8396->aif2_select &= 0xfd; in es8396_voice_shutdown()
2762 struct snd_soc_component *component = codec_dai->component; in es8396_aif1_mute()
2765 pr_debug("es8396_aif1_mute id = %d, mute = %d", codec_dai->id, mute); in es8396_aif1_mute()
2767 if (es8396->spk_ctl_gpio && es8396->aif2_select == 0) in es8396_aif1_mute()
2768 gpiod_set_value(es8396->spk_ctl_gpio, 0); in es8396_aif1_mute()
2769 if (es8396->lineout_ctl_gpio && es8396->aif2_select == 0) in es8396_aif1_mute()
2770 gpiod_set_value(es8396->lineout_ctl_gpio, 0); in es8396_aif1_mute()
2773 if (es8396->spk_ctl_gpio) in es8396_aif1_mute()
2774 gpiod_set_value(es8396->spk_ctl_gpio, 1); in es8396_aif1_mute()
2775 if (es8396->lineout_ctl_gpio) in es8396_aif1_mute()
2776 gpiod_set_value(es8396->lineout_ctl_gpio, 1); in es8396_aif1_mute()
2784 struct snd_soc_component *component = codec_dai->component; in es8396_aif2_mute()
2787 pr_debug("es8396_aif2_mute id = %d, mute = %d", codec_dai->id, mute); in es8396_aif2_mute()
2790 if (es8396->spk_ctl_gpio && es8396->aif1_select == 0) in es8396_aif2_mute()
2791 gpiod_set_value(es8396->spk_ctl_gpio, 0); in es8396_aif2_mute()
2792 if (es8396->lineout_ctl_gpio && es8396->aif1_select == 0) in es8396_aif2_mute()
2793 gpiod_set_value(es8396->lineout_ctl_gpio, 0); in es8396_aif2_mute()
2796 if (es8396->spk_ctl_gpio) in es8396_aif2_mute()
2797 gpiod_set_value(es8396->spk_ctl_gpio, 1); in es8396_aif2_mute()
2798 if (es8396->lineout_ctl_gpio) in es8396_aif2_mute()
2799 gpiod_set_value(es8396->lineout_ctl_gpio, 1); in es8396_aif2_mute()
2804 /* SNDRV_PCM_RATE_KNOT -> 12000, 24000 Hz, limit with constraint list */
2834 .name = "es8396-aif1",
2856 struct snd_soc_component *component = es8396->component; in es8396_suspend()
2869 struct snd_soc_component *component = es8396->component; in es8396_resume()
2886 es8396->component = component; in es8396_probe()
2887 es8396->mclk_clock = devm_clk_get(component->dev, "mclk"); in es8396_probe()
2888 if (PTR_ERR(es8396->mclk_clock) == -EPROBE_DEFER) in es8396_probe()
2889 return -EPROBE_DEFER; in es8396_probe()
2891 ret = clk_prepare_enable(es8396->mclk_clock); in es8396_probe()
2923 if (es8396_valid_analdo(es8396->ana_ldo_lvl) == false) { in es8396_probe()
2925 return -EINVAL; in es8396_probe()
2927 value = es8396->ana_ldo_lvl; in es8396_probe()
2967 if (es8396_valid_micbias(es8396->mic_bias_lvl) == false) { in es8396_probe()
2969 return -EINVAL; in es8396_probe()
2971 value = es8396->mic_bias_lvl; in es8396_probe()
2980 if (es8396->dmic_amic == MIC_AMIC) in es8396_probe()
2999 if (es8396->jackdet_enable == 1) { in es8396_probe()
3003 if (es8396->gpio_int_pol == 0) in es8396_probe()
3020 if (es8396->monoin_differential == 1) in es8396_probe()
3031 //codec->dapm.bias_level = SND_SOC_BIAS_STANDBY; in es8396_probe()
3034 INIT_DELAYED_WORK(&es8396->adc_depop_work, adc_depop_work_events); in es8396_probe()
3035 mutex_init(&es8396->adc_depop_mlock); in es8396_probe()
3036 INIT_DELAYED_WORK(&es8396->pcm_pop_work, pcm_pop_work_events); in es8396_probe()
3037 mutex_init(&es8396->pcm_depop_mlock); in es8396_probe()
3039 INIT_DELAYED_WORK(&es8396->voice_pop_work, voice_pop_work_events); in es8396_probe()
3040 mutex_init(&es8396->voice_depop_mlock); in es8396_probe()
3042 INIT_DELAYED_WORK(&es8396->init_cali_work, init_cali_work_events); in es8396_probe()
3043 mutex_init(&es8396->init_cali_mlock); in es8396_probe()
3045 INIT_DELAYED_WORK(&es8396->pcm_shutdown_depop_work, in es8396_probe()
3047 mutex_init(&es8396->pcm_shutdown_depop_mlock); in es8396_probe()
3049 INIT_DELAYED_WORK(&es8396->voice_shutdown_depop_work, in es8396_probe()
3051 mutex_init(&es8396->voice_shutdown_depop_mlock); in es8396_probe()
3103 return -EINVAL; in init_es8396_prv()
3105 es8396->dvdd_pwr_vol = 0x18; in init_es8396_prv()
3106 es8396->spkmono = false; in init_es8396_prv()
3107 es8396->earpiece = true; in init_es8396_prv()
3108 es8396->monoin_differential = true; in init_es8396_prv()
3109 es8396->lno_differential = 0; in init_es8396_prv()
3110 es8396->ana_ldo_lvl = ANA_LDO_2_1V; in init_es8396_prv()
3111 es8396->spk_ldo_lvl = SPK_LDO_3V; in init_es8396_prv()
3112 es8396->mic_bias_lvl = MICBIAS_3V; in init_es8396_prv()
3113 es8396->jackdet_enable = true; in init_es8396_prv()
3114 es8396->gpio_int_pol = 0; in init_es8396_prv()
3115 es8396->dmic_amic = MIC_AMIC; in init_es8396_prv()
3116 es8396->calibrate = false; in init_es8396_prv()
3117 es8396->pcm_pop_work_retry = 1; in init_es8396_prv()
3118 es8396->output_device_selected = 0; in init_es8396_prv()
3119 es8396->aif1_select = 0; in init_es8396_prv()
3120 es8396->aif2_select = 0; in init_es8396_prv()
3130 es8396 = devm_kzalloc(&i2c_client->dev, sizeof(struct es8396_private), in es8396_i2c_probe()
3133 return -ENOMEM; in es8396_i2c_probe()
3137 return -EINVAL; in es8396_i2c_probe()
3139 es8396->regmap = devm_regmap_init_i2c(i2c_client, &es8396_regmap_config); in es8396_i2c_probe()
3140 if (IS_ERR(es8396->regmap)) in es8396_i2c_probe()
3141 return PTR_ERR(es8396->regmap); in es8396_i2c_probe()
3147 es8396->spk_ctl_gpio = devm_gpiod_get_optional(&i2c_client->dev, in es8396_i2c_probe()
3148 "spk-con-gpio", in es8396_i2c_probe()
3150 if (IS_ERR(es8396->spk_ctl_gpio)) in es8396_i2c_probe()
3151 return PTR_ERR(es8396->spk_ctl_gpio); in es8396_i2c_probe()
3154 es8396->lineout_ctl_gpio = devm_gpiod_get_optional(&i2c_client->dev, in es8396_i2c_probe()
3155 "lineout-con-gpio", in es8396_i2c_probe()
3157 if (IS_ERR(es8396->lineout_ctl_gpio)) in es8396_i2c_probe()
3158 return PTR_ERR(es8396->lineout_ctl_gpio); in es8396_i2c_probe()
3160 return devm_snd_soc_register_component(&i2c_client->dev, in es8396_i2c_probe()
3168 struct snd_soc_component *component = es8396->component; in es8396_i2c_shutdown()
3170 if (es8396->spk_ctl_gpio) in es8396_i2c_shutdown()
3171 gpiod_set_value(es8396->spk_ctl_gpio, 0); in es8396_i2c_shutdown()
3206 MODULE_AUTHOR("DavidYang, Everest Semiconductor Co., Ltd, <yangxiaohua@everest-semi.com>");