diff options
Diffstat (limited to 'sound/soc/codecs/rt5514-spi.c')
| -rw-r--r-- | sound/soc/codecs/rt5514-spi.c | 17 | 
1 files changed, 15 insertions, 2 deletions
| diff --git a/sound/soc/codecs/rt5514-spi.c b/sound/soc/codecs/rt5514-spi.c index ed6e5373916c..12f2ecf3a4fe 100644 --- a/sound/soc/codecs/rt5514-spi.c +++ b/sound/soc/codecs/rt5514-spi.c @@ -145,9 +145,8 @@ done:  	mutex_unlock(&rt5514_dsp->dma_lock);  } -static irqreturn_t rt5514_spi_irq(int irq, void *data) +static void rt5514_schedule_copy(struct rt5514_dsp *rt5514_dsp)  { -	struct rt5514_dsp *rt5514_dsp = data;  	u8 buf[8];  	rt5514_dsp->get_size = 0; @@ -180,6 +179,13 @@ static irqreturn_t rt5514_spi_irq(int irq, void *data)  	if (rt5514_dsp->buf_base && rt5514_dsp->buf_limit &&  		rt5514_dsp->buf_rp && rt5514_dsp->buf_size)  		schedule_delayed_work(&rt5514_dsp->copy_work, 0); +} + +static irqreturn_t rt5514_spi_irq(int irq, void *data) +{ +	struct rt5514_dsp *rt5514_dsp = data; + +	rt5514_schedule_copy(rt5514_dsp);  	return IRQ_HANDLED;  } @@ -199,12 +205,19 @@ static int rt5514_spi_hw_params(struct snd_pcm_substream *substream,  	struct rt5514_dsp *rt5514_dsp =  			snd_soc_platform_get_drvdata(rtd->platform);  	int ret; +	u8 buf[8];  	mutex_lock(&rt5514_dsp->dma_lock);  	ret = snd_pcm_lib_alloc_vmalloc_buffer(substream,  			params_buffer_bytes(hw_params));  	rt5514_dsp->substream = substream;  	rt5514_dsp->dma_offset = 0; + +	/* Read IRQ status and schedule copy accordingly. */ +	rt5514_spi_burst_read(RT5514_IRQ_CTRL, (u8 *)&buf, sizeof(buf)); +	if (buf[0] & RT5514_IRQ_STATUS_BIT) +		rt5514_schedule_copy(rt5514_dsp); +  	mutex_unlock(&rt5514_dsp->dma_lock);  	return ret; | 
