ASoC: rsnd: tidyup SSI interrupt enable/disable method
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Thu, 27 Nov 2014 08:05:09 +0000 (08:05 +0000)
committerMark Brown <broonie@kernel.org>
Wed, 3 Dec 2014 18:51:39 +0000 (18:51 +0000)
Current SSI doesn't care interrupt "disable" method. And, it is used
when PIO mode only at this point. SSI interrupt will be used for
sound R/L issue workaround when DMA mode too.
This patch tidyup SSI interrupt enable/disable method.

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

index 12e894538422444b97d1efa91d2a8305697269e6..48999b1b2aa78638bddf5aeb32e1f18b5c38d410 100644 (file)
@@ -432,8 +432,10 @@ int rsnd_src_ssiu_start(struct rsnd_mod *ssi_mod,
                        int use_busif);
 int rsnd_src_ssiu_stop(struct rsnd_mod *ssi_mod,
                       struct rsnd_dai *rdai);
-int rsnd_src_enable_ssi_irq(struct rsnd_mod *ssi_mod,
+int rsnd_src_ssi_irq_enable(struct rsnd_mod *ssi_mod,
                            struct rsnd_dai *rdai);
+int rsnd_src_ssi_irq_disable(struct rsnd_mod *ssi_mod,
+                            struct rsnd_dai *rdai);
 
 #define rsnd_src_nr(priv) ((priv)->src_nr)
 
index 384af90a2f7411673aac8fa5cfcf0cbba062b6e5..c30119533107837b3985cc921270b3f4396beb41 100644 (file)
@@ -185,18 +185,37 @@ int rsnd_src_ssiu_stop(struct rsnd_mod *ssi_mod,
        return 0;
 }
 
-int rsnd_src_enable_ssi_irq(struct rsnd_mod *ssi_mod,
+int rsnd_src_ssi_irq_enable(struct rsnd_mod *ssi_mod,
                            struct rsnd_dai *rdai)
 {
        struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
 
-       /* enable PIO interrupt if Gen2 */
-       if (rsnd_is_gen2(priv))
+       if (rsnd_is_gen1(priv))
+               return 0;
+
+       /* enable SSI interrupt if Gen2 */
+       if (rsnd_ssi_is_dma_mode(ssi_mod))
+               rsnd_mod_write(ssi_mod, INT_ENABLE, 0x0e000000);
+       else
                rsnd_mod_write(ssi_mod, INT_ENABLE, 0x0f000000);
 
        return 0;
 }
 
+int rsnd_src_ssi_irq_disable(struct rsnd_mod *ssi_mod,
+                           struct rsnd_dai *rdai)
+{
+       struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
+
+       if (rsnd_is_gen1(priv))
+               return 0;
+
+       /* disable SSI interrupt if Gen2 */
+       rsnd_mod_write(ssi_mod, INT_ENABLE, 0x00000000);
+
+       return 0;
+}
+
 unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv,
                                   struct rsnd_dai_stream *io,
                                   struct snd_pcm_runtime *runtime)
index 8928913ad452e075a2ed97efb93d60498e954a85..42d7c7e8226bae23ce71c0acd4faaa6d215b80cf 100644 (file)
@@ -410,10 +410,10 @@ static int rsnd_ssi_pio_start(struct rsnd_mod *mod,
 
        rsnd_src_ssiu_start(mod, rdai, 0);
 
-       rsnd_src_enable_ssi_irq(mod, rdai);
-
        rsnd_ssi_hw_start(ssi, rdai, io);
 
+       rsnd_src_ssi_irq_enable(mod, rdai);
+
        return 0;
 }
 
@@ -422,6 +422,8 @@ static int rsnd_ssi_pio_stop(struct rsnd_mod *mod,
 {
        struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
 
+       rsnd_src_ssi_irq_disable(mod, rdai);
+
        rsnd_ssi_hw_stop(ssi, rdai);
 
        rsnd_src_ssiu_stop(mod, rdai);