ASoC: rsnd: DMA become SSI/SRC member
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Mon, 26 Oct 2015 08:38:26 +0000 (08:38 +0000)
committerMark Brown <broonie@kernel.org>
Mon, 16 Nov 2015 10:09:29 +0000 (10:09 +0000)
Renesas sound needs many devices
(SSI/SSIU/SRC/CTU/MIX/DVC/CMD/AudioDMAC/AudioDMACpp).
SSI/SRC/CTU/MIX/DVC are implemented as module.
SSI parent, SSIU are implemented as part of SSI
CMD is implemented as part of CTU/MIX/DVC
AudioDMAC/AudioDMACpp are implemented as part of SSI/SRC
It is nice sense that these all devices are implemented as mod.

Current rsnd_mod is member of rsnd_mod. But the DMA user is only
SSI/SRC. This DMA will be implemented as module. As 1st step, DMA
become SSI/SRC member by this patch.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sh/rcar/dma.c
sound/soc/sh/rcar/rsnd.h
sound/soc/sh/rcar/src.c
sound/soc/sh/rcar/ssi.c

index 5d084d0409611dd67cf35bc00c2fed53b517862b..923120c7b250e8cc0dfeae04ebd3bab220fd5b84 100644 (file)
@@ -606,14 +606,17 @@ void rsnd_dma_quit(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
        dma->ops->quit(io, dma);
 }
 
-int rsnd_dma_init(struct rsnd_dai_stream *io, struct rsnd_dma *dma, int id)
+struct rsnd_dma *rsnd_dma_init(struct rsnd_dai_stream *io,
+                              struct rsnd_mod *mod, int id)
 {
        struct rsnd_mod *mod_from = NULL;
        struct rsnd_mod *mod_to = NULL;
        struct rsnd_priv *priv = rsnd_io_to_priv(io);
        struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
+       struct rsnd_dma *dma;
        struct device *dev = rsnd_priv_to_dev(priv);
        int is_play = rsnd_io_is_play(io);
+       int ret;
 
        /*
         * DMA failed. try to PIO mode
@@ -622,7 +625,13 @@ int rsnd_dma_init(struct rsnd_dai_stream *io, struct rsnd_dma *dma, int id)
         *      rsnd_rdai_continuance_probe()
         */
        if (!dmac)
-               return -EAGAIN;
+               return ERR_PTR(-EAGAIN);
+
+       dma = devm_kzalloc(dev, sizeof(*dma), GFP_KERNEL);
+       if (!dma)
+               return ERR_PTR(-ENOMEM);
+
+       dma->mod = mod;
 
        rsnd_dma_of_path(dma, io, is_play, &mod_from, &mod_to);
 
@@ -644,7 +653,11 @@ int rsnd_dma_init(struct rsnd_dai_stream *io, struct rsnd_dma *dma, int id)
                rsnd_mod_name(mod_from), rsnd_mod_id(mod_from),
                rsnd_mod_name(mod_to),   rsnd_mod_id(mod_to));
 
