static void fm_audio_listner(u32 evt_id, union auddev_evt_data *evt_payload, void *private_data) { struct audio *audio = (struct audio *) private_data; switch (evt_id) { case AUDDEV_EVT_DEV_RDY: pr_info("%s :AUDDEV_EVT_DEV_RDY\n", __func__); if (evt_payload->routing_id == FM_COPP) { audio->fm_source = 1; audio->fm_src_copp_id = FM_COPP; } else { audio->fm_dest = 1; audio->fm_dst_copp_id = evt_payload->routing_id; } if (audio->enabled && audio->fm_dest && audio->fm_source) { afe_loopback_gain(audio->fm_src_copp_id, audio->volume); afe_loopback(FM_ENABLE, audio->fm_dst_copp_id, audio->fm_src_copp_id); audio->running = 1; } break; case AUDDEV_EVT_DEV_RLS: pr_info("%s: AUDDEV_EVT_DEV_RLS\n", __func__); if (evt_payload->routing_id == audio->fm_src_copp_id) audio->fm_source = 0; else audio->fm_dest = 0; if (audio->running && (!audio->fm_dest || !audio->fm_source)) { afe_loopback(FM_DISABLE, audio->fm_dst_copp_id, audio->fm_src_copp_id); audio->running = 0; } else { pr_err("%s: device switch happened\n", __func__); } break; case AUDDEV_EVT_STREAM_VOL_CHG: pr_debug("%s: AUDDEV_EVT_STREAM_VOL_CHG\n", __func__); if (audio->fm_source) { audio->volume = evt_payload->session_vol; afe_loopback_gain(audio->fm_src_copp_id, audio->volume); } break; default: pr_err("%s: ERROR:wrong event %08x\n", __func__, evt_id); break; } }
static int msm_qti_pp_set_tert_mi2s_lb_vol_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { afe_loopback_gain(AFE_PORT_ID_TERTIARY_MI2S_TX, ucontrol->value.integer.value[0]); msm_afe_lb_vol_ctrl = ucontrol->value.integer.value[0]; return 0; }
static int msm_qti_pp_set_hfp_vol_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { afe_loopback_gain(INT_BT_SCO_TX , ucontrol->value.integer.value[0]); msm_route_hfp_vol_control = ucontrol->value.integer.value[0]; return 0; }
static int msm_qti_pp_set_quat_mi2s_fm_vol_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { afe_loopback_gain(AFE_PORT_ID_QUATERNARY_MI2S_TX, ucontrol->value.integer.value[0]); msm_route_fm_vol_control = ucontrol->value.integer.value[0]; return 0; }
static int msm_qti_pp_set_auxpcm_lb_vol_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; afe_loopback_gain(mc->reg, ucontrol->value.integer.value[0]); msm_route_auxpcm_lb_vol_ctrl = ucontrol->value.integer.value[0]; return 0; }
static ssize_t afe_debug_write(struct file *filp, const char __user *ubuf, size_t cnt, loff_t *ppos) { char *lb_str = filp->private_data; char lbuf[32]; int rc; unsigned long param[5]; if (cnt > sizeof(lbuf) - 1) return -EINVAL; rc = copy_from_user(lbuf, ubuf, cnt); if (rc) return -EFAULT; lbuf[cnt] = '\0'; if (!strcmp(lb_str, "afe_loopback")) { rc = afe_get_parameters(lbuf, param, 3); if (!rc) { pr_info("%s %lu %lu %lu\n", lb_str, param[0], param[1], param[2]); if ((param[0] != AFE_LOOPBACK_ON) && (param[0] != AFE_LOOPBACK_OFF)) { pr_err("%s: Error, parameter 0 incorrect\n", __func__); rc = -EINVAL; goto afe_error; } if ((afe_validate_port(param[1]) < 0) || (afe_validate_port(param[2])) < 0) { pr_err("%s: Error, invalid afe port\n", __func__); } if (this_afe.apr == NULL) { pr_err("%s: Error, AFE not opened\n", __func__); rc = -EINVAL; } else { rc = afe_loopback(param[0], param[1], param[2]); } } else { pr_err("%s: Error, invalid parameters\n", __func__); rc = -EINVAL; } } else if (!strcmp(lb_str, "afe_loopback_gain")) { rc = afe_get_parameters(lbuf, param, 2); if (!rc) { pr_info("%s %lu %lu\n", lb_str, param[0], param[1]); if (afe_validate_port(param[0]) < 0) { pr_err("%s: Error, invalid afe port\n", __func__); rc = -EINVAL; goto afe_error; } if (param[1] < 0 || param[1] > 100) { pr_err("%s: Error, volume shoud be 0 to 100" " percentage param = %lu\n", __func__, param[1]); rc = -EINVAL; goto afe_error; } param[1] = (Q6AFE_MAX_VOLUME * param[1]) / 100; if (this_afe.apr == NULL) { pr_err("%s: Error, AFE not opened\n", __func__); rc = -EINVAL; } else { rc = afe_loopback_gain(param[0], param[1]); } } else { pr_err("%s: Error, invalid parameters\n", __func__); rc = -EINVAL; } } afe_error: if (rc == 0) rc = cnt; else pr_err("%s: rc = %d\n", __func__, rc); return rc; }