Unverified Commit d2fe7fc5 authored by Mark Brown's avatar Mark Brown
Browse files

ASoC: sh: rz-ssi: Code cleanup and fixes

Merge series from Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>:

Hi All,

This patch series does code cleanup and fixes to the rz-ssi driver.

Cheers,
Prabhakar

Lad Prabhakar (5):
  ASoC: sh: rz-ssi: Drop calling rz_ssi_pio_recv() recursively
  ASoC: sh: rz-ssi: Make the data structures available before
    registering the handlers
  ASoC: sh: rz-ssi: Drop ssi parameter from rz_ssi_stream_init()
  ASoC: sh: rz-ssi: Make return type of rz_ssi_stream_is_valid() to bool
  ASoC: sh: rz-ssi: Add functions to get/set substream pointer

 sound/soc/sh/rz-ssi.c | 147 ++++++++++++++++++++++++------------------
 1 file changed, 86 insertions(+), 61 deletions(-)

--
2.17.1
parents 8bcd0f12 e42c903e
Loading
Loading
Loading
Loading
+45 −47
Original line number Diff line number Diff line
@@ -188,21 +188,20 @@ static inline bool rz_ssi_is_dma_enabled(struct rz_ssi_priv *ssi)
	return (ssi->playback.dma_ch && (ssi->dma_rt || ssi->capture.dma_ch));
}

static int rz_ssi_stream_is_valid(struct rz_ssi_priv *ssi,
static bool rz_ssi_stream_is_valid(struct rz_ssi_priv *ssi,
				   struct rz_ssi_stream *strm)
{
	unsigned long flags;
	int ret;
	bool ret;

	spin_lock_irqsave(&ssi->lock, flags);
	ret = !!(strm->substream && strm->substream->runtime);
	ret = strm->substream && strm->substream->runtime;
	spin_unlock_irqrestore(&ssi->lock, flags);

	return ret;
}

static int rz_ssi_stream_init(struct rz_ssi_priv *ssi,
			      struct rz_ssi_stream *strm,
static void rz_ssi_stream_init(struct rz_ssi_stream *strm,
			       struct snd_pcm_substream *substream)
{
	struct snd_pcm_runtime *runtime = substream->runtime;
@@ -219,8 +218,6 @@ static int rz_ssi_stream_init(struct rz_ssi_priv *ssi,

	/* fifo init */
	strm->fifo_sample_size = SSI_FIFO_DEPTH;

	return 0;
}

static void rz_ssi_stream_quit(struct rz_ssi_priv *ssi,
@@ -411,20 +408,23 @@ static int rz_ssi_pio_recv(struct rz_ssi_priv *ssi, struct rz_ssi_stream *strm)
{
	struct snd_pcm_substream *substream = strm->substream;
	struct snd_pcm_runtime *runtime;
	bool done = false;
	u16 *buf;
	int fifo_samples;
	int frames_left;
	int samples = 0;
	int samples;
	int i;

	if (!rz_ssi_stream_is_valid(ssi, strm))
		return -EINVAL;

	runtime = substream->runtime;

	while (!done) {
		/* frames left in this period */
	frames_left = runtime->period_size - (strm->buffer_pos %
					      runtime->period_size);
	if (frames_left == 0)
		frames_left = runtime->period_size -
			      (strm->buffer_pos % runtime->period_size);
		if (!frames_left)
			frames_left = runtime->period_size;

		/* Samples in RX FIFO */
@@ -432,6 +432,7 @@ static int rz_ssi_pio_recv(struct rz_ssi_priv *ssi, struct rz_ssi_stream *strm)
				SSIFSR_RDC_SHIFT) & SSIFSR_RDC_MASK;

		/* Only read full frames at a time */
		samples = 0;
		while (frames_left && (fifo_samples >= runtime->channels)) {
			samples += runtime->channels;
			fifo_samples -= runtime->channels;
@@ -439,8 +440,8 @@ static int rz_ssi_pio_recv(struct rz_ssi_priv *ssi, struct rz_ssi_stream *strm)
		}

		/* not enough samples yet */
	if (samples == 0)
		return 0;
		if (!samples)
			break;

		/* calculate new buffer index */
		buf = (u16 *)(runtime->dma_area);
@@ -453,12 +454,10 @@ static int rz_ssi_pio_recv(struct rz_ssi_priv *ssi, struct rz_ssi_stream *strm)
		rz_ssi_reg_mask_setl(ssi, SSIFSR, SSIFSR_RDF, 0);
		rz_ssi_pointer_update(strm, samples / runtime->channels);

	/*
	 * If we finished this period, but there are more samples in
	 * the RX FIFO, call this function again
	 */
	if (frames_left == 0 && fifo_samples >= runtime->channels)
		rz_ssi_pio_recv(ssi, strm);
		/* check if there are no more samples in the RX FIFO */
		if (!(!frames_left && fifo_samples >= runtime->channels))
			done = true;
	}

	return 0;
}
@@ -726,9 +725,7 @@ static int rz_ssi_dai_trigger(struct snd_pcm_substream *substream, int cmd,
		rz_ssi_reg_mask_setl(ssi, SSIFCR, SSIFCR_SSIRST, 0);
		udelay(5);

		ret = rz_ssi_stream_init(ssi, strm, substream);
		if (ret)
			goto done;
		rz_ssi_stream_init(strm, substream);

		if (ssi->dma_rt) {
			bool is_playback;
@@ -975,6 +972,9 @@ static int rz_ssi_probe(struct platform_device *pdev)
	ssi->playback.priv = ssi;
	ssi->capture.priv = ssi;

	spin_lock_init(&ssi->lock);
	dev_set_drvdata(&pdev->dev, ssi);

	/* Error Interrupt */
	ssi->irq_int = platform_get_irq_byname(pdev, "int_req");
	if (ssi->irq_int < 0)
@@ -1027,8 +1027,6 @@ static int rz_ssi_probe(struct platform_device *pdev)
		return dev_err_probe(ssi->dev, ret, "pm_runtime_resume_and_get failed\n");
	}

	spin_lock_init(&ssi->lock);
	dev_set_drvdata(&pdev->dev, ssi);
	ret = devm_snd_soc_register_component(&pdev->dev, &rz_ssi_soc_component,
					      rz_ssi_soc_dai,
					      ARRAY_SIZE(rz_ssi_soc_dai));