ASoC: rsnd: cleanup pointer related code
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>
This commit is contained in:
parent
9bc3b4ff18
commit
a97a06c7ef
|
@ -551,40 +551,6 @@ static struct rsnd_dai *rsnd_dai_to_rdai(struct snd_soc_dai *dai)
|
||||||
/*
|
/*
|
||||||
* rsnd_soc_dai functions
|
* 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)
|
void rsnd_dai_period_elapsed(struct rsnd_dai_stream *io)
|
||||||
{
|
{
|
||||||
struct snd_pcm_substream *substream = io->substream;
|
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,
|
static void rsnd_dai_stream_init(struct rsnd_dai_stream *io,
|
||||||
struct snd_pcm_substream *substream)
|
struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
|
||||||
|
|
||||||
io->substream = substream;
|
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)
|
static void rsnd_dai_stream_quit(struct rsnd_dai_stream *io)
|
||||||
|
|
|
@ -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.
|
* In Gen2 case, it are Audio-DMAC, and Audio-DMAC-peri-peri.
|
||||||
* But, Audio-DMAC-peri-peri doesn't have interrupt,
|
* But, Audio-DMAC-peri-peri doesn't have interrupt,
|
||||||
* and this driver is assuming that here.
|
* 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);
|
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);
|
rsnd_dmaen_sync(dmaen, io, dmaen->dma_cnt + 2);
|
||||||
|
|
||||||
elapsed = rsnd_dai_pointer_update(io, io->byte_per_period);
|
elapsed = true;
|
||||||
|
|
||||||
dmaen->dma_cnt++;
|
dmaen->dma_cnt++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -432,10 +432,6 @@ struct rsnd_dai_stream {
|
||||||
struct rsnd_mod *mod[RSND_MOD_MAX];
|
struct rsnd_mod *mod[RSND_MOD_MAX];
|
||||||
struct rsnd_dai *rdai;
|
struct rsnd_dai *rdai;
|
||||||
u32 parent_ssi_status;
|
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(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)
|
#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);
|
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);
|
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,
|
int rsnd_dai_connect(struct rsnd_mod *mod,
|
||||||
struct rsnd_dai_stream *io,
|
struct rsnd_dai_stream *io,
|
||||||
enum rsnd_mod_type type);
|
enum rsnd_mod_type type);
|
||||||
|
|
|
@ -77,6 +77,11 @@ struct rsnd_ssi {
|
||||||
int rate;
|
int rate;
|
||||||
int irq;
|
int irq;
|
||||||
unsigned int usrcnt;
|
unsigned int usrcnt;
|
||||||
|
|
||||||
|
int byte_pos;
|
||||||
|
int period_pos;
|
||||||
|
int byte_per_period;
|
||||||
|
int next_period_byte;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* flags */
|
/* flags */
|
||||||
|
@ -374,6 +379,59 @@ static void rsnd_ssi_register_setup(struct rsnd_mod *mod)
|
||||||
ssi->cr_mode); /* without EN */
|
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
|
* 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))
|
if (!rsnd_ssi_is_run_mods(mod, io))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
rsnd_ssi_pointer_init(mod, io);
|
||||||
|
|
||||||
ssi->usrcnt++;
|
ssi->usrcnt++;
|
||||||
|
|
||||||
rsnd_mod_power_on(mod);
|
rsnd_mod_power_on(mod);
|
||||||
|
@ -566,7 +626,7 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
|
||||||
if (!is_dma && (status & DIRQ)) {
|
if (!is_dma && (status & DIRQ)) {
|
||||||
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
||||||
u32 *buf = (u32 *)(runtime->dma_area +
|
u32 *buf = (u32 *)(runtime->dma_area +
|
||||||
rsnd_dai_pointer_offset(io, 0));
|
rsnd_ssi_pointer_offset(mod, io, 0));
|
||||||
int shift = 0;
|
int shift = 0;
|
||||||
|
|
||||||
switch (runtime->sample_bits) {
|
switch (runtime->sample_bits) {
|
||||||
|
@ -585,7 +645,7 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
|
||||||
else
|
else
|
||||||
*buf = (rsnd_mod_read(mod, SSIRDR) >> shift);
|
*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 */
|
/* DMA only */
|
||||||
|
@ -696,9 +756,10 @@ static int rsnd_ssi_pointer(struct rsnd_mod *mod,
|
||||||
struct rsnd_dai_stream *io,
|
struct rsnd_dai_stream *io,
|
||||||
snd_pcm_uframes_t *pointer)
|
snd_pcm_uframes_t *pointer)
|
||||||
{
|
{
|
||||||
|
struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
|
||||||
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue