// SPDX-License-Identifier: GPL-2.0-only
//
// aw88166.c --  ALSA SoC AW88166 codec support
//
// Copyright (c) 2025 AWINIC Technology CO., LTD
//
// Author: Weidong Wang <wangweidong.a@awinic.com>
//

#include <linux/crc32.h>
#include <linux/firmware.h>
#include <linux/gpio/consumer.h>
#include <linux/i2c.h>
#include <linux/minmax.h>
#include <linux/regmap.h>
#include <sound/soc.h>
#include "aw88166.h"
#include "aw88395/aw88395_device.h"

struct aw88166 {
	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;

	unsigned int check_val;
	unsigned int crc_init_val;
	unsigned int vcalb_init_val;
	unsigned int re_init_val;
	unsigned int dither_st;
	bool phase_sync;
};

static const struct regmap_config aw88166_remap_config = {
	.val_bits = 16,
	.reg_bits = 8,
	.max_register = AW88166_REG_MAX,
	.reg_format_endian = REGMAP_ENDIAN_LITTLE,
	.val_format_endian = REGMAP_ENDIAN_BIG,
};

static void aw_dev_pwd(struct aw_device *aw_dev, bool pwd)
{
	int ret;

	if (pwd)
		ret = regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG,
				~AW88166_PWDN_MASK, AW88166_PWDN_POWER_DOWN_VALUE);
	else
		ret = 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 = regmap_read(aw_dev->regmap, AW88166_SYSINT_REG, &reg_val);
	if (ret)
		dev_err(aw_dev->dev, "read interrupt reg fail, ret=%d", ret);
	else
		*int_status = reg_val;

	dev_dbg(aw_dev->dev, "read interrupt reg=0x%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;
	int ret;

	ret = regmap_read(aw_dev->regmap, AW88166_SYSST_REG, &reg_val);
	if (ret)
		return ret;
	if ((reg_val & AW88166_BIT_PLL_CHECK) != AW88166_BIT_PLL_CHECK) {
		dev_err(aw_dev->dev, "check pll lock fail, reg_val:0x%04x", reg_val);
		return -EINVAL;
	}

	return 0;
}

static int aw_dev_check_mode1_pll(struct aw_device *aw_dev)
{
	int ret, i;

	for (i = 0; i < AW88166_DEV_SYSST_CHECK_MAX; i++) {
		ret = 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);
		} else {
			return 0;
		}
	}

	return -EPERM;
}

static int aw_dev_check_mode2_pll(struct aw_device *aw_dev)
{
	unsigned int reg_val;
	int ret, i;

	ret = regmap_read(aw_dev->regmap, AW88166_PLLCTRL2_REG, &reg_val);
	if (ret)
		return ret;

	reg_val &= (~AW88166_CCO_MUX_MASK);
	if (reg_val == AW88166_CCO_MUX_DIVIDED_VALUE) {
		dev_dbg(aw_dev->dev, "CCO_MUX is already divider");
		return -EPERM;
	}

	/* change mode2 */
	ret = regmap_update_bits(aw_dev->regmap, AW88166_PLLCTRL2_REG,
			~AW88166_CCO_MUX_MASK, AW88166_CCO_MUX_DIVIDED_VALUE);
	if (ret)
		return ret;

	for (i = 0; i < AW88166_DEV_SYSST_CHECK_MAX; i++) {
		ret = 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);
		} else {
			break;
		}
	}

	/* change mode1 */
	regmap_update_bits(aw_dev->regmap, AW88166_PLLCTRL2_REG,
			~AW88166_CCO_MUX_MASK, AW88166_CCO_MUX_BYPASS_VALUE);
	if (ret == 0) {
		usleep_range(AW88166_2000_US, AW88166_2000_US + 10);
		for (i = 0; i < AW88166_DEV_SYSST_CHECK_MAX; i++) {
			ret = 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);
			} else {
				break;
			}
		}
	}

	return ret;
}

static int aw_dev_check_syspll(struct aw_device *aw_dev)
{
	int ret;

	ret = aw_dev_check_mode1_pll(aw_dev);
	if (ret) {
		dev_dbg(aw_dev->dev, "mode1 check iis failed try switch to mode2 check");
		ret = aw_dev_check_mode2_pll(aw_dev);
		if (ret) {
			dev_err(aw_dev->dev, "mode2 check iis failed");
			return ret;
		}
	}

	return 0;
}

static int aw_dev_check_sysst(struct aw_device *aw_dev)
{
	unsigned int check_val;
	unsigned int reg_val;
	int ret, i;

	ret = regmap_read(aw_dev->regmap, AW88166_PWMCTRL3_REG, &reg_val);
	if (ret)
		return ret;

	if (reg_val & (~AW88166_NOISE_GATE_EN_MASK))
		check_val = AW88166_BIT_SYSST_NOSWS_CHECK;
	else
		check_val = AW88166_BIT_SYSST_SWS_CHECK;

	for (i = 0; i < AW88166_DEV_SYSST_CHECK_MAX; i++) {
		ret = regmap_read(aw_dev->regmap, AW88166_SYSST_REG, &reg_val);
		if (ret)
			return ret;

		if ((reg_val & (~AW88166_BIT_SYSST_CHECK_MASK) & check_val) != check_val) {
			dev_err(aw_dev->dev, "check sysst fail, cnt=%d, reg_val=0x%04x, check:0x%x",
				i, reg_val, AW88166_BIT_SYSST_NOSWS_CHECK);
			usleep_range(AW88166_2000_US, AW88166_2000_US + 10);
		} else {
			return 0;
		}
	}

	return -EPERM;
}

static void aw_dev_amppd(struct aw_device *aw_dev, bool amppd)
{
	int ret;

	if (amppd)
		ret = regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG,
				~AW88166_AMPPD_MASK, AW88166_AMPPD_POWER_DOWN_VALUE);
	else
		ret = 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 = regmap_update_bits(aw_dev->regmap, AW88166_SYSCTRL_REG,
					~AW88166_DSPBY_MASK, AW88166_DSPBY_WORKING_VALUE);
	else
		ret = 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 = aw88166->aw_pa;
	unsigned int efrm_reg_val, efrl_reg_val;
	uint16_t ef_isn_geslp, ef_isn_h5bits;
	uint16_t icalk_val;
	int ret;

	ret = regmap_read(aw_dev->regmap, AW88166_EFRM2_REG, &efrm_reg_val);
	if (ret)
		return ret;

	ef_isn_geslp = (efrm_reg_val & (~AW88166_EF_ISN_GESLP_MASK)) >>
						AW88166_EF_ISN_GESLP_SHIFT;

	ret = regmap_read(aw_dev->regmap, AW88166_EFRL_REG, &efrl_reg_val);
	if (ret)
		return ret;

	ef_isn_h5bits = (efrl_reg_val & (~AW88166_EF_ISN_H5BITS_MASK)) >>
						AW88166_EF_ISN_H5BITS_SHIFT;

	if (aw88166->check_val == AW_EF_AND_CHECK)
		icalk_val = ef_isn_geslp & (ef_isn_h5bits | AW88166_EF_ISN_H5BITS_SIGN_MASK);
	else
		icalk_val = ef_isn_geslp | (ef_isn_h5bits & (~AW88166_EF_ISN_H5BITS_SIGN_MASK));

	if (icalk_val & (~AW88166_ICALK_SIGN_MASK))
		icalk_val = icalk_val | AW88166_ICALK_NEG_MASK;
	*icalk = (int16_t)icalk_val;

	return 0;
}

