#include "irq.h"
#include "soc_dma.h"
+#define OMAP_DMA_DEBUG
+
+#ifdef OMAP_DMA_DEBUG
+#define TRACE(fmt,...) fprintf(stderr, "%s:" fmt "\n", __FUNCTION__, ##__VA_ARGS__)
+#else
+#define TRACE(...)
+#endif
+
struct omap_dma_channel_s {
/* transfer data */
int burst[2];
uint16_t status = ch->status;
#endif
+ TRACE("frame %d", a->frame);
do {
/* Transfer a single element */
/* FIXME: check the endianness */
uint32_t bmp, bit;
for (bmp = 0, bit = 1; bit; ch ++, bit <<= 1)
- if (ch->status) {
+ if ((ch->status &= ch->interrupts)) {
bmp |= bit;
ch->cstatus |= ch->status;
ch->status = 0;
return ch->interrupts;
case 0x0c: /* DMA4_CSR */
+ TRACE("CSR = %04x", ch->cstatus);
return ch->cstatus;
case 0x10: /* DMA4_CSDP */
ch->interrupts = value & 0x1dbe;
else
ch->interrupts = value & 0x09be;
+ TRACE("CICR = 0x%04x", ch->interrupts);
break;
case 0x0c: /* DMA4_CSR */
ch->cstatus &= ~value;
+ TRACE("CSR = 0x%04x --> 0x%04x", value, ch->cstatus);
break;
case 0x10: /* DMA4_CSDP */
case 0x14: /* DMA4_CEN */
ch->set_update = 1;
ch->elements = value & 0xffffff;
+ TRACE("elements=%d, frames=%d, data=%d bytes",
+ ch->elements, ch->frames, ch->data_type);
break;
case 0x18: /* DMA4_CFN */
ch->frames = value & 0xffff;
ch->set_update = 1;
+ TRACE("elements=%d, frames=%d, data=%d bytes",
+ ch->elements, ch->frames, ch->data_type);
break;
case 0x1c: /* DMA4_CSSA */