Merge "ASoC: msm: qdsp6v2: Support app type for NOIRQ"
This commit is contained in:
commit
74efdfc1b9
1 changed files with 183 additions and 0 deletions
|
@ -836,6 +836,182 @@ static int msm_pcm_add_fe_topology_control(struct snd_soc_pcm_runtime *rtd)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int msm_pcm_playback_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
u64 fe_id = kcontrol->private_value;
|
||||
int session_type = SESSION_TYPE_RX;
|
||||
int be_id = ucontrol->value.integer.value[3];
|
||||
int ret = 0;
|
||||
int app_type;
|
||||
int acdb_dev_id;
|
||||
int sample_rate = 48000;
|
||||
|
||||
app_type = ucontrol->value.integer.value[0];
|
||||
acdb_dev_id = ucontrol->value.integer.value[1];
|
||||
if (ucontrol->value.integer.value[2] != 0)
|
||||
sample_rate = ucontrol->value.integer.value[2];
|
||||
|
||||
ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type,
|
||||
be_id, app_type,
|
||||
acdb_dev_id, sample_rate);
|
||||
if (ret < 0)
|
||||
pr_err("%s: msm_pcm_playback_app_type_cfg_ctl_put failed, err %d\n",
|
||||
__func__, ret);
|
||||
|
||||
pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n",
|
||||
__func__, fe_id, session_type, be_id,
|
||||
app_type, acdb_dev_id, sample_rate);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int msm_pcm_playback_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
u64 fe_id = kcontrol->private_value;
|
||||
int session_type = SESSION_TYPE_RX;
|
||||
int be_id = ucontrol->value.integer.value[3];
|
||||
int ret = 0;
|
||||
int app_type;
|
||||
int acdb_dev_id;
|
||||
int sample_rate;
|
||||
|
||||
ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type,
|
||||
be_id, &app_type,
|
||||
&acdb_dev_id,
|
||||
&sample_rate);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: msm_pcm_playback_app_type_cfg_ctl_get failed, err: %d\n",
|
||||
__func__, ret);
|
||||
goto done;
|
||||
}
|
||||
|
||||
ucontrol->value.integer.value[0] = app_type;
|
||||
ucontrol->value.integer.value[1] = acdb_dev_id;
|
||||
ucontrol->value.integer.value[2] = sample_rate;
|
||||
|
||||
pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fe_id, session_type, be_id,
|
||||
app_type, acdb_dev_id, sample_rate);
|
||||
done:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int msm_pcm_capture_app_type_cfg_ctl_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
u64 fe_id = kcontrol->private_value;
|
||||
int session_type = SESSION_TYPE_TX;
|
||||
int be_id = ucontrol->value.integer.value[3];
|
||||
int ret = 0;
|
||||
int app_type;
|
||||
int acdb_dev_id;
|
||||
int sample_rate = 48000;
|
||||
|
||||
app_type = ucontrol->value.integer.value[0];
|
||||
acdb_dev_id = ucontrol->value.integer.value[1];
|
||||
if (ucontrol->value.integer.value[2] != 0)
|
||||
sample_rate = ucontrol->value.integer.value[2];
|
||||
|
||||
ret = msm_pcm_routing_reg_stream_app_type_cfg(fe_id, session_type,
|
||||
be_id, app_type,
|
||||
acdb_dev_id, sample_rate);
|
||||
if (ret < 0)
|
||||
pr_err("%s: msm_pcm_capture_app_type_cfg_ctl_put failed, err: %d\n",
|
||||
__func__, ret);
|
||||
|
||||
pr_debug("%s: fe_id- %llu session_type- %d be_id- %d app_type- %d acdb_dev_id- %d sample_rate- %d\n",
|
||||
__func__, fe_id, session_type, be_id,
|
||||
app_type, acdb_dev_id, sample_rate);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int msm_pcm_capture_app_type_cfg_ctl_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
u64 fe_id = kcontrol->private_value;
|
||||
int session_type = SESSION_TYPE_TX;
|
||||
int be_id = ucontrol->value.integer.value[3];
|
||||
int ret = 0;
|
||||
int app_type;
|
||||
int acdb_dev_id;
|
||||
int sample_rate;
|
||||
|
||||
ret = msm_pcm_routing_get_stream_app_type_cfg(fe_id, session_type,
|
||||
be_id, &app_type,
|
||||
&acdb_dev_id,
|
||||
&sample_rate);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: msm_pcm_capture_app_type_cfg_ctl_get failed, err: %d\n",
|
||||
__func__, ret);
|
||||
goto done;
|
||||
}
|
||||
|
||||
ucontrol->value.integer.value[0] = app_type;
|
||||
ucontrol->value.integer.value[1] = acdb_dev_id;
|
||||
ucontrol->value.integer.value[2] = sample_rate;
|
||||
pr_debug("%s: fedai_id %llu, session_type %d, be_id %d, app_type %d, acdb_dev_id %d, sample_rate %d\n",
|
||||
__func__, fe_id, session_type, be_id,
|
||||
app_type, acdb_dev_id, sample_rate);
|
||||
done:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int msm_pcm_add_app_type_controls(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_pcm *pcm = rtd->pcm;
|
||||
struct snd_pcm_usr *app_type_info;
|
||||
struct snd_kcontrol *kctl;
|
||||
const char *playback_mixer_ctl_name = "Audio Stream";
|
||||
const char *capture_mixer_ctl_name = "Audio Stream Capture";
|
||||
const char *deviceNo = "NN";
|
||||
const char *suffix = "App Type Cfg";
|
||||
int ctl_len, ret = 0;
|
||||
|
||||
if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) {
|
||||
ctl_len = strlen(playback_mixer_ctl_name) + 1 +
|
||||
strlen(deviceNo) + 1 +
|
||||
strlen(suffix) + 1;
|
||||
pr_debug("%s: Playback app type cntrl add\n", __func__);
|
||||
ret = snd_pcm_add_usr_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK,
|
||||
NULL, 1, ctl_len, rtd->dai_link->be_id,
|
||||
&app_type_info);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: playback app type cntrl add failed, err: %d\n",
|
||||
__func__, ret);
|
||||
return ret;
|
||||
}
|
||||
kctl = app_type_info->kctl;
|
||||
snprintf(kctl->id.name, ctl_len, "%s %d %s",
|
||||
playback_mixer_ctl_name, rtd->pcm->device, suffix);
|
||||
kctl->put = msm_pcm_playback_app_type_cfg_ctl_put;
|
||||
kctl->get = msm_pcm_playback_app_type_cfg_ctl_get;
|
||||
}
|
||||
|
||||
if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) {
|
||||
ctl_len = strlen(capture_mixer_ctl_name) + 1 +
|
||||
strlen(deviceNo) + 1 + strlen(suffix) + 1;
|
||||
pr_debug("%s: Capture app type cntrl add\n", __func__);
|
||||
ret = snd_pcm_add_usr_ctls(pcm, SNDRV_PCM_STREAM_CAPTURE,
|
||||
NULL, 1, ctl_len, rtd->dai_link->be_id,
|
||||
&app_type_info);
|
||||
if (ret < 0) {
|
||||
pr_err("%s: capture app type cntrl add failed, err: %d\n",
|
||||
__func__, ret);
|
||||
return ret;
|
||||
}
|
||||
kctl = app_type_info->kctl;
|
||||
snprintf(kctl->id.name, ctl_len, "%s %d %s",
|
||||
capture_mixer_ctl_name, rtd->pcm->device, suffix);
|
||||
kctl->put = msm_pcm_capture_app_type_cfg_ctl_put;
|
||||
kctl->get = msm_pcm_capture_app_type_cfg_ctl_get;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_card *card = rtd->card->snd_card;
|
||||
|
@ -862,6 +1038,13 @@ static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd)
|
|||
pr_err("%s: Could not add pcm topology control %d\n",
|
||||
__func__, ret);
|
||||
}
|
||||
|
||||
ret = msm_pcm_add_app_type_controls(rtd);
|
||||
if (ret) {
|
||||
pr_err("%s: Could not add app type controls failed %d\n",
|
||||
__func__, ret);
|
||||
}
|
||||
|
||||
pcm->nonatomic = true;
|
||||
exit:
|
||||
return ret;
|
||||
|
|
Loading…
Add table
Reference in a new issue