#define asoc_simple_card_parse_clk_cpu(dev, node, dai_link, simple_dai)                \
        asoc_simple_card_parse_clk(dev, node, dai_link->cpu_of_node, simple_dai, \
-                                  dai_link->cpu_dai_name)
+                                  dai_link->cpu_dai_name, NULL)
 #define asoc_simple_card_parse_clk_codec(dev, node, dai_link, simple_dai)      \
        asoc_simple_card_parse_clk(dev, node, dai_link->codec_of_node, simple_dai,\
-                                  dai_link->codec_dai_name)
+                                  dai_link->codec_dai_name, dai_link->codecs)
 int asoc_simple_card_parse_clk(struct device *dev,
                               struct device_node *node,
                               struct device_node *dai_of_node,
                               struct asoc_simple_dai *simple_dai,
-                              const char *name);
+                              const char *dai_name,
+                              struct snd_soc_dai_link_component *dlc);
 int asoc_simple_card_clk_enable(struct asoc_simple_dai *dai);
 void asoc_simple_card_clk_disable(struct asoc_simple_dai *dai);
 
 #define asoc_simple_card_parse_cpu(node, dai_link,                             \
                                   list_name, cells_name, is_single_link)       \
-       asoc_simple_card_parse_dai(node, &dai_link->cpu_of_node,                \
+       asoc_simple_card_parse_dai(node, NULL,                                  \
+               &dai_link->cpu_of_node,                                         \
                &dai_link->cpu_dai_name, list_name, cells_name, is_single_link)
 #define asoc_simple_card_parse_codec(node, dai_link, list_name, cells_name)    \
-       asoc_simple_card_parse_dai(node, &dai_link->codec_of_node,              \
-               &dai_link->codec_dai_name, list_name, cells_name, NULL)
+       asoc_simple_card_parse_dai(node, dai_link->codecs,                      \
+                                  &dai_link->codec_of_node,                    \
+                                  &dai_link->codec_dai_name,                   \
+                                  list_name, cells_name, NULL)
 #define asoc_simple_card_parse_platform(node, dai_link, list_name, cells_name) \
-       asoc_simple_card_parse_dai(node, &dai_link->platform_of_node,           \
+       asoc_simple_card_parse_dai(node, NULL,                                  \
+               &dai_link->platform_of_node,                                    \
                NULL, list_name, cells_name, NULL)
 int asoc_simple_card_parse_dai(struct device_node *node,
+                                 struct snd_soc_dai_link_component *dlc,
                                  struct device_node **endpoint_np,
                                  const char **dai_name,
                                  const char *list_name,
                                  int *is_single_links);
 
 #define asoc_simple_card_parse_graph_cpu(ep, dai_link)                 \
-       asoc_simple_card_parse_graph_dai(ep, &dai_link->cpu_of_node,    \
+       asoc_simple_card_parse_graph_dai(ep, NULL,                      \
+                                        &dai_link->cpu_of_node,        \
                                         &dai_link->cpu_dai_name)
 #define asoc_simple_card_parse_graph_codec(ep, dai_link)               \
-       asoc_simple_card_parse_graph_dai(ep, &dai_link->codec_of_node,  \
+       asoc_simple_card_parse_graph_dai(ep, dai_link->codecs,          \
+                                        &dai_link->codec_of_node,      \
                                         &dai_link->codec_dai_name)
 int asoc_simple_card_parse_graph_dai(struct device_node *ep,
+                                    struct snd_soc_dai_link_component *dlc,
                                     struct device_node **endpoint_np,
                                     const char **dai_name);
 
 
                               struct device_node *node,
                               struct device_node *dai_of_node,
                               struct asoc_simple_dai *simple_dai,
-                              const char *name)
+                              const char *dai_name,
+                              struct snd_soc_dai_link_component *dlc)
 {
        struct clk *clk;
        u32 val;
 
+       /*
+        * Use snd_soc_dai_link_component instead of legacy style.
+        * It is only for codec, but cpu will be supported in the future.
+        * see
+        *      soc-core.c :: snd_soc_init_multicodec()
+        */
+       if (dlc) {
+               dai_of_node     = dlc->of_node;
+               dai_name        = dlc->dai_name;
+       }
+
        /*
         * Parse dai->sysclk come from "clocks = <&xxx>"
         * (if system has common clock)
        if (of_property_read_bool(node, "system-clock-direction-out"))
                simple_dai->clk_direction = SND_SOC_CLOCK_OUT;
 
-       dev_dbg(dev, "%s : sysclk = %d, direction %d\n", name,
+       dev_dbg(dev, "%s : sysclk = %d, direction %d\n", dai_name,
                simple_dai->sysclk, simple_dai->clk_direction);
 
        return 0;
 EXPORT_SYMBOL_GPL(asoc_simple_card_parse_clk);
 
 int asoc_simple_card_parse_dai(struct device_node *node,
+                                   struct snd_soc_dai_link_component *dlc,
                                    struct device_node **dai_of_node,
                                    const char **dai_name,
                                    const char *list_name,
        if (!node)
                return 0;
 
+       /*
+        * Use snd_soc_dai_link_component instead of legacy style.
+        * It is only for codec, but cpu will be supported in the future.
+        * see
+        *      soc-core.c :: snd_soc_init_multicodec()
+        */
+       if (dlc) {
+               dai_name        = &dlc->dai_name;
+               dai_of_node     = &dlc->of_node;
+       }
+
        /*
         * Get node via "sound-dai = <&phandle port>"
         * it will be used as xxx_of_node on soc_bind_dai_link()
 }
 
 int asoc_simple_card_parse_graph_dai(struct device_node *ep,
+                                    struct snd_soc_dai_link_component *dlc,
                                     struct device_node **dai_of_node,
                                     const char **dai_name)
 {
        struct of_phandle_args args;
        int ret;
 
+       /*
+        * Use snd_soc_dai_link_component instead of legacy style.
+        * It is only for codec, but cpu will be supported in the future.
+        * see
+        *      soc-core.c :: snd_soc_init_multicodec()
+        */
+       if (dlc) {
+               dai_name        = &dlc->dai_name;
+               dai_of_node     = &dlc->of_node;
+       }
+
        if (!ep)
                return 0;
        if (!dai_name)
             num_links++, dai_link++) {
                of_node_put(dai_link->cpu_of_node);
                of_node_put(dai_link->codec_of_node);
+               if (dai_link->codecs)
+                       of_node_put(dai_link->codecs->of_node);
        }
        return 0;
 }