From nobody Wed Oct 1 23:35:33 2025 Received: from out198-7.us.a.mail.aliyun.com (out198-7.us.a.mail.aliyun.com [47.90.198.7]) (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 4AD612EFD93; Fri, 26 Sep 2025 10:21:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=47.90.198.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758882071; cv=none; b=kr8gcSV6rF546kuLlnwIsChxtif1ZxSHIAmpZBeDhOtdQVsM+OG36GOP3RlmEtHFbTw17qMB2ffcbeTBAdzHE3PWcPodRPkDUOe1JkuwVPLL+2vh7BI5ESNLj2aev735Pi8qzXa6WbNzPvyDsoZ/BnkWqHTWtMP6YZLFEFMXOxA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758882071; c=relaxed/simple; bh=/lqU8p1Kqbv85cHsipPyuFnqWhOF8j4KHe/KhVhwa+4=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=T+qkRU7yLgtG/C21pTb8OeBPsv96mKP7gnpnPxEuQUMytP2AkMJVMojNMfVghKBxheNPFkIdqiuFVqDXStWuEoilsAQf0KWVMrHwuTy3HU/vp4SMrZxERXAQTiBfEJKDLEsbBL+mooX9/hpOo2UOAusbHmaU9B5X2xeq+8fqWhs= 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=lLwq9r3M; arc=none smtp.client-ip=47.90.198.7 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="lLwq9r3M" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=awinic.com; s=default; t=1758882055; h=From:To:Subject:Date:Message-ID:MIME-Version; bh=8T5et6u9khsy7lcDi/wk+p4Nfv5cWPBYYQbejNK+v/0=; b=lLwq9r3M73tJBxcUJqymL1zY1++BpLgmOfqdJFvKTae8MFkv3bd7VBvkh2SWisWyMstuMYFAIzMjG44XDoxO5ZP4pvMFy6gbp5SCtQTgeavYX5EqAsVWknEvRHGAwPgnDEorB7yz3rLNDzUppJlZOp1B8Qys1I/N8XAoWnGmkT0vuK/tHpyyJqqN6l89i0nhI9YZCB7pmpxGT7JxydCL6z859kGdlGBQuSZZA7/q6oNCEf+nRDD/bpbAx3okq+KMZz+RCzzpCLAfD8AZWCMfZsOSBxAgEss2pVDoWLT5it4HiuOvD4nqgt0fo6tzwJZMCs1GUGFreO2pouNQEHcueQ== Received: from ubuntu-VirtualBox..(mailfrom:wangweidong.a@awinic.com fp:SMTPD_---.ensjP48_1758882052 cluster:ay29) by smtp.aliyun-inc.com; Fri, 26 Sep 2025 18:20:53 +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 6/7] ASoC: codecs: Rework the aw88261 driver Date: Fri, 26 Sep 2025 18:20:36 +0800 Message-ID: <20250926102037.27697-7-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 aw88261 driver to adapt it for aw-common-device.c and aw-common-firmware.c Signed-off-by: Weidong Wang --- sound/soc/codecs/aw88261.c | 427 ++++++++----------------------------- sound/soc/codecs/aw88261.h | 52 ----- 2 files changed, 93 insertions(+), 386 deletions(-) diff --git a/sound/soc/codecs/aw88261.c b/sound/soc/codecs/aw88261.c index de11ae8dd9d9..4f11d1b27a44 100644 --- a/sound/soc/codecs/aw88261.c +++ b/sound/soc/codecs/aw88261.c @@ -13,8 +13,22 @@ #include #include #include "aw88261.h" -#include "aw88395/aw88395_data_type.h" -#include "aw88395/aw88395_device.h" +#include "aw-common-device.h" +#include "aw-common-firmware.h" + +struct aw88261 { + struct aw_device *aw_pa; + struct mutex lock; + struct delayed_work start_work; + struct regmap *regmap; + + int efuse_check; + int frcset_en; + unsigned int mute_st; + unsigned int amppd_st; + + bool phase_sync; +}; =20 static const struct regmap_config aw88261_remap_config =3D { .val_bits =3D 16, @@ -24,7 +38,7 @@ static const struct regmap_config aw88261_remap_config = =3D { .val_format_endian =3D REGMAP_ENDIAN_BIG, }; =20 -static void aw88261_dev_set_volume(struct aw_device *aw_dev, unsigned int = value) +static void aw88261_set_volume(struct aw_device *aw_dev, unsigned int valu= e) { struct aw_volume_desc *vol_desc =3D &aw_dev->volume_desc; unsigned int real_value, volume; @@ -42,105 +56,19 @@ static void aw88261_dev_set_volume(struct aw_device *a= w_dev, unsigned int value) regmap_write(aw_dev->regmap, AW88261_SYSCTRL2_REG, real_value); } =20 -static void aw88261_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) { - aw88261_dev_set_volume(aw_dev, fade_in_vol); - return; - } - - for (i =3D AW88261_MUTE_VOL; i >=3D fade_in_vol; i -=3D fade_step) { - aw88261_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) - aw88261_dev_set_volume(aw_dev, fade_in_vol); -} - -static void aw88261_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) { - aw88261_dev_set_volume(aw_dev, AW88261_MUTE_VOL); - return; - } - - for (i =3D desc->ctl_volume; i <=3D AW88261_MUTE_VOL; i +=3D fade_step) { - aw88261_dev_set_volume(aw_dev, i); - usleep_range(aw_dev->fade_out_time, aw_dev->fade_out_time + 10); - } - - if (i !=3D AW88261_MUTE_VOL) { - aw88261_dev_set_volume(aw_dev, AW88261_MUTE_VOL); - usleep_range(aw_dev->fade_out_time, aw_dev->fade_out_time + 10); - } -} - -static void aw88261_dev_i2s_tx_enable(struct aw_device *aw_dev, bool flag) -{ - if (flag) - regmap_update_bits(aw_dev->regmap, AW88261_I2SCFG1_REG, - ~AW88261_I2STXEN_MASK, AW88261_I2STXEN_ENABLE_VALUE); - else - regmap_update_bits(aw_dev->regmap, AW88261_I2SCFG1_REG, - ~AW88261_I2STXEN_MASK, AW88261_I2STXEN_DISABLE_VALUE); -} - -static void aw88261_dev_pwd(struct aw_device *aw_dev, bool pwd) -{ - if (pwd) - regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG, - ~AW88261_PWDN_MASK, AW88261_PWDN_POWER_DOWN_VALUE); - else - regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG, - ~AW88261_PWDN_MASK, AW88261_PWDN_WORKING_VALUE); -} - -static void aw88261_dev_amppd(struct aw_device *aw_dev, bool amppd) -{ - if (amppd) - regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG, - ~AW88261_AMPPD_MASK, AW88261_AMPPD_POWER_DOWN_VALUE); - else - regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG, - ~AW88261_AMPPD_MASK, AW88261_AMPPD_WORKING_VALUE); -} - static void aw88261_dev_mute(struct aw_device *aw_dev, bool is_mute) { if (is_mute) { - aw88261_dev_fade_out(aw_dev); + aw_dev_fade_out(aw_dev, aw88261_set_volume); regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG, ~AW88261_HMUTE_MASK, AW88261_HMUTE_ENABLE_VALUE); } else { regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG, ~AW88261_HMUTE_MASK, AW88261_HMUTE_DISABLE_VALUE); - aw88261_dev_fade_in(aw_dev); + aw_dev_fade_in(aw_dev, aw88261_set_volume); } } =20 -static void aw88261_dev_clear_int_status(struct aw_device *aw_dev) -{ - unsigned int int_status; - - /* read int status and clear */ - regmap_read(aw_dev->regmap, AW88261_SYSINT_REG, &int_status); - /* make sure int status is clear */ - regmap_read(aw_dev->regmap, AW88261_SYSINT_REG, &int_status); - - dev_dbg(aw_dev->dev, "read interrupt reg =3D 0x%04x", int_status); -} - static int aw88261_dev_get_iis_status(struct aw_device *aw_dev) { unsigned int reg_val; @@ -165,7 +93,7 @@ static int aw88261_dev_check_mode1_pll(struct aw_device = *aw_dev) ret =3D aw88261_dev_get_iis_status(aw_dev); if (ret) { dev_err(aw_dev->dev, "mode1 iis signal check error"); - usleep_range(AW88261_2000_US, AW88261_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); } else { return ret; } @@ -199,7 +127,7 @@ static int aw88261_dev_check_mode2_pll(struct aw_device= *aw_dev) ret =3D aw88261_dev_get_iis_status(aw_dev); if (ret) { dev_err(aw_dev->dev, "mode2 iis signal check error"); - usleep_range(AW88261_2000_US, AW88261_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); } else { break; } @@ -209,12 +137,12 @@ static int aw88261_dev_check_mode2_pll(struct aw_devi= ce *aw_dev) ret =3D regmap_update_bits(aw_dev->regmap, AW88261_PLLCTRL1_REG, ~AW88261_CCO_MUX_MASK, AW88261_CCO_MUX_BYPASS_VALUE); if (ret =3D=3D 0) { - usleep_range(AW88261_2000_US, AW88261_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); for (i =3D 0; i < AW88261_DEV_SYSST_CHECK_MAX; i++) { ret =3D aw88261_dev_check_mode1_pll(aw_dev); if (ret) { dev_err(aw_dev->dev, "mode2 switch to mode1, iis signal check error"); - usleep_range(AW88261_2000_US, AW88261_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); } else { break; } @@ -257,7 +185,7 @@ static int aw88261_dev_check_sysst(struct aw_device *aw= _dev) if (check_val !=3D AW88261_BIT_SYSST_CHECK) { dev_err(aw_dev->dev, "check sysst fail, reg_val=3D0x%04x, check:0x%x", reg_val, AW88261_BIT_SYSST_CHECK); - usleep_range(AW88261_2000_US, AW88261_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); } else { return 0; } @@ -266,18 +194,6 @@ static int aw88261_dev_check_sysst(struct aw_device *a= w_dev) return -EPERM; } =20 -static void aw88261_dev_uls_hmute(struct aw_device *aw_dev, bool uls_hmute) -{ - if (uls_hmute) - regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG, - ~AW88261_ULS_HMUTE_MASK, - AW88261_ULS_HMUTE_ENABLE_VALUE); - else - regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG, - ~AW88261_ULS_HMUTE_MASK, - AW88261_ULS_HMUTE_DISABLE_VALUE); -} - static void aw88261_reg_force_set(struct aw88261 *aw88261) { if (aw88261->frcset_en =3D=3D AW88261_FRCSET_ENABLE) { @@ -471,43 +387,11 @@ static int aw88261_dev_reg_update(struct aw88261 *aw8= 8261, vol_desc->ctl_volume =3D 0; =20 /* keep min volume */ - aw88261_dev_set_volume(aw_dev, vol_desc->mute_volume); + aw88261_set_volume(aw_dev, vol_desc->mute_volume); =20 return ret; } =20 -static int aw88261_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 aw88261_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]; - - return 0; -} - static int aw88261_dev_fw_update(struct aw88261 *aw88261) { struct aw_device *aw_dev =3D aw88261->aw_pa; @@ -516,7 +400,7 @@ static int aw88261_dev_fw_update(struct aw88261 *aw8826= 1) char *prof_name; int ret; =20 - ret =3D aw88261_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; @@ -524,14 +408,14 @@ static int aw88261_dev_fw_update(struct aw88261 *aw88= 261) =20 dev_dbg(aw_dev->dev, "start update %s", prof_name); =20 - ret =3D aw88261_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 aw88261_dev_reg_update(aw88261, sec_desc[AW88395_DATA_TYPE_REG].d= ata, - sec_desc[AW88395_DATA_TYPE_REG].len); + ret =3D aw88261_dev_reg_update(aw88261, 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; @@ -547,14 +431,15 @@ static int aw88261_dev_start(struct aw88261 *aw88261) struct aw_device *aw_dev =3D aw88261->aw_pa; int ret; =20 - if (aw_dev->status =3D=3D AW88261_DEV_PW_ON) { + if (aw_dev->status =3D=3D AW_DEV_PW_ON) { dev_info(aw_dev->dev, "already power on"); return 0; } =20 /* power on */ - aw88261_dev_pwd(aw_dev, false); - usleep_range(AW88261_2000_US, AW88261_2000_US + 10); + regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG, + ~AW88261_PWDN_MASK, AW88261_PWDN_WORKING_VALUE); + usleep_range(AW_2000_US, AW_2000_US + 10); =20 ret =3D aw88261_dev_check_syspll(aw_dev); if (ret) { @@ -563,8 +448,9 @@ static int aw88261_dev_start(struct aw88261 *aw88261) } =20 /* amppd on */ - aw88261_dev_amppd(aw_dev, false); - usleep_range(AW88261_1000_US, AW88261_1000_US + 50); + regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG, + ~AW88261_AMPPD_MASK, AW88261_AMPPD_WORKING_VALUE); + usleep_range(AW_1000_US, AW_1000_US + 50); =20 /* check i2s status */ ret =3D aw88261_dev_check_sysst(aw_dev); @@ -574,62 +460,72 @@ static int aw88261_dev_start(struct aw88261 *aw88261) } =20 /* enable tx feedback */ - aw88261_dev_i2s_tx_enable(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88261_I2SCFG1_REG, + ~AW88261_I2STXEN_MASK, AW88261_I2STXEN_ENABLE_VALUE); =20 if (aw88261->amppd_st) - aw88261_dev_amppd(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG, + ~AW88261_AMPPD_MASK, AW88261_AMPPD_POWER_DOWN_VALUE); =20 aw88261_reg_force_set(aw88261); =20 /* close uls mute */ - aw88261_dev_uls_hmute(aw_dev, false); + regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG, + ~AW88261_ULS_HMUTE_MASK, AW88261_ULS_HMUTE_DISABLE_VALUE); =20 /* close mute */ if (!aw88261->mute_st) aw88261_dev_mute(aw_dev, false); =20 /* clear inturrupt */ - aw88261_dev_clear_int_status(aw_dev); - aw_dev->status =3D AW88261_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: - aw88261_dev_i2s_tx_enable(aw_dev, false); - aw88261_dev_clear_int_status(aw_dev); - aw88261_dev_amppd(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88261_I2SCFG1_REG, + ~AW88261_I2STXEN_MASK, AW88261_I2STXEN_DISABLE_VALUE); + aw_dev_clear_int_status(aw_dev); + regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG, + ~AW88261_AMPPD_MASK, AW88261_AMPPD_POWER_DOWN_VALUE); pll_check_fail: - aw88261_dev_pwd(aw_dev, true); - aw_dev->status =3D AW88261_DEV_PW_OFF; + regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG, + ~AW88261_PWDN_MASK, AW88261_PWDN_POWER_DOWN_VALUE); + aw_dev->status =3D AW_DEV_PW_OFF; =20 return ret; } =20 static int aw88261_dev_stop(struct aw_device *aw_dev) { - if (aw_dev->status =3D=3D AW88261_DEV_PW_OFF) { + if (aw_dev->status =3D=3D AW_DEV_PW_OFF) { dev_info(aw_dev->dev, "already power off"); return 0; } =20 - aw_dev->status =3D AW88261_DEV_PW_OFF; + aw_dev->status =3D AW_DEV_PW_OFF; =20 /* clear inturrupt */ - aw88261_dev_clear_int_status(aw_dev); + aw_dev_clear_int_status(aw_dev); =20 - aw88261_dev_uls_hmute(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG, + ~AW88261_ULS_HMUTE_MASK, AW88261_ULS_HMUTE_ENABLE_VALUE); /* set mute */ aw88261_dev_mute(aw_dev, true); =20 /* close tx feedback */ - aw88261_dev_i2s_tx_enable(aw_dev, false); - usleep_range(AW88261_1000_US, AW88261_1000_US + 100); + regmap_update_bits(aw_dev->regmap, AW88261_I2SCFG1_REG, + ~AW88261_I2STXEN_MASK, AW88261_I2STXEN_DISABLE_VALUE); + usleep_range(AW_1000_US, AW_1000_US + 100); =20 /* enable amppd */ - aw88261_dev_amppd(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG, + ~AW88261_AMPPD_MASK, AW88261_AMPPD_POWER_DOWN_VALUE); =20 /* set power down */ - aw88261_dev_pwd(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG, + ~AW88261_PWDN_MASK, AW88261_PWDN_POWER_DOWN_VALUE); =20 return 0; } @@ -696,18 +592,17 @@ static void aw88261_startup_work(struct work_struct *= work) =20 static void aw88261_start(struct aw88261 *aw88261, bool sync_start) { - if (aw88261->aw_pa->fw_status !=3D AW88261_DEV_FW_OK) + if (aw88261->aw_pa->fw_status !=3D AW_DEV_FW_OK) return; =20 - if (aw88261->aw_pa->status =3D=3D AW88261_DEV_PW_ON) + if (aw88261->aw_pa->status =3D=3D AW_DEV_PW_ON) return; =20 - if (sync_start =3D=3D AW88261_SYNC_START) + if (sync_start =3D=3D AW_SYNC_START) aw88261_start_pa(aw88261); else queue_delayed_work(system_wq, - &aw88261->start_work, - AW88261_START_WORK_DELAY_MS); + &aw88261->start_work, AW88261_START_WORK_DELAY_MS); } =20 static struct snd_soc_dai_driver aw88261_dai[] =3D { @@ -838,7 +733,7 @@ static int aw88261_profile_info(struct snd_kcontrol *kc= ontrol, =20 count =3D uinfo->value.enumerated.item; =20 - ret =3D aw88261_dev_get_prof_name(aw88261->aw_pa, count, &prof_name); + ret =3D aw_dev_get_prof_name(aw88261->aw_pa, count, &prof_name); if (ret) { strscpy(uinfo->value.enumerated.name, "null"); return 0; @@ -878,7 +773,7 @@ static int aw88261_profile_set(struct snd_kcontrol *kco= ntrol, =20 if (aw88261->aw_pa->status) { aw88261_dev_stop(aw88261->aw_pa); - aw88261_start(aw88261, AW88261_SYNC_START); + aw88261_start(aw88261, AW_SYNC_START); } =20 mutex_unlock(&aw88261->lock); @@ -915,7 +810,7 @@ static int aw88261_volume_set(struct snd_kcontrol *kcon= trol, =20 if (vol_desc->ctl_volume !=3D value) { vol_desc->ctl_volume =3D value; - aw88261_dev_set_volume(aw88261->aw_pa, vol_desc->ctl_volume); + aw88261_set_volume(aw88261->aw_pa, vol_desc->ctl_volume); =20 return 1; } @@ -965,7 +860,7 @@ static const struct snd_kcontrol_new aw88261_controls[]= =3D { aw88261_get_fade_in_time, aw88261_set_fade_in_time), SOC_SINGLE_EXT("Volume Ramp Down Step", 0, 0, FADE_TIME_MAX, FADE_TIME_MI= N, aw88261_get_fade_out_time, aw88261_set_fade_out_time), - AW88261_PROFILE_EXT("Profile Set", aw88261_profile_info, + AW_PROFILE_EXT("Profile Set", aw88261_profile_info, aw88261_profile_get, aw88261_profile_set), }; =20 @@ -978,7 +873,7 @@ static int aw88261_playback_event(struct snd_soc_dapm_w= idget *w, mutex_lock(&aw88261->lock); switch (event) { case SND_SOC_DAPM_PRE_PMU: - aw88261_start(aw88261, AW88261_ASYNC_START); + aw88261_start(aw88261, AW_ASYNC_START); break; case SND_SOC_DAPM_POST_PMD: aw88261_dev_stop(aw88261->aw_pa); @@ -993,7 +888,7 @@ static int aw88261_playback_event(struct snd_soc_dapm_w= idget *w, =20 static const struct snd_soc_dapm_widget aw88261_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, aw88261_playback_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_OUTPUT("DAC Output"), @@ -1040,123 +935,31 @@ static int aw88261_frcset_check(struct aw88261 *aw8= 8261) return ret; } =20 -static int aw88261_dev_init(struct aw88261 *aw88261, struct aw_container *= aw_cfg) +static int aw88261_codec_probe(struct snd_soc_component *component) { - struct aw_device *aw_dev =3D aw88261->aw_pa; + struct aw88261 *aw88261 =3D snd_soc_component_get_drvdata(component); int ret; =20 - ret =3D aw88395_dev_cfg_load(aw_dev, aw_cfg); - if (ret) { - dev_err(aw_dev->dev, "aw_dev acf parse failed"); - return -EINVAL; - } + INIT_DELAYED_WORK(&aw88261->start_work, aw88261_startup_work); =20 - ret =3D regmap_write(aw_dev->regmap, AW88261_ID_REG, AW88261_SOFT_RESET_V= ALUE); + ret =3D aw_dev_request_firmware_file(aw88261->aw_pa, AW88261_ACF_FILE); if (ret) - return ret; + return dev_err_probe(aw88261->aw_pa->dev, ret, + "aw88261_request_firmware_file failed\n"); =20 - aw_dev->fade_in_time =3D AW88261_500_US; - aw_dev->fade_out_time =3D AW88261_500_US; - aw_dev->prof_cur =3D AW88261_INIT_PROFILE; - aw_dev->prof_index =3D AW88261_INIT_PROFILE; =20 ret =3D aw88261_dev_fw_update(aw88261); if (ret) { - dev_err(aw_dev->dev, "fw update failed ret =3D %d\n", ret); + dev_err(aw88261->aw_pa->dev, "fw update failed ret =3D %d\n", ret); return ret; } =20 ret =3D aw88261_frcset_check(aw88261); if (ret) { - dev_err(aw_dev->dev, "aw88261_frcset_check ret =3D %d\n", ret); - return ret; - } - - aw88261_dev_clear_int_status(aw_dev); - - aw88261_dev_uls_hmute(aw_dev, true); - - aw88261_dev_mute(aw_dev, true); - - aw88261_dev_i2s_tx_enable(aw_dev, false); - - usleep_range(AW88261_1000_US, AW88261_1000_US + 100); - - aw88261_dev_amppd(aw_dev, true); - - aw88261_dev_pwd(aw_dev, true); - - return 0; -} - -static int aw88261_request_firmware_file(struct aw88261 *aw88261) -{ - const struct firmware *cont =3D NULL; - int ret; - - aw88261->aw_pa->fw_status =3D AW88261_DEV_FW_FAILED; - - ret =3D request_firmware(&cont, AW88261_ACF_FILE, aw88261->aw_pa->dev); - if (ret) - return dev_err_probe(aw88261->aw_pa->dev, ret, - "load [%s] failed!", AW88261_ACF_FILE); - - dev_info(aw88261->aw_pa->dev, "loaded %s - size: %zu\n", - AW88261_ACF_FILE, cont ? cont->size : 0); - - aw88261->aw_cfg =3D devm_kzalloc(aw88261->aw_pa->dev, cont->size + sizeof= (int), GFP_KERNEL); - if (!aw88261->aw_cfg) { - release_firmware(cont); - return -ENOMEM; - } - aw88261->aw_cfg->len =3D (int)cont->size; - memcpy(aw88261->aw_cfg->data, cont->data, cont->size); - release_firmware(cont); - - ret =3D aw88395_dev_load_acf_check(aw88261->aw_pa, aw88261->aw_cfg); - if (ret) { - dev_err(aw88261->aw_pa->dev, "load [%s] failed !", AW88261_ACF_FILE); + dev_err(aw88261->aw_pa->dev, "aw88261_frcset_check ret =3D %d\n", ret); return ret; } =20 - mutex_lock(&aw88261->lock); - /* aw device init */ - ret =3D aw88261_dev_init(aw88261, aw88261->aw_cfg); - if (ret) - dev_err(aw88261->aw_pa->dev, "dev init failed"); - mutex_unlock(&aw88261->lock); - - return ret; -} - -static int aw88261_codec_probe(struct snd_soc_component *component) -{ - struct snd_soc_dapm_context *dapm =3D snd_soc_component_get_dapm(componen= t); - struct aw88261 *aw88261 =3D snd_soc_component_get_drvdata(component); - int ret; - - INIT_DELAYED_WORK(&aw88261->start_work, aw88261_startup_work); - - ret =3D aw88261_request_firmware_file(aw88261); - if (ret) - return dev_err_probe(aw88261->aw_pa->dev, ret, - "aw88261_request_firmware_file failed\n"); - - /* add widgets */ - ret =3D snd_soc_dapm_new_controls(dapm, aw88261_dapm_widgets, - ARRAY_SIZE(aw88261_dapm_widgets)); - if (ret) - return ret; - - /* add route */ - ret =3D snd_soc_dapm_add_routes(dapm, aw88261_audio_map, - ARRAY_SIZE(aw88261_audio_map)); - if (ret) - return ret; - - ret =3D snd_soc_add_component_controls(component, aw88261_controls, - ARRAY_SIZE(aw88261_controls)); - return ret; } =20 @@ -1170,62 +973,14 @@ static void aw88261_codec_remove(struct snd_soc_comp= onent *aw_codec) static const struct snd_soc_component_driver soc_codec_dev_aw88261 =3D { .probe =3D aw88261_codec_probe, .remove =3D aw88261_codec_remove, + .dapm_widgets =3D aw88261_dapm_widgets, + .num_dapm_widgets =3D ARRAY_SIZE(aw88261_dapm_widgets), + .dapm_routes =3D aw88261_audio_map, + .num_dapm_routes =3D ARRAY_SIZE(aw88261_audio_map), + .controls =3D aw88261_controls, + .num_controls =3D ARRAY_SIZE(aw88261_controls), }; =20 -static void aw88261_parse_channel_dt(struct aw88261 *aw88261) -{ - struct aw_device *aw_dev =3D aw88261->aw_pa; - struct device_node *np =3D aw_dev->dev->of_node; - u32 channel_value =3D AW88261_DEV_DEFAULT_CH; - - of_property_read_u32(np, "awinic,audio-channel", &channel_value); - aw88261->phase_sync =3D of_property_read_bool(np, "awinic,sync-flag"); - - aw_dev->channel =3D channel_value; -} - -static int aw88261_init(struct aw88261 **aw88261, struct i2c_client *i2c, = struct regmap *regmap) -{ - struct aw_device *aw_dev; - unsigned int chip_id; - int ret; - - /* read chip id */ - ret =3D regmap_read(regmap, AW88261_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 AW88261_CHIP_ID) { - dev_err(&i2c->dev, "unsupported device"); - return -ENXIO; - } - - dev_info(&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; - - (*aw88261)->aw_pa =3D aw_dev; - aw_dev->i2c =3D i2c; - aw_dev->regmap =3D regmap; - aw_dev->dev =3D &i2c->dev; - aw_dev->chip_id =3D AW88261_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 0; - aw_dev->fw_status =3D AW88261_DEV_FW_FAILED; - aw_dev->fade_step =3D AW88261_VOLUME_STEP_DB; - aw_dev->volume_desc.ctl_volume =3D AW88261_VOL_DEFAULT_VALUE; - aw_dev->volume_desc.mute_volume =3D AW88261_MUTE_VOL; - aw88261_parse_channel_dt(*aw88261); - - return ret; -} - static int aw88261_i2c_probe(struct i2c_client *i2c) { struct aw88261 *aw88261; @@ -1249,8 +1004,12 @@ static int aw88261_i2c_probe(struct i2c_client *i2c) return dev_err_probe(&i2c->dev, ret, "failed to init regmap: %d\n", ret); } =20 + aw88261->aw_pa =3D devm_kzalloc(&i2c->dev, sizeof(*aw88261->aw_pa), GFP_K= ERNEL); + if (!aw88261->aw_pa) + return -ENOMEM; + /* aw pa init */ - ret =3D aw88261_init(&aw88261, i2c, aw88261->regmap); + ret =3D aw_dev_init(aw88261->aw_pa, i2c, aw88261->regmap); if (ret) return ret; =20 diff --git a/sound/soc/codecs/aw88261.h b/sound/soc/codecs/aw88261.h index 734d0f93ced9..4ec0fe3ad033 100644 --- a/sound/soc/codecs/aw88261.h +++ b/sound/soc/codecs/aw88261.h @@ -378,8 +378,6 @@ SNDRV_PCM_FMTBIT_S24_LE | \ SNDRV_PCM_FMTBIT_S32_LE) =20 -#define FADE_TIME_MAX 100000 -#define FADE_TIME_MIN 0 =20 #define AW88261_DEV_DEFAULT_CH (0) #define AW88261_ACF_FILE "aw88261_acf.bin" @@ -396,40 +394,6 @@ AW88261_VOL_6DB_START) + \ ((value) % AW88261_VOLUME_STEP_DB)) =20 -#define AW88261_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 { - AW88261_SYNC_START =3D 0, - AW88261_ASYNC_START, -}; - -enum aw88261_id { - AW88261_CHIP_ID =3D 0x2113, -}; - -enum { - AW88261_500_US =3D 500, - AW88261_1000_US =3D 1000, - AW88261_2000_US =3D 2000, -}; - -enum { - AW88261_DEV_PW_OFF =3D 0, - AW88261_DEV_PW_ON, -}; - -enum { - AW88261_DEV_FW_FAILED =3D 0, - AW88261_DEV_FW_OK, -}; - enum { AW88261_EF_AND_CHECK =3D 0, AW88261_EF_OR_CHECK, @@ -440,20 +404,4 @@ enum { AW88261_FRCSET_ENABLE, }; =20 -struct aw88261 { - struct aw_device *aw_pa; - struct mutex lock; - struct gpio_desc *reset_gpio; - struct delayed_work start_work; - struct regmap *regmap; - struct aw_container *aw_cfg; - - int efuse_check; - int frcset_en; - unsigned int mute_st; - unsigned int amppd_st; - - bool phase_sync; -}; - #endif --=20 2.47.0