Unverified Commit fd16593d authored by Weidong Wang's avatar Weidong Wang Committed by Mark Brown
Browse files

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: default avatarWeidong Wang <wangweidong.a@awinic.com>
Link: https://patch.msgid.link/20251128130323.628091-1-wangweidong.a@awinic.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent b025f01e
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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
+9 −122
Original line number Diff line number Diff line
@@ -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, &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, &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) {
		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, &reg_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, &reg_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)
+0 −5
Original line number Diff line number Diff line
@@ -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,
+20 −19
Original line number Diff line number Diff line
@@ -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;
+6 −2
Original line number Diff line number Diff line
@@ -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
Loading