Lines Matching +full:mic +full:- +full:min +full:- +full:freq
1 // SPDX-License-Identifier: GPL-2.0-only
3 * cs42l84.c -- CS42L84 ALSA SoC audio driver
33 #include <sound/soc-dapm.h>
88 struct soc_mixer_control *mc = (struct soc_mixer_control *) kctl->private_value; in cs42l84_put_dac_vol()
92 vola = val->value.integer.value[0] + mc->min; in cs42l84_put_dac_vol()
93 volb = val->value.integer.value[1] + mc->min; in cs42l84_put_dac_vol()
95 if (vola < mc->min || vola > mc->max || volb < mc->min || volb > mc->max) in cs42l84_put_dac_vol()
96 return -EINVAL; in cs42l84_put_dac_vol()
142 struct soc_mixer_control *mc = (struct soc_mixer_control *) kctl->private_value; in cs42l84_get_dac_vol()
167 vola |= ~((int)(BIT(8) - 1)); in cs42l84_get_dac_vol()
169 volb |= ~((int)(BIT(8) - 1)); in cs42l84_get_dac_vol()
171 val->value.integer.value[0] = vola - mc->min; in cs42l84_get_dac_vol()
172 val->value.integer.value[1] = volb - mc->min; in cs42l84_get_dac_vol()
177 static const DECLARE_TLV_DB_SCALE(cs42l84_dac_tlv, -12800, 50, true);
178 static const DECLARE_TLV_DB_SCALE(cs42l84_adc_tlv, -1200, 50, false);
183 CS42L84_DAC_CHB_VOL_LSB, 0, -256, 24, 8, 0,
284 mutex_lock(&cs42l84->irq_lock); in cs42l84_set_jack()
285 cs42l84->jack = jk; in cs42l84_set_jack()
286 snd_soc_jack_report(jk, cs42l84->hs_type, SND_JACK_HEADSET); in cs42l84_set_jack()
287 mutex_unlock(&cs42l84->irq_lock); in cs42l84_set_jack()
373 clk = cs42l84->bclk; in cs42l84_pll_config()
376 if (cs42l84->stream_use) { in cs42l84_pll_config()
377 if (pll_ratio_table[cs42l84->pll_config].bclk == clk) in cs42l84_pll_config()
380 return -EBUSY; in cs42l84_pll_config()
385 cs42l84->pll_config = i; in cs42l84_pll_config()
391 return -EINVAL; in cs42l84_pll_config()
394 fsync = clk / cs42l84->srate; in cs42l84_pll_config()
395 if (((fsync * cs42l84->srate) != clk) in cs42l84_pll_config()
397 dev_err(component->dev, in cs42l84_pll_config()
399 clk, cs42l84->srate); in cs42l84_pll_config()
400 return -EINVAL; in cs42l84_pll_config()
414 cs42l84->pll_mclk_f = CS42L84_CCM_CTL1_MCLK_F_12MHZ; in cs42l84_pll_config()
417 cs42l84->pll_mclk_f = CS42L84_CCM_CTL1_MCLK_F_12_288KHZ; in cs42l84_pll_config()
420 cs42l84->pll_mclk_f = CS42L84_CCM_CTL1_MCLK_F_24MHZ; in cs42l84_pll_config()
423 cs42l84->pll_mclk_f = CS42L84_CCM_CTL1_MCLK_F_24_576KHZ; in cs42l84_pll_config()
463 return -EINVAL; in cs42l84_set_dai_fmt()
470 return -EINVAL; in cs42l84_set_dai_fmt()
478 return -EINVAL; in cs42l84_set_dai_fmt()
488 struct snd_soc_component *component = dai->component; in cs42l84_pcm_hw_params()
493 cs42l84->srate = params_rate(params); in cs42l84_pcm_hw_params()
519 return -EINVAL; in cs42l84_pcm_hw_params()
524 switch (substream->stream) { in cs42l84_pcm_hw_params()
527 params_width(params) - 1); in cs42l84_pcm_hw_params()
529 params_width(params) - 1); in cs42l84_pcm_hw_params()
534 params_width(params) - 1); in cs42l84_pcm_hw_params()
536 params_width(params) - 1); in cs42l84_pcm_hw_params()
544 int clk_id, unsigned int freq, int dir) in cs42l84_set_sysclk() argument
546 struct snd_soc_component *component = dai->component; in cs42l84_set_sysclk()
550 if (freq == 0) { in cs42l84_set_sysclk()
551 cs42l84->bclk = 0; in cs42l84_set_sysclk()
556 if (pll_ratio_table[i].bclk == freq) { in cs42l84_set_sysclk()
557 cs42l84->bclk = freq; in cs42l84_set_sysclk()
562 dev_err(component->dev, "BCLK %u not supported\n", freq); in cs42l84_set_sysclk()
564 return -EINVAL; in cs42l84_set_sysclk()
569 struct snd_soc_component *component = dai->component; in cs42l84_mute_stream()
579 cs42l84->stream_use &= ~(1 << stream); in cs42l84_mute_stream()
580 if (!cs42l84->stream_use) { in cs42l84_mute_stream()
594 if (!cs42l84->stream_use) { in cs42l84_mute_stream()
601 * DAPM widgets power-up before stream unmute so at least in cs42l84_mute_stream()
603 * powered-up. in cs42l84_mute_stream()
610 if (pll_ratio_table[cs42l84->pll_config].mclk_src_sel) { in cs42l84_mute_stream()
616 ret = regmap_read_poll_timeout(cs42l84->regmap, in cs42l84_mute_stream()
623 dev_warn(component->dev, "PLL failed to lock: %d\n", ret); in cs42l84_mute_stream()
626 dev_warn(component->dev, "PLL lock error\n"); in cs42l84_mute_stream()
633 | FIELD_PREP(CS42L84_CCM_CTL1_MCLK_FREQ, cs42l84->pll_mclk_f)); in cs42l84_mute_stream()
640 | FIELD_PREP(CS42L84_CCM_CTL1_MCLK_FREQ, cs42l84->pll_mclk_f)); in cs42l84_mute_stream()
644 cs42l84->stream_use |= 1 << stream; in cs42l84_mute_stream()
647 /* Un-mute the headphone */ in cs42l84_mute_stream()
704 regmap_update_bits(cs42l84->regmap, in cs42l84_detect_hs()
711 regmap_update_bits(cs42l84->regmap, in cs42l84_detect_hs()
720 regmap_write(cs42l84->regmap, in cs42l84_detect_hs()
726 regmap_update_bits(cs42l84->regmap, in cs42l84_detect_hs()
731 regmap_update_bits(cs42l84->regmap, in cs42l84_detect_hs()
739 regmap_read(cs42l84->regmap, CS42L84_HS_DET_STATUS2, ®); in cs42l84_detect_hs()
740 regmap_update_bits(cs42l84->regmap, in cs42l84_detect_hs()
749 regmap_update_bits(cs42l84->regmap, in cs42l84_detect_hs()
758 dev_dbg(cs42l84->dev, "Detected mic\n"); in cs42l84_detect_hs()
759 cs42l84->hs_type = SND_JACK_HEADSET; in cs42l84_detect_hs()
760 snd_soc_jack_report(cs42l84->jack, SND_JACK_HEADSET, in cs42l84_detect_hs()
765 dev_dbg(cs42l84->dev, "Detected open circuit on HS4\n"); in cs42l84_detect_hs()
769 snd_soc_jack_report(cs42l84->jack, SND_JACK_HEADPHONE, in cs42l84_detect_hs()
771 cs42l84->hs_type = SND_JACK_HEADPHONE; in cs42l84_detect_hs()
772 dev_dbg(cs42l84->dev, "Detected bare headphone (no mic)\n"); in cs42l84_detect_hs()
780 regmap_update_bits(cs42l84->regmap, in cs42l84_revert_hs()
787 regmap_write(cs42l84->regmap, in cs42l84_revert_hs()
795 regmap_update_bits(cs42l84->regmap, in cs42l84_revert_hs()
804 regmap_update_bits(cs42l84->regmap, CS42L84_TSRS_PLUG_INT_MASK, in cs42l84_set_interrupt_masks()
820 mutex_lock(&cs42l84->irq_lock); in cs42l84_irq_thread()
823 regmap_read(cs42l84->regmap, irq_params_table[i].status_addr, in cs42l84_irq_thread()
825 regmap_read(cs42l84->regmap, irq_params_table[i].mask_addr, in cs42l84_irq_thread()
839 regmap_read(cs42l84->regmap, CS42L84_TSRS_PLUG_STATUS, ®); in cs42l84_irq_thread()
845 if (current_tip_state != cs42l84->tip_state) { in cs42l84_irq_thread()
846 cs42l84->tip_state = current_tip_state; in cs42l84_irq_thread()
849 dev_dbg(cs42l84->dev, "Plug event\n"); in cs42l84_irq_thread()
860 regmap_read(cs42l84->regmap, CS42L84_TSRS_PLUG_STATUS, ®); in cs42l84_irq_thread()
865 dev_dbg(cs42l84->dev, "Wobbly connection, detection invalidated\n"); in cs42l84_irq_thread()
866 cs42l84->tip_state = CS42L84_UNPLUG; in cs42l84_irq_thread()
874 cs42l84->ring_state = CS42L84_UNPLUG; in cs42l84_irq_thread()
875 dev_dbg(cs42l84->dev, "Unplug event\n"); in cs42l84_irq_thread()
878 cs42l84->hs_type = 0; in cs42l84_irq_thread()
879 snd_soc_jack_report(cs42l84->jack, 0, in cs42l84_irq_thread()
887 cs42l84->ring_state = CS42L84_TRANS; in cs42l84_irq_thread()
891 mutex_unlock(&cs42l84->irq_lock); in cs42l84_irq_thread()
901 if (current_ring_state != cs42l84->ring_state) { in cs42l84_irq_thread()
902 cs42l84->ring_state = current_ring_state; in cs42l84_irq_thread()
908 mutex_unlock(&cs42l84->irq_lock); in cs42l84_irq_thread()
918 regmap_update_bits(cs42l84->regmap, CS42L84_MIC_DET_CTL4, in cs42l84_setup_plug_detect()
921 regmap_update_bits(cs42l84->regmap, CS42L84_TIP_SENSE_CTL2, in cs42l84_setup_plug_detect()
924 regmap_update_bits(cs42l84->regmap, CS42L84_RING_SENSE_CTL, in cs42l84_setup_plug_detect()
930 regmap_update_bits(cs42l84->regmap, CS42L84_TIP_SENSE_CTL, in cs42l84_setup_plug_detect()
936 regmap_update_bits(cs42l84->regmap, CS42L84_MSM_BLOCK_EN3, in cs42l84_setup_plug_detect()
941 regmap_read(cs42l84->regmap, CS42L84_TSRS_PLUG_STATUS, ®); in cs42l84_setup_plug_detect()
942 cs42l84->tip_state = (((char) reg) & in cs42l84_setup_plug_detect()
946 /* Set mic-detection threshold */ in cs42l84_setup_plug_detect()
947 regmap_update_bits(cs42l84->regmap, in cs42l84_setup_plug_detect()
952 regmap_write(cs42l84->regmap, in cs42l84_setup_plug_detect()
960 regmap_update_bits(cs42l84->regmap, in cs42l84_setup_plug_detect()
965 regmap_update_bits(cs42l84->regmap, in cs42l84_setup_plug_detect()
976 cs42l84 = devm_kzalloc(&i2c_client->dev, sizeof(struct cs42l84_private), in cs42l84_i2c_probe()
979 return -ENOMEM; in cs42l84_i2c_probe()
981 cs42l84->dev = &i2c_client->dev; in cs42l84_i2c_probe()
983 mutex_init(&cs42l84->irq_lock); in cs42l84_i2c_probe()
985 cs42l84->regmap = devm_regmap_init_i2c(i2c_client, &cs42l84_regmap); in cs42l84_i2c_probe()
986 if (IS_ERR(cs42l84->regmap)) { in cs42l84_i2c_probe()
987 ret = PTR_ERR(cs42l84->regmap); in cs42l84_i2c_probe()
988 dev_err(&i2c_client->dev, "regmap_init() failed: %d\n", ret); in cs42l84_i2c_probe()
993 cs42l84->reset_gpio = devm_gpiod_get_optional(&i2c_client->dev, in cs42l84_i2c_probe()
995 if (IS_ERR(cs42l84->reset_gpio)) { in cs42l84_i2c_probe()
996 ret = PTR_ERR(cs42l84->reset_gpio); in cs42l84_i2c_probe()
1000 if (cs42l84->reset_gpio) { in cs42l84_i2c_probe()
1001 dev_dbg(&i2c_client->dev, "Found reset GPIO\n"); in cs42l84_i2c_probe()
1002 gpiod_set_value_cansleep(cs42l84->reset_gpio, 1); in cs42l84_i2c_probe()
1007 if (i2c_client->irq) { in cs42l84_i2c_probe()
1008 ret = request_threaded_irq(i2c_client->irq, in cs42l84_i2c_probe()
1012 if (ret == -EPROBE_DEFER) { in cs42l84_i2c_probe()
1015 dev_err(&i2c_client->dev, in cs42l84_i2c_probe()
1022 devid = cirrus_read_device_id(cs42l84->regmap, CS42L84_DEVID); in cs42l84_i2c_probe()
1025 dev_err(&i2c_client->dev, "Failed to read device ID: %d\n", ret); in cs42l84_i2c_probe()
1030 dev_err(&i2c_client->dev, in cs42l84_i2c_probe()
1033 ret = -EINVAL; in cs42l84_i2c_probe()
1037 ret = regmap_read(cs42l84->regmap, CS42L84_REVID, ®); in cs42l84_i2c_probe()
1039 dev_err(&i2c_client->dev, "Get Revision ID failed\n"); in cs42l84_i2c_probe()
1043 dev_info(&i2c_client->dev, in cs42l84_i2c_probe()
1053 ret = devm_snd_soc_register_component(&i2c_client->dev, in cs42l84_i2c_probe()
1064 if (i2c_client->irq) in cs42l84_i2c_probe()
1065 free_irq(i2c_client->irq, cs42l84); in cs42l84_i2c_probe()
1068 gpiod_set_value_cansleep(cs42l84->reset_gpio, 0); in cs42l84_i2c_probe()
1077 if (i2c_client->irq) in cs42l84_i2c_remove()
1078 free_irq(i2c_client->irq, cs42l84); in cs42l84_i2c_remove()
1080 gpiod_set_value_cansleep(cs42l84->reset_gpio, 0); in cs42l84_i2c_remove()