From nobody Mon Dec 1 22:07:37 2025 Received: from out198-27.us.a.mail.aliyun.com (out198-27.us.a.mail.aliyun.com [47.90.198.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C4ED119049B; Fri, 28 Nov 2025 13:03:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=47.90.198.27 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764335037; cv=none; b=XoN8hmCbmtkTYNgB0YGdyqyUAQjGy6JX/6GIcpovSxeEbDDgWQpy2avHE+X+qpomQsm86D72XYXQKqgjDYHSPMwakLqtePFPRb7whQmmj2lxRqoR/2D6WkBJgjFKaDjO0qYijugVOqHCAth8zReIuC/Z1PggzW7OJauN+igifiA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764335037; c=relaxed/simple; bh=P1Xaq9sfhJqtHW/gnxiPKDjSzx1j+WUrwvIrLe3sEl4=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=nl2uJagapLK5JM6bHdyF8fZS6Ocj3Ka4vXr17sjEYBbXuRWs3OFwHia6N3lG/s2xdNtXPdGTOGEFW1mEVcIQw/xOwEQDZyoRgCVIAUowby/FxNItUuFQn9q3Ga9H5tv17LG+BxALSeFY8NNT7ZbT+CB781va2RHBdthsBana038= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=awinic.com; spf=pass smtp.mailfrom=awinic.com; dkim=pass (2048-bit key) header.d=awinic.com header.i=@awinic.com header.b=AM59wq39; arc=none smtp.client-ip=47.90.198.27 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=awinic.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=awinic.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=awinic.com header.i=@awinic.com header.b="AM59wq39" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=awinic.com; s=default; t=1764335009; h=From:To:Subject:Date:Message-ID:MIME-Version; bh=mJ6rcDIWvjW+shum6zkZydY9HVJr7wIUjmNYWDwOWVI=; b=AM59wq39XgIIJL3Qe1cvoFbXHgYyU26f7iqQq1p+/3Fwv+aptJDtg7mNqkrcqwO3wFi6KrrMlhcz5LjKhIVJaq1W/TJlCUh1NbZ2Hbe6Bi5DS6w7JrCCnWlEKRy538LXVJEJU0NfygbuMtHpw1VODqPMWQhXPoNpdElf5AjLwenSFs0eIC+n921M1zlZCKL6dP3uUJerAPIrakM2KlHlnYONFhoNUGkaQGBfk8H65JDqEDflEAX+MKRdhKkBRVBxPZL8kp9zxkfBUfHIhY3BFXzAipJOaeKa7ySSvOitgl51fp7xIojM/H6j/YpCrmLVumozMTnZLY4NKcNhcXZpPQ== Received: from ubuntu-VirtualBox..(mailfrom:wangweidong.a@awinic.com fp:SMTPD_---.fYNuVZ3_1764335006 cluster:ay29) by smtp.aliyun-inc.com; Fri, 28 Nov 2025 21:03:28 +0800 From: wangweidong.a@awinic.com To: lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, cy_huang@richtek.com, srinivas.kandagatla@oss.qualcomm.com, zhangyi@everest-semi.com, wangweidong.a@awinic.com, nick.li@foursemi.com, alexey.klimov@linaro.org, linux@treblig.org, thorsten.blum@linux.dev, kuninori.morimoto.gx@renesas.com, marco.crivellari@suse.com, ardb@kernel.org, ebiggers@google.com, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org Cc: yijiangtao@awinic.com Subject: [PATCH V1] ASoC: codecs: Modify awinic amplifier dsp read and write functions Date: Fri, 28 Nov 2025 21:03:22 +0800 Message-ID: <20251128130323.628091-1-wangweidong.a@awinic.com> X-Mailer: git-send-email 2.47.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Weidong Wang 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 --- sound/soc/codecs/Makefile | 4 +- sound/soc/codecs/aw88166.c | 131 +------------ sound/soc/codecs/aw88166.h | 5 - sound/soc/codecs/aw88395/aw88395_device.c | 39 ++-- sound/soc/codecs/aw88395/aw88395_device.h | 8 +- sound/soc/codecs/aw88399.c | 219 +++------------------- sound/soc/codecs/aw88399.h | 5 - 7 files changed, 58 insertions(+), 353 deletions(-) diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile index 8701ed0f34f7..d687d4f74363 100644 --- a/sound/soc/codecs/Makefile +++ b/sound/soc/codecs/Makefile @@ -50,9 +50,9 @@ snd-soc-audio-iio-aux-y :=3D audio-iio-aux.o snd-soc-aw8738-y :=3D aw8738.o snd-soc-aw87390-y :=3D aw87390.o snd-soc-aw88081-y :=3D aw88081.o -snd-soc-aw88395-lib-y :=3D aw88395/aw88395_lib.o -snd-soc-aw88395-y :=3D aw88395/aw88395.o \ +snd-soc-aw88395-lib-y :=3D aw88395/aw88395_lib.o \ aw88395/aw88395_device.o +snd-soc-aw88395-y :=3D aw88395/aw88395.o snd-soc-aw88166-y :=3D aw88166.o snd-soc-aw88261-y :=3D aw88261.o snd-soc-aw88399-y :=3D aw88399.o diff --git a/sound/soc/codecs/aw88166.c b/sound/soc/codecs/aw88166.c index 1629906d5d33..daee4de9e3b0 100644 --- a/sound/soc/codecs/aw88166.c +++ b/sound/soc/codecs/aw88166.c @@ -41,109 +41,6 @@ static const struct regmap_config aw88166_remap_config = =3D { .val_format_endian =3D REGMAP_ENDIAN_BIG, }; =20 -static int aw_dev_dsp_write_16bit(struct aw_device *aw_dev, - unsigned short dsp_addr, unsigned int dsp_data) -{ - int ret; - - ret =3D regmap_write(aw_dev->regmap, AW88166_DSPMADD_REG, dsp_addr); - if (ret) { - dev_err(aw_dev->dev, "%s write addr error, ret=3D%d", __func__, ret); - return ret; - } - - ret =3D regmap_write(aw_dev->regmap, AW88166_DSPMDAT_REG, (u16)dsp_data); - if (ret) { - dev_err(aw_dev->dev, "%s write data error, ret=3D%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 =3D regmap_write(aw_dev->regmap, AW88166_DSPMADD_REG, dsp_addr); - if (ret) { - dev_err(aw_dev->dev, "%s write error, ret=3D%d", __func__, ret); - return ret; - } - - ret =3D regmap_read(aw_dev->regmap, AW88166_DSPMDAT_REG, &temp_data); - if (ret) { - dev_err(aw_dev->dev, "%s read error, ret=3D%d", __func__, ret); - return ret; - } - *dsp_data =3D 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 =3D regmap_write(aw_dev->regmap, AW88166_DSPMADD_REG, dsp_addr); - if (ret) { - dev_err(aw_dev->dev, "%s write error, ret=3D%d", __func__, ret); - return ret; - } - - ret =3D regmap_read(aw_dev->regmap, AW88166_DSPMDAT_REG, &temp_data); - if (ret) { - dev_err(aw_dev->dev, "%s read error, ret=3D%d", __func__, ret); - return ret; - } - *dsp_data =3D temp_data; - - ret =3D regmap_read(aw_dev->regmap, AW88166_DSPMDAT_REG, &temp_data); - if (ret) { - dev_err(aw_dev->dev, "%s read error, ret=3D%d", __func__, ret); - return ret; - } - *dsp_data |=3D (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 =3D 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 =3D 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 =3D -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=3D%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_devi= ce *aw_dev, u32 tmp_len; int i, ret; =20 - mutex_lock(&aw_dev->dsp_lock); ret =3D regmap_write(aw_dev->regmap, AW88166_DSPMADD_REG, base); if (ret) - goto error_operation; + return ret; =20 for (i =3D 0; i < len; i +=3D AW88166_MAX_RAM_WRITE_BYTE_SIZE) { tmp_len =3D min(len - i, AW88166_MAX_RAM_WRITE_BYTE_SIZE); ret =3D 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); =20 return 0; - -error_operation: - mutex_unlock(&aw_dev->dsp_lock); - return ret; } =20 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; =20 ret =3D 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; =20 - 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_D= ATA); if (reg_val !=3D AW88166_DSP_ROM_CHECK_DATA) { dev_err(aw_dev->dev, "check dsp rom failed, read[0x%x] !=3D check[0x%x]\= n", reg_val, AW88166_DSP_ROM_CHECK_DATA); - goto error; + return -EPERM; } =20 /* 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 !=3D AW88166_DSP_ODD_NUM_BIT_TEST) { dev_err(aw_dev->dev, "check dsp cfg failed, read[0x%x] !=3D write[0x%x]\= n", reg_val, AW88166_DSP_ODD_NUM_BIT_TEST); - goto error; + return -EPERM; } - mutex_unlock(&aw_dev->dsp_lock); =20 return 0; -error: - mutex_unlock(&aw_dev->dsp_lock); - return -EPERM; } =20 static void aw_dev_select_memclk(struct aw_device *aw_dev, unsigned char f= lag) diff --git a/sound/soc/codecs/aw88166.h b/sound/soc/codecs/aw88166.h index 3a53ba0ac625..9f3f47a7003e 100644 --- a/sound/soc/codecs/aw88166.h +++ b/sound/soc/codecs/aw88166.h @@ -516,11 +516,6 @@ enum AW88166_DEV_DSP_CFG { AW88166_DEV_DSP_BYPASS =3D 1, }; =20 -enum { - AW88166_DSP_16_DATA =3D 0, - AW88166_DSP_32_DATA =3D 1, -}; - enum { AW88166_SYNC_START =3D 0, AW88166_ASYNC_START, diff --git a/sound/soc/codecs/aw88395/aw88395_device.c b/sound/soc/codecs/a= w88395/aw88395_device.c index e1430940015d..79c3135a4110 100644 --- a/sound/soc/codecs/aw88395/aw88395_device.c +++ b/sound/soc/codecs/aw88395/aw88395_device.c @@ -64,7 +64,7 @@ static int aw_dev_dsp_write_32bit(struct aw_device *aw_de= v, return 0; } =20 -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, =20 mutex_lock(&aw_dev->dsp_lock); switch (data_type) { - case AW88395_DSP_16_DATA: + case AW_DSP_16_DATA: ret =3D 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 =3D 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, =20 return ret; } +EXPORT_SYMBOL_GPL(aw_dev_dsp_write); =20 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_d= ev, return 0; } =20 -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, =20 mutex_lock(&aw_dev->dsp_lock); switch (data_type) { - case AW88395_DSP_16_DATA: + case AW_DSP_16_DATA: ret =3D 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 =3D 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, =20 return ret; } - +EXPORT_SYMBOL_GPL(aw_dev_dsp_read); =20 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 =3D &set_prof_desc->sec_desc[AW88395_DATA_TYPE_DSP_FW]; =20 for (i =3D 0; i < AW88395_FW_CHECK_PART; i++) { - ret =3D aw_dev_dsp_read(aw_dev, addr, &dsp_val, AW88395_DSP_16_DATA); + ret =3D 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 =3D 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 =3D 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 *a= w_dev) =20 /* set cali re to device */ ret =3D 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; } =20 ret =3D 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"); =20 @@ -428,7 +429,7 @@ static int aw_dev_dsp_set_crc32(struct aw_device *aw_de= v) crc_value =3D crc32c(0xFFFFFFFF, crc_dsp_cfg->data, crc_data_len) ^ 0xFFF= FFFFF; =20 return aw_dev_dsp_write(aw_dev, AW88395_DSP_REG_CRC_ADDR, crc_value, - AW88395_DSP_32_DATA); + AW_DSP_32_DATA); } =20 static void aw_dev_dsp_check_crc_enable(struct aw_device *aw_dev, bool fla= g) @@ -663,7 +664,7 @@ static int aw_dev_set_vcalb(struct aw_device *aw_dev) int vcalb, vcalk; int ret; =20 - ret =3D aw_dev_dsp_read(aw_dev, AW88395_DSP_REG_VCALB, &vcalb_adj, AW8839= 5_DSP_16_DATA); + ret =3D 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=3D%d, reg_val=3D0x%x, vcalb_adj =3D0x%x", vcalb, reg_val, vcalb_adj); =20 - ret =3D aw_dev_dsp_write(aw_dev, AW88395_DSP_REG_VCALB, reg_val, AW88395_= DSP_16_DATA); + ret =3D aw_dev_dsp_write(aw_dev, AW88395_DSP_REG_VCALB, reg_val, AW_DSP_1= 6_DATA); if (ret) { dev_err(aw_dev->dev, "write vcalb failed"); return ret; } =20 ret =3D 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"); =20 @@ -741,7 +742,7 @@ static int aw_dev_get_cali_f0_delay(struct aw_device *a= w_dev) int ret; =20 ret =3D 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=3D%d", ret); else @@ -991,7 +992,7 @@ static int aw_dev_get_dsp_status(struct aw_device *aw_d= ev) =20 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= ); } =20 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_de= sc) int ret; =20 ret =3D 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; diff --git a/sound/soc/codecs/aw88395/aw88395_device.h b/sound/soc/codecs/a= w88395/aw88395_device.h index 6f8b30b475da..3626f222899d 100644 --- a/sound/soc/codecs/aw88395/aw88395_device.h +++ b/sound/soc/codecs/aw88395/aw88395_device.h @@ -89,8 +89,8 @@ enum AW88395_DEV_DSP_CFG { }; =20 enum { - AW88395_DSP_16_DATA =3D 0, - AW88395_DSP_32_DATA =3D 1, + AW_DSP_16_DATA =3D 0, + AW_DSP_32_DATA =3D 1, }; =20 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_contain= er *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= ); =20 #endif diff --git a/sound/soc/codecs/aw88399.c b/sound/soc/codecs/aw88399.c index d1237c5bf925..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 = =3D { .val_format_endian =3D REGMAP_ENDIAN_BIG, }; =20 -static int aw_dev_dsp_write_16bit(struct aw_device *aw_dev, - unsigned short dsp_addr, unsigned int dsp_data) -{ - int ret; - - ret =3D regmap_write(aw_dev->regmap, AW88399_DSPMADD_REG, dsp_addr); - if (ret) { - dev_err(aw_dev->dev, "%s write addr error, ret=3D%d", __func__, ret); - return ret; - } - - ret =3D regmap_write(aw_dev->regmap, AW88399_DSPMDAT_REG, (u16)dsp_data); - if (ret) { - dev_err(aw_dev->dev, "%s write data error, ret=3D%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 =3D regmap_write(aw_dev->regmap, AW88399_DSPMADD_REG, dsp_addr); - if (ret) { - dev_err(aw_dev->dev, "%s write addr error, ret=3D%d", __func__, ret); - return ret; - } - - temp_data =3D dsp_data & AW88395_DSP_16_DATA_MASK; - ret =3D regmap_write(aw_dev->regmap, AW88399_DSPMDAT_REG, temp_data); - if (ret) { - dev_err(aw_dev->dev, "%s write datal error, ret=3D%d", __func__, ret); - return ret; - } - - temp_data =3D dsp_data >> 16; - ret =3D regmap_write(aw_dev->regmap, AW88399_DSPMDAT_REG, temp_data); - if (ret) - dev_err(aw_dev->dev, "%s write datah error, ret=3D%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 =3D 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 =3D 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 =3D -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=3D%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 =3D regmap_write(aw_dev->regmap, AW88399_DSPMADD_REG, dsp_addr); - if (ret) { - dev_err(aw_dev->dev, "%s write error, ret=3D%d", __func__, ret); - return ret; - } - - ret =3D regmap_read(aw_dev->regmap, AW88399_DSPMDAT_REG, &temp_data); - if (ret) { - dev_err(aw_dev->dev, "%s read error, ret=3D%d", __func__, ret); - return ret; - } - *dsp_data =3D 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 =3D regmap_write(aw_dev->regmap, AW88399_DSPMADD_REG, dsp_addr); - if (ret) { - dev_err(aw_dev->dev, "%s write error, ret=3D%d", __func__, ret); - return ret; - } - - ret =3D regmap_read(aw_dev->regmap, AW88399_DSPMDAT_REG, &temp_data); - if (ret) { - dev_err(aw_dev->dev, "%s read error, ret=3D%d", __func__, ret); - return ret; - } - *dsp_data =3D temp_data; - - ret =3D regmap_read(aw_dev->regmap, AW88399_DSPMDAT_REG, &temp_data); - if (ret) { - dev_err(aw_dev->dev, "%s read error, ret=3D%d", __func__, ret); - return ret; - } - *dsp_data |=3D (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 =3D 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 =3D 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 =3D -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=3D%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_devi= ce *aw_dev, u32 tmp_len; int i, ret; =20 - mutex_lock(&aw_dev->dsp_lock); ret =3D regmap_write(aw_dev->regmap, AW88399_DSPMADD_REG, base); if (ret) - goto error_operation; + return ret; =20 for (i =3D 0; i < len; i +=3D AW88399_MAX_RAM_WRITE_BYTE_SIZE) { tmp_len =3D min(len - i, AW88399_MAX_RAM_WRITE_BYTE_SIZE); ret =3D 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); =20 return 0; - -error_operation: - mutex_unlock(&aw_dev->dsp_lock); - return ret; } =20 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; =20 ret =3D 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_de= v) { unsigned int reg_val; =20 - 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_D= ATA); if (reg_val !=3D AW88399_DSP_ROM_CHECK_DATA) { dev_err(aw_dev->dev, "check dsp rom failed, read[0x%x] !=3D check[0x%x]", reg_val, AW88399_DSP_ROM_CHECK_DATA); - goto error; + return -EPERM; } =20 /* 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 !=3D AW88399_DSP_ODD_NUM_BIT_TEST) { dev_err(aw_dev->dev, "check dsp cfg failed, read[0x%x] !=3D write[0x%x]", reg_val, AW88399_DSP_ODD_NUM_BIT_TEST); - goto error; + return -EPERM; } - mutex_unlock(&aw_dev->dsp_lock); =20 return 0; -error: - mutex_unlock(&aw_dev->dsp_lock); - return -EPERM; } =20 static void aw_dev_select_memclk(struct aw_device *aw_dev, unsigned char f= lag) @@ -1432,22 +1256,22 @@ static int aw_cali_svc_get_cali_cfg(struct aw_devic= e *aw_dev) int ret; =20 ret =3D 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; =20 ret =3D 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; =20 ret =3D 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; =20 ret =3D 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); =20 return ret; } @@ -1458,22 +1282,22 @@ static int aw_cali_svc_set_cali_cfg(struct aw_devic= e *aw_dev, int ret; =20 ret =3D 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; =20 ret =3D 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; =20 ret =3D 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; =20 ret =3D 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); =20 return ret; } @@ -1488,7 +1312,7 @@ static int aw_cali_svc_cali_en(struct aw_device *aw_d= ev, 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); =20 ret =3D 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 =3D reg_val & (~AW883XX_DSP_NG_EN_MASK); =20 - 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); =20 backup_desc->dsp_lp_cfg =3D 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); =20 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); } =20 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 *a= w_dev, uint32_t *re) uint32_t dsp_re, show_re; int ret; =20 - ret =3D aw_dev_dsp_read(aw_dev, AW88399_DSP_REG_CALRE, &dsp_re, AW88399_D= SP_16_DATA); + ret =3D aw_dev_dsp_read(aw_dev, AW88399_DSP_REG_CALRE, &dsp_re, AW_DSP_16= _DATA); if (ret) return ret; =20 diff --git a/sound/soc/codecs/aw88399.h b/sound/soc/codecs/aw88399.h index cacc03b1eefa..b386f4836748 100644 --- a/sound/soc/codecs/aw88399.h +++ b/sound/soc/codecs/aw88399.h @@ -602,11 +602,6 @@ enum AW88399_DEV_DSP_CFG { AW88399_DEV_DSP_BYPASS =3D 1, }; =20 -enum { - AW88399_DSP_16_DATA =3D 0, - AW88399_DSP_32_DATA =3D 1, -}; - enum { AW88399_NOT_RCV_MODE =3D 0, AW88399_RCV_MODE =3D 1, base-commit: 3362786aaba1cdb8fd4e6b950140a42f15a71ade --=20 2.47.0