Lines Matching refs:chan
53 #define dma_regaddr(chan, reg) ((chan)->regs + (reg)) argument
56 #define dma_wrreg(chan, reg, val) writel((val), (chan)->regs + (reg)) argument
59 dma_wrreg(struct s3c2410_dma_chan *chan, int reg, unsigned long val) in dma_wrreg() argument
62 writel(val, dma_regaddr(chan, reg)); in dma_wrreg()
66 #define dma_rdreg(chan, reg) readl((chan)->regs + (reg)) argument
86 dmadbg_capture(struct s3c2410_dma_chan *chan, struct s3c2410_dma_regstate *regs) in dmadbg_capture() argument
88 regs->dcsrc = dma_rdreg(chan, S3C2410_DMA_DCSRC); in dmadbg_capture()
89 regs->disrc = dma_rdreg(chan, S3C2410_DMA_DISRC); in dmadbg_capture()
90 regs->dstat = dma_rdreg(chan, S3C2410_DMA_DSTAT); in dmadbg_capture()
91 regs->dcon = dma_rdreg(chan, S3C2410_DMA_DCON); in dmadbg_capture()
92 regs->dmsktrig = dma_rdreg(chan, S3C2410_DMA_DMASKTRIG); in dmadbg_capture()
96 dmadbg_dumpregs(const char *fname, int line, struct s3c2410_dma_chan *chan, in dmadbg_dumpregs() argument
100 chan->number, fname, line, in dmadbg_dumpregs()
106 dmadbg_showchan(const char *fname, int line, struct s3c2410_dma_chan *chan) in dmadbg_showchan() argument
110 dmadbg_capture(chan, &state); in dmadbg_showchan()
113 chan->number, fname, line, chan->load_state, in dmadbg_showchan()
114 chan->curr, chan->next, chan->end); in dmadbg_showchan()
116 dmadbg_dumpregs(fname, line, chan, &state); in dmadbg_showchan()
120 dmadbg_showregs(const char *fname, int line, struct s3c2410_dma_chan *chan) in dmadbg_showregs() argument
124 dmadbg_capture(chan, &state); in dmadbg_showregs()
125 dmadbg_dumpregs(fname, line, chan, &state); in dmadbg_showregs()
128 #define dbg_showregs(chan) dmadbg_showregs(__func__, __LINE__, (chan)) argument
129 #define dbg_showchan(chan) dmadbg_showchan(__func__, __LINE__, (chan)) argument
131 #define dbg_showregs(chan) do { } while(0) argument
132 #define dbg_showchan(chan) do { } while(0) argument
160 s3c2410_dma_waitforload(struct s3c2410_dma_chan *chan, int line) in s3c2410_dma_waitforload() argument
162 int timeout = chan->load_timeout; in s3c2410_dma_waitforload()
165 if (chan->load_state != S3C2410_DMALOAD_1LOADED) { in s3c2410_dma_waitforload()
166 … s3c2410_dma_waitforload() called in loadstate %d from line %d\n", chan->number, chan->load_state,… in s3c2410_dma_waitforload()
170 if (chan->stats != NULL) in s3c2410_dma_waitforload()
171 chan->stats->loads++; in s3c2410_dma_waitforload()
174 if ((dma_rdreg(chan, S3C2410_DMA_DSTAT) << (32-20)) != 0) { in s3c2410_dma_waitforload()
175 took = chan->load_timeout - timeout; in s3c2410_dma_waitforload()
177 s3c2410_dma_stats_timeout(chan->stats, took); in s3c2410_dma_waitforload()
179 switch (chan->load_state) { in s3c2410_dma_waitforload()
181 chan->load_state = S3C2410_DMALOAD_1RUNNING; in s3c2410_dma_waitforload()
185 …ERR "dma%d: unknown load_state in s3c2410_dma_waitforload() %d\n", chan->number, chan->load_state); in s3c2410_dma_waitforload()
192 if (chan->stats != NULL) { in s3c2410_dma_waitforload()
193 chan->stats->timeout_failed++; in s3c2410_dma_waitforload()
205 s3c2410_dma_loadbuffer(struct s3c2410_dma_chan *chan, in s3c2410_dma_loadbuffer() argument
220 if (chan->load_state == S3C2410_DMALOAD_1LOADED) { in s3c2410_dma_loadbuffer()
224 if (chan->load_state == S3C2410_DMALOAD_1LOADED_1RUNNING) { in s3c2410_dma_loadbuffer()
232 if (chan->load_state == S3C2410_DMALOAD_NONE) { in s3c2410_dma_loadbuffer()
245 writel(buf->data, chan->addr_reg); in s3c2410_dma_loadbuffer()
247 dma_wrreg(chan, S3C2410_DMA_DCON, in s3c2410_dma_loadbuffer()
248 chan->dcon | reload | (buf->size/chan->xfer_unit)); in s3c2410_dma_loadbuffer()
250 chan->next = buf->next; in s3c2410_dma_loadbuffer()
254 switch (chan->load_state) { in s3c2410_dma_loadbuffer()
256 chan->load_state = S3C2410_DMALOAD_1LOADED; in s3c2410_dma_loadbuffer()
260 chan->load_state = S3C2410_DMALOAD_1LOADED_1RUNNING; in s3c2410_dma_loadbuffer()
265 chan->load_state); in s3c2410_dma_loadbuffer()
279 s3c2410_dma_call_op(struct s3c2410_dma_chan *chan, enum s3c2410_chan_op op) in s3c2410_dma_call_op() argument
281 if (chan->op_fn != NULL) { in s3c2410_dma_call_op()
282 (chan->op_fn)(chan, op); in s3c2410_dma_call_op()
293 s3c2410_dma_buffdone(struct s3c2410_dma_chan *chan, struct s3c2410_dma_buf *buf, in s3c2410_dma_buffdone() argument
298 chan->callback_fn, buf, buf->id, buf->size, result); in s3c2410_dma_buffdone()
301 if (chan->callback_fn != NULL) { in s3c2410_dma_buffdone()
302 (chan->callback_fn)(chan, buf->id, buf->size, result); in s3c2410_dma_buffdone()
311 static int s3c2410_dma_start(struct s3c2410_dma_chan *chan) in s3c2410_dma_start() argument
316 pr_debug("s3c2410_start_dma: channel=%d\n", chan->number); in s3c2410_dma_start()
320 if (chan->state == S3C2410_DMA_RUNNING) { in s3c2410_dma_start()
321 pr_debug("s3c2410_start_dma: already running (%d)\n", chan->state); in s3c2410_dma_start()
326 chan->state = S3C2410_DMA_RUNNING; in s3c2410_dma_start()
332 if (chan->load_state == S3C2410_DMALOAD_NONE) { in s3c2410_dma_start()
333 if (chan->next == NULL) { in s3c2410_dma_start()
335 chan->number); in s3c2410_dma_start()
336 chan->state = S3C2410_DMA_IDLE; in s3c2410_dma_start()
341 s3c2410_dma_loadbuffer(chan, chan->next); in s3c2410_dma_start()
344 dbg_showchan(chan); in s3c2410_dma_start()
348 if (!chan->irq_enabled) { in s3c2410_dma_start()
349 enable_irq(chan->irq); in s3c2410_dma_start()
350 chan->irq_enabled = 1; in s3c2410_dma_start()
355 tmp = dma_rdreg(chan, S3C2410_DMA_DMASKTRIG); in s3c2410_dma_start()
358 dma_wrreg(chan, S3C2410_DMA_DMASKTRIG, tmp); in s3c2410_dma_start()
360 pr_debug("dma%d: %08lx to DMASKTRIG\n", chan->number, tmp); in s3c2410_dma_start()
365 tmp = dma_rdreg(chan, S3C2410_DMA_DCON); in s3c2410_dma_start()
367 dma_wrreg(chan, S3C2410_DMA_DCON, tmp); in s3c2410_dma_start()
370 s3c2410_dma_call_op(chan, S3C2410_DMAOP_START); in s3c2410_dma_start()
372 dbg_showchan(chan); in s3c2410_dma_start()
379 if (chan->next != NULL) { in s3c2410_dma_start()
380 if (chan->load_state == S3C2410_DMALOAD_1LOADED) { in s3c2410_dma_start()
382 if (s3c2410_dma_waitforload(chan, __LINE__) == 0) { in s3c2410_dma_start()
386 chan->load_state = S3C2410_DMALOAD_1RUNNING; in s3c2410_dma_start()
387 s3c2410_dma_loadbuffer(chan, chan->next); in s3c2410_dma_start()
390 } else if (chan->load_state == S3C2410_DMALOAD_1RUNNING) { in s3c2410_dma_start()
391 s3c2410_dma_loadbuffer(chan, chan->next); in s3c2410_dma_start()
407 s3c2410_dma_canload(struct s3c2410_dma_chan *chan) in s3c2410_dma_canload() argument
409 if (chan->load_state == S3C2410_DMALOAD_NONE || in s3c2410_dma_canload()
410 chan->load_state == S3C2410_DMALOAD_1RUNNING) in s3c2410_dma_canload()
436 struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); in s3c2410_dma_enqueue() local
440 if (chan == NULL) in s3c2410_dma_enqueue()
464 if (chan->curr == NULL) { in s3c2410_dma_enqueue()
469 chan->curr = buf; in s3c2410_dma_enqueue()
470 chan->end = buf; in s3c2410_dma_enqueue()
471 chan->next = NULL; in s3c2410_dma_enqueue()
474 chan->number, __func__, buf); in s3c2410_dma_enqueue()
476 if (chan->end == NULL) in s3c2410_dma_enqueue()
478 chan->number, __func__, chan); in s3c2410_dma_enqueue()
480 chan->end->next = buf; in s3c2410_dma_enqueue()
481 chan->end = buf; in s3c2410_dma_enqueue()
485 if (chan->next == NULL) in s3c2410_dma_enqueue()
486 chan->next = buf; in s3c2410_dma_enqueue()
489 if (chan->state == S3C2410_DMA_RUNNING) { in s3c2410_dma_enqueue()
490 if (chan->load_state == S3C2410_DMALOAD_1LOADED && 1) { in s3c2410_dma_enqueue()
491 if (s3c2410_dma_waitforload(chan, __LINE__) == 0) { in s3c2410_dma_enqueue()
494 chan->number); in s3c2410_dma_enqueue()
495 dbg_showchan(chan); in s3c2410_dma_enqueue()
501 while (s3c2410_dma_canload(chan) && chan->next != NULL) { in s3c2410_dma_enqueue()
502 s3c2410_dma_loadbuffer(chan, chan->next); in s3c2410_dma_enqueue()
504 } else if (chan->state == S3C2410_DMA_IDLE) { in s3c2410_dma_enqueue()
505 if (chan->flags & S3C2410_DMAF_AUTOSTART) { in s3c2410_dma_enqueue()
506 s3c2410_dma_ctrl(chan->number | DMACH_LOW_LEVEL, in s3c2410_dma_enqueue()
538 s3c2410_dma_lastxfer(struct s3c2410_dma_chan *chan) in s3c2410_dma_lastxfer() argument
542 chan->number, chan->load_state); in s3c2410_dma_lastxfer()
545 switch (chan->load_state) { in s3c2410_dma_lastxfer()
550 if (s3c2410_dma_waitforload(chan, __LINE__) == 0) { in s3c2410_dma_lastxfer()
553 chan->number, __func__); in s3c2410_dma_lastxfer()
566 chan->number, chan->load_state); in s3c2410_dma_lastxfer()
572 dma_wrreg(chan, S3C2410_DMA_DCON, chan->dcon | S3C2410_DCON_NORELOAD); in s3c2410_dma_lastxfer()
581 struct s3c2410_dma_chan *chan = (struct s3c2410_dma_chan *)devpw; in s3c2410_dma_irq() local
584 buf = chan->curr; in s3c2410_dma_irq()
586 dbg_showchan(chan); in s3c2410_dma_irq()
590 switch (chan->load_state) { in s3c2410_dma_irq()
596 chan->load_state = S3C2410_DMALOAD_NONE; in s3c2410_dma_irq()
605 chan->load_state = S3C2410_DMALOAD_NONE; in s3c2410_dma_irq()
615 chan->load_state = S3C2410_DMALOAD_1LOADED; in s3c2410_dma_irq()
620 chan->number); in s3c2410_dma_irq()
625 chan->number, chan->load_state); in s3c2410_dma_irq()
634 chan->curr = buf->next; in s3c2410_dma_irq()
639 chan->number, __func__, buf); in s3c2410_dma_irq()
643 s3c2410_dma_buffdone(chan, buf, S3C2410_RES_OK); in s3c2410_dma_irq()
657 if (chan->next != NULL && chan->state != S3C2410_DMA_IDLE) { in s3c2410_dma_irq()
660 switch (chan->load_state) { in s3c2410_dma_irq()
670 if (s3c2410_dma_waitforload(chan, __LINE__) == 0) { in s3c2410_dma_irq()
673 chan->number, __func__); in s3c2410_dma_irq()
684 chan->number, chan->load_state); in s3c2410_dma_irq()
689 s3c2410_dma_loadbuffer(chan, chan->next); in s3c2410_dma_irq()
692 s3c2410_dma_lastxfer(chan); in s3c2410_dma_irq()
695 if (chan->load_state == S3C2410_DMALOAD_NONE) { in s3c2410_dma_irq()
697 chan->number, jiffies); in s3c2410_dma_irq()
698 s3c2410_dma_ctrl(chan->number | DMACH_LOW_LEVEL, in s3c2410_dma_irq()
718 struct s3c2410_dma_chan *chan; in s3c2410_dma_request() local
727 chan = s3c2410_dma_map_channel(channel); in s3c2410_dma_request()
728 if (chan == NULL) { in s3c2410_dma_request()
733 dbg_showchan(chan); in s3c2410_dma_request()
735 chan->client = client; in s3c2410_dma_request()
736 chan->in_use = 1; in s3c2410_dma_request()
738 if (!chan->irq_claimed) { in s3c2410_dma_request()
740 channel, __func__, chan->irq); in s3c2410_dma_request()
742 chan->irq_claimed = 1; in s3c2410_dma_request()
745 err = request_irq(chan->irq, s3c2410_dma_irq, IRQF_DISABLED, in s3c2410_dma_request()
746 client->name, (void *)chan); in s3c2410_dma_request()
751 chan->in_use = 0; in s3c2410_dma_request()
752 chan->irq_claimed = 0; in s3c2410_dma_request()
756 client->name, chan->irq, chan->number); in s3c2410_dma_request()
760 chan->irq_enabled = 1; in s3c2410_dma_request()
767 pr_debug("%s: channel initialised, %p\n", __func__, chan); in s3c2410_dma_request()
769 return chan->number | DMACH_LOW_LEVEL; in s3c2410_dma_request()
787 struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); in s3c2410_dma_free() local
790 if (chan == NULL) in s3c2410_dma_free()
795 if (chan->client != client) { in s3c2410_dma_free()
797 channel, chan->client, client); in s3c2410_dma_free()
802 if (chan->state != S3C2410_DMA_IDLE) { in s3c2410_dma_free()
804 __func__, chan); in s3c2410_dma_free()
810 chan->client = NULL; in s3c2410_dma_free()
811 chan->in_use = 0; in s3c2410_dma_free()
813 if (chan->irq_claimed) in s3c2410_dma_free()
814 free_irq(chan->irq, (void *)chan); in s3c2410_dma_free()
816 chan->irq_claimed = 0; in s3c2410_dma_free()
828 static int s3c2410_dma_dostop(struct s3c2410_dma_chan *chan) in s3c2410_dma_dostop() argument
835 dbg_showchan(chan); in s3c2410_dma_dostop()
839 s3c2410_dma_call_op(chan, S3C2410_DMAOP_STOP); in s3c2410_dma_dostop()
841 tmp = dma_rdreg(chan, S3C2410_DMA_DMASKTRIG); in s3c2410_dma_dostop()
844 dma_wrreg(chan, S3C2410_DMA_DMASKTRIG, tmp); in s3c2410_dma_dostop()
848 tmp = dma_rdreg(chan, S3C2410_DMA_DCON); in s3c2410_dma_dostop()
850 dma_wrreg(chan, S3C2410_DMA_DCON, tmp); in s3c2410_dma_dostop()
854 chan->state = S3C2410_DMA_IDLE; in s3c2410_dma_dostop()
855 chan->load_state = S3C2410_DMALOAD_NONE; in s3c2410_dma_dostop()
862 static void s3c2410_dma_waitforstop(struct s3c2410_dma_chan *chan) in s3c2410_dma_waitforstop() argument
868 tmp = dma_rdreg(chan, S3C2410_DMA_DMASKTRIG); in s3c2410_dma_waitforstop()
874 pr_debug("dma%d: failed to stop?\n", chan->number); in s3c2410_dma_waitforstop()
883 static int s3c2410_dma_flush(struct s3c2410_dma_chan *chan) in s3c2410_dma_flush() argument
888 pr_debug("%s: chan %p (%d)\n", __func__, chan, chan->number); in s3c2410_dma_flush()
890 dbg_showchan(chan); in s3c2410_dma_flush()
894 if (chan->state != S3C2410_DMA_IDLE) { in s3c2410_dma_flush()
896 s3c2410_dma_ctrl(chan->number, S3C2410_DMAOP_STOP); in s3c2410_dma_flush()
899 buf = chan->curr; in s3c2410_dma_flush()
901 buf = chan->next; in s3c2410_dma_flush()
903 chan->curr = chan->next = chan->end = NULL; in s3c2410_dma_flush()
912 s3c2410_dma_buffdone(chan, buf, S3C2410_RES_ABORT); in s3c2410_dma_flush()
917 dbg_showregs(chan); in s3c2410_dma_flush()
919 s3c2410_dma_waitforstop(chan); in s3c2410_dma_flush()
926 tmp = dma_rdreg(chan, S3C2410_DMA_DCON); in s3c2410_dma_flush()
928 dma_wrreg(chan, S3C2410_DMA_DCON, tmp); in s3c2410_dma_flush()
932 dbg_showregs(chan); in s3c2410_dma_flush()
939 static int s3c2410_dma_started(struct s3c2410_dma_chan *chan) in s3c2410_dma_started() argument
945 dbg_showchan(chan); in s3c2410_dma_started()
952 if (chan->next != NULL) { in s3c2410_dma_started()
953 if (chan->load_state == S3C2410_DMALOAD_1LOADED) { in s3c2410_dma_started()
955 if (s3c2410_dma_waitforload(chan, __LINE__) == 0) { in s3c2410_dma_started()
959 chan->load_state = S3C2410_DMALOAD_1RUNNING; in s3c2410_dma_started()
960 s3c2410_dma_loadbuffer(chan, chan->next); in s3c2410_dma_started()
963 } else if (chan->load_state == S3C2410_DMALOAD_1RUNNING) { in s3c2410_dma_started()
964 s3c2410_dma_loadbuffer(chan, chan->next); in s3c2410_dma_started()
978 struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); in s3c2410_dma_ctrl() local
980 if (chan == NULL) in s3c2410_dma_ctrl()
985 return s3c2410_dma_start(chan); in s3c2410_dma_ctrl()
988 return s3c2410_dma_dostop(chan); in s3c2410_dma_ctrl()
995 return s3c2410_dma_flush(chan); in s3c2410_dma_ctrl()
998 return s3c2410_dma_started(chan); in s3c2410_dma_ctrl()
1026 struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); in s3c2410_dma_config() local
1031 if (chan == NULL) in s3c2410_dma_config()
1034 dcon = chan->dcon & dma_sel.dcon_mask; in s3c2410_dma_config()
1037 switch (chan->req_ch) { in s3c2410_dma_config()
1083 chan->dcon = dcon; in s3c2410_dma_config()
1084 chan->xfer_unit = xferunit; in s3c2410_dma_config()
1106 struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); in s3c2410_dma_devconfig() local
1109 if (chan == NULL) in s3c2410_dma_devconfig()
1115 chan->source = source; in s3c2410_dma_devconfig()
1116 chan->dev_addr = devaddr; in s3c2410_dma_devconfig()
1118 switch (chan->req_ch) { in s3c2410_dma_devconfig()
1137 dma_wrreg(chan, S3C2410_DMA_DISRCC, hwcfg & 3); in s3c2410_dma_devconfig()
1138 dma_wrreg(chan, S3C2410_DMA_DISRC, devaddr); in s3c2410_dma_devconfig()
1139 dma_wrreg(chan, S3C2410_DMA_DIDSTC, (0<<1) | (0<<0)); in s3c2410_dma_devconfig()
1141 chan->addr_reg = dma_regaddr(chan, S3C2410_DMA_DIDST); in s3c2410_dma_devconfig()
1148 dma_wrreg(chan, S3C2410_DMA_DISRCC, (0<<1) | (0<<0)); in s3c2410_dma_devconfig()
1149 dma_wrreg(chan, S3C2410_DMA_DIDST, devaddr); in s3c2410_dma_devconfig()
1150 dma_wrreg(chan, S3C2410_DMA_DIDSTC, hwcfg & 3); in s3c2410_dma_devconfig()
1152 chan->addr_reg = dma_regaddr(chan, S3C2410_DMA_DISRC); in s3c2410_dma_devconfig()
1163 (dma_sel.direction)(chan, chan->map, source); in s3c2410_dma_devconfig()
1177 struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); in s3c2410_dma_getposition() local
1179 if (chan == NULL) in s3c2410_dma_getposition()
1183 *src = dma_rdreg(chan, S3C2410_DMA_DCSRC); in s3c2410_dma_getposition()
1186 *dst = dma_rdreg(chan, S3C2410_DMA_DCDST); in s3c2410_dma_getposition()