• Janusz Krzysztofik's avatar
    dmaengine: ti: omap-dma: Fix OMAP1510 incorrect residue_granularity · c9bd0946
    Janusz Krzysztofik authored
    Commit 0198d7bb ("ASoC: omap-mcbsp: Convert to use the sdma-pcm
    instead of omap-pcm") resulted in broken audio playback on OMAP1510
    (discovered on Amstrad Delta).
    
    When running on OMAP1510, omap-pcm used to obtain DMA offset from
    snd_dmaengine_pcm_pointer_no_residue() based on DMA interrupt triggered
    software calculations instead of snd_dmaengine_pcm_pointer() which
    depended on residue value calculated from omap_dma_get_src_pos().
    Similar code path is still available in now used
    sound/soc/soc-generic-dmaengine-pcm.c but it is not triggered.
    
    It was verified already before that omap_get_dma_src_pos() from
    arch/arm/plat-omap/dma.c didn't work correctly for OMAP1510 - see
    commit 1bdd7419 ("ASoC: OMAP: fix OMAP1510 broken PCM pointer
    callback") for details.  Apparently the same applies to its successor,
    omap_dma_get_src_pos() from drivers/dma/ti/omap-dma.c.
    
    On the other hand, snd_dmaengine_pcm_pointer_no_residue() is described
    as depreciated and discouraged for use in new drivers because of its
    unreliable accuracy.  However, it seems the only working option for
    OPAM1510 now, as long as a software calculated residue is not
    implemented as OMAP1510 fallback in omap-dma.
    
    Using snd_dmaengine_pcm_pointer_no_residue() code path instead of
    snd_dmaengine_pcm_pointer() in sound/soc/soc-generic-dmaengine-pcm.c
    can be triggered in two ways:
    - by passing pcm->flags |= SND_DMAENGINE_PCM_FLAG_NO_RESIDUE from
      sound/soc/omap/sdma-pcm.c,
    - by passing dma_caps.residue_granularity =
      DMA_RESIDUE_GRANULARITY_DESCRIPTOR from DMA engine.
    
    Let's do the latter.
    Signed-off-by: default avatarJanusz Krzysztofik <jmkrzyszt@gmail.com>
    Acked-by: default avatarPeter Ujfalusi <peter.ujfalusi@ti.com>
    Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
    c9bd0946
omap-dma.c 40.6 KB