ASoC: soc-core: add soc_setup_card_name()
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Wed, 2 Oct 2019 05:22:49 +0000 (14:22 +0900)
committerMark Brown <broonie@kernel.org>
Thu, 3 Oct 2019 13:36:20 +0000 (14:36 +0100)
ALSA needs to setup shortname, longname, and driver.
These methods are very similar.
This patch adds new soc_setup_card_name() and setup these.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://lore.kernel.org/r/874l0rbu1i.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/soc-core.c

index a34000d088560f9f8257bd09ecfd4ec624000fec..f79ffc4b5b5744c5a8355305eee125be4934eff7 100644 (file)
@@ -1905,6 +1905,42 @@ match:
        }
 }
 
+#define soc_setup_card_name(name, name1, name2, norm)          \
+       __soc_setup_card_name(name, sizeof(name), name1, name2, norm)
+static void __soc_setup_card_name(char *name, int len,
+                                 const char *name1, const char *name2,
+                                 int normalization)
+{
+       int i;
+
+       snprintf(name, len, "%s", name1 ? name1 : name2);
+
+       if (!normalization)
+               return;
+
+       /*
+        * Name normalization
+        *
+        * The driver name is somewhat special, as it's used as a key for
+        * searches in the user-space.
+        *
+        * ex)
+        *      "abcd??efg" -> "abcd__efg"
+        */
+       for (i = 0; i < len; i++) {
+               switch (name[i]) {
+               case '_':
+               case '-':
+               case '\0':
+                       break;
+               default:
+                       if (!isalnum(name[i]))
+                               name[i] = '_';
+                       break;
+               }
+       }
+}
+
 static void soc_cleanup_card_resources(struct snd_soc_card *card)
 {
        struct snd_soc_dai_link *link, *_link;
@@ -2070,24 +2106,12 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
        /* try to set some sane longname if DMI is available */
        snd_soc_set_dmi_name(card, NULL);
 
-       snprintf(card->snd_card->shortname, sizeof(card->snd_card->shortname),
-                "%s", card->name);
-       snprintf(card->snd_card->longname, sizeof(card->snd_card->longname),
-                "%s", card->long_name ? card->long_name : card->name);
-       snprintf(card->snd_card->driver, sizeof(card->snd_card->driver),
-                "%s", card->driver_name ? card->driver_name : card->name);
-       for (i = 0; i < ARRAY_SIZE(card->snd_card->driver); i++) {
-               switch (card->snd_card->driver[i]) {
-               case '_':
-               case '-':
-               case '\0':
-                       break;
-               default:
-                       if (!isalnum(card->snd_card->driver[i]))
-                               card->snd_card->driver[i] = '_';
-                       break;
-               }
-       }
+       soc_setup_card_name(card->snd_card->shortname,
+                           card->name, NULL, 0);
+       soc_setup_card_name(card->snd_card->longname,
+                           card->long_name, card->name, 0);
+       soc_setup_card_name(card->snd_card->driver,
+                           card->driver_name, card->name, 1);
 
        if (card->late_probe) {
                ret = card->late_probe(card);