]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ASoC: Add a component fixup_controls callback
authorCharles Keepax <ckeepax@opensource.cirrus.com>
Tue, 21 Jul 2026 14:36:34 +0000 (15:36 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 27 Jul 2026 17:47:07 +0000 (18:47 +0100)
A card level fixup_controls callback was added in:

commit df4d27b19b89 ("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>
include/sound/soc-component.h
sound/soc/soc-component.c
sound/soc/soc-core.c

index aa423865dbe7c2e21e7125378ccb2e73b725947b..4b7d7954953dbcc11a1632ebd9d27e30b9a43168 100644 (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);
index 21492d15833f7735415b6b9971897c021529370d..2ce24513fac5da8e874d6b9f9919b8b81bcf886c 100644 (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)
index 7817beea5b3bc168ffd5376e9869bbeea4ead3ae..44f9bb4473f554f0597f62ff3de6922eedb4a856 100644 (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);