Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a97a06c7 authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Mark Brown
Browse files

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: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 9bc3b4ff
Loading
Loading
Loading
Loading
+0 −42
Original line number Diff line number Diff line
@@ -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)
+1 −5
Original line number Diff line number Diff line
@@ -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++;
	}
+0 −6
Original line number Diff line number Diff line
@@ -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);
+64 −3
Original line number Diff line number Diff line
@@ -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;
}