mirror of https://github.com/torvalds/linux.git
ASoC: codecs: Modify awinic amplifier dsp read and write functions
Modify the dsp read and write functions of the chip and normalize the dsp read and write functions of all awinic amplifier Signed-off-by: Weidong Wang <wangweidong.a@awinic.com> Link: https://patch.msgid.link/20251128130323.628091-1-wangweidong.a@awinic.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
b025f01ee9
commit
fd16593d45
|
|
@ -50,9 +50,9 @@ snd-soc-audio-iio-aux-y := audio-iio-aux.o
|
|||
snd-soc-aw8738-y := aw8738.o
|
||||
snd-soc-aw87390-y := aw87390.o
|
||||
snd-soc-aw88081-y := aw88081.o
|
||||
snd-soc-aw88395-lib-y := aw88395/aw88395_lib.o
|
||||
snd-soc-aw88395-y := aw88395/aw88395.o \
|
||||
snd-soc-aw88395-lib-y := aw88395/aw88395_lib.o \
|
||||
aw88395/aw88395_device.o
|
||||
snd-soc-aw88395-y := aw88395/aw88395.o
|
||||
snd-soc-aw88166-y := aw88166.o
|
||||
snd-soc-aw88261-y := aw88261.o
|
||||
snd-soc-aw88399-y := aw88399.o
|
||||
|
|
|
|||
|
|
@ -41,109 +41,6 @@ static const struct regmap_config aw88166_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, AW88166_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, AW88166_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_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, AW88166_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, AW88166_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, AW88166_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, AW88166_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, AW88166_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 AW88166_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 failed", (u32)dsp_addr);
|
||||
break;
|
||||
case AW88166_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] 32-bit failed", (u32)dsp_addr);
|
||||
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, AW88166_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;
|
||||
|
|
@ -904,25 +801,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, AW88166_DSPMADD_REG, base);
|
||||
if (ret)
|
||||
goto error_operation;
|
||||
return ret;
|
||||
|
||||
for (i = 0; i < len; i += AW88166_MAX_RAM_WRITE_BYTE_SIZE) {
|
||||
tmp_len = min(len - i, AW88166_MAX_RAM_WRITE_BYTE_SIZE);
|
||||
ret = regmap_raw_write(aw_dev->regmap, AW88166_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)
|
||||
|
|
@ -933,7 +824,7 @@ static int aw_dev_get_ra(struct aw_cali_desc *cali_desc)
|
|||
int ret;
|
||||
|
||||
ret = aw_dev_dsp_read(aw_dev, AW88166_DSP_REG_CFG_ADPZ_RA,
|
||||
&dsp_ra, AW88166_DSP_32_DATA);
|
||||
&dsp_ra, AW_DSP_32_DATA);
|
||||
if (ret) {
|
||||
dev_err(aw_dev->dev, "read ra error\n");
|
||||
return ret;
|
||||
|
|
@ -990,29 +881,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, AW88166_DSP_ROM_CHECK_ADDR, ®_val);
|
||||
aw_dev_dsp_read(aw_dev, AW88166_DSP_ROM_CHECK_ADDR, ®_val, AW_DSP_16_DATA);
|
||||
if (reg_val != AW88166_DSP_ROM_CHECK_DATA) {
|
||||
dev_err(aw_dev->dev, "check dsp rom failed, read[0x%x] != check[0x%x]\n",
|
||||
reg_val, AW88166_DSP_ROM_CHECK_DATA);
|
||||
goto error;
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
/* check dsp_cfg_base_addr */
|
||||
aw_dev_dsp_write_16bit(aw_dev, AW88166_DSP_CFG_ADDR, AW88166_DSP_ODD_NUM_BIT_TEST);
|
||||
aw_dev_dsp_read_16bit(aw_dev, AW88166_DSP_CFG_ADDR, ®_val);
|
||||
aw_dev_dsp_write(aw_dev, AW88166_DSP_CFG_ADDR,
|
||||
AW88166_DSP_ODD_NUM_BIT_TEST, AW_DSP_16_DATA);
|
||||
aw_dev_dsp_read(aw_dev, AW88166_DSP_CFG_ADDR, ®_val, AW_DSP_16_DATA);
|
||||
if (reg_val != AW88166_DSP_ODD_NUM_BIT_TEST) {
|
||||
dev_err(aw_dev->dev, "check dsp cfg failed, read[0x%x] != write[0x%x]\n",
|
||||
reg_val, AW88166_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)
|
||||
|
|
|
|||
|
|
@ -516,11 +516,6 @@ enum AW88166_DEV_DSP_CFG {
|
|||
AW88166_DEV_DSP_BYPASS = 1,
|
||||
};
|
||||
|
||||
enum {
|
||||
AW88166_DSP_16_DATA = 0,
|
||||
AW88166_DSP_32_DATA = 1,
|
||||
};
|
||||
|
||||
enum {
|
||||
AW88166_SYNC_START = 0,
|
||||
AW88166_ASYNC_START,
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ static int aw_dev_dsp_write_32bit(struct aw_device *aw_dev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int aw_dev_dsp_write(struct aw_device *aw_dev,
|
||||
int aw_dev_dsp_write(struct aw_device *aw_dev,
|
||||
unsigned short dsp_addr, unsigned int dsp_data, unsigned char data_type)
|
||||
{
|
||||
u32 reg_value;
|
||||
|
|
@ -72,13 +72,13 @@ static int aw_dev_dsp_write(struct aw_device *aw_dev,
|
|||
|
||||
mutex_lock(&aw_dev->dsp_lock);
|
||||
switch (data_type) {
|
||||
case AW88395_DSP_16_DATA:
|
||||
case AW_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",
|
||||
(u32)dsp_addr, dsp_data);
|
||||
break;
|
||||
case AW88395_DSP_32_DATA:
|
||||
case AW_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",
|
||||
|
|
@ -97,6 +97,7 @@ static int aw_dev_dsp_write(struct aw_device *aw_dev,
|
|||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(aw_dev_dsp_write);
|
||||
|
||||
static int aw_dev_dsp_read_16bit(struct aw_device *aw_dev,
|
||||
unsigned short dsp_addr, unsigned int *dsp_data)
|
||||
|
|
@ -149,7 +150,7 @@ static int aw_dev_dsp_read_32bit(struct aw_device *aw_dev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int aw_dev_dsp_read(struct aw_device *aw_dev,
|
||||
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;
|
||||
|
|
@ -157,13 +158,13 @@ static int aw_dev_dsp_read(struct aw_device *aw_dev,
|
|||
|
||||
mutex_lock(&aw_dev->dsp_lock);
|
||||
switch (data_type) {
|
||||
case AW88395_DSP_16_DATA:
|
||||
case AW_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 AW88395_DSP_32_DATA:
|
||||
case AW_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",
|
||||
|
|
@ -182,7 +183,7 @@ static int aw_dev_dsp_read(struct aw_device *aw_dev,
|
|||
|
||||
return ret;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(aw_dev_dsp_read);
|
||||
|
||||
static int aw_dev_read_chipid(struct aw_device *aw_dev, u16 *chip_id)
|
||||
{
|
||||
|
|
@ -231,7 +232,7 @@ static int aw_dev_dsp_fw_check(struct aw_device *aw_dev)
|
|||
dsp_fw_desc = &set_prof_desc->sec_desc[AW88395_DATA_TYPE_DSP_FW];
|
||||
|
||||
for (i = 0; i < AW88395_FW_CHECK_PART; i++) {
|
||||
ret = aw_dev_dsp_read(aw_dev, addr, &dsp_val, AW88395_DSP_16_DATA);
|
||||
ret = aw_dev_dsp_read(aw_dev, addr, &dsp_val, AW_DSP_16_DATA);
|
||||
if (ret) {
|
||||
dev_err(aw_dev->dev, "dsp read failed");
|
||||
return ret;
|
||||
|
|
@ -351,11 +352,11 @@ static int aw_dev_modify_dsp_cfg(struct aw_device *aw_dev,
|
|||
return -EINVAL;
|
||||
}
|
||||
switch (data_type) {
|
||||
case AW88395_DSP_16_DATA:
|
||||
case AW_DSP_16_DATA:
|
||||
data1 = cpu_to_le16((u16)dsp_data);
|
||||
memcpy(crc_dsp_cfg->data + addr_offset, (u8 *)&data1, 2);
|
||||
break;
|
||||
case AW88395_DSP_32_DATA:
|
||||
case AW_DSP_32_DATA:
|
||||
data2 = cpu_to_le32(dsp_data);
|
||||
memcpy(crc_dsp_cfg->data + addr_offset, (u8 *)&data2, 4);
|
||||
break;
|
||||
|
|
@ -377,14 +378,14 @@ static int aw_dev_dsp_set_cali_re(struct aw_device *aw_dev)
|
|||
|
||||
/* set cali re to device */
|
||||
ret = aw_dev_dsp_write(aw_dev,
|
||||
AW88395_DSP_REG_CFG_ADPZ_RE, cali_re, AW88395_DSP_32_DATA);
|
||||
AW88395_DSP_REG_CFG_ADPZ_RE, cali_re, AW_DSP_32_DATA);
|
||||
if (ret) {
|
||||
dev_err(aw_dev->dev, "set cali re error");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = aw_dev_modify_dsp_cfg(aw_dev, AW88395_DSP_REG_CFG_ADPZ_RE,
|
||||
cali_re, AW88395_DSP_32_DATA);
|
||||
cali_re, AW_DSP_32_DATA);
|
||||
if (ret)
|
||||
dev_err(aw_dev->dev, "modify dsp cfg failed");
|
||||
|
||||
|
|
@ -428,7 +429,7 @@ static int aw_dev_dsp_set_crc32(struct aw_device *aw_dev)
|
|||
crc_value = crc32c(0xFFFFFFFF, crc_dsp_cfg->data, crc_data_len) ^ 0xFFFFFFFF;
|
||||
|
||||
return aw_dev_dsp_write(aw_dev, AW88395_DSP_REG_CRC_ADDR, crc_value,
|
||||
AW88395_DSP_32_DATA);
|
||||
AW_DSP_32_DATA);
|
||||
}
|
||||
|
||||
static void aw_dev_dsp_check_crc_enable(struct aw_device *aw_dev, bool flag)
|
||||
|
|
@ -663,7 +664,7 @@ static int aw_dev_set_vcalb(struct aw_device *aw_dev)
|
|||
int vcalb, vcalk;
|
||||
int ret;
|
||||
|
||||
ret = aw_dev_dsp_read(aw_dev, AW88395_DSP_REG_VCALB, &vcalb_adj, AW88395_DSP_16_DATA);
|
||||
ret = aw_dev_dsp_read(aw_dev, AW88395_DSP_REG_VCALB, &vcalb_adj, AW_DSP_16_DATA);
|
||||
if (ret) {
|
||||
dev_err(aw_dev->dev, "read vcalb_adj failed");
|
||||
return ret;
|
||||
|
|
@ -720,14 +721,14 @@ static int aw_dev_set_vcalb(struct aw_device *aw_dev)
|
|||
dev_dbg(aw_dev->dev, "vcalb=%d, reg_val=0x%x, vcalb_adj =0x%x",
|
||||
vcalb, reg_val, vcalb_adj);
|
||||
|
||||
ret = aw_dev_dsp_write(aw_dev, AW88395_DSP_REG_VCALB, reg_val, AW88395_DSP_16_DATA);
|
||||
ret = aw_dev_dsp_write(aw_dev, AW88395_DSP_REG_VCALB, reg_val, AW_DSP_16_DATA);
|
||||
if (ret) {
|
||||
dev_err(aw_dev->dev, "write vcalb failed");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = aw_dev_modify_dsp_cfg(aw_dev, AW88395_DSP_REG_VCALB,
|
||||
(u32)reg_val, AW88395_DSP_16_DATA);
|
||||
(u32)reg_val, AW_DSP_16_DATA);
|
||||
if (ret)
|
||||
dev_err(aw_dev->dev, "modify dsp cfg failed");
|
||||
|
||||
|
|
@ -741,7 +742,7 @@ static int aw_dev_get_cali_f0_delay(struct aw_device *aw_dev)
|
|||
int ret;
|
||||
|
||||
ret = aw_dev_dsp_read(aw_dev,
|
||||
AW88395_DSP_CALI_F0_DELAY, &cali_delay, AW88395_DSP_16_DATA);
|
||||
AW88395_DSP_CALI_F0_DELAY, &cali_delay, AW_DSP_16_DATA);
|
||||
if (ret)
|
||||
dev_err(aw_dev->dev, "read cali delay failed, ret=%d", ret);
|
||||
else
|
||||
|
|
@ -991,7 +992,7 @@ static int aw_dev_get_dsp_status(struct aw_device *aw_dev)
|
|||
|
||||
static int aw_dev_get_vmax(struct aw_device *aw_dev, unsigned int *vmax)
|
||||
{
|
||||
return aw_dev_dsp_read(aw_dev, AW88395_DSP_REG_VMAX, vmax, AW88395_DSP_16_DATA);
|
||||
return aw_dev_dsp_read(aw_dev, AW88395_DSP_REG_VMAX, vmax, AW_DSP_16_DATA);
|
||||
}
|
||||
|
||||
static int aw_dev_update_reg_container(struct aw_device *aw_dev,
|
||||
|
|
@ -1089,7 +1090,7 @@ static int aw_dev_get_ra(struct aw_cali_desc *cali_desc)
|
|||
int ret;
|
||||
|
||||
ret = aw_dev_dsp_read(aw_dev, AW88395_DSP_REG_CFG_ADPZ_RA,
|
||||
&dsp_ra, AW88395_DSP_32_DATA);
|
||||
&dsp_ra, AW_DSP_32_DATA);
|
||||
if (ret) {
|
||||
dev_err(aw_dev->dev, "read ra error");
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -89,8 +89,8 @@ enum AW88395_DEV_DSP_CFG {
|
|||
};
|
||||
|
||||
enum {
|
||||
AW88395_DSP_16_DATA = 0,
|
||||
AW88395_DSP_32_DATA = 1,
|
||||
AW_DSP_16_DATA = 0,
|
||||
AW_DSP_32_DATA = 1,
|
||||
};
|
||||
|
||||
enum {
|
||||
|
|
@ -210,5 +210,9 @@ int aw88395_dev_get_profile_count(struct aw_device *aw_dev);
|
|||
int aw88395_dev_load_acf_check(struct aw_device *aw_dev, struct aw_container *aw_cfg);
|
||||
int aw88395_dev_cfg_load(struct aw_device *aw_dev, struct aw_container *aw_cfg);
|
||||
void aw88395_dev_mute(struct aw_device *aw_dev, bool is_mute);
|
||||
int aw_dev_dsp_write(struct aw_device *aw_dev,
|
||||
unsigned short dsp_addr, unsigned int dsp_data, unsigned char data_type);
|
||||
int aw_dev_dsp_read(struct aw_device *aw_dev,
|
||||
unsigned short dsp_addr, unsigned int *dsp_data, unsigned char data_type);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -602,11 +602,6 @@ enum AW88399_DEV_DSP_CFG {
|
|||
AW88399_DEV_DSP_BYPASS = 1,
|
||||
};
|
||||
|
||||
enum {
|
||||
AW88399_DSP_16_DATA = 0,
|
||||
AW88399_DSP_32_DATA = 1,
|
||||
};
|
||||
|
||||
enum {
|
||||
AW88399_NOT_RCV_MODE = 0,
|
||||
AW88399_RCV_MODE = 1,
|
||||
|
|
|
|||
Loading…
Reference in New Issue