mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
ASoC: dapm: Move CODEC to CODEC params from the widget to the runtime
Larger CODECs may contain many several hundred widgets and which set of parameters is selected only needs to be recorded on a per DAI basis. As such move the selected CODEC to CODEC link params to be stored in the runtime rather than the DAPM widget, to save some memory. Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
4a75aae17b
commit
243bcfafcd
@ -584,9 +584,6 @@ struct snd_soc_dapm_widget {
|
||||
void *priv; /* widget specific data */
|
||||
struct regulator *regulator; /* attached regulator */
|
||||
struct pinctrl *pinctrl; /* attached pinctrl */
|
||||
const struct snd_soc_pcm_stream *params; /* params for dai links */
|
||||
unsigned int num_params; /* number of params for dai links */
|
||||
unsigned int params_select; /* currently selected param for dai link */
|
||||
|
||||
/* dapm control */
|
||||
int reg; /* negative reg = no direct dapm */
|
||||
|
@ -1130,6 +1130,8 @@ struct snd_soc_pcm_runtime {
|
||||
enum snd_soc_pcm_subclass pcm_subclass;
|
||||
struct snd_pcm_ops ops;
|
||||
|
||||
unsigned int params_select; /* currently selected param for dai link */
|
||||
|
||||
/* Dynamic PCM BE runtime data */
|
||||
struct snd_soc_dpcm_runtime dpcm[2];
|
||||
int fe_compr;
|
||||
|
@ -1018,9 +1018,10 @@ static int dapm_new_dai_link(struct snd_soc_dapm_widget *w)
|
||||
struct snd_kcontrol *kcontrol;
|
||||
struct snd_soc_dapm_context *dapm = w->dapm;
|
||||
struct snd_card *card = dapm->card->snd_card;
|
||||
struct snd_soc_pcm_runtime *rtd = w->priv;
|
||||
|
||||
/* create control for links with > 1 config */
|
||||
if (w->num_params <= 1)
|
||||
if (rtd->dai_link->num_params <= 1)
|
||||
return 0;
|
||||
|
||||
/* add kcontrol */
|
||||
@ -3617,13 +3618,15 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_soc_dapm_path *path;
|
||||
struct snd_soc_dai *source, *sink;
|
||||
struct snd_soc_pcm_runtime *rtd = w->priv;
|
||||
const struct snd_soc_pcm_stream *config = w->params + w->params_select;
|
||||
const struct snd_soc_pcm_stream *config;
|
||||
struct snd_pcm_substream substream;
|
||||
struct snd_pcm_hw_params *params = NULL;
|
||||
struct snd_pcm_runtime *runtime = NULL;
|
||||
unsigned int fmt;
|
||||
int ret;
|
||||
|
||||
config = rtd->dai_link->params + rtd->params_select;
|
||||
|
||||
if (WARN_ON(!config) ||
|
||||
WARN_ON(list_empty(&w->edges[SND_SOC_DAPM_DIR_OUT]) ||
|
||||
list_empty(&w->edges[SND_SOC_DAPM_DIR_IN])))
|
||||
@ -3772,8 +3775,9 @@ static int snd_soc_dapm_dai_link_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_soc_dapm_widget *w = snd_kcontrol_chip(kcontrol);
|
||||
struct snd_soc_pcm_runtime *rtd = w->priv;
|
||||
|
||||
ucontrol->value.enumerated.item[0] = w->params_select;
|
||||
ucontrol->value.enumerated.item[0] = rtd->params_select;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -3782,18 +3786,19 @@ static int snd_soc_dapm_dai_link_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_soc_dapm_widget *w = snd_kcontrol_chip(kcontrol);
|
||||
struct snd_soc_pcm_runtime *rtd = w->priv;
|
||||
|
||||
/* Can't change the config when widget is already powered */
|
||||
if (w->power)
|
||||
return -EBUSY;
|
||||
|
||||
if (ucontrol->value.enumerated.item[0] == w->params_select)
|
||||
if (ucontrol->value.enumerated.item[0] == rtd->params_select)
|
||||
return 0;
|
||||
|
||||
if (ucontrol->value.enumerated.item[0] >= w->num_params)
|
||||
if (ucontrol->value.enumerated.item[0] >= rtd->dai_link->num_params)
|
||||
return -EINVAL;
|
||||
|
||||
w->params_select = ucontrol->value.enumerated.item[0];
|
||||
rtd->params_select = ucontrol->value.enumerated.item[0];
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -3936,8 +3941,6 @@ snd_soc_dapm_new_dai(struct snd_soc_card *card, struct snd_soc_pcm_runtime *rtd,
|
||||
if (IS_ERR(w))
|
||||
goto outfree_kcontrol_news;
|
||||
|
||||
w->params = rtd->dai_link->params;
|
||||
w->num_params = rtd->dai_link->num_params;
|
||||
w->priv = rtd;
|
||||
|
||||
return w;
|
||||
|
Loading…
Reference in New Issue
Block a user