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:
Weidong Wang 2025-11-28 21:03:22 +08:00 committed by Mark Brown
parent b025f01ee9
commit fd16593d45
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
7 changed files with 58 additions and 353 deletions

View File

@ -50,9 +50,9 @@ snd-soc-audio-iio-aux-y := audio-iio-aux.o
snd-soc-aw8738-y := aw8738.o snd-soc-aw8738-y := aw8738.o
snd-soc-aw87390-y := aw87390.o snd-soc-aw87390-y := aw87390.o
snd-soc-aw88081-y := aw88081.o snd-soc-aw88081-y := aw88081.o
snd-soc-aw88395-lib-y := aw88395/aw88395_lib.o snd-soc-aw88395-lib-y := aw88395/aw88395_lib.o \
snd-soc-aw88395-y := aw88395/aw88395.o \
aw88395/aw88395_device.o aw88395/aw88395_device.o
snd-soc-aw88395-y := aw88395/aw88395.o
snd-soc-aw88166-y := aw88166.o snd-soc-aw88166-y := aw88166.o
snd-soc-aw88261-y := aw88261.o snd-soc-aw88261-y := aw88261.o
snd-soc-aw88399-y := aw88399.o snd-soc-aw88399-y := aw88399.o

View File

@ -41,109 +41,6 @@ static const struct regmap_config aw88166_remap_config = {
.val_format_endian = REGMAP_ENDIAN_BIG, .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, &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) static void aw_dev_pwd(struct aw_device *aw_dev, bool pwd)
{ {
int ret; int ret;
@ -904,25 +801,19 @@ static int aw_dev_dsp_update_container(struct aw_device *aw_dev,
u32 tmp_len; u32 tmp_len;
int i, ret; int i, ret;
mutex_lock(&aw_dev->dsp_lock);
ret = regmap_write(aw_dev->regmap, AW88166_DSPMADD_REG, base); ret = regmap_write(aw_dev->regmap, AW88166_DSPMADD_REG, base);
if (ret) if (ret)
goto error_operation; return ret;
for (i = 0; i < len; i += AW88166_MAX_RAM_WRITE_BYTE_SIZE) { for (i = 0; i < len; i += AW88166_MAX_RAM_WRITE_BYTE_SIZE) {
tmp_len = min(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, ret = regmap_raw_write(aw_dev->regmap, AW88166_DSPMDAT_REG,
&data[i], tmp_len); &data[i], tmp_len);
if (ret) if (ret)
goto error_operation; return ret;
} }
mutex_unlock(&aw_dev->dsp_lock);
return 0; return 0;
error_operation:
mutex_unlock(&aw_dev->dsp_lock);
return ret;
} }
static int aw_dev_get_ra(struct aw_cali_desc *cali_desc) 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; int ret;
ret = aw_dev_dsp_read(aw_dev, AW88166_DSP_REG_CFG_ADPZ_RA, 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) { if (ret) {
dev_err(aw_dev->dev, "read ra error\n"); dev_err(aw_dev->dev, "read ra error\n");
return ret; return ret;
@ -990,29 +881,25 @@ static int aw_dev_check_sram(struct aw_device *aw_dev)
{ {
unsigned int reg_val; unsigned int reg_val;
mutex_lock(&aw_dev->dsp_lock);
/* read dsp_rom_check_reg */ /* read dsp_rom_check_reg */
aw_dev_dsp_read_16bit(aw_dev, AW88166_DSP_ROM_CHECK_ADDR, &reg_val); aw_dev_dsp_read(aw_dev, AW88166_DSP_ROM_CHECK_ADDR, &reg_val, AW_DSP_16_DATA);
if (reg_val != AW88166_DSP_ROM_CHECK_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", dev_err(aw_dev->dev, "check dsp rom failed, read[0x%x] != check[0x%x]\n",
reg_val, AW88166_DSP_ROM_CHECK_DATA); reg_val, AW88166_DSP_ROM_CHECK_DATA);
goto error; return -EPERM;
} }
/* check dsp_cfg_base_addr */ /* 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_write(aw_dev, AW88166_DSP_CFG_ADDR,
aw_dev_dsp_read_16bit(aw_dev, AW88166_DSP_CFG_ADDR, &reg_val); AW88166_DSP_ODD_NUM_BIT_TEST, AW_DSP_16_DATA);
aw_dev_dsp_read(aw_dev, AW88166_DSP_CFG_ADDR, &reg_val, AW_DSP_16_DATA);
if (reg_val != AW88166_DSP_ODD_NUM_BIT_TEST) { 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", dev_err(aw_dev->dev, "check dsp cfg failed, read[0x%x] != write[0x%x]\n",
reg_val, AW88166_DSP_ODD_NUM_BIT_TEST); reg_val, AW88166_DSP_ODD_NUM_BIT_TEST);
goto error; return -EPERM;
} }
mutex_unlock(&aw_dev->dsp_lock);
return 0; 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) static void aw_dev_select_memclk(struct aw_device *aw_dev, unsigned char flag)

View File

@ -516,11 +516,6 @@ enum AW88166_DEV_DSP_CFG {
AW88166_DEV_DSP_BYPASS = 1, AW88166_DEV_DSP_BYPASS = 1,
}; };
enum {
AW88166_DSP_16_DATA = 0,
AW88166_DSP_32_DATA = 1,
};
enum { enum {
AW88166_SYNC_START = 0, AW88166_SYNC_START = 0,
AW88166_ASYNC_START, AW88166_ASYNC_START,

View File

@ -64,7 +64,7 @@ static int aw_dev_dsp_write_32bit(struct aw_device *aw_dev,
return 0; 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) unsigned short dsp_addr, unsigned int dsp_data, unsigned char data_type)
{ {
u32 reg_value; u32 reg_value;
@ -72,13 +72,13 @@ static int aw_dev_dsp_write(struct aw_device *aw_dev,
mutex_lock(&aw_dev->dsp_lock); mutex_lock(&aw_dev->dsp_lock);
switch (data_type) { 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); ret = aw_dev_dsp_write_16bit(aw_dev, dsp_addr, dsp_data);
if (ret) if (ret)
dev_err(aw_dev->dev, "write dsp_addr[0x%x] 16-bit dsp_data[0x%x] failed", dev_err(aw_dev->dev, "write dsp_addr[0x%x] 16-bit dsp_data[0x%x] failed",
(u32)dsp_addr, dsp_data); (u32)dsp_addr, dsp_data);
break; break;
case AW88395_DSP_32_DATA: case AW_DSP_32_DATA:
ret = aw_dev_dsp_write_32bit(aw_dev, dsp_addr, dsp_data); ret = aw_dev_dsp_write_32bit(aw_dev, dsp_addr, dsp_data);
if (ret) if (ret)
dev_err(aw_dev->dev, "write dsp_addr[0x%x] 32-bit dsp_data[0x%x] failed", 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; return ret;
} }
EXPORT_SYMBOL_GPL(aw_dev_dsp_write);
static int aw_dev_dsp_read_16bit(struct aw_device *aw_dev, static int aw_dev_dsp_read_16bit(struct aw_device *aw_dev,
unsigned short dsp_addr, unsigned int *dsp_data) 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; 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) unsigned short dsp_addr, unsigned int *dsp_data, unsigned char data_type)
{ {
u32 reg_value; u32 reg_value;
@ -157,13 +158,13 @@ static int aw_dev_dsp_read(struct aw_device *aw_dev,
mutex_lock(&aw_dev->dsp_lock); mutex_lock(&aw_dev->dsp_lock);
switch (data_type) { 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); ret = aw_dev_dsp_read_16bit(aw_dev, dsp_addr, dsp_data);
if (ret) if (ret)
dev_err(aw_dev->dev, "read dsp_addr[0x%x] 16-bit dsp_data[0x%x] failed", dev_err(aw_dev->dev, "read dsp_addr[0x%x] 16-bit dsp_data[0x%x] failed",
(u32)dsp_addr, *dsp_data); (u32)dsp_addr, *dsp_data);
break; break;
case AW88395_DSP_32_DATA: case AW_DSP_32_DATA:
ret = aw_dev_dsp_read_32bit(aw_dev, dsp_addr, dsp_data); ret = aw_dev_dsp_read_32bit(aw_dev, dsp_addr, dsp_data);
if (ret) if (ret)
dev_err(aw_dev->dev, "read dsp_addr[0x%x] 32r-bit dsp_data[0x%x] failed", 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; return ret;
} }
EXPORT_SYMBOL_GPL(aw_dev_dsp_read);
static int aw_dev_read_chipid(struct aw_device *aw_dev, u16 *chip_id) 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]; dsp_fw_desc = &set_prof_desc->sec_desc[AW88395_DATA_TYPE_DSP_FW];
for (i = 0; i < AW88395_FW_CHECK_PART; i++) { 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) { if (ret) {
dev_err(aw_dev->dev, "dsp read failed"); dev_err(aw_dev->dev, "dsp read failed");
return ret; return ret;
@ -351,11 +352,11 @@ static int aw_dev_modify_dsp_cfg(struct aw_device *aw_dev,
return -EINVAL; return -EINVAL;
} }
switch (data_type) { switch (data_type) {
case AW88395_DSP_16_DATA: case AW_DSP_16_DATA:
data1 = cpu_to_le16((u16)dsp_data); data1 = cpu_to_le16((u16)dsp_data);
memcpy(crc_dsp_cfg->data + addr_offset, (u8 *)&data1, 2); memcpy(crc_dsp_cfg->data + addr_offset, (u8 *)&data1, 2);
break; break;
case AW88395_DSP_32_DATA: case AW_DSP_32_DATA:
data2 = cpu_to_le32(dsp_data); data2 = cpu_to_le32(dsp_data);
memcpy(crc_dsp_cfg->data + addr_offset, (u8 *)&data2, 4); memcpy(crc_dsp_cfg->data + addr_offset, (u8 *)&data2, 4);
break; break;
@ -377,14 +378,14 @@ static int aw_dev_dsp_set_cali_re(struct aw_device *aw_dev)
/* set cali re to device */ /* set cali re to device */
ret = aw_dev_dsp_write(aw_dev, 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) { if (ret) {
dev_err(aw_dev->dev, "set cali re error"); dev_err(aw_dev->dev, "set cali re error");
return ret; return ret;
} }
ret = aw_dev_modify_dsp_cfg(aw_dev, AW88395_DSP_REG_CFG_ADPZ_RE, 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) if (ret)
dev_err(aw_dev->dev, "modify dsp cfg failed"); 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; 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, 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) 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 vcalb, vcalk;
int ret; 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) { if (ret) {
dev_err(aw_dev->dev, "read vcalb_adj failed"); dev_err(aw_dev->dev, "read vcalb_adj failed");
return ret; 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", dev_dbg(aw_dev->dev, "vcalb=%d, reg_val=0x%x, vcalb_adj =0x%x",
vcalb, reg_val, vcalb_adj); 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) { if (ret) {
dev_err(aw_dev->dev, "write vcalb failed"); dev_err(aw_dev->dev, "write vcalb failed");
return ret; return ret;
} }
ret = aw_dev_modify_dsp_cfg(aw_dev, AW88395_DSP_REG_VCALB, 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) if (ret)
dev_err(aw_dev->dev, "modify dsp cfg failed"); 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; int ret;
ret = aw_dev_dsp_read(aw_dev, 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) if (ret)
dev_err(aw_dev->dev, "read cali delay failed, ret=%d", ret); dev_err(aw_dev->dev, "read cali delay failed, ret=%d", ret);
else 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) 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, 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; int ret;
ret = aw_dev_dsp_read(aw_dev, AW88395_DSP_REG_CFG_ADPZ_RA, 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) { if (ret) {
dev_err(aw_dev->dev, "read ra error"); dev_err(aw_dev->dev, "read ra error");
return ret; return ret;

View File

@ -89,8 +89,8 @@ enum AW88395_DEV_DSP_CFG {
}; };
enum { enum {
AW88395_DSP_16_DATA = 0, AW_DSP_16_DATA = 0,
AW88395_DSP_32_DATA = 1, AW_DSP_32_DATA = 1,
}; };
enum { 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_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); 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); 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 #endif

