ASoC: soc-core: add new pcm_construct/pcm_destruct
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Wed, 2 Oct 2019 05:30:59 +0000 (14:30 +0900)
committerMark Brown <broonie@kernel.org>
Tue, 8 Oct 2019 12:40:22 +0000 (13:40 +0100)
Current snd_soc_component_driver has pcm_new/pcm_free, but,
it doesn't have "component" at parameter.
Thus, each callback can't know it is called for which component.
Each callback currently is getting "component" by using
snd_soc_rtdcom_lookup() with driver name.

It works today, but, will not work in the future if we support multi
CPU/Codec/Platform, because 1 rtd might have multiple same driver
name component.

To solve this issue, each callback need to be called with component.
This patch adds new pcm_construct/pcm_destruct with "component"
parameter.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://lore.kernel.org/r/87sgobaf3g.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/soc-component.h
sound/soc/soc-component.c

index a6a3b696d5b06de9e27519167776ca64b3b888fa..aa2e2cbc1ee5a44979e8adcdd7a33ca573df384c 100644 (file)
@@ -46,10 +46,16 @@ struct snd_soc_component_driver {
        int (*write)(struct snd_soc_component *component,
                     unsigned int reg, unsigned int val);
 
+       /* remove me */
        /* pcm creation and destruction */
        int (*pcm_new)(struct snd_soc_pcm_runtime *rtd);
        void (*pcm_free)(struct snd_pcm *pcm);
 
+       int (*pcm_construct)(struct snd_soc_component *component,
+                            struct snd_soc_pcm_runtime *rtd);
+       void (*pcm_destruct)(struct snd_soc_component *component,
+                            struct snd_pcm *pcm);
+
        /* component wide operations */
        int (*set_sysclk)(struct snd_soc_component *component,
                          int clk_id, int source, unsigned int freq, int dir);
index 2d9cb763e63a91406f9eeffb9a025f6ac1afdbb9..d2b052ac88cd97e2eef001d116aa7edf9811cc3b 100644 (file)
@@ -588,6 +588,13 @@ int snd_soc_pcm_component_new(struct snd_pcm *pcm)
        for_each_rtdcom(rtd, rtdcom) {
                component = rtdcom->component;
 
+               if (component->driver->pcm_construct) {
+                       ret = component->driver->pcm_construct(component, rtd);
+                       if (ret < 0)
+                               return ret;
+               }
+
+               /* remove me */
                if (component->driver->pcm_new) {
                        ret = component->driver->pcm_new(rtd);
                        if (ret < 0)
@@ -607,6 +614,10 @@ void snd_soc_pcm_component_free(struct snd_pcm *pcm)
        for_each_rtdcom(rtd, rtdcom) {
                component = rtdcom->component;
 
+               if (component->driver->pcm_destruct)
+                       component->driver->pcm_destruct(component, pcm);
+
+               /* remove me */
                if (component->driver->pcm_free)
                        component->driver->pcm_free(pcm);
        }