static int aw88166_dev_get_vcalk(struct aw88166 *aw88166, int16_t *vcalk)
{
	struct aw_device *aw_dev = aw88166->aw_pa;
	unsigned int efrm_reg_val, efrl_reg_val;
	uint16_t ef_vsn_geslp, ef_vsn_h3bits;
	uint16_t vcalk_val;
	int ret;

	ret = regmap_read(aw_dev->regmap, AW88166_EFRM2_REG, &efrm_reg_val);
	if (ret)
		return ret;

	ef_vsn_geslp = (efrm_reg_val & (~AW88166_EF_VSN_GESLP_MASK)) >>
					AW88166_EF_VSN_GESLP_SHIFT;

	ret = regmap_read(aw_dev->regmap, AW88166_EFRL_REG, &efrl_reg_val);
	if (ret)
		return ret;

	ef_vsn_h3bits = (efrl_reg_val & (~AW88166_EF_VSN_H3BITS_MASK)) >>
					AW88166_EF_VSN_H3BITS_SHIFT;

	if (aw88166->check_val == AW_EF_AND_CHECK)
		vcalk_val = ef_vsn_geslp & (ef_vsn_h3bits | AW88166_EF_VSN_H3BITS_SIGN_MASK);
	else
		vcalk_val = ef_vsn_geslp | (ef_vsn_h3bits & (~AW88166_EF_VSN_H3BITS_SIGN_MASK));

	if (vcalk_val & (~AW88166_VCALK_SIGN_MASK))
		vcalk_val = vcalk_val | AW88166_VCALK_NEG_MASK;
	*vcalk = (int16_t)vcalk_val;

	return 0;
}

static int aw88166_dev_set_vcalb(struct aw88166 *aw88166)
{
	struct aw_device *aw_dev = aw88166->aw_pa;
	int32_t ical_k, vcal_k, vcalb;
	int16_t icalk, vcalk;
	unsigned int reg_val;
	int ret;

	ret = aw88166_dev_get_icalk(aw88166, &icalk);
	if (ret) {
		dev_err(aw_dev->dev, "get icalk failed\n");
		return ret;
	}
	ical_k = icalk * AW88166_ICABLK_FACTOR + AW88166_CABL_BASE_VALUE;

	ret = aw88166_dev_get_vcalk(aw88166, &vcalk);
	if (ret) {
		dev_err(aw_dev->dev, "get vbcalk failed\n");
		return ret;
	}
	vcal_k = vcalk * AW88166_VCABLK_FACTOR + AW88166_CABL_BASE_VALUE;

	vcalb = AW88166_VCALB_ACCURACY * AW88166_VSCAL_FACTOR /
			AW88166_ISCAL_FACTOR * ical_k / vcal_k * aw88166->vcalb_init_val;

	vcalb = vcalb >> AW88166_VCALB_ADJ_FACTOR;
	reg_val = (uint32_t)vcalb;

	regmap_write(aw_dev->regmap, AW88166_DSPVCALB_REG, reg_val);

	return 0;
}

static int aw_dev_init_vcalb_update(struct aw88166 *aw88166, int flag)
{
	struct aw_device *aw_dev = aw88166->aw_pa;
	int ret;

	switch (flag) {
	case AW88166_RECOVERY_SEC_DATA:
		ret = regmap_write(aw_dev->regmap, AW88166_DSPVCALB_REG, aw88166->vcalb_init_val);
		break;
	case AW88166_RECORD_SEC_DATA:
		ret = regmap_read(aw_dev->regmap, AW88166_DSPVCALB_REG, &aw88166->vcalb_init_val);
		break;
	default:
		dev_err(aw_dev->dev, "unsupported type:%d\n", flag);
		ret = -EINVAL;
		break;
	}

	return ret;
}

static int aw_dev_init_re_update(struct aw88166 *aw88166, int flag)
{
	struct aw_device *aw_dev = aw88166->aw_pa;
	unsigned int re_temp_h, re_temp_l;
	int ret;

	switch (flag) {
	case AW88166_RECOVERY_SEC_DATA:
		ret = regmap_write(aw_dev->regmap, AW88166_ACR1_REG, aw88166->re_init_val >> 16);
		if (ret)
			return ret;
		ret = regmap_write(aw_dev->regmap, AW88166_ACR2_REG,
						(uint16_t)aw88166->re_init_val);
		if (ret)
			return ret;
		break;
	case AW88166_RECORD_SEC_DATA:
		ret = regmap_read(aw_dev->regmap, AW88166_ACR1_REG, &re_temp_h);
		if (ret)
			return ret;
		ret = regmap_read(aw_dev->regmap, AW88166_ACR2_REG, &re_temp_l);
		if (ret)
			return ret;
		aw88166->re_init_val = (re_temp_h << 16) + re_temp_l;
		break;
	default:
		dev_err(aw_dev->dev, "unsupported type:%d\n", flag);
		ret = -EINVAL;
		break;
	}

	return ret;
}

static void aw_dev_backup_sec_record(struct aw88166 *aw88166)
{
	aw_dev_init_vcalb_update(aw88166, AW88166_RECORD_SEC_DATA);
	aw_dev_init_re_update(aw88166, AW88166_RECOVERY_SEC_DATA);
}

static void aw_dev_backup_sec_recovery(struct aw88166 *aw88166)
{
	aw_dev_init_vcalb_update(aw88166, AW88166_RECOVERY_SEC_DATA);
	aw_dev_init_re_update(aw88166, AW88166_RECOVERY_SEC_DATA);
}

static int aw_dev_update_cali_re(struct aw_cali_desc *cali_desc)
{
	struct aw_device *aw_dev =
		container_of(cali_desc, struct aw_device, cali_desc);
	uint16_t re_lbits, re_hbits;
	u32 cali_re;
	int ret;

	if ((aw_dev->cali_desc.cali_re >= AW88166_CALI_RE_MAX) ||
			(aw_dev->cali_desc.cali_re <= AW88166_CALI_RE_MIN))
		return -EINVAL;

	cali_re = AW88166_SHOW_RE_TO_DSP_RE((aw_dev->cali_desc.cali_re +
				aw_dev->cali_desc.ra), AW88166_DSP_RE_SHIFT);

	re_hbits = (cali_re & (~AW88166_CALI_RE_HBITS_MASK)) >> AW88166_CALI_RE_HBITS_SHIFT;
	re_lbits = (cali_re & (~AW88166_CALI_RE_LBITS_MASK)) >> AW88166_CALI_RE_LBITS_SHIFT;

	ret = regmap_write(aw_dev->regmap, AW88166_ACR1_REG, re_hbits);
	if (ret) {
		dev_err(aw_dev->dev, "set cali re error");
		return ret;
	}

	ret = regmap_write(aw_dev->regmap, AW88166_ACR2_REG, re_lbits);
	if (ret)
		dev_err(aw_dev->dev, "set cali re error");

	return ret;
}

