Lines Matching +full:i2c +full:- +full:crc +full:- +full:enable
1 // SPDX-License-Identifier: GPL-2.0-only
3 // aw88166.c -- ALSA SoC AW88166 codec support
13 #include <linux/i2c.h>
49 ret = regmap_write(aw_dev->regmap, AW88166_DSPMADD_REG, dsp_addr); in aw_dev_dsp_write_16bit()
51 dev_err(aw_dev->dev, "%s write addr error, ret=%d", __func__, ret); in aw_dev_dsp_write_16bit()
55 ret = regmap_write(aw_dev->regmap, AW88166_DSPMDAT_REG, (u16)dsp_data); in aw_dev_dsp_write_16bit()
57 dev_err(aw_dev->dev, "%s write data error, ret=%d", __func__, ret); in aw_dev_dsp_write_16bit()
70 ret = regmap_write(aw_dev->regmap, AW88166_DSPMADD_REG, dsp_addr); in aw_dev_dsp_read_16bit()
72 dev_err(aw_dev->dev, "%s write error, ret=%d", __func__, ret); in aw_dev_dsp_read_16bit()
76 ret = regmap_read(aw_dev->regmap, AW88166_DSPMDAT_REG, &temp_data); in aw_dev_dsp_read_16bit()
78 dev_err(aw_dev->dev, "%s read error, ret=%d", __func__, ret); in aw_dev_dsp_read_16bit()
92 ret = regmap_write(aw_dev->regmap, AW88166_DSPMADD_REG, dsp_addr); in aw_dev_dsp_read_32bit()
94 dev_err(aw_dev->dev, "%s write error, ret=%d", __func__, ret); in aw_dev_dsp_read_32bit()
98 ret = regmap_read(aw_dev->regmap, AW88166_DSPMDAT_REG, &temp_data); in aw_dev_dsp_read_32bit()
100 dev_err(aw_dev->dev, "%s read error, ret=%d", __func__, ret); in aw_dev_dsp_read_32bit()
105 ret = regmap_read(aw_dev->regmap, AW88166_DSPMDAT_REG, &temp_data); in aw_dev_dsp_read_32bit()
107 dev_err(aw_dev->dev, "%s read error, ret=%d", __func__, ret); in aw_dev_dsp_read_32bit()
121 mutex_lock(&aw_dev->dsp_lock); in aw_dev_dsp_read()
126 dev_err(aw_dev->dev, "read dsp_addr[0x%x] 16-bit failed", (u32)dsp_addr); in aw_dev_dsp_read()
131 dev_err(aw_dev->dev, "read dsp_addr[0x%x] 32-bit failed", (u32)dsp_addr); in aw_dev_dsp_read()
134 dev_err(aw_dev->dev, "data type[%d] unsupported", data_type); in aw_dev_dsp_read()
135 ret = -EINVAL; in aw_dev_dsp_read()
140 if (regmap_read(aw_dev->regmap, AW88166_ID_REG, ®_value)) in aw_dev_dsp_read()
141 dev_err(aw_dev->dev, "%s fail to clear chip state. ret=%d\n", __func__, ret); in aw_dev_dsp_read()
142 mutex_unlock(&aw_dev->dsp_lock); in aw_dev_dsp_read()
152 ret = regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, in aw_dev_pwd()
155 ret = regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, in aw_dev_pwd()
159 dev_dbg(aw_dev->dev, "%s failed", __func__); in aw_dev_pwd()
167 ret = regmap_read(aw_dev->regmap, AW88166_SYSINT_REG, ®_val); in aw_dev_get_int_status()
169 dev_err(aw_dev->dev, "read interrupt reg fail, ret=%d", ret); in aw_dev_get_int_status()
173 dev_dbg(aw_dev->dev, "read interrupt reg=0x%04x", *int_status); in aw_dev_get_int_status()
185 dev_dbg(aw_dev->dev, "int status(%d) is not cleaned.\n", int_status); in aw_dev_clear_int_status()
193 ret = regmap_read(aw_dev->regmap, AW88166_SYSST_REG, ®_val); in aw_dev_get_iis_status()
197 dev_err(aw_dev->dev, "check pll lock fail, reg_val:0x%04x", reg_val); in aw_dev_get_iis_status()
198 return -EINVAL; in aw_dev_get_iis_status()
211 dev_err(aw_dev->dev, "mode1 iis signal check error"); in aw_dev_check_mode1_pll()
218 return -EPERM; in aw_dev_check_mode1_pll()
226 ret = regmap_read(aw_dev->regmap, AW88166_PLLCTRL2_REG, ®_val); in aw_dev_check_mode2_pll()
232 dev_dbg(aw_dev->dev, "CCO_MUX is already divider"); in aw_dev_check_mode2_pll()
233 return -EPERM; in aw_dev_check_mode2_pll()
237 ret = regmap_update_bits(aw_dev->regmap, AW88166_PLLCTRL2_REG, in aw_dev_check_mode2_pll()
245 dev_err(aw_dev->dev, "mode2 iis signal check error"); in aw_dev_check_mode2_pll()
253 regmap_update_bits(aw_dev->regmap, AW88166_PLLCTRL2_REG, in aw_dev_check_mode2_pll()
260 dev_err(aw_dev->dev, "mode2 switch to mode1, iis signal check error"); in aw_dev_check_mode2_pll()
277 dev_dbg(aw_dev->dev, "mode1 check iis failed try switch to mode2 check"); in aw_dev_check_syspll()
280 dev_err(aw_dev->dev, "mode2 check iis failed"); in aw_dev_check_syspll()
294 ret = regmap_read(aw_dev->regmap, AW88166_PWMCTRL3_REG, ®_val); in aw_dev_check_sysst()
304 ret = regmap_read(aw_dev->regmap, AW88166_SYSST_REG, ®_val); in aw_dev_check_sysst()
309 dev_err(aw_dev->dev, "check sysst fail, cnt=%d, reg_val=0x%04x, check:0x%x", in aw_dev_check_sysst()
317 return -EPERM; in aw_dev_check_sysst()
325 ret = regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, in aw_dev_amppd()
328 ret = regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, in aw_dev_amppd()
332 dev_dbg(aw_dev->dev, "%s failed", __func__); in aw_dev_amppd()
340 ret = regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, in aw_dev_dsp_enable()
343 ret = regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, in aw_dev_dsp_enable()
347 dev_dbg(aw_dev->dev, "%s failed\n", __func__); in aw_dev_dsp_enable()
352 struct aw_device *aw_dev = aw88166->aw_pa; in aw88166_dev_get_icalk()
358 ret = regmap_read(aw_dev->regmap, AW88166_EFRM2_REG, &efrm_reg_val); in aw88166_dev_get_icalk()
365 ret = regmap_read(aw_dev->regmap, AW88166_EFRL_REG, &efrl_reg_val); in aw88166_dev_get_icalk()
372 if (aw88166->check_val == AW_EF_AND_CHECK) in aw88166_dev_get_icalk()
386 struct aw_device *aw_dev = aw88166->aw_pa; in aw88166_dev_get_vcalk()
392 ret = regmap_read(aw_dev->regmap, AW88166_EFRM2_REG, &efrm_reg_val); in aw88166_dev_get_vcalk()
399 ret = regmap_read(aw_dev->regmap, AW88166_EFRL_REG, &efrl_reg_val); in aw88166_dev_get_vcalk()
406 if (aw88166->check_val == AW_EF_AND_CHECK) in aw88166_dev_get_vcalk()
420 struct aw_device *aw_dev = aw88166->aw_pa; in aw88166_dev_set_vcalb()
428 dev_err(aw_dev->dev, "get icalk failed\n"); in aw88166_dev_set_vcalb()
435 dev_err(aw_dev->dev, "get vbcalk failed\n"); in aw88166_dev_set_vcalb()
441 AW88166_ISCAL_FACTOR * ical_k / vcal_k * aw88166->vcalb_init_val; in aw88166_dev_set_vcalb()
446 regmap_write(aw_dev->regmap, AW88166_DSPVCALB_REG, reg_val); in aw88166_dev_set_vcalb()
453 struct aw_device *aw_dev = aw88166->aw_pa; in aw_dev_init_vcalb_update()
458 ret = regmap_write(aw_dev->regmap, AW88166_DSPVCALB_REG, aw88166->vcalb_init_val); in aw_dev_init_vcalb_update()
461 ret = regmap_read(aw_dev->regmap, AW88166_DSPVCALB_REG, &aw88166->vcalb_init_val); in aw_dev_init_vcalb_update()
464 dev_err(aw_dev->dev, "unsupported type:%d\n", flag); in aw_dev_init_vcalb_update()
465 ret = -EINVAL; in aw_dev_init_vcalb_update()
474 struct aw_device *aw_dev = aw88166->aw_pa; in aw_dev_init_re_update()
480 ret = regmap_write(aw_dev->regmap, AW88166_ACR1_REG, aw88166->re_init_val >> 16); in aw_dev_init_re_update()
483 ret = regmap_write(aw_dev->regmap, AW88166_ACR2_REG, in aw_dev_init_re_update()
484 (uint16_t)aw88166->re_init_val); in aw_dev_init_re_update()
489 ret = regmap_read(aw_dev->regmap, AW88166_ACR1_REG, &re_temp_h); in aw_dev_init_re_update()
492 ret = regmap_read(aw_dev->regmap, AW88166_ACR2_REG, &re_temp_l); in aw_dev_init_re_update()
495 aw88166->re_init_val = (re_temp_h << 16) + re_temp_l; in aw_dev_init_re_update()
498 dev_err(aw_dev->dev, "unsupported type:%d\n", flag); in aw_dev_init_re_update()
499 ret = -EINVAL; in aw_dev_init_re_update()
526 if ((aw_dev->cali_desc.cali_re >= AW88166_CALI_RE_MAX) || in aw_dev_update_cali_re()
527 (aw_dev->cali_desc.cali_re <= AW88166_CALI_RE_MIN)) in aw_dev_update_cali_re()
528 return -EINVAL; in aw_dev_update_cali_re()
530 cali_re = AW88166_SHOW_RE_TO_DSP_RE((aw_dev->cali_desc.cali_re + in aw_dev_update_cali_re()
531 aw_dev->cali_desc.ra), AW88166_DSP_RE_SHIFT); in aw_dev_update_cali_re()
536 ret = regmap_write(aw_dev->regmap, AW88166_ACR1_REG, re_hbits); in aw_dev_update_cali_re()
538 dev_err(aw_dev->dev, "set cali re error"); in aw_dev_update_cali_re()
542 ret = regmap_write(aw_dev->regmap, AW88166_ACR2_REG, re_lbits); in aw_dev_update_cali_re()
544 dev_err(aw_dev->dev, "set cali re error"); in aw_dev_update_cali_re()
556 fw_len_val = ((aw_dev->dsp_fw_len / AW_FW_ADDR_LEN) - 1) + AW88166_CRC_FW_BASE_ADDR; in aw_dev_fw_crc_check()
559 ret = regmap_update_bits(aw_dev->regmap, AW88166_CRCCTRL_REG, in aw_dev_fw_crc_check()
563 /* enable fw crc check */ in aw_dev_fw_crc_check()
564 ret = regmap_update_bits(aw_dev->regmap, AW88166_CRCCTRL_REG, in aw_dev_fw_crc_check()
569 /* read crc check result */ in aw_dev_fw_crc_check()
570 regmap_read(aw_dev->regmap, AW88166_HAGCST_REG, ®_val); in aw_dev_fw_crc_check()
576 /* disable fw crc check */ in aw_dev_fw_crc_check()
577 ret = regmap_update_bits(aw_dev->regmap, AW88166_CRCCTRL_REG, in aw_dev_fw_crc_check()
583 dev_err(aw_dev->dev, "%s failed, check_val 0x%x != 0x%x\n", in aw_dev_fw_crc_check()
585 ret = -EINVAL; in aw_dev_fw_crc_check()
598 cfg_len_val = ((aw_dev->dsp_cfg_len / AW_FW_ADDR_LEN) - 1) + AW88166_CRC_CFG_BASE_ADDR; in aw_dev_cfg_crc_check()
601 ret = regmap_update_bits(aw_dev->regmap, AW88166_CRCCTRL_REG, in aw_dev_cfg_crc_check()
606 /* enable cfg crc check */ in aw_dev_cfg_crc_check()
607 ret = regmap_update_bits(aw_dev->regmap, AW88166_CRCCTRL_REG, in aw_dev_cfg_crc_check()
614 /* read crc check result */ in aw_dev_cfg_crc_check()
615 ret = regmap_read(aw_dev->regmap, AW88166_HAGCST_REG, ®_val); in aw_dev_cfg_crc_check()
621 /* disable cfg crc check */ in aw_dev_cfg_crc_check()
622 ret = regmap_update_bits(aw_dev->regmap, AW88166_CRCCTRL_REG, in aw_dev_cfg_crc_check()
628 dev_err(aw_dev->dev, "crc_check failed, check val 0x%x != 0x%x\n", in aw_dev_cfg_crc_check()
630 ret = -EINVAL; in aw_dev_cfg_crc_check()
638 struct aw_device *aw_dev = aw88166->aw_pa; in aw_dev_hw_crc_check()
641 ret = regmap_update_bits(aw_dev->regmap, AW88166_I2SCFG1_REG, in aw_dev_hw_crc_check()
648 dev_err(aw_dev->dev, "fw_crc_check failed\n"); in aw_dev_hw_crc_check()
654 dev_err(aw_dev->dev, "cfg_crc_check failed\n"); in aw_dev_hw_crc_check()
658 ret = regmap_write(aw_dev->regmap, AW88166_CRCCTRL_REG, aw88166->crc_init_val); in aw_dev_hw_crc_check()
662 ret = regmap_update_bits(aw_dev->regmap, AW88166_I2SCFG1_REG, in aw_dev_hw_crc_check()
668 regmap_update_bits(aw_dev->regmap, AW88166_I2SCFG1_REG, in aw_dev_hw_crc_check()
678 ret = regmap_update_bits(aw_dev->regmap, AW88166_I2SCTRL3_REG, in aw_dev_i2s_tx_enable()
681 ret = regmap_update_bits(aw_dev->regmap, AW88166_I2SCTRL3_REG, in aw_dev_i2s_tx_enable()
685 dev_dbg(aw_dev->dev, "%s failed", __func__); in aw_dev_i2s_tx_enable()
693 ret = regmap_read(aw_dev->regmap, AW88166_WDT_REG, ®_val); in aw_dev_get_dsp_status()
697 return -EPERM; in aw_dev_get_dsp_status()
706 switch (aw_dev->dsp_cfg) { in aw_dev_dsp_check()
708 dev_dbg(aw_dev->dev, "dsp bypass"); in aw_dev_dsp_check()
718 dev_err(aw_dev->dev, "dsp wdt status error=%d", ret); in aw_dev_dsp_check()
724 dev_err(aw_dev->dev, "unknown dsp cfg=%d", aw_dev->dsp_cfg); in aw_dev_dsp_check()
725 ret = -EINVAL; in aw_dev_dsp_check()
734 struct aw_volume_desc *vol_desc = &aw_dev->volume_desc; in aw_dev_set_volume()
739 real_value = min((value + vol_desc->init_volume), (unsigned int)AW88166_MUTE_VOL); in aw_dev_set_volume()
741 ret = regmap_read(aw_dev->regmap, AW88166_SYSCTRL2_REG, ®_value); in aw_dev_set_volume()
745 dev_dbg(aw_dev->dev, "value 0x%x , reg:0x%x", value, real_value); in aw_dev_set_volume()
749 ret = regmap_write(aw_dev->regmap, AW88166_SYSCTRL2_REG, real_value); in aw_dev_set_volume()
756 struct aw_volume_desc *desc = &aw_dev->volume_desc; in aw_dev_fade_in()
757 u16 fade_in_vol = desc->ctl_volume; in aw_dev_fade_in()
758 int fade_step = aw_dev->fade_step; in aw_dev_fade_in()
761 if (fade_step == 0 || aw_dev->fade_in_time == 0) { in aw_dev_fade_in()
766 for (i = AW88166_MUTE_VOL; i >= fade_in_vol; i -= fade_step) { in aw_dev_fade_in()
768 usleep_range(aw_dev->fade_in_time, aw_dev->fade_in_time + 10); in aw_dev_fade_in()
777 struct aw_volume_desc *desc = &aw_dev->volume_desc; in aw_dev_fade_out()
778 int fade_step = aw_dev->fade_step; in aw_dev_fade_out()
781 if (fade_step == 0 || aw_dev->fade_out_time == 0) { in aw_dev_fade_out()
786 for (i = desc->ctl_volume; i <= AW88166_MUTE_VOL; i += fade_step) { in aw_dev_fade_out()
788 usleep_range(aw_dev->fade_out_time, aw_dev->fade_out_time + 10); in aw_dev_fade_out()
793 usleep_range(aw_dev->fade_out_time, aw_dev->fade_out_time + 10); in aw_dev_fade_out()
801 regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, in aw88166_dev_mute()
804 regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, in aw88166_dev_mute()
812 struct aw_device *aw_dev = aw88166->aw_pa; in aw88166_dev_set_dither()
815 regmap_update_bits(aw_dev->regmap, AW88166_DBGCTRL_REG, in aw88166_dev_set_dither()
818 regmap_update_bits(aw_dev->regmap, AW88166_DBGCTRL_REG, in aw88166_dev_set_dither()
824 struct aw_device *aw_dev = aw88166->aw_pa; in aw88166_dev_start()
827 if (aw_dev->status == AW88166_DEV_PW_ON) { in aw88166_dev_start()
828 dev_dbg(aw_dev->dev, "already power on"); in aw88166_dev_start()
840 dev_err(aw_dev->dev, "pll check failed cannot start\n"); in aw88166_dev_start()
851 dev_err(aw_dev->dev, "sysst check failed\n"); in aw88166_dev_start()
855 if (aw_dev->dsp_cfg == AW88166_DEV_DSP_WORK) { in aw88166_dev_start()
859 dev_err(aw_dev->dev, "dsp crc check failed\n"); in aw88166_dev_start()
864 aw_dev_update_cali_re(&aw_dev->cali_desc); in aw88166_dev_start()
867 dev_err(aw_dev->dev, "dsp status check failed\n"); in aw88166_dev_start()
871 dev_dbg(aw_dev->dev, "start pa with dsp bypass"); in aw88166_dev_start()
874 /* enable tx feedback */ in aw88166_dev_start()
877 if (aw88166->dither_st == AW88166_DITHER_EN_ENABLE_VALUE) in aw88166_dev_start()
884 aw_dev->status = AW88166_DEV_PW_ON; in aw88166_dev_start()
896 aw_dev->status = AW88166_DEV_PW_OFF; in aw88166_dev_start()
907 mutex_lock(&aw_dev->dsp_lock); in aw_dev_dsp_update_container()
908 ret = regmap_write(aw_dev->regmap, AW88166_DSPMADD_REG, base); in aw_dev_dsp_update_container()
913 tmp_len = min(len - i, AW88166_MAX_RAM_WRITE_BYTE_SIZE); in aw_dev_dsp_update_container()
914 ret = regmap_raw_write(aw_dev->regmap, AW88166_DSPMDAT_REG, in aw_dev_dsp_update_container()
919 mutex_unlock(&aw_dev->dsp_lock); in aw_dev_dsp_update_container()
924 mutex_unlock(&aw_dev->dsp_lock); in aw_dev_dsp_update_container()
938 dev_err(aw_dev->dev, "read ra error\n"); in aw_dev_get_ra()
942 cali_desc->ra = AW88166_DSP_RE_TO_SHOW_RE(dsp_ra, in aw_dev_get_ra()
953 dev_dbg(aw_dev->dev, "dsp config len:%d", len); in aw_dev_dsp_update_cfg()
956 dev_err(aw_dev->dev, "dsp config data is null or len is 0\n"); in aw_dev_dsp_update_cfg()
957 return -EINVAL; in aw_dev_dsp_update_cfg()
964 aw_dev->dsp_cfg_len = len; in aw_dev_dsp_update_cfg()
966 ret = aw_dev_get_ra(&aw_dev->cali_desc); in aw_dev_dsp_update_cfg()
976 dev_dbg(aw_dev->dev, "dsp firmware len:%d", len); in aw_dev_dsp_update_fw()
979 dev_err(aw_dev->dev, "dsp firmware data is null or len is 0\n"); in aw_dev_dsp_update_fw()
980 return -EINVAL; in aw_dev_dsp_update_fw()
983 aw_dev->dsp_fw_len = len; in aw_dev_dsp_update_fw()
993 mutex_lock(&aw_dev->dsp_lock); in aw_dev_check_sram()
997 dev_err(aw_dev->dev, "check dsp rom failed, read[0x%x] != check[0x%x]\n", in aw_dev_check_sram()
1006 dev_err(aw_dev->dev, "check dsp cfg failed, read[0x%x] != write[0x%x]\n", in aw_dev_check_sram()
1010 mutex_unlock(&aw_dev->dsp_lock); in aw_dev_check_sram()
1014 mutex_unlock(&aw_dev->dsp_lock); in aw_dev_check_sram()
1015 return -EPERM; in aw_dev_check_sram()
1024 ret = regmap_update_bits(aw_dev->regmap, AW88166_DBGCTRL_REG, in aw_dev_select_memclk()
1028 dev_err(aw_dev->dev, "memclk select pll failed\n"); in aw_dev_select_memclk()
1031 ret = regmap_update_bits(aw_dev->regmap, AW88166_DBGCTRL_REG, in aw_dev_select_memclk()
1035 dev_err(aw_dev->dev, "memclk select OSC failed\n"); in aw_dev_select_memclk()
1038 dev_err(aw_dev->dev, "unknown memclk config, flag=0x%x\n", flag); in aw_dev_select_memclk()
1046 struct aw_device *aw_dev = aw88166->aw_pa; in aw_dev_update_reg_container()
1047 struct aw_volume_desc *vol_desc = &aw_dev->volume_desc; in aw_dev_update_reg_container()
1057 dev_err(aw_dev->dev, "data len:%d unsupported\n", data_len); in aw_dev_update_reg_container()
1058 return -EINVAL; in aw_dev_update_reg_container()
1066 aw88166->vcalb_init_val = reg_val; in aw_dev_update_reg_container()
1072 aw_dev->dsp_cfg = AW88166_DEV_DSP_BYPASS; in aw_dev_update_reg_container()
1074 aw_dev->dsp_cfg = AW88166_DEV_DSP_WORK; in aw_dev_update_reg_container()
1090 aw_dev->volume_desc.init_volume = read_vol; in aw_dev_update_reg_container()
1095 aw88166->check_val = AW_EF_OR_CHECK; in aw_dev_update_reg_container()
1097 aw88166->check_val = AW_EF_AND_CHECK; in aw_dev_update_reg_container()
1099 aw88166->dither_st = reg_val & (~AW88166_DITHER_EN_MASK); in aw_dev_update_reg_container()
1103 aw88166->re_init_val |= (uint32_t)reg_val << 16; in aw_dev_update_reg_container()
1108 aw88166->re_init_val |= (uint32_t)reg_val; in aw_dev_update_reg_container()
1113 aw88166->crc_init_val = reg_val; in aw_dev_update_reg_container()
1115 ret = regmap_write(aw_dev->regmap, reg_addr, reg_val); in aw_dev_update_reg_container()
1123 if (aw_dev->prof_cur != aw_dev->prof_index) in aw_dev_update_reg_container()
1124 vol_desc->ctl_volume = 0; in aw_dev_update_reg_container()
1126 aw_dev_set_volume(aw_dev, vol_desc->ctl_volume); in aw_dev_update_reg_container()
1137 dev_err(aw88166->aw_pa->dev, "reg data is null or len is 0\n"); in aw_dev_reg_update()
1138 return -EINVAL; in aw_dev_reg_update()
1143 dev_err(aw88166->aw_pa->dev, "reg update failed\n"); in aw_dev_reg_update()
1150 struct aw_prof_info *prof_info = &aw_dev->prof_info; in aw88166_dev_get_prof_name()
1153 if ((index >= aw_dev->prof_info.count) || (index < 0)) { in aw88166_dev_get_prof_name()
1154 dev_err(aw_dev->dev, "index[%d] overflow count[%d]\n", in aw88166_dev_get_prof_name()
1155 index, aw_dev->prof_info.count); in aw88166_dev_get_prof_name()
1156 return -EINVAL; in aw88166_dev_get_prof_name()
1159 prof_desc = &aw_dev->prof_info.prof_desc[index]; in aw88166_dev_get_prof_name()
1161 *prof_name = prof_info->prof_name_list[prof_desc->id]; in aw88166_dev_get_prof_name()
1169 if ((index >= aw_dev->prof_info.count) || (index < 0)) { in aw88166_dev_get_prof_data()
1170 dev_err(aw_dev->dev, "%s: index[%d] overflow count[%d]\n", in aw88166_dev_get_prof_data()
1171 __func__, index, aw_dev->prof_info.count); in aw88166_dev_get_prof_data()
1172 return -EINVAL; in aw88166_dev_get_prof_data()
1175 *prof_desc = &aw_dev->prof_info.prof_desc[index]; in aw88166_dev_get_prof_data()
1182 struct aw_device *aw_dev = aw88166->aw_pa; in aw88166_dev_fw_update()
1188 if ((aw_dev->prof_cur == aw_dev->prof_index) && in aw88166_dev_fw_update()
1190 dev_dbg(aw_dev->dev, "scene no change, not update"); in aw88166_dev_fw_update()
1194 if (aw_dev->fw_status == AW88166_DEV_FW_FAILED) { in aw88166_dev_fw_update()
1195 dev_err(aw_dev->dev, "fw status[%d] error\n", aw_dev->fw_status); in aw88166_dev_fw_update()
1196 return -EPERM; in aw88166_dev_fw_update()
1199 ret = aw88166_dev_get_prof_name(aw_dev, aw_dev->prof_index, &prof_name); in aw88166_dev_fw_update()
1203 dev_dbg(aw_dev->dev, "start update %s", prof_name); in aw88166_dev_fw_update()
1205 ret = aw88166_dev_get_prof_data(aw_dev, aw_dev->prof_index, &prof_index_desc); in aw88166_dev_fw_update()
1210 sec_desc = prof_index_desc->sec_desc; in aw88166_dev_fw_update()
1214 dev_err(aw_dev->dev, "update reg failed\n"); in aw88166_dev_fw_update()
1220 if (aw_dev->dsp_cfg == AW88166_DEV_DSP_WORK) in aw88166_dev_fw_update()
1227 dev_err(aw_dev->dev, "check sram failed\n"); in aw88166_dev_fw_update()
1234 dev_dbg(aw_dev->dev, "fw_ver: [%x]", prof_index_desc->fw_ver); in aw88166_dev_fw_update()
1238 dev_err(aw_dev->dev, "update dsp fw failed\n"); in aw88166_dev_fw_update()
1247 dev_err(aw_dev->dev, "update dsp cfg failed\n"); in aw88166_dev_fw_update()
1255 aw_dev->prof_cur = aw_dev->prof_index; in aw88166_dev_fw_update()
1271 dev_err(aw88166->aw_pa->dev, "aw88166 device start failed. retry = %d", i); in aw88166_start_pa()
1274 dev_err(aw88166->aw_pa->dev, "fw update failed"); in aw88166_start_pa()
1278 dev_dbg(aw88166->aw_pa->dev, "start success\n"); in aw88166_start_pa()
1289 mutex_lock(&aw88166->lock); in aw88166_startup_work()
1291 mutex_unlock(&aw88166->lock); in aw88166_startup_work()
1298 if (aw88166->aw_pa->fw_status != AW88166_DEV_FW_OK) in aw88166_start()
1301 if (aw88166->aw_pa->status == AW88166_DEV_PW_ON) in aw88166_start()
1304 ret = aw88166_dev_fw_update(aw88166, AW88166_DSP_FW_UPDATE_OFF, aw88166->phase_sync); in aw88166_start()
1306 dev_err(aw88166->aw_pa->dev, "fw update failed\n"); in aw88166_start()
1314 &aw88166->start_work, in aw88166_start()
1324 dev_err(aw_dev->dev, "pa stop check fail:0x%04x\n", reg_val); in aw_dev_check_sysint()
1325 return -EINVAL; in aw_dev_check_sysint()
1334 &aw_dev->prof_info.prof_desc[aw_dev->prof_cur].sec_desc[AW88395_DATA_TYPE_DSP_CFG]; in aw88166_stop()
1336 &aw_dev->prof_info.prof_desc[aw_dev->prof_cur].sec_desc[AW88395_DATA_TYPE_DSP_FW]; in aw88166_stop()
1339 if (aw_dev->status == AW88166_DEV_PW_OFF) { in aw88166_stop()
1340 dev_dbg(aw_dev->dev, "already power off"); in aw88166_stop()
1344 aw_dev->status = AW88166_DEV_PW_OFF; in aw88166_stop()
1360 aw_dev_dsp_update_fw(aw_dev, dsp_fw->data, dsp_fw->len); in aw88166_stop()
1361 aw_dev_dsp_update_cfg(aw_dev, dsp_cfg->data, dsp_cfg->len); in aw88166_stop()
1372 .name = "aw88166-aif",
1396 struct aw_device *aw_dev = aw88166->aw_pa; in aw88166_get_fade_in_time()
1398 ucontrol->value.integer.value[0] = aw_dev->fade_in_time; in aw88166_get_fade_in_time()
1409 (struct soc_mixer_control *)kcontrol->private_value; in aw88166_set_fade_in_time()
1410 struct aw_device *aw_dev = aw88166->aw_pa; in aw88166_set_fade_in_time()
1413 time = ucontrol->value.integer.value[0]; in aw88166_set_fade_in_time()
1415 if (time < mc->min || time > mc->max) in aw88166_set_fade_in_time()
1416 return -EINVAL; in aw88166_set_fade_in_time()
1418 if (time != aw_dev->fade_in_time) { in aw88166_set_fade_in_time()
1419 aw_dev->fade_in_time = time; in aw88166_set_fade_in_time()
1431 struct aw_device *aw_dev = aw88166->aw_pa; in aw88166_get_fade_out_time()
1433 ucontrol->value.integer.value[0] = aw_dev->fade_out_time; in aw88166_get_fade_out_time()
1444 (struct soc_mixer_control *)kcontrol->private_value; in aw88166_set_fade_out_time()
1445 struct aw_device *aw_dev = aw88166->aw_pa; in aw88166_set_fade_out_time()
1448 time = ucontrol->value.integer.value[0]; in aw88166_set_fade_out_time()
1449 if (time < mc->min || time > mc->max) in aw88166_set_fade_out_time()
1450 return -EINVAL; in aw88166_set_fade_out_time()
1452 if (time != aw_dev->fade_out_time) { in aw88166_set_fade_out_time()
1453 aw_dev->fade_out_time = time; in aw88166_set_fade_out_time()
1463 if ((index >= aw_dev->prof_info.count) || (index < 0)) in aw88166_dev_set_profile_index()
1464 return -EINVAL; in aw88166_dev_set_profile_index()
1466 if (aw_dev->prof_index == index) in aw88166_dev_set_profile_index()
1467 return -EINVAL; in aw88166_dev_set_profile_index()
1469 aw_dev->prof_index = index; in aw88166_dev_set_profile_index()
1470 dev_dbg(aw_dev->dev, "set prof[%s]", in aw88166_dev_set_profile_index()
1471 aw_dev->prof_info.prof_name_list[aw_dev->prof_info.prof_desc[index].id]); in aw88166_dev_set_profile_index()
1484 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; in aw88166_profile_info()
1485 uinfo->count = 1; in aw88166_profile_info()
1487 count = aw88166->aw_pa->prof_info.count; in aw88166_profile_info()
1489 uinfo->value.enumerated.items = 0; in aw88166_profile_info()
1493 uinfo->value.enumerated.items = count; in aw88166_profile_info()
1495 if (uinfo->value.enumerated.item >= count) in aw88166_profile_info()
1496 uinfo->value.enumerated.item = count - 1; in aw88166_profile_info()
1498 count = uinfo->value.enumerated.item; in aw88166_profile_info()
1500 ret = aw88166_dev_get_prof_name(aw88166->aw_pa, count, &prof_name); in aw88166_profile_info()
1502 strscpy(uinfo->value.enumerated.name, "null"); in aw88166_profile_info()
1506 strscpy(uinfo->value.enumerated.name, prof_name); in aw88166_profile_info()
1517 ucontrol->value.integer.value[0] = aw88166->aw_pa->prof_index; in aw88166_profile_get()
1529 mutex_lock(&aw88166->lock); in aw88166_profile_set()
1530 ret = aw88166_dev_set_profile_index(aw88166->aw_pa, ucontrol->value.integer.value[0]); in aw88166_profile_set()
1532 dev_dbg(codec->dev, "profile index does not change"); in aw88166_profile_set()
1533 mutex_unlock(&aw88166->lock); in aw88166_profile_set()
1537 if (aw88166->aw_pa->status) { in aw88166_profile_set()
1538 aw88166_stop(aw88166->aw_pa); in aw88166_profile_set()
1542 mutex_unlock(&aw88166->lock); in aw88166_profile_set()
1552 struct aw_volume_desc *vol_desc = &aw88166->aw_pa->volume_desc; in aw88166_volume_get()
1554 ucontrol->value.integer.value[0] = vol_desc->ctl_volume; in aw88166_volume_get()
1564 struct aw_volume_desc *vol_desc = &aw88166->aw_pa->volume_desc; in aw88166_volume_set()
1566 (struct soc_mixer_control *)kcontrol->private_value; in aw88166_volume_set()
1569 value = ucontrol->value.integer.value[0]; in aw88166_volume_set()
1570 if (value < mc->min || value > mc->max) in aw88166_volume_set()
1571 return -EINVAL; in aw88166_volume_set()
1573 if (vol_desc->ctl_volume != value) { in aw88166_volume_set()
1574 vol_desc->ctl_volume = value; in aw88166_volume_set()
1575 aw_dev_set_volume(aw88166->aw_pa, vol_desc->ctl_volume); in aw88166_volume_set()
1589 ucontrol->value.integer.value[0] = aw88166->aw_pa->fade_step; in aw88166_get_fade_step()
1600 (struct soc_mixer_control *)kcontrol->private_value; in aw88166_set_fade_step()
1603 value = ucontrol->value.integer.value[0]; in aw88166_set_fade_step()
1604 if (value < mc->min || value > mc->max) in aw88166_set_fade_step()
1605 return -EINVAL; in aw88166_set_fade_step()
1607 if (aw88166->aw_pa->fade_step != value) { in aw88166_set_fade_step()
1608 aw88166->aw_pa->fade_step = value; in aw88166_set_fade_step()
1620 struct aw_device *aw_dev = aw88166->aw_pa; in aw88166_re_get()
1622 ucontrol->value.integer.value[0] = aw_dev->cali_desc.cali_re; in aw88166_re_get()
1633 (struct soc_mixer_control *)kcontrol->private_value; in aw88166_re_set()
1634 struct aw_device *aw_dev = aw88166->aw_pa; in aw88166_re_set()
1637 value = ucontrol->value.integer.value[0]; in aw88166_re_set()
1638 if (value < mc->min || value > mc->max) in aw88166_re_set()
1639 return -EINVAL; in aw88166_re_set()
1641 if (aw_dev->cali_desc.cali_re != value) { in aw88166_re_set()
1642 aw_dev->cali_desc.cali_re = value; in aw88166_re_set()
1651 struct aw_device *aw_dev = aw88166->aw_pa; in aw88166_dev_init()
1656 dev_err(aw_dev->dev, "aw_dev acf parse failed\n"); in aw88166_dev_init()
1657 return -EINVAL; in aw88166_dev_init()
1659 aw_dev->fade_in_time = AW88166_1000_US / 10; in aw88166_dev_init()
1660 aw_dev->fade_out_time = AW88166_1000_US >> 1; in aw88166_dev_init()
1661 aw_dev->prof_cur = aw_dev->prof_info.prof_desc[0].id; in aw88166_dev_init()
1662 aw_dev->prof_index = aw_dev->prof_info.prof_desc[0].id; in aw88166_dev_init()
1666 dev_err(aw_dev->dev, "fw update failed ret = %d\n", ret); in aw88166_dev_init()
1676 /* enable amppd */ in aw88166_dev_init()
1692 aw88166->aw_pa->fw_status = AW88166_DEV_FW_FAILED; in aw88166_request_firmware_file()
1694 ret = request_firmware(&cont, AW88166_ACF_FILE, aw88166->aw_pa->dev); in aw88166_request_firmware_file()
1696 dev_err(aw88166->aw_pa->dev, "request [%s] failed!\n", AW88166_ACF_FILE); in aw88166_request_firmware_file()
1700 dev_dbg(aw88166->aw_pa->dev, "loaded %s - size: %zu\n", in aw88166_request_firmware_file()
1701 AW88166_ACF_FILE, cont ? cont->size : 0); in aw88166_request_firmware_file()
1703 aw88166->aw_cfg = devm_kzalloc(aw88166->aw_pa->dev, in aw88166_request_firmware_file()
1704 struct_size(aw88166->aw_cfg, data, cont->size), GFP_KERNEL); in aw88166_request_firmware_file()
1705 if (!aw88166->aw_cfg) { in aw88166_request_firmware_file()
1707 return -ENOMEM; in aw88166_request_firmware_file()
1709 aw88166->aw_cfg->len = (int)cont->size; in aw88166_request_firmware_file()
1710 memcpy(aw88166->aw_cfg->data, cont->data, cont->size); in aw88166_request_firmware_file()
1713 ret = aw88395_dev_load_acf_check(aw88166->aw_pa, aw88166->aw_cfg); in aw88166_request_firmware_file()
1715 dev_err(aw88166->aw_pa->dev, "load [%s] failed!\n", AW88166_ACF_FILE); in aw88166_request_firmware_file()
1719 mutex_lock(&aw88166->lock); in aw88166_request_firmware_file()
1721 ret = aw88166_dev_init(aw88166, aw88166->aw_cfg); in aw88166_request_firmware_file()
1723 dev_err(aw88166->aw_pa->dev, "dev init failed\n"); in aw88166_request_firmware_file()
1724 mutex_unlock(&aw88166->lock); in aw88166_request_firmware_file()
1748 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in aw88166_playback_event()
1751 mutex_lock(&aw88166->lock); in aw88166_playback_event()
1757 aw88166_stop(aw88166->aw_pa); in aw88166_playback_event()
1762 mutex_unlock(&aw88166->lock); in aw88166_playback_event()
1789 INIT_DELAYED_WORK(&aw88166->start_work, aw88166_startup_work); in aw88166_codec_probe()
1793 dev_err(aw88166->aw_pa->dev, "%s failed\n", __func__); in aw88166_codec_probe()
1802 cancel_delayed_work_sync(&aw88166->start_work); in aw88166_codec_remove()
1818 if (aw88166->reset_gpio) { in aw88166_hw_reset()
1819 gpiod_set_value_cansleep(aw88166->reset_gpio, 1); in aw88166_hw_reset()
1821 gpiod_set_value_cansleep(aw88166->reset_gpio, 0); in aw88166_hw_reset()
1828 struct aw_device *aw_dev = aw88166->aw_pa; in aw88166_parse_channel_dt()
1829 struct device_node *np = aw_dev->dev->of_node; in aw88166_parse_channel_dt()
1832 of_property_read_u32(np, "awinic,audio-channel", &channel_value); in aw88166_parse_channel_dt()
1833 aw_dev->channel = channel_value; in aw88166_parse_channel_dt()
1834 aw88166->phase_sync = of_property_read_bool(np, "awinic,sync-flag"); in aw88166_parse_channel_dt()
1837 static int aw88166_init(struct aw88166 *aw88166, struct i2c_client *i2c, struct regmap *regmap) in aw88166_init() argument
1845 dev_err(&i2c->dev, "%s read chipid error. ret = %d\n", __func__, ret); in aw88166_init()
1849 aw_dev = devm_kzalloc(&i2c->dev, sizeof(*aw_dev), GFP_KERNEL); in aw88166_init()
1851 return -ENOMEM; in aw88166_init()
1852 aw88166->aw_pa = aw_dev; in aw88166_init()
1854 aw_dev->i2c = i2c; in aw88166_init()
1855 aw_dev->dev = &i2c->dev; in aw88166_init()
1856 aw_dev->regmap = regmap; in aw88166_init()
1857 mutex_init(&aw_dev->dsp_lock); in aw88166_init()
1859 aw_dev->chip_id = chip_id; in aw88166_init()
1860 aw_dev->acf = NULL; in aw88166_init()
1861 aw_dev->prof_info.prof_desc = NULL; in aw88166_init()
1862 aw_dev->prof_info.count = 0; in aw88166_init()
1863 aw_dev->prof_info.prof_type = AW88395_DEV_NONE_TYPE_ID; in aw88166_init()
1864 aw_dev->channel = AW88166_DEV_DEFAULT_CH; in aw88166_init()
1865 aw_dev->fw_status = AW88166_DEV_FW_FAILED; in aw88166_init()
1867 aw_dev->fade_step = AW88166_VOLUME_STEP_DB; in aw88166_init()
1868 aw_dev->volume_desc.ctl_volume = AW88166_VOL_DEFAULT_VALUE; in aw88166_init()
1875 static int aw88166_i2c_probe(struct i2c_client *i2c) in aw88166_i2c_probe() argument
1880 if (!i2c_check_functionality(i2c->adapter, I2C_FUNC_I2C)) in aw88166_i2c_probe()
1881 return dev_err_probe(&i2c->dev, -ENXIO, "check_functionality failed\n"); in aw88166_i2c_probe()
1883 aw88166 = devm_kzalloc(&i2c->dev, sizeof(*aw88166), GFP_KERNEL); in aw88166_i2c_probe()
1885 return -ENOMEM; in aw88166_i2c_probe()
1887 mutex_init(&aw88166->lock); in aw88166_i2c_probe()
1889 i2c_set_clientdata(i2c, aw88166); in aw88166_i2c_probe()
1891 aw88166->reset_gpio = devm_gpiod_get_optional(&i2c->dev, "reset", GPIOD_OUT_LOW); in aw88166_i2c_probe()
1892 if (IS_ERR(aw88166->reset_gpio)) in aw88166_i2c_probe()
1893 return dev_err_probe(&i2c->dev, PTR_ERR(aw88166->reset_gpio), in aw88166_i2c_probe()
1897 aw88166->regmap = devm_regmap_init_i2c(i2c, &aw88166_remap_config); in aw88166_i2c_probe()
1898 if (IS_ERR(aw88166->regmap)) in aw88166_i2c_probe()
1899 return dev_err_probe(&i2c->dev, PTR_ERR(aw88166->regmap), in aw88166_i2c_probe()
1903 ret = aw88166_init(aw88166, i2c, aw88166->regmap); in aw88166_i2c_probe()
1907 return devm_snd_soc_register_component(&i2c->dev, in aw88166_i2c_probe()
1916 MODULE_DEVICE_TABLE(i2c, aw88166_i2c_id);