ARM: Merge fixes-s3c64xx-dma
Merge branch 'fixes-s3c64xx-dma' into fixes-s3c-2632-rc5
This commit is contained in:
commit
fe4b83c4b6
@ -110,6 +110,8 @@ enum s3c2410_dma_loadst {
|
|||||||
* waiting for reloads */
|
* waiting for reloads */
|
||||||
#define S3C2410_DMAF_AUTOSTART (1<<1) /* auto-start if buffer queued */
|
#define S3C2410_DMAF_AUTOSTART (1<<1) /* auto-start if buffer queued */
|
||||||
|
|
||||||
|
#define S3C2410_DMAF_CIRCULAR (1 << 2) /* no circular dma support */
|
||||||
|
|
||||||
/* dma buffer */
|
/* dma buffer */
|
||||||
|
|
||||||
struct s3c2410_dma_buf;
|
struct s3c2410_dma_buf;
|
||||||
@ -194,4 +196,9 @@ struct s3c2410_dma_chan {
|
|||||||
|
|
||||||
typedef unsigned long dma_device_t;
|
typedef unsigned long dma_device_t;
|
||||||
|
|
||||||
|
static inline bool s3c_dma_has_circular(void)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* __ASM_ARCH_DMA_H */
|
#endif /* __ASM_ARCH_DMA_H */
|
||||||
|
@ -68,6 +68,11 @@ static __inline__ int s3c_dma_has_circular(void)
|
|||||||
|
|
||||||
#define S3C2410_DMAF_CIRCULAR (1 << 0)
|
#define S3C2410_DMAF_CIRCULAR (1 << 0)
|
||||||
|
|
||||||
|
static inline bool s3c_dma_has_circular(void)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
#include <plat/dma.h>
|
#include <plat/dma.h>
|
||||||
|
|
||||||
#endif /* __ASM_ARCH_IRQ_H */
|
#endif /* __ASM_ARCH_IRQ_H */
|
||||||
|
@ -75,11 +75,19 @@ static void s3c24xx_pcm_enqueue(struct snd_pcm_substream *substream)
|
|||||||
{
|
{
|
||||||
struct s3c24xx_runtime_data *prtd = substream->runtime->private_data;
|
struct s3c24xx_runtime_data *prtd = substream->runtime->private_data;
|
||||||
dma_addr_t pos = prtd->dma_pos;
|
dma_addr_t pos = prtd->dma_pos;
|
||||||
|
unsigned int limit;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
pr_debug("Entered %s\n", __func__);
|
pr_debug("Entered %s\n", __func__);
|
||||||
|
|
||||||
while (prtd->dma_loaded < prtd->dma_limit) {
|
if (s3c_dma_has_circular()) {
|
||||||
|
limit = (prtd->dma_end - prtd->dma_start) / prtd->dma_period;
|
||||||
|
} else
|
||||||
|
limit = prtd->dma_limit;
|
||||||
|
|
||||||
|
pr_debug("%s: loaded %d, limit %d\n", __func__, prtd->dma_loaded, limit);
|
||||||
|
|
||||||
|
while (prtd->dma_loaded < limit) {
|
||||||
unsigned long len = prtd->dma_period;
|
unsigned long len = prtd->dma_period;
|
||||||
|
|
||||||
pr_debug("dma_loaded: %d\n", prtd->dma_loaded);
|
pr_debug("dma_loaded: %d\n", prtd->dma_loaded);
|
||||||
@ -123,7 +131,7 @@ static void s3c24xx_audio_buffdone(struct s3c2410_dma_chan *channel,
|
|||||||
snd_pcm_period_elapsed(substream);
|
snd_pcm_period_elapsed(substream);
|
||||||
|
|
||||||
spin_lock(&prtd->lock);
|
spin_lock(&prtd->lock);
|
||||||
if (prtd->state & ST_RUNNING) {
|
if (prtd->state & ST_RUNNING && !s3c_dma_has_circular()) {
|
||||||
prtd->dma_loaded--;
|
prtd->dma_loaded--;
|
||||||
s3c24xx_pcm_enqueue(substream);
|
s3c24xx_pcm_enqueue(substream);
|
||||||
}
|
}
|
||||||
@ -164,6 +172,11 @@ static int s3c24xx_pcm_hw_params(struct snd_pcm_substream *substream,
|
|||||||
printk(KERN_ERR "failed to get dma channel\n");
|
printk(KERN_ERR "failed to get dma channel\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* use the circular buffering if we have it available. */
|
||||||
|
if (s3c_dma_has_circular())
|
||||||
|
s3c2410_dma_setflags(prtd->params->channel,
|
||||||
|
S3C2410_DMAF_CIRCULAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
s3c2410_dma_set_buffdone_fn(prtd->params->channel,
|
s3c2410_dma_set_buffdone_fn(prtd->params->channel,
|
||||||
|
Loading…
Reference in New Issue
Block a user