static int aw_dev_fw_crc_check(struct aw_device *aw_dev)
{
	uint16_t check_val, fw_len_val;
	unsigned int reg_val;
	int ret;

	/* calculate fw_end_addr */
	fw_len_val = ((aw_dev->dsp_fw_len / AW_FW_ADDR_LEN) - 1) + AW88166_CRC_FW_BASE_ADDR;

	/* write fw_end_addr to crc_end_addr */
	ret = regmap_update_bits(aw_dev->regmap, AW88166_CRCCTRL_REG,
					~AW88166_CRC_END_ADDR_MASK, fw_len_val);
	if (ret)
		return ret;
	/* enable fw crc check */
	ret = regmap_update_bits(aw_dev->regmap, AW88166_CRCCTRL_REG,
		~AW88166_CRC_CODE_EN_MASK, AW88166_CRC_CODE_EN_ENABLE_VALUE);

	usleep_range(AW88166_2000_US, AW88166_2000_US + 10);

	/* read crc check result */
	regmap_read(aw_dev->regmap, AW88166_HAGCST_REG, &reg_val);
	if (ret)
		return ret;

	check_val = (reg_val & (~AW88166_CRC_CHECK_BITS_MASK)) >> AW88166_CRC_CHECK_START_BIT;

	/* disable fw crc check */
	ret = regmap_update_bits(aw_dev->regmap, AW88166_CRCCTRL_REG,
		~AW88166_CRC_CODE_EN_MASK, AW88166_CRC_CODE_EN_DISABLE_VALUE);
	if (ret)
		return ret;

	if (check_val != AW88166_CRC_CHECK_PASS_VAL) {
		dev_err(aw_dev->dev, "%s failed, check_val 0x%x != 0x%x\n",
				__func__, check_val, AW88166_CRC_CHECK_PASS_VAL);
		ret = -EINVAL;
	}

	return ret;
}

static int aw_dev_cfg_crc_check(struct aw_device *aw_dev)
{
	uint16_t check_val, cfg_len_val;
	unsigned int reg_val;
	int ret;

	/* calculate cfg end addr */
	cfg_len_val = ((aw_dev->dsp_cfg_len / AW_FW_ADDR_LEN) - 1) + AW88166_CRC_CFG_BASE_ADDR;

	/* write cfg_end_addr to crc_end_addr */
	ret = regmap_update_bits(aw_dev->regmap, AW88166_CRCCTRL_REG,
				~AW88166_CRC_END_ADDR_MASK, cfg_len_val);
	if (ret)
		return ret;

	/* enable cfg crc check */
	ret = regmap_update_bits(aw_dev->regmap, AW88166_CRCCTRL_REG,
			~AW88166_CRC_CFG_EN_MASK, AW88166_CRC_CFG_EN_ENABLE_VALUE);
	if (ret)
		return ret;

	usleep_range(AW88166_1000_US, AW88166_1000_US + 10);

	/* read crc check result */
	ret = regmap_read(aw_dev->regmap, AW88166_HAGCST_REG, &reg_val);
	if (ret)
		return ret;

	check_val = (reg_val & (~AW88166_CRC_CHECK_BITS_MASK)) >> AW88166_CRC_CHECK_START_BIT;

	/* disable cfg crc check */
	ret = regmap_update_bits(aw_dev->regmap, AW88166_CRCCTRL_REG,
			~AW88166_CRC_CFG_EN_MASK, AW88166_CRC_CFG_EN_DISABLE_VALUE);
	if (ret)
		return ret;

	if (check_val != AW88166_CRC_CHECK_PASS_VAL) {
		dev_err(aw_dev->dev, "crc_check failed, check val 0x%x != 0x%x\n",
						check_val, AW88166_CRC_CHECK_PASS_VAL);
		ret = -EINVAL;
	}

	return ret;
}

static int aw_dev_hw_crc_check(struct aw88166 *aw88166)
{
	struct aw_device *aw_dev = aw88166->aw_pa;
	int ret;

	ret = regmap_update_bits(aw_dev->regmap, AW88166_I2SCFG1_REG,
		~AW88166_RAM_CG_BYP_MASK, AW88166_RAM_CG_BYP_BYPASS_VALUE);
	if (ret)
		return ret;

	ret = aw_dev_fw_crc_check(aw_dev);
	if (ret) {
		dev_err(aw_dev->dev, "fw_crc_check failed\n");
		goto crc_check_failed;
	}

	ret = aw_dev_cfg_crc_check(aw_dev);
	if (ret) {
		dev_err(aw_dev->dev, "cfg_crc_check failed\n");
		goto crc_check_failed;
	}

	ret = regmap_write(aw_dev->regmap, AW88166_CRCCTRL_REG, aw88166->crc_init_val);
	if (ret)
		return ret;

	ret = regmap_update_bits(aw_dev->regmap, AW88166_I2SCFG1_REG,
		~AW88166_RAM_CG_BYP_MASK, AW88166_RAM_CG_BYP_WORK_VALUE);

	return ret;

crc_check_failed:
	regmap_update_bits(aw_dev->regmap, AW88166_I2SCFG1_REG,
		~AW88166_RAM_CG_BYP_MASK, AW88166_RAM_CG_BYP_WORK_VALUE);
	return ret;
}

static void aw_dev_i2s_tx_enable(struct aw_device *aw_dev, bool flag)
{
	int ret;

	if (flag)
		ret = regmap_update_bits(aw_dev->regmap, AW88166_I2SCTRL3_REG,
			~AW88166_I2STXEN_MASK, AW88166_I2STXEN_ENABLE_VALUE);
	else
		ret = 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 = regmap_read(aw_dev->regmap, AW88166_WDT_REG, &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;

	switch (aw_dev->dsp_cfg) {
	case AW88166_DEV_DSP_BYPASS:
		dev_dbg(aw_dev->dev, "dsp bypass");
		ret = 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 = 0; i < AW88166_DEV_DSP_CHECK_MAX; i++) {
			ret = aw_dev_get_dsp_status(aw_dev);
			if (ret) {
				dev_err(aw_dev->dev, "dsp wdt status error=%d", ret);
				usleep_range(AW88166_2000_US, AW88166_2000_US + 10);
			}
		}
		break;
	default:
		dev_err(aw_dev->dev, "unknown dsp cfg=%d", aw_dev->dsp_cfg);
		ret = -EINVAL;
		break;
	}

	return ret;
}

