Merge remote-tracking branch 'asoc/topic/rcar' into asoc-next
authorMark Brown <broonie@kernel.org>
Mon, 3 Jul 2017 15:51:30 +0000 (16:51 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 3 Jul 2017 15:51:30 +0000 (16:51 +0100)
1  2 
sound/soc/generic/simple-card.c
sound/soc/soc-core.c

index bc136d2bd7cdeb68b5ca7a24db94a193ede323b3,e86c6e16146b7c7636c009da6cf12e7fea7fe783..1df69701eb12885122a4155227b64aeb44bb1089
@@@ -202,7 -202,7 +202,7 @@@ static int asoc_simple_card_dai_init(st
        if (ret < 0)
                return ret;
  
 -      ret = asoc_simple_card_init_mic(rtd->card, &priv->hp_jack, PREFIX);
 +      ret = asoc_simple_card_init_mic(rtd->card, &priv->mic_jack, PREFIX);
        if (ret < 0)
                return ret;
  
@@@ -301,15 -301,6 +301,6 @@@ static int asoc_simple_card_dai_link_of
        dai_link->ops = &asoc_simple_card_ops;
        dai_link->init = asoc_simple_card_dai_init;
  
-       dev_dbg(dev, "\tname : %s\n", dai_link->stream_name);
-       dev_dbg(dev, "\tformat : %04x\n", dai_link->dai_fmt);
-       dev_dbg(dev, "\tcpu : %s / %d\n",
-               dai_link->cpu_dai_name,
-               dai_props->cpu_dai.sysclk);
-       dev_dbg(dev, "\tcodec : %s / %d\n",
-               dai_link->codec_dai_name,
-               dai_props->codec_dai.sysclk);
        asoc_simple_card_canonicalize_cpu(dai_link, single_cpu);
  
  dai_link_of_err:
@@@ -497,8 -488,10 +488,10 @@@ static int asoc_simple_card_probe(struc
        snd_soc_card_set_drvdata(card, priv);
  
        ret = devm_snd_soc_register_card(dev, card);
-       if (ret >= 0)
-               return ret;
+       if (ret < 0)
+               goto err;
+       return 0;
  err:
        asoc_simple_card_clean_reference(card);
  
diff --combined sound/soc/soc-core.c
index 180bfbfe833da3c53a32a1845392d2af554e3929,9ba1837810171f14782b4da155b6c3b071e6ffc0..921622a019448394687655034f52befb4abfd6ec
@@@ -34,6 -34,7 +34,7 @@@
  #include <linux/ctype.h>
  #include <linux/slab.h>
  #include <linux/of.h>
+ #include <linux/of_graph.h>
  #include <linux/dmi.h>
  #include <sound/core.h>
  #include <sound/jack.h>
@@@ -68,20 -69,6 +69,20 @@@ static int pmdown_time = 5000
  module_param(pmdown_time, int, 0);
  MODULE_PARM_DESC(pmdown_time, "DAPM stream powerdown time (msecs)");
  
 +/* If a DMI filed contain strings in this blacklist (e.g.
 + * "Type2 - Board Manufacturer" or  "Type1 - TBD by OEM"), it will be taken
 + * as invalid and dropped when setting the card long name from DMI info.
 + */
 +static const char * const dmi_blacklist[] = {
 +      "To be filled by OEM",
 +      "TBD by OEM",
 +      "Default String",
 +      "Board Manufacturer",
 +      "Board Vendor Name",
 +      "Board Product Name",
 +      NULL,   /* terminator */
 +};
 +
  /* returns the minimum number of bytes needed to represent
   * a particular given value */
  static int min_bytes_needed(unsigned long val)
@@@ -1947,22 -1934,6 +1948,22 @@@ static void cleanup_dmi_name(char *name
        name[j] = '\0';
  }
  
 +/* Check if a DMI field is valid, i.e. not containing any string
 + * in the black list.
 + */
 +static int is_dmi_valid(const char *field)
 +{
 +      int i = 0;
 +
 +      while (dmi_blacklist[i]) {
 +              if (strstr(field, dmi_blacklist[i]))
 +                      return 0;
 +              i++;
 +      }
 +
 +      return 1;
 +}
 +
  /**
   * snd_soc_set_dmi_name() - Register DMI names to card
   * @card: The card to register DMI names
@@@ -2005,18 -1976,17 +2006,18 @@@ int snd_soc_set_dmi_name(struct snd_soc
  
        /* make up dmi long name as: vendor.product.version.board */
        vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
 -      if (!vendor) {
 +      if (!vendor || !is_dmi_valid(vendor)) {
                dev_warn(card->dev, "ASoC: no DMI vendor name!\n");
                return 0;
        }
  
 +
        snprintf(card->dmi_longname, sizeof(card->snd_card->longname),
                         "%s", vendor);
        cleanup_dmi_name(card->dmi_longname);
  
        product = dmi_get_system_info(DMI_PRODUCT_NAME);
 -      if (product) {
 +      if (product && is_dmi_valid(product)) {
                len = strlen(card->dmi_longname);
                snprintf(card->dmi_longname + len,
                         longname_buf_size - len,
                 * name in the product version field
                 */
                product_version = dmi_get_system_info(DMI_PRODUCT_VERSION);
 -              if (product_version) {
 +              if (product_version && is_dmi_valid(product_version)) {
                        len = strlen(card->dmi_longname);
                        snprintf(card->dmi_longname + len,
                                 longname_buf_size - len,
        }
  
        board = dmi_get_system_info(DMI_BOARD_NAME);
 -      if (board) {
 +      if (board && is_dmi_valid(board)) {
                len = strlen(card->dmi_longname);
                snprintf(card->dmi_longname + len,
                         longname_buf_size - len,
@@@ -2317,9 -2287,6 +2318,9 @@@ static int soc_cleanup_card_resources(s
        list_for_each_entry(rtd, &card->rtd_list, list)
                flush_delayed_work(&rtd->delayed_work);
  
 +      /* free the ALSA card at first; this syncs with pending operations */
 +      snd_card_free(card->snd_card);
 +
        /* remove and free each DAI */
        soc_remove_dai_links(card);
        soc_remove_pcm_runtimes(card);
        if (card->remove)
                card->remove(card);
  
 -      snd_card_free(card->snd_card);
        return 0;
 -
  }
  
  /* removes a socdev */
@@@ -3992,11 -3961,15 +3993,15 @@@ unsigned int snd_soc_of_parse_daifmt(st
                prefix = "";
  
        /*
-        * check "[prefix]format = xxx"
+        * check "dai-format = xxx"
+        * or    "[prefix]format = xxx"
         * SND_SOC_DAIFMT_FORMAT_MASK area
         */
-       snprintf(prop, sizeof(prop), "%sformat", prefix);
-       ret = of_property_read_string(np, prop, &str);
+       ret = of_property_read_string(np, "dai-format", &str);
+       if (ret < 0) {
+               snprintf(prop, sizeof(prop), "%sformat", prefix);
+               ret = of_property_read_string(np, prop, &str);
+       }
        if (ret == 0) {
                for (i = 0; i < ARRAY_SIZE(of_fmt_table); i++) {
                        if (strcmp(str, of_fmt_table[i].name) == 0) {
  }
  EXPORT_SYMBOL_GPL(snd_soc_of_parse_daifmt);
  
+ int snd_soc_get_dai_id(struct device_node *ep)
+ {
+       struct snd_soc_component *pos;
+       struct device_node *node;
+       int ret;
+       node = of_graph_get_port_parent(ep);
+       /*
+        * For example HDMI case, HDMI has video/sound port,
+        * but ALSA SoC needs sound port number only.
+        * Thus counting HDMI DT port/endpoint doesn't work.
+        * Then, it should have .of_xlate_dai_id
+        */
+       ret = -ENOTSUPP;
+       mutex_lock(&client_mutex);
+       list_for_each_entry(pos, &component_list, list) {
+               struct device_node *component_of_node = pos->dev->of_node;
+               if (!component_of_node && pos->dev->parent)
+                       component_of_node = pos->dev->parent->of_node;
+               if (component_of_node != node)
+                       continue;
+               if (pos->driver->of_xlate_dai_id)
+                       ret = pos->driver->of_xlate_dai_id(pos, ep);
+               break;
+       }
+       mutex_unlock(&client_mutex);
+       return ret;
+ }
+ EXPORT_SYMBOL_GPL(snd_soc_get_dai_id);
  int snd_soc_get_dai_name(struct of_phandle_args *args,
                                const char **dai_name)
  {