static snd_pcm_uframes_t s3c_idma_pointer(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct s3c_dma_params *dma = rtd->dai->cpu_dai->dma_data; struct snd_pcm_runtime *runtime = substream->runtime; struct lpam_i2s_pdata *prtd = runtime->private_data; dma_addr_t src, dst; unsigned long res; spin_lock(&prtd->lock); #if 1 dst = dma->dma_addr; s3c_idma_getpos(&src); res = src - runtime->dma_addr; #else res = prtd->pos - prtd->start; #endif spin_unlock(&prtd->lock); /* By Jung */ if (res >= snd_pcm_lib_buffer_bytes(substream)) { if (res == snd_pcm_lib_buffer_bytes(substream)) res = 0; } return bytes_to_frames(substream->runtime, res); }
static snd_pcm_uframes_t s3c_idma_pointer(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; struct lpam_i2s_pdata *prtd = runtime->private_data; dma_addr_t src; unsigned long res; spin_lock(&prtd->lock); s3c_idma_getpos(&src); res = src - prtd->start; spin_unlock(&prtd->lock); if (res >= snd_pcm_lib_buffer_bytes(substream)) { if (res == snd_pcm_lib_buffer_bytes(substream)) res = 0; } return bytes_to_frames(substream->runtime, res); }