static int aw_dev_set_volume(struct aw_device *aw_dev, unsigned int value)
{
	struct aw_volume_desc *vol_desc = &aw_dev->volume_desc;
	unsigned int reg_value;
	u16 real_value;
	int ret;

	real_value = min((value + vol_desc->init_volume), (unsigned int)AW88166_MUTE_VOL);

	ret = regmap_read(aw_dev->regmap, AW88166_SYSCTRL2_REG, &reg_value);
	if (ret)
		return ret;

	dev_dbg(aw_dev->dev, "value 0x%x , reg:0x%x", value, real_value);

	real_value = (real_value << AW88166_VOL_START_BIT) | (reg_value & AW88166_VOL_MASK);

	ret = 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 = &aw_dev->volume_desc;
	u16 fade_in_vol = desc->ctl_volume;
	int fade_step = aw_dev->fade_step;
	int i;

	if (fade_step == 0 || aw_dev->fade_in_time == 0) {
		aw_dev_set_volume(aw_dev, fade_in_vol);
		return;
	}

	for (i = AW88166_MUTE_VOL; i >= fade_in_vol; i -= fade_step) {
		aw_dev_set_volume(aw_dev, i);
		usleep_range(aw_dev->fade_in_time, aw_dev->fade_in_time + 10);
	}

	if (i != 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 = &aw_dev->volume_desc;
	int fade_step = aw_dev->fade_step;
	int i;

	if (fade_step == 0 || aw_dev->fade_out_time == 0) {
		aw_dev_set_volume(aw_dev, AW88166_MUTE_VOL);
		return;
	}

	for (i = desc->ctl_volume; i <= AW88166_MUTE_VOL; i += fade_step) {
		aw_dev_set_volume(aw_dev, i);
		usleep_range(aw_dev->fade_out_time, aw_dev->fade_out_time + 10);
	}

	if (i != 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);
	}
}

static void aw88166_dev_mute(struct aw_device *aw_dev, bool is_mute)
{
	if (is_mute) {
		aw_dev_fade_out(aw_dev);
		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);
	}
}

static void aw88166_dev_set_dither(struct aw88166 *aw88166, bool dither)
{
	struct aw_device *aw_dev = 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 = aw88166->aw_pa;
	int ret;

	if (aw_dev->status == AW88166_DEV_PW_ON) {
		dev_dbg(aw_dev->dev, "already power on");
		return 0;
	}

	aw88166_dev_set_dither(aw88166, false);

	/* power on */
	aw_dev_pwd(aw_dev, false);
	usleep_range(AW88166_2000_US, AW88166_2000_US + 10);

	ret = aw_dev_check_syspll(aw_dev);
	if (ret) {
		dev_err(aw_dev->dev, "pll check failed cannot start\n");
		goto pll_check_fail;
	}

	/* amppd on */
	aw_dev_amppd(aw_dev, false);
	usleep_range(AW88166_1000_US, AW88166_1000_US + 50);

	/* check i2s status */
	ret = aw_dev_check_sysst(aw_dev);
	if (ret) {
		dev_err(aw_dev->dev, "sysst check failed\n");
		goto sysst_check_fail;
	}

	if (aw_dev->dsp_cfg == AW88166_DEV_DSP_WORK) {
		aw_dev_backup_sec_recovery(aw88166);
		ret = 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);
		aw88166_dev_set_vcalb(aw88166);
		aw_dev_update_cali_re(&aw_dev->cali_desc);
		ret = aw_dev_dsp_check(aw_dev);
		if (ret) {
			dev_err(aw_dev->dev, "dsp status check failed\n");
			goto dsp_check_fail;
		}
	} else {
		dev_dbg(aw_dev->dev, "start pa with dsp bypass");
	}

	/* enable tx feedback */
	aw_dev_i2s_tx_enable(aw_dev, true);

	if (aw88166->dither_st == AW88166_DITHER_EN_ENABLE_VALUE)
		aw88166_dev_set_dither(aw88166, true);

	/* close mute */
	aw88166_dev_mute(aw_dev, false);
	/* clear inturrupt */
	aw_dev_clear_int_status(aw_dev);
	aw_dev->status = AW88166_DEV_PW_ON;

	return 0;

dsp_check_fail:
crc_check_fail:
	aw_dev_dsp_enable(aw_dev, false);
sysst_check_fail:
	aw_dev_clear_int_status(aw_dev);
	aw_dev_amppd(aw_dev, true);
pll_check_fail:
	aw_dev_pwd(aw_dev, true);
	aw_dev->status = 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;

	ret = regmap_write(aw_dev->regmap, AW88166_DSPMADD_REG, base);
	if (ret)
		return ret;

	for (i = 0; i < len; i += AW88166_MAX_RAM_WRITE_BYTE_SIZE) {
		tmp_len = min(len - i, AW88166_MAX_RAM_WRITE_BYTE_SIZE);
		ret = regmap_raw_write(aw_dev->regmap, AW88166_DSPMDAT_REG,
					&data[i], tmp_len);
		if (ret)
			return ret;
	}

	return 0;
}

static int aw_dev_get_ra(struct aw_cali_desc *cali_desc)
{
	struct aw_device *aw_dev =
		container_of(cali_desc, struct aw_device, cali_desc);
	u32 dsp_ra;
	int ret;

	ret = aw_dev_dsp_read(aw_dev, AW88166_DSP_REG_CFG_ADPZ_RA,
				&dsp_ra, AW_DSP_32_DATA);
	if (ret) {
		dev_err(aw_dev->dev, "read ra error\n");
		return ret;
	}

	cali_desc->ra = AW88166_DSP_RE_TO_SHOW_RE(dsp_ra,
					AW88166_DSP_RE_SHIFT);

	return 0;
}

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 = aw_dev_dsp_update_container(aw_dev, data, len, AW88166_DSP_CFG_ADDR);
	if (ret)
		return ret;

	aw_dev->dsp_cfg_len = len;

	ret = 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 = len;
	ret = aw_dev_dsp_update_container(aw_dev, data, len, AW88166_DSP_FW_ADDR);

	return ret;
}

static int aw_dev_check_sram(struct aw_device *aw_dev)
{
	unsigned int reg_val;

	/* read dsp_rom_check_reg */
	aw_dev_dsp_read(aw_dev, AW88166_DSP_ROM_CHECK_ADDR, &reg_val, AW_DSP_16_DATA);
	if (reg_val != AW88166_DSP_ROM_CHECK_DATA) {
		dev_err(aw_dev->dev, "check dsp rom failed, read[0x%x] != check[0x%x]\n",
						reg_val, AW88166_DSP_ROM_CHECK_DATA);
		return -EPERM;
	}

	/* check dsp_cfg_base_addr */
	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, &reg_val, AW_DSP_16_DATA);
	if (reg_val != AW88166_DSP_ODD_NUM_BIT_TEST) {
		dev_err(aw_dev->dev, "check dsp cfg failed, read[0x%x] != write[0x%x]\n",
						reg_val, AW88166_DSP_ODD_NUM_BIT_TEST);
		return -EPERM;
	}

	return 0;
}

static void aw_dev_select_memclk(struct aw_device *aw_dev, unsigned char flag)
{
	int ret;

	switch (flag) {
	case AW88166_DEV_MEMCLK_PLL:
		ret = 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 = 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=0x%x\n", flag);
		break;
	}
}

static int aw_dev_update_reg_container(struct aw88166 *aw88166,
				unsigned char *data, unsigned int len)
{
	struct aw_device *aw_dev = aw88166->aw_pa;
	struct aw_volume_desc *vol_desc = &aw_dev->volume_desc;
	u16 read_vol, reg_val;
	int data_len, i, ret;
	int16_t *reg_data;
	u8 reg_addr;

	reg_data = (int16_t *)data;
	data_len = len >> 1;

	if (data_len & 0x1) {
		dev_err(aw_dev->dev, "data len:%d unsupported\n",	data_len);
		return -EINVAL;
	}

	for (i = 0; i < data_len; i += 2) {
		reg_addr = reg_data[i];
		reg_val = reg_data[i + 1];

		if (reg_addr == AW88166_DSPVCALB_REG) {
			aw88166->vcalb_init_val = reg_val;
			continue;
		}

		if (reg_addr == AW88166_SYSCTRL_REG) {
			if (reg_val & (~AW88166_DSPBY_MASK))
				aw_dev->dsp_cfg = AW88166_DEV_DSP_BYPASS;
			else
				aw_dev->dsp_cfg = AW88166_DEV_DSP_WORK;

			reg_val &= (AW88166_HMUTE_MASK | AW88166_PWDN_MASK |
						AW88166_DSPBY_MASK);
			reg_val |= (AW88166_HMUTE_ENABLE_VALUE | AW88166_PWDN_POWER_DOWN_VALUE |
						AW88166_DSPBY_BYPASS_VALUE);
		}

		if (reg_addr == AW88166_I2SCTRL3_REG) {
			reg_val &= AW88166_I2STXEN_MASK;
			reg_val |= AW88166_I2STXEN_DISABLE_VALUE;
		}

		if (reg_addr == AW88166_SYSCTRL2_REG) {
			read_vol = (reg_val & (~AW88166_VOL_MASK)) >>
				AW88166_VOL_START_BIT;
			aw_dev->volume_desc.init_volume = read_vol;
		}

		if (reg_addr == AW88166_DBGCTRL_REG) {
			if ((reg_val & (~AW88166_EF_DBMD_MASK)) == AW88166_EF_DBMD_OR_VALUE)
				aw88166->check_val = AW_EF_OR_CHECK;
			else
				aw88166->check_val = AW_EF_AND_CHECK;

			aw88166->dither_st = reg_val & (~AW88166_DITHER_EN_MASK);
		}

		if (reg_addr == AW88166_ACR1_REG) {
			aw88166->re_init_val |= (uint32_t)reg_val << 16;
			continue;
		}

		if (reg_addr == AW88166_ACR2_REG) {
			aw88166->re_init_val |= (uint32_t)reg_val;
			continue;
		}

		if (reg_addr == AW88166_CRCCTRL_REG)
			aw88166->crc_init_val = reg_val;

		ret = regmap_write(aw_dev->regmap, reg_addr, reg_val);
		if (ret)
			return ret;
	}

	aw_dev_pwd(aw_dev, false);
	usleep_range(AW88166_1000_US, AW88166_1000_US + 10);

	if (aw_dev->prof_cur != aw_dev->prof_index)
		vol_desc->ctl_volume = 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 = 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 = &aw_dev->prof_info;
	struct aw_prof_desc *prof_desc;

	if ((index >= 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 = &aw_dev->prof_info.prof_desc[index];

	*prof_name = 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 >= 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 = &aw_dev->prof_info.prof_desc[index];

	return 0;
}

static int aw88166_dev_fw_update(struct aw88166 *aw88166, bool up_dsp_fw_en, bool force_up_en)
{
	struct aw_device *aw_dev = aw88166->aw_pa;
	struct aw_prof_desc *prof_index_desc;
	struct aw_sec_data_desc *sec_desc;
	char *prof_name;
	int ret;

	if ((aw_dev->prof_cur == aw_dev->prof_index) &&
			(force_up_en == AW88166_FORCE_UPDATE_OFF)) {
		dev_dbg(aw_dev->dev, "scene no change, not update");
		return 0;
	}

	if (aw_dev->fw_status == AW88166_DEV_FW_FAILED) {
		dev_err(aw_dev->dev, "fw status[%d] error\n", aw_dev->fw_status);
		return -EPERM;
	}

	ret = aw88166_dev_get_prof_name(aw_dev, aw_dev->prof_index, &prof_name);
	if (ret)
		return ret;

	dev_dbg(aw_dev->dev, "start update %s", prof_name);

	ret = aw88166_dev_get_prof_data(aw_dev, aw_dev->prof_index, &prof_index_desc);
	if (ret)
		return ret;

	/* update reg */
	sec_desc = prof_index_desc->sec_desc;
	ret = aw_dev_reg_update(aw88166, sec_desc[AW88395_DATA_TYPE_REG].data,
					sec_desc[AW88395_DATA_TYPE_REG].len);
	if (ret) {
		dev_err(aw_dev->dev, "update reg failed\n");
		return ret;
	}

	aw88166_dev_mute(aw_dev, true);

	if (aw_dev->dsp_cfg == AW88166_DEV_DSP_WORK)
		aw_dev_dsp_enable(aw_dev, false);

	aw_dev_select_memclk(aw_dev, AW88166_DEV_MEMCLK_OSC);

	ret = aw_dev_check_sram(aw_dev);
	if (ret) {
		dev_err(aw_dev->dev, "check sram failed\n");
		goto error;
	}

	aw_dev_backup_sec_recovery(aw88166);

	if (up_dsp_fw_en) {
		dev_dbg(aw_dev->dev, "fw_ver: [%x]", prof_index_desc->fw_ver);
		ret = aw_dev_dsp_update_fw(aw_dev, sec_desc[AW88395_DATA_TYPE_DSP_FW].data,
					sec_desc[AW88395_DATA_TYPE_DSP_FW].len);
		if (ret) {
			dev_err(aw_dev->dev, "update dsp fw failed\n");
			goto error;
		}
	}

	/* update dsp config */
	ret = aw_dev_dsp_update_cfg(aw_dev, sec_desc[AW88395_DATA_TYPE_DSP_CFG].data,
					sec_desc[AW88395_DATA_TYPE_DSP_CFG].len);
	if (ret) {
		dev_err(aw_dev->dev, "update dsp cfg failed\n");
		goto error;
	}

	aw_dev_backup_sec_record(aw88166);

	aw_dev_select_memclk(aw_dev, AW88166_DEV_MEMCLK_PLL);

	aw_dev->prof_cur = aw_dev->prof_index;

	return 0;

error:
	aw_dev_select_memclk(aw_dev, AW88166_DEV_MEMCLK_PLL);
	return ret;
}

static void aw88166_start_pa(struct aw88166 *aw88166)
{
	int ret, i;

	for (i = 0; i < AW88166_START_RETRIES; i++) {
		ret = aw88166_dev_start(aw88166);
		if (ret) {
			dev_err(aw88166->aw_pa->dev, "aw88166 device start failed. retry = %d", i);
			ret = aw88166_dev_fw_update(aw88166, AW88166_DSP_FW_UPDATE_ON, true);
			if (ret) {
				dev_err(aw88166->aw_pa->dev, "fw update failed");
				continue;
			}
		} else {
			dev_dbg(aw88166->aw_pa->dev, "start success\n");
			break;
		}
	}
}

static void aw88166_startup_work(struct work_struct *work)
{
	struct aw88166 *aw88166 =
		container_of(work, struct aw88166, start_work.work);

	mutex_lock(&aw88166->lock);
	aw88166_start_pa(aw88166);
	mutex_unlock(&aw88166->lock);
}

static void aw88166_start(struct aw88166 *aw88166, bool sync_start)
{
	int ret;

	if (aw88166->aw_pa->fw_status != AW88166_DEV_FW_OK)
		return;

	if (aw88166->aw_pa->status == AW88166_DEV_PW_ON)
		return;

	ret = aw88166_dev_fw_update(aw88166, AW88166_DSP_FW_UPDATE_OFF, aw88166->phase_sync);
	if (ret) {
		dev_err(aw88166->aw_pa->dev, "fw update failed\n");
		return;
	}

	if (sync_start == AW88166_SYNC_START)
		aw88166_start_pa(aw88166);
	else
		queue_delayed_work(system_dfl_wq,
			&aw88166->start_work,
			AW88166_START_WORK_DELAY_MS);
}

static int aw_dev_check_sysint(struct aw_device *aw_dev)
{
	u16 reg_val;

	aw_dev_get_int_status(aw_dev, &reg_val);
	if (reg_val & AW88166_BIT_SYSINT_CHECK) {
		dev_err(aw_dev->dev, "pa stop check fail:0x%04x\n", reg_val);
		return -EINVAL;
	}

	return 0;
}

static int aw88166_stop(struct aw_device *aw_dev)
{
	struct aw_sec_data_desc *dsp_cfg =
		&aw_dev->prof_info.prof_desc[aw_dev->prof_cur].sec_desc[AW88395_DATA_TYPE_DSP_CFG];
	struct aw_sec_data_desc *dsp_fw =
		&aw_dev->prof_info.prof_desc[aw_dev->prof_cur].sec_desc[AW88395_DATA_TYPE_DSP_FW];
	int int_st;

	if (aw_dev->status == AW88166_DEV_PW_OFF) {
		dev_dbg(aw_dev->dev, "already power off");
		return 0;
	}

	aw_dev->status = AW88166_DEV_PW_OFF;

	aw88166_dev_mute(aw_dev, true);
	usleep_range(AW88166_4000_US, AW88166_4000_US + 100);

	aw_dev_i2s_tx_enable(aw_dev, false);
	usleep_range(AW88166_1000_US, AW88166_1000_US + 100);

	int_st = aw_dev_check_sysint(aw_dev);

	aw_dev_dsp_enable(aw_dev, false);

	aw_dev_amppd(aw_dev, true);

	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);
	}

	aw_dev_pwd(aw_dev, true);

	return 0;
}

