lkml.org 
[lkml]   [2009]   [Jun]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] [RFC] ASoC: OMAP: fix OMAP1510 broken PCM pointer callback
    Date
    This patch tries to work around the problem of broken OMAP1510 PCM playback 
    pointer calculation by replacing DMA function call that incorrectly tries to
    read the value form DMA hardware with a value computed locally from an
    already maintained variable omap_runtime_data.period_index.

    Tested on OMAP5910 based Amstrad Delta (E3) using work in progress ASoC
    driver.

    Based on linux-2.6-asoc.git v2.6.31-rc1.

    Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
    ---
    It seems that on OMAP1510, DMA Channel Progress Counter registers
    (DMA_CPC_CH[0-8]) always contain values derived from DMA channels destination
    port address, even if constant, and there are no DMA registers available that
    would follow DMA channels source port address. Because of this limitation,
    current implementation of omap_get_dma_src_pos() for OMAP1510 is broken and
    doesn't seem to be easy correctable.

    --- linux-2.6.31-rc1/sound/soc/omap/omap-pcm.c.orig 2009-06-27
    20:20:16.000000000 +0200
    +++ linux-2.6.31-rc1/sound/soc/omap/omap-pcm.c 2009-06-27 23:21:42.000000000
    +0200
    @@ -216,12 +216,15 @@ static snd_pcm_uframes_t omap_pcm_pointe
    dma_addr_t ptr;
    snd_pcm_uframes_t offset;

    - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
    - ptr = omap_get_dma_src_pos(prtd->dma_ch);
    - else
    + if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
    ptr = omap_get_dma_dst_pos(prtd->dma_ch);
    + offset = bytes_to_frames(runtime, ptr - runtime->dma_addr);
    + } else if (!(cpu_is_omap1510())) {
    + ptr = omap_get_dma_src_pos(prtd->dma_ch);
    + offset = bytes_to_frames(runtime, ptr - runtime->dma_addr);
    + } else
    + offset = prtd->period_index * runtime->period_size;

    - offset = bytes_to_frames(runtime, ptr - runtime->dma_addr);
    if (offset >= runtime->buffer_size)
    offset = 0;


    \
     
     \ /
      Last update: 2009-06-28 00:25    [W:3.912 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site