Lines Matching full:rv1106

3  * rv1106_codec.c - Rockchip RV1106 SoC Codec Driver
32 #define CODEC_DRV_NAME "rv1106-acodec"
143 static int rv1106_codec_adc_enable(struct rv1106_codec_priv *rv1106);
144 static int rv1106_codec_adc_disable(struct rv1106_codec_priv *rv1106);
146 static int rv1106_codec_micbias_enable(struct rv1106_codec_priv *rv1106,
152 static int rv1106_codec_micbias_disable(struct rv1106_codec_priv *rv1106);
447 static int check_adc_mode(struct rv1106_codec_priv *rv1106) in check_adc_mode() argument
449 if (rv1106->soc_id == SOC_RV1103 && in check_adc_mode()
450 (rv1106->adc_mode == DIFF_ADCLR || in check_adc_mode()
451 rv1106->adc_mode == DIFF_ADCR)) { in check_adc_mode()
452 dev_err(rv1106->plat_dev, in check_adc_mode()
464 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_codec_adc_mode_get() local
466 ucontrol->value.integer.value[0] = rv1106->adc_mode; in rv1106_codec_adc_mode_get()
475 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_codec_adc_mode_put() local
476 unsigned int last_mode = rv1106->adc_mode; in rv1106_codec_adc_mode_put()
478 rv1106->adc_mode = ucontrol->value.integer.value[0]; in rv1106_codec_adc_mode_put()
479 if (check_adc_mode(rv1106)) { in rv1106_codec_adc_mode_put()
480 dev_err(rv1106->plat_dev, in rv1106_codec_adc_mode_put()
482 rv1106->adc_mode = last_mode; in rv1106_codec_adc_mode_put()
493 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_codec_agc_get() local
497 ucontrol->value.integer.value[0] = rv1106->agc_r; in rv1106_codec_agc_get()
499 ucontrol->value.integer.value[0] = rv1106->agc_l; in rv1106_codec_agc_get()
508 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_codec_agc_put() local
516 regmap_update_bits(rv1106->regmap, ACODEC_ADC_PGA_AGC_R_CTL9, in rv1106_codec_agc_put()
519 regmap_update_bits(rv1106->regmap, ACODEC_ADC_HPF_PGA_CTL, in rv1106_codec_agc_put()
523 rv1106->agc_r = 1; in rv1106_codec_agc_put()
526 regmap_update_bits(rv1106->regmap, ACODEC_ADC_PGA_AGC_L_CTL9, in rv1106_codec_agc_put()
529 regmap_update_bits(rv1106->regmap, ACODEC_ADC_HPF_PGA_CTL, in rv1106_codec_agc_put()
533 rv1106->agc_l = 1; in rv1106_codec_agc_put()
539 regmap_update_bits(rv1106->regmap, ACODEC_ADC_PGA_AGC_R_CTL9, in rv1106_codec_agc_put()
542 regmap_update_bits(rv1106->regmap, ACODEC_ADC_HPF_PGA_CTL, in rv1106_codec_agc_put()
546 rv1106->agc_r = 0; in rv1106_codec_agc_put()
549 regmap_update_bits(rv1106->regmap, ACODEC_ADC_PGA_AGC_L_CTL9, in rv1106_codec_agc_put()
552 regmap_update_bits(rv1106->regmap, ACODEC_ADC_HPF_PGA_CTL, in rv1106_codec_agc_put()
556 rv1106->agc_l = 0; in rv1106_codec_agc_put()
567 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_codec_agc_asr_get() local
572 regmap_read(rv1106->regmap, ACODEC_ADC_PGA_AGC_R_CTL4, &value); in rv1106_codec_agc_asr_get()
573 rv1106->agc_asr_r = value >> ACODEC_AGC_APPROX_RATE_SFT; in rv1106_codec_agc_asr_get()
574 ucontrol->value.integer.value[0] = rv1106->agc_asr_r; in rv1106_codec_agc_asr_get()
576 regmap_read(rv1106->regmap, ACODEC_ADC_PGA_AGC_L_CTL4, &value); in rv1106_codec_agc_asr_get()
577 rv1106->agc_asr_l = value >> ACODEC_AGC_APPROX_RATE_SFT; in rv1106_codec_agc_asr_get()
578 ucontrol->value.integer.value[0] = rv1106->agc_asr_l; in rv1106_codec_agc_asr_get()
588 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_codec_agc_asr_put() local
596 regmap_update_bits(rv1106->regmap, ACODEC_ADC_PGA_AGC_R_CTL4, in rv1106_codec_agc_asr_put()
599 rv1106->agc_asr_r = ucontrol->value.integer.value[0]; in rv1106_codec_agc_asr_put()
602 regmap_update_bits(rv1106->regmap, ACODEC_ADC_PGA_AGC_L_CTL4, in rv1106_codec_agc_asr_put()
605 rv1106->agc_asr_l = ucontrol->value.integer.value[0]; in rv1106_codec_agc_asr_put()
615 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_codec_mic_mute_get() local
621 regmap_read(rv1106->regmap, ACODEC_ADC_BIST_MODE_SEL, &value); in rv1106_codec_mic_mute_get()
622 rv1106->mic_mute_r = (value & ACODEC_ADC_R_BIST_SINE) >> in rv1106_codec_mic_mute_get()
624 ucontrol->value.integer.value[0] = rv1106->mic_mute_r; in rv1106_codec_mic_mute_get()
627 regmap_read(rv1106->regmap, ACODEC_ADC_BIST_MODE_SEL, &value); in rv1106_codec_mic_mute_get()
628 rv1106->mic_mute_l = (value & ACODEC_ADC_L_BIST_SINE) >> in rv1106_codec_mic_mute_get()
630 ucontrol->value.integer.value[0] = rv1106->mic_mute_l; in rv1106_codec_mic_mute_get()
640 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_codec_mic_mute_put() local
647 regmap_update_bits(rv1106->regmap, ACODEC_ADC_BIST_MODE_SEL, in rv1106_codec_mic_mute_put()
650 rv1106->mic_mute_r = ucontrol->value.integer.value[0]; in rv1106_codec_mic_mute_put()
654 regmap_update_bits(rv1106->regmap, ACODEC_ADC_BIST_MODE_SEL, in rv1106_codec_mic_mute_put()
657 rv1106->mic_mute_l = ucontrol->value.integer.value[0]; in rv1106_codec_mic_mute_put()
667 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_codec_micbias_volts_get() local
669 ucontrol->value.integer.value[0] = rv1106->micbias_volt; in rv1106_codec_micbias_volts_get()
678 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_codec_micbias_volts_put() local
684 dev_err(rv1106->plat_dev, "Invalid micbias volt: %d\n", in rv1106_codec_micbias_volts_put()
689 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL0, in rv1106_codec_micbias_volts_put()
693 rv1106->micbias_volt = volt; in rv1106_codec_micbias_volts_put()
702 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_codec_main_micbias_get() local
704 ucontrol->value.integer.value[0] = rv1106->micbias_enable; in rv1106_codec_main_micbias_get()
713 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_codec_main_micbias_put() local
717 if (!rv1106->micbias_enable) in rv1106_codec_main_micbias_put()
718 rv1106_codec_micbias_enable(rv1106, rv1106->micbias_volt); in rv1106_codec_main_micbias_put()
720 if (rv1106->micbias_enable) in rv1106_codec_main_micbias_put()
721 rv1106_codec_micbias_disable(rv1106); in rv1106_codec_main_micbias_put()
737 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_codec_mic_gain_put() local
748 dev_err(rv1106->plat_dev, "%s: invalid mic gain index: %d\n", in rv1106_codec_mic_gain_put()
760 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_codec_hpf_get() local
763 regmap_read(rv1106->regmap, ACODEC_ADC_HPF_PGA_CTL, &value); in rv1106_codec_hpf_get()
765 rv1106->hpf_cutoff = 1; in rv1106_codec_hpf_get()
767 rv1106->hpf_cutoff = 0; in rv1106_codec_hpf_get()
769 ucontrol->value.integer.value[0] = rv1106->hpf_cutoff; in rv1106_codec_hpf_get()
778 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_codec_hpf_put() local
783 regmap_update_bits(rv1106->regmap, ACODEC_ADC_HPF_PGA_CTL, in rv1106_codec_hpf_put()
788 regmap_update_bits(rv1106->regmap, ACODEC_ADC_HPF_PGA_CTL, in rv1106_codec_hpf_put()
793 rv1106->hpf_cutoff = value; in rv1106_codec_hpf_put()
798 static void rv1106_codec_pa_ctrl(struct rv1106_codec_priv *rv1106, bool on) in rv1106_codec_pa_ctrl() argument
800 if (!rv1106->pa_ctl_gpio) in rv1106_codec_pa_ctrl()
804 gpiod_direction_output(rv1106->pa_ctl_gpio, on); in rv1106_codec_pa_ctrl()
805 msleep(rv1106->pa_ctl_delay_ms); in rv1106_codec_pa_ctrl()
807 gpiod_direction_output(rv1106->pa_ctl_gpio, on); in rv1106_codec_pa_ctrl()
813 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_codec_reset() local
815 reset_control_assert(rv1106->reset); in rv1106_codec_reset()
817 reset_control_deassert(rv1106->reset); in rv1106_codec_reset()
819 regmap_write(rv1106->regmap, ACODEC_GLB_CON, 0x00); in rv1106_codec_reset()
821 regmap_write(rv1106->regmap, ACODEC_GLB_CON, in rv1106_codec_reset()
831 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_set_bias_level() local
839 regcache_cache_only(rv1106->regmap, false); in rv1106_set_bias_level()
840 regcache_sync(rv1106->regmap); in rv1106_set_bias_level()
853 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_set_dai_fmt() local
923 regmap_update_bits(rv1106->regmap, ACODEC_ADC_I2S_CTL0, in rv1106_set_dai_fmt()
927 regmap_update_bits(rv1106->regmap, ACODEC_ADC_I2S_CTL1, in rv1106_set_dai_fmt()
933 regmap_update_bits(rv1106->regmap, ACODEC_DAC_I2S_CTL0, in rv1106_set_dai_fmt()
937 regmap_update_bits(rv1106->regmap, ACODEC_ADC_I2S_CTL1, in rv1106_set_dai_fmt()
946 static int rv1106_codec_dac_dig_config(struct rv1106_codec_priv *rv1106, in rv1106_codec_dac_dig_config() argument
971 regmap_update_bits(rv1106->regmap, ACODEC_DAC_I2S_CTL0, in rv1106_codec_dac_dig_config()
975 regmap_update_bits(rv1106->regmap, ACODEC_DAC_I2S_CTL1, in rv1106_codec_dac_dig_config()
982 static int rv1106_codec_adc_dig_config(struct rv1106_codec_priv *rv1106, in rv1106_codec_adc_dig_config() argument
1007 regmap_update_bits(rv1106->regmap, ACODEC_ADC_I2S_CTL0, in rv1106_codec_adc_dig_config()
1011 regmap_update_bits(rv1106->regmap, ACODEC_ADC_I2S_CTL1, in rv1106_codec_adc_dig_config()
1021 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_mute_stream() local
1026 regmap_update_bits(rv1106->regmap, in rv1106_mute_stream()
1030 regmap_update_bits(rv1106->regmap, in rv1106_mute_stream()
1034 rv1106_codec_pa_ctrl(rv1106, false); in rv1106_mute_stream()
1037 regmap_update_bits(rv1106->regmap, in rv1106_mute_stream()
1041 regmap_update_bits(rv1106->regmap, in rv1106_mute_stream()
1045 rv1106_codec_pa_ctrl(rv1106, true); in rv1106_mute_stream()
1052 static int rv1106_codec_dac_enable(struct rv1106_codec_priv *rv1106) in rv1106_codec_dac_enable() argument
1055 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL0, in rv1106_codec_dac_enable()
1061 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL0, in rv1106_codec_dac_enable()
1068 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL1, in rv1106_codec_dac_enable()
1074 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL1, in rv1106_codec_dac_enable()
1080 regmap_update_bits(rv1106->regmap, ACODEC_DAC_HPMIX_CTL, in rv1106_codec_dac_enable()
1086 regmap_update_bits(rv1106->regmap, ACODEC_DAC_HPMIX_CTL, in rv1106_codec_dac_enable()
1092 regmap_update_bits(rv1106->regmap, ACODEC_DAC_HPMIX_CTL, in rv1106_codec_dac_enable()
1099 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL0, in rv1106_codec_dac_enable()
1105 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL0, in rv1106_codec_dac_enable()
1111 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL0, in rv1106_codec_dac_enable()
1117 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL0, in rv1106_codec_dac_enable()
1123 regmap_update_bits(rv1106->regmap, ACODEC_DAC_HPMIX_CTL, in rv1106_codec_dac_enable()
1129 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL1, in rv1106_codec_dac_enable()
1135 rv1106->dac_enable = true; in rv1106_codec_dac_enable()
1139 static int rv1106_codec_dac_disable(struct rv1106_codec_priv *rv1106) in rv1106_codec_dac_disable() argument
1145 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL1, in rv1106_codec_dac_disable()
1150 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL1, in rv1106_codec_dac_disable()
1154 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL1, in rv1106_codec_dac_disable()
1158 regmap_update_bits(rv1106->regmap, ACODEC_DAC_HPMIX_CTL, in rv1106_codec_dac_disable()
1162 regmap_update_bits(rv1106->regmap, ACODEC_DAC_HPMIX_CTL, in rv1106_codec_dac_disable()
1166 regmap_update_bits(rv1106->regmap, ACODEC_DAC_HPMIX_CTL, in rv1106_codec_dac_disable()
1170 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL0, in rv1106_codec_dac_disable()
1174 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL0, in rv1106_codec_dac_disable()
1179 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL0, in rv1106_codec_dac_disable()
1183 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL0, in rv1106_codec_dac_disable()
1188 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL0, in rv1106_codec_dac_disable()
1193 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL0, in rv1106_codec_dac_disable()
1198 rv1106->dac_enable = false; in rv1106_codec_dac_disable()
1203 static int rv1106_codec_power_on(struct rv1106_codec_priv *rv1106) in rv1106_codec_power_on() argument
1206 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL0, in rv1106_codec_power_on()
1210 regmap_update_bits(rv1106->regmap, ACODEC_CURRENT_CHARGE_CTL, in rv1106_codec_power_on()
1215 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL0, in rv1106_codec_power_on()
1220 regmap_update_bits(rv1106->regmap, ACODEC_CURRENT_CHARGE_CTL, in rv1106_codec_power_on()
1226 static int rv1106_codec_power_off(struct rv1106_codec_priv *rv1106) in rv1106_codec_power_off() argument
1233 regmap_update_bits(rv1106->regmap, ACODEC_CURRENT_CHARGE_CTL, in rv1106_codec_power_off()
1237 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL0, in rv1106_codec_power_off()
1246 static int rv1106_codec_adc_i2s_route(struct rv1106_codec_priv *rv1106) in rv1106_codec_adc_i2s_route() argument
1248 regmap_write(rv1106->grf, PERI_GRF_PERI_CON1, in rv1106_codec_adc_i2s_route()
1270 static int rv1106_codec_micbias_enable(struct rv1106_codec_priv *rv1106, in rv1106_codec_micbias_enable() argument
1275 if (!rv1106->micbias_used) in rv1106_codec_micbias_enable()
1283 dev_err(rv1106->plat_dev, "This is an invalid volt: %d\n", in rv1106_codec_micbias_enable()
1288 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL0, in rv1106_codec_micbias_enable()
1293 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL0, in rv1106_codec_micbias_enable()
1300 rv1106->micbias_enable = true; in rv1106_codec_micbias_enable()
1305 static int rv1106_codec_micbias_disable(struct rv1106_codec_priv *rv1106) in rv1106_codec_micbias_disable() argument
1307 if (!rv1106->micbias_used) in rv1106_codec_micbias_disable()
1314 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL0, in rv1106_codec_micbias_disable()
1318 rv1106->micbias_enable = false; in rv1106_codec_micbias_disable()
1333 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_codec_hpmix_gain_put() local
1338 dev_err(rv1106->plat_dev, "%s: invalid gain index: %d\n", in rv1106_codec_hpmix_gain_put()
1346 static int rv1106_codec_adc_enable(struct rv1106_codec_priv *rv1106) in rv1106_codec_adc_enable() argument
1348 unsigned int lr = using_adc_lr(rv1106->adc_mode); in rv1106_codec_adc_enable()
1349 bool is_diff = using_adc_diff(rv1106->adc_mode); in rv1106_codec_adc_enable()
1353 dev_dbg(rv1106->plat_dev, "%s: soc_id: 0x%x lr: %d is_diff: %d\n", in rv1106_codec_adc_enable()
1354 __func__, rv1106->soc_id, lr, is_diff); in rv1106_codec_adc_enable()
1356 ret = check_adc_mode(rv1106); in rv1106_codec_adc_enable()
1358 dev_err(rv1106->plat_dev, in rv1106_codec_adc_enable()
1365 if (rv1106->soc_id == SOC_RV1103 && rv1106->adc_mode == DIFF_ADCL) { in rv1106_codec_adc_enable()
1367 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL3, in rv1106_codec_adc_enable()
1370 } else if (rv1106->soc_id == SOC_RV1106 && is_diff) { in rv1106_codec_adc_enable()
1371 /* The differential mode on rv1106 */ in rv1106_codec_adc_enable()
1372 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL3, in rv1106_codec_adc_enable()
1379 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL3, in rv1106_codec_adc_enable()
1387 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL1, in rv1106_codec_adc_enable()
1394 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL0, in rv1106_codec_adc_enable()
1399 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL1, in rv1106_codec_adc_enable()
1408 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL3, in rv1106_codec_adc_enable()
1415 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL3, in rv1106_codec_adc_enable()
1422 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL6, in rv1106_codec_adc_enable()
1429 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL6, in rv1106_codec_adc_enable()
1436 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL6, in rv1106_codec_adc_enable()
1443 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL6, in rv1106_codec_adc_enable()
1450 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL1, in rv1106_codec_adc_enable()
1461 regmap_read(rv1106->regmap, ACODEC_ADC_ANA_CTL1, &agc_func_en); in rv1106_codec_adc_enable()
1463 regmap_update_bits(rv1106->regmap, in rv1106_codec_adc_enable()
1471 rv1106->adc_enable = true; in rv1106_codec_adc_enable()
1476 static int rv1106_codec_adc_disable(struct rv1106_codec_priv *rv1106) in rv1106_codec_adc_disable() argument
1479 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL1, in rv1106_codec_adc_disable()
1486 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL6, in rv1106_codec_adc_disable()
1493 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL6, in rv1106_codec_adc_disable()
1500 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL3, in rv1106_codec_adc_disable()
1507 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL3, in rv1106_codec_adc_disable()
1514 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL1, in rv1106_codec_adc_disable()
1521 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL0, in rv1106_codec_adc_disable()
1526 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL6, in rv1106_codec_adc_disable()
1533 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL6, in rv1106_codec_adc_disable()
1540 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL1, in rv1106_codec_adc_disable()
1546 rv1106->adc_enable = false; in rv1106_codec_adc_disable()
1551 static int rv1106_codec_open_capture(struct rv1106_codec_priv *rv1106) in rv1106_codec_open_capture() argument
1553 rv1106_codec_adc_enable(rv1106); in rv1106_codec_open_capture()
1558 static int rv1106_codec_close_capture(struct rv1106_codec_priv *rv1106) in rv1106_codec_close_capture() argument
1560 rv1106_codec_adc_disable(rv1106); in rv1106_codec_close_capture()
1564 static int rv1106_codec_open_playback(struct rv1106_codec_priv *rv1106) in rv1106_codec_open_playback() argument
1566 rv1106_codec_dac_enable(rv1106); in rv1106_codec_open_playback()
1570 static int rv1106_codec_close_playback(struct rv1106_codec_priv *rv1106) in rv1106_codec_close_playback() argument
1572 rv1106_codec_dac_disable(rv1106); in rv1106_codec_close_playback()
1576 static int rv1106_codec_dlp_down(struct rv1106_codec_priv *rv1106) in rv1106_codec_dlp_down() argument
1578 rv1106_codec_micbias_disable(rv1106); in rv1106_codec_dlp_down()
1579 rv1106_codec_power_off(rv1106); in rv1106_codec_dlp_down()
1583 static int rv1106_codec_dlp_up(struct rv1106_codec_priv *rv1106) in rv1106_codec_dlp_up() argument
1585 rv1106_codec_power_on(rv1106); in rv1106_codec_dlp_up()
1586 rv1106_codec_micbias_enable(rv1106, rv1106->micbias_volt); in rv1106_codec_dlp_up()
1595 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_hw_params() local
1598 rv1106_codec_open_playback(rv1106); in rv1106_hw_params()
1599 rv1106_codec_dac_dig_config(rv1106, params); in rv1106_hw_params()
1601 rv1106_codec_open_capture(rv1106); in rv1106_hw_params()
1602 rv1106_codec_adc_dig_config(rv1106, params); in rv1106_hw_params()
1612 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_pcm_shutdown() local
1615 rv1106_codec_close_playback(rv1106); in rv1106_pcm_shutdown()
1617 rv1106_codec_close_capture(rv1106); in rv1106_pcm_shutdown()
1619 regcache_cache_only(rv1106->regmap, false); in rv1106_pcm_shutdown()
1620 regcache_sync(rv1106->regmap); in rv1106_pcm_shutdown()
1632 .name = "rv1106-hifi",
1660 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_suspend() local
1662 rv1106_codec_dlp_down(rv1106); in rv1106_suspend()
1663 clk_disable_unprepare(rv1106->mclk_acodec); in rv1106_suspend()
1664 clk_disable_unprepare(rv1106->pclk_acodec); in rv1106_suspend()
1671 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_resume() local
1674 ret = clk_prepare_enable(rv1106->pclk_acodec); in rv1106_resume()
1676 dev_err(rv1106->plat_dev, in rv1106_resume()
1681 ret = clk_prepare_enable(rv1106->mclk_acodec); in rv1106_resume()
1683 dev_err(rv1106->plat_dev, in rv1106_resume()
1688 rv1106_codec_dlp_up(rv1106); in rv1106_resume()
1694 static int rv1106_codec_default_gains(struct rv1106_codec_priv *rv1106) in rv1106_codec_default_gains() argument
1704 if (rv1106->init_mic_gain == NOT_SPECIFIED) { in rv1106_codec_default_gains()
1708 gainl = ((rv1106->init_mic_gain >> 4) & 0x03) << ACODEC_ADC_L_MIC_GAIN_SFT; in rv1106_codec_default_gains()
1709 gainr = ((rv1106->init_mic_gain >> 0) & 0x03) << ACODEC_ADC_R_MIC_GAIN_SFT; in rv1106_codec_default_gains()
1714 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL2, in rv1106_codec_default_gains()
1725 if (rv1106->init_alc_gain == NOT_SPECIFIED) { in rv1106_codec_default_gains()
1729 gainl = ((rv1106->init_alc_gain >> 4) & 0x1f); in rv1106_codec_default_gains()
1730 gainr = ((rv1106->init_alc_gain >> 0) & 0x1f); in rv1106_codec_default_gains()
1733 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL4, in rv1106_codec_default_gains()
1736 regmap_update_bits(rv1106->regmap, ACODEC_ADC_ANA_CTL5, in rv1106_codec_default_gains()
1742 regmap_update_bits(rv1106->regmap, ACODEC_DAC_GAIN_SEL, in rv1106_codec_default_gains()
1751 if (rv1106->init_lineout_gain == NOT_SPECIFIED) in rv1106_codec_default_gains()
1754 gainl = rv1106->init_lineout_gain & 0x1f; in rv1106_codec_default_gains()
1755 regmap_update_bits(rv1106->regmap, ACODEC_DAC_ANA_CTL2, in rv1106_codec_default_gains()
1761 static int rv1106_codec_check_micbias(struct rv1106_codec_priv *rv1106, in rv1106_codec_check_micbias() argument
1765 rv1106->micbias_used = in rv1106_codec_check_micbias()
1769 rv1106->micbias_volt = ACODEC_ADC_MICBIAS_VOLT_0_9; in rv1106_codec_check_micbias()
1774 static int rv1106_codec_dapm_controls_prepare(struct rv1106_codec_priv *rv1106) in rv1106_codec_dapm_controls_prepare() argument
1776 rv1106->adc_mode = DIFF_ADCL; in rv1106_codec_dapm_controls_prepare()
1777 rv1106->hpf_cutoff = 0; in rv1106_codec_dapm_controls_prepare()
1778 rv1106->agc_l = 0; in rv1106_codec_dapm_controls_prepare()
1779 rv1106->agc_r = 0; in rv1106_codec_dapm_controls_prepare()
1780 rv1106->agc_asr_l = AGC_ASR_96KHZ; in rv1106_codec_dapm_controls_prepare()
1781 rv1106->agc_asr_r = AGC_ASR_96KHZ; in rv1106_codec_dapm_controls_prepare()
1786 static int rv1106_codec_prepare(struct rv1106_codec_priv *rv1106) in rv1106_codec_prepare() argument
1789 rv1106_codec_close_playback(rv1106); in rv1106_codec_prepare()
1790 rv1106_codec_close_capture(rv1106); in rv1106_codec_prepare()
1791 rv1106_codec_default_gains(rv1106); in rv1106_codec_prepare()
1792 rv1106_codec_dapm_controls_prepare(rv1106); in rv1106_codec_prepare()
1799 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_probe() local
1801 rv1106->component = component; in rv1106_probe()
1803 rv1106_codec_dlp_up(rv1106); in rv1106_probe()
1804 rv1106_codec_prepare(rv1106); in rv1106_probe()
1806 regcache_cache_only(rv1106->regmap, false); in rv1106_probe()
1807 regcache_sync(rv1106->regmap); in rv1106_probe()
1814 struct rv1106_codec_priv *rv1106 = snd_soc_component_get_drvdata(component); in rv1106_remove() local
1816 rv1106_codec_pa_ctrl(rv1106, false); in rv1106_remove()
1817 rv1106_codec_micbias_disable(rv1106); in rv1106_remove()
1818 rv1106_codec_power_off(rv1106); in rv1106_remove()
1819 regcache_cache_only(rv1106->regmap, false); in rv1106_remove()
1820 regcache_sync(rv1106->regmap); in rv1106_remove()
1867 struct rv1106_codec_priv *rv1106 = in adc_enable_show() local
1870 return sprintf(buf, "%d\n", rv1106->adc_enable); in adc_enable_show()
1877 struct rv1106_codec_priv *rv1106 = in adc_enable_store() local
1889 rv1106_codec_open_capture(rv1106); in adc_enable_store()
1891 rv1106_codec_close_capture(rv1106); in adc_enable_store()
1902 struct rv1106_codec_priv *rv1106 = in dac_enable_show() local
1905 return sprintf(buf, "%d\n", rv1106->dac_enable); in dac_enable_show()
1912 struct rv1106_codec_priv *rv1106 = in dac_enable_store() local
1924 rv1106_codec_open_playback(rv1106); in dac_enable_store()
1926 rv1106_codec_close_playback(rv1106); in dac_enable_store()
1944 struct rv1106_codec_priv *rv1106) in rv1106_codec_sysfs_init() argument
1946 struct device *dev = &rv1106->dev; in rv1106_codec_sysfs_init()
1973 static int rv1106_codec_sysfs_exit(struct rv1106_codec_priv *rv1106) in rv1106_codec_sysfs_exit() argument
1975 struct device *dev = &rv1106->dev; in rv1106_codec_sysfs_exit()
1988 struct rv1106_codec_priv *rv1106 = s->private; in rv1106_codec_debugfs_reg_show() local
1993 regmap_read(rv1106->regmap, i, &val); in rv1106_codec_debugfs_reg_show()
2008 struct rv1106_codec_priv *rv1106 = in rv1106_codec_debugfs_reg_operate() local
2030 regmap_write(rv1106->regmap, reg, val); in rv1106_codec_debugfs_reg_operate()
2031 regcache_cache_only(rv1106->regmap, false); in rv1106_codec_debugfs_reg_operate()
2032 regcache_sync(rv1106->regmap); in rv1106_codec_debugfs_reg_operate()
2035 regmap_read(rv1106->regmap, reg, &val); in rv1106_codec_debugfs_reg_operate()
2062 { .compatible = "rockchip,rv1106-codec", .data = (void *)SOC_RV1106},
2071 struct rv1106_codec_priv *rv1106; in rv1106_platform_probe() local
2076 rv1106 = devm_kzalloc(&pdev->dev, sizeof(*rv1106), GFP_KERNEL); in rv1106_platform_probe()
2077 if (!rv1106) in rv1106_platform_probe()
2082 rv1106->soc_id = (enum soc_id_e)of_id->data; in rv1106_platform_probe()
2083 dev_info(&pdev->dev, "current soc_id: rv%x\n", rv1106->soc_id); in rv1106_platform_probe()
2085 rv1106->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf"); in rv1106_platform_probe()
2086 if (IS_ERR(rv1106->grf)) in rv1106_platform_probe()
2087 return dev_err_probe(&pdev->dev, PTR_ERR(rv1106->grf), in rv1106_platform_probe()
2090 rv1106->plat_dev = &pdev->dev; in rv1106_platform_probe()
2091 rv1106->reset = devm_reset_control_get(&pdev->dev, "acodec-reset"); in rv1106_platform_probe()
2092 if (IS_ERR(rv1106->reset)) { in rv1106_platform_probe()
2093 ret = PTR_ERR(rv1106->reset); in rv1106_platform_probe()
2098 rv1106->reset = NULL; in rv1106_platform_probe()
2101 rv1106->init_mic_gain = NOT_SPECIFIED; in rv1106_platform_probe()
2102 of_property_read_u32(np, "init-mic-gain", &rv1106->init_mic_gain); in rv1106_platform_probe()
2104 rv1106->init_alc_gain = NOT_SPECIFIED; in rv1106_platform_probe()
2105 of_property_read_u32(np, "init-alc-gain", &rv1106->init_alc_gain); in rv1106_platform_probe()
2107 rv1106->init_lineout_gain = NOT_SPECIFIED; in rv1106_platform_probe()
2108 of_property_read_u32(np, "init-lineout-gain", &rv1106->init_lineout_gain); in rv1106_platform_probe()
2110 rv1106->pa_ctl_gpio = devm_gpiod_get_optional(&pdev->dev, "pa-ctl", in rv1106_platform_probe()
2112 if (IS_ERR(rv1106->pa_ctl_gpio)) in rv1106_platform_probe()
2113 return dev_err_probe(&pdev->dev, PTR_ERR(rv1106->pa_ctl_gpio), in rv1106_platform_probe()
2116 if (rv1106->pa_ctl_gpio) in rv1106_platform_probe()
2118 &rv1106->pa_ctl_delay_ms); in rv1106_platform_probe()
2121 rv1106->pa_ctl_gpio ? "Use" : "No use", in rv1106_platform_probe()
2122 rv1106->pa_ctl_delay_ms); in rv1106_platform_probe()
2125 rv1106_codec_pa_ctrl(rv1106, false); in rv1106_platform_probe()
2127 rv1106->pclk_acodec = devm_clk_get(&pdev->dev, "pclk_acodec"); in rv1106_platform_probe()
2128 if (IS_ERR(rv1106->pclk_acodec)) in rv1106_platform_probe()
2129 return dev_err_probe(&pdev->dev, PTR_ERR(rv1106->pclk_acodec), in rv1106_platform_probe()
2132 rv1106->mclk_acodec = devm_clk_get(&pdev->dev, "mclk_acodec"); in rv1106_platform_probe()
2133 if (IS_ERR(rv1106->mclk_acodec)) in rv1106_platform_probe()
2134 return dev_err_probe(&pdev->dev, PTR_ERR(rv1106->mclk_acodec), in rv1106_platform_probe()
2137 rv1106->mclk_cpu = devm_clk_get(&pdev->dev, "mclk_cpu"); in rv1106_platform_probe()
2138 if (IS_ERR(rv1106->mclk_cpu)) in rv1106_platform_probe()
2139 return dev_err_probe(&pdev->dev, PTR_ERR(rv1106->mclk_cpu), in rv1106_platform_probe()
2142 ret = rv1106_codec_sysfs_init(pdev, rv1106); in rv1106_platform_probe()
2147 rv1106->dbg_codec = debugfs_create_dir(CODEC_DRV_NAME, NULL); in rv1106_platform_probe()
2148 if (IS_ERR(rv1106->dbg_codec)) in rv1106_platform_probe()
2150 "Failed to create debugfs dir for rv1106!\n"); in rv1106_platform_probe()
2152 debugfs_create_file("reg", 0644, rv1106->dbg_codec, in rv1106_platform_probe()
2153 rv1106, &rv1106_codec_reg_debugfs_fops); in rv1106_platform_probe()
2156 ret = clk_prepare_enable(rv1106->pclk_acodec); in rv1106_platform_probe()
2162 ret = clk_prepare_enable(rv1106->mclk_acodec); in rv1106_platform_probe()
2175 clk_set_rate(rv1106->mclk_acodec, clk_get_rate(rv1106->mclk_cpu)); in rv1106_platform_probe()
2177 rv1106_codec_check_micbias(rv1106, np); in rv1106_platform_probe()
2179 ret = rv1106_codec_adc_i2s_route(rv1106); in rv1106_platform_probe()
2194 rv1106->regmap = devm_regmap_init_mmio(&pdev->dev, base, in rv1106_platform_probe()
2196 if (IS_ERR(rv1106->regmap)) { in rv1106_platform_probe()
2197 ret = PTR_ERR(rv1106->regmap); in rv1106_platform_probe()
2202 platform_set_drvdata(pdev, rv1106); in rv1106_platform_probe()
2213 clk_disable_unprepare(rv1106->mclk_acodec); in rv1106_platform_probe()
2215 clk_disable_unprepare(rv1106->pclk_acodec); in rv1106_platform_probe()
2218 debugfs_remove_recursive(rv1106->dbg_codec); in rv1106_platform_probe()
2220 rv1106_codec_sysfs_exit(rv1106); in rv1106_platform_probe()
2227 struct rv1106_codec_priv *rv1106 = in rv1106_platform_remove() local
2230 clk_disable_unprepare(rv1106->mclk_acodec); in rv1106_platform_remove()
2231 clk_disable_unprepare(rv1106->pclk_acodec); in rv1106_platform_remove()
2233 debugfs_remove_recursive(rv1106->dbg_codec); in rv1106_platform_remove()
2235 rv1106_codec_sysfs_exit(rv1106); in rv1106_platform_remove()
2250 MODULE_DESCRIPTION("ASoC RV1106 Codec Driver");