Lines Matching +full:codec +full:- +full:aif1 +full:- +full:lrclk
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * max98390.c -- MAX98390 ALSA Soc Audio driver
168 struct snd_soc_component *component = codec_dai->component; in max98390_dai_set_fmt()
175 dev_dbg(component->dev, "%s: fmt 0x%08X\n", __func__, fmt); in max98390_dai_set_fmt()
182 max98390->master = true; in max98390_dai_set_fmt()
186 dev_err(component->dev, "DAI clock mode unsupported\n"); in max98390_dai_set_fmt()
187 return -EINVAL; in max98390_dai_set_fmt()
190 regmap_update_bits(max98390->regmap, in max98390_dai_set_fmt()
202 dev_err(component->dev, "DAI invert mode unsupported\n"); in max98390_dai_set_fmt()
203 return -EINVAL; in max98390_dai_set_fmt()
206 regmap_update_bits(max98390->regmap, in max98390_dai_set_fmt()
226 return -EINVAL; in max98390_dai_set_fmt()
229 regmap_update_bits(max98390->regmap, in max98390_dai_set_fmt()
240 /* BCLKs per LRCLK */ in max98390_get_bclk_sel()
244 /* match BCLKs per LRCLK */ in max98390_get_bclk_sel()
257 /* codec MCLK rate in master mode */ in max98390_set_clock()
263 /* BCLK/LRCLK ratio calculation */ in max98390_set_clock()
268 if (max98390->master) { in max98390_set_clock()
272 if (rate_table[i] >= max98390->sysclk) in max98390_set_clock()
276 dev_err(component->dev, "failed to find proper clock rate.\n"); in max98390_set_clock()
277 return -EINVAL; in max98390_set_clock()
280 regmap_update_bits(max98390->regmap, in max98390_set_clock()
286 if (!max98390->tdm_mode) { in max98390_set_clock()
290 dev_err(component->dev, "format unsupported %d\n", in max98390_set_clock()
292 return -EINVAL; in max98390_set_clock()
295 regmap_update_bits(max98390->regmap, in max98390_set_clock()
308 dai->component; in max98390_dai_hw_params()
327 dev_err(component->dev, "format unsupported %d\n", in max98390_dai_hw_params()
332 regmap_update_bits(max98390->regmap, in max98390_dai_hw_params()
336 dev_dbg(component->dev, "format supported %d", in max98390_dai_hw_params()
369 dev_err(component->dev, "rate %d not supported\n", in max98390_dai_hw_params()
374 /* set DAI_SR to correct LRCLK frequency */ in max98390_dai_hw_params()
375 regmap_update_bits(max98390->regmap, in max98390_dai_hw_params()
382 return -EINVAL; in max98390_dai_hw_params()
389 struct snd_soc_component *component = dai->component; in max98390_dai_tdm_slot()
397 max98390->tdm_mode = false; in max98390_dai_tdm_slot()
399 max98390->tdm_mode = true; in max98390_dai_tdm_slot()
401 dev_dbg(component->dev, in max98390_dai_tdm_slot()
402 "Tdm mode : %d\n", max98390->tdm_mode); in max98390_dai_tdm_slot()
407 dev_err(component->dev, "BCLK %d not supported\n", in max98390_dai_tdm_slot()
409 return -EINVAL; in max98390_dai_tdm_slot()
412 regmap_update_bits(max98390->regmap, in max98390_dai_tdm_slot()
429 dev_err(component->dev, "format unsupported %d\n", in max98390_dai_tdm_slot()
431 return -EINVAL; in max98390_dai_tdm_slot()
434 regmap_update_bits(max98390->regmap, in max98390_dai_tdm_slot()
439 regmap_write(max98390->regmap, in max98390_dai_tdm_slot()
442 regmap_write(max98390->regmap, in max98390_dai_tdm_slot()
446 /* Tx slot Hi-Z configuration */ in max98390_dai_tdm_slot()
447 regmap_write(max98390->regmap, in max98390_dai_tdm_slot()
450 regmap_write(max98390->regmap, in max98390_dai_tdm_slot()
460 struct snd_soc_component *component = dai->component; in max98390_dai_set_sysclk()
464 max98390->sysclk = freq; in max98390_dai_set_sysclk()
479 snd_soc_dapm_to_component(w->dapm); in max98390_dac_event()
485 regmap_update_bits(max98390->regmap, in max98390_dac_event()
488 regmap_update_bits(max98390->regmap, in max98390_dac_event()
493 regmap_update_bits(max98390->regmap, in max98390_dac_event()
496 regmap_update_bits(max98390->regmap, in max98390_dac_event()
519 static DECLARE_TLV_DB_SCALE(max98390_digital_tlv, -8000, 50, 0);
545 max98390->ref_rdc_value = ucontrol->value.integer.value[0]; in max98390_ref_rdc_put()
547 regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE0, in max98390_ref_rdc_put()
548 max98390->ref_rdc_value & 0x000000ff); in max98390_ref_rdc_put()
549 regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE1, in max98390_ref_rdc_put()
550 (max98390->ref_rdc_value >> 8) & 0x000000ff); in max98390_ref_rdc_put()
551 regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE2, in max98390_ref_rdc_put()
552 (max98390->ref_rdc_value >> 16) & 0x000000ff); in max98390_ref_rdc_put()
565 ucontrol->value.integer.value[0] = max98390->ref_rdc_value; in max98390_ref_rdc_get()
578 max98390->ambient_temp_value = ucontrol->value.integer.value[0]; in max98390_ambient_temp_put()
580 regmap_write(max98390->regmap, DSM_TPROT_ROOM_TEMPERATURE_BYTE1, in max98390_ambient_temp_put()
581 (max98390->ambient_temp_value >> 8) & 0x000000ff); in max98390_ambient_temp_put()
582 regmap_write(max98390->regmap, DSM_TPROT_ROOM_TEMPERATURE_BYTE0, in max98390_ambient_temp_put()
583 (max98390->ambient_temp_value) & 0x000000ff); in max98390_ambient_temp_put()
596 ucontrol->value.integer.value[0] = max98390->ambient_temp_value; in max98390_ambient_temp_get()
607 dev_warn(component->dev, "Put adaptive rdc not supported\n"); in max98390_adaptive_rdc_put()
621 regmap_read(max98390->regmap, THERMAL_RDC_RD_BACK_BYTE1, &rdc); in max98390_adaptive_rdc_get()
622 regmap_read(max98390->regmap, THERMAL_RDC_RD_BACK_BYTE0, &rdc0); in max98390_adaptive_rdc_get()
623 ucontrol->value.integer.value[0] = rdc0 | rdc << 8; in max98390_adaptive_rdc_get()
735 .name = "max98390-aif1",
774 ret = request_firmware(&fw, filename, component->dev); in max98390_dsm_init()
776 ret = request_firmware(&fw, "dsm_param.bin", component->dev); in max98390_dsm_init()
781 dev_dbg(component->dev, in max98390_dsm_init()
783 fw->size); in max98390_dsm_init()
784 if (fw->size < MAX98390_DSM_PARAM_MIN_SIZE) { in max98390_dsm_init()
785 dev_err(component->dev, in max98390_dsm_init()
787 ret = -EINVAL; in max98390_dsm_init()
790 dsm_param = (char *)fw->data; in max98390_dsm_init()
795 fw->size < param_size + MAX98390_DSM_PAYLOAD_OFFSET) { in max98390_dsm_init()
796 dev_err(component->dev, in max98390_dsm_init()
798 ret = -EINVAL; in max98390_dsm_init()
801 regmap_write(max98390->regmap, MAX98390_R203A_AMP_EN, 0x80); in max98390_dsm_init()
803 regmap_bulk_write(max98390->regmap, param_start_addr, in max98390_dsm_init()
805 regmap_write(max98390->regmap, MAX98390_R23E1_DSP_GLOBAL_EN, 0x01); in max98390_dsm_init()
820 regmap_write(max98390->regmap, MAX98390_R203A_AMP_EN, 0x81); in max98390_dsm_calibrate()
821 regmap_write(max98390->regmap, MAX98390_R23FF_GLOBAL_EN, 0x01); in max98390_dsm_calibrate()
823 regmap_read(max98390->regmap, in max98390_dsm_calibrate()
825 regmap_read(max98390->regmap, in max98390_dsm_calibrate()
829 max98390->ref_rdc_value = 268435456U / rdc_cal_result; in max98390_dsm_calibrate()
831 regmap_read(max98390->regmap, MAX98390_MEAS_ADC_CH2_READ, &temp); in max98390_dsm_calibrate()
832 max98390->ambient_temp_value = temp * 52 - 1188; in max98390_dsm_calibrate()
836 - (rdc_integer * 100); in max98390_dsm_calibrate()
838 dev_info(component->dev, "rdc resistance about %d.%02d ohm, reg=0x%X temp reg=0x%X\n", in max98390_dsm_calibrate()
841 regmap_write(max98390->regmap, MAX98390_R23FF_GLOBAL_EN, 0x00); in max98390_dsm_calibrate()
842 regmap_write(max98390->regmap, MAX98390_R203A_AMP_EN, 0x80); in max98390_dsm_calibrate()
852 regmap_write(max98390->regmap, MAX98390_CLK_MON, 0x6f); in max98390_init_regs()
853 regmap_write(max98390->regmap, MAX98390_DAT_MON, 0x00); in max98390_init_regs()
854 regmap_write(max98390->regmap, MAX98390_PWR_GATE_CTL, 0x00); in max98390_init_regs()
855 regmap_write(max98390->regmap, MAX98390_PCM_RX_EN_A, 0x03); in max98390_init_regs()
856 regmap_write(max98390->regmap, MAX98390_ENV_TRACK_VOUT_HEADROOM, 0x0e); in max98390_init_regs()
857 regmap_write(max98390->regmap, MAX98390_BOOST_BYPASS1, 0x46); in max98390_init_regs()
858 regmap_write(max98390->regmap, MAX98390_FET_SCALING3, 0x03); in max98390_init_regs()
866 regmap_write(max98390->regmap, MAX98390_SOFTWARE_RESET, 0x01); in max98390_probe()
876 if (max98390->ref_rdc_value) { in max98390_probe()
877 regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE0, in max98390_probe()
878 max98390->ref_rdc_value & 0x000000ff); in max98390_probe()
879 regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE1, in max98390_probe()
880 (max98390->ref_rdc_value >> 8) & 0x000000ff); in max98390_probe()
881 regmap_write(max98390->regmap, DSM_TPROT_RECIP_RDC_ROOM_BYTE2, in max98390_probe()
882 (max98390->ref_rdc_value >> 16) & 0x000000ff); in max98390_probe()
884 if (max98390->ambient_temp_value) { in max98390_probe()
885 regmap_write(max98390->regmap, DSM_TPROT_ROOM_TEMPERATURE_BYTE1, in max98390_probe()
886 (max98390->ambient_temp_value >> 8) & 0x000000ff); in max98390_probe()
887 regmap_write(max98390->regmap, DSM_TPROT_ROOM_TEMPERATURE_BYTE0, in max98390_probe()
888 (max98390->ambient_temp_value) & 0x000000ff); in max98390_probe()
901 regcache_cache_only(max98390->regmap, true); in max98390_suspend()
902 regcache_mark_dirty(max98390->regmap); in max98390_suspend()
913 regcache_cache_only(max98390->regmap, false); in max98390_resume()
914 regcache_sync(max98390->regmap); in max98390_resume()
956 struct i2c_adapter *adapter = to_i2c_adapter(i2c->dev.parent); in max98390_i2c_probe()
962 dev_err(&i2c->dev, "I2C check functionality failed\n"); in max98390_i2c_probe()
963 return -ENXIO; in max98390_i2c_probe()
966 max98390 = devm_kzalloc(&i2c->dev, sizeof(*max98390), GFP_KERNEL); in max98390_i2c_probe()
968 ret = -ENOMEM; in max98390_i2c_probe()
973 ret = device_property_read_u32(&i2c->dev, "maxim,temperature_calib", in max98390_i2c_probe()
974 &max98390->ambient_temp_value); in max98390_i2c_probe()
976 dev_info(&i2c->dev, in max98390_i2c_probe()
979 ret = device_property_read_u32(&i2c->dev, "maxim,r0_calib", in max98390_i2c_probe()
980 &max98390->ref_rdc_value); in max98390_i2c_probe()
982 dev_info(&i2c->dev, in max98390_i2c_probe()
986 dev_info(&i2c->dev, in max98390_i2c_probe()
988 __func__, max98390->ref_rdc_value, in max98390_i2c_probe()
989 max98390->ambient_temp_value); in max98390_i2c_probe()
992 max98390->regmap = devm_regmap_init_i2c(i2c, &max98390_regmap); in max98390_i2c_probe()
993 if (IS_ERR(max98390->regmap)) { in max98390_i2c_probe()
994 ret = PTR_ERR(max98390->regmap); in max98390_i2c_probe()
995 dev_err(&i2c->dev, in max98390_i2c_probe()
1001 ret = regmap_read(max98390->regmap, in max98390_i2c_probe()
1004 dev_err(&i2c->dev, in max98390_i2c_probe()
1009 dev_info(&i2c->dev, "MAX98390 revisionID: 0x%02X\n", reg); in max98390_i2c_probe()
1011 ret = devm_snd_soc_register_component(&i2c->dev, in max98390_i2c_probe()