ASoC: msm: qdsp6v2: updating downmix/pan_scale control type to bytes

Change the downmix/pan_scale control data type from integer to bytes
to make it compatible across different archs.

Change-Id: I9282673dc1e124185d7c545206bba31966b803dc
Signed-off-by: Varun Balaraj <varunb@codeaurora.org>
This commit is contained in:
Varun Balaraj 2017-09-22 20:04:49 +05:30
parent 7200f000f9
commit 0a1c253171

View file

@ -1607,10 +1607,8 @@ done:
static int msm_pcm_playback_pan_scale_ctl_info(struct snd_kcontrol *kcontrol, static int msm_pcm_playback_pan_scale_ctl_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo) struct snd_ctl_elem_info *uinfo)
{ {
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
uinfo->count = 128; uinfo->count = sizeof(struct asm_stream_pan_ctrl_params);
uinfo->value.integer.min = 0;
uinfo->value.integer.max = 0xFFFFFFFF;
return 0; return 0;
} }
@ -1626,7 +1624,8 @@ static int msm_pcm_playback_pan_scale_ctl_put(struct snd_kcontrol *kcontrol,
struct snd_pcm_substream *substream; struct snd_pcm_substream *substream;
struct msm_audio *prtd; struct msm_audio *prtd;
struct asm_stream_pan_ctrl_params pan_param; struct asm_stream_pan_ctrl_params pan_param;
char *usr_value = NULL;
uint32_t *gain_ptr = NULL;
if (!usr_info) { if (!usr_info) {
pr_err("%s: usr_info is null\n", __func__); pr_err("%s: usr_info is null\n", __func__);
ret = -EINVAL; ret = -EINVAL;
@ -1662,54 +1661,71 @@ static int msm_pcm_playback_pan_scale_ctl_put(struct snd_kcontrol *kcontrol,
ret = -EINVAL; ret = -EINVAL;
goto done; goto done;
} }
pan_param.num_output_channels = usr_value = (char *) ucontrol->value.bytes.data;
ucontrol->value.integer.value[len++]; if (!usr_value) {
pr_err("%s ucontrol data is null\n", __func__);
ret = -EINVAL;
goto done;
}
memcpy(&pan_param.num_output_channels, &usr_value[len],
sizeof(pan_param.num_output_channels));
len += sizeof(pan_param.num_output_channels);
if (pan_param.num_output_channels > if (pan_param.num_output_channels >
PCM_FORMAT_MAX_NUM_CHANNEL) { PCM_FORMAT_MAX_NUM_CHANNEL) {
ret = -EINVAL; ret = -EINVAL;
goto done; goto done;
} }
pan_param.num_input_channels = memcpy(&pan_param.num_input_channels, &usr_value[len],
ucontrol->value.integer.value[len++]; sizeof(pan_param.num_input_channels));
len += sizeof(pan_param.num_input_channels);
if (pan_param.num_input_channels > if (pan_param.num_input_channels >
PCM_FORMAT_MAX_NUM_CHANNEL) { PCM_FORMAT_MAX_NUM_CHANNEL) {
ret = -EINVAL; ret = -EINVAL;
goto done; goto done;
} }
if (ucontrol->value.integer.value[len++]) { if (usr_value[len++]) {
for (i = 0; i < pan_param.num_output_channels; i++) { memcpy(pan_param.output_channel_map, &usr_value[len],
pan_param.output_channel_map[i] = (pan_param.num_output_channels *
ucontrol->value.integer.value[len++]; sizeof(pan_param.output_channel_map[0])));
} len += (pan_param.num_output_channels *
sizeof(pan_param.output_channel_map[0]));
} }
if (ucontrol->value.integer.value[len++]) { if (usr_value[len++]) {
for (i = 0; i < pan_param.num_input_channels; i++) { memcpy(pan_param.input_channel_map, &usr_value[len],
pan_param.input_channel_map[i] = (pan_param.num_input_channels *
ucontrol->value.integer.value[len++]; sizeof(pan_param.input_channel_map[0])));
} len += (pan_param.num_input_channels *
sizeof(pan_param.input_channel_map[0]));
} }
if (ucontrol->value.integer.value[len++]) { if (usr_value[len++]) {
gain_ptr = (uint32_t *) &usr_value[len];
for (i = 0; i < pan_param.num_output_channels * for (i = 0; i < pan_param.num_output_channels *
pan_param.num_input_channels; i++) { pan_param.num_input_channels; i++) {
pan_param.gain[i] = pan_param.gain[i] =
!(ucontrol->value.integer.value[len++] > 0) ? !(gain_ptr[i] > 0) ?
0 : 2 << 13; 0 : 2 << 13;
len += sizeof(pan_param.gain[i]);
} }
len += (pan_param.num_input_channels *
pan_param.num_output_channels * sizeof(pan_param.gain[0]));
} }
ret = q6asm_set_mfc_panning_params(prtd->audio_client, ret = q6asm_set_mfc_panning_params(prtd->audio_client,
&pan_param); &pan_param);
len -= pan_param.num_output_channels * len -= pan_param.num_output_channels *
pan_param.num_input_channels; pan_param.num_input_channels * sizeof(pan_param.gain[0]);
for (i = 0; i < pan_param.num_output_channels * if (gain_ptr) {
pan_param.num_input_channels; i++) { for (i = 0; i < pan_param.num_output_channels *
/* pan_param.num_input_channels; i++) {
* The data userspace passes is already in Q14 format. /*
* For volume gain is in Q28. * The data userspace passes is already in Q14 format.
*/ * For volume gain is in Q28.
pan_param.gain[i] = */
ucontrol->value.integer.value[len++] << 14; pan_param.gain[i] =
(gain_ptr[i]) << 14;
len += sizeof(pan_param.gain[i]);
}
} }
ret = q6asm_set_vol_ctrl_gain_pair(prtd->audio_client, ret = q6asm_set_vol_ctrl_gain_pair(prtd->audio_client,
&pan_param); &pan_param);
@ -1794,10 +1810,8 @@ static int msm_pcm_playback_dnmix_ctl_get(struct snd_kcontrol *kcontrol,
static int msm_pcm_playback_dnmix_ctl_info(struct snd_kcontrol *kcontrol, static int msm_pcm_playback_dnmix_ctl_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo) struct snd_ctl_elem_info *uinfo)
{ {
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
uinfo->count = 128; uinfo->count = sizeof(struct asm_stream_pan_ctrl_params);
uinfo->value.integer.min = 0;
uinfo->value.integer.max = 0xFFFFFFFF;
return 0; return 0;
} }
@ -1806,7 +1820,6 @@ static int msm_pcm_playback_dnmix_ctl_put(struct snd_kcontrol *kcontrol,
{ {
int ret = 0; int ret = 0;
int len = 0; int len = 0;
int i = 0;
struct snd_soc_component *usr_info = snd_kcontrol_chip(kcontrol); struct snd_soc_component *usr_info = snd_kcontrol_chip(kcontrol);
struct snd_soc_platform *platform; struct snd_soc_platform *platform;
@ -1814,8 +1827,8 @@ static int msm_pcm_playback_dnmix_ctl_put(struct snd_kcontrol *kcontrol,
struct snd_pcm_substream *substream; struct snd_pcm_substream *substream;
struct msm_audio *prtd; struct msm_audio *prtd;
struct asm_stream_pan_ctrl_params dnmix_param; struct asm_stream_pan_ctrl_params dnmix_param;
char *usr_value;
int be_id = ucontrol->value.integer.value[len++]; int be_id = 0;
int stream_id = 0; int stream_id = 0;
if (!usr_info) { if (!usr_info) {
@ -1851,40 +1864,51 @@ static int msm_pcm_playback_dnmix_ctl_put(struct snd_kcontrol *kcontrol,
ret = -EINVAL; ret = -EINVAL;
goto done; goto done;
} }
usr_value = (char *) ucontrol->value.bytes.data;
if (!usr_value) {
pr_err("%s usrvalue is null\n", __func__);
goto done;
}
memcpy(&be_id, usr_value, sizeof(be_id));
len += sizeof(be_id);
stream_id = prtd->audio_client->session; stream_id = prtd->audio_client->session;
dnmix_param.num_output_channels = memcpy(&dnmix_param.num_output_channels, &usr_value[len],
ucontrol->value.integer.value[len++]; sizeof(dnmix_param.num_output_channels));
len += sizeof(dnmix_param.num_output_channels);
if (dnmix_param.num_output_channels > if (dnmix_param.num_output_channels >
PCM_FORMAT_MAX_NUM_CHANNEL) { PCM_FORMAT_MAX_NUM_CHANNEL) {
ret = -EINVAL; ret = -EINVAL;
goto done; goto done;
} }
dnmix_param.num_input_channels = memcpy(&dnmix_param.num_input_channels, &usr_value[len],
ucontrol->value.integer.value[len++]; sizeof(dnmix_param.num_input_channels));
len += sizeof(dnmix_param.num_input_channels);
if (dnmix_param.num_input_channels > if (dnmix_param.num_input_channels >
PCM_FORMAT_MAX_NUM_CHANNEL) { PCM_FORMAT_MAX_NUM_CHANNEL) {
ret = -EINVAL; ret = -EINVAL;
goto done; goto done;
} }
if (usr_value[len++]) {
if (ucontrol->value.integer.value[len++]) { memcpy(dnmix_param.output_channel_map, &usr_value[len],
for (i = 0; i < dnmix_param.num_output_channels; i++) { (dnmix_param.num_output_channels *
dnmix_param.output_channel_map[i] = sizeof(dnmix_param.output_channel_map[0])));
ucontrol->value.integer.value[len++]; len += (dnmix_param.num_output_channels *
} sizeof(dnmix_param.output_channel_map[0]));
} }
if (ucontrol->value.integer.value[len++]) { if (usr_value[len++]) {
for (i = 0; i < dnmix_param.num_input_channels; i++) { memcpy(dnmix_param.input_channel_map, &usr_value[len],
dnmix_param.input_channel_map[i] = (dnmix_param.num_input_channels *
ucontrol->value.integer.value[len++]; sizeof(dnmix_param.input_channel_map[0])));
} len += (dnmix_param.num_input_channels *
sizeof(dnmix_param.input_channel_map[0]));
} }
if (ucontrol->value.integer.value[len++]) { if (usr_value[len++]) {
for (i = 0; i < dnmix_param.num_output_channels * memcpy(dnmix_param.gain, (uint32_t *) &usr_value[len],
dnmix_param.num_input_channels; i++) { (dnmix_param.num_input_channels *
dnmix_param.gain[i] = dnmix_param.num_output_channels *
ucontrol->value.integer.value[len++]; sizeof(dnmix_param.gain[0])));
} len += (dnmix_param.num_input_channels *
dnmix_param.num_output_channels * sizeof(dnmix_param.gain[0]));
} }
msm_routing_set_downmix_control_data(be_id, msm_routing_set_downmix_control_data(be_id,
stream_id, stream_id,