.set_tdm_slot   = rsnd_soc_set_dai_tdm_slot,
 };
 
+void rsnd_parse_connect_common(struct rsnd_dai *rdai,
+               struct rsnd_mod* (*mod_get)(struct rsnd_priv *priv, int id),
+               struct device_node *node,
+               struct device_node *playback,
+               struct device_node *capture)
+{
+       struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
+       struct device_node *np;
+       struct rsnd_mod *mod;
+       int i;
+
+       if (!node)
+               return;
+
+       i = 0;
+       for_each_child_of_node(node, np) {
+               mod = mod_get(priv, i);
+               if (np == playback)
+                       rsnd_dai_connect(mod, &rdai->playback, mod->type);
+               if (np == capture)
+                       rsnd_dai_connect(mod, &rdai->capture, mod->type);
+               i++;
+       }
+
+       of_node_put(node);
+}
+
 static int rsnd_dai_probe(struct rsnd_priv *priv)
 {
        struct device_node *dai_node;
-       struct device_node *dai_np, *np, *node;
+       struct device_node *dai_np;
        struct device_node *playback, *capture;
        struct rsnd_dai_stream *io_playback;
        struct rsnd_dai_stream *io_capture;
        struct snd_soc_dai_driver *rdrv, *drv;
        struct rsnd_dai *rdai;
        struct device *dev = rsnd_priv_to_dev(priv);
-       int nr, dai_i, io_i, np_i;
+       int nr, dai_i, io_i;
        int ret;
 
        dai_node = rsnd_dai_of_node(priv);
                rdai->capture.rdai              = rdai;
                rsnd_set_slot(rdai, 2, 1); /* default */
 
-#define mod_parse(name)                                                        \
-node = rsnd_##name##_of_node(priv);                                    \
-if (node) {                                                            \
-       struct rsnd_mod *mod;                                           \
-       np_i = 0;                                                       \
-       for_each_child_of_node(node, np) {                              \
-               mod = rsnd_##name##_mod_get(priv, np_i);                \
-               if (np == playback)                                     \
-                       rsnd_dai_connect(mod, io_playback, mod->type);  \
-               if (np == capture)                                      \
-                       rsnd_dai_connect(mod, io_capture, mod->type);   \
-               np_i++;                                                 \
-       }                                                               \
-       of_node_put(node);                                              \
-}
-
                for (io_i = 0;; io_i++) {
                        playback = of_parse_phandle(dai_np, "playback", io_i);
                        capture  = of_parse_phandle(dai_np, "capture", io_i);
                        if (!playback && !capture)
                                break;
 
-                       mod_parse(ssi);
-                       mod_parse(src);
-                       mod_parse(ctu);
-                       mod_parse(mix);
-                       mod_parse(dvc);
+                       rsnd_parse_connect_ssi(rdai, playback, capture);
+                       rsnd_parse_connect_src(rdai, playback, capture);
+                       rsnd_parse_connect_ctu(rdai, playback, capture);
+                       rsnd_parse_connect_mix(rdai, playback, capture);
+                       rsnd_parse_connect_dvc(rdai, playback, capture);
 
                        of_node_put(playback);
                        of_node_put(capture);
 
 void rsnd_mod_interrupt(struct rsnd_mod *mod,
                        void (*callback)(struct rsnd_mod *mod,
                                         struct rsnd_dai_stream *io));
+void rsnd_parse_connect_common(struct rsnd_dai *rdai,
+               struct rsnd_mod* (*mod_get)(struct rsnd_priv *priv, int id),
+               struct device_node *node,
+               struct device_node *playback,
+               struct device_node *capture);
 
 void rsnd_set_slot(struct rsnd_dai *rdai,
                   int slots, int slots_total);
 
 #define rsnd_ssi_of_node(priv)                                         \
        of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,ssi")
+#define rsnd_parse_connect_ssi(rdai, playback, capture)                        \
+       rsnd_parse_connect_common(rdai, rsnd_ssi_mod_get,               \
+                                 rsnd_ssi_of_node(rsnd_rdai_to_priv(rdai)), \
+                                 playback, capture)
 
 /*
  *     R-Car SSIU
                                   struct snd_pcm_runtime *runtime);
 #define rsnd_src_of_node(priv)                                         \
        of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,src")
+#define rsnd_parse_connect_src(rdai, playback, capture)                        \
+       rsnd_parse_connect_common(rdai, rsnd_src_mod_get,               \
+                                 rsnd_src_of_node(rsnd_rdai_to_priv(rdai)), \
+                                                  playback, capture)
 
 /*
  *     R-Car CTU
 struct rsnd_mod *rsnd_ctu_mod_get(struct rsnd_priv *priv, int id);
 #define rsnd_ctu_of_node(priv)                                         \
        of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,ctu")
+#define rsnd_parse_connect_ctu(rdai, playback, capture)                        \
+       rsnd_parse_connect_common(rdai, rsnd_ctu_mod_get,               \
+                                 rsnd_ctu_of_node(rsnd_rdai_to_priv(rdai)), \
+                                                  playback, capture)
 
 /*
  *     R-Car MIX
 struct rsnd_mod *rsnd_mix_mod_get(struct rsnd_priv *priv, int id);
 #define rsnd_mix_of_node(priv)                                         \
        of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,mix")
+#define rsnd_parse_connect_mix(rdai, playback, capture)                        \
+       rsnd_parse_connect_common(rdai, rsnd_mix_mod_get,               \
+                                 rsnd_mix_of_node(rsnd_rdai_to_priv(rdai)), \
+                                                  playback, capture)
 
 /*
  *     R-Car DVC
 struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id);
 #define rsnd_dvc_of_node(priv)                                         \
        of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,dvc")
+#define rsnd_parse_connect_dvc(rdai, playback, capture)                        \
+       rsnd_parse_connect_common(rdai, rsnd_dvc_mod_get,               \
+                                 rsnd_dvc_of_node(rsnd_rdai_to_priv(rdai)), \
+                                                  playback, capture)
 
 /*
  *     R-Car CMD