ASoC: Add a component fixup_controls callback

A card level fixup_controls callback was added in:

commit df4d27b19b ("ASoC: Introduce 'fixup_controls' card method")

This allowed the machine driver to take actions after all the
card controls have been added. However, there are times when a
codec driver would also want to do things like obtain references
to controls for later use, which require all the controls to be
present. Add a component level fixup_controls callback, echoing
the card level option.

Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Link: https://patch.msgid.link/20260721143636.361814-6-ckeepax@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Charles Keepax 2026-07-21 15:36:34 +01:00 committed by Mark Brown
parent 050406cbd6
commit 3e81e2fb21
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
3 changed files with 17 additions and 0 deletions

View File

@ -78,6 +78,7 @@ struct snd_soc_component_driver {
unsigned int num_dapm_routes;
int (*probe)(struct snd_soc_component *component);
int (*fixup_controls)(struct snd_soc_component *component);
void (*remove)(struct snd_soc_component *component);
int (*suspend)(struct snd_soc_component *component);
int (*resume)(struct snd_soc_component *component);
@ -380,6 +381,7 @@ void snd_soc_component_suspend(struct snd_soc_component *component);
void snd_soc_component_resume(struct snd_soc_component *component);
int snd_soc_component_is_suspended(struct snd_soc_component *component);
int snd_soc_component_probe(struct snd_soc_component *component);
int snd_soc_component_fixup_controls(struct snd_soc_component *component);
void snd_soc_component_remove(struct snd_soc_component *component);
int snd_soc_component_of_xlate_dai_id(struct snd_soc_component *component,
struct device_node *ep);

View File

@ -310,6 +310,16 @@ int snd_soc_component_probe(struct snd_soc_component *component)
return soc_component_ret(component, ret);
}
int snd_soc_component_fixup_controls(struct snd_soc_component *component)
{
int ret = 0;
if (component->driver->fixup_controls)
ret = component->driver->fixup_controls(component);
return soc_component_ret(component, ret);
}
void snd_soc_component_remove(struct snd_soc_component *component)
{
if (component->driver->remove)

View File

@ -2162,6 +2162,11 @@ static int snd_soc_bind_card(struct snd_soc_card *card)
goto probe_end;
snd_soc_dapm_new_widgets(card);
for_each_card_components(card, component) {
ret = snd_soc_component_fixup_controls(component);
if (ret < 0)
goto probe_end;
}
snd_soc_card_fixup_controls(card);
ret = snd_card_register(card->snd_card);