From 6e3bdd99d8683098390c4924ca03dc6e28e4b33f Mon Sep 17 00:00:00 2001 From: yaozm1 Date: Wed, 5 Jan 2022 16:56:28 +0800 Subject: [PATCH] asoc:upgrade aw88261 driver to v 1.9.0.4 version 1.9.0.4; add speaker spin function; fix compile errors. Change-Id: I1ef2a6b32d373cc87ec0615e1ed4b3709e13051e Signed-off-by: yaozm1 Reviewed-on: https://gerrit.mot.com/2167927 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Xiangpo Zhao Submit-Approved: Jira Key --- asoc/codecs/aw88261/aw882xx.c | 173 ++++++++++++++++++++++++++++++-- asoc/codecs/aw88261/aw882xx.h | 7 +- asoc/codecs/aw88261/aw_device.c | 12 +++ asoc/codecs/aw88261/aw_device.h | 4 + asoc/codecs/aw88261/aw_dsp.c | 52 ++++++++++ asoc/codecs/aw88261/aw_dsp.h | 18 +++- 6 files changed, 258 insertions(+), 8 deletions(-) diff --git a/asoc/codecs/aw88261/aw882xx.c b/asoc/codecs/aw88261/aw882xx.c index 3505912bcd42..bbbe61dcbe42 100644 --- a/asoc/codecs/aw88261/aw882xx.c +++ b/asoc/codecs/aw88261/aw882xx.c @@ -35,7 +35,7 @@ #include "aw_log.h" #include "aw_dsp.h" -#define AW882XX_DRIVER_VERSION "v1.9.0.3" +#define AW882XX_DRIVER_VERSION "v1.9.0.4" #define AW882XX_I2C_NAME "aw882xxacf_smartpa" #define AW_READ_CHIPID_RETRIES 5 /* 5 times */ @@ -48,11 +48,18 @@ static unsigned int g_algo_tx_en = false; static unsigned int g_algo_copp_en = false; #ifdef AW_SPIN_ENABLE static unsigned int g_spin_value = 0; +static uint32_t g_spin_en = 0; #endif #ifdef AW882XX_RUNIN_TEST static unsigned int g_runin_test; #endif +#define AW882XX_SPIN_FOR_LOW_LATENCY_ONLY 1 + +#ifdef AW882XX_SPIN_FOR_LOW_LATENCY_ONLY +static unsigned int g_skt_prof_id = 0; +#endif + static DEFINE_MUTEX(g_aw882xx_lock); struct aw_container *g_awinic_cfg = NULL; @@ -1257,12 +1264,21 @@ static int aw882xx_set_spin(struct snd_kcontrol *kcontrol, aw_dev = aw882xx->aw_pa; ctrl_value = ucontrol->value.integer.value[0]; + +#ifdef AW882XX_SPIN_FOR_LOW_LATENCY_ONLY + if (g_skt_prof_id == (AW882XX_SCENE_FASTTRACK_ID+1)) { +#else if (aw882xx->pstream) { +#endif ret = aw_dev_set_spin(ctrl_value); if (ret) aw_dev_err(aw882xx->dev, "set spin error, ret=%d", ret); } else { +#ifdef AW882XX_SPIN_FOR_LOW_LATENCY_ONLY + aw_dev_info(aw882xx->dev, "fasttrack stream no start"); +#else aw_dev_info(aw882xx->dev, "stream no start only record"); +#endif } g_spin_value = ctrl_value; @@ -1297,6 +1313,127 @@ static int aw882xx_get_spin(struct snd_kcontrol *kcontrol, aw_dev_dbg(aw882xx->dev, "spin value is %ld", ucontrol->value.integer.value[0]); return 0; } + +static int aw882xx_get_spin_status(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct aw_device *aw_dev; + aw_snd_soc_codec_t *codec = + aw_componet_codec_ops.kcontrol_codec(kcontrol); + struct aw882xx *aw882xx = + aw_componet_codec_ops.codec_get_drvdata(codec); + struct aw_spin_param spin_param; + int ctrl_value; + int ret = -EINVAL; + + aw_dev = aw882xx->aw_pa; + + if (aw882xx->pstream) { + ret = aw_dev_get_spin_param(aw_dev, &ctrl_value, &(spin_param.relase_time)); + if (ret) { + aw_dev_err(aw882xx->dev, "get spin status failed!, ret = %d", ret); + ctrl_value = 0; + } + ucontrol->value.integer.value[0] = ctrl_value; + } else { + aw_dev_info(aw882xx->dev, "no stream, use record value"); + + } + aw_dev_dbg(aw882xx->dev, "spin value is %ld", ucontrol->value.integer.value[0]); + return 0; +} + +static int aw882xx_set_spin_status(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int ret = -EINVAL; + uint32_t ctrl_value = 0; + struct aw_device *aw_dev; + aw_snd_soc_codec_t *codec = + aw_componet_codec_ops.kcontrol_codec(kcontrol); + struct aw882xx *aw882xx = + aw_componet_codec_ops.codec_get_drvdata(codec); + struct aw_spin_param spin_param; + + aw_dev_dbg(aw882xx->dev, "ucontrol->value.integer.value[0]=%ld", + ucontrol->value.integer.value[0]); + + aw_dev = aw882xx->aw_pa; + + ctrl_value = ucontrol->value.integer.value[0]; + + if (g_algo_rx_en == true) { + ret = aw_dev_set_spin_param(aw_dev, ctrl_value, spin_param.relase_time); + if (ret) + aw_dev_err(aw882xx->dev, "set spin status error, ret=%d", ret); + + g_spin_en = ctrl_value; + } else { + aw_dev_info(aw882xx->dev, "stream no start only record"); + } + + return 0; +} + +static int aw882xx_get_spin_relase_time(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct aw_device *aw_dev; + aw_snd_soc_codec_t *codec = + aw_componet_codec_ops.kcontrol_codec(kcontrol); + struct aw882xx *aw882xx = + aw_componet_codec_ops.codec_get_drvdata(codec); + struct aw_spin_param spin_param; + int ctrl_value; + int ret = -EINVAL; + + aw_dev = aw882xx->aw_pa; + + if (aw882xx->pstream) { + ret = aw_dev_get_spin_param(aw_dev, &(spin_param.enable), &ctrl_value); + if (ret) { + aw_dev_err(aw882xx->dev, "get spin release time failed!, ret = %d", ret); + ctrl_value = 0; + } + ucontrol->value.integer.value[0] = ctrl_value; + } else { + aw_dev_info(aw882xx->dev, "no stream, use record value"); + + } + aw_dev_dbg(aw882xx->dev, "spin value is %ld", ucontrol->value.integer.value[0]); + return 0; +} + +static int aw882xx_set_spin_relase_time(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int ret = -EINVAL; + uint32_t ctrl_value = 0; + struct aw_device *aw_dev; + aw_snd_soc_codec_t *codec = + aw_componet_codec_ops.kcontrol_codec(kcontrol); + struct aw882xx *aw882xx = + aw_componet_codec_ops.codec_get_drvdata(codec); + //struct aw_spin_param spin_param; + + aw_dev_dbg(aw882xx->dev, "ucontrol->value.integer.value[0]=%ld", + ucontrol->value.integer.value[0]); + + aw_dev = aw882xx->aw_pa; + + ctrl_value = ucontrol->value.integer.value[0]; + //if ((aw882xx->pstream) && (g_spin_en == 1) && (g_algo_rx_en == true)) { + if ( (g_spin_en == 1) && (g_algo_rx_en == true)) { + ret = aw_dev_set_spin_param(aw_dev, g_spin_en , ctrl_value); + if (ret) + aw_dev_err(aw882xx->dev, "set spin release time error, ret=%d", ret); + } else { + aw_dev_info(aw882xx->dev, "set release time failed"); + } + + return 0; +} + #endif static int aw882xx_get_fade_in_time(struct snd_kcontrol *kcontrol, @@ -1569,10 +1706,10 @@ static int aw882xx_update_algo_profile(struct aw882xx *aw882xx) return 0; } - aw_dev_info(aw882xx->dev, "algo scene switch. [new] %d,[old] %d", + aw_dev_info(aw882xx->dev, "algo scene switch. [new] %d,[old] %d", new_skt_prof_id, cur_skt_prof_id); - aw882xx->cur_algo_prof_id = new_skt_prof_id; - aw_dev = aw882xx->aw_pa; + aw882xx->cur_algo_prof_id = new_skt_prof_id; + aw_dev = aw882xx->aw_pa; /* set new scene pramas to skt */ ret = aw_dev_set_algo_prof(aw_dev, aw882xx->cur_algo_prof_id); @@ -1580,10 +1717,27 @@ static int aw882xx_update_algo_profile(struct aw882xx *aw882xx) aw_dev_err(aw882xx->dev, "set algo prof failed"); return -1; } - - aw_dev_info(aw882xx->dev, "algo scene hold, cur scene %d", + + aw_dev_info(aw882xx->dev, "algo scene hold, cur scene %d", new_skt_prof_id); +#ifdef AW882XX_SPIN_FOR_LOW_LATENCY_ONLY + aw_dev_info(aw882xx->dev, "g_skt_prof_id=%d\n",g_skt_prof_id); + + if (new_skt_prof_id == (AW882XX_SCENE_FASTTRACK_ID+1)){ + ret = aw_dev_set_spin(g_spin_value); + if (ret) + aw_dev_err(aw882xx->dev, "set spin error when switch prof id to %d, ret=%d", ret, new_skt_prof_id); + } else if ((g_skt_prof_id == (AW882XX_SCENE_FASTTRACK_ID+1)) + && (new_skt_prof_id != (AW882XX_SCENE_FASTTRACK_ID+1))){ + ret = aw_dev_set_spin(1); + if (ret) + aw_dev_err(aw882xx->dev, "set spin error when switch prof id to %d, ret=%d", ret, new_skt_prof_id); + } + + g_skt_prof_id = new_skt_prof_id; +#endif + return 0; } @@ -1887,6 +2041,10 @@ static struct snd_kcontrol_new aw882xx_controls[] = { #ifdef AW_SPIN_ENABLE SOC_ENUM_EXT("aw882xx_spin_switch", aw882xx_snd_enum[2], aw882xx_get_spin, aw882xx_set_spin), + SOC_ENUM_EXT("aw882xx_spin_status", aw882xx_snd_enum[1], + aw882xx_get_spin_status, aw882xx_set_spin_status), + SOC_SINGLE_EXT("aw882xx_spin_relase_time", 0, 0, 1000000, 0, + aw882xx_get_spin_relase_time, aw882xx_set_spin_relase_time), #endif #ifdef AW882XX_RUNIN_TEST SOC_ENUM_EXT("aw882xx_runin_test", aw882xx_snd_enum[1], @@ -3104,3 +3262,6 @@ module_exit(aw882xx_i2c_exit); MODULE_DESCRIPTION("ASoC AW882XX Smart PA Driver"); MODULE_LICENSE("GPL v2"); + + + diff --git a/asoc/codecs/aw88261/aw882xx.h b/asoc/codecs/aw88261/aw882xx.h index be576beed982..c9b41f61c91c 100644 --- a/asoc/codecs/aw88261/aw882xx.h +++ b/asoc/codecs/aw88261/aw882xx.h @@ -2,6 +2,11 @@ #define _AW882XX_H_ #include #include + +#ifndef AW_SPIN_ENABLE +#define AW_SPIN_ENABLE 1 +#endif + #include "aw_device.h" /* @@ -201,7 +206,7 @@ struct aw882xx { int rate; int pstream; int cstream; - int aw882xx_ramp_status; /* ramp status */ + int aw882xx_ramp_status; /* ramp status */ #ifdef CONFIG_AW882XX_ALGO_BIN_PARAMS int aw882xx_algo_cali; int aw882xx_algo_bypass; diff --git a/asoc/codecs/aw88261/aw_device.c b/asoc/codecs/aw88261/aw_device.c index bb2608e2d5d0..a4758c3a2102 100644 --- a/asoc/codecs/aw88261/aw_device.c +++ b/asoc/codecs/aw88261/aw_device.c @@ -1494,6 +1494,18 @@ int aw_dev_set_algo_params_path(struct aw_device *aw_dev) return aw_dsp_set_algo_params_path(aw_dev); } +#ifdef AW_SPIN_ENABLE +int aw_dev_set_spin_param(struct aw_device *aw_dev, uint32_t enable, uint32_t relase_time) +{ + return aw_dsp_set_spin_param(aw_dev, enable, relase_time); +} + +int aw_dev_get_spin_param(struct aw_device *aw_dev, uint32_t *enable, uint32_t *relase_time) +{ + return aw_dsp_get_spin_param(aw_dev, enable, relase_time); +} +#endif + static void aw_device_parse_sound_channel_dt(struct aw_device *aw_dev) { int ret; diff --git a/asoc/codecs/aw88261/aw_device.h b/asoc/codecs/aw88261/aw_device.h index 0629d9e71968..2b181a59e030 100644 --- a/asoc/codecs/aw88261/aw_device.h +++ b/asoc/codecs/aw88261/aw_device.h @@ -289,6 +289,10 @@ int aw_dev_set_algo_params_path(struct aw_device *aw_dev); int aw_device_probe(struct aw_device *aw_dev); int aw_device_remove(struct aw_device *aw_dev); int aw_dev_get_list_head(struct list_head **head); +#ifdef AW_SPIN_ENABLE +int aw_dev_set_spin_param(struct aw_device *aw_dev, uint32_t enable, uint32_t relase_time); +int aw_dev_get_spin_param(struct aw_device *aw_dev, uint32_t* enable, uint32_t* relase_time); +#endif #endif diff --git a/asoc/codecs/aw88261/aw_dsp.c b/asoc/codecs/aw88261/aw_dsp.c index eabb7764526f..e8ec82e9e7c0 100644 --- a/asoc/codecs/aw88261/aw_dsp.c +++ b/asoc/codecs/aw88261/aw_dsp.c @@ -48,6 +48,7 @@ static DEFINE_MUTEX(g_aw_dsp_lock); #define AW_MSG_ID_REAL_DATA_L (0X10013D21) #define AW_MSG_ID_REAL_DATA_R (0X10013D22) #define AW_MSG_ID_SET_BIN_PARAMS (0X10013D30) +#define AW_MSG_ID_SPIN_ENABLE (0x10013D2F) #define AFE_MSG_ID_MSG_0 (0X10013D2A) #define AFE_MSG_ID_MSG_1 (0X10013D2B) @@ -555,6 +556,57 @@ int aw_dsp_read_st(struct aw_device *aw_dev, int32_t *r0, int32_t *te) return 0; } +#ifdef AW_SPIN_ENABLE +int aw_dsp_get_spin_param(struct aw_device *aw_dev, + uint32_t *enable, uint32_t *relase_time) +{ + int ret; + struct aw_spin_param spin_param; + + ret = aw_read_data_from_dsp(AW_MSG_ID_SPIN_ENABLE, + &spin_param, + sizeof(spin_param)); + if (ret) { + spin_param.enable = 0; + spin_param.relase_time = 0; + aw_pr_err("yao,read spin params failed "); + return ret; + } + + *enable = spin_param.enable; + *relase_time = spin_param.relase_time; + + aw_pr_info("yao,get spin params done"); + return 0; +} + +int aw_dsp_set_spin_param(struct aw_device *aw_dev, + uint32_t enable, uint32_t relase_time) +{ + int ret; + struct aw_spin_param spin_param; + + if (!enable) { + aw_pr_dbg("yao,need to set the rotation parameters"); + return 0; + } + + spin_param.enable = enable; + spin_param.relase_time = relase_time; + + ret = aw_write_data_to_dsp(AW_MSG_ID_SPIN_ENABLE, + &spin_param, + sizeof(spin_param)); + if (ret){ + pr_err("yao,222,set spin params failed\n"); + return -EINVAL; + } + + pr_err("yao,222,set spin params with ret 0"); + return 0; +} +#endif + int aw_dsp_read_spin(int *spin_mode) { int ret; diff --git a/asoc/codecs/aw88261/aw_dsp.h b/asoc/codecs/aw88261/aw_dsp.h index aaf0089a0d92..703c8a8cdf46 100644 --- a/asoc/codecs/aw88261/aw_dsp.h +++ b/asoc/codecs/aw88261/aw_dsp.h @@ -3,6 +3,10 @@ #define AW_QCOM_PLATFORM +#ifndef AW_SPIN_ENABLE +#define AW_SPIN_ENABLE 1 +#endif + /*factor form 12bit(4096) to 1000*/ #define AW_DSP_RE_TO_SHOW_RE(re) (((re) * (1000)) >> (12)) #define AW_SHOW_RE_TO_DSP_RE(re) (((re) << 12) / (1000)) @@ -31,6 +35,13 @@ enum { #define AW_DSP_MSG_HDR_VER (1) typedef struct aw_msg_hdr aw_dsp_msg_t; +#ifdef AW_SPIN_ENABLE +struct aw_spin_param { + uint32_t enable; + uint32_t relase_time; +}; +#endif + int aw_dsp_write_msg(struct aw_device *aw_dev, uint32_t msg_id, char *data_ptr, unsigned int data_size); int aw_dsp_read_msg(struct aw_device *aw_dev, uint32_t msg_id, char *data_ptr, unsigned int data_size); int aw_dsp_write_cali_cfg(struct aw_device *aw_dev, char *data, unsigned int data_len); @@ -61,6 +72,11 @@ int aw_dsp_get_algo_prof(struct aw_device *aw_dev, int *prof_id); int aw_dsp_set_algo_params_path(struct aw_device *aw_dev); void aw_device_parse_topo_id_dt(struct aw_device *aw_dev); void aw_device_parse_port_id_dt(struct aw_device *aw_dev); - +#ifdef AW_SPIN_ENABLE +int aw_dsp_set_spin_param(struct aw_device *aw_dev, + uint32_t enable, uint32_t relase_time); +int aw_dsp_get_spin_param(struct aw_device *aw_dev, + uint32_t *enable, uint32_t *relase_time); +#endif #endif