diff options
Diffstat (limited to 'sound/soc/codecs/aw88399.c')
| -rw-r--r-- | sound/soc/codecs/aw88399.c | 253 |
1 files changed, 38 insertions, 215 deletions
diff --git a/sound/soc/codecs/aw88399.c b/sound/soc/codecs/aw88399.c index 58846feb013d..b588c27909b5 100644 --- a/sound/soc/codecs/aw88399.c +++ b/sound/soc/codecs/aw88399.c @@ -26,172 +26,6 @@ static const struct regmap_config aw88399_remap_config = { .val_format_endian = REGMAP_ENDIAN_BIG, }; -static int aw_dev_dsp_write_16bit(struct aw_device *aw_dev, - unsigned short dsp_addr, unsigned int dsp_data) -{ - int ret; - - ret = regmap_write(aw_dev->regmap, AW88399_DSPMADD_REG, dsp_addr); - if (ret) { - dev_err(aw_dev->dev, "%s write addr error, ret=%d", __func__, ret); - return ret; - } - - ret = regmap_write(aw_dev->regmap, AW88399_DSPMDAT_REG, (u16)dsp_data); - if (ret) { - dev_err(aw_dev->dev, "%s write data error, ret=%d", __func__, ret); - return ret; - } - - return 0; -} - -static int aw_dev_dsp_write_32bit(struct aw_device *aw_dev, - unsigned short dsp_addr, unsigned int dsp_data) -{ - unsigned int temp_data; - int ret; - - ret = regmap_write(aw_dev->regmap, AW88399_DSPMADD_REG, dsp_addr); - if (ret) { - dev_err(aw_dev->dev, "%s write addr error, ret=%d", __func__, ret); - return ret; - } - - temp_data = dsp_data & AW88395_DSP_16_DATA_MASK; - ret = regmap_write(aw_dev->regmap, AW88399_DSPMDAT_REG, temp_data); - if (ret) { - dev_err(aw_dev->dev, "%s write datal error, ret=%d", __func__, ret); - return ret; - } - - temp_data = dsp_data >> 16; - ret = regmap_write(aw_dev->regmap, AW88399_DSPMDAT_REG, temp_data); - if (ret) - dev_err(aw_dev->dev, "%s write datah error, ret=%d", __func__, ret); - - return ret; -} - -static int aw_dev_dsp_write(struct aw_device *aw_dev, - unsigned short dsp_addr, unsigned int dsp_data, unsigned char data_type) -{ - unsigned int reg_value; - int ret; - - mutex_lock(&aw_dev->dsp_lock); - switch (data_type) { - case AW88395_DSP_16_DATA: - ret = aw_dev_dsp_write_16bit(aw_dev, dsp_addr, dsp_data); - if (ret) - dev_err(aw_dev->dev, "write dsp_addr[0x%x] 16-bit dsp_data[0x%x] failed", - dsp_addr, dsp_data); - break; - case AW88395_DSP_32_DATA: - ret = aw_dev_dsp_write_32bit(aw_dev, dsp_addr, dsp_data); - if (ret) - dev_err(aw_dev->dev, "write dsp_addr[0x%x] 32-bit dsp_data[0x%x] failed", - dsp_addr, dsp_data); - break; - default: - dev_err(aw_dev->dev, "data type[%d] unsupported", data_type); - ret = -EINVAL; - break; - } - - /* clear dsp chip select state */ - if (regmap_read(aw_dev->regmap, 0x00, ®_value)) - dev_err(aw_dev->dev, "%s fail to clear chip state. Err=%d\n", __func__, ret); - mutex_unlock(&aw_dev->dsp_lock); - - return ret; -} - -static int aw_dev_dsp_read_16bit(struct aw_device *aw_dev, - unsigned short dsp_addr, unsigned int *dsp_data) -{ - unsigned int temp_data; - int ret; - - ret = regmap_write(aw_dev->regmap, AW88399_DSPMADD_REG, dsp_addr); - if (ret) { - dev_err(aw_dev->dev, "%s write error, ret=%d", __func__, ret); - return ret; - } - - ret = regmap_read(aw_dev->regmap, AW88399_DSPMDAT_REG, &temp_data); - if (ret) { - dev_err(aw_dev->dev, "%s read error, ret=%d", __func__, ret); - return ret; - } - *dsp_data = temp_data; - - return 0; -} - -static int aw_dev_dsp_read_32bit(struct aw_device *aw_dev, - unsigned short dsp_addr, unsigned int *dsp_data) -{ - unsigned int temp_data; - int ret; - - ret = regmap_write(aw_dev->regmap, AW88399_DSPMADD_REG, dsp_addr); - if (ret) { - dev_err(aw_dev->dev, "%s write error, ret=%d", __func__, ret); - return ret; - } - - ret = regmap_read(aw_dev->regmap, AW88399_DSPMDAT_REG, &temp_data); - if (ret) { - dev_err(aw_dev->dev, "%s read error, ret=%d", __func__, ret); - return ret; - } - *dsp_data = temp_data; - - ret = regmap_read(aw_dev->regmap, AW88399_DSPMDAT_REG, &temp_data); - if (ret) { - dev_err(aw_dev->dev, "%s read error, ret=%d", __func__, ret); - return ret; - } - *dsp_data |= (temp_data << 16); - - return 0; -} - -static int aw_dev_dsp_read(struct aw_device *aw_dev, - unsigned short dsp_addr, unsigned int *dsp_data, unsigned char data_type) -{ - u32 reg_value; - int ret; - - mutex_lock(&aw_dev->dsp_lock); - switch (data_type) { - case AW88399_DSP_16_DATA: - ret = aw_dev_dsp_read_16bit(aw_dev, dsp_addr, dsp_data); - if (ret) - dev_err(aw_dev->dev, "read dsp_addr[0x%x] 16-bit dsp_data[0x%x] failed", - (u32)dsp_addr, *dsp_data); - break; - case AW88399_DSP_32_DATA: - ret = aw_dev_dsp_read_32bit(aw_dev, dsp_addr, dsp_data); - if (ret) - dev_err(aw_dev->dev, "read dsp_addr[0x%x] 32r-bit dsp_data[0x%x] failed", - (u32)dsp_addr, *dsp_data); - break; - default: - dev_err(aw_dev->dev, "data type[%d] unsupported", data_type); - ret = -EINVAL; - break; - } - - /* clear dsp chip select state */ - if (regmap_read(aw_dev->regmap, AW88399_ID_REG, ®_value)) - dev_err(aw_dev->dev, "%s fail to clear chip state. ret=%d\n", __func__, ret); - mutex_unlock(&aw_dev->dsp_lock); - - return ret; -} - static void aw_dev_pwd(struct aw_device *aw_dev, bool pwd) { int ret; @@ -929,25 +763,19 @@ static int aw_dev_dsp_update_container(struct aw_device *aw_dev, u32 tmp_len; int i, ret; - mutex_lock(&aw_dev->dsp_lock); ret = regmap_write(aw_dev->regmap, AW88399_DSPMADD_REG, base); if (ret) - goto error_operation; + return ret; for (i = 0; i < len; i += AW88399_MAX_RAM_WRITE_BYTE_SIZE) { tmp_len = min(len - i, AW88399_MAX_RAM_WRITE_BYTE_SIZE); ret = regmap_raw_write(aw_dev->regmap, AW88399_DSPMDAT_REG, &data[i], tmp_len); if (ret) - goto error_operation; + return ret; } - mutex_unlock(&aw_dev->dsp_lock); return 0; - -error_operation: - mutex_unlock(&aw_dev->dsp_lock); - return ret; } static int aw_dev_get_ra(struct aw_cali_desc *cali_desc) @@ -958,7 +786,7 @@ static int aw_dev_get_ra(struct aw_cali_desc *cali_desc) int ret; ret = aw_dev_dsp_read(aw_dev, AW88399_DSP_REG_CFG_ADPZ_RA, - &dsp_ra, AW88399_DSP_32_DATA); + &dsp_ra, AW_DSP_32_DATA); if (ret) { dev_err(aw_dev->dev, "read ra error"); return ret; @@ -1015,29 +843,25 @@ static int aw_dev_check_sram(struct aw_device *aw_dev) { unsigned int reg_val; - mutex_lock(&aw_dev->dsp_lock); /* read dsp_rom_check_reg */ - aw_dev_dsp_read_16bit(aw_dev, AW88399_DSP_ROM_CHECK_ADDR, ®_val); + aw_dev_dsp_read(aw_dev, AW88399_DSP_ROM_CHECK_ADDR, ®_val, AW_DSP_16_DATA); if (reg_val != AW88399_DSP_ROM_CHECK_DATA) { dev_err(aw_dev->dev, "check dsp rom failed, read[0x%x] != check[0x%x]", reg_val, AW88399_DSP_ROM_CHECK_DATA); - goto error; + return -EPERM; } /* check dsp_cfg_base_addr */ - aw_dev_dsp_write_16bit(aw_dev, AW88399_DSP_CFG_ADDR, AW88399_DSP_ODD_NUM_BIT_TEST); - aw_dev_dsp_read_16bit(aw_dev, AW88399_DSP_CFG_ADDR, ®_val); + aw_dev_dsp_write(aw_dev, AW88399_DSP_CFG_ADDR, + AW88399_DSP_ODD_NUM_BIT_TEST, AW_DSP_16_DATA); + aw_dev_dsp_read(aw_dev, AW88399_DSP_CFG_ADDR, ®_val, AW_DSP_16_DATA); if (reg_val != AW88399_DSP_ODD_NUM_BIT_TEST) { dev_err(aw_dev->dev, "check dsp cfg failed, read[0x%x] != write[0x%x]", reg_val, AW88399_DSP_ODD_NUM_BIT_TEST); - goto error; + return -EPERM; } - mutex_unlock(&aw_dev->dsp_lock); return 0; -error: - mutex_unlock(&aw_dev->dsp_lock); - return -EPERM; } static void aw_dev_select_memclk(struct aw_device *aw_dev, unsigned char flag) @@ -1340,7 +1164,7 @@ static void aw88399_start(struct aw88399 *aw88399, bool sync_start) if (sync_start == AW88399_SYNC_START) aw88399_start_pa(aw88399); else - queue_delayed_work(system_wq, + queue_delayed_work(system_dfl_wq, &aw88399->start_work, AW88399_START_WORK_DELAY_MS); } @@ -1432,22 +1256,22 @@ static int aw_cali_svc_get_cali_cfg(struct aw_device *aw_dev) int ret; ret = aw_dev_dsp_read(aw_dev, AW88399_DSP_REG_CFG_MBMEC_ACTAMPTH, - &cali_cfg->data[0], AW88399_DSP_32_DATA); + &cali_cfg->data[0], AW_DSP_32_DATA); if (ret) return ret; ret = aw_dev_dsp_read(aw_dev, AW88399_DSP_REG_CFG_MBMEC_NOISEAMPTH, - &cali_cfg->data[1], AW88399_DSP_32_DATA); + &cali_cfg->data[1], AW_DSP_32_DATA); if (ret) return ret; ret = aw_dev_dsp_read(aw_dev, AW88399_DSP_REG_CFG_ADPZ_USTEPN, - &cali_cfg->data[2], AW88399_DSP_16_DATA); + &cali_cfg->data[2], AW_DSP_16_DATA); if (ret) return ret; ret = aw_dev_dsp_read(aw_dev, AW88399_DSP_REG_CFG_RE_ALPHA, - &cali_cfg->data[3], AW88399_DSP_16_DATA); + &cali_cfg->data[3], AW_DSP_16_DATA); return ret; } @@ -1458,22 +1282,22 @@ static int aw_cali_svc_set_cali_cfg(struct aw_device *aw_dev, int ret; ret = aw_dev_dsp_write(aw_dev, AW88399_DSP_REG_CFG_MBMEC_ACTAMPTH, - cali_cfg.data[0], AW88399_DSP_32_DATA); + cali_cfg.data[0], AW_DSP_32_DATA); if (ret) return ret; ret = aw_dev_dsp_write(aw_dev, AW88399_DSP_REG_CFG_MBMEC_NOISEAMPTH, - cali_cfg.data[1], AW88399_DSP_32_DATA); + cali_cfg.data[1], AW_DSP_32_DATA); if (ret) return ret; ret = aw_dev_dsp_write(aw_dev, AW88399_DSP_REG_CFG_ADPZ_USTEPN, - cali_cfg.data[2], AW88399_DSP_16_DATA); + cali_cfg.data[2], AW_DSP_16_DATA); if (ret) return ret; ret = aw_dev_dsp_write(aw_dev, AW88399_DSP_REG_CFG_RE_ALPHA, - cali_cfg.data[3], AW88399_DSP_16_DATA); + cali_cfg.data[3], AW_DSP_16_DATA); return ret; } @@ -1488,7 +1312,7 @@ static int aw_cali_svc_cali_en(struct aw_device *aw_dev, bool cali_en) regmap_update_bits(aw_dev->regmap, AW88399_DBGCTRL_REG, ~AW883XX_DSP_NG_EN_MASK, AW883XX_DSP_NG_EN_DISABLE_VALUE); aw_dev_dsp_write(aw_dev, AW88399_DSP_LOW_POWER_SWITCH_CFG_ADDR, - AW88399_DSP_LOW_POWER_SWITCH_DISABLE, AW88399_DSP_16_DATA); + AW88399_DSP_LOW_POWER_SWITCH_DISABLE, AW_DSP_16_DATA); ret = aw_cali_svc_get_cali_cfg(aw_dev); if (ret) { @@ -1548,8 +1372,7 @@ static void aw_cali_svc_backup_info(struct aw_device *aw_dev) regmap_read(aw_dev->regmap, AW88399_DBGCTRL_REG, ®_val); backup_desc->dsp_ng_cfg = reg_val & (~AW883XX_DSP_NG_EN_MASK); - aw_dev_dsp_read(aw_dev, AW88399_DSP_LOW_POWER_SWITCH_CFG_ADDR, - &dsp_val, AW88399_DSP_16_DATA); + aw_dev_dsp_read(aw_dev, AW88399_DSP_LOW_POWER_SWITCH_CFG_ADDR, &dsp_val, AW_DSP_16_DATA); backup_desc->dsp_lp_cfg = dsp_val; } @@ -1562,7 +1385,7 @@ static void aw_cali_svc_recover_info(struct aw_device *aw_dev) ~AW883XX_DSP_NG_EN_MASK, backup_desc->dsp_ng_cfg); aw_dev_dsp_write(aw_dev, AW88399_DSP_LOW_POWER_SWITCH_CFG_ADDR, - backup_desc->dsp_lp_cfg, AW88399_DSP_16_DATA); + backup_desc->dsp_lp_cfg, AW_DSP_16_DATA); } static int aw_cali_svc_cali_re_mode_enable(struct aw_device *aw_dev, bool is_enable) @@ -1609,7 +1432,7 @@ static int aw_cali_svc_get_dev_re(struct aw_device *aw_dev, uint32_t *re) uint32_t dsp_re, show_re; int ret; - ret = aw_dev_dsp_read(aw_dev, AW88399_DSP_REG_CALRE, &dsp_re, AW88399_DSP_16_DATA); + ret = aw_dev_dsp_read(aw_dev, AW88399_DSP_REG_CALRE, &dsp_re, AW_DSP_16_DATA); if (ret) return ret; @@ -1744,7 +1567,7 @@ re_mode_err: static int aw88399_get_fade_in_time(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); struct aw88399 *aw88399 = snd_soc_component_get_drvdata(component); struct aw_device *aw_dev = aw88399->aw_pa; @@ -1756,7 +1579,7 @@ static int aw88399_get_fade_in_time(struct snd_kcontrol *kcontrol, static int aw88399_set_fade_in_time(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); struct aw88399 *aw88399 = snd_soc_component_get_drvdata(component); struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; @@ -1779,7 +1602,7 @@ static int aw88399_set_fade_in_time(struct snd_kcontrol *kcontrol, static int aw88399_get_fade_out_time(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); struct aw88399 *aw88399 = snd_soc_component_get_drvdata(component); struct aw_device *aw_dev = aw88399->aw_pa; @@ -1791,7 +1614,7 @@ static int aw88399_get_fade_out_time(struct snd_kcontrol *kcontrol, static int aw88399_set_fade_out_time(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); struct aw88399 *aw88399 = snd_soc_component_get_drvdata(component); struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; @@ -1829,7 +1652,7 @@ static int aw88399_dev_set_profile_index(struct aw_device *aw_dev, int index) static int aw88399_profile_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) { - struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol); struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec); char *prof_name; int count, ret; @@ -1864,7 +1687,7 @@ static int aw88399_profile_info(struct snd_kcontrol *kcontrol, static int aw88399_profile_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol); struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec); ucontrol->value.integer.value[0] = aw88399->aw_pa->prof_index; @@ -1875,7 +1698,7 @@ static int aw88399_profile_get(struct snd_kcontrol *kcontrol, static int aw88399_profile_set(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol); struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec); int ret; @@ -1900,7 +1723,7 @@ static int aw88399_profile_set(struct snd_kcontrol *kcontrol, static int aw88399_volume_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol); struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec); struct aw_volume_desc *vol_desc = &aw88399->aw_pa->volume_desc; @@ -1912,7 +1735,7 @@ static int aw88399_volume_get(struct snd_kcontrol *kcontrol, static int aw88399_volume_set(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol); struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec); struct aw_volume_desc *vol_desc = &aw88399->aw_pa->volume_desc; struct soc_mixer_control *mc = @@ -1936,7 +1759,7 @@ static int aw88399_volume_set(struct snd_kcontrol *kcontrol, static int aw88399_get_fade_step(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol); struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec); ucontrol->value.integer.value[0] = aw88399->aw_pa->fade_step; @@ -1947,7 +1770,7 @@ static int aw88399_get_fade_step(struct snd_kcontrol *kcontrol, static int aw88399_set_fade_step(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol); struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec); struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; @@ -1968,7 +1791,7 @@ static int aw88399_set_fade_step(struct snd_kcontrol *kcontrol, static int aw88399_re_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol); struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec); struct aw_device *aw_dev = aw88399->aw_pa; @@ -1980,7 +1803,7 @@ static int aw88399_re_get(struct snd_kcontrol *kcontrol, static int aw88399_re_set(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol); struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec); struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; @@ -2002,7 +1825,7 @@ static int aw88399_re_set(struct snd_kcontrol *kcontrol, static int aw88399_calib_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol); struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec); struct aw_device *aw_dev = aw88399->aw_pa; @@ -2014,7 +1837,7 @@ static int aw88399_calib_switch_get(struct snd_kcontrol *kcontrol, static int aw88399_calib_switch_set(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol); struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec); struct aw_device *aw_dev = aw88399->aw_pa; @@ -2036,7 +1859,7 @@ static int aw88399_calib_get(struct snd_kcontrol *kcontrol, static int aw88399_calib_set(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol); struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec); struct aw_device *aw_dev = aw88399->aw_pa; |
