Loading include/sound/q6afe-v2.h +6 −0 Original line number Diff line number Diff line Loading @@ -102,6 +102,11 @@ enum afe_mad_type { MAD_SW_AUDIO = 0x05, }; enum afe_cal_mode { AFE_CAL_MODE_DEFAULT = 0x00, AFE_CAL_MODE_NONE, }; struct afe_audio_buffer { dma_addr_t phys; void *data; Loading Loading @@ -176,6 +181,7 @@ int afe_rt_proxy_port_write(phys_addr_t buf_addr_p, u32 mem_map_handle, int bytes); int afe_rt_proxy_port_read(phys_addr_t buf_addr_p, u32 mem_map_handle, int bytes); void afe_set_cal_mode(u16 port_id, enum afe_cal_mode afe_cal_mode); int afe_port_start(u16 port_id, union afe_port_config *afe_config, u32 rate); int afe_spk_prot_feed_back_cfg(int src_port, int dst_port, Loading sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c +44 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,7 @@ struct msm_dai_q6_dai_data { u32 rate; u32 channels; u32 bitwidth; u32 cal_mode; union afe_port_config port_config; }; Loading Loading @@ -1428,6 +1429,30 @@ static inline void msm_dai_q6_set_dai_id(struct snd_soc_dai *dai) return; } static int msm_dai_q6_sb_cal_info_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; u16 port_id = ((struct soc_enum *) kcontrol->private_value)->reg; dai_data->cal_mode = ucontrol->value.integer.value[0]; pr_debug("%s: setting cal_mode to %d\n", __func__, dai_data->cal_mode); afe_set_cal_mode(port_id, dai_data->cal_mode); return 0; } static int msm_dai_q6_sb_cal_info_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; ucontrol->value.integer.value[0] = dai_data->cal_mode; return 0; } static int msm_dai_q6_sb_format_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { Loading @@ -1454,10 +1479,21 @@ static int msm_dai_q6_sb_format_get(struct snd_kcontrol *kcontrol, return 0; } static const char * const slim_2_rx_text[] = { "CAL_MODE_DEFAULT", "CAL_MODE_NONE" }; static const struct soc_enum slim_2_rx_enum = SOC_ENUM_SINGLE(SLIMBUS_2_RX, 0, ARRAY_SIZE(slim_2_rx_text), slim_2_rx_text); static const struct snd_kcontrol_new sb_config_controls[] = { SOC_ENUM_EXT("SLIM_4_TX Format", sb_config_enum[0], msm_dai_q6_sb_format_get, msm_dai_q6_sb_format_put), SOC_ENUM_EXT("SLIM_2_RX SetCalMode", slim_2_rx_enum, msm_dai_q6_sb_cal_info_get, msm_dai_q6_sb_cal_info_put) }; static int msm_dai_q6_dai_probe(struct snd_soc_dai *dai) Loading Loading @@ -1494,6 +1530,14 @@ static int msm_dai_q6_dai_probe(struct snd_soc_dai *dai) __func__, dai->name); } } if (dai->id == SLIMBUS_2_RX) { rc = snd_ctl_add(dai->card->snd_card, snd_ctl_new1(&sb_config_controls[1], dai_data)); if (IS_ERR_VALUE(rc)) dev_err(dai->dev, "%s: err add RX Cal ctl, DAI = %s\n", __func__, dai->name); } rc = msm_dai_q6_dai_add_route(dai); return rc; } Loading sound/soc/msm/qdsp6v2/q6afe.c +19 −5 Original line number Diff line number Diff line Loading @@ -94,6 +94,7 @@ struct afe_ctl { atomic_t mem_map_cal_handles[MAX_AFE_CAL_TYPES]; atomic_t mem_map_cal_index; u32 afe_cal_mode[AFE_MAX_PORTS]; u16 dtmf_gen_rx_portid; struct audio_cal_info_spk_prot_cfg prot_cfg; Loading Loading @@ -1986,6 +1987,14 @@ fail_cmd: return ret; } void afe_set_cal_mode(u16 port_id, enum afe_cal_mode afe_cal_mode) { uint16_t port_index; port_index = afe_get_port_index(port_id); this_afe.afe_cal_mode[port_index] = afe_cal_mode; } int afe_port_start(u16 port_id, union afe_port_config *afe_config, u32 rate) /* This function is no blocking */ { Loading Loading @@ -2045,10 +2054,14 @@ int afe_port_start(u16 port_id, union afe_port_config *afe_config, mutex_lock(&this_afe.afe_cmd_lock); /* Also send the topology id here: */ afe_send_custom_topology(); /* One time call: only for first time */ port_index = afe_get_port_index(port_id); if (!(this_afe.afe_cal_mode[port_index] == AFE_CAL_MODE_NONE)) { /* One time call: only for first time */ afe_send_custom_topology(); afe_send_port_topology_id(port_id); afe_send_cal(port_id); } afe_send_hw_delay(port_id, rate); /* Start SW MAD module */ Loading Loading @@ -5015,9 +5028,10 @@ static int __init afe_init(void) this_afe.vi_rx_port = -1; this_afe.prot_cfg.mode = MSM_SPKR_PROT_DISABLED; mutex_init(&this_afe.afe_cmd_lock); for (i = 0; i < AFE_MAX_PORTS; i++) for (i = 0; i < AFE_MAX_PORTS; i++) { this_afe.afe_cal_mode[i] = AFE_CAL_MODE_DEFAULT; init_waitqueue_head(&this_afe.wait[i]); } wakeup_source_init(&wl.ws, "spkr-prot"); ret = afe_init_cal_data(); if (ret) Loading Loading
include/sound/q6afe-v2.h +6 −0 Original line number Diff line number Diff line Loading @@ -102,6 +102,11 @@ enum afe_mad_type { MAD_SW_AUDIO = 0x05, }; enum afe_cal_mode { AFE_CAL_MODE_DEFAULT = 0x00, AFE_CAL_MODE_NONE, }; struct afe_audio_buffer { dma_addr_t phys; void *data; Loading Loading @@ -176,6 +181,7 @@ int afe_rt_proxy_port_write(phys_addr_t buf_addr_p, u32 mem_map_handle, int bytes); int afe_rt_proxy_port_read(phys_addr_t buf_addr_p, u32 mem_map_handle, int bytes); void afe_set_cal_mode(u16 port_id, enum afe_cal_mode afe_cal_mode); int afe_port_start(u16 port_id, union afe_port_config *afe_config, u32 rate); int afe_spk_prot_feed_back_cfg(int src_port, int dst_port, Loading
sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c +44 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,7 @@ struct msm_dai_q6_dai_data { u32 rate; u32 channels; u32 bitwidth; u32 cal_mode; union afe_port_config port_config; }; Loading Loading @@ -1428,6 +1429,30 @@ static inline void msm_dai_q6_set_dai_id(struct snd_soc_dai *dai) return; } static int msm_dai_q6_sb_cal_info_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; u16 port_id = ((struct soc_enum *) kcontrol->private_value)->reg; dai_data->cal_mode = ucontrol->value.integer.value[0]; pr_debug("%s: setting cal_mode to %d\n", __func__, dai_data->cal_mode); afe_set_cal_mode(port_id, dai_data->cal_mode); return 0; } static int msm_dai_q6_sb_cal_info_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data; ucontrol->value.integer.value[0] = dai_data->cal_mode; return 0; } static int msm_dai_q6_sb_format_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { Loading @@ -1454,10 +1479,21 @@ static int msm_dai_q6_sb_format_get(struct snd_kcontrol *kcontrol, return 0; } static const char * const slim_2_rx_text[] = { "CAL_MODE_DEFAULT", "CAL_MODE_NONE" }; static const struct soc_enum slim_2_rx_enum = SOC_ENUM_SINGLE(SLIMBUS_2_RX, 0, ARRAY_SIZE(slim_2_rx_text), slim_2_rx_text); static const struct snd_kcontrol_new sb_config_controls[] = { SOC_ENUM_EXT("SLIM_4_TX Format", sb_config_enum[0], msm_dai_q6_sb_format_get, msm_dai_q6_sb_format_put), SOC_ENUM_EXT("SLIM_2_RX SetCalMode", slim_2_rx_enum, msm_dai_q6_sb_cal_info_get, msm_dai_q6_sb_cal_info_put) }; static int msm_dai_q6_dai_probe(struct snd_soc_dai *dai) Loading Loading @@ -1494,6 +1530,14 @@ static int msm_dai_q6_dai_probe(struct snd_soc_dai *dai) __func__, dai->name); } } if (dai->id == SLIMBUS_2_RX) { rc = snd_ctl_add(dai->card->snd_card, snd_ctl_new1(&sb_config_controls[1], dai_data)); if (IS_ERR_VALUE(rc)) dev_err(dai->dev, "%s: err add RX Cal ctl, DAI = %s\n", __func__, dai->name); } rc = msm_dai_q6_dai_add_route(dai); return rc; } Loading
sound/soc/msm/qdsp6v2/q6afe.c +19 −5 Original line number Diff line number Diff line Loading @@ -94,6 +94,7 @@ struct afe_ctl { atomic_t mem_map_cal_handles[MAX_AFE_CAL_TYPES]; atomic_t mem_map_cal_index; u32 afe_cal_mode[AFE_MAX_PORTS]; u16 dtmf_gen_rx_portid; struct audio_cal_info_spk_prot_cfg prot_cfg; Loading Loading @@ -1986,6 +1987,14 @@ fail_cmd: return ret; } void afe_set_cal_mode(u16 port_id, enum afe_cal_mode afe_cal_mode) { uint16_t port_index; port_index = afe_get_port_index(port_id); this_afe.afe_cal_mode[port_index] = afe_cal_mode; } int afe_port_start(u16 port_id, union afe_port_config *afe_config, u32 rate) /* This function is no blocking */ { Loading Loading @@ -2045,10 +2054,14 @@ int afe_port_start(u16 port_id, union afe_port_config *afe_config, mutex_lock(&this_afe.afe_cmd_lock); /* Also send the topology id here: */ afe_send_custom_topology(); /* One time call: only for first time */ port_index = afe_get_port_index(port_id); if (!(this_afe.afe_cal_mode[port_index] == AFE_CAL_MODE_NONE)) { /* One time call: only for first time */ afe_send_custom_topology(); afe_send_port_topology_id(port_id); afe_send_cal(port_id); } afe_send_hw_delay(port_id, rate); /* Start SW MAD module */ Loading Loading @@ -5015,9 +5028,10 @@ static int __init afe_init(void) this_afe.vi_rx_port = -1; this_afe.prot_cfg.mode = MSM_SPKR_PROT_DISABLED; mutex_init(&this_afe.afe_cmd_lock); for (i = 0; i < AFE_MAX_PORTS; i++) for (i = 0; i < AFE_MAX_PORTS; i++) { this_afe.afe_cal_mode[i] = AFE_CAL_MODE_DEFAULT; init_waitqueue_head(&this_afe.wait[i]); } wakeup_source_init(&wl.ws, "spkr-prot"); ret = afe_init_cal_data(); if (ret) Loading