From nobody Wed Oct 1 23:35:33 2025 Received: from out28-197.mail.aliyun.com (out28-197.mail.aliyun.com [115.124.28.197]) (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 4D68872639; Fri, 26 Sep 2025 10:26:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=115.124.28.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758882374; cv=none; b=AHEHfghEmUZrrU54dVVSk/2Ctr4L/RFQF676CCplTyAOBwdzpU8h5e0VPVGhTRymZNTDzCN0xyCjwC//KDpp9xab31SBzw8V+f1jZebnPnVr1T6igzlT+2FVfLtqftOZSe5SQnPB82leviT1gM9qRCwNjB3XA+fERE6Oq0hErfE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758882374; c=relaxed/simple; bh=Kdw9N2mC9FBIXB1eAlIV54BBXiut0NmHaIda1DY7u8k=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jGz/IkVIVWsru1TsanvcXc+SoABQBtccpi15QcOsFy7VmwDrlqLbMaEMqDBNUJczOqze0HZWcy82yNOIWfrnyfw2tTgMqmjXYGKJUwGBxfWzOAmmcx7W+rvHjJ31GO8q9lN5c0AmkpVg54oABfatezR6CmqfwwDAA862zgIyGXE= 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=FadIhz/v; arc=none smtp.client-ip=115.124.28.197 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="FadIhz/v" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=awinic.com; s=default; t=1758882369; h=From:To:Subject:Date:Message-ID:MIME-Version; bh=2buohluJi10528nwyNdVqz59xQRiIfWb/fClHYIZeQE=; b=FadIhz/vm4gX7FU5MFpHYQPW1gqju56lWBzK8ge5kJxsmfUHT7jU1k+g1hBjTv0MRGPboCvw/gtEa/kTsjUmu2B0fw8Uli6ASC+of1chPye8pc7bUJ6amu2SHQkThPtQM0Ji9JtD9WEo1IMro4B3PBLccn5t20C5wKHtOXYJEZF1fSDC/MKOWj9qmrEKmhrzoyE+yuk4C6iJ9XSHs95X6dc1gKZa4fHhh2RJBhWTZoR+sX3TBVEC6AP+iE8rAb/eMdJPBz8hBBYT35Q9H0fxqOxr0F5ShRhSoH1aHVlFF/U3mcUb8elt1mIp12khpiCT87iWToJ91z2SlZX7Gl2OgA== Received: from ubuntu-VirtualBox..(mailfrom:wangweidong.a@awinic.com fp:SMTPD_---.ensjP.e_1758882048 cluster:ay29) by smtp.aliyun-inc.com; Fri, 26 Sep 2025 18:20:49 +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 4/7] ASoC: codecs: Rework the aw88081 driver Date: Fri, 26 Sep 2025 18:20:34 +0800 Message-ID: <20250926102037.27697-5-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 aw88081 driver to adapt it for aw-common-device.c and aw-common-firmware.c Signed-off-by: Weidong Wang --- sound/soc/codecs/aw88081.c | 357 +++++++++---------------------------- sound/soc/codecs/aw88081.h | 33 ---- 2 files changed, 83 insertions(+), 307 deletions(-) diff --git a/sound/soc/codecs/aw88081.c b/sound/soc/codecs/aw88081.c index d61a7b8c5470..edba6db117d5 100644 --- a/sound/soc/codecs/aw88081.c +++ b/sound/soc/codecs/aw88081.c @@ -12,7 +12,8 @@ #include #include #include "aw88081.h" -#include "aw88395/aw88395_device.h" +#include "aw-common-device.h" +#include "aw-common-firmware.h" =20 enum aw8808x_type { AW88081, @@ -69,7 +70,7 @@ static int aw88081_dev_check_mode1_pll(struct aw_device *= aw_dev) ret =3D aw88081_dev_get_iis_status(aw_dev); if (ret) { dev_err(aw_dev->dev, "mode1 iis signal check error"); - usleep_range(AW88081_2000_US, AW88081_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); } else { return 0; } @@ -103,7 +104,7 @@ static int aw88081_dev_check_mode2_pll(struct aw_device= *aw_dev) ret =3D aw88081_dev_get_iis_status(aw_dev); if (ret) { dev_err(aw_dev->dev, "mode2 iis check error"); - usleep_range(AW88081_2000_US, AW88081_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); } else { break; } @@ -113,12 +114,12 @@ static int aw88081_dev_check_mode2_pll(struct aw_devi= ce *aw_dev) ret =3D regmap_update_bits(aw_dev->regmap, AW88081_PLLCTRL1_REG, ~AW88081_CCO_MUX_MASK, AW88081_CCO_MUX_BYPASS_VALUE); if (ret =3D=3D 0) { - usleep_range(AW88081_2000_US, AW88081_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); for (i =3D 0; i < AW88081_DEV_SYSST_CHECK_MAX; i++) { ret =3D aw88081_dev_check_mode1_pll(aw_dev); if (ret) { dev_err(aw_dev->dev, "mode2 switch to mode1, iis check error"); - usleep_range(AW88081_2000_US, AW88081_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); } else { break; } @@ -170,7 +171,7 @@ static int aw88081_dev_check_sysst(struct aw_device *aw= _dev) if (value !=3D check_val) { dev_err(aw_dev->dev, "check sysst fail, reg_val=3D0x%04x, check:0x%x", reg_val, check_val); - usleep_range(AW88081_2000_US, AW88081_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); } else { return 0; } @@ -179,36 +180,6 @@ static int aw88081_dev_check_sysst(struct aw_device *a= w_dev) return -EPERM; } =20 -static void aw88081_dev_i2s_tx_enable(struct aw_device *aw_dev, bool flag) -{ - if (flag) - regmap_update_bits(aw_dev->regmap, AW88081_I2SCTRL3_REG, - ~AW88081_I2STXEN_MASK, AW88081_I2STXEN_ENABLE_VALUE); - else - regmap_update_bits(aw_dev->regmap, AW88081_I2SCTRL3_REG, - ~AW88081_I2STXEN_MASK, AW88081_I2STXEN_DISABLE_VALUE); -} - -static void aw88081_dev_pwd(struct aw_device *aw_dev, bool pwd) -{ - if (pwd) - regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, - ~AW88081_PWDN_MASK, AW88081_PWDN_POWER_DOWN_VALUE); - else - regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, - ~AW88081_PWDN_MASK, AW88081_PWDN_WORKING_VALUE); -} - -static void aw88081_dev_amppd(struct aw_device *aw_dev, bool amppd) -{ - if (amppd) - regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, - ~AW88081_EN_PA_MASK, AW88081_EN_PA_POWER_DOWN_VALUE); - else - regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, - ~AW88081_EN_PA_MASK, AW88081_EN_PA_WORKING_VALUE); -} - static void aw88083_i2c_wen(struct aw88081 *aw88081, bool flag) { struct aw_device *aw_dev =3D aw88081->aw_pa; @@ -224,39 +195,7 @@ static void aw88083_i2c_wen(struct aw88081 *aw88081, b= ool flag) ~AW88083_I2C_WEN_MASK, AW88083_I2C_WEN_DISABLE_VALUE); } =20 -static void aw88083_dev_amppd(struct aw_device *aw_dev, bool amppd) -{ - if (amppd) - regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, - ~AW88083_AMPPD_MASK, AW88083_AMPPD_POWER_DOWN_VALUE); - else - regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, - ~AW88083_AMPPD_MASK, AW88083_AMPPD_WORKING_VALUE); -} - -static void aw88083_dev_pllpd(struct aw_device *aw_dev, bool pllpd) -{ - if (pllpd) - regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, - ~AW88083_PLL_PD_MASK, AW88083_PLL_PD_WORKING_VALUE); - else - regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, - ~AW88083_PLL_PD_MASK, AW88083_PLL_PD_POWER_DOWN_VALUE); -} - -static void aw88081_dev_clear_int_status(struct aw_device *aw_dev) -{ - unsigned int int_status; - - /* read int status and clear */ - regmap_read(aw_dev->regmap, AW88081_SYSINT_REG, &int_status); - /* make sure int status is clear */ - regmap_read(aw_dev->regmap, AW88081_SYSINT_REG, &int_status); - - dev_dbg(aw_dev->dev, "read interrupt reg =3D 0x%04x", int_status); -} - -static void aw88081_dev_set_volume(struct aw_device *aw_dev, unsigned int = value) +static void aw88081_set_volume(struct aw_device *aw_dev, unsigned int valu= e) { struct aw_volume_desc *vol_desc =3D &aw_dev->volume_desc; unsigned int volume; @@ -266,72 +205,19 @@ static void aw88081_dev_set_volume(struct aw_device *= aw_dev, unsigned int value) regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL2_REG, ~AW88081_VOL_MAS= K, volume); } =20 -static void aw88081_dev_fade_in(struct aw_device *aw_dev) -{ - struct aw_volume_desc *desc =3D &aw_dev->volume_desc; - int 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) { - aw88081_dev_set_volume(aw_dev, fade_in_vol); - return; - } - - for (i =3D AW88081_MUTE_VOL; i >=3D fade_in_vol; i -=3D fade_step) { - aw88081_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) - aw88081_dev_set_volume(aw_dev, fade_in_vol); -} - -static void aw88081_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) { - aw88081_dev_set_volume(aw_dev, AW88081_MUTE_VOL); - return; - } - - for (i =3D desc->ctl_volume; i <=3D AW88081_MUTE_VOL; i +=3D fade_step) { - aw88081_dev_set_volume(aw_dev, i); - usleep_range(aw_dev->fade_out_time, aw_dev->fade_out_time + 10); - } - - if (i !=3D AW88081_MUTE_VOL) - aw88081_dev_set_volume(aw_dev, AW88081_MUTE_VOL); -} - static void aw88081_dev_mute(struct aw_device *aw_dev, bool is_mute) { if (is_mute) { - aw88081_dev_fade_out(aw_dev); + aw_dev_fade_out(aw_dev, aw88081_set_volume); regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, ~AW88081_HMUTE_MASK, AW88081_HMUTE_ENABLE_VALUE); } else { regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, ~AW88081_HMUTE_MASK, AW88081_HMUTE_DISABLE_VALUE); - aw88081_dev_fade_in(aw_dev); + aw_dev_fade_in(aw_dev, aw88081_set_volume); } } =20 -static void aw88081_dev_uls_hmute(struct aw_device *aw_dev, bool uls_hmute) -{ - if (uls_hmute) - regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, - ~AW88081_ULS_HMUTE_MASK, - AW88081_ULS_HMUTE_ENABLE_VALUE); - else - regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, - ~AW88081_ULS_HMUTE_MASK, - AW88081_ULS_HMUTE_DISABLE_VALUE); -} - static int aw88081_dev_reg_value_check(struct aw_device *aw_dev, unsigned char reg_addr, unsigned short *reg_val) { @@ -451,39 +337,7 @@ static int aw88081_dev_reg_update(struct aw88081 *aw88= 081, vol_desc->ctl_volume =3D 0; =20 /* keep min volume */ - aw88081_dev_set_volume(aw_dev, vol_desc->mute_volume); - - return 0; -} - -static int aw88081_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 aw88081_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]; + aw88081_set_volume(aw_dev, vol_desc->mute_volume); =20 return 0; } @@ -496,7 +350,7 @@ static int aw88081_dev_fw_update(struct aw88081 *aw8808= 1) char *prof_name; int ret; =20 - ret =3D aw88081_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) { dev_err(aw_dev->dev, "get prof name failed"); return -EINVAL; @@ -504,14 +358,14 @@ static int aw88081_dev_fw_update(struct aw88081 *aw88= 081) =20 dev_dbg(aw_dev->dev, "start update %s", prof_name); =20 - ret =3D aw88081_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 aw88081_dev_reg_update(aw88081, sec_desc[AW88395_DATA_TYPE_REG].d= ata, - sec_desc[AW88395_DATA_TYPE_REG].len); + ret =3D aw88081_dev_reg_update(aw88081, 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; @@ -527,14 +381,15 @@ static int aw88081_dev_start(struct aw88081 *aw88081) struct aw_device *aw_dev =3D aw88081->aw_pa; int ret; =20 - if (aw_dev->status =3D=3D AW88081_DEV_PW_ON) { + if (aw_dev->status =3D=3D AW_DEV_PW_ON) { dev_dbg(aw_dev->dev, "already power on"); return 0; } =20 /* power on */ - aw88081_dev_pwd(aw_dev, false); - usleep_range(AW88081_2000_US, AW88081_2000_US + 10); + regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, + ~AW88081_PWDN_MASK, AW88081_PWDN_WORKING_VALUE); + usleep_range(AW_2000_US, AW_2000_US + 10); =20 ret =3D aw88081_dev_check_syspll(aw_dev); if (ret) { @@ -543,8 +398,9 @@ static int aw88081_dev_start(struct aw88081 *aw88081) } =20 /* amppd on */ - aw88081_dev_amppd(aw_dev, false); - usleep_range(AW88081_1000_US, AW88081_1000_US + 50); + regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, + ~AW88081_EN_PA_MASK, AW88081_EN_PA_WORKING_VALUE); + usleep_range(AW_1000_US, AW_1000_US + 50); =20 /* check i2s status */ ret =3D aw88081_dev_check_sysst(aw_dev); @@ -554,27 +410,32 @@ static int aw88081_dev_start(struct aw88081 *aw88081) } =20 /* enable tx feedback */ - aw88081_dev_i2s_tx_enable(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88081_I2SCTRL3_REG, + ~AW88081_I2STXEN_MASK, AW88081_I2STXEN_ENABLE_VALUE); =20 /* close uls mute */ - aw88081_dev_uls_hmute(aw_dev, false); + regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, + ~AW88081_ULS_HMUTE_MASK, AW88081_ULS_HMUTE_DISABLE_VALUE); =20 /* close mute */ aw88081_dev_mute(aw_dev, false); =20 /* clear inturrupt */ - aw88081_dev_clear_int_status(aw_dev); - aw_dev->status =3D AW88081_DEV_PW_ON; + aw_dev_clear_int_status(aw_dev); + aw_dev->status =3D AW_DEV_PW_ON; =20 return 0; =20 sysst_check_fail: - aw88081_dev_i2s_tx_enable(aw_dev, false); - aw88081_dev_clear_int_status(aw_dev); - aw88081_dev_amppd(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88081_I2SCTRL3_REG, + ~AW88081_I2STXEN_MASK, AW88081_I2STXEN_DISABLE_VALUE); + aw_dev_clear_int_status(aw_dev); + regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, + ~AW88081_EN_PA_MASK, AW88081_EN_PA_POWER_DOWN_VALUE); pll_check_fail: - aw88081_dev_pwd(aw_dev, true); - aw_dev->status =3D AW88081_DEV_PW_OFF; + regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, + ~AW88081_PWDN_MASK, AW88081_PWDN_POWER_DOWN_VALUE); + aw_dev->status =3D AW_DEV_PW_OFF; =20 return ret; } @@ -583,7 +444,7 @@ static int aw88083_dev_start(struct aw88081 *aw88081) { struct aw_device *aw_dev =3D aw88081->aw_pa; =20 - if (aw_dev->status =3D=3D AW88081_DEV_PW_ON) { + if (aw_dev->status =3D=3D AW_DEV_PW_ON) { dev_dbg(aw_dev->dev, "already power on"); return 0; } @@ -591,20 +452,23 @@ static int aw88083_dev_start(struct aw88081 *aw88081) aw88083_i2c_wen(aw88081, true); =20 /* power on */ - aw88081_dev_pwd(aw_dev, false); - usleep_range(AW88081_2000_US, AW88081_2000_US + 10); + regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, + ~AW88081_PWDN_MASK, AW88081_PWDN_WORKING_VALUE); + usleep_range(AW_2000_US, AW_2000_US + 10); =20 - aw88083_dev_pllpd(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, + ~AW88083_PLL_PD_MASK, AW88083_PLL_PD_WORKING_VALUE); /* amppd on */ - aw88083_dev_amppd(aw_dev, false); - usleep_range(AW88081_2000_US, AW88081_2000_US + 50); + regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, + ~AW88083_AMPPD_MASK, AW88083_AMPPD_WORKING_VALUE); + usleep_range(AW_2000_US, AW_2000_US + 50); =20 /* close mute */ aw88081_dev_mute(aw_dev, false); =20 aw88083_i2c_wen(aw88081, false); =20 - aw_dev->status =3D AW88081_DEV_PW_ON; + aw_dev->status =3D AW_DEV_PW_ON; =20 return 0; } @@ -633,29 +497,33 @@ static int aw88081_dev_stop(struct aw88081 *aw88081) { struct aw_device *aw_dev =3D aw88081->aw_pa; =20 - if (aw_dev->status =3D=3D AW88081_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 AW88081_DEV_PW_OFF; + aw_dev->status =3D AW_DEV_PW_OFF; =20 /* clear inturrupt */ - aw88081_dev_clear_int_status(aw_dev); + aw_dev_clear_int_status(aw_dev); =20 - aw88081_dev_uls_hmute(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, + ~AW88081_ULS_HMUTE_MASK, AW88081_ULS_HMUTE_ENABLE_VALUE); /* set mute */ aw88081_dev_mute(aw_dev, true); =20 /* close tx feedback */ - aw88081_dev_i2s_tx_enable(aw_dev, false); - usleep_range(AW88081_1000_US, AW88081_1000_US + 100); + regmap_update_bits(aw_dev->regmap, AW88081_I2SCTRL3_REG, + ~AW88081_I2STXEN_MASK, AW88081_I2STXEN_DISABLE_VALUE); + usleep_range(AW_1000_US, AW_1000_US + 100); =20 /* enable amppd */ - aw88081_dev_amppd(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, + ~AW88081_EN_PA_MASK, AW88081_EN_PA_POWER_DOWN_VALUE); =20 /* set power down */ - aw88081_dev_pwd(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, + ~AW88081_PWDN_MASK, AW88081_PWDN_POWER_DOWN_VALUE); =20 return 0; } @@ -664,26 +532,29 @@ static int aw88083_dev_stop(struct aw88081 *aw88081) { struct aw_device *aw_dev =3D aw88081->aw_pa; =20 - if (aw_dev->status =3D=3D AW88081_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 AW88081_DEV_PW_OFF; + aw_dev->status =3D AW_DEV_PW_OFF; =20 aw88083_i2c_wen(aw88081, true); /* set mute */ aw88081_dev_mute(aw_dev, true); =20 - usleep_range(AW88081_2000_US, AW88081_2000_US + 100); + usleep_range(AW_2000_US, AW_2000_US + 100); =20 /* enable amppd */ - aw88083_dev_amppd(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, + ~AW88083_AMPPD_MASK, AW88083_AMPPD_POWER_DOWN_VALUE); =20 - aw88083_dev_pllpd(aw_dev, false); + regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, + ~AW88083_PLL_PD_MASK, AW88083_PLL_PD_POWER_DOWN_VALUE); =20 /* set power down */ - aw88081_dev_pwd(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88081_SYSCTRL_REG, + ~AW88081_PWDN_MASK, AW88081_PWDN_POWER_DOWN_VALUE); =20 aw88083_i2c_wen(aw88081, false); =20 @@ -770,13 +641,13 @@ static void aw88081_startup_work(struct work_struct *= work) =20 static void aw88081_start(struct aw88081 *aw88081, bool sync_start) { - if (aw88081->aw_pa->fw_status !=3D AW88081_DEV_FW_OK) + if (aw88081->aw_pa->fw_status !=3D AW_DEV_FW_OK) return; =20 - if (aw88081->aw_pa->status =3D=3D AW88081_DEV_PW_ON) + if (aw88081->aw_pa->status =3D=3D AW_DEV_PW_ON) return; =20 - if (sync_start =3D=3D AW88081_SYNC_START) + if (sync_start =3D=3D AW_SYNC_START) aw88081_start_pa(aw88081); else queue_delayed_work(system_wq, @@ -912,7 +783,7 @@ static int aw88081_profile_info(struct snd_kcontrol *kc= ontrol, =20 count =3D uinfo->value.enumerated.item; =20 - ret =3D aw88081_dev_get_prof_name(aw88081->aw_pa, count, &prof_name); + ret =3D aw_dev_get_prof_name(aw88081->aw_pa, count, &prof_name); if (ret) { strscpy(uinfo->value.enumerated.name, "null"); return 0; @@ -952,7 +823,7 @@ static int aw88081_profile_set(struct snd_kcontrol *kco= ntrol, =20 if (aw88081->aw_pa->status) { aw88081_stop(aw88081); - aw88081_start(aw88081, AW88081_SYNC_START); + aw88081_start(aw88081, AW_SYNC_START); } =20 mutex_unlock(&aw88081->lock); @@ -991,7 +862,7 @@ static int aw88081_volume_set(struct snd_kcontrol *kcon= trol, =20 if (vol_desc->ctl_volume !=3D value) { vol_desc->ctl_volume =3D value; - aw88081_dev_set_volume(aw88081->aw_pa, vol_desc->ctl_volume); + aw88081_set_volume(aw88081->aw_pa, vol_desc->ctl_volume); return 1; } =20 @@ -1042,7 +913,7 @@ static const struct snd_kcontrol_new aw88081_controls[= ] =3D { aw88081_get_fade_in_time, aw88081_set_fade_in_time), SOC_SINGLE_EXT("Volume Ramp Down Step", 0, 0, FADE_TIME_MAX, 0, aw88081_get_fade_out_time, aw88081_set_fade_out_time), - AW88081_PROFILE_EXT("Profile Set", aw88081_profile_info, + AW_PROFILE_EXT("Profile Set", aw88081_profile_info, aw88081_profile_get, aw88081_profile_set), }; =20 @@ -1094,7 +965,7 @@ static int aw88081_init(struct aw88081 *aw88081, struc= t i2c_client *i2c, struct aw_dev->chip_id =3D chip_id; aw_dev->acf =3D NULL; aw_dev->prof_info.prof_desc =3D NULL; - aw_dev->prof_info.prof_type =3D AW88395_DEV_NONE_TYPE_ID; + aw_dev->prof_info.prof_type =3D AW_DEV_NONE_TYPE_ID; aw_dev->fade_step =3D AW88081_VOLUME_STEP_DB; aw_dev->volume_desc.mute_volume =3D AW88081_MUTE_VOL; aw88081_parse_channel_dt(aw88081); @@ -1102,72 +973,6 @@ static int aw88081_init(struct aw88081 *aw88081, stru= ct i2c_client *i2c, struct return 0; } =20 -static int aw88081_dev_init(struct aw88081 *aw88081, struct aw_container *= aw_cfg) -{ - struct aw_device *aw_dev =3D aw88081->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; - } - - ret =3D regmap_write(aw_dev->regmap, AW88081_ID_REG, AW88081_SOFT_RESET_V= ALUE); - if (ret) - return ret; - - aw_dev->fade_in_time =3D AW88081_500_US; - aw_dev->fade_out_time =3D AW88081_500_US; - aw_dev->prof_cur =3D AW88081_INIT_PROFILE; - aw_dev->prof_index =3D AW88081_INIT_PROFILE; - - ret =3D aw88081_dev_fw_update(aw88081); - if (ret) { - dev_err(aw_dev->dev, "fw update failed ret =3D %d\n", ret); - return ret; - } - - aw_dev->status =3D AW88081_DEV_PW_ON; - aw88081_stop(aw88081); - - return 0; -} - -static int aw88081_request_firmware_file(struct aw88081 *aw88081) -{ - const struct firmware *cont =3D NULL; - int ret; - - aw88081->aw_pa->fw_status =3D AW88081_DEV_FW_FAILED; - - ret =3D request_firmware(&cont, AW88081_ACF_FILE, aw88081->aw_pa->dev); - if (ret) - return ret; - - dev_dbg(aw88081->aw_pa->dev, "loaded %s - size: %zu\n", - AW88081_ACF_FILE, cont ? cont->size : 0); - - aw88081->aw_cfg =3D devm_kzalloc(aw88081->aw_pa->dev, cont->size + sizeof= (int), GFP_KERNEL); - if (!aw88081->aw_cfg) { - release_firmware(cont); - return -ENOMEM; - } - aw88081->aw_cfg->len =3D (int)cont->size; - memcpy(aw88081->aw_cfg->data, cont->data, cont->size); - release_firmware(cont); - - ret =3D aw88395_dev_load_acf_check(aw88081->aw_pa, aw88081->aw_cfg); - if (ret) - return ret; - - mutex_lock(&aw88081->lock); - ret =3D aw88081_dev_init(aw88081, aw88081->aw_cfg); - mutex_unlock(&aw88081->lock); - - return ret; -} - static int aw88081_playback_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *k, int event) { @@ -1177,7 +982,7 @@ static int aw88081_playback_event(struct snd_soc_dapm_= widget *w, mutex_lock(&aw88081->lock); switch (event) { case SND_SOC_DAPM_PRE_PMU: - aw88081_start(aw88081, AW88081_ASYNC_START); + aw88081_start(aw88081, AW_ASYNC_START); break; case SND_SOC_DAPM_POST_PMD: aw88081_stop(aw88081); @@ -1214,9 +1019,13 @@ static int aw88081_codec_probe(struct snd_soc_compon= ent *component) =20 INIT_DELAYED_WORK(&aw88081->start_work, aw88081_startup_work); =20 - ret =3D aw88081_request_firmware_file(aw88081); - if (ret) - dev_err(aw88081->aw_pa->dev, "%s: request firmware failed\n", __func__); + ret =3D aw_dev_request_firmware_file(aw88081->aw_pa, AW88081_ACF_FILE); + if (ret) { + dev_err(aw88081->aw_pa->dev, "%s failed\n", __func__); + return ret; + } + + ret =3D aw88081_dev_fw_update(aw88081); =20 return ret; } diff --git a/sound/soc/codecs/aw88081.h b/sound/soc/codecs/aw88081.h index 7a4564270ab3..4e356bf0e010 100644 --- a/sound/soc/codecs/aw88081.h +++ b/sound/soc/codecs/aw88081.h @@ -286,8 +286,6 @@ SNDRV_PCM_FMTBIT_S24_LE | \ SNDRV_PCM_FMTBIT_S32_LE) =20 -#define FADE_TIME_MAX 100000 - #define AW88081_DEV_DEFAULT_CH (0) #define AW88081_ACF_FILE "aw88081_acf.bin" #define AW88081_DEV_SYSST_CHECK_MAX (10) @@ -295,35 +293,4 @@ =20 #define AW88081_INIT_PROFILE (0) =20 -#define AW88081_PROFILE_EXT(xname, profile_info, profile_get, profile_set)= \ -{ \ - .iface =3D SNDRV_CTL_ELEM_IFACE_MIXER, \ - .name =3D xname, \ - .info =3D profile_info, \ - .get =3D profile_get, \ - .put =3D profile_set, \ -} - -enum { - AW88081_SYNC_START =3D 0, - AW88081_ASYNC_START, -}; - -enum { - AW88081_500_US =3D 500, - AW88081_1000_US =3D 1000, - AW88081_2000_US =3D 2000, - AW88081_5000_US =3D 5000, -}; - -enum { - AW88081_DEV_PW_OFF =3D 0, - AW88081_DEV_PW_ON, -}; - -enum { - AW88081_DEV_FW_FAILED =3D 0, - AW88081_DEV_FW_OK, -}; - #endif --=20 2.47.0