View File

@ -26,172 +26,6 @@ static const struct regmap_config aw88399_remap_config = {
.val_format_endian = REGMAP_ENDIAN_BIG, .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, &reg_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, &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) static void aw_dev_pwd(struct aw_device *aw_dev, bool pwd)
{ {
int ret; int ret;
@ -929,25 +763,19 @@ static int aw_dev_dsp_update_container(struct aw_device *aw_dev,
u32 tmp_len; u32 tmp_len;
int i, ret; int i, ret;
mutex_lock(&aw_dev->dsp_lock);
ret = regmap_write(aw_dev->regmap, AW88399_DSPMADD_REG, base); ret = regmap_write(aw_dev->regmap, AW88399_DSPMADD_REG, base);
if (ret) if (ret)
goto error_operation; return ret;
for (i = 0; i < len; i += AW88399_MAX_RAM_WRITE_BYTE_SIZE) { for (i = 0; i < len; i += AW88399_MAX_RAM_WRITE_BYTE_SIZE) {
tmp_len = min(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, ret = regmap_raw_write(aw_dev->regmap, AW88399_DSPMDAT_REG,
&data[i], tmp_len); &data[i], tmp_len);
if (ret) if (ret)
goto error_operation; return ret;
} }
mutex_unlock(&aw_dev->dsp_lock);
return 0; return 0;
error_operation:
mutex_unlock(&aw_dev->dsp_lock);
return ret;
} }
static int aw_dev_get_ra(struct aw_cali_desc *cali_desc) 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; int ret;
ret = aw_dev_dsp_read(aw_dev, AW88399_DSP_REG_CFG_ADPZ_RA, 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) { if (ret) {
dev_err(aw_dev->dev, "read ra error"); dev_err(aw_dev->dev, "read ra error");
return ret; return ret;
@ -1015,29 +843,25 @@ static int aw_dev_check_sram(struct aw_device *aw_dev)
{ {
unsigned int reg_val; unsigned int reg_val;
mutex_lock(&aw_dev->dsp_lock);
/* read dsp_rom_check_reg */ /* read dsp_rom_check_reg */
aw_dev_dsp_read_16bit(aw_dev, AW88399_DSP_ROM_CHECK_ADDR, &reg_val); aw_dev_dsp_read(aw_dev, AW88399_DSP_ROM_CHECK_ADDR, &reg_val, AW_DSP_16_DATA);
if (reg_val != AW88399_DSP_ROM_CHECK_DATA) { if (reg_val != AW88399_DSP_ROM_CHECK_DATA) {
dev_err(aw_dev->dev, "check dsp rom failed, read[0x%x] != check[0x%x]", dev_err(aw_dev->dev, "check dsp rom failed, read[0x%x] != check[0x%x]",
reg_val, AW88399_DSP_ROM_CHECK_DATA); reg_val, AW88399_DSP_ROM_CHECK_DATA);
goto error; return -EPERM;
} }
/* check dsp_cfg_base_addr */ /* 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_write(aw_dev, AW88399_DSP_CFG_ADDR,
aw_dev_dsp_read_16bit(aw_dev, AW88399_DSP_CFG_ADDR, &reg_val); AW88399_DSP_ODD_NUM_BIT_TEST, AW_DSP_16_DATA);
aw_dev_dsp_read(aw_dev, AW88399_DSP_CFG_ADDR, &reg_val, AW_DSP_16_DATA);
if (reg_val != AW88399_DSP_ODD_NUM_BIT_TEST) { if (reg_val != AW88399_DSP_ODD_NUM_BIT_TEST) {
dev_err(aw_dev->dev, "check dsp cfg failed, read[0x%x] != write[0x%x]", dev_err(aw_dev->dev, "check dsp cfg failed, read[0x%x] != write[0x%x]",
reg_val, AW88399_DSP_ODD_NUM_BIT_TEST); reg_val, AW88399_DSP_ODD_NUM_BIT_TEST);
goto error; return -EPERM;
} }
mutex_unlock(&aw_dev->dsp_lock);
return 0; 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) 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; int ret;
ret = aw_dev_dsp_read(aw_dev, AW88399_DSP_REG_CFG_MBMEC_ACTAMPTH, 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) if (ret)
return ret; return ret;
ret = aw_dev_dsp_read(aw_dev, AW88399_DSP_REG_CFG_MBMEC_NOISEAMPTH, 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) if (ret)
return ret; return ret;
ret = aw_dev_dsp_read(aw_dev, AW88399_DSP_REG_CFG_ADPZ_USTEPN, 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) if (ret)
return ret; return ret;
ret = aw_dev_dsp_read(aw_dev, AW88399_DSP_REG_CFG_RE_ALPHA, 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; return ret;
} }
@ -1458,22 +1282,22 @@ static int aw_cali_svc_set_cali_cfg(struct aw_device *aw_dev,
int ret; int ret;
ret = aw_dev_dsp_write(aw_dev, AW88399_DSP_REG_CFG_MBMEC_ACTAMPTH, 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) if (ret)
return ret; return ret;
ret = aw_dev_dsp_write(aw_dev, AW88399_DSP_REG_CFG_MBMEC_NOISEAMPTH, 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) if (ret)
return ret; return ret;
ret = aw_dev_dsp_write(aw_dev, AW88399_DSP_REG_CFG_ADPZ_USTEPN, 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) if (ret)
return ret; return ret;
ret = aw_dev_dsp_write(aw_dev, AW88399_DSP_REG_CFG_RE_ALPHA, 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; 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, regmap_update_bits(aw_dev->regmap, AW88399_DBGCTRL_REG,
~AW883XX_DSP_NG_EN_MASK, AW883XX_DSP_NG_EN_DISABLE_VALUE); ~AW883XX_DSP_NG_EN_MASK, AW883XX_DSP_NG_EN_DISABLE_VALUE);
aw_dev_dsp_write(aw_dev, AW88399_DSP_LOW_POWER_SWITCH_CFG_ADDR, 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); ret = aw_cali_svc_get_cali_cfg(aw_dev);
if (ret) { 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, &reg_val); regmap_read(aw_dev->regmap, AW88399_DBGCTRL_REG, &reg_val);
backup_desc->dsp_ng_cfg = reg_val & (~AW883XX_DSP_NG_EN_MASK); 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, aw_dev_dsp_read(aw_dev, AW88399_DSP_LOW_POWER_SWITCH_CFG_ADDR, &dsp_val, AW_DSP_16_DATA);
&dsp_val, AW88399_DSP_16_DATA);
backup_desc->dsp_lp_cfg = dsp_val; 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); ~AW883XX_DSP_NG_EN_MASK, backup_desc->dsp_ng_cfg);
aw_dev_dsp_write(aw_dev, AW88399_DSP_LOW_POWER_SWITCH_CFG_ADDR, 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) 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; uint32_t dsp_re, show_re;
int ret; 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) if (ret)
return ret; return ret;

View File

@ -602,11 +602,6 @@ enum AW88399_DEV_DSP_CFG {
AW88399_DEV_DSP_BYPASS = 1, AW88399_DEV_DSP_BYPASS = 1,
}; };
enum {
AW88399_DSP_16_DATA = 0,
AW88399_DSP_32_DATA = 1,
};
enum { enum {
AW88399_NOT_RCV_MODE = 0, AW88399_NOT_RCV_MODE = 0,
AW88399_RCV_MODE = 1, AW88399_RCV_MODE = 1,