Commit 232c00b6 authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Mark Brown

ASoC: rsnd: DMA become SSI/SRC member

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: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 8005c49d
...@@ -606,14 +606,17 @@ void rsnd_dma_quit(struct rsnd_dai_stream *io, struct rsnd_dma *dma) ...@@ -606,14 +606,17 @@ void rsnd_dma_quit(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
dma->ops->quit(io, 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_from = NULL;
struct rsnd_mod *mod_to = NULL; struct rsnd_mod *mod_to = NULL;
struct rsnd_priv *priv = rsnd_io_to_priv(io); struct rsnd_priv *priv = rsnd_io_to_priv(io);
struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv); struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
struct rsnd_dma *dma;
struct device *dev = rsnd_priv_to_dev(priv); struct device *dev = rsnd_priv_to_dev(priv);
int is_play = rsnd_io_is_play(io); int is_play = rsnd_io_is_play(io);
int ret;
/* /*
* DMA failed. try to PIO mode * 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) ...@@ -622,7 +625,13 @@ int rsnd_dma_init(struct rsnd_dai_stream *io, struct rsnd_dma *dma, int id)
* rsnd_rdai_continuance_probe() * rsnd_rdai_continuance_probe()
*/ */
if (!dmac) 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); 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) ...@@ -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_from), rsnd_mod_id(mod_from),
rsnd_mod_name(mod_to), rsnd_mod_id(mod_to)); 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, int rsnd_dma_probe(struct platform_device *pdev,
......
...@@ -206,6 +206,7 @@ struct rsnd_dmapp { ...@@ -206,6 +206,7 @@ struct rsnd_dmapp {
struct rsnd_dma { struct rsnd_dma {
struct rsnd_dma_ops *ops; struct rsnd_dma_ops *ops;
struct rsnd_mod *mod;
dma_addr_t src_addr; dma_addr_t src_addr;
dma_addr_t dst_addr; dma_addr_t dst_addr;
union { union {
...@@ -215,11 +216,12 @@ struct rsnd_dma { ...@@ -215,11 +216,12 @@ struct rsnd_dma {
}; };
#define rsnd_dma_to_dmaen(dma) (&(dma)->dma.en) #define rsnd_dma_to_dmaen(dma) (&(dma)->dma.en)
#define rsnd_dma_to_dmapp(dma) (&(dma)->dma.pp) #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_start(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
void rsnd_dma_stop(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); void rsnd_dma_quit(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
int rsnd_dma_probe(struct platform_device *pdev, int rsnd_dma_probe(struct platform_device *pdev,
const struct rsnd_of_data *of_data, const struct rsnd_of_data *of_data,
...@@ -278,7 +280,6 @@ struct rsnd_mod { ...@@ -278,7 +280,6 @@ struct rsnd_mod {
int id; int id;
enum rsnd_mod_type type; enum rsnd_mod_type type;
struct rsnd_mod_ops *ops; struct rsnd_mod_ops *ops;
struct rsnd_dma dma;
struct rsnd_priv *priv; struct rsnd_priv *priv;
struct clk *clk; struct clk *clk;
u32 status; u32 status;
...@@ -328,7 +329,6 @@ struct rsnd_mod { ...@@ -328,7 +329,6 @@ struct rsnd_mod {
#define __rsnd_mod_call_hw_params 0 #define __rsnd_mod_call_hw_params 0
#define rsnd_mod_to_priv(mod) ((mod)->priv) #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_id(mod) ((mod) ? (mod)->id : -1)
#define rsnd_mod_power_on(mod) clk_enable((mod)->clk) #define rsnd_mod_power_on(mod) clk_enable((mod)->clk)
#define rsnd_mod_power_off(mod) clk_disable((mod)->clk) #define rsnd_mod_power_off(mod) clk_disable((mod)->clk)
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
struct rsnd_src { struct rsnd_src {
struct rsnd_src_platform_info *info; /* rcar_snd.h */ struct rsnd_src_platform_info *info; /* rcar_snd.h */
struct rsnd_mod mod; struct rsnd_mod mod;
struct rsnd_dma *dma;
struct rsnd_kctrl_cfg_s sen; /* sync convert enable */ struct rsnd_kctrl_cfg_s sen; /* sync convert enable */
struct rsnd_kctrl_cfg_s sync; /* sync convert */ struct rsnd_kctrl_cfg_s sync; /* sync convert */
u32 convert_rate; /* sampling rate convert */ u32 convert_rate; /* sampling rate convert */
...@@ -30,6 +31,7 @@ struct rsnd_src { ...@@ -30,6 +31,7 @@ struct rsnd_src {
#define RSND_SRC_NAME_SIZE 16 #define RSND_SRC_NAME_SIZE 16
#define rsnd_src_to_dma(src) ((src)->dma)
#define rsnd_src_nr(priv) ((priv)->src_nr) #define rsnd_src_nr(priv) ((priv)->src_nr)
#define rsnd_enable_sync_convert(src) ((src)->sen.val) #define rsnd_enable_sync_convert(src) ((src)->sen.val)
#define rsnd_src_of_node(priv) \ #define rsnd_src_of_node(priv) \
...@@ -839,9 +841,9 @@ static int rsnd_src_probe_gen2(struct rsnd_mod *mod, ...@@ -839,9 +841,9 @@ static int rsnd_src_probe_gen2(struct rsnd_mod *mod,
return ret; return ret;
} }
ret = rsnd_dma_init(io, src->dma = rsnd_dma_init(io, mod, src->info->dma_id);
rsnd_mod_to_dma(mod), if (IS_ERR(src->dma))
src->info->dma_id); return PTR_ERR(src->dma);
return ret; return ret;
} }
...@@ -850,7 +852,9 @@ static int rsnd_src_remove_gen2(struct rsnd_mod *mod, ...@@ -850,7 +852,9 @@ static int rsnd_src_remove_gen2(struct rsnd_mod *mod,
struct rsnd_dai_stream *io, struct rsnd_dai_stream *io,
struct rsnd_priv *priv) 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; return 0;
} }
...@@ -880,7 +884,9 @@ static int rsnd_src_start_gen2(struct rsnd_mod *mod, ...@@ -880,7 +884,9 @@ static int rsnd_src_start_gen2(struct rsnd_mod *mod,
struct rsnd_dai_stream *io, struct rsnd_dai_stream *io,
struct rsnd_priv *priv) 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); return _rsnd_src_start_gen2(mod, io);
} }
...@@ -889,11 +895,12 @@ static int rsnd_src_stop_gen2(struct rsnd_mod *mod, ...@@ -889,11 +895,12 @@ static int rsnd_src_stop_gen2(struct rsnd_mod *mod,
struct rsnd_dai_stream *io, struct rsnd_dai_stream *io,
struct rsnd_priv *priv) struct rsnd_priv *priv)
{ {
struct rsnd_src *src = rsnd_mod_to_src(mod);
int ret; int ret;
ret = _rsnd_src_stop_gen2(mod); 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; return ret;
} }
......
...@@ -63,6 +63,7 @@ struct rsnd_ssi { ...@@ -63,6 +63,7 @@ struct rsnd_ssi {
struct rsnd_ssi_platform_info *info; /* rcar_snd.h */ struct rsnd_ssi_platform_info *info; /* rcar_snd.h */
struct rsnd_ssi *parent; struct rsnd_ssi *parent;
struct rsnd_mod mod; struct rsnd_mod mod;
struct rsnd_dma *dma;
u32 cr_own; u32 cr_own;
u32 cr_clk; u32 cr_clk;
...@@ -77,6 +78,7 @@ struct rsnd_ssi { ...@@ -77,6 +78,7 @@ struct rsnd_ssi {
((pos) = ((struct rsnd_ssi *)(priv)->ssi + i)); \ ((pos) = ((struct rsnd_ssi *)(priv)->ssi + i)); \
i++) i++)
#define rsnd_ssi_to_dma(mod) ((ssi)->dma)
#define rsnd_ssi_nr(priv) ((priv)->ssi_nr) #define rsnd_ssi_nr(priv) ((priv)->ssi_nr)
#define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod) #define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod)
#define rsnd_ssi_pio_available(ssi) ((ssi)->info->irq > 0) #define rsnd_ssi_pio_available(ssi) ((ssi)->info->irq > 0)
...@@ -537,9 +539,9 @@ static int rsnd_ssi_dma_probe(struct rsnd_mod *mod, ...@@ -537,9 +539,9 @@ static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
if (ret) if (ret)
return ret; return ret;
ret = rsnd_dma_init( ssi->dma = rsnd_dma_init(io, mod, dma_id);
io, rsnd_mod_to_dma(mod), if (IS_ERR(ssi->dma))
dma_id); return PTR_ERR(ssi->dma);
return ret; return ret;
} }
...@@ -552,7 +554,7 @@ static int rsnd_ssi_dma_remove(struct rsnd_mod *mod, ...@@ -552,7 +554,7 @@ static int rsnd_ssi_dma_remove(struct rsnd_mod *mod,
struct device *dev = rsnd_priv_to_dev(priv); struct device *dev = rsnd_priv_to_dev(priv);
int irq = ssi->info->irq; 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 */ /* PIO will request IRQ again */
devm_free_irq(dev, irq, mod); devm_free_irq(dev, irq, mod);
...@@ -585,7 +587,8 @@ static int rsnd_ssi_dma_start(struct rsnd_mod *mod, ...@@ -585,7 +587,8 @@ static int rsnd_ssi_dma_start(struct rsnd_mod *mod,
struct rsnd_dai_stream *io, struct rsnd_dai_stream *io,
struct rsnd_priv *priv) 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); rsnd_dma_start(io, dma);
...@@ -598,7 +601,8 @@ static int rsnd_ssi_dma_stop(struct rsnd_mod *mod, ...@@ -598,7 +601,8 @@ static int rsnd_ssi_dma_stop(struct rsnd_mod *mod,
struct rsnd_dai_stream *io, struct rsnd_dai_stream *io,
struct rsnd_priv *priv) 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); rsnd_ssi_stop(mod, io, priv);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment