From nobody Wed Oct 1 23:35:32 2025 Received: from out198-21.us.a.mail.aliyun.com (out198-21.us.a.mail.aliyun.com [47.90.198.21]) (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 550B22EFDAB; Fri, 26 Sep 2025 10:26:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=47.90.198.21 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758882392; cv=none; b=ePb269Pww4sR7JRPn1y+Sxz1wL+AdkeWJpkXie96+JPseq8T/qPqnGK+Kq8c28IGBXqWlzQHtnr5hvVQxEQ3kNoNzNgxNN1os20BCEcFXQe/7niKhz1+4WOI9lrx6vQ9wP8y3O1le4wjd2QixcUFwrgchH4HWubyCJEwecVbSj4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758882392; c=relaxed/simple; bh=I1OucDUHrSBgrZ1xvnZ8rP+Btk4sdbt+W0GcWLi+a4o=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=INveFinrKS4VN3mYAWAb+1bWa5AxcVBuWHPbLYeKx/1HEWCbfImrM2bwTOT4MF+wE5jlXkyQLa/uiz1S7d3wFhfBJETEzv1kN/SXh7ssHKOhQWHQZZ8V5zMjATgZUpC/k0GfksZGKIBZtqFoj/uAs4MnIfb+ZZZPnD4EMlruxoU= 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=jxI/KCow; arc=none smtp.client-ip=47.90.198.21 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="jxI/KCow" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=awinic.com; s=default; t=1758882375; h=From:To:Subject:Date:Message-ID:MIME-Version; bh=gTK9I+5C+gXVIJ8cNIVMFSjeFqQcgwWj7Bg5gOLOieE=; b=jxI/KCowrTwCEdGJRLsze/I8KKGIaSOljQfz3xuyteCeTPElxq08R3iDiy4H99jYnuDiT/umq3E33XHCBBdV8gHA60Rmdp+1QDe7tlxLJPFknJcflPVP4MZ+rMbOG1HlX8N4zW9/wBNFxgxb4Ter6YflhAwvwoM8an90HJxiVZB/yFmwuHEKp9HQSLhH+CZPPN4sPboGrY+zZNA53HKAXN1x97u6KbckSPs44UzS3IFMR/I99KKoGKIi1NCWZ0T9ZGlkBTF3mIlfZCSjy/NxTsQNuJ/X+devnLt1HRumErzqNnUFS4oI74QQ6FrZoz2CdbRCgenM2ag+UkBWCMy7Eg== Received: from ubuntu-VirtualBox..(mailfrom:wangweidong.a@awinic.com fp:SMTPD_---.ensjP6d_1758882054 cluster:ay29) by smtp.aliyun-inc.com; Fri, 26 Sep 2025 18:20:55 +0800 From: wangweidong.a@awinic.com To: lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, wangweidong.a@awinic.com, cy_huang@richtek.com, ivprusov@salutedevices.com, zhoubinbin@loongson.cn, zhangyi@everest-semi.com, jack.yu@realtek.com, shenghao-ding@ti.com, rf@opensource.cirrus.com, git@apitzsch.eu, nuno.sa@analog.com, colin.i.king@gmail.com, thorsten.blum@linux.dev, yesanishhere@gmail.com, ebiggers@google.com, ardb@kernel.org, zhujun2@cmss.chinamobile.com, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org Subject: [PATCH V1 7/7] ASoC: codecs: Rework the aw88399 driver Date: Fri, 26 Sep 2025 18:20:37 +0800 Message-ID: <20250926102037.27697-8-wangweidong.a@awinic.com> X-Mailer: git-send-email 2.47.0 In-Reply-To: <20250926102037.27697-1-wangweidong.a@awinic.com> References: <20250926102037.27697-1-wangweidong.a@awinic.com> 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 interface for calling the aw88399 driver to adapt it for aw-common-device.c and aw-common-firmware.c Signed-off-by: Weidong Wang --- sound/soc/codecs/aw88399.c | 1025 ++++++++---------------------------- sound/soc/codecs/aw88399.h | 93 +--- 2 files changed, 217 insertions(+), 901 deletions(-) diff --git a/sound/soc/codecs/aw88399.c b/sound/soc/codecs/aw88399.c index 58846feb013d..0be105ff48a7 100644 --- a/sound/soc/codecs/aw88399.c +++ b/sound/soc/codecs/aw88399.c @@ -11,12 +11,23 @@ #include #include #include -#include #include -#include #include +#include #include "aw88399.h" -#include "aw88395/aw88395_device.h" +#include "aw-common-device.h" +#include "aw-common-firmware.h" + +struct aw88399 { + struct aw_device *aw_pa; + struct mutex lock; + struct delayed_work start_work; + struct regmap *regmap; + unsigned int check_val; + unsigned int crc_init_val; + unsigned int vcalb_init_val; + unsigned int dither_st; +}; =20 static const struct regmap_config aw88399_remap_config =3D { .val_bits =3D 16, @@ -26,214 +37,7 @@ 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; - - if (pwd) - ret =3D regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, - ~AW88399_PWDN_MASK, AW88399_PWDN_POWER_DOWN_VALUE); - else - ret =3D regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, - ~AW88399_PWDN_MASK, AW88399_PWDN_WORKING_VALUE); - - if (ret) - dev_dbg(aw_dev->dev, "%s failed", __func__); -} - -static void aw_dev_get_int_status(struct aw_device *aw_dev, unsigned short= *int_status) -{ - unsigned int reg_val; - int ret; - - ret =3D regmap_read(aw_dev->regmap, AW88399_SYSINT_REG, ®_val); - if (ret) - dev_err(aw_dev->dev, "read interrupt reg fail, ret=3D%d", ret); - else - *int_status =3D reg_val; - - dev_dbg(aw_dev->dev, "read interrupt reg=3D0x%04x", *int_status); -} - -static void aw_dev_clear_int_status(struct aw_device *aw_dev) -{ - u16 int_status; - - /* read int status and clear */ - aw_dev_get_int_status(aw_dev, &int_status); - /* make sure int status is clear */ - aw_dev_get_int_status(aw_dev, &int_status); - if (int_status) - dev_dbg(aw_dev->dev, "int status(%d) is not cleaned.\n", int_status); -} - -static int aw_dev_get_iis_status(struct aw_device *aw_dev) +static int aw88399_get_iis_status(struct aw_device *aw_dev) { unsigned int reg_val; int ret; @@ -249,15 +53,15 @@ static int aw_dev_get_iis_status(struct aw_device *aw_= dev) return 0; } =20 -static int aw_dev_check_mode1_pll(struct aw_device *aw_dev) +static int aw88399_check_mode1_pll(struct aw_device *aw_dev) { int ret, i; =20 for (i =3D 0; i < AW88399_DEV_SYSST_CHECK_MAX; i++) { - ret =3D aw_dev_get_iis_status(aw_dev); + ret =3D aw88399_get_iis_status(aw_dev); if (ret) { dev_err(aw_dev->dev, "mode1 iis signal check error"); - usleep_range(AW88399_2000_US, AW88399_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); } else { return 0; } @@ -266,7 +70,7 @@ static int aw_dev_check_mode1_pll(struct aw_device *aw_d= ev) return -EPERM; } =20 -static int aw_dev_check_mode2_pll(struct aw_device *aw_dev) +static int aw88399_check_mode2_pll(struct aw_device *aw_dev) { unsigned int reg_val; int ret, i; @@ -288,10 +92,10 @@ static int aw_dev_check_mode2_pll(struct aw_device *aw= _dev) return ret; =20 for (i =3D 0; i < AW88399_DEV_SYSST_CHECK_MAX; i++) { - ret =3D aw_dev_get_iis_status(aw_dev); + ret =3D aw88399_get_iis_status(aw_dev); if (ret) { dev_err(aw_dev->dev, "mode2 iis signal check error"); - usleep_range(AW88399_2000_US, AW88399_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); } else { break; } @@ -301,12 +105,12 @@ static int aw_dev_check_mode2_pll(struct aw_device *a= w_dev) regmap_update_bits(aw_dev->regmap, AW88399_PLLCTRL2_REG, ~AW88399_CCO_MUX_MASK, AW88399_CCO_MUX_BYPASS_VALUE); if (ret =3D=3D 0) { - usleep_range(AW88399_2000_US, AW88399_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); for (i =3D 0; i < AW88399_DEV_SYSST_CHECK_MAX; i++) { - ret =3D aw_dev_get_iis_status(aw_dev); + ret =3D aw88399_get_iis_status(aw_dev); if (ret) { dev_err(aw_dev->dev, "mode2 switch to mode1, iis signal check error"); - usleep_range(AW88399_2000_US, AW88399_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); } else { break; } @@ -316,14 +120,14 @@ static int aw_dev_check_mode2_pll(struct aw_device *a= w_dev) return ret; } =20 -static int aw_dev_check_syspll(struct aw_device *aw_dev) +static int aw88399_check_syspll(struct aw_device *aw_dev) { int ret; =20 - ret =3D aw_dev_check_mode1_pll(aw_dev); + ret =3D aw88399_check_mode1_pll(aw_dev); if (ret) { dev_dbg(aw_dev->dev, "mode1 check iis failed try switch to mode2 check"); - ret =3D aw_dev_check_mode2_pll(aw_dev); + ret =3D aw88399_check_mode2_pll(aw_dev); if (ret) { dev_err(aw_dev->dev, "mode2 check iis failed"); return ret; @@ -333,7 +137,7 @@ static int aw_dev_check_syspll(struct aw_device *aw_dev) return 0; } =20 -static int aw_dev_check_sysst(struct aw_device *aw_dev) +static int aw88399_check_sysst(struct aw_device *aw_dev) { unsigned int check_val; unsigned int reg_val; @@ -356,7 +160,7 @@ static int aw_dev_check_sysst(struct aw_device *aw_dev) if ((reg_val & (~AW88399_BIT_SYSST_CHECK_MASK) & check_val) !=3D check_v= al) { dev_err(aw_dev->dev, "check sysst fail, cnt=3D%d, reg_val=3D0x%04x, che= ck:0x%x", i, reg_val, AW88399_BIT_SYSST_NOSWS_CHECK); - usleep_range(AW88399_2000_US, AW88399_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); } else { return 0; } @@ -365,36 +169,6 @@ static int aw_dev_check_sysst(struct aw_device *aw_dev) return -EPERM; } =20 -static void aw_dev_amppd(struct aw_device *aw_dev, bool amppd) -{ - int ret; - - if (amppd) - ret =3D regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, - ~AW88399_AMPPD_MASK, AW88399_AMPPD_POWER_DOWN_VALUE); - else - ret =3D regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, - ~AW88399_AMPPD_MASK, AW88399_AMPPD_WORKING_VALUE); - - if (ret) - dev_dbg(aw_dev->dev, "%s failed", __func__); -} - -static void aw_dev_dsp_enable(struct aw_device *aw_dev, bool is_enable) -{ - int ret; - - if (is_enable) - ret =3D regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, - ~AW88399_DSPBY_MASK, AW88399_DSPBY_WORKING_VALUE); - else - ret =3D regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, - ~AW88399_DSPBY_MASK, AW88399_DSPBY_BYPASS_VALUE); - - if (ret) - dev_dbg(aw_dev->dev, "%s failed\n", __func__); -} - static int aw88399_dev_get_icalk(struct aw88399 *aw88399, int16_t *icalk) { uint16_t icalkh_val, icalkl_val, icalk_val; @@ -487,7 +261,7 @@ static int aw88399_dev_get_internal_vcalk(struct aw8839= 9 *aw88399, int16_t *vcal return 0; } =20 -static int aw_dev_set_vcalb(struct aw88399 *aw88399) +static int aw88399_set_vcalb(struct aw88399 *aw88399) { struct aw_device *aw_dev =3D aw88399->aw_pa; unsigned int vsense_select, vsense_value; @@ -540,7 +314,7 @@ static int aw_dev_set_vcalb(struct aw88399 *aw88399) return 0; } =20 -static int aw_dev_update_cali_re(struct aw_cali_desc *cali_desc) +static int aw88399_update_cali_re(struct aw_cali_desc *cali_desc) { struct aw_device *aw_dev =3D container_of(cali_desc, struct aw_device, cali_desc); @@ -571,7 +345,7 @@ static int aw_dev_update_cali_re(struct aw_cali_desc *c= ali_desc) return ret; } =20 -static int aw_dev_fw_crc_check(struct aw_device *aw_dev) +static int aw88399_fw_crc_check(struct aw_device *aw_dev) { uint16_t check_val, fw_len_val; unsigned int reg_val; @@ -589,7 +363,7 @@ static int aw_dev_fw_crc_check(struct aw_device *aw_dev) ret =3D regmap_update_bits(aw_dev->regmap, AW88399_CRCCTRL_REG, ~AW88399_CRC_CODE_EN_MASK, AW88399_CRC_CODE_EN_ENABLE_VALUE); =20 - usleep_range(AW88399_2000_US, AW88399_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); =20 /* read crc check result */ regmap_read(aw_dev->regmap, AW88399_HAGCST_REG, ®_val); @@ -613,7 +387,7 @@ static int aw_dev_fw_crc_check(struct aw_device *aw_dev) return ret; } =20 -static int aw_dev_cfg_crc_check(struct aw_device *aw_dev) +static int aw88399_cfg_crc_check(struct aw_device *aw_dev) { uint16_t check_val, cfg_len_val; unsigned int reg_val; @@ -634,7 +408,7 @@ static int aw_dev_cfg_crc_check(struct aw_device *aw_de= v) if (ret) return ret; =20 - usleep_range(AW88399_1000_US, AW88399_1000_US + 10); + usleep_range(AW_1000_US, AW_1000_US + 10); =20 /* read crc check result */ ret =3D regmap_read(aw_dev->regmap, AW88399_HAGCST_REG, ®_val); @@ -658,7 +432,7 @@ static int aw_dev_cfg_crc_check(struct aw_device *aw_de= v) return ret; } =20 -static int aw_dev_hw_crc_check(struct aw88399 *aw88399) +static int aw88399_hw_crc_check(struct aw88399 *aw88399) { struct aw_device *aw_dev =3D aw88399->aw_pa; int ret; @@ -668,13 +442,13 @@ static int aw_dev_hw_crc_check(struct aw88399 *aw8839= 9) if (ret) return ret; =20 - ret =3D aw_dev_fw_crc_check(aw_dev); + ret =3D aw88399_fw_crc_check(aw_dev); if (ret) { dev_err(aw_dev->dev, "fw_crc_check failed\n"); goto crc_check_failed; } =20 - ret =3D aw_dev_cfg_crc_check(aw_dev); + ret =3D aw88399_cfg_crc_check(aw_dev); if (ret) { dev_err(aw_dev->dev, "cfg_crc_check failed\n"); goto crc_check_failed; @@ -695,199 +469,104 @@ static int aw_dev_hw_crc_check(struct aw88399 *aw88= 399) return ret; } =20 -static void aw_dev_i2s_tx_enable(struct aw_device *aw_dev, bool flag) -{ - int ret; - - if (flag) - ret =3D regmap_update_bits(aw_dev->regmap, AW88399_I2SCTRL3_REG, - ~AW88399_I2STXEN_MASK, AW88399_I2STXEN_ENABLE_VALUE); - else - ret =3D regmap_update_bits(aw_dev->regmap, AW88399_I2SCFG1_REG, - ~AW88399_I2STXEN_MASK, AW88399_I2STXEN_DISABLE_VALUE); - - if (ret) - dev_dbg(aw_dev->dev, "%s failed", __func__); -} - -static int aw_dev_get_dsp_status(struct aw_device *aw_dev) -{ - unsigned int reg_val; - int ret; - - ret =3D regmap_read(aw_dev->regmap, AW88399_WDT_REG, ®_val); - if (ret) - return ret; - if (!(reg_val & (~AW88399_WDT_CNT_MASK))) - return -EPERM; - - return 0; -} - -static int aw_dev_dsp_check(struct aw_device *aw_dev) +static int aw88399_dsp_check(struct aw_device *aw_dev) { int ret, i; =20 - switch (aw_dev->dsp_cfg) { - case AW88399_DEV_DSP_BYPASS: - dev_dbg(aw_dev->dev, "dsp bypass"); - ret =3D 0; - break; - case AW88399_DEV_DSP_WORK: - aw_dev_dsp_enable(aw_dev, false); - aw_dev_dsp_enable(aw_dev, true); - usleep_range(AW88399_1000_US, AW88399_1000_US + 10); - for (i =3D 0; i < AW88399_DEV_DSP_CHECK_MAX; i++) { - ret =3D aw_dev_get_dsp_status(aw_dev); - if (ret) { - dev_err(aw_dev->dev, "dsp wdt status error=3D%d", ret); - usleep_range(AW88399_2000_US, AW88399_2000_US + 10); - } + regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, + ~AW88399_DSPBY_MASK, AW88399_DSPBY_BYPASS_VALUE); + regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, + ~AW88399_DSPBY_MASK, AW88399_DSPBY_WORKING_VALUE); + usleep_range(AW_1000_US, AW_1000_US + 10); + for (i =3D 0; i < AW88399_DEV_DSP_CHECK_MAX; i++) { + ret =3D aw_dev_get_dsp_status(aw_dev); + if (ret) { + dev_err(aw_dev->dev, "dsp wdt status error=3D%d", ret); + usleep_range(AW_2000_US, AW_2000_US + 10); } - break; - default: - dev_err(aw_dev->dev, "unknown dsp cfg=3D%d", aw_dev->dsp_cfg); - ret =3D -EINVAL; - break; } =20 return ret; } =20 -static int aw_dev_set_volume(struct aw_device *aw_dev, unsigned int value) +static void aw88399_set_volume(struct aw_device *aw_dev, unsigned int valu= e) { struct aw_volume_desc *vol_desc =3D &aw_dev->volume_desc; unsigned int reg_value; u16 real_value; - int ret; =20 real_value =3D min((value + vol_desc->init_volume), (unsigned int)AW88399= _MUTE_VOL); =20 - ret =3D regmap_read(aw_dev->regmap, AW88399_SYSCTRL2_REG, ®_value); - if (ret) - return ret; + regmap_read(aw_dev->regmap, AW88399_SYSCTRL2_REG, ®_value); =20 dev_dbg(aw_dev->dev, "value 0x%x , reg:0x%x", value, real_value); =20 real_value =3D (real_value << AW88399_VOL_START_BIT) | (reg_value & AW883= 99_VOL_MASK); =20 - ret =3D regmap_write(aw_dev->regmap, AW88399_SYSCTRL2_REG, real_value); - - return ret; -} - -static void aw_dev_fade_in(struct aw_device *aw_dev) -{ - struct aw_volume_desc *desc =3D &aw_dev->volume_desc; - u16 fade_in_vol =3D desc->ctl_volume; - int fade_step =3D aw_dev->fade_step; - int i; - - if (fade_step =3D=3D 0 || aw_dev->fade_in_time =3D=3D 0) { - aw_dev_set_volume(aw_dev, fade_in_vol); - return; - } - - for (i =3D AW88399_MUTE_VOL; i >=3D fade_in_vol; i -=3D fade_step) { - aw_dev_set_volume(aw_dev, i); - usleep_range(aw_dev->fade_in_time, aw_dev->fade_in_time + 10); - } - - if (i !=3D fade_in_vol) - aw_dev_set_volume(aw_dev, fade_in_vol); -} - -static void aw_dev_fade_out(struct aw_device *aw_dev) -{ - struct aw_volume_desc *desc =3D &aw_dev->volume_desc; - int fade_step =3D aw_dev->fade_step; - int i; - - if (fade_step =3D=3D 0 || aw_dev->fade_out_time =3D=3D 0) { - aw_dev_set_volume(aw_dev, AW88399_MUTE_VOL); - return; - } - - for (i =3D desc->ctl_volume; i <=3D AW88399_MUTE_VOL; i +=3D fade_step) { - aw_dev_set_volume(aw_dev, i); - usleep_range(aw_dev->fade_out_time, aw_dev->fade_out_time + 10); - } - - if (i !=3D AW88399_MUTE_VOL) { - aw_dev_set_volume(aw_dev, AW88399_MUTE_VOL); - usleep_range(aw_dev->fade_out_time, aw_dev->fade_out_time + 10); - } + regmap_write(aw_dev->regmap, AW88399_SYSCTRL2_REG, real_value); } =20 static void aw88399_dev_mute(struct aw_device *aw_dev, bool is_mute) { if (is_mute) { - aw_dev_fade_out(aw_dev); + aw_dev_fade_out(aw_dev, aw88399_set_volume); regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, ~AW88399_HMUTE_MASK, AW88399_HMUTE_ENABLE_VALUE); } else { regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, ~AW88399_HMUTE_MASK, AW88399_HMUTE_DISABLE_VALUE); - aw_dev_fade_in(aw_dev); + aw_dev_fade_in(aw_dev, aw88399_set_volume); } } =20 -static void aw88399_dev_set_dither(struct aw88399 *aw88399, bool dither) -{ - struct aw_device *aw_dev =3D aw88399->aw_pa; - - if (dither) - regmap_update_bits(aw_dev->regmap, AW88399_DBGCTRL_REG, - ~AW88399_DITHER_EN_MASK, AW88399_DITHER_EN_ENABLE_VALUE); - else - regmap_update_bits(aw_dev->regmap, AW88399_DBGCTRL_REG, - ~AW88399_DITHER_EN_MASK, AW88399_DITHER_EN_DISABLE_VALUE); -} - static int aw88399_dev_start(struct aw88399 *aw88399) { struct aw_device *aw_dev =3D aw88399->aw_pa; int ret; =20 - if (aw_dev->status =3D=3D AW88399_DEV_PW_ON) { + if (aw_dev->status =3D=3D AW_DEV_PW_ON) { dev_dbg(aw_dev->dev, "already power on"); return 0; } =20 - aw88399_dev_set_dither(aw88399, false); + regmap_update_bits(aw_dev->regmap, AW88399_DBGCTRL_REG, + ~AW88399_DITHER_EN_MASK, AW88399_DITHER_EN_DISABLE_VALUE); =20 /* power on */ - aw_dev_pwd(aw_dev, false); - usleep_range(AW88399_2000_US, AW88399_2000_US + 10); + regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, + ~AW88399_PWDN_MASK, AW88399_PWDN_WORKING_VALUE); + usleep_range(AW_2000_US, AW_2000_US + 10); =20 - ret =3D aw_dev_check_syspll(aw_dev); + ret =3D aw88399_check_syspll(aw_dev); if (ret) { dev_err(aw_dev->dev, "pll check failed cannot start"); goto pll_check_fail; } =20 /* amppd on */ - aw_dev_amppd(aw_dev, false); - usleep_range(AW88399_1000_US, AW88399_1000_US + 50); + regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, + ~AW88399_PWDN_MASK, AW88399_PWDN_WORKING_VALUE); + usleep_range(AW_1000_US, AW_1000_US + 50); =20 /* check i2s status */ - ret =3D aw_dev_check_sysst(aw_dev); + ret =3D aw88399_check_sysst(aw_dev); if (ret) { dev_err(aw_dev->dev, "sysst check failed"); goto sysst_check_fail; } =20 - if (aw_dev->dsp_cfg =3D=3D AW88399_DEV_DSP_WORK) { - ret =3D aw_dev_hw_crc_check(aw88399); + if (aw_dev->dsp_cfg =3D=3D AW_DEV_DSP_WORK) { + ret =3D aw88399_hw_crc_check(aw88399); if (ret) { dev_err(aw_dev->dev, "dsp crc check failed"); goto crc_check_fail; } - aw_dev_dsp_enable(aw_dev, false); - aw_dev_set_vcalb(aw88399); - aw_dev_update_cali_re(&aw_dev->cali_desc); + regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, + ~AW88399_DSPBY_MASK, AW88399_DSPBY_BYPASS_VALUE); + aw88399_set_vcalb(aw88399); + aw88399_update_cali_re(&aw_dev->cali_desc); =20 - ret =3D aw_dev_dsp_check(aw_dev); + ret =3D aw88399_dsp_check(aw_dev); if (ret) { dev_err(aw_dev->dev, "dsp status check failed"); goto dsp_check_fail; @@ -897,68 +576,45 @@ static int aw88399_dev_start(struct aw88399 *aw88399) } =20 /* enable tx feedback */ - aw_dev_i2s_tx_enable(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88399_I2SCTRL3_REG, + ~AW88399_I2STXEN_MASK, AW88399_I2STXEN_ENABLE_VALUE); =20 if (aw88399->dither_st =3D=3D AW88399_DITHER_EN_ENABLE_VALUE) - aw88399_dev_set_dither(aw88399, true); + regmap_update_bits(aw_dev->regmap, AW88399_DBGCTRL_REG, + ~AW88399_DITHER_EN_MASK, AW88399_DITHER_EN_ENABLE_VALUE); =20 /* close mute */ aw88399_dev_mute(aw_dev, false); /* clear inturrupt */ aw_dev_clear_int_status(aw_dev); - aw_dev->status =3D AW88399_DEV_PW_ON; + aw_dev->status =3D AW_DEV_PW_ON; =20 return 0; =20 dsp_check_fail: crc_check_fail: - aw_dev_dsp_enable(aw_dev, false); + regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, + ~AW88399_DSPBY_MASK, AW88399_DSPBY_BYPASS_VALUE); sysst_check_fail: aw_dev_clear_int_status(aw_dev); - aw_dev_amppd(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, + ~AW88399_AMPPD_MASK, AW88399_AMPPD_POWER_DOWN_VALUE); pll_check_fail: - aw_dev_pwd(aw_dev, true); - aw_dev->status =3D AW88399_DEV_PW_OFF; - - return ret; -} - -static int aw_dev_dsp_update_container(struct aw_device *aw_dev, - unsigned char *data, unsigned int len, unsigned short base) -{ - u32 tmp_len; - int i, ret; - - mutex_lock(&aw_dev->dsp_lock); - ret =3D regmap_write(aw_dev->regmap, AW88399_DSPMADD_REG, base); - if (ret) - goto error_operation; - - 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; - } - mutex_unlock(&aw_dev->dsp_lock); - - return 0; + regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, + ~AW88399_PWDN_MASK, AW88399_PWDN_POWER_DOWN_VALUE); + aw_dev->status =3D AW_DEV_PW_OFF; =20 -error_operation: - mutex_unlock(&aw_dev->dsp_lock); return ret; } =20 -static int aw_dev_get_ra(struct aw_cali_desc *cali_desc) +static int aw88399_get_ra(struct aw_device *aw_dev) { - struct aw_device *aw_dev =3D - container_of(cali_desc, struct aw_device, cali_desc); + struct aw_cali_desc *cali_desc =3D &aw_dev->cali_desc; u32 dsp_ra; 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; @@ -970,54 +626,12 @@ static int aw_dev_get_ra(struct aw_cali_desc *cali_de= sc) return 0; } =20 -static int aw_dev_dsp_update_cfg(struct aw_device *aw_dev, - unsigned char *data, unsigned int len) -{ - int ret; - - dev_dbg(aw_dev->dev, "dsp config len:%d", len); - - if (!len || !data) { - dev_err(aw_dev->dev, "dsp config data is null or len is 0"); - return -EINVAL; - } - - ret =3D aw_dev_dsp_update_container(aw_dev, data, len, AW88399_DSP_CFG_AD= DR); - if (ret) - return ret; - - aw_dev->dsp_cfg_len =3D len; - - ret =3D aw_dev_get_ra(&aw_dev->cali_desc); - - return ret; -} - -static int aw_dev_dsp_update_fw(struct aw_device *aw_dev, - unsigned char *data, unsigned int len) -{ - int ret; - - dev_dbg(aw_dev->dev, "dsp firmware len:%d", len); - - if (!len || !data) { - dev_err(aw_dev->dev, "dsp firmware data is null or len is 0"); - return -EINVAL; - } - - aw_dev->dsp_fw_len =3D len; - ret =3D aw_dev_dsp_update_container(aw_dev, data, len, AW88399_DSP_FW_ADD= R); - - return ret; -} - -static int aw_dev_check_sram(struct aw_device *aw_dev) +static int aw88399_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, 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); @@ -1025,64 +639,22 @@ static int aw_dev_check_sram(struct aw_device *aw_de= v) } =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; } - 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) -{ - int ret; - - switch (flag) { - case AW88399_DEV_MEMCLK_PLL: - ret =3D regmap_update_bits(aw_dev->regmap, AW88399_DBGCTRL_REG, - ~AW88399_MEM_CLKSEL_MASK, - AW88399_MEM_CLKSEL_DAPHCLK_VALUE); - if (ret) - dev_err(aw_dev->dev, "memclk select pll failed"); - break; - case AW88399_DEV_MEMCLK_OSC: - ret =3D regmap_update_bits(aw_dev->regmap, AW88399_DBGCTRL_REG, - ~AW88399_MEM_CLKSEL_MASK, - AW88399_MEM_CLKSEL_OSCCLK_VALUE); - if (ret) - dev_err(aw_dev->dev, "memclk select OSC failed"); - break; - default: - dev_err(aw_dev->dev, "unknown memclk config, flag=3D0x%x", flag); - break; - } -} - -static void aw_dev_get_cur_mode_st(struct aw_device *aw_dev) -{ - struct aw_profctrl_desc *profctrl_desc =3D &aw_dev->profctrl_desc; - unsigned int reg_val; - int ret; - - ret =3D regmap_read(aw_dev->regmap, AW88399_SYSCTRL_REG, ®_val); - if (ret) { - dev_dbg(aw_dev->dev, "%s failed", __func__); - return; - } - if ((reg_val & (~AW88399_RCV_MODE_MASK)) =3D=3D AW88399_RCV_MODE_RECEIVER= _VALUE) - profctrl_desc->cur_mode =3D AW88399_RCV_MODE; - else - profctrl_desc->cur_mode =3D AW88399_NOT_RCV_MODE; -} - -static int aw_dev_update_reg_container(struct aw88399 *aw88399, +static int aw88399_reg_update(struct aw88399 *aw88399, unsigned char *data, unsigned int len) { struct aw_device *aw_dev =3D aw88399->aw_pa; @@ -1111,9 +683,9 @@ static int aw_dev_update_reg_container(struct aw88399 = *aw88399, =20 if (reg_addr =3D=3D AW88399_SYSCTRL_REG) { if (reg_val & (~AW88399_DSPBY_MASK)) - aw_dev->dsp_cfg =3D AW88399_DEV_DSP_BYPASS; + aw_dev->dsp_cfg =3D AW_DEV_DSP_BYPASS; else - aw_dev->dsp_cfg =3D AW88399_DEV_DSP_WORK; + aw_dev->dsp_cfg =3D AW_DEV_DSP_WORK; =20 reg_val &=3D (AW88399_HMUTE_MASK | AW88399_PWDN_MASK | AW88399_DSPBY_MASK); @@ -1136,7 +708,7 @@ static int aw_dev_update_reg_container(struct aw88399 = *aw88399, if ((reg_val & (~AW88399_EF_DBMD_MASK)) =3D=3D AW88399_EF_DBMD_OR_VALUE) aw88399->check_val =3D AW_EF_OR_CHECK; else - aw88399->check_val =3D AW_EF_AND_CHECK; + aw88399->check_val =3D AW_EF_AND_CHECK; =20 aw88399->dither_st =3D reg_val & (~AW88399_DITHER_EN_MASK); } @@ -1149,69 +721,17 @@ static int aw_dev_update_reg_container(struct aw8839= 9 *aw88399, return ret; } =20 - aw_dev_pwd(aw_dev, false); - usleep_range(AW88399_1000_US, AW88399_1000_US + 10); - - aw_dev_get_cur_mode_st(aw_dev); + usleep_range(AW_1000_US, AW_1000_US + 10); =20 if (aw_dev->prof_cur !=3D aw_dev->prof_index) vol_desc->ctl_volume =3D 0; else - aw_dev_set_volume(aw_dev, vol_desc->ctl_volume); - - return 0; -} - -static int aw_dev_reg_update(struct aw88399 *aw88399, - unsigned char *data, unsigned int len) -{ - int ret; - - if (!len || !data) { - dev_err(aw88399->aw_pa->dev, "reg data is null or len is 0"); - return -EINVAL; - } - - ret =3D aw_dev_update_reg_container(aw88399, data, len); - if (ret) - dev_err(aw88399->aw_pa->dev, "reg update failed"); - - return ret; -} - -static int aw88399_dev_get_prof_name(struct aw_device *aw_dev, int index, = char **prof_name) -{ - struct aw_prof_info *prof_info =3D &aw_dev->prof_info; - struct aw_prof_desc *prof_desc; - - if ((index >=3D aw_dev->prof_info.count) || (index < 0)) { - dev_err(aw_dev->dev, "index[%d] overflow count[%d]", - index, aw_dev->prof_info.count); - return -EINVAL; - } - - prof_desc =3D &aw_dev->prof_info.prof_desc[index]; - - *prof_name =3D prof_info->prof_name_list[prof_desc->id]; - - return 0; -} - -static int aw88399_dev_get_prof_data(struct aw_device *aw_dev, int index, - struct aw_prof_desc **prof_desc) -{ - if ((index >=3D aw_dev->prof_info.count) || (index < 0)) { - dev_err(aw_dev->dev, "%s: index[%d] overflow count[%d]\n", - __func__, index, aw_dev->prof_info.count); - return -EINVAL; - } - - *prof_desc =3D &aw_dev->prof_info.prof_desc[index]; + aw88399_set_volume(aw_dev, vol_desc->ctl_volume); =20 return 0; } =20 -static int aw88399_dev_fw_update(struct aw88399 *aw88399, bool up_dsp_fw_e= n, bool force_up_en) +static int aw88399_fw_update(struct aw88399 *aw88399, bool up_dsp_fw_en, b= ool force_up_en) { struct aw_device *aw_dev =3D aw88399->aw_pa; struct aw_prof_desc *prof_index_desc; @@ -1220,52 +740,52 @@ static int aw88399_dev_fw_update(struct aw88399 *aw8= 8399, bool up_dsp_fw_en, boo int ret; =20 if ((aw_dev->prof_cur =3D=3D aw_dev->prof_index) && - (force_up_en =3D=3D AW88399_FORCE_UPDATE_OFF)) { + (force_up_en =3D=3D AW_FORCE_UPDATE_OFF)) { dev_dbg(aw_dev->dev, "scene no change, not update"); return 0; } =20 - if (aw_dev->fw_status =3D=3D AW88399_DEV_FW_FAILED) { + if (aw_dev->fw_status =3D=3D AW_DEV_FW_FAILED) { dev_err(aw_dev->dev, "fw status[%d] error", aw_dev->fw_status); return -EPERM; } =20 - ret =3D aw88399_dev_get_prof_name(aw_dev, aw_dev->prof_index, &prof_name); + ret =3D aw_dev_get_prof_name(aw_dev, aw_dev->prof_index, &prof_name); if (ret) return ret; =20 dev_dbg(aw_dev->dev, "start update %s", prof_name); =20 - ret =3D aw88399_dev_get_prof_data(aw_dev, aw_dev->prof_index, &prof_index= _desc); + ret =3D aw_dev_get_prof_data(aw_dev, aw_dev->prof_index, &prof_index_desc= ); if (ret) return ret; =20 /* update reg */ sec_desc =3D prof_index_desc->sec_desc; - ret =3D aw_dev_reg_update(aw88399, sec_desc[AW88395_DATA_TYPE_REG].data, - sec_desc[AW88395_DATA_TYPE_REG].len); + ret =3D aw88399_reg_update(aw88399, sec_desc[AW_DATA_TYPE_REG].data, + sec_desc[AW_DATA_TYPE_REG].len); if (ret) { dev_err(aw_dev->dev, "update reg failed"); return ret; } =20 - aw88399_dev_mute(aw_dev, true); - - if (aw_dev->dsp_cfg =3D=3D AW88399_DEV_DSP_WORK) - aw_dev_dsp_enable(aw_dev, false); + regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, + ~AW88399_PWDN_MASK, AW88399_PWDN_WORKING_VALUE); =20 - aw_dev_select_memclk(aw_dev, AW88399_DEV_MEMCLK_OSC); - - ret =3D aw_dev_check_sram(aw_dev); - if (ret) { - dev_err(aw_dev->dev, "check sram failed"); - goto error; - } + regmap_update_bits(aw_dev->regmap, AW88399_DBGCTRL_REG, + ~AW88399_MEM_CLKSEL_MASK, AW88399_MEM_CLKSEL_OSCCLK_VALUE); =20 if (up_dsp_fw_en) { + ret =3D aw88399_check_sram(aw_dev); + if (ret) { + dev_err(aw_dev->dev, "check sram failed"); + goto error; + } + dev_dbg(aw_dev->dev, "fw_ver: [%x]", prof_index_desc->fw_ver); - ret =3D aw_dev_dsp_update_fw(aw_dev, sec_desc[AW88395_DATA_TYPE_DSP_FW].= data, - sec_desc[AW88395_DATA_TYPE_DSP_FW].len); + ret =3D aw_dev_dsp_update_fw(aw_dev, sec_desc[AW_DATA_TYPE_DSP_FW].data, + sec_desc[AW_DATA_TYPE_DSP_FW].len, + sec_desc[AW_DATA_TYPE_DSP_FW].addr); if (ret) { dev_err(aw_dev->dev, "update dsp fw failed"); goto error; @@ -1273,21 +793,25 @@ static int aw88399_dev_fw_update(struct aw88399 *aw8= 8399, bool up_dsp_fw_en, boo } =20 /* update dsp config */ - ret =3D aw_dev_dsp_update_cfg(aw_dev, sec_desc[AW88395_DATA_TYPE_DSP_CFG]= .data, - sec_desc[AW88395_DATA_TYPE_DSP_CFG].len); + ret =3D aw_dev_dsp_update_cfg(aw_dev, sec_desc[AW_DATA_TYPE_DSP_CFG].data, + sec_desc[AW_DATA_TYPE_DSP_CFG].len, + sec_desc[AW_DATA_TYPE_DSP_CFG].addr); if (ret) { dev_err(aw_dev->dev, "update dsp cfg failed"); goto error; } =20 - aw_dev_select_memclk(aw_dev, AW88399_DEV_MEMCLK_PLL); + aw88399_get_ra(aw_dev); + regmap_update_bits(aw_dev->regmap, AW88399_DBGCTRL_REG, + ~AW88399_MEM_CLKSEL_MASK, AW88399_MEM_CLKSEL_DAPHCLK_VALUE); =20 aw_dev->prof_cur =3D aw_dev->prof_index; =20 return 0; =20 error: - aw_dev_select_memclk(aw_dev, AW88399_DEV_MEMCLK_PLL); + regmap_update_bits(aw_dev->regmap, AW88399_DBGCTRL_REG, + ~AW88399_MEM_CLKSEL_MASK, AW88399_MEM_CLKSEL_DAPHCLK_VALUE); return ret; } =20 @@ -1299,7 +823,7 @@ static void aw88399_start_pa(struct aw88399 *aw88399) ret =3D aw88399_dev_start(aw88399); if (ret) { dev_err(aw88399->aw_pa->dev, "aw88399 device start failed. retry =3D %d= ", i); - ret =3D aw88399_dev_fw_update(aw88399, AW88399_DSP_FW_UPDATE_ON, true); + ret =3D aw88399_fw_update(aw88399, AW_DSP_FW_UPDATE_ON, true); if (ret) { dev_err(aw88399->aw_pa->dev, "fw update failed"); continue; @@ -1325,27 +849,27 @@ static void aw88399_start(struct aw88399 *aw88399, b= ool sync_start) { int ret; =20 - if (aw88399->aw_pa->fw_status !=3D AW88399_DEV_FW_OK) + if (aw88399->aw_pa->fw_status !=3D AW_DEV_FW_OK) return; =20 - if (aw88399->aw_pa->status =3D=3D AW88399_DEV_PW_ON) + if (aw88399->aw_pa->status =3D=3D AW_DEV_PW_ON) return; =20 - ret =3D aw88399_dev_fw_update(aw88399, AW88399_DSP_FW_UPDATE_OFF, true); + ret =3D aw88399_fw_update(aw88399, AW_DSP_FW_UPDATE_OFF, + aw88399->aw_pa->phase_sync); if (ret) { dev_err(aw88399->aw_pa->dev, "fw update failed."); return; } =20 - if (sync_start =3D=3D AW88399_SYNC_START) + if (sync_start =3D=3D AW_SYNC_START) aw88399_start_pa(aw88399); else queue_delayed_work(system_wq, - &aw88399->start_work, - AW88399_START_WORK_DELAY_MS); + &aw88399->start_work, AW88399_START_WORK_DELAY_MS); } =20 -static int aw_dev_check_sysint(struct aw_device *aw_dev) +static int aw88399_check_sysint(struct aw_device *aw_dev) { u16 reg_val; =20 @@ -1361,38 +885,44 @@ static int aw_dev_check_sysint(struct aw_device *aw_= dev) static int aw88399_stop(struct aw_device *aw_dev) { struct aw_sec_data_desc *dsp_cfg =3D - &aw_dev->prof_info.prof_desc[aw_dev->prof_cur].sec_desc[AW88395_DATA_TYP= E_DSP_CFG]; + &aw_dev->prof_info.prof_desc[aw_dev->prof_cur].sec_desc[AW_DATA_TYPE_DSP= _CFG]; struct aw_sec_data_desc *dsp_fw =3D - &aw_dev->prof_info.prof_desc[aw_dev->prof_cur].sec_desc[AW88395_DATA_TYP= E_DSP_FW]; + &aw_dev->prof_info.prof_desc[aw_dev->prof_cur].sec_desc[AW_DATA_TYPE_DSP= _FW]; int int_st; =20 - if (aw_dev->status =3D=3D AW88399_DEV_PW_OFF) { + if (aw_dev->status =3D=3D AW_DEV_PW_OFF) { dev_dbg(aw_dev->dev, "already power off"); return 0; } =20 - aw_dev->status =3D AW88399_DEV_PW_OFF; + aw_dev->status =3D AW_DEV_PW_OFF; =20 aw88399_dev_mute(aw_dev, true); - usleep_range(AW88399_4000_US, AW88399_4000_US + 100); + usleep_range(AW_4000_US, AW_4000_US + 100); =20 - aw_dev_i2s_tx_enable(aw_dev, false); - usleep_range(AW88399_1000_US, AW88399_1000_US + 100); + regmap_update_bits(aw_dev->regmap, AW88399_I2SCFG1_REG, + ~AW88399_I2STXEN_MASK, AW88399_I2STXEN_DISABLE_VALUE); + usleep_range(AW_1000_US, AW_1000_US + 100); =20 - int_st =3D aw_dev_check_sysint(aw_dev); + int_st =3D aw88399_check_sysint(aw_dev); =20 - aw_dev_dsp_enable(aw_dev, false); + regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, + ~AW88399_DSPBY_MASK, AW88399_DSPBY_BYPASS_VALUE); =20 - aw_dev_amppd(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, + ~AW88399_AMPPD_MASK, AW88399_AMPPD_POWER_DOWN_VALUE); =20 if (int_st) { - aw_dev_select_memclk(aw_dev, AW88399_DEV_MEMCLK_OSC); - aw_dev_dsp_update_fw(aw_dev, dsp_fw->data, dsp_fw->len); - aw_dev_dsp_update_cfg(aw_dev, dsp_cfg->data, dsp_cfg->len); - aw_dev_select_memclk(aw_dev, AW88399_DEV_MEMCLK_PLL); + regmap_update_bits(aw_dev->regmap, AW88399_DBGCTRL_REG, + ~AW88399_MEM_CLKSEL_MASK, AW88399_MEM_CLKSEL_OSCCLK_VALUE); + aw_dev_dsp_update_fw(aw_dev, dsp_fw->data, dsp_fw->len, dsp_fw->addr); + aw_dev_dsp_update_cfg(aw_dev, dsp_cfg->data, dsp_cfg->len, dsp_cfg->addr= ); + regmap_update_bits(aw_dev->regmap, AW88399_DBGCTRL_REG, + ~AW88399_MEM_CLKSEL_MASK, AW88399_MEM_CLKSEL_DAPHCLK_VALUE); } =20 - aw_dev_pwd(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, + ~AW88399_PWDN_MASK, AW88399_PWDN_POWER_DOWN_VALUE); =20 return 0; } @@ -1432,22 +962,22 @@ static int aw_cali_svc_get_cali_cfg(struct aw_device= *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 +988,22 @@ static int aw_cali_svc_set_cali_cfg(struct aw_device= *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; } @@ -1483,17 +1013,19 @@ static int aw_cali_svc_cali_en(struct aw_device *aw= _dev, bool cali_en) struct cali_cfg set_cfg; int ret; =20 - aw_dev_dsp_enable(aw_dev, false); + regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, + ~AW88399_DSPBY_MASK, AW88399_DSPBY_BYPASS_VALUE); if (cali_en) { regmap_update_bits(aw_dev->regmap, AW88399_DBGCTRL_REG, - ~AW883XX_DSP_NG_EN_MASK, AW883XX_DSP_NG_EN_DISABLE_VALUE); + ~AW88399_DSP_NG_EN_MASK, AW88399_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) { dev_err(aw_dev->dev, "get cali cfg failed\n"); - aw_dev_dsp_enable(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, + ~AW88399_DSPBY_MASK, AW88399_DSPBY_WORKING_VALUE); return ret; } set_cfg.data[0] =3D 0; @@ -1505,14 +1037,16 @@ static int aw_cali_svc_cali_en(struct aw_device *aw= _dev, bool cali_en) if (ret) { dev_err(aw_dev->dev, "set cali cfg failed\n"); aw_cali_svc_set_cali_cfg(aw_dev, aw_dev->cali_desc.cali_cfg); - aw_dev_dsp_enable(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, + ~AW88399_DSPBY_MASK, AW88399_DSPBY_WORKING_VALUE); return ret; } } else { aw_cali_svc_set_cali_cfg(aw_dev, aw_dev->cali_desc.cali_cfg); } =20 - aw_dev_dsp_enable(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, + ~AW88399_DSPBY_MASK, AW88399_DSPBY_WORKING_VALUE); =20 return 0; } @@ -1546,10 +1080,10 @@ static void aw_cali_svc_backup_info(struct aw_devic= e *aw_dev) unsigned int reg_val, dsp_val; =20 regmap_read(aw_dev->regmap, AW88399_DBGCTRL_REG, ®_val); - backup_desc->dsp_ng_cfg =3D reg_val & (~AW883XX_DSP_NG_EN_MASK); + backup_desc->dsp_ng_cfg =3D reg_val & (~AW88399_DSP_NG_EN_MASK); =20 aw_dev_dsp_read(aw_dev, AW88399_DSP_LOW_POWER_SWITCH_CFG_ADDR, - &dsp_val, AW88399_DSP_16_DATA); + &dsp_val, AW_DSP_16_DATA); =20 backup_desc->dsp_lp_cfg =3D dsp_val; } @@ -1559,10 +1093,10 @@ static void aw_cali_svc_recover_info(struct aw_devi= ce *aw_dev) struct aw_cali_backup_desc *backup_desc =3D &aw_dev->cali_desc.backup_inf= o; =20 regmap_update_bits(aw_dev->regmap, AW88399_DBGCTRL_REG, - ~AW883XX_DSP_NG_EN_MASK, backup_desc->dsp_ng_cfg); + ~AW88399_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) @@ -1570,7 +1104,7 @@ static int aw_cali_svc_cali_re_mode_enable(struct aw_= device *aw_dev, bool is_ena int ret; =20 if (is_enable) { - ret =3D aw_dev_check_syspll(aw_dev); + ret =3D aw88399_check_syspll(aw_dev); if (ret) { dev_err(aw_dev->dev, "pll check failed cannot start\n"); return ret; @@ -1609,7 +1143,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 @@ -1695,9 +1229,11 @@ static int aw_cali_svc_get_smooth_cali_re(struct aw_= device *aw_dev) aw_dev->cali_desc.cali_re =3D dsp_re; dev_dbg(aw_dev->dev, "re[%d]mohm\n", aw_dev->cali_desc.cali_re); =20 - aw_dev_dsp_enable(aw_dev, false); - aw_dev_update_cali_re(&aw_dev->cali_desc); - aw_dev_dsp_enable(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, + ~AW88399_DSPBY_MASK, AW88399_DSPBY_BYPASS_VALUE); + aw88399_update_cali_re(&aw_dev->cali_desc); + regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG, + ~AW88399_DSPBY_MASK, AW88399_DSPBY_WORKING_VALUE); =20 return 0; =20 @@ -1850,7 +1386,7 @@ static int aw88399_profile_info(struct snd_kcontrol *= kcontrol, =20 count =3D uinfo->value.enumerated.item; =20 - ret =3D aw88399_dev_get_prof_name(aw88399->aw_pa, count, &prof_name); + ret =3D aw_dev_get_prof_name(aw88399->aw_pa, count, &prof_name); if (ret) { strscpy(uinfo->value.enumerated.name, "null"); return 0; @@ -1889,7 +1425,7 @@ static int aw88399_profile_set(struct snd_kcontrol *k= control, =20 if (aw88399->aw_pa->status) { aw88399_stop(aw88399->aw_pa); - aw88399_start(aw88399, AW88399_SYNC_START); + aw88399_start(aw88399, AW_SYNC_START); } =20 mutex_unlock(&aw88399->lock); @@ -1925,7 +1461,7 @@ static int aw88399_volume_set(struct snd_kcontrol *kc= ontrol, =20 if (vol_desc->ctl_volume !=3D value) { vol_desc->ctl_volume =3D value; - aw_dev_set_volume(aw88399->aw_pa, vol_desc->ctl_volume); + aw88399_set_volume(aw88399->aw_pa, vol_desc->ctl_volume); =20 return 1; } @@ -2046,86 +1582,6 @@ static int aw88399_calib_set(struct snd_kcontrol *kc= ontrol, return 0; } =20 -static int aw88399_dev_init(struct aw88399 *aw88399, struct aw_container *= aw_cfg) -{ - struct aw_device *aw_dev =3D aw88399->aw_pa; - int ret; - - ret =3D aw88395_dev_cfg_load(aw_dev, aw_cfg); - if (ret) { - dev_err(aw_dev->dev, "aw_dev acf parse failed"); - return -EINVAL; - } - aw_dev->fade_in_time =3D AW88399_1000_US / 10; - aw_dev->fade_out_time =3D AW88399_1000_US >> 1; - aw_dev->prof_cur =3D aw_dev->prof_info.prof_desc[0].id; - aw_dev->prof_index =3D aw_dev->prof_info.prof_desc[0].id; - - ret =3D aw88399_dev_fw_update(aw88399, AW88399_FORCE_UPDATE_ON, AW88399_D= SP_FW_UPDATE_ON); - if (ret) { - dev_err(aw_dev->dev, "fw update failed ret =3D %d\n", ret); - return ret; - } - - aw88399_dev_mute(aw_dev, true); - - /* close tx feedback */ - aw_dev_i2s_tx_enable(aw_dev, false); - usleep_range(AW88399_1000_US, AW88399_1000_US + 100); - - /* enable amppd */ - aw_dev_amppd(aw_dev, true); - - /* close dsp */ - aw_dev_dsp_enable(aw_dev, false); - /* set power down */ - aw_dev_pwd(aw_dev, true); - - return 0; -} - -static int aw88399_request_firmware_file(struct aw88399 *aw88399) -{ - const struct firmware *cont =3D NULL; - int ret; - - aw88399->aw_pa->fw_status =3D AW88399_DEV_FW_FAILED; - - ret =3D request_firmware(&cont, AW88399_ACF_FILE, aw88399->aw_pa->dev); - if (ret) { - dev_err(aw88399->aw_pa->dev, "request [%s] failed!", AW88399_ACF_FILE); - return ret; - } - - dev_dbg(aw88399->aw_pa->dev, "loaded %s - size: %zu\n", - AW88399_ACF_FILE, cont ? cont->size : 0); - - aw88399->aw_cfg =3D devm_kzalloc(aw88399->aw_pa->dev, - struct_size(aw88399->aw_cfg, data, cont->size), GFP_KERNEL); - if (!aw88399->aw_cfg) { - release_firmware(cont); - return -ENOMEM; - } - aw88399->aw_cfg->len =3D (int)cont->size; - memcpy(aw88399->aw_cfg->data, cont->data, cont->size); - release_firmware(cont); - - ret =3D aw88395_dev_load_acf_check(aw88399->aw_pa, aw88399->aw_cfg); - if (ret) { - dev_err(aw88399->aw_pa->dev, "load [%s] failed!", AW88399_ACF_FILE); - return ret; - } - - mutex_lock(&aw88399->lock); - /* aw device init */ - ret =3D aw88399_dev_init(aw88399, aw88399->aw_cfg); - if (ret) - dev_err(aw88399->aw_pa->dev, "dev init failed"); - mutex_unlock(&aw88399->lock); - - return ret; -} - static const struct snd_kcontrol_new aw88399_controls[] =3D { SOC_SINGLE_EXT("PCM Playback Volume", AW88399_SYSCTRL2_REG, 6, AW88399_MUTE_VOL, 0, aw88399_volume_get, @@ -2142,7 +1598,7 @@ static const struct snd_kcontrol_new aw88399_controls= [] =3D { aw88399_calib_switch_get, aw88399_calib_switch_set), SOC_SINGLE_EXT("Trigger Calib", SND_SOC_NOPM, 0, 1, 0, aw88399_calib_get, aw88399_calib_set), - AW88399_PROFILE_EXT("AW88399 Profile Set", aw88399_profile_info, + AW_PROFILE_EXT("AW88399 Profile Set", aw88399_profile_info, aw88399_profile_get, aw88399_profile_set), }; =20 @@ -2155,7 +1611,7 @@ static int aw88399_playback_event(struct snd_soc_dapm= _widget *w, mutex_lock(&aw88399->lock); switch (event) { case SND_SOC_DAPM_PRE_PMU: - aw88399_start(aw88399, AW88399_ASYNC_START); + aw88399_start(aw88399, AW_ASYNC_START); break; case SND_SOC_DAPM_POST_PMD: aw88399_stop(aw88399->aw_pa); @@ -2170,7 +1626,7 @@ static int aw88399_playback_event(struct snd_soc_dapm= _widget *w, =20 static const struct snd_soc_dapm_widget aw88399_dapm_widgets[] =3D { /* playback */ - SND_SOC_DAPM_AIF_IN_E("AIF_RX", "Speaker_Playback", 0, 0, 0, 0, + SND_SOC_DAPM_AIF_IN_E("AIF_RX", "Speaker_Playback", 0, SND_SOC_NOPM, 0, 0, aw88399_playback_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_OUTPUT("DAC Output"), @@ -2192,9 +1648,15 @@ static int aw88399_codec_probe(struct snd_soc_compon= ent *component) =20 INIT_DELAYED_WORK(&aw88399->start_work, aw88399_startup_work); =20 - ret =3D aw88399_request_firmware_file(aw88399); - if (ret) + ret =3D aw_dev_request_firmware_file(aw88399->aw_pa, AW88399_ACF_FILE); + if (ret) { dev_err(aw88399->aw_pa->dev, "%s failed\n", __func__); + return ret; + } + + ret =3D aw88399_fw_update(aw88399, AW_FORCE_UPDATE_ON, AW_DSP_FW_UPDATE_O= N); + if (ret) + dev_err(aw88399->aw_pa->dev, "fw update failed ret =3D %d\n", ret); =20 return ret; } @@ -2217,70 +1679,6 @@ static const struct snd_soc_component_driver soc_cod= ec_dev_aw88399 =3D { .num_controls =3D ARRAY_SIZE(aw88399_controls), }; =20 -static void aw88399_hw_reset(struct aw88399 *aw88399) -{ - if (aw88399->reset_gpio) { - gpiod_set_value_cansleep(aw88399->reset_gpio, 1); - usleep_range(AW88399_1000_US, AW88399_1000_US + 10); - gpiod_set_value_cansleep(aw88399->reset_gpio, 0); - usleep_range(AW88399_1000_US, AW88399_1000_US + 10); - gpiod_set_value_cansleep(aw88399->reset_gpio, 1); - usleep_range(AW88399_1000_US, AW88399_1000_US + 10); - } -} - -static void aw88399_parse_channel_dt(struct aw_device *aw_dev) -{ - struct device_node *np =3D aw_dev->dev->of_node; - u32 channel_value; - - of_property_read_u32(np, "awinic,audio-channel", &channel_value); - aw_dev->channel =3D channel_value; -} - -static int aw88399_init(struct aw88399 *aw88399, struct i2c_client *i2c, s= truct regmap *regmap) -{ - struct aw_device *aw_dev; - unsigned int chip_id; - int ret; - - ret =3D regmap_read(regmap, AW88399_ID_REG, &chip_id); - if (ret) { - dev_err(&i2c->dev, "%s read chipid error. ret =3D %d", __func__, ret); - return ret; - } - if (chip_id !=3D AW88399_CHIP_ID) { - dev_err(&i2c->dev, "unsupported device"); - return -ENXIO; - } - dev_dbg(&i2c->dev, "chip id =3D %x\n", chip_id); - - aw_dev =3D devm_kzalloc(&i2c->dev, sizeof(*aw_dev), GFP_KERNEL); - if (!aw_dev) - return -ENOMEM; - aw88399->aw_pa =3D aw_dev; - - aw_dev->i2c =3D i2c; - aw_dev->dev =3D &i2c->dev; - aw_dev->regmap =3D regmap; - mutex_init(&aw_dev->dsp_lock); - - aw_dev->chip_id =3D chip_id; - aw_dev->acf =3D NULL; - aw_dev->prof_info.prof_desc =3D NULL; - aw_dev->prof_info.count =3D 0; - aw_dev->prof_info.prof_type =3D AW88395_DEV_NONE_TYPE_ID; - aw_dev->channel =3D AW88399_DEV_DEFAULT_CH; - aw_dev->fw_status =3D AW88399_DEV_FW_FAILED; - - aw_dev->fade_step =3D AW88399_VOLUME_STEP_DB; - aw_dev->volume_desc.ctl_volume =3D AW88399_VOL_DEFAULT_VALUE; - - aw88399_parse_channel_dt(aw_dev); - - return 0; -} - static int aw88399_i2c_probe(struct i2c_client *i2c) { struct aw88399 *aw88399; @@ -2294,14 +1692,17 @@ static int aw88399_i2c_probe(struct i2c_client *i2c) return -ENOMEM; =20 mutex_init(&aw88399->lock); - i2c_set_clientdata(i2c, aw88399); =20 - aw88399->reset_gpio =3D devm_gpiod_get_optional(&i2c->dev, "reset", GPIOD= _OUT_LOW); - if (IS_ERR(aw88399->reset_gpio)) - return dev_err_probe(&i2c->dev, PTR_ERR(aw88399->reset_gpio), + aw88399->aw_pa =3D devm_kzalloc(&i2c->dev, sizeof(struct aw_device), GFP_= KERNEL); + if (!aw88399->aw_pa) + return -ENOMEM; + + aw88399->aw_pa->reset_gpio =3D devm_gpiod_get_optional(&i2c->dev, "reset"= , GPIOD_OUT_LOW); + if (IS_ERR(aw88399->aw_pa->reset_gpio)) + return dev_err_probe(&i2c->dev, PTR_ERR(aw88399->aw_pa->reset_gpio), "reset gpio not defined\n"); - aw88399_hw_reset(aw88399); + aw_hw_reset(aw88399->aw_pa); =20 aw88399->regmap =3D devm_regmap_init_i2c(i2c, &aw88399_remap_config); if (IS_ERR(aw88399->regmap)) @@ -2309,17 +1710,12 @@ static int aw88399_i2c_probe(struct i2c_client *i2c) "failed to init regmap\n"); =20 /* aw pa init */ - ret =3D aw88399_init(aw88399, i2c, aw88399->regmap); + ret =3D aw_dev_init(aw88399->aw_pa, i2c, aw88399->regmap); if (ret) return ret; =20 - ret =3D devm_snd_soc_register_component(&i2c->dev, - &soc_codec_dev_aw88399, - aw88399_dai, ARRAY_SIZE(aw88399_dai)); - if (ret) - dev_err(&i2c->dev, "failed to register aw88399: %d", ret); - - return ret; + return devm_snd_soc_register_component(&i2c->dev, &soc_codec_dev_aw88399, + aw88399_dai, ARRAY_SIZE(aw88399_dai)); } =20 static const struct i2c_device_id aw88399_i2c_id[] =3D { @@ -2339,7 +1735,6 @@ MODULE_DEVICE_TABLE(acpi, aw88399_acpi_match); static struct i2c_driver aw88399_i2c_driver =3D { .driver =3D { .name =3D AW88399_I2C_NAME, - .acpi_match_table =3D ACPI_PTR(aw88399_acpi_match), }, .probe =3D aw88399_i2c_probe, .id_table =3D aw88399_i2c_id, diff --git a/sound/soc/codecs/aw88399.h b/sound/soc/codecs/aw88399.h index cacc03b1eefa..45684513dbab 100644 --- a/sound/soc/codecs/aw88399.h +++ b/sound/soc/codecs/aw88399.h @@ -461,13 +461,13 @@ #define AW88399_DSP_VOL_MASK \ (~(((1<