ASoC: rsnd: cleanup pointer related code
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Wed, 7 Jun 2017 00:20:47 +0000 (00:20 +0000)
committerMark Brown <broonie@kernel.org>
Wed, 7 Jun 2017 19:30:38 +0000 (20:30 +0100)
Current rsnd driver is sharing pointer related code between
PIO / DMA. But, it is used only PIO mode now, no longer needed.
This patch cleanup these.

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

index 7a8c08933503f4e20a73c11f5aee36b39e0de49d..7c68f9d4a0ed125218411bcdd0b9fffbe2d36e50 100644 (file)
@@ -551,40 +551,6 @@ static struct rsnd_dai *rsnd_dai_to_rdai(struct snd_soc_dai *dai)
 /*
  *     rsnd_soc_dai functions
  */
-int rsnd_dai_pointer_offset(struct rsnd_dai_stream *io, int additional)
-{
-       struct snd_pcm_substream *substream = io->substream;
-       struct snd_pcm_runtime *runtime = substream->runtime;
-       int pos = io->byte_pos + additional;
-
-       pos %= (runtime->periods * io->byte_per_period);
-
-       return pos;
-}
-
-bool rsnd_dai_pointer_update(struct rsnd_dai_stream *io, int byte)
-{
-       io->byte_pos += byte;
-
-       if (io->byte_pos >= io->next_period_byte) {
-               struct snd_pcm_substream *substream = io->substream;
-               struct snd_pcm_runtime *runtime = substream->runtime;
-
-               io->period_pos++;
-               io->next_period_byte += io->byte_per_period;
-
-               if (io->period_pos >= runtime->periods) {
-                       io->byte_pos = 0;
-                       io->period_pos = 0;
-                       io->next_period_byte = io->byte_per_period;
-               }
-
-               return true;
-       }
-
-       return false;
-}
-
 void rsnd_dai_period_elapsed(struct rsnd_dai_stream *io)
 {
        struct snd_pcm_substream *substream = io->substream;
@@ -602,15 +568,7 @@ void rsnd_dai_period_elapsed(struct rsnd_dai_stream *io)
 static void rsnd_dai_stream_init(struct rsnd_dai_stream *io,
                                struct snd_pcm_substream *substream)
 {
-       struct snd_pcm_runtime *runtime = substream->runtime;
-
        io->substream           = substream;
-       io->byte_pos            = 0;
-       io->period_pos          = 0;
-       io->byte_per_period     = runtime->period_size *
-                                 runtime->channels *
-                                 samples_to_bytes(runtime, 1);
-       io->next_period_byte    = io->byte_per_period;
 }
 
 static void rsnd_dai_stream_quit(struct rsnd_dai_stream *io)
index 05e538f4c8d595121525d76304c5736e3ca8b90e..60aa5e96a49f97b3b3c3d384a7a36b4ad89a7041 100644 (file)
@@ -104,10 +104,6 @@ static void __rsnd_dmaen_complete(struct rsnd_mod *mod,
         * In Gen2 case, it are Audio-DMAC, and Audio-DMAC-peri-peri.
         * But, Audio-DMAC-peri-peri doesn't have interrupt,
         * and this driver is assuming that here.
-        *
-        * If Audio-DMAC-peri-peri has interrpt,
-        * rsnd_dai_pointer_update() will be called twice,
-        * ant it will breaks io->byte_pos
         */
        spin_lock_irqsave(&priv->lock, flags);
 
@@ -122,7 +118,7 @@ static void __rsnd_dmaen_complete(struct rsnd_mod *mod,
                 */
                rsnd_dmaen_sync(dmaen, io, dmaen->dma_cnt + 2);
 
-               elapsed = rsnd_dai_pointer_update(io, io->byte_per_period);
+               elapsed = true;
 
                dmaen->dma_cnt++;
        }
index bd8def0bc212e50ee19681e34fac7c31f1f104ea..6de5f7ec6464263d7b50ba517cbe9e79bf7d8119 100644 (file)
@@ -432,10 +432,6 @@ struct rsnd_dai_stream {
        struct rsnd_mod *mod[RSND_MOD_MAX];
        struct rsnd_dai *rdai;
        u32 parent_ssi_status;
-       int byte_pos;
-       int period_pos;
-       int byte_per_period;
-       int next_period_byte;
 };
 #define rsnd_io_to_mod(io, i)  ((i) < RSND_MOD_MAX ? (io)->mod[(i)] : NULL)
 #define rsnd_io_to_mod_ssi(io) rsnd_io_to_mod((io), RSND_MOD_SSI)
@@ -480,9 +476,7 @@ struct rsnd_dai {
 
 struct rsnd_dai *rsnd_rdai_get(struct rsnd_priv *priv, int id);
 
-bool rsnd_dai_pointer_update(struct rsnd_dai_stream *io, int cnt);
 void rsnd_dai_period_elapsed(struct rsnd_dai_stream *io);
-int rsnd_dai_pointer_offset(struct rsnd_dai_stream *io, int additional);
 int rsnd_dai_connect(struct rsnd_mod *mod,
                     struct rsnd_dai_stream *io,
                     enum rsnd_mod_type type);
index 59ca6e3f46bca88be123d781f23fa5f57ef74ac5..f7df3b5e2985265f53ccb4097a7fb23e46cfbb90 100644 (file)
@@ -77,6 +77,11 @@ struct rsnd_ssi {
        int rate;
        int irq;
        unsigned int usrcnt;
+
+       int byte_pos;
+       int period_pos;
+       int byte_per_period;
+       int next_period_byte;
 };
 
 /* flags */
@@ -374,6 +379,59 @@ static void rsnd_ssi_register_setup(struct rsnd_mod *mod)
                                        ssi->cr_mode); /* without EN */
 }
 
+static void rsnd_ssi_pointer_init(struct rsnd_mod *mod,
+                                 struct rsnd_dai_stream *io)
+{
+       struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+       struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+
+       ssi->byte_pos           = 0;
+       ssi->period_pos         = 0;
+       ssi->byte_per_period    = runtime->period_size *
+                                 runtime->channels *
+                                 samples_to_bytes(runtime, 1);
+       ssi->next_period_byte   = ssi->byte_per_period;
+}
+
+static int rsnd_ssi_pointer_offset(struct rsnd_mod *mod,
+                                  struct rsnd_dai_stream *io,
+                                  int additional)
+{
+       struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+       struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+       int pos = ssi->byte_pos + additional;
+
+       pos %= (runtime->periods * ssi->byte_per_period);
+
+       return pos;
+}
+
+static bool rsnd_ssi_pointer_update(struct rsnd_mod *mod,
+                                   struct rsnd_dai_stream *io,
+                                   int byte)
+{
+       struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+
+       ssi->byte_pos += byte;
+
+       if (ssi->byte_pos >= ssi->next_period_byte) {
+               struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+
+               ssi->period_pos++;
+               ssi->next_period_byte += ssi->byte_per_period;
+
+               if (ssi->period_pos >= runtime->periods) {
+                       ssi->byte_pos = 0;
+                       ssi->period_pos = 0;
+                       ssi->next_period_byte = ssi->byte_per_period;
+               }
+
+               return true;
+       }
+
+       return false;
+}
+
 /*
  *     SSI mod common functions
  */
@@ -387,6 +445,8 @@ static int rsnd_ssi_init(struct rsnd_mod *mod,
        if (!rsnd_ssi_is_run_mods(mod, io))
                return 0;
 
+       rsnd_ssi_pointer_init(mod, io);
+
        ssi->usrcnt++;
 
        rsnd_mod_power_on(mod);
@@ -566,7 +626,7 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
        if (!is_dma && (status & DIRQ)) {
                struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
                u32 *buf = (u32 *)(runtime->dma_area +
-                                  rsnd_dai_pointer_offset(io, 0));
+                                  rsnd_ssi_pointer_offset(mod, io, 0));
                int shift = 0;
 
                switch (runtime->sample_bits) {
@@ -585,7 +645,7 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
                else
                        *buf = (rsnd_mod_read(mod, SSIRDR) >> shift);
 
-               elapsed = rsnd_dai_pointer_update(io, sizeof(*buf));
+               elapsed = rsnd_ssi_pointer_update(mod, io, sizeof(*buf));
        }
 
        /* DMA only */
@@ -696,9 +756,10 @@ static int rsnd_ssi_pointer(struct rsnd_mod *mod,
                            struct rsnd_dai_stream *io,
                            snd_pcm_uframes_t *pointer)
 {
+       struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
        struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
 
-       *pointer = bytes_to_frames(runtime, io->byte_pos);
+       *pointer = bytes_to_frames(runtime, ssi->byte_pos);
 
        return 0;
 }