static struct snd_soc_dai_driver aw88166_dai[] = {
	{
		.name = "aw88166-aif",
		.id = 1,
		.playback = {
			.stream_name = "Speaker_Playback",
			.channels_min = 1,
			.channels_max = 2,
			.rates = AW88166_RATES,
			.formats = AW88166_FORMATS,
		},
		.capture = {
			.stream_name = "Speaker_Capture",
			.channels_min = 1,
			.channels_max = 2,
			.rates = AW88166_RATES,
			.formats = AW88166_FORMATS,
		},
	},
};

static int aw88166_get_fade_in_time(struct snd_kcontrol *kcontrol,
	struct snd_ctl_elem_value *ucontrol)
{
	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
	struct aw88166 *aw88166 = snd_soc_component_get_drvdata(component);
	struct aw_device *aw_dev = aw88166->aw_pa;

	ucontrol->value.integer.value[0] = aw_dev->fade_in_time;

	return 0;
}

static int aw88166_set_fade_in_time(struct snd_kcontrol *kcontrol,
	struct snd_ctl_elem_value *ucontrol)
{
	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
	struct aw88166 *aw88166 = snd_soc_component_get_drvdata(component);
	struct soc_mixer_control *mc =
		(struct soc_mixer_control *)kcontrol->private_value;
	struct aw_device *aw_dev = aw88166->aw_pa;
	int time;

	time = ucontrol->value.integer.value[0];

	if (time < mc->min || time > mc->max)
		return -EINVAL;

	if (time != aw_dev->fade_in_time) {
		aw_dev->fade_in_time = time;
		return 1;
	}

	return 0;
}

static int aw88166_get_fade_out_time(struct snd_kcontrol *kcontrol,
	struct snd_ctl_elem_value *ucontrol)
{
	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
	struct aw88166 *aw88166 = snd_soc_component_get_drvdata(component);
	struct aw_device *aw_dev = aw88166->aw_pa;

	ucontrol->value.integer.value[0] = aw_dev->fade_out_time;

	return 0;
}

static int aw88166_set_fade_out_time(struct snd_kcontrol *kcontrol,
	struct snd_ctl_elem_value *ucontrol)
{
	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
	struct aw88166 *aw88166 = snd_soc_component_get_drvdata(component);
	struct soc_mixer_control *mc =
		(struct soc_mixer_control *)kcontrol->private_value;
	struct aw_device *aw_dev = aw88166->aw_pa;
	int time;

	time = ucontrol->value.integer.value[0];
	if (time < mc->min || time > mc->max)
		return -EINVAL;

	if (time != aw_dev->fade_out_time) {
		aw_dev->fade_out_time = time;
		return 1;
	}

	return 0;
}

static int aw88166_dev_set_profile_index(struct aw_device *aw_dev, int index)
{
	/* check the index whether is valid */
	if ((index >= aw_dev->prof_info.count) || (index < 0))
		return -EINVAL;
	/* check the index whether change */
	if (aw_dev->prof_index == index)
		return -EINVAL;

	aw_dev->prof_index = 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)
{
	struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol);
	struct aw88166 *aw88166 = snd_soc_component_get_drvdata(codec);
	char *prof_name;
	int count, ret;

	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
	uinfo->count = 1;

	count = aw88166->aw_pa->prof_info.count;
	if (count <= 0) {
		uinfo->value.enumerated.items = 0;
		return 0;
	}

	uinfo->value.enumerated.items = count;

	if (uinfo->value.enumerated.item >= count)
		uinfo->value.enumerated.item = count - 1;

	count = uinfo->value.enumerated.item;

	ret = aw88166_dev_get_prof_name(aw88166->aw_pa, count, &prof_name);
	if (ret) {
		strscpy(uinfo->value.enumerated.name, "null");
		return 0;
	}

	strscpy(uinfo->value.enumerated.name, prof_name);

	return 0;
}

