[RFC] ASoC: fsl-ssi: Missing DMA-Request workaround
Shawn Guo
shawn.guo at linaro.org
Mon Nov 11 20:49:16 EST 2013
Copy Nicolin.
Shawn
On Mon, Nov 11, 2013 at 05:03:36PM +0100, Markus Pargmann wrote:
> There is a hardware issue when using capture and playback at the same
> time. In the tested scenario, the capture stream was started slightly
> before the playback stream. The first time the application starts after
> a powerup, there is a high probability that the SSI unit does not send a
> request to the SDMA unit. The playback does not work. I tested this on
> i.MX53 with SSI unit 2 kernel 3.10.10.
>
> Here is a register dump of the situation:
> SDMA
> 0x63fb0000
> 00000000: c0040000 00000000 0000001e 00000000
> 00000010: 00000001 ffffffff 00000000 e03efa41
> 00000020: 00000000 00000000 00000000 00000000
> 00000030: 00000064 00000000 00000003 00000000
> 00000040: 00000000 00000000 00000000 00006000
> 00000050: 00000000 00000000 00000001 00004050
> 00000060: 01208000 00000000 00000000 00000000 /* 0x60: EVT_MIRROR showing all received DMA requests */
> ^ This should be a 3 instead. Bits 24 and 25 are the DMA requests for
> RX and TX. Bit 25 is not set, DMA request 25 is missing.
>
> SSI
> 0x50014000
> 00000000: 00000000 00000000 0000005f 00000000
> 00000010: 00000457 000050c1 01f80f00 0000028d /* 0x14: ISR Interrupt status register */
> ^
> At 0x14 we can clearly see the last bit is set (0x1) which
> is TFE0, Transmit FIFO 0 empty. So it should automatically
> request data from the DMA engine, but it doesn't.
>
> 00000020: 0000028d 0004e000 00040000 000010dd
> 00000030: 00001f1f 00000000 00000000 00000000
> 00000040: 00000000 00000000 00000000 00000000
> 00000050: 00000000 00000000 ........
> STATS (/sys/bus/platform/devices/50014000.ssi/statistics)
> rfrc=0
> tfrc=0
> roe1=0
> roe0=0
> tue1=0
> tue0=1094475
>
> I could solve this issue by filling the transmit FIFO with data. After
> that, the SDMA unit receives DMA request 25 again and audio playback
> works.
>
> This patch adds TUE0 interrupt handler which fills FIFO0 with arbitrary data.
>
> Signed-off-by: Markus Pargmann <mpa at pengutronix.de>
> ---
>
> Hi,
>
> does anyone have an idea why the SSI unit does not request DMA by its own at
> the beginning? Or is it a hardware errata that is not listed yet?
>
> Regards,
>
> Markus Pargmann
>
>
> sound/soc/fsl/fsl_ssi.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c
> index 6b81d0c..8faf2b5 100644
> --- a/sound/soc/fsl/fsl_ssi.c
> +++ b/sound/soc/fsl/fsl_ssi.c
> @@ -269,9 +269,14 @@ static irqreturn_t fsl_ssi_isr(int irq, void *dev_id)
> }
>
> if (sisr & CCSR_SSI_SISR_TUE0) {
> + int i;
> +
> ssi_private->stats.tue0++;
> sisr2 |= CCSR_SSI_SISR_TUE0;
> ret = IRQ_HANDLED;
> +
> + for (i = 0; i != ssi_private->fifo_depth; ++i)
> + write_ssi(0x0, &ssi->stx0);
> }
>
> if (sisr & CCSR_SSI_SISR_TFS) {
> --
> 1.8.4.2
>
More information about the linux-arm-kernel
mailing list