Commit d2fe7fc5 authored by Mark Brown's avatar Mark Brown

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
...@@ -188,22 +188,21 @@ static inline bool rz_ssi_is_dma_enabled(struct rz_ssi_priv *ssi) ...@@ -188,22 +188,21 @@ 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)); 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) struct rz_ssi_stream *strm)
{ {
unsigned long flags; unsigned long flags;
int ret; bool ret;
spin_lock_irqsave(&ssi->lock, flags); spin_lock_irqsave(&ssi->lock, flags);
ret = !!(strm->substream && strm->substream->runtime); ret = strm->substream && strm->substream->runtime;
spin_unlock_irqrestore(&ssi->lock, flags); spin_unlock_irqrestore(&ssi->lock, flags);
return ret; return ret;
} }
static int rz_ssi_stream_init(struct rz_ssi_priv *ssi, static void rz_ssi_stream_init(struct rz_ssi_stream *strm,
struct rz_ssi_stream *strm, struct snd_pcm_substream *substream)
struct snd_pcm_substream *substream)
{ {
struct snd_pcm_runtime *runtime = substream->runtime; struct snd_pcm_runtime *runtime = substream->runtime;
...@@ -219,8 +218,6 @@ static int rz_ssi_stream_init(struct rz_ssi_priv *ssi, ...@@ -219,8 +218,6 @@ static int rz_ssi_stream_init(struct rz_ssi_priv *ssi,
/* fifo init */ /* fifo init */
strm->fifo_sample_size = SSI_FIFO_DEPTH; strm->fifo_sample_size = SSI_FIFO_DEPTH;
return 0;
} }
static void rz_ssi_stream_quit(struct rz_ssi_priv *ssi, static void rz_ssi_stream_quit(struct rz_ssi_priv *ssi,
...@@ -411,54 +408,56 @@ static int rz_ssi_pio_recv(struct rz_ssi_priv *ssi, struct rz_ssi_stream *strm) ...@@ -411,54 +408,56 @@ 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_substream *substream = strm->substream;
struct snd_pcm_runtime *runtime; struct snd_pcm_runtime *runtime;
bool done = false;
u16 *buf; u16 *buf;
int fifo_samples; int fifo_samples;
int frames_left; int frames_left;
int samples = 0; int samples;
int i; int i;
if (!rz_ssi_stream_is_valid(ssi, strm)) if (!rz_ssi_stream_is_valid(ssi, strm))
return -EINVAL; return -EINVAL;
runtime = substream->runtime; runtime = substream->runtime;
/* 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;
/* Samples in RX FIFO */
fifo_samples = (rz_ssi_reg_readl(ssi, SSIFSR) >>
SSIFSR_RDC_SHIFT) & SSIFSR_RDC_MASK;
/* Only read full frames at a time */ while (!done) {
while (frames_left && (fifo_samples >= runtime->channels)) { /* frames left in this period */
samples += runtime->channels; frames_left = runtime->period_size -
fifo_samples -= runtime->channels; (strm->buffer_pos % runtime->period_size);
frames_left--; if (!frames_left)
} frames_left = runtime->period_size;
/* Samples in RX FIFO */
fifo_samples = (rz_ssi_reg_readl(ssi, SSIFSR) >>
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;
frames_left--;
}
/* not enough samples yet */ /* not enough samples yet */
if (samples == 0) if (!samples)
return 0; break;
/* calculate new buffer index */ /* calculate new buffer index */
buf = (u16 *)(runtime->dma_area); buf = (u16 *)(runtime->dma_area);
buf += strm->buffer_pos * runtime->channels; buf += strm->buffer_pos * runtime->channels;
/* Note, only supports 16-bit samples */ /* Note, only supports 16-bit samples */
for (i = 0; i < samples; i++) for (i = 0; i < samples; i++)
*buf++ = (u16)(rz_ssi_reg_readl(ssi, SSIFRDR) >> 16); *buf++ = (u16)(rz_ssi_reg_readl(ssi, SSIFRDR) >> 16);
rz_ssi_reg_mask_setl(ssi, SSIFSR, SSIFSR_RDF, 0); rz_ssi_reg_mask_setl(ssi, SSIFSR, SSIFSR_RDF, 0);
rz_ssi_pointer_update(strm, samples / runtime->channels); rz_ssi_pointer_update(strm, samples / runtime->channels);
/* /* check if there are no more samples in the RX FIFO */
* If we finished this period, but there are more samples in if (!(!frames_left && fifo_samples >= runtime->channels))
* the RX FIFO, call this function again done = true;
*/ }
if (frames_left == 0 && fifo_samples >= runtime->channels)
rz_ssi_pio_recv(ssi, strm);
return 0; return 0;
} }
...@@ -726,9 +725,7 @@ static int rz_ssi_dai_trigger(struct snd_pcm_substream *substream, int cmd, ...@@ -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); rz_ssi_reg_mask_setl(ssi, SSIFCR, SSIFCR_SSIRST, 0);
udelay(5); udelay(5);
ret = rz_ssi_stream_init(ssi, strm, substream); rz_ssi_stream_init(strm, substream);
if (ret)
goto done;
if (ssi->dma_rt) { if (ssi->dma_rt) {
bool is_playback; bool is_playback;
...@@ -975,6 +972,9 @@ static int rz_ssi_probe(struct platform_device *pdev) ...@@ -975,6 +972,9 @@ static int rz_ssi_probe(struct platform_device *pdev)
ssi->playback.priv = ssi; ssi->playback.priv = ssi;
ssi->capture.priv = ssi; ssi->capture.priv = ssi;
spin_lock_init(&ssi->lock);
dev_set_drvdata(&pdev->dev, ssi);
/* Error Interrupt */ /* Error Interrupt */
ssi->irq_int = platform_get_irq_byname(pdev, "int_req"); ssi->irq_int = platform_get_irq_byname(pdev, "int_req");
if (ssi->irq_int < 0) if (ssi->irq_int < 0)
...@@ -1027,8 +1027,6 @@ static int rz_ssi_probe(struct platform_device *pdev) ...@@ -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"); 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, ret = devm_snd_soc_register_component(&pdev->dev, &rz_ssi_soc_component,
rz_ssi_soc_dai, rz_ssi_soc_dai,
ARRAY_SIZE(rz_ssi_soc_dai)); ARRAY_SIZE(rz_ssi_soc_dai));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment