struct rsnd_dma_ops {
        char *name;
-       void (*start)(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
-       void (*stop)(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
-       void (*quit)(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
+       void (*start)(struct rsnd_mod *mod,
+                     struct rsnd_dai_stream *io,
+                     struct rsnd_priv *priv);
+       void (*stop)(struct rsnd_mod *mod,
+                    struct rsnd_dai_stream *io,
+                    struct rsnd_priv *priv);
+       void (*quit)(struct rsnd_mod *mod,
+                    struct rsnd_dai_stream *io,
+                    struct rsnd_priv *priv);
 };
 
 #define rsnd_priv_to_dmac(p)   ((struct rsnd_dma_ctrl *)(p)->dma)
        rsnd_mod_interrupt(mod, __rsnd_dmaen_complete);
 }
 
-static void rsnd_dmaen_stop(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
+static void rsnd_dmaen_stop(struct rsnd_mod *mod,
+                           struct rsnd_dai_stream *io,
+                           struct rsnd_priv *priv)
 {
+       struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
        struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
 
        dmaengine_terminate_all(dmaen->chan);
 }
 
-static void rsnd_dmaen_start(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
+static void rsnd_dmaen_start(struct rsnd_mod *mod,
+                            struct rsnd_dai_stream *io,
+                            struct rsnd_priv *priv)
 {
+       struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
        struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
        struct rsnd_mod *user_mod = dma->user_mod;
-       struct rsnd_priv *priv = rsnd_io_to_priv(io);
        struct snd_pcm_substream *substream = io->substream;
        struct device *dev = rsnd_priv_to_dev(priv);
        struct dma_async_tx_descriptor *desc;
        return 0;
 
 rsnd_dma_attach_err:
-       rsnd_dma_quit(io, rsnd_mod_get(dma));
+       rsnd_dma_quit(rsnd_mod_get(dma), io, priv);
 rsnd_dma_channel_err:
 
        /*
        return -EAGAIN;
 }
 
-static void rsnd_dmaen_quit(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
+static void rsnd_dmaen_quit(struct rsnd_mod *mod,
+                           struct rsnd_dai_stream *io,
+                           struct rsnd_priv *priv)
 {
+       struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
        struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
 
        if (dmaen->chan)
        return ioread32(rsnd_dmapp_addr(dmac, dma, reg));
 }
 
-static void rsnd_dmapp_stop(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
+static void rsnd_dmapp_stop(struct rsnd_mod *mod,
+                           struct rsnd_dai_stream *io,
+                           struct rsnd_priv *priv)
 {
+       struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
        int i;
 
        rsnd_dmapp_write(dma, 0, PDMACHCR);
        }
 }
 
-static void rsnd_dmapp_start(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
+static void rsnd_dmapp_start(struct rsnd_mod *mod,
+                            struct rsnd_dai_stream *io,
+                            struct rsnd_priv *priv)
 {
+       struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
        struct rsnd_dmapp *dmapp = rsnd_dma_to_dmapp(dma);
 
        rsnd_dmapp_write(dma, dma->src_addr,    PDMASAR);
 
        dmac->dmapp_num++;
 
-       rsnd_dmapp_stop(io, dma);
-
        dev_dbg(dev, "id/src/dst/chcr = %d/%pad/%pad/%08x\n",
                dmapp->dmapp_id, &dma->src_addr, &dma->dst_addr, dmapp->chcr);
 
        }
 }
 
-void rsnd_dma_stop(struct rsnd_dai_stream *io, struct rsnd_mod *mod)
+void rsnd_dma_stop(struct rsnd_mod *mod,
+                  struct rsnd_dai_stream *io,
+                  struct rsnd_priv *priv)
+
 {
        struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
 
-       dma->ops->stop(io, dma);
+       dma->ops->stop(mod, io, priv);
 }
 
-void rsnd_dma_start(struct rsnd_dai_stream *io, struct rsnd_mod *mod)
+void rsnd_dma_start(struct rsnd_mod *mod,
+                   struct rsnd_dai_stream *io,
+                   struct rsnd_priv *priv)
 {
        struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
 
-       dma->ops->start(io, dma);
+       dma->ops->start(mod, io, priv);
 }
 
-void rsnd_dma_quit(struct rsnd_dai_stream *io, struct rsnd_mod *mod)
+void rsnd_dma_quit(struct rsnd_mod *mod,
+                  struct rsnd_dai_stream *io,
+                  struct rsnd_priv *priv)
 {
        struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
-       struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
        struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
 
        if (!dmac)
                return;
 
-       dma->ops->quit(io, dma);
+       dma->ops->quit(mod, io, priv);
 }
 
 static struct rsnd_mod_ops rsnd_dma_ops = {
 
 /*
  *     R-Car DMA
  */
-void rsnd_dma_start(struct rsnd_dai_stream *io, struct rsnd_mod *mod);
-void rsnd_dma_stop(struct rsnd_dai_stream *io, struct rsnd_mod *mod);
+void rsnd_dma_start(struct rsnd_mod *mod,
+                   struct rsnd_dai_stream *io,
+                   struct rsnd_priv *priv);
+void rsnd_dma_stop(struct rsnd_mod *mod,
+                  struct rsnd_dai_stream *io,
+                  struct rsnd_priv *priv);
+void rsnd_dma_quit(struct rsnd_mod *mod,
+                  struct rsnd_dai_stream *io,
+                  struct rsnd_priv *priv);
 struct rsnd_mod *rsnd_dma_attach(struct rsnd_dai_stream *io,
                               struct rsnd_mod *mod, int id);
-void rsnd_dma_quit(struct rsnd_dai_stream *io, struct rsnd_mod *mod);
 int rsnd_dma_probe(struct platform_device *pdev,
                   const struct rsnd_of_data *of_data,
                   struct rsnd_priv *priv);