ASoC: soc-component: add snd_soc_component_get/put()
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Fri, 26 Jul 2019 04:49:54 +0000 (13:49 +0900)
committerMark Brown <broonie@kernel.org>
Mon, 5 Aug 2019 15:17:15 +0000 (16:17 +0100)
ALSA SoC is calling try_module_get()/module_put() based on
component->driver->module_get_upon_open.
To keep simple and readable code, we should create its function.
This patch adds new snd_soc_component_get/put().

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

index a97d499e5d7ac9a5646d7db5ac397d35ebf3d60a..a76cadf49a164ad08c26436b10173feddcf8e35f 100644 (file)
@@ -287,6 +287,19 @@ void snd_soc_component_init_regmap(struct snd_soc_component *component,
 void snd_soc_component_exit_regmap(struct snd_soc_component *component);
 #endif
 
+#define snd_soc_component_module_get_when_probe(component)\
+       snd_soc_component_module_get(component, 0)
+#define snd_soc_component_module_get_when_open(component)      \
+       snd_soc_component_module_get(component, 1)
+int snd_soc_component_module_get(struct snd_soc_component *component,
+                                int upon_open);
+#define snd_soc_component_module_put_when_remove(component)    \
+       snd_soc_component_module_put(component, 0)
+#define snd_soc_component_module_put_when_close(component)     \
+       snd_soc_component_module_put(component, 1)
+void snd_soc_component_module_put(struct snd_soc_component *component,
+                                 int upon_open);
+
 static inline void snd_soc_component_set_drvdata(struct snd_soc_component *c,
                                                 void *data)
 {
index e19f78bfb919a196b49a0997730d82618386b369..ac2d7bd5d84427617a84d9666909052fd0182033 100644 (file)
@@ -5,6 +5,7 @@
 // Copyright (C) 2019 Renesas Electronics Corp.
 // Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
 //
+#include <linux/module.h>
 #include <sound/soc.h>
 
 /**
@@ -267,3 +268,20 @@ int snd_soc_component_set_jack(struct snd_soc_component *component,
        return -ENOTSUPP;
 }
 EXPORT_SYMBOL_GPL(snd_soc_component_set_jack);
+
+int snd_soc_component_module_get(struct snd_soc_component *component,
+                                int upon_open)
+{
+       if (component->driver->module_get_upon_open == !!upon_open &&
+           !try_module_get(component->dev->driver->owner))
+               return -ENODEV;
+
+       return 0;
+}
+
+void snd_soc_component_module_put(struct snd_soc_component *component,
+                                 int upon_open)
+{
+       if (component->driver->module_get_upon_open == !!upon_open)
+               module_put(component->dev->driver->owner);
+}
index dc3e45547da217dae7ad213a11ecca97fe376adb..9ba19efcc56c9904190ac4b39d8e6f13337bc707 100644 (file)
@@ -926,8 +926,7 @@ static void soc_cleanup_component(struct snd_soc_component *component)
        snd_soc_dapm_free(snd_soc_component_get_dapm(component));
        soc_cleanup_component_debugfs(component);
        component->card = NULL;
-       if (!component->driver->module_get_upon_open)
-               module_put(component->dev->driver->owner);
+       snd_soc_component_module_put_when_close(component);
 }
 
 static void soc_remove_component(struct snd_soc_component *component)
@@ -1255,9 +1254,9 @@ static int soc_probe_component(struct snd_soc_card *card,
                return 0;
        }
 
-       if (!component->driver->module_get_upon_open &&
-           !try_module_get(component->dev->driver->owner))
-               return -ENODEV;
+       ret = snd_soc_component_module_get_when_probe(component);
+       if (ret < 0)
+               return ret;
 
        component->card = card;
        dapm->card = card;
index 1e6c4e226933aae0b85e7d97908597d06f536c21..5fef18507286499b52c5c7fa2d50854c5f57ed99 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/delay.h>
 #include <linux/pinctrl/consumer.h>
 #include <linux/pm_runtime.h>
-#include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/workqueue.h>
 #include <linux/export.h>
@@ -440,12 +439,12 @@ static int soc_pcm_components_open(struct snd_pcm_substream *substream,
                component = rtdcom->component;
                *last = component;
 
-               if (component->driver->module_get_upon_open &&
-                   !try_module_get(component->dev->driver->owner)) {
+               ret = snd_soc_component_module_get_when_open(component);
+               if (ret < 0) {
                        dev_err(component->dev,
                                "ASoC: can't get module %s\n",
                                component->name);
-                       return -ENODEV;
+                       return ret;
                }
 
                if (!component->driver->ops ||
@@ -481,8 +480,7 @@ static int soc_pcm_components_close(struct snd_pcm_substream *substream,
                    component->driver->ops->close)
                        component->driver->ops->close(substream);
 
-               if (component->driver->module_get_upon_open)
-                       module_put(component->dev->driver->owner);
+               snd_soc_component_module_put_when_close(component);
        }
 
        return 0;