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
This commit is contained in:
commit
d2fe7fc51f
@ -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));
|
||||
}
|
||||
|
||||
static int rz_ssi_stream_is_valid(struct rz_ssi_priv *ssi,
|
||||
struct rz_ssi_stream *strm)
|
||||
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,
|
||||
struct snd_pcm_substream *substream)
|
||||
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,55 +408,57 @@ 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;
|
||||
/* 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;
|
||||
while (!done) {
|
||||
/* frames left in this period */
|
||||
frames_left = runtime->period_size -
|
||||
(strm->buffer_pos % runtime->period_size);
|
||||
if (!frames_left)
|
||||
frames_left = runtime->period_size;
|
||||
|
||||
/* Only read full frames at a time */
|
||||
while (frames_left && (fifo_samples >= runtime->channels)) {
|
||||
samples += runtime->channels;
|
||||
fifo_samples -= runtime->channels;
|
||||
frames_left--;
|
||||
/* 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 */
|
||||
if (!samples)
|
||||
break;
|
||||
|
||||
/* calculate new buffer index */
|
||||
buf = (u16 *)(runtime->dma_area);
|
||||
buf += strm->buffer_pos * runtime->channels;
|
||||
|
||||
/* Note, only supports 16-bit samples */
|
||||
for (i = 0; i < samples; i++)
|
||||
*buf++ = (u16)(rz_ssi_reg_readl(ssi, SSIFRDR) >> 16);
|
||||
|
||||
rz_ssi_reg_mask_setl(ssi, SSIFSR, SSIFSR_RDF, 0);
|
||||
rz_ssi_pointer_update(strm, samples / runtime->channels);
|
||||
|
||||
/* check if there are no more samples in the RX FIFO */
|
||||
if (!(!frames_left && fifo_samples >= runtime->channels))
|
||||
done = true;
|
||||
}
|
||||
|
||||
/* not enough samples yet */
|
||||
if (samples == 0)
|
||||
return 0;
|
||||
|
||||
/* calculate new buffer index */
|
||||
buf = (u16 *)(runtime->dma_area);
|
||||
buf += strm->buffer_pos * runtime->channels;
|
||||
|
||||
/* Note, only supports 16-bit samples */
|
||||
for (i = 0; i < samples; i++)
|
||||
*buf++ = (u16)(rz_ssi_reg_readl(ssi, SSIFRDR) >> 16);
|
||||
|
||||
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);
|
||||
|
||||
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));
|
||||
|
Loading…
Reference in New Issue
Block a user