| From 4a24a5f5cab4e1f170c8ced6e375579903cd2c7f Mon Sep 17 00:00:00 2001 |
| From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Date: Thu, 23 Jan 2014 18:40:27 -0800 |
| Subject: ASoC: rsnd: don't use schedule_work() when rsnd_dma_start() |
| |
| rsnd_dma_start() is the function to start DMAEngine. |
| Current code is using schedule_work() for it, |
| but it breaks DMAC/SSI register setting timing. |
| Don't use schedule_work() on it. |
| |
| Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Signed-off-by: Mark Brown <broonie@linaro.org> |
| (cherry picked from commit f5cab3b8976d59c6166228874a5af3d87c94c723) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| sound/soc/sh/rcar/core.c | 13 ++++++++++--- |
| 1 file changed, 10 insertions(+), 3 deletions(-) |
| |
| diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c |
| index 4fd57351c54a..11eb0e35b9ce 100644 |
| --- a/sound/soc/sh/rcar/core.c |
| +++ b/sound/soc/sh/rcar/core.c |
| @@ -132,6 +132,7 @@ void rsnd_mod_init(struct rsnd_priv *priv, |
| /* |
| * rsnd_dma functions |
| */ |
| +static void __rsnd_dma_start(struct rsnd_dma *dma); |
| static void rsnd_dma_continue(struct rsnd_dma *dma) |
| { |
| /* push next A or B plane */ |
| @@ -143,7 +144,7 @@ void rsnd_dma_start(struct rsnd_dma *dma) |
| { |
| /* push both A and B plane*/ |
| dma->submit_loop = 2; |
| - schedule_work(&dma->work); |
| + __rsnd_dma_start(dma); |
| } |
| |
| void rsnd_dma_stop(struct rsnd_dma *dma) |
| @@ -169,9 +170,8 @@ static void rsnd_dma_complete(void *data) |
| rsnd_unlock(priv, flags); |
| } |
| |
| -static void rsnd_dma_do_work(struct work_struct *work) |
| +static void __rsnd_dma_start(struct rsnd_dma *dma) |
| { |
| - struct rsnd_dma *dma = container_of(work, struct rsnd_dma, work); |
| struct rsnd_priv *priv = rsnd_mod_to_priv(rsnd_dma_to_mod(dma)); |
| struct device *dev = rsnd_priv_to_dev(priv); |
| struct dma_async_tx_descriptor *desc; |
| @@ -204,6 +204,13 @@ static void rsnd_dma_do_work(struct work_struct *work) |
| } |
| } |
| |
| +static void rsnd_dma_do_work(struct work_struct *work) |
| +{ |
| + struct rsnd_dma *dma = container_of(work, struct rsnd_dma, work); |
| + |
| + __rsnd_dma_start(dma); |
| +} |
| + |
| int rsnd_dma_available(struct rsnd_dma *dma) |
| { |
| return !!dma->chan; |
| -- |
| 2.1.2 |
| |