-       return dma->ops->init(io, dma, id, mod_from, mod_to);
+       ret = dma->ops->init(io, dma, id, mod_from, mod_to);
+       if (ret < 0)
+               return ERR_PTR(ret);
+
+       return dma;
 }
 
 int rsnd_dma_probe(struct platform_device *pdev,
index 08532987852516cea79ed04051bf9b7ba62f3e51..1c08eaa51430fa12484a05847c001a3ec2524a49 100644 (file)
@@ -206,6 +206,7 @@ struct rsnd_dmapp {
 
 struct rsnd_dma {
        struct rsnd_dma_ops     *ops;
+       struct rsnd_mod         *mod;
        dma_addr_t              src_addr;
        dma_addr_t              dst_addr;
        union {
@@ -215,11 +216,12 @@ struct rsnd_dma {
 };
 #define rsnd_dma_to_dmaen(dma) (&(dma)->dma.en)
 #define rsnd_dma_to_dmapp(dma) (&(dma)->dma.pp)
-#define rsnd_dma_to_mod(_dma) container_of((_dma), struct rsnd_mod, dma)
+#define rsnd_dma_to_mod(_dma) ((dma)->mod)
 
 void rsnd_dma_start(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
 void rsnd_dma_stop(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
-int rsnd_dma_init(struct rsnd_dai_stream *io, struct rsnd_dma *dma, int id);
+struct rsnd_dma *rsnd_dma_init(struct rsnd_dai_stream *io,
+                              struct rsnd_mod *mod, int id);
 void rsnd_dma_quit(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
 int rsnd_dma_probe(struct platform_device *pdev,
                   const struct rsnd_of_data *of_data,
@@ -278,7 +280,6 @@ struct rsnd_mod {
        int id;
        enum rsnd_mod_type type;
        struct rsnd_mod_ops *ops;
-       struct rsnd_dma dma;
        struct rsnd_priv *priv;
        struct clk *clk;
        u32 status;
@@ -328,7 +329,6 @@ struct rsnd_mod {
 #define __rsnd_mod_call_hw_params      0
 
 #define rsnd_mod_to_priv(mod) ((mod)->priv)
-#define rsnd_mod_to_dma(mod) (&(mod)->dma)
 #define rsnd_mod_id(mod) ((mod) ? (mod)->id : -1)
 #define rsnd_mod_power_on(mod) clk_enable((mod)->clk)
 #define rsnd_mod_power_off(mod)        clk_disable((mod)->clk)
index 261b50217c48d94f0a66f44c513f685755ddae07..3296f1e96d3065e5f151cb323788339f6d5c397b 100644 (file)
@@ -22,6 +22,7 @@
 struct rsnd_src {
        struct rsnd_src_platform_info *info; /* rcar_snd.h */
        struct rsnd_mod mod;
+       struct rsnd_dma *dma;
        struct rsnd_kctrl_cfg_s sen;  /* sync convert enable */
        struct rsnd_kctrl_cfg_s sync; /* sync convert */
        u32 convert_rate; /* sampling rate convert */
@@ -30,6 +31,7 @@ struct rsnd_src {
 
 #define RSND_SRC_NAME_SIZE 16
 
+#define rsnd_src_to_dma(src) ((src)->dma)
 #define rsnd_src_nr(priv) ((priv)->src_nr)
 #define rsnd_enable_sync_convert(src) ((src)->sen.val)
 #define rsnd_src_of_node(priv) \
@@ -839,9 +841,9 @@ static int rsnd_src_probe_gen2(struct rsnd_mod *mod,
                        return ret;
        }
 
-       ret = rsnd_dma_init(io,
-                           rsnd_mod_to_dma(mod),
-                           src->info->dma_id);
+       src->dma = rsnd_dma_init(io, mod, src->info->dma_id);
+       if (IS_ERR(src->dma))
+               return PTR_ERR(src->dma);
 
        return ret;
 }
@@ -850,7 +852,9 @@ static int rsnd_src_remove_gen2(struct rsnd_mod *mod,
                                struct rsnd_dai_stream *io,
                                struct rsnd_priv *priv)
 {
-       rsnd_dma_quit(io, rsnd_mod_to_dma(mod));
+       struct rsnd_src *src = rsnd_mod_to_src(mod);
+
+       rsnd_dma_quit(io, rsnd_src_to_dma(src));
 
        return 0;
 }
@@ -880,7 +884,9 @@ static int rsnd_src_start_gen2(struct rsnd_mod *mod,
                               struct rsnd_dai_stream *io,
                               struct rsnd_priv *priv)
 {
-       rsnd_dma_start(io, rsnd_mod_to_dma(mod));
+       struct rsnd_src *src = rsnd_mod_to_src(mod);
+
+       rsnd_dma_start(io, rsnd_src_to_dma(src));
 
        return _rsnd_src_start_gen2(mod, io);
 }
@@ -889,11 +895,12 @@ static int rsnd_src_stop_gen2(struct rsnd_mod *mod,
                              struct rsnd_dai_stream *io,
                              struct rsnd_priv *priv)
 {
+       struct rsnd_src *src = rsnd_mod_to_src(mod);
        int ret;
 
        ret = _rsnd_src_stop_gen2(mod);
 
-       rsnd_dma_stop(io, rsnd_mod_to_dma(mod));
+       rsnd_dma_stop(io, rsnd_src_to_dma(src));
 
        return ret;
 }
index 1427ec21bd7ee1f581ef3ef4109716e3175ee066..eec17bcc89faf26fc5e82ddf6f75819310882d43 100644 (file)
@@ -63,6 +63,7 @@ struct rsnd_ssi {
        struct rsnd_ssi_platform_info *info; /* rcar_snd.h */
        struct rsnd_ssi *parent;
        struct rsnd_mod mod;
+       struct rsnd_dma *dma;
 
        u32 cr_own;
        u32 cr_clk;
@@ -77,6 +78,7 @@ struct rsnd_ssi {
                ((pos) = ((struct rsnd_ssi *)(priv)->ssi + i));         \
             i++)
 
+#define rsnd_ssi_to_dma(mod) ((ssi)->dma)
 #define rsnd_ssi_nr(priv) ((priv)->ssi_nr)
 #define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod)
 #define rsnd_ssi_pio_available(ssi) ((ssi)->info->irq > 0)
@@ -537,9 +539,9 @@ static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
        if (ret)
                return ret;
 
-       ret = rsnd_dma_init(
-               io, rsnd_mod_to_dma(mod),
-               dma_id);
+       ssi->dma = rsnd_dma_init(io, mod, dma_id);
+       if (IS_ERR(ssi->dma))
+               return PTR_ERR(ssi->dma);
 
        return ret;
 }
@@ -552,7 +554,7 @@ static int rsnd_ssi_dma_remove(struct rsnd_mod *mod,
        struct device *dev = rsnd_priv_to_dev(priv);
        int irq = ssi->info->irq;
 
-       rsnd_dma_quit(io, rsnd_mod_to_dma(mod));
+       rsnd_dma_quit(io, rsnd_ssi_to_dma(ssi));
 
        /* PIO will request IRQ again */
        devm_free_irq(dev, irq, mod);
@@ -585,7 +587,8 @@ static int rsnd_ssi_dma_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_ssi *ssi = rsnd_mod_to_ssi(mod);
+       struct rsnd_dma *dma = rsnd_ssi_to_dma(ssi);
 
        rsnd_dma_start(io, dma);
 
@@ -598,7 +601,8 @@ static int rsnd_ssi_dma_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_ssi *ssi = rsnd_mod_to_ssi(mod);
+       struct rsnd_dma *dma = rsnd_ssi_to_dma(ssi);
 
        rsnd_ssi_stop(mod, io, priv);