struct rsnd_dai *rdai;
        u32 cr_own;
        u32 cr_clk;
-       u32 cr_etc;
        int err;
        unsigned int usrcnt;
        unsigned int rate;
 {
        struct rsnd_priv *priv = rsnd_mod_to_priv(&ssi->mod);
        struct device *dev = rsnd_priv_to_dev(priv);
+       u32 cr_mode;
        u32 cr;
 
        if (0 == ssi->usrcnt) {
                }
        }
 
+       cr_mode = rsnd_ssi_is_dma_mode(&ssi->mod) ?
+               DMEN :                  /* DMA : use DMA */
+               UIEN | OIEN | DIEN;     /* PIO : enable interrupt */
+
+
        cr  =   ssi->cr_own     |
                ssi->cr_clk     |
-               ssi->cr_etc     |
+               cr_mode         |
                EN;
 
        rsnd_mod_write(&ssi->mod, SSICR, cr);
        struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
        struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
 
-       /* enable PIO IRQ */
-       ssi->cr_etc = UIEN | OIEN | DIEN;
-
        rsnd_src_ssiu_start(mod, rdai, 0);
 
        rsnd_src_enable_ssi_irq(mod, rdai);
 {
        struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
 
-       ssi->cr_etc = 0;
-
        rsnd_ssi_hw_stop(ssi, rdai);
 
        rsnd_src_ssiu_stop(mod, rdai);
        struct rsnd_dma *dma = rsnd_mod_to_dma(&ssi->mod);
        struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
 
-       /* enable DMA transfer */
-       ssi->cr_etc = DMEN;
-
        rsnd_src_ssiu_start(mod, rdai, rsnd_ssi_use_busif(mod));
 
        rsnd_dma_start(dma);
        struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
        struct rsnd_dma *dma = rsnd_mod_to_dma(&ssi->mod);
 
-       ssi->cr_etc = 0;
-
        rsnd_ssi_record_error(ssi, rsnd_mod_read(mod, SSISR));
 
        rsnd_ssi_hw_stop(ssi, rdai);
        .fallback = rsnd_ssi_fallback,
 };
 
+int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod)
+{
+       return mod->ops == &rsnd_ssi_dma_ops;
+}
+
+
 /*
  *             Non SSI
  */