ASoC: rsnd: don't use schedule_work() when rsnd_dma_start()
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Fri, 24 Jan 2014 02:40:27 +0000 (18:40 -0800)
committerMark Brown <broonie@linaro.org>
Mon, 3 Feb 2014 12:41:37 +0000 (12:41 +0000)
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>
sound/soc/sh/rcar/core.c

index 4fd57351c54ae81b6bd904898b0ae346f98d6add..11eb0e35b9cee303f115e32424725675dbc51393 100644 (file)
@@ -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;