From nobody Wed Oct 1 23:35:30 2025 Received: from out198-13.us.a.mail.aliyun.com (out198-13.us.a.mail.aliyun.com [47.90.198.13]) (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 2F4372EF67A; Fri, 26 Sep 2025 10:21:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=47.90.198.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758882071; cv=none; b=EXnHcOlEinsFY0X0s8TaWna2YotdDlXMPem+GttyvjAfCDtJf157dItxg7xQI8+Ze6v6plnqyRxatFOaxpE+F6LTQa0WPYa92bX1/riAgojA7kzaLqFrxZx3G/xl2xk3hnyqhtrx2L8OsI02VFzWPJc5s6dksQZDAfKXDDcG5Es= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758882071; c=relaxed/simple; bh=QiSbJfURIf+Lu04dsvrIgofWufpqWBOww8czbBwfnEk=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tpVvufyFuPAYqw+sV1CwaBAajMIoJZ6InIJVik/r9CbD/8r5jcBIMDoKlpZTegdiy5muhaRy67VjOmQs4BR+2DJy5tHFNRHlrAr7iKwgffaYdPb9biPbQ3ZRwm4lhuIM9mbnTWiGk609SUzcP19spQ0nG0sk2Cp9M4hqAqPLrGs= 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=ZypvEhGE; arc=none smtp.client-ip=47.90.198.13 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="ZypvEhGE" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=awinic.com; s=default; t=1758882054; h=From:To:Subject:Date:Message-ID:MIME-Version; bh=foMJuuIU9iM9ucLIhSZvo4bGpJiocPgRr44s1b5iQQU=; b=ZypvEhGEOik7Xcp2FAOkmtBVgURiBauiI8LBZi+MMzlPWm6mCpfAmd5hfUbfeIdTYyjqGM1fbjsYnA1mUze8xy+7SL89ndlpVh3esv/tcmOH7QGyyl2rccMtVioZYrZpWOG0hvgzKFBt1JCbcBtXecK2L3jzfebpDxG/2JuPUSZ2O1ZoolQuydMMn1a99OE932/eiSOmLLnD9p9/JiXfijkSD0XRarnegQPmWzzrFFr6tvU/7FG7xBCGkvqsz5mzvjHVu8sB4UNmI1R5wS5VpsgppRnFUUZKqfzmpqshzG594IRYESzTrUnL18Qq70IzSZmqgaZq8lTSOlM9b9Bh9A== Received: from ubuntu-VirtualBox..(mailfrom:wangweidong.a@awinic.com fp:SMTPD_---.ensjP1n_1758882050 cluster:ay29) by smtp.aliyun-inc.com; Fri, 26 Sep 2025 18:20:51 +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 5/7] ASoC: codecs: Rework the aw88166 driver Date: Fri, 26 Sep 2025 18:20:35 +0800 Message-ID: <20250926102037.27697-6-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 aw88166 driver to adapt it for aw-common-device.c and aw-common-firmware.c Signed-off-by: Weidong Wang --- sound/soc/codecs/aw88166.c | 819 +++++++------------------------------ sound/soc/codecs/aw88166.h | 58 --- 2 files changed, 137 insertions(+), 740 deletions(-) diff --git a/sound/soc/codecs/aw88166.c b/sound/soc/codecs/aw88166.c index 28f62b991ef2..3538675b0d68 100644 --- a/sound/soc/codecs/aw88166.c +++ b/sound/soc/codecs/aw88166.c @@ -11,11 +11,11 @@ #include #include #include -#include #include #include #include "aw88166.h" -#include "aw88395/aw88395_device.h" +#include "aw-common-device.h" +#include "aw-common-firmware.h" =20 struct aw88166 { struct aw_device *aw_pa; @@ -41,150 +41,6 @@ static const struct regmap_config aw88166_remap_config = =3D { .val_format_endian =3D REGMAP_ENDIAN_BIG, }; =20 -static int aw_dev_dsp_write_16bit(struct aw_device *aw_dev, - unsigned short dsp_addr, unsigned int dsp_data) -{ - int ret; - - ret =3D regmap_write(aw_dev->regmap, AW88166_DSPMADD_REG, dsp_addr); - if (ret) { - dev_err(aw_dev->dev, "%s write addr error, ret=3D%d", __func__, ret); - return ret; - } - - ret =3D regmap_write(aw_dev->regmap, AW88166_DSPMDAT_REG, (u16)dsp_data); - if (ret) { - dev_err(aw_dev->dev, "%s write data error, ret=3D%d", __func__, ret); - return ret; - } - - return 0; -} - -static int aw_dev_dsp_read_16bit(struct aw_device *aw_dev, - unsigned short dsp_addr, unsigned int *dsp_data) -{ - unsigned int temp_data; - int ret; - - ret =3D regmap_write(aw_dev->regmap, AW88166_DSPMADD_REG, dsp_addr); - if (ret) { - dev_err(aw_dev->dev, "%s write error, ret=3D%d", __func__, ret); - return ret; - } - - ret =3D regmap_read(aw_dev->regmap, AW88166_DSPMDAT_REG, &temp_data); - if (ret) { - dev_err(aw_dev->dev, "%s read error, ret=3D%d", __func__, ret); - return ret; - } - *dsp_data =3D temp_data; - - return 0; -} - -static int aw_dev_dsp_read_32bit(struct aw_device *aw_dev, - unsigned short dsp_addr, unsigned int *dsp_data) -{ - unsigned int temp_data; - int ret; - - ret =3D regmap_write(aw_dev->regmap, AW88166_DSPMADD_REG, dsp_addr); - if (ret) { - dev_err(aw_dev->dev, "%s write error, ret=3D%d", __func__, ret); - return ret; - } - - ret =3D regmap_read(aw_dev->regmap, AW88166_DSPMDAT_REG, &temp_data); - if (ret) { - dev_err(aw_dev->dev, "%s read error, ret=3D%d", __func__, ret); - return ret; - } - *dsp_data =3D temp_data; - - ret =3D regmap_read(aw_dev->regmap, AW88166_DSPMDAT_REG, &temp_data); - if (ret) { - dev_err(aw_dev->dev, "%s read error, ret=3D%d", __func__, ret); - return ret; - } - *dsp_data |=3D (temp_data << 16); - - return 0; -} - -static int aw_dev_dsp_read(struct aw_device *aw_dev, - unsigned short dsp_addr, unsigned int *dsp_data, unsigned char data_type) -{ - u32 reg_value; - int ret; - - mutex_lock(&aw_dev->dsp_lock); - switch (data_type) { - case AW88166_DSP_16_DATA: - ret =3D aw_dev_dsp_read_16bit(aw_dev, dsp_addr, dsp_data); - if (ret) - dev_err(aw_dev->dev, "read dsp_addr[0x%x] 16-bit failed", (u32)dsp_addr= ); - break; - case AW88166_DSP_32_DATA: - ret =3D aw_dev_dsp_read_32bit(aw_dev, dsp_addr, dsp_data); - if (ret) - dev_err(aw_dev->dev, "read dsp_addr[0x%x] 32-bit failed", (u32)dsp_addr= ); - break; - default: - dev_err(aw_dev->dev, "data type[%d] unsupported", data_type); - ret =3D -EINVAL; - break; - } - - /* clear dsp chip select state */ - if (regmap_read(aw_dev->regmap, AW88166_ID_REG, ®_value)) - dev_err(aw_dev->dev, "%s fail to clear chip state. ret=3D%d\n", __func__= , ret); - mutex_unlock(&aw_dev->dsp_lock); - - return ret; -} - -static void aw_dev_pwd(struct aw_device *aw_dev, bool pwd) -{ - int ret; - - if (pwd) - ret =3D regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, - ~AW88166_PWDN_MASK, AW88166_PWDN_POWER_DOWN_VALUE); - else - ret =3D regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, - ~AW88166_PWDN_MASK, AW88166_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, AW88166_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) { unsigned int reg_val; @@ -209,7 +65,7 @@ static int aw_dev_check_mode1_pll(struct aw_device *aw_d= ev) ret =3D aw_dev_get_iis_status(aw_dev); if (ret) { dev_err(aw_dev->dev, "mode1 iis signal check error"); - usleep_range(AW88166_2000_US, AW88166_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); } else { return 0; } @@ -243,7 +99,7 @@ static int aw_dev_check_mode2_pll(struct aw_device *aw_d= ev) ret =3D aw_dev_get_iis_status(aw_dev); if (ret) { dev_err(aw_dev->dev, "mode2 iis signal check error"); - usleep_range(AW88166_2000_US, AW88166_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); } else { break; } @@ -253,12 +109,12 @@ static int aw_dev_check_mode2_pll(struct aw_device *a= w_dev) regmap_update_bits(aw_dev->regmap, AW88166_PLLCTRL2_REG, ~AW88166_CCO_MUX_MASK, AW88166_CCO_MUX_BYPASS_VALUE); if (ret =3D=3D 0) { - usleep_range(AW88166_2000_US, AW88166_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); for (i =3D 0; i < AW88166_DEV_SYSST_CHECK_MAX; i++) { ret =3D aw_dev_get_iis_status(aw_dev); if (ret) { dev_err(aw_dev->dev, "mode2 switch to mode1, iis signal check error"); - usleep_range(AW88166_2000_US, AW88166_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); } else { break; } @@ -308,7 +164,7 @@ static int aw_dev_check_sysst(struct aw_device *aw_dev) if ((reg_val & (~AW88166_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, AW88166_BIT_SYSST_NOSWS_CHECK); - usleep_range(AW88166_2000_US, AW88166_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); } else { return 0; } @@ -317,36 +173,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, AW88166_SYSCTRL_REG, - ~AW88166_AMPPD_MASK, AW88166_AMPPD_POWER_DOWN_VALUE); - else - ret =3D regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, - ~AW88166_AMPPD_MASK, AW88166_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, AW88166_SYSCTRL_REG, - ~AW88166_DSPBY_MASK, AW88166_DSPBY_WORKING_VALUE); - else - ret =3D regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, - ~AW88166_DSPBY_MASK, AW88166_DSPBY_BYPASS_VALUE); - - if (ret) - dev_dbg(aw_dev->dev, "%s failed\n", __func__); -} - static int aw88166_dev_get_icalk(struct aw88166 *aw88166, int16_t *icalk) { struct aw_device *aw_dev =3D aw88166->aw_pa; @@ -564,7 +390,7 @@ static int aw_dev_fw_crc_check(struct aw_device *aw_dev) ret =3D regmap_update_bits(aw_dev->regmap, AW88166_CRCCTRL_REG, ~AW88166_CRC_CODE_EN_MASK, AW88166_CRC_CODE_EN_ENABLE_VALUE); =20 - usleep_range(AW88166_2000_US, AW88166_2000_US + 10); + usleep_range(AW_2000_US, AW_2000_US + 10); =20 /* read crc check result */ regmap_read(aw_dev->regmap, AW88166_HAGCST_REG, ®_val); @@ -609,7 +435,7 @@ static int aw_dev_cfg_crc_check(struct aw_device *aw_de= v) if (ret) return ret; =20 - usleep_range(AW88166_1000_US, AW88166_1000_US + 10); + usleep_range(AW_1000_US, AW_1000_US + 10); =20 /* read crc check result */ ret =3D regmap_read(aw_dev->regmap, AW88166_HAGCST_REG, ®_val); @@ -670,170 +496,74 @@ static int aw_dev_hw_crc_check(struct aw88166 *aw881= 66) 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, AW88166_I2SCTRL3_REG, - ~AW88166_I2STXEN_MASK, AW88166_I2STXEN_ENABLE_VALUE); - else - ret =3D regmap_update_bits(aw_dev->regmap, AW88166_I2SCTRL3_REG, - ~AW88166_I2STXEN_MASK, AW88166_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, AW88166_WDT_REG, ®_val); - if (ret) - return ret; - if (!(reg_val & (~AW88166_WDT_CNT_MASK))) - return -EPERM; - - return 0; -} - static int aw_dev_dsp_check(struct aw_device *aw_dev) { int ret, i; =20 - switch (aw_dev->dsp_cfg) { - case AW88166_DEV_DSP_BYPASS: - dev_dbg(aw_dev->dev, "dsp bypass"); - ret =3D 0; - break; - case AW88166_DEV_DSP_WORK: - aw_dev_dsp_enable(aw_dev, false); - aw_dev_dsp_enable(aw_dev, true); - usleep_range(AW88166_1000_US, AW88166_1000_US + 10); - for (i =3D 0; i < AW88166_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(AW88166_2000_US, AW88166_2000_US + 10); - } + + regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, + ~AW88166_DSPBY_MASK, AW88166_DSPBY_BYPASS_VALUE); + regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, + ~AW88166_DSPBY_MASK, AW88166_DSPBY_WORKING_VALUE); + usleep_range(AW_1000_US, AW_1000_US + 10); + for (i =3D 0; i < AW88166_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 aw88166_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)AW88166= _MUTE_VOL); =20 - ret =3D regmap_read(aw_dev->regmap, AW88166_SYSCTRL2_REG, ®_value); - if (ret) - return ret; + regmap_read(aw_dev->regmap, AW88166_SYSCTRL2_REG, ®_value); =20 dev_dbg(aw_dev->dev, "value 0x%x , reg:0x%x", value, real_value); =20 real_value =3D (real_value << AW88166_VOL_START_BIT) | (reg_value & AW881= 66_VOL_MASK); =20 - ret =3D regmap_write(aw_dev->regmap, AW88166_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 AW88166_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, AW88166_MUTE_VOL); - return; - } - - for (i =3D desc->ctl_volume; i <=3D AW88166_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 AW88166_MUTE_VOL) { - aw_dev_set_volume(aw_dev, AW88166_MUTE_VOL); - usleep_range(aw_dev->fade_out_time, aw_dev->fade_out_time + 10); - } + regmap_write(aw_dev->regmap, AW88166_SYSCTRL2_REG, real_value); } =20 static void aw88166_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, aw88166_set_volume); regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, ~AW88166_HMUTE_MASK, AW88166_HMUTE_ENABLE_VALUE); } else { regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, ~AW88166_HMUTE_MASK, AW88166_HMUTE_DISABLE_VALUE); - aw_dev_fade_in(aw_dev); + aw_dev_fade_in(aw_dev, aw88166_set_volume); } } =20 -static void aw88166_dev_set_dither(struct aw88166 *aw88166, bool dither) -{ - struct aw_device *aw_dev =3D aw88166->aw_pa; - - if (dither) - regmap_update_bits(aw_dev->regmap, AW88166_DBGCTRL_REG, - ~AW88166_DITHER_EN_MASK, AW88166_DITHER_EN_ENABLE_VALUE); - else - regmap_update_bits(aw_dev->regmap, AW88166_DBGCTRL_REG, - ~AW88166_DITHER_EN_MASK, AW88166_DITHER_EN_DISABLE_VALUE); -} - static int aw88166_dev_start(struct aw88166 *aw88166) { struct aw_device *aw_dev =3D aw88166->aw_pa; int ret; =20 - if (aw_dev->status =3D=3D AW88166_DEV_PW_ON) { + if (aw_dev->status =3D=3D AW_DEV_PW_ON) { dev_dbg(aw_dev->dev, "already power on"); return 0; } =20 - aw88166_dev_set_dither(aw88166, false); + regmap_update_bits(aw_dev->regmap, AW88166_DBGCTRL_REG, + ~AW88166_DITHER_EN_MASK, AW88166_DITHER_EN_DISABLE_VALUE); =20 /* power on */ - aw_dev_pwd(aw_dev, false); - usleep_range(AW88166_2000_US, AW88166_2000_US + 10); + regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, + ~AW88166_PWDN_MASK, AW88166_PWDN_WORKING_VALUE); + usleep_range(AW_2000_US, AW_2000_US + 10); =20 ret =3D aw_dev_check_syspll(aw_dev); if (ret) { @@ -842,8 +572,9 @@ static int aw88166_dev_start(struct aw88166 *aw88166) } =20 /* amppd on */ - aw_dev_amppd(aw_dev, false); - usleep_range(AW88166_1000_US, AW88166_1000_US + 50); + regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, + ~AW88166_AMPPD_MASK, AW88166_AMPPD_WORKING_VALUE); + usleep_range(AW_1000_US, AW_1000_US + 50); =20 /* check i2s status */ ret =3D aw_dev_check_sysst(aw_dev); @@ -852,14 +583,15 @@ static int aw88166_dev_start(struct aw88166 *aw88166) goto sysst_check_fail; } =20 - if (aw_dev->dsp_cfg =3D=3D AW88166_DEV_DSP_WORK) { + if (aw_dev->dsp_cfg =3D=3D AW_DEV_DSP_WORK) { aw_dev_backup_sec_recovery(aw88166); ret =3D aw_dev_hw_crc_check(aw88166); if (ret) { dev_err(aw_dev->dev, "dsp crc check failed\n"); goto crc_check_fail; } - aw_dev_dsp_enable(aw_dev, false); + regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, + ~AW88166_DSPBY_MASK, AW88166_DSPBY_BYPASS_VALUE); aw88166_dev_set_vcalb(aw88166); aw_dev_update_cali_re(&aw_dev->cali_desc); ret =3D aw_dev_dsp_check(aw_dev); @@ -872,68 +604,45 @@ static int aw88166_dev_start(struct aw88166 *aw88166) } =20 /* enable tx feedback */ - aw_dev_i2s_tx_enable(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88166_I2SCTRL3_REG, + ~AW88166_I2STXEN_MASK, AW88166_I2STXEN_ENABLE_VALUE); =20 if (aw88166->dither_st =3D=3D AW88166_DITHER_EN_ENABLE_VALUE) - aw88166_dev_set_dither(aw88166, true); + regmap_update_bits(aw_dev->regmap, AW88166_DBGCTRL_REG, + ~AW88166_DITHER_EN_MASK, AW88166_DITHER_EN_ENABLE_VALUE); =20 /* close mute */ aw88166_dev_mute(aw_dev, false); /* clear inturrupt */ aw_dev_clear_int_status(aw_dev); - aw_dev->status =3D AW88166_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, AW88166_SYSCTRL_REG, + ~AW88166_DSPBY_MASK, AW88166_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, AW88166_SYSCTRL_REG, + ~AW88166_AMPPD_MASK, AW88166_AMPPD_POWER_DOWN_VALUE); pll_check_fail: - aw_dev_pwd(aw_dev, true); - aw_dev->status =3D AW88166_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, AW88166_DSPMADD_REG, base); - if (ret) - goto error_operation; - - for (i =3D 0; i < len; i +=3D AW88166_MAX_RAM_WRITE_BYTE_SIZE) { - tmp_len =3D min(len - i, AW88166_MAX_RAM_WRITE_BYTE_SIZE); - ret =3D regmap_raw_write(aw_dev->regmap, AW88166_DSPMDAT_REG, - &data[i], tmp_len); - if (ret) - goto error_operation; - } - mutex_unlock(&aw_dev->dsp_lock); - - return 0; + regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, + ~AW88166_PWDN_MASK, AW88166_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 aw_dev_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, AW88166_DSP_REG_CFG_ADPZ_RA, - &dsp_ra, AW88166_DSP_32_DATA); + &dsp_ra, AW_DSP_32_DATA); if (ret) { dev_err(aw_dev->dev, "read ra error\n"); return ret; @@ -945,54 +654,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\n"); - return -EINVAL; - } - - ret =3D aw_dev_dsp_update_container(aw_dev, data, len, AW88166_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\n"); - return -EINVAL; - } - - aw_dev->dsp_fw_len =3D len; - ret =3D aw_dev_dsp_update_container(aw_dev, data, len, AW88166_DSP_FW_ADD= R); - - return ret; -} - -static int aw_dev_check_sram(struct aw_device *aw_dev) +static int aw88166_check_sram(struct aw_device *aw_dev) { unsigned int reg_val; =20 - mutex_lock(&aw_dev->dsp_lock); /* read dsp_rom_check_reg */ - aw_dev_dsp_read_16bit(aw_dev, AW88166_DSP_ROM_CHECK_ADDR, ®_val); + aw_dev_dsp_read(aw_dev, AW88166_DSP_ROM_CHECK_ADDR, ®_val, AW_DSP_16_D= ATA); if (reg_val !=3D AW88166_DSP_ROM_CHECK_DATA) { dev_err(aw_dev->dev, "check dsp rom failed, read[0x%x] !=3D check[0x%x]\= n", reg_val, AW88166_DSP_ROM_CHECK_DATA); @@ -1000,47 +667,21 @@ 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, AW88166_DSP_CFG_ADDR, AW88166_DSP_ODD_NUM_= BIT_TEST); - aw_dev_dsp_read_16bit(aw_dev, AW88166_DSP_CFG_ADDR, ®_val); + aw_dev_dsp_write(aw_dev, AW88166_DSP_CFG_ADDR, + AW88166_DSP_ODD_NUM_BIT_TEST, AW_DSP_16_DATA); + aw_dev_dsp_read(aw_dev, AW88166_DSP_CFG_ADDR, ®_val, AW_DSP_16_DATA); if (reg_val !=3D AW88166_DSP_ODD_NUM_BIT_TEST) { dev_err(aw_dev->dev, "check dsp cfg failed, read[0x%x] !=3D write[0x%x]\= n", reg_val, AW88166_DSP_ODD_NUM_BIT_TEST); goto error; } - 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 AW88166_DEV_MEMCLK_PLL: - ret =3D regmap_update_bits(aw_dev->regmap, AW88166_DBGCTRL_REG, - ~AW88166_MEM_CLKSEL_MASK, - AW88166_MEM_CLKSEL_DAPHCLK_VALUE); - if (ret) - dev_err(aw_dev->dev, "memclk select pll failed\n"); - break; - case AW88166_DEV_MEMCLK_OSC: - ret =3D regmap_update_bits(aw_dev->regmap, AW88166_DBGCTRL_REG, - ~AW88166_MEM_CLKSEL_MASK, - AW88166_MEM_CLKSEL_OSCCLK_VALUE); - if (ret) - dev_err(aw_dev->dev, "memclk select OSC failed\n"); - break; - default: - dev_err(aw_dev->dev, "unknown memclk config, flag=3D0x%x\n", flag); - break; - } -} - -static int aw_dev_update_reg_container(struct aw88166 *aw88166, +static int aw88166_reg_update(struct aw88166 *aw88166, unsigned char *data, unsigned int len) { struct aw_device *aw_dev =3D aw88166->aw_pa; @@ -1054,7 +695,7 @@ static int aw_dev_update_reg_container(struct aw88166 = *aw88166, data_len =3D len >> 1; =20 if (data_len & 0x1) { - dev_err(aw_dev->dev, "data len:%d unsupported\n", data_len); + dev_err(aw_dev->dev, "data len:%d unsupported\n", data_len); return -EINVAL; } =20 @@ -1069,9 +710,9 @@ static int aw_dev_update_reg_container(struct aw88166 = *aw88166, =20 if (reg_addr =3D=3D AW88166_SYSCTRL_REG) { if (reg_val & (~AW88166_DSPBY_MASK)) - aw_dev->dsp_cfg =3D AW88166_DEV_DSP_BYPASS; + aw_dev->dsp_cfg =3D AW_DEV_DSP_BYPASS; else - aw_dev->dsp_cfg =3D AW88166_DEV_DSP_WORK; + aw_dev->dsp_cfg =3D AW_DEV_DSP_WORK; =20 reg_val &=3D (AW88166_HMUTE_MASK | AW88166_PWDN_MASK | AW88166_DSPBY_MASK); @@ -1117,62 +758,14 @@ static int aw_dev_update_reg_container(struct aw8816= 6 *aw88166, return ret; } =20 - aw_dev_pwd(aw_dev, false); - usleep_range(AW88166_1000_US, AW88166_1000_US + 10); + regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, + ~AW88166_PWDN_MASK, AW88166_PWDN_WORKING_VALUE); + 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 aw88166 *aw88166, - unsigned char *data, unsigned int len) -{ - int ret; - - if (!len || !data) { - dev_err(aw88166->aw_pa->dev, "reg data is null or len is 0\n"); - return -EINVAL; - } - - ret =3D aw_dev_update_reg_container(aw88166, data, len); - if (ret) - dev_err(aw88166->aw_pa->dev, "reg update failed\n"); - - return ret; -} - -static int aw88166_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]\n", - 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 aw88166_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]; + aw88166_set_volume(aw_dev, vol_desc->ctl_volume); =20 return 0; } @@ -1186,54 +779,51 @@ static int aw88166_dev_fw_update(struct aw88166 *aw8= 8166, 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 AW88166_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 AW88166_DEV_FW_FAILED) { + if (aw_dev->fw_status =3D=3D AW_DEV_FW_FAILED) { dev_err(aw_dev->dev, "fw status[%d] error\n", aw_dev->fw_status); return -EPERM; } =20 - ret =3D aw88166_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 aw88166_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(aw88166, sec_desc[AW88395_DATA_TYPE_REG].data, - sec_desc[AW88395_DATA_TYPE_REG].len); + ret =3D aw88166_reg_update(aw88166, sec_desc[AW_DATA_TYPE_REG].data, + sec_desc[AW_DATA_TYPE_REG].len); if (ret) { dev_err(aw_dev->dev, "update reg failed\n"); return ret; } =20 - aw88166_dev_mute(aw_dev, true); - - if (aw_dev->dsp_cfg =3D=3D AW88166_DEV_DSP_WORK) - aw_dev_dsp_enable(aw_dev, false); - - aw_dev_select_memclk(aw_dev, AW88166_DEV_MEMCLK_OSC); - - ret =3D aw_dev_check_sram(aw_dev); - if (ret) { - dev_err(aw_dev->dev, "check sram failed\n"); - goto error; - } + regmap_update_bits(aw_dev->regmap, AW88166_DBGCTRL_REG, ~AW88166_MEM_CLKS= EL_MASK, + AW88166_MEM_CLKSEL_OSCCLK_VALUE); =20 aw_dev_backup_sec_recovery(aw88166); =20 if (up_dsp_fw_en) { + ret =3D aw88166_check_sram(aw_dev); + if (ret) { + dev_err(aw_dev->dev, "check sram failed\n"); + 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\n"); goto error; @@ -1241,23 +831,27 @@ static int aw88166_dev_fw_update(struct aw88166 *aw8= 8166, 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\n"); goto error; } =20 + aw_dev_get_ra(aw_dev); aw_dev_backup_sec_record(aw88166); =20 - aw_dev_select_memclk(aw_dev, AW88166_DEV_MEMCLK_PLL); + regmap_update_bits(aw_dev->regmap, AW88166_DBGCTRL_REG, ~AW88166_MEM_CLKS= EL_MASK, + AW88166_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, AW88166_DEV_MEMCLK_PLL); + regmap_update_bits(aw_dev->regmap, AW88166_DBGCTRL_REG, ~AW88166_MEM_CLKS= EL_MASK, + AW88166_MEM_CLKSEL_DAPHCLK_VALUE); return ret; } =20 @@ -1269,7 +863,7 @@ static void aw88166_start_pa(struct aw88166 *aw88166) ret =3D aw88166_dev_start(aw88166); if (ret) { dev_err(aw88166->aw_pa->dev, "aw88166 device start failed. retry =3D %d= ", i); - ret =3D aw88166_dev_fw_update(aw88166, AW88166_DSP_FW_UPDATE_ON, true); + ret =3D aw88166_dev_fw_update(aw88166, AW_DSP_FW_UPDATE_ON, true); if (ret) { dev_err(aw88166->aw_pa->dev, "fw update failed"); continue; @@ -1295,19 +889,19 @@ static void aw88166_start(struct aw88166 *aw88166, b= ool sync_start) { int ret; =20 - if (aw88166->aw_pa->fw_status !=3D AW88166_DEV_FW_OK) + if (aw88166->aw_pa->fw_status !=3D AW_DEV_FW_OK) return; =20 - if (aw88166->aw_pa->status =3D=3D AW88166_DEV_PW_ON) + if (aw88166->aw_pa->status =3D=3D AW_DEV_PW_ON) return; =20 - ret =3D aw88166_dev_fw_update(aw88166, AW88166_DSP_FW_UPDATE_OFF, aw88166= ->phase_sync); + ret =3D aw88166_dev_fw_update(aw88166, AW_DSP_FW_UPDATE_OFF, aw88166->pha= se_sync); if (ret) { dev_err(aw88166->aw_pa->dev, "fw update failed\n"); return; } =20 - if (sync_start =3D=3D AW88166_SYNC_START) + if (sync_start =3D=3D AW_SYNC_START) aw88166_start_pa(aw88166); else queue_delayed_work(system_wq, @@ -1331,38 +925,44 @@ static int aw_dev_check_sysint(struct aw_device *aw_= dev) static int aw88166_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 AW88166_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 AW88166_DEV_PW_OFF; + aw_dev->status =3D AW_DEV_PW_OFF; =20 aw88166_dev_mute(aw_dev, true); - usleep_range(AW88166_4000_US, AW88166_4000_US + 100); + usleep_range(AW_4000_US, AW_4000_US + 100); =20 - aw_dev_i2s_tx_enable(aw_dev, false); - usleep_range(AW88166_1000_US, AW88166_1000_US + 100); + regmap_update_bits(aw_dev->regmap, AW88166_I2SCTRL3_REG, + ~AW88166_I2STXEN_MASK, AW88166_I2STXEN_DISABLE_VALUE); + usleep_range(AW_1000_US, AW_1000_US + 100); =20 int_st =3D aw_dev_check_sysint(aw_dev); =20 - aw_dev_dsp_enable(aw_dev, false); + regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, + ~AW88166_DSPBY_MASK, AW88166_DSPBY_BYPASS_VALUE); =20 - aw_dev_amppd(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, + ~AW88166_AMPPD_MASK, AW88166_AMPPD_POWER_DOWN_VALUE); =20 if (int_st) { - aw_dev_select_memclk(aw_dev, AW88166_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, AW88166_DEV_MEMCLK_PLL); + regmap_update_bits(aw_dev->regmap, AW88166_DBGCTRL_REG, ~AW88166_MEM_CLK= SEL_MASK, + AW88166_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, AW88166_DBGCTRL_REG, ~AW88166_MEM_CLK= SEL_MASK, + AW88166_MEM_CLKSEL_DAPHCLK_VALUE); } =20 - aw_dev_pwd(aw_dev, true); + regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG, + ~AW88166_PWDN_MASK, AW88166_PWDN_POWER_DOWN_VALUE); =20 return 0; } @@ -1457,22 +1057,6 @@ static int aw88166_set_fade_out_time(struct snd_kcon= trol *kcontrol, return 0; } =20 -static int aw88166_dev_set_profile_index(struct aw_device *aw_dev, int ind= ex) -{ - /* check the index whether is valid */ - if ((index >=3D aw_dev->prof_info.count) || (index < 0)) - return -EINVAL; - /* check the index whether change */ - if (aw_dev->prof_index =3D=3D index) - return -EINVAL; - - aw_dev->prof_index =3D index; - dev_dbg(aw_dev->dev, "set prof[%s]", - aw_dev->prof_info.prof_name_list[aw_dev->prof_info.prof_desc[index].id]); - - return 0; -} - static int aw88166_profile_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) { @@ -1497,7 +1081,7 @@ static int aw88166_profile_info(struct snd_kcontrol *= kcontrol, =20 count =3D uinfo->value.enumerated.item; =20 - ret =3D aw88166_dev_get_prof_name(aw88166->aw_pa, count, &prof_name); + ret =3D aw_dev_get_prof_name(aw88166->aw_pa, count, &prof_name); if (ret) { strscpy(uinfo->value.enumerated.name, "null"); return 0; @@ -1527,7 +1111,7 @@ static int aw88166_profile_set(struct snd_kcontrol *k= control, int ret; =20 mutex_lock(&aw88166->lock); - ret =3D aw88166_dev_set_profile_index(aw88166->aw_pa, ucontrol->value.int= eger.value[0]); + ret =3D aw_dev_set_profile_index(aw88166->aw_pa, ucontrol->value.integer.= value[0]); if (ret) { dev_dbg(codec->dev, "profile index does not change"); mutex_unlock(&aw88166->lock); @@ -1536,7 +1120,7 @@ static int aw88166_profile_set(struct snd_kcontrol *k= control, =20 if (aw88166->aw_pa->status) { aw88166_stop(aw88166->aw_pa); - aw88166_start(aw88166, AW88166_SYNC_START); + aw88166_start(aw88166, AW_SYNC_START); } =20 mutex_unlock(&aw88166->lock); @@ -1572,7 +1156,7 @@ static int aw88166_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(aw88166->aw_pa, vol_desc->ctl_volume); + aw88166_set_volume(aw88166->aw_pa, vol_desc->ctl_volume); =20 return 1; } @@ -1646,86 +1230,6 @@ static int aw88166_re_set(struct snd_kcontrol *kcont= rol, return 0; } =20 -static int aw88166_dev_init(struct aw88166 *aw88166, struct aw_container *= aw_cfg) -{ - struct aw_device *aw_dev =3D aw88166->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\n"); - return -EINVAL; - } - aw_dev->fade_in_time =3D AW88166_1000_US / 10; - aw_dev->fade_out_time =3D AW88166_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 aw88166_dev_fw_update(aw88166, AW88166_FORCE_UPDATE_ON, AW88166_D= SP_FW_UPDATE_ON); - if (ret) { - dev_err(aw_dev->dev, "fw update failed ret =3D %d\n", ret); - return ret; - } - - aw88166_dev_mute(aw_dev, true); - - /* close tx feedback */ - aw_dev_i2s_tx_enable(aw_dev, false); - usleep_range(AW88166_1000_US, AW88166_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 aw88166_request_firmware_file(struct aw88166 *aw88166) -{ - const struct firmware *cont =3D NULL; - int ret; - - aw88166->aw_pa->fw_status =3D AW88166_DEV_FW_FAILED; - - ret =3D request_firmware(&cont, AW88166_ACF_FILE, aw88166->aw_pa->dev); - if (ret) { - dev_err(aw88166->aw_pa->dev, "request [%s] failed!\n", AW88166_ACF_FILE); - return ret; - } - - dev_dbg(aw88166->aw_pa->dev, "loaded %s - size: %zu\n", - AW88166_ACF_FILE, cont ? cont->size : 0); - - aw88166->aw_cfg =3D devm_kzalloc(aw88166->aw_pa->dev, - struct_size(aw88166->aw_cfg, data, cont->size), GFP_KERNEL); - if (!aw88166->aw_cfg) { - release_firmware(cont); - return -ENOMEM; - } - aw88166->aw_cfg->len =3D (int)cont->size; - memcpy(aw88166->aw_cfg->data, cont->data, cont->size); - release_firmware(cont); - - ret =3D aw88395_dev_load_acf_check(aw88166->aw_pa, aw88166->aw_cfg); - if (ret) { - dev_err(aw88166->aw_pa->dev, "load [%s] failed!\n", AW88166_ACF_FILE); - return ret; - } - - mutex_lock(&aw88166->lock); - /* aw device init */ - ret =3D aw88166_dev_init(aw88166, aw88166->aw_cfg); - if (ret) - dev_err(aw88166->aw_pa->dev, "dev init failed\n"); - mutex_unlock(&aw88166->lock); - - return ret; -} - static const struct snd_kcontrol_new aw88166_controls[] =3D { SOC_SINGLE_EXT("PCM Playback Volume", AW88166_SYSCTRL2_REG, 6, AW88166_MUTE_VOL, 0, aw88166_volume_get, @@ -1738,7 +1242,7 @@ static const struct snd_kcontrol_new aw88166_controls= [] =3D { aw88166_get_fade_out_time, aw88166_set_fade_out_time), SOC_SINGLE_EXT("Calib", 0, 0, AW88166_CALI_RE_MAX, 0, aw88166_re_get, aw88166_re_set), - AW88166_PROFILE_EXT("AW88166 Profile Set", aw88166_profile_info, + AW_PROFILE_EXT("AW88166 Profile Set", aw88166_profile_info, aw88166_profile_get, aw88166_profile_set), }; =20 @@ -1751,7 +1255,7 @@ static int aw88166_playback_event(struct snd_soc_dapm= _widget *w, mutex_lock(&aw88166->lock); switch (event) { case SND_SOC_DAPM_PRE_PMU: - aw88166_start(aw88166, AW88166_ASYNC_START); + aw88166_start(aw88166, AW_ASYNC_START); break; case SND_SOC_DAPM_POST_PMD: aw88166_stop(aw88166->aw_pa); @@ -1788,9 +1292,15 @@ static int aw88166_codec_probe(struct snd_soc_compon= ent *component) =20 INIT_DELAYED_WORK(&aw88166->start_work, aw88166_startup_work); =20 - ret =3D aw88166_request_firmware_file(aw88166); - if (ret) + ret =3D aw_dev_request_firmware_file(aw88166->aw_pa, AW88166_ACF_FILE); + if (ret) { dev_err(aw88166->aw_pa->dev, "%s failed\n", __func__); + return ret; + } + + ret =3D aw88166_dev_fw_update(aw88166, AW_FORCE_UPDATE_ON, AW_DSP_FW_UPDA= TE_ON); + if (ret) + dev_err(aw88166->aw_pa->dev, "fw update failed ret =3D %d\n", ret); =20 return ret; } @@ -1813,65 +1323,6 @@ static const struct snd_soc_component_driver soc_cod= ec_dev_aw88166 =3D { .num_controls =3D ARRAY_SIZE(aw88166_controls), }; =20 -static void aw88166_hw_reset(struct aw88166 *aw88166) -{ - if (aw88166->reset_gpio) { - gpiod_set_value_cansleep(aw88166->reset_gpio, 1); - usleep_range(AW88166_1000_US, AW88166_1000_US + 10); - gpiod_set_value_cansleep(aw88166->reset_gpio, 0); - usleep_range(AW88166_1000_US, AW88166_1000_US + 10); - } -} - -static void aw88166_parse_channel_dt(struct aw88166 *aw88166) -{ - struct aw_device *aw_dev =3D aw88166->aw_pa; - 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; - aw88166->phase_sync =3D of_property_read_bool(np, "awinic,sync-flag"); -} - -static int aw88166_init(struct aw88166 *aw88166, struct i2c_client *i2c, s= truct regmap *regmap) -{ - struct aw_device *aw_dev; - unsigned int chip_id; - int ret; - - ret =3D regmap_read(regmap, AW88166_ID_REG, &chip_id); - if (ret) { - dev_err(&i2c->dev, "%s read chipid error. ret =3D %d\n", __func__, ret); - return ret; - } - - aw_dev =3D devm_kzalloc(&i2c->dev, sizeof(*aw_dev), GFP_KERNEL); - if (!aw_dev) - return -ENOMEM; - aw88166->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 AW88166_DEV_DEFAULT_CH; - aw_dev->fw_status =3D AW88166_DEV_FW_FAILED; - - aw_dev->fade_step =3D AW88166_VOLUME_STEP_DB; - aw_dev->volume_desc.ctl_volume =3D AW88166_VOL_DEFAULT_VALUE; - - aw88166_parse_channel_dt(aw88166); - - return 0; -} - static int aw88166_i2c_probe(struct i2c_client *i2c) { struct aw88166 *aw88166; @@ -1888,11 +1339,15 @@ static int aw88166_i2c_probe(struct i2c_client *i2c) =20 i2c_set_clientdata(i2c, aw88166); =20 - aw88166->reset_gpio =3D devm_gpiod_get_optional(&i2c->dev, "reset", GPIOD= _OUT_LOW); - if (IS_ERR(aw88166->reset_gpio)) + aw88166->aw_pa =3D devm_kzalloc(&i2c->dev, sizeof(struct aw_device), GFP_= KERNEL); + if (!aw88166->aw_pa) + return -ENOMEM; + + aw88166->aw_pa->reset_gpio =3D devm_gpiod_get_optional(&i2c->dev, "reset"= , GPIOD_OUT_LOW); + if (IS_ERR(aw88166->aw_pa->reset_gpio)) return dev_err_probe(&i2c->dev, PTR_ERR(aw88166->reset_gpio), "reset gpio not defined\n"); - aw88166_hw_reset(aw88166); + aw_hw_reset(aw88166->aw_pa); =20 aw88166->regmap =3D devm_regmap_init_i2c(i2c, &aw88166_remap_config); if (IS_ERR(aw88166->regmap)) @@ -1900,7 +1355,7 @@ static int aw88166_i2c_probe(struct i2c_client *i2c) "failed to init regmap\n"); =20 /* aw pa init */ - ret =3D aw88166_init(aw88166, i2c, aw88166->regmap); + ret =3D aw_dev_init(aw88166->aw_pa, i2c, aw88166->regmap); if (ret) return ret; =20 diff --git a/sound/soc/codecs/aw88166.h b/sound/soc/codecs/aw88166.h index 3a53ba0ac625..3b90fdaf76b7 100644 --- a/sound/soc/codecs/aw88166.h +++ b/sound/soc/codecs/aw88166.h @@ -453,8 +453,6 @@ #define AW88166_DEV_SYSST_CHECK_MAX (10) #define AW88166_START_RETRIES (5) #define AW88166_START_WORK_DELAY_MS (0) -#define FADE_TIME_MAX 100000 -#define FADE_TIME_MIN 0 #define AW88166_CHIP_ID (0x2066) #define AW88166_I2C_NAME "aw88166" #define AW88166_ACF_FILE "aw88166_acf.bin" @@ -465,67 +463,11 @@ SNDRV_PCM_FMTBIT_S24_LE | \ SNDRV_PCM_FMTBIT_S32_LE) =20 -#define AW88166_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 { AW_EF_AND_CHECK =3D 0, AW_EF_OR_CHECK, }; =20 -enum { - AW88166_DSP_FW_UPDATE_OFF =3D 0, - AW88166_DSP_FW_UPDATE_ON =3D 1, -}; - -enum { - AW88166_FORCE_UPDATE_OFF =3D 0, - AW88166_FORCE_UPDATE_ON =3D 1, -}; - -enum { - AW88166_1000_US =3D 1000, - AW88166_2000_US =3D 2000, - AW88166_3000_US =3D 3000, - AW88166_4000_US =3D 4000, -}; - -enum AW88166_DEV_STATUS { - AW88166_DEV_PW_OFF =3D 0, - AW88166_DEV_PW_ON, -}; - -enum AW88166_DEV_FW_STATUS { - AW88166_DEV_FW_FAILED =3D 0, - AW88166_DEV_FW_OK, -}; - -enum AW88166_DEV_MEMCLK { - AW88166_DEV_MEMCLK_OSC =3D 0, - AW88166_DEV_MEMCLK_PLL =3D 1, -}; - -enum AW88166_DEV_DSP_CFG { - AW88166_DEV_DSP_WORK =3D 0, - AW88166_DEV_DSP_BYPASS =3D 1, -}; - -enum { - AW88166_DSP_16_DATA =3D 0, - AW88166_DSP_32_DATA =3D 1, -}; - -enum { - AW88166_SYNC_START =3D 0, - AW88166_ASYNC_START, -}; - enum { AW88166_RECORD_SEC_DATA =3D 0, AW88166_RECOVERY_SEC_DATA =3D 1, --=20 2.47.0