return !!io->substream;
 }
 
+int rsnd_get_slot_rdai(struct rsnd_dai *rdai)
+{
+       return rdai->slots;
+}
+
+int rsnd_get_slot_runtime(struct rsnd_dai_stream *io)
+{
+       struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
+       struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+       int chan = rsnd_get_slot_rdai(rdai);
+
+       if (runtime->channels < chan)
+               chan = runtime->channels;
+
+       return chan;
+}
+
+int rsnd_get_slot_extend(struct rsnd_dai_stream *io)
+{
+       int chan = rsnd_get_slot_runtime(io);
+
+       /* TDM Extend Mode needs 8ch */
+       if (chan == 6)
+               chan = 8;
+
+       return chan;
+}
+
 /*
  *     ADINR function
  */
 
                rdai->playback.rdai             = rdai;
                rdai->capture.rdai              = rdai;
+               rdai->slots                     = 2; /* default */
 
 #define mod_parse(name)                                                        \
 node = rsnd_##name##_of_node(priv);                                    \
 
                        void (*callback)(struct rsnd_mod *mod,
                                         struct rsnd_dai_stream *io));
 
+int rsnd_get_slot_rdai(struct rsnd_dai *rdai);
+int rsnd_get_slot_runtime(struct rsnd_dai_stream *io);
+int rsnd_get_slot_extend(struct rsnd_dai_stream *io);
+
 /*
  *     R-Car sound DAI
  */
        struct rsnd_dai_stream capture;
        struct rsnd_priv *priv;
 
+       int slots;
+
        unsigned int clk_master:1;
        unsigned int bit_clk_inv:1;
        unsigned int frm_clk_inv:1;
 
        struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
        struct rsnd_mod *mod = rsnd_mod_get(ssi);
        struct rsnd_mod *ssi_parent_mod = rsnd_io_to_mod_ssip(io);
+       int slots = rsnd_get_slot_extend(io);
        int j, ret;
        int ssi_clk_mul_table[] = {
                1, 2, 4, 8, 16, 6, 12,
 
                /*
                 * this driver is assuming that
-                * system word is 64fs (= 2 x 32bit)
+                * system word is 32bit x slots
                 * see rsnd_ssi_init()
                 */
-               main_rate = rate * 32 * 2 * ssi_clk_mul_table[j];
+               main_rate = rate * 32 * slots * ssi_clk_mul_table[j];
 
                ret = rsnd_adg_ssi_clk_try_start(mod, main_rate);
                if (0 == ret) {