Skip to content

Commit

Permalink
ASoC: rsnd: cleanup pointer related code
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Mark Brown <[email protected]>
  • Loading branch information
morimoto authored and broonie committed Jun 7, 2017
1 parent 9bc3b4f commit a97a06c
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 56 deletions.
42 changes: 0 additions & 42 deletions sound/soc/sh/rcar/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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)
Expand Down
6 changes: 1 addition & 5 deletions sound/soc/sh/rcar/dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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++;
}
Expand Down
6 changes: 0 additions & 6 deletions sound/soc/sh/rcar/rsnd.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down
67 changes: 64 additions & 3 deletions sound/soc/sh/rcar/ssi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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
*/
Expand All @@ -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);
Expand Down Expand Up @@ -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) {
Expand All @@ -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 */
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit a97a06c

Please sign in to comment.