ASoC: soc-dai.h: merge DAI call back functions into ops
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tue, 8 Aug 2023 22:54:50 +0000 (22:54 +0000)
committerMark Brown <broonie@kernel.org>
Mon, 14 Aug 2023 12:09:13 +0000 (13:09 +0100)
snd_soc_dai_driver has .ops for call back functions (A), but it also
has other call back functions (B). It is duplicated and confusable.

struct snd_soc_dai_driver {
...
 ^ int (*probe)(...);
 | int (*remove)(...);
(B) int (*compress_new)(...);
 | int (*pcm_new)(...);
 v ...
(A) const struct snd_soc_dai_ops *ops;
...
}

This patch merges (B) into (A).

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://lore.kernel.org/r/87v8dpb0w6.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/soc-dai.h
sound/soc/generic/audio-graph-card.c
sound/soc/soc-core.c
sound/soc/soc-dai.c

index a33d803..85f897f 100644 (file)
@@ -274,6 +274,15 @@ int snd_soc_dai_compr_get_metadata(struct snd_soc_dai *dai,
 const char *snd_soc_dai_name_get(struct snd_soc_dai *dai);
 
 struct snd_soc_dai_ops {
+       /* DAI driver callbacks */
+       int (*probe)(struct snd_soc_dai *dai);
+       int (*remove)(struct snd_soc_dai *dai);
+       /* compress dai */
+       int (*compress_new)(struct snd_soc_pcm_runtime *rtd, int num);
+       /* Optional Callback used at pcm creation*/
+       int (*pcm_new)(struct snd_soc_pcm_runtime *rtd,
+                      struct snd_soc_dai *dai);
+
        /*
         * DAI clocking configuration, all optional.
         * Called by soc_card drivers, normally in their hw_params.
@@ -355,6 +364,10 @@ struct snd_soc_dai_ops {
        u64 *auto_selectable_formats;
        int num_auto_selectable_formats;
 
+       /* probe ordering - for components with runtime dependencies */
+       int probe_order;
+       int remove_order;
+
        /* bit field */
        unsigned int no_capture_mute:1;
 };
index 0b8258b..13693ef 100644 (file)
@@ -60,7 +60,7 @@ static bool soc_component_is_pcm(struct snd_soc_dai_link_component *dlc)
        struct snd_soc_dai *dai = snd_soc_find_dai_with_mutex(dlc);
 
        if (dai && (dai->component->driver->pcm_construct ||
-                   dai->driver->pcm_new))
+                   (dai->driver->ops && dai->driver->ops->pcm_new)))
                return true;
 
        return false;
index a5b96c1..7dbf37e 100644 (file)
@@ -2510,6 +2510,7 @@ struct snd_soc_dai *snd_soc_register_dai(struct snd_soc_component *component,
 {
        struct device *dev = component->dev;
        struct snd_soc_dai *dai;
+       struct snd_soc_dai_ops *ops; /* REMOVE ME */
 
        lockdep_assert_held(&client_mutex);
 
@@ -2538,6 +2539,30 @@ struct snd_soc_dai *snd_soc_register_dai(struct snd_soc_component *component,
        if (!dai->name)
                return NULL;
 
+       /* REMOVE ME */
+       if (dai_drv->probe              ||
+           dai_drv->remove             ||
+           dai_drv->compress_new       ||
+           dai_drv->pcm_new            ||
+           dai_drv->probe_order        ||
+           dai_drv->remove_order) {
+
+               ops = devm_kzalloc(dev, sizeof(struct snd_soc_dai_ops), GFP_KERNEL);
+               if (!ops)
+                       return NULL;
+               if (dai_drv->ops)
+                       memcpy(ops, dai_drv->ops, sizeof(struct snd_soc_dai_ops));
+
+               ops->probe              = dai_drv->probe;
+               ops->remove             = dai_drv->remove;
+               ops->compress_new       = dai_drv->compress_new;
+               ops->pcm_new            = dai_drv->pcm_new;
+               ops->probe_order        = dai_drv->probe_order;
+               ops->remove_order       = dai_drv->remove_order;
+
+               dai_drv->ops = ops;
+       }
+
        dai->component = component;
        dai->dev = dev;
        dai->driver = dai_drv;
index 73a97ac..3f33f06 100644 (file)
@@ -460,8 +460,9 @@ int snd_soc_dai_compress_new(struct snd_soc_dai *dai,
                             struct snd_soc_pcm_runtime *rtd, int num)
 {
        int ret = -ENOTSUPP;
-       if (dai->driver->compress_new)
-               ret = dai->driver->compress_new(rtd, num);
+       if (dai->driver->ops &&
+           dai->driver->ops->compress_new)
+               ret = dai->driver->ops->compress_new(rtd, num);
        return soc_dai_ret(dai, ret);
 }
 
@@ -545,19 +546,20 @@ int snd_soc_pcm_dai_probe(struct snd_soc_pcm_runtime *rtd, int order)
        int i;
 
        for_each_rtd_dais(rtd, i, dai) {
-               if (dai->driver->probe_order != order)
-                       continue;
-
                if (dai->probed)
                        continue;
 
-               if (dai->driver->probe) {
-                       int ret = dai->driver->probe(dai);
+               if (dai->driver->ops) {
+                       if (dai->driver->ops->probe_order != order)
+                               continue;
 
-                       if (ret < 0)
-                               return soc_dai_ret(dai, ret);
-               }
+                       if (dai->driver->ops->probe) {
+                               int ret = dai->driver->ops->probe(dai);
 
+                               if (ret < 0)
+                                       return soc_dai_ret(dai, ret);
+                       }
+               }
                dai->probed = 1;
        }
 
@@ -570,16 +572,19 @@ int snd_soc_pcm_dai_remove(struct snd_soc_pcm_runtime *rtd, int order)
        int i, r, ret = 0;
 
        for_each_rtd_dais(rtd, i, dai) {
-               if (dai->driver->remove_order != order)
+               if (!dai->probed)
                        continue;
 
-               if (dai->probed &&
-                   dai->driver->remove) {
-                       r = dai->driver->remove(dai);
-                       if (r < 0)
-                               ret = r; /* use last error */
-               }
+               if (dai->driver->ops) {
+                       if (dai->driver->ops->remove_order != order)
+                               continue;
 
+                       if (dai->driver->ops->remove) {
+                               r = dai->driver->ops->remove(dai);
+                               if (r < 0)
+                                       ret = r; /* use last error */
+                       }
+               }
                dai->probed = 0;
        }
 
@@ -592,8 +597,9 @@ int snd_soc_pcm_dai_new(struct snd_soc_pcm_runtime *rtd)
        int i;
 
        for_each_rtd_dais(rtd, i, dai) {
-               if (dai->driver->pcm_new) {
-                       int ret = dai->driver->pcm_new(rtd, dai);
+               if (dai->driver->ops &&
+                   dai->driver->ops->pcm_new) {
+                       int ret = dai->driver->ops->pcm_new(rtd, dai);
                        if (ret < 0)
                                return soc_dai_ret(dai, ret);
                }