static int aw88166_profile_get(struct snd_kcontrol *kcontrol,
			struct snd_ctl_elem_value *ucontrol)
{
	struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol);
	struct aw88166 *aw88166 = snd_soc_component_get_drvdata(codec);

	ucontrol->value.integer.value[0] = aw88166->aw_pa->prof_index;

	return 0;
}

static int aw88166_profile_set(struct snd_kcontrol *kcontrol,
		struct snd_ctl_elem_value *ucontrol)
{
	struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol);
	struct aw88166 *aw88166 = snd_soc_component_get_drvdata(codec);
	int ret;

	mutex_lock(&aw88166->lock);
	ret = aw88166_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);
		return 0;
	}

	if (aw88166->aw_pa->status) {
		aw88166_stop(aw88166->aw_pa);
		aw88166_start(aw88166, AW88166_SYNC_START);
	}

	mutex_unlock(&aw88166->lock);

	return 1;
}

static int aw88166_volume_get(struct snd_kcontrol *kcontrol,
				struct snd_ctl_elem_value *ucontrol)
{
	struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol);
	struct aw88166 *aw88166 = snd_soc_component_get_drvdata(codec);
	struct aw_volume_desc *vol_desc = &aw88166->aw_pa->volume_desc;

	ucontrol->value.integer.value[0] = vol_desc->ctl_volume;

	return 0;
}

static int aw88166_volume_set(struct snd_kcontrol *kcontrol,
				struct snd_ctl_elem_value *ucontrol)
{
	struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol);
	struct aw88166 *aw88166 = snd_soc_component_get_drvdata(codec);
	struct aw_volume_desc *vol_desc = &aw88166->aw_pa->volume_desc;
	struct soc_mixer_control *mc =
		(struct soc_mixer_control *)kcontrol->private_value;
	int value;

	value = ucontrol->value.integer.value[0];
	if (value < mc->min || value > mc->max)
		return -EINVAL;

	if (vol_desc->ctl_volume != value) {
		vol_desc->ctl_volume = value;
		aw_dev_set_volume(aw88166->aw_pa, vol_desc->ctl_volume);

		return 1;
	}

	return 0;
}

static int aw88166_get_fade_step(struct snd_kcontrol *kcontrol,
				struct snd_ctl_elem_value *ucontrol)
{
	struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol);
	struct aw88166 *aw88166 = snd_soc_component_get_drvdata(codec);

	ucontrol->value.integer.value[0] = aw88166->aw_pa->fade_step;

	return 0;
}

static int aw88166_set_fade_step(struct snd_kcontrol *kcontrol,
				struct snd_ctl_elem_value *ucontrol)
{
	struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol);
	struct aw88166 *aw88166 = snd_soc_component_get_drvdata(codec);
	struct soc_mixer_control *mc =
		(struct soc_mixer_control *)kcontrol->private_value;
	int value;

	value = ucontrol->value.integer.value[0];
	if (value < mc->min || value > mc->max)
		return -EINVAL;

	if (aw88166->aw_pa->fade_step != value) {
		aw88166->aw_pa->fade_step = value;
		return 1;
	}

	return 0;
}

static int aw88166_re_get(struct snd_kcontrol *kcontrol,
				struct snd_ctl_elem_value *ucontrol)
{
	struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol);
	struct aw88166 *aw88166 = snd_soc_component_get_drvdata(codec);
	struct aw_device *aw_dev = aw88166->aw_pa;

	ucontrol->value.integer.value[0] = aw_dev->cali_desc.cali_re;

	return 0;
}

static int aw88166_re_set(struct snd_kcontrol *kcontrol,
				struct snd_ctl_elem_value *ucontrol)
{
	struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol);
	struct aw88166 *aw88166 = snd_soc_component_get_drvdata(codec);
	struct soc_mixer_control *mc =
		(struct soc_mixer_control *)kcontrol->private_value;
	struct aw_device *aw_dev = aw88166->aw_pa;
	int value;

	value = ucontrol->value.integer.value[0];
	if (value < mc->min || value > mc->max)
		return -EINVAL;

	if (aw_dev->cali_desc.cali_re != value) {
		aw_dev->cali_desc.cali_re = value;
		return 1;
	}

	return 0;
}

static int aw88166_dev_init(struct aw88166 *aw88166, struct aw_container *aw_cfg)
{
	struct aw_device *aw_dev = aw88166->aw_pa;
	int ret;

	ret = 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 = AW88166_1000_US / 10;
	aw_dev->fade_out_time = AW88166_1000_US >> 1;
	aw_dev->prof_cur = aw_dev->prof_info.prof_desc[0].id;
	aw_dev->prof_index = aw_dev->prof_info.prof_desc[0].id;

	ret = aw88166_dev_fw_update(aw88166, AW88166_FORCE_UPDATE_ON, AW88166_DSP_FW_UPDATE_ON);
	if (ret) {
		dev_err(aw_dev->dev, "fw update failed ret = %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 = NULL;
	const char *fw_name;
	int ret;

	aw88166->aw_pa->fw_status = AW88166_DEV_FW_FAILED;

	if (device_property_read_string(aw88166->aw_pa->dev, "firmware-name", &fw_name) < 0)
		fw_name = AW88166_ACF_FILE;

	ret = request_firmware(&cont, fw_name, aw88166->aw_pa->dev);
	if (ret) {
		dev_err(aw88166->aw_pa->dev, "request [%s] failed!\n", fw_name);
		return ret;
	}

	dev_dbg(aw88166->aw_pa->dev, "loaded %s - size: %zu\n",
			fw_name, cont ? cont->size : 0);

	aw88166->aw_cfg = 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 = (int)cont->size;
	memcpy(aw88166->aw_cfg->data, cont->data, cont->size);
	release_firmware(cont);

	ret = aw88395_dev_load_acf_check(aw88166->aw_pa, aw88166->aw_cfg);
	if (ret) {
		dev_err(aw88166->aw_pa->dev, "load [%s] failed!\n", fw_name);
		return ret;
	}

	mutex_lock(&aw88166->lock);
	/* aw device init */
	ret = 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[] = {
	SOC_SINGLE_EXT("PCM Playback Volume", AW88166_SYSCTRL2_REG,
		6, AW88166_MUTE_VOL, 0, aw88166_volume_get,
		aw88166_volume_set),
	SOC_SINGLE_EXT("Fade Step", 0, 0, AW88166_MUTE_VOL, 0,
		aw88166_get_fade_step, aw88166_set_fade_step),
	SOC_SINGLE_EXT("Volume Ramp Up Step", 0, 0, FADE_TIME_MAX, FADE_TIME_MIN,
		aw88166_get_fade_in_time, aw88166_set_fade_in_time),
	SOC_SINGLE_EXT("Volume Ramp Down Step", 0, 0, FADE_TIME_MAX, FADE_TIME_MIN,
		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,
		aw88166_profile_get, aw88166_profile_set),
};

static int aw88166_playback_event(struct snd_soc_dapm_widget *w,
				struct snd_kcontrol *k, int event)
{
	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
	struct aw88166 *aw88166 = snd_soc_component_get_drvdata(component);

	mutex_lock(&aw88166->lock);
	switch (event) {
	case SND_SOC_DAPM_PRE_PMU:
		aw88166_start(aw88166, AW88166_ASYNC_START);
		break;
	case SND_SOC_DAPM_POST_PMD:
		aw88166_stop(aw88166->aw_pa);
		break;
	default:
		break;
	}
	mutex_unlock(&aw88166->lock);

	return 0;
}

static const struct snd_soc_dapm_widget aw88166_dapm_widgets[] = {
	 /* playback */
	SND_SOC_DAPM_AIF_IN_E("AIF_RX", "Speaker_Playback", 0, SND_SOC_NOPM, 0, 0,
					aw88166_playback_event,
					SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
	SND_SOC_DAPM_OUTPUT("DAC Output"),

	/* capture */
	SND_SOC_DAPM_AIF_OUT("AIF_TX", "Speaker_Capture", 0, SND_SOC_NOPM, 0, 0),
	SND_SOC_DAPM_INPUT("ADC Input"),
};

static const struct snd_soc_dapm_route aw88166_audio_map[] = {
	{"DAC Output", NULL, "AIF_RX"},
	{"AIF_TX", NULL, "ADC Input"},
};

static int aw88166_codec_probe(struct snd_soc_component *component)
{
	struct aw88166 *aw88166 = snd_soc_component_get_drvdata(component);
	int ret;

	INIT_DELAYED_WORK(&aw88166->start_work, aw88166_startup_work);

	ret = aw88166_request_firmware_file(aw88166);
	if (ret)
		dev_err(aw88166->aw_pa->dev, "%s failed\n", __func__);

	return ret;
}

static void aw88166_codec_remove(struct snd_soc_component *aw_codec)
{
	struct aw88166 *aw88166 = snd_soc_component_get_drvdata(aw_codec);

	cancel_delayed_work_sync(&aw88166->start_work);
}

static const struct snd_soc_component_driver soc_codec_dev_aw88166 = {
	.probe = aw88166_codec_probe,
	.remove = aw88166_codec_remove,
	.dapm_widgets = aw88166_dapm_widgets,
	.num_dapm_widgets = ARRAY_SIZE(aw88166_dapm_widgets),
	.dapm_routes = aw88166_audio_map,
	.num_dapm_routes = ARRAY_SIZE(aw88166_audio_map),
	.controls = aw88166_controls,
	.num_controls = ARRAY_SIZE(aw88166_controls),
};

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 = aw88166->aw_pa;
	struct device_node *np = aw_dev->dev->of_node;
	u32 channel_value;

	of_property_read_u32(np, "awinic,audio-channel", &channel_value);
	aw_dev->channel = channel_value;
	aw88166->phase_sync = of_property_read_bool(np, "awinic,sync-flag");
}

static int aw88166_init(struct aw88166 *aw88166, struct i2c_client *i2c, struct regmap *regmap)
{
	struct aw_device *aw_dev;
	unsigned int chip_id;
	int ret;

	ret = regmap_read(regmap, AW88166_ID_REG, &chip_id);
	if (ret) {
		dev_err(&i2c->dev, "%s read chipid error. ret = %d\n", __func__, ret);
		return ret;
	}

	aw_dev = devm_kzalloc(&i2c->dev, sizeof(*aw_dev), GFP_KERNEL);
	if (!aw_dev)
		return -ENOMEM;
	aw88166->aw_pa = aw_dev;

	aw_dev->i2c = i2c;
	aw_dev->dev = &i2c->dev;
	aw_dev->regmap = regmap;
	mutex_init(&aw_dev->dsp_lock);

	aw_dev->chip_id = chip_id;
	aw_dev->acf = NULL;
	aw_dev->prof_info.prof_desc = NULL;
	aw_dev->prof_info.count = 0;
	aw_dev->prof_info.prof_type = AW88395_DEV_NONE_TYPE_ID;
	aw_dev->channel = AW88166_DEV_DEFAULT_CH;
	aw_dev->fw_status = AW88166_DEV_FW_FAILED;

	aw_dev->fade_step = AW88166_VOLUME_STEP_DB;
	aw_dev->volume_desc.ctl_volume = AW88166_VOL_DEFAULT_VALUE;

	aw88166_parse_channel_dt(aw88166);

	return 0;
}

static int aw88166_i2c_probe(struct i2c_client *i2c)
{
	struct aw88166 *aw88166;
	int ret;

	if (!i2c_check_functionality(i2c->adapter, I2C_FUNC_I2C))
		return dev_err_probe(&i2c->dev, -ENXIO, "check_functionality failed\n");

	aw88166 = devm_kzalloc(&i2c->dev, sizeof(*aw88166), GFP_KERNEL);
	if (!aw88166)
		return -ENOMEM;

	mutex_init(&aw88166->lock);

	i2c_set_clientdata(i2c, aw88166);

	aw88166->reset_gpio = devm_gpiod_get_optional(&i2c->dev, "reset", GPIOD_OUT_LOW);
	if (IS_ERR(aw88166->reset_gpio))
		return dev_err_probe(&i2c->dev, PTR_ERR(aw88166->reset_gpio),
							"reset gpio not defined\n");
	aw88166_hw_reset(aw88166);

	aw88166->regmap = devm_regmap_init_i2c(i2c, &aw88166_remap_config);
	if (IS_ERR(aw88166->regmap))
		return dev_err_probe(&i2c->dev, PTR_ERR(aw88166->regmap),
							"failed to init regmap\n");

	/* aw pa init */
	ret = aw88166_init(aw88166, i2c, aw88166->regmap);
	if (ret)
		return ret;

	return devm_snd_soc_register_component(&i2c->dev,
			&soc_codec_dev_aw88166,
			aw88166_dai, ARRAY_SIZE(aw88166_dai));
}

static const struct i2c_device_id aw88166_i2c_id[] = {
	{ .name = AW88166_I2C_NAME },
	{ }
};
MODULE_DEVICE_TABLE(i2c, aw88166_i2c_id);

static struct i2c_driver aw88166_i2c_driver = {
	.driver = {
		.name = AW88166_I2C_NAME,
	},
	.probe = aw88166_i2c_probe,
	.id_table = aw88166_i2c_id,
};
module_i2c_driver(aw88166_i2c_driver);

MODULE_DESCRIPTION("ASoC AW88166 Smart PA Driver");
MODULE_LICENSE("GPL v2");
