• S
    ASoC: S3C platform: Fix s3c2410_dma_started() called at improper time · faf907c7
    Shine Liu 提交于
    s3c24xx dma has the auto reload feature, when the the trnasfer is done,
    CURR_TC(DSTAT[19:0], current value of transfer count) reaches 0, and DMA
    ACK becomes 1, and then, TC(DCON[19:0]) will be loaded into CURR_TC. So
    the transmission is repeated.
    
    IRQ is issued while auto reload occurs. We change the DISRC and
    DCON[19:0] in the ISR, but at this time, the auto reload has been
    performed already. The first block is being re-transmitted by the DMA.
    
    So we need rewrite the DISRC and DCON[19:0] for the next block
    immediatly after the this block has been started to be transported.
    
    The function s3c2410_dma_started() is for this perpose, which is called
    in the form of "s3c2410_dma_ctrl(prtd->params->channel,
    S3C2410_DMAOP_STARTED);" in s3c24xx_pcm_trigger().
    
    But it is not correct. DMA transmission won't start until DMA REQ signal
    arrived, it is the time s3c24xx_snd_txctrl(1) or s3c24xx_snd_rxctrl(1)
    is called in s3c24xx_i2s_trigger().
    
    In the current framework, s3c24xx_pcm_trigger() is always called before
    s3c24xx_pcm_trigger(). So the s3c2410_dma_started() should be called in
    s3c24xx_pcm_trigger() after s3c24xx_snd_txctrl(1) or
    s3c24xx_snd_rxctrl(1) is called in this function.
    
    However, s3c2410_dma_started() is dma related, to call this function we
    should provide the channel number, which is given by
    substream->runtime->private_data->params->channel. The private_data
    points to a struct s3c24xx_runtime_data object, which is define in
    s3c24xx_pcm.c, so s3c2410_dma_started() can't be called in s3c24xx_i2s.c
    
    Fix this by moving the call to signal the DMA started to the DAI
    drivers.
    Signed-off-by: NShine Liu <liuxian@redflag-linux.com>
    Signed-off-by: NShine Liu <shinel@foxmail.com>
    Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
    faf907c7
s3c-i2s-v2.c 17.1 KB