Commit 768a3a3b authored by Cezary Rojewski's avatar Cezary Rojewski Committed by Mark Brown

ASoC: Intel: catpt: Optimize applying user settings

Initial user settings such as volume control need to be applied only
once after stream is allocated. As prepare() operation can be invoked
multiple times during the stream's lifetime, relocate
catpt_dai_apply_usettings() and call it directly within
catpt_dai_hw_params() rather than on every catpt_dai_prepare().

catpt_dai_apply_usettings() remains unchanged.
Signed-off-by: default avatarCezary Rojewski <cezary.rojewski@intel.com>
Link: https://lore.kernel.org/r/20201116133332.8530-4-cezary.rojewski@intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 1072460a
...@@ -324,6 +324,54 @@ static void catpt_dai_shutdown(struct snd_pcm_substream *substream, ...@@ -324,6 +324,54 @@ static void catpt_dai_shutdown(struct snd_pcm_substream *substream,
snd_soc_dai_set_dma_data(dai, substream, NULL); snd_soc_dai_set_dma_data(dai, substream, NULL);
} }
static int catpt_set_dspvol(struct catpt_dev *cdev, u8 stream_id, long *ctlvol);
static int catpt_dai_apply_usettings(struct snd_soc_dai *dai,
struct catpt_stream_runtime *stream)
{
struct catpt_dev *cdev = dev_get_drvdata(dai->dev);
struct snd_soc_component *component = dai->component;
struct snd_kcontrol *pos, *kctl = NULL;
const char *name;
int ret;
u32 id = stream->info.stream_hw_id;
/* only selected streams have individual controls */
switch (id) {
case CATPT_PIN_ID_OFFLOAD1:
name = "Media0 Playback Volume";
break;
case CATPT_PIN_ID_OFFLOAD2:
name = "Media1 Playback Volume";
break;
case CATPT_PIN_ID_CAPTURE1:
name = "Mic Capture Volume";
break;
case CATPT_PIN_ID_REFERENCE:
name = "Loopback Mute";
break;
default:
return 0;
};
list_for_each_entry(pos, &component->card->snd_card->controls, list) {
if (pos->private_data == component &&
!strncmp(name, pos->id.name, sizeof(pos->id.name))) {
kctl = pos;
break;
}
}
if (!kctl)
return -ENOENT;
if (stream->template->type != CATPT_STRM_TYPE_LOOPBACK)
return catpt_set_dspvol(cdev, id, (long *)kctl->private_value);
ret = catpt_ipc_mute_loopback(cdev, id, *(bool *)kctl->private_value);
if (ret)
return CATPT_IPC_ERROR(ret);
return 0;
}
static int catpt_dai_hw_params(struct snd_pcm_substream *substream, static int catpt_dai_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params, struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai) struct snd_soc_dai *dai)
...@@ -370,6 +418,10 @@ static int catpt_dai_hw_params(struct snd_pcm_substream *substream, ...@@ -370,6 +418,10 @@ static int catpt_dai_hw_params(struct snd_pcm_substream *substream,
if (ret) if (ret)
return CATPT_IPC_ERROR(ret); return CATPT_IPC_ERROR(ret);
ret = catpt_dai_apply_usettings(dai, stream);
if (ret)
return ret;
stream->allocated = true; stream->allocated = true;
return 0; return 0;
} }
...@@ -391,54 +443,6 @@ static int catpt_dai_hw_free(struct snd_pcm_substream *substream, ...@@ -391,54 +443,6 @@ static int catpt_dai_hw_free(struct snd_pcm_substream *substream,
return 0; return 0;
} }
static int catpt_set_dspvol(struct catpt_dev *cdev, u8 stream_id, long *ctlvol);
static int catpt_dai_apply_usettings(struct snd_soc_dai *dai,
struct catpt_stream_runtime *stream)
{
struct catpt_dev *cdev = dev_get_drvdata(dai->dev);
struct snd_soc_component *component = dai->component;
struct snd_kcontrol *pos, *kctl = NULL;
const char *name;
int ret;
u32 id = stream->info.stream_hw_id;
/* only selected streams have individual controls */
switch (id) {
case CATPT_PIN_ID_OFFLOAD1:
name = "Media0 Playback Volume";
break;
case CATPT_PIN_ID_OFFLOAD2:
name = "Media1 Playback Volume";
break;
case CATPT_PIN_ID_CAPTURE1:
name = "Mic Capture Volume";
break;
case CATPT_PIN_ID_REFERENCE:
name = "Loopback Mute";
break;
default:
return 0;
};
list_for_each_entry(pos, &component->card->snd_card->controls, list) {
if (pos->private_data == component &&
!strncmp(name, pos->id.name, sizeof(pos->id.name))) {
kctl = pos;
break;
}
}
if (!kctl)
return -ENOENT;
if (stream->template->type != CATPT_STRM_TYPE_LOOPBACK)
return catpt_set_dspvol(cdev, id, (long *)kctl->private_value);
ret = catpt_ipc_mute_loopback(cdev, id, *(bool *)kctl->private_value);
if (ret)
return CATPT_IPC_ERROR(ret);
return 0;
}
static int catpt_dai_prepare(struct snd_pcm_substream *substream, static int catpt_dai_prepare(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai) struct snd_soc_dai *dai)
{ {
...@@ -458,10 +462,6 @@ static int catpt_dai_prepare(struct snd_pcm_substream *substream, ...@@ -458,10 +462,6 @@ static int catpt_dai_prepare(struct snd_pcm_substream *substream,
if (ret) if (ret)
return CATPT_IPC_ERROR(ret); return CATPT_IPC_ERROR(ret);
ret = catpt_dai_apply_usettings(dai, stream);
if (ret)
return ret;
stream->prepared = true; stream->prepared = true;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment