Lines Matching +full:channel +full:- +full:fifo +full:- +full:len
1 // SPDX-License-Identifier: GPL-1.0+
15 #define usbhsf_get_cfifo(p) (&((p)->fifo_info.cfifo))
17 #define usbhsf_fifo_is_busy(f) ((f)->pipe) /* see usbhs_pipe_select_fifo */
24 INIT_LIST_HEAD(&pkt->node); in usbhs_pkt_init()
32 struct usbhs_priv *priv = usbhs_pipe_to_priv(pkt->pipe); in usbhsf_null_handle()
37 return -EINVAL; in usbhsf_null_handle()
48 void *buf, int len, int zero, int sequence) in usbhs_pkt_push() argument
62 if (!pipe->handler) { in usbhs_pkt_push()
64 pipe->handler = &usbhsf_null_handler; in usbhs_pkt_push()
67 list_move_tail(&pkt->node, &pipe->list); in usbhs_pkt_push()
72 * dma handler -> pio handler. in usbhs_pkt_push()
74 pkt->pipe = pipe; in usbhs_pkt_push()
75 pkt->buf = buf; in usbhs_pkt_push()
76 pkt->handler = pipe->handler; in usbhs_pkt_push()
77 pkt->length = len; in usbhs_pkt_push()
78 pkt->zero = zero; in usbhs_pkt_push()
79 pkt->actual = 0; in usbhs_pkt_push()
80 pkt->done = done; in usbhs_pkt_push()
81 pkt->sequence = sequence; in usbhs_pkt_push()
89 list_del_init(&pkt->node); in __usbhsf_pkt_del()
94 return list_first_entry_or_null(&pipe->list, struct usbhs_pkt, node); in __usbhsf_pkt_get()
98 struct usbhs_fifo *fifo);
99 static struct dma_chan *usbhsf_dma_chan_get(struct usbhs_fifo *fifo,
109 struct usbhs_fifo *fifo = usbhs_pipe_to_fifo(pipe); in usbhs_pkt_pop() local
123 if (fifo) in usbhs_pkt_pop()
124 chan = usbhsf_dma_chan_get(fifo, pkt); in usbhs_pkt_pop()
141 if (fifo) in usbhs_pkt_pop()
142 usbhsf_fifo_unselect(pipe, fifo); in usbhs_pkt_pop()
171 ret = -EINVAL; in usbhsf_pkt_handler()
177 func = pkt->handler->prepare; in usbhsf_pkt_handler()
180 func = pkt->handler->try_run; in usbhsf_pkt_handler()
183 func = pkt->handler->dma_done; in usbhsf_pkt_handler()
201 pkt->done(priv, pkt); in usbhsf_pkt_handler()
226 mod->status |= status; \
228 mod->status &= ~status; \
238 * "Operation" - "Interrupt Function" - "BRDY Interrupt" in usbhsf_tx_irq_ctrl()
255 * FIFO ctrl
258 struct usbhs_fifo *fifo) in usbhsf_send_terminator() argument
262 usbhs_bset(priv, fifo->ctr, BVAL, BVAL); in usbhsf_send_terminator()
266 struct usbhs_fifo *fifo) in usbhsf_fifo_barrier() argument
268 /* The FIFO port is accessible */ in usbhsf_fifo_barrier()
269 if (usbhs_read(priv, fifo->ctr) & FRDY) in usbhsf_fifo_barrier()
272 return -EBUSY; in usbhsf_fifo_barrier()
276 struct usbhs_fifo *fifo) in usbhsf_fifo_clear() argument
283 * This driver checks the pipe condition first to avoid -EBUSY in usbhsf_fifo_clear()
290 ret = usbhsf_fifo_barrier(priv, fifo); in usbhsf_fifo_clear()
294 * if non-DCP pipe, this driver should set BCLR when in usbhsf_fifo_clear()
298 usbhs_write(priv, fifo->ctr, BCLR); in usbhsf_fifo_clear()
302 struct usbhs_fifo *fifo) in usbhsf_fifo_rcv_len() argument
304 return usbhs_read(priv, fifo->ctr) & DTLN_MASK; in usbhsf_fifo_rcv_len()
308 struct usbhs_fifo *fifo) in usbhsf_fifo_unselect() argument
313 usbhs_write(priv, fifo->sel, 0); in usbhsf_fifo_unselect()
317 struct usbhs_fifo *fifo, in usbhsf_fifo_select() argument
327 usbhsf_fifo_is_busy(fifo)) in usbhsf_fifo_select()
328 return -EBUSY; in usbhsf_fifo_select()
338 usbhs_write(priv, fifo->sel, base | MBW_32); in usbhsf_fifo_select()
341 while (timeout--) { in usbhsf_fifo_select()
342 if (base == (mask & usbhs_read(priv, fifo->sel))) { in usbhsf_fifo_select()
343 usbhs_pipe_select_fifo(pipe, fifo); in usbhsf_fifo_select()
349 dev_err(dev, "fifo select error\n"); in usbhsf_fifo_select()
351 return -EIO; in usbhsf_fifo_select()
359 struct usbhs_pipe *pipe = pkt->pipe; in usbhs_dcp_dir_switch_to_write()
361 struct usbhs_fifo *fifo = usbhsf_get_cfifo(priv); /* CFIFO */ in usbhs_dcp_dir_switch_to_write() local
367 ret = usbhsf_fifo_select(pipe, fifo, 1); in usbhs_dcp_dir_switch_to_write()
375 usbhsf_fifo_clear(pipe, fifo); in usbhs_dcp_dir_switch_to_write()
376 usbhsf_send_terminator(pipe, fifo); in usbhs_dcp_dir_switch_to_write()
378 usbhsf_fifo_unselect(pipe, fifo); in usbhs_dcp_dir_switch_to_write()
388 struct usbhs_pipe *pipe = pkt->pipe; in usbhs_dcp_dir_switch_to_read()
390 struct usbhs_fifo *fifo = usbhsf_get_cfifo(priv); /* CFIFO */ in usbhs_dcp_dir_switch_to_read() local
396 ret = usbhsf_fifo_select(pipe, fifo, 0); in usbhs_dcp_dir_switch_to_read()
403 usbhsf_fifo_clear(pipe, fifo); in usbhs_dcp_dir_switch_to_read()
405 usbhsf_fifo_unselect(pipe, fifo); in usbhs_dcp_dir_switch_to_read()
416 struct usbhs_pipe *pipe = pkt->pipe; in usbhs_dcp_dir_switch_done()
418 if (pkt->handler == &usbhs_dcp_status_stage_in_handler) in usbhs_dcp_dir_switch_done()
423 pkt->actual = pkt->length; in usbhs_dcp_dir_switch_done()
444 struct usbhs_pipe *pipe = pkt->pipe; in usbhsf_dcp_data_stage_try_push()
451 pkt->handler = &usbhs_fifo_pio_push_handler; in usbhsf_dcp_data_stage_try_push()
453 return pkt->handler->prepare(pkt, is_done); in usbhsf_dcp_data_stage_try_push()
466 struct usbhs_pipe *pipe = pkt->pipe; in usbhsf_dcp_data_stage_prepare_pop()
468 struct usbhs_fifo *fifo = usbhsf_get_cfifo(priv); in usbhsf_dcp_data_stage_prepare_pop() local
475 * - change DCP direction, in usbhsf_dcp_data_stage_prepare_pop()
476 * - clear fifo in usbhsf_dcp_data_stage_prepare_pop()
477 * - DATA1 in usbhsf_dcp_data_stage_prepare_pop()
483 usbhsf_fifo_select(pipe, fifo, 0); in usbhsf_dcp_data_stage_prepare_pop()
484 usbhsf_fifo_clear(pipe, fifo); in usbhsf_dcp_data_stage_prepare_pop()
485 usbhsf_fifo_unselect(pipe, fifo); in usbhsf_dcp_data_stage_prepare_pop()
490 pkt->handler = &usbhs_fifo_pio_pop_handler; in usbhsf_dcp_data_stage_prepare_pop()
492 return pkt->handler->prepare(pkt, is_done); in usbhsf_dcp_data_stage_prepare_pop()
504 struct usbhs_pipe *pipe = pkt->pipe; in usbhsf_pio_try_push()
507 struct usbhs_fifo *fifo = usbhsf_get_cfifo(priv); /* CFIFO */ in usbhsf_pio_try_push() local
508 void __iomem *addr = priv->base + fifo->port; in usbhsf_pio_try_push()
512 int i, ret, len; in usbhsf_pio_try_push() local
515 usbhs_pipe_data_sequence(pipe, pkt->sequence); in usbhsf_pio_try_push()
516 pkt->sequence = -1; /* -1 sequence will be ignored */ in usbhsf_pio_try_push()
518 usbhs_pipe_set_trans_count_if_bulk(pipe, pkt->length); in usbhsf_pio_try_push()
520 ret = usbhsf_fifo_select(pipe, fifo, 1); in usbhsf_pio_try_push()
531 ret = usbhsf_fifo_barrier(priv, fifo); in usbhsf_pio_try_push()
535 buf = pkt->buf + pkt->actual; in usbhsf_pio_try_push()
536 len = pkt->length - pkt->actual; in usbhsf_pio_try_push()
537 len = min(len, maxp); in usbhsf_pio_try_push()
538 total_len = len; in usbhsf_pio_try_push()
544 * 32-bit access only in usbhsf_pio_try_push()
546 if (len >= 4 && !((unsigned long)buf & 0x03)) { in usbhsf_pio_try_push()
547 iowrite32_rep(addr, buf, len / 4); in usbhsf_pio_try_push()
548 len %= 4; in usbhsf_pio_try_push()
549 buf += total_len - len; in usbhsf_pio_try_push()
554 for (i = 0; i < len; i++) in usbhsf_pio_try_push()
557 for (i = 0; i < len; i++) in usbhsf_pio_try_push()
558 iowrite8(buf[i], addr + (0x03 - (i & 0x03))); in usbhsf_pio_try_push()
564 pkt->actual += total_len; in usbhsf_pio_try_push()
566 if (pkt->actual < pkt->length) in usbhsf_pio_try_push()
571 *is_done = !pkt->zero; /* send zero packet ? */ in usbhsf_pio_try_push()
577 usbhsf_send_terminator(pipe, fifo); in usbhsf_pio_try_push()
585 pkt->length, pkt->actual, *is_done, pkt->zero); in usbhsf_pio_try_push()
587 usbhsf_fifo_unselect(pipe, fifo); in usbhsf_pio_try_push()
592 usbhsf_fifo_unselect(pipe, fifo); in usbhsf_pio_try_push()
606 if (usbhs_pipe_is_running(pkt->pipe)) in usbhsf_pio_prepare_push()
622 struct usbhs_pipe *pipe = pkt->pipe; in usbhsf_prepare_pop()
624 struct usbhs_fifo *fifo = usbhsf_get_cfifo(priv); in usbhsf_prepare_pop() local
635 usbhs_pipe_data_sequence(pipe, pkt->sequence); in usbhsf_prepare_pop()
636 pkt->sequence = -1; /* -1 sequence will be ignored */ in usbhsf_prepare_pop()
639 usbhsf_fifo_clear(pipe, fifo); in usbhsf_prepare_pop()
641 usbhs_pipe_set_trans_count_if_bulk(pipe, pkt->length); in usbhsf_prepare_pop()
651 struct usbhs_pipe *pipe = pkt->pipe; in usbhsf_pio_try_pop()
654 struct usbhs_fifo *fifo = usbhsf_get_cfifo(priv); /* CFIFO */ in usbhsf_pio_try_pop() local
655 void __iomem *addr = priv->base + fifo->port; in usbhsf_pio_try_pop()
659 int rcv_len, len; in usbhsf_pio_try_pop() local
663 ret = usbhsf_fifo_select(pipe, fifo, 0); in usbhsf_pio_try_pop()
667 ret = usbhsf_fifo_barrier(priv, fifo); in usbhsf_pio_try_pop()
671 rcv_len = usbhsf_fifo_rcv_len(priv, fifo); in usbhsf_pio_try_pop()
673 buf = pkt->buf + pkt->actual; in usbhsf_pio_try_pop()
674 len = pkt->length - pkt->actual; in usbhsf_pio_try_pop()
675 len = min(len, rcv_len); in usbhsf_pio_try_pop()
676 total_len = len; in usbhsf_pio_try_pop()
683 pkt->actual += total_len; in usbhsf_pio_try_pop()
685 if ((pkt->actual == pkt->length) || /* receive all data */ in usbhsf_pio_try_pop()
701 * Buffer clear if Zero-Length packet in usbhsf_pio_try_pop()
704 * "Operation" - "FIFO Buffer Memory" - "FIFO Port Function" in usbhsf_pio_try_pop()
707 pkt->zero = 1; in usbhsf_pio_try_pop()
708 usbhsf_fifo_clear(pipe, fifo); in usbhsf_pio_try_pop()
715 * 32-bit access only in usbhsf_pio_try_pop()
717 if (len >= 4 && !((unsigned long)buf & 0x03)) { in usbhsf_pio_try_pop()
718 ioread32_rep(addr, buf, len / 4); in usbhsf_pio_try_pop()
719 len %= 4; in usbhsf_pio_try_pop()
720 buf += total_len - len; in usbhsf_pio_try_pop()
724 for (i = 0; i < len; i++) { in usbhsf_pio_try_pop()
734 pkt->length, pkt->actual, *is_done, pkt->zero); in usbhsf_pio_try_pop()
737 usbhsf_fifo_unselect(pipe, fifo); in usbhsf_pio_try_pop()
752 usbhs_dcp_control_transfer_done(pkt->pipe); in usbhsf_ctrl_stage_end()
765 * DMA fifo functions
767 static struct dma_chan *usbhsf_dma_chan_get(struct usbhs_fifo *fifo, in usbhsf_dma_chan_get() argument
770 if (&usbhs_fifo_dma_push_handler == pkt->handler) in usbhsf_dma_chan_get()
771 return fifo->tx_chan; in usbhsf_dma_chan_get()
773 if (&usbhs_fifo_dma_pop_handler == pkt->handler) in usbhsf_dma_chan_get()
774 return fifo->rx_chan; in usbhsf_dma_chan_get()
782 struct usbhs_fifo *fifo; in usbhsf_get_dma_fifo() local
785 usbhs_for_each_dfifo(priv, fifo, i) { in usbhsf_get_dma_fifo()
786 if (usbhsf_dma_chan_get(fifo, pkt) && in usbhsf_get_dma_fifo()
787 !usbhsf_fifo_is_busy(fifo)) in usbhsf_get_dma_fifo()
788 return fifo; in usbhsf_get_dma_fifo()
797 struct usbhs_fifo *fifo, in __usbhsf_dma_ctrl() argument
802 usbhs_bset(priv, fifo->sel, DREQE, dreqe); in __usbhsf_dma_ctrl()
807 struct usbhs_pipe *pipe = pkt->pipe; in __usbhsf_dma_map_ctrl()
810 struct usbhs_fifo *fifo = usbhs_pipe_to_fifo(pipe); in __usbhsf_dma_map_ctrl() local
811 struct dma_chan *chan = usbhsf_dma_chan_get(fifo, pkt); in __usbhsf_dma_map_ctrl()
813 return info->dma_map_ctrl(chan->device->dev, pkt, map); in __usbhsf_dma_map_ctrl()
820 struct usbhs_pipe *pipe = pkt->pipe; in usbhsf_dma_xfer_preparing()
821 struct usbhs_fifo *fifo; in usbhsf_dma_xfer_preparing() local
829 fifo = usbhs_pipe_to_fifo(pipe); in usbhsf_dma_xfer_preparing()
830 if (!fifo) in usbhsf_dma_xfer_preparing()
833 chan = usbhsf_dma_chan_get(fifo, pkt); in usbhsf_dma_xfer_preparing()
836 desc = dmaengine_prep_slave_single(chan, pkt->dma + pkt->actual, in usbhsf_dma_xfer_preparing()
837 pkt->trans, dir, in usbhsf_dma_xfer_preparing()
842 desc->callback_result = usbhsf_dma_complete; in usbhsf_dma_xfer_preparing()
843 desc->callback_param = pkt; in usbhsf_dma_xfer_preparing()
852 fifo->name, usbhs_pipe_number(pipe), pkt->length, pkt->zero); in usbhsf_dma_xfer_preparing()
855 usbhs_pipe_set_trans_count_if_bulk(pipe, pkt->trans); in usbhsf_dma_xfer_preparing()
857 usbhsf_dma_start(pipe, fifo); in usbhsf_dma_xfer_preparing()
864 struct usbhs_pipe *pipe = pkt->pipe; in xfer_work()
878 struct usbhs_pipe *pipe = pkt->pipe; in usbhsf_dma_prepare_push()
880 struct usbhs_fifo *fifo; in usbhsf_dma_prepare_push() local
881 int len = pkt->length - pkt->actual; in usbhsf_dma_prepare_push() local
889 if ((len < usbhs_get_dparam(priv, pio_dma_border)) || in usbhsf_dma_prepare_push()
893 /* check data length if this driver don't use USB-DMAC */ in usbhsf_dma_prepare_push()
894 if (!usbhs_get_dparam(priv, has_usb_dmac) && len & 0x7) in usbhsf_dma_prepare_push()
899 USBHS_USB_DMAC_XFER_SIZE - 1 : 0x7; in usbhsf_dma_prepare_push()
900 if ((uintptr_t)(pkt->buf + pkt->actual) & align_mask) in usbhsf_dma_prepare_push()
907 /* get enable DMA fifo */ in usbhsf_dma_prepare_push()
908 fifo = usbhsf_get_dma_fifo(priv, pkt); in usbhsf_dma_prepare_push()
909 if (!fifo) in usbhsf_dma_prepare_push()
912 ret = usbhsf_fifo_select(pipe, fifo, 0); in usbhsf_dma_prepare_push()
919 pkt->trans = len; in usbhsf_dma_prepare_push()
926 INIT_WORK(&pkt->work, xfer_work); in usbhsf_dma_prepare_push()
927 schedule_work(&pkt->work); in usbhsf_dma_prepare_push()
933 usbhsf_fifo_unselect(pipe, fifo); in usbhsf_dma_prepare_push()
938 pkt->handler = &usbhs_fifo_pio_push_handler; in usbhsf_dma_prepare_push()
940 return pkt->handler->prepare(pkt, is_done); in usbhsf_dma_prepare_push()
945 struct usbhs_pipe *pipe = pkt->pipe; in usbhsf_dma_push_done()
946 int is_short = pkt->trans % usbhs_pipe_get_maxpacket(pipe); in usbhsf_dma_push_done()
948 pkt->actual += pkt->trans; in usbhsf_dma_push_done()
950 if (pkt->actual < pkt->length) in usbhsf_dma_push_done()
955 *is_done = !pkt->zero; /* send zero packet? */ in usbhsf_dma_push_done()
959 usbhsf_dma_stop(pipe, pipe->fifo); in usbhsf_dma_push_done()
961 usbhsf_fifo_unselect(pipe, pipe->fifo); in usbhsf_dma_push_done()
965 pkt->handler = &usbhs_fifo_pio_push_handler; in usbhsf_dma_push_done()
966 return pkt->handler->try_run(pkt, is_done); in usbhsf_dma_push_done()
990 struct usbhs_pipe *pipe = pkt->pipe; in usbhsf_dma_prepare_pop_with_usb_dmac()
992 struct usbhs_fifo *fifo; in usbhsf_dma_prepare_pop_with_usb_dmac() local
999 if ((pkt->length < usbhs_get_dparam(priv, pio_dma_border)) || in usbhsf_dma_prepare_pop_with_usb_dmac()
1003 fifo = usbhsf_get_dma_fifo(priv, pkt); in usbhsf_dma_prepare_pop_with_usb_dmac()
1004 if (!fifo) in usbhsf_dma_prepare_pop_with_usb_dmac()
1007 if ((uintptr_t)pkt->buf & (USBHS_USB_DMAC_XFER_SIZE - 1)) in usbhsf_dma_prepare_pop_with_usb_dmac()
1016 ret = usbhsf_fifo_select(pipe, fifo, 0); in usbhsf_dma_prepare_pop_with_usb_dmac()
1032 pkt->trans = pkt->length; in usbhsf_dma_prepare_pop_with_usb_dmac()
1039 usbhsf_fifo_unselect(pipe, fifo); in usbhsf_dma_prepare_pop_with_usb_dmac()
1045 pkt->handler = &usbhs_fifo_pio_pop_handler; in usbhsf_dma_prepare_pop_with_usb_dmac()
1048 return pkt->handler->prepare(pkt, is_done); in usbhsf_dma_prepare_pop_with_usb_dmac()
1053 struct usbhs_priv *priv = usbhs_pipe_to_priv(pkt->pipe); in usbhsf_dma_prepare_pop()
1063 struct usbhs_pipe *pipe = pkt->pipe; in usbhsf_dma_try_pop_with_rx_irq()
1065 struct usbhs_fifo *fifo; in usbhsf_dma_try_pop_with_rx_irq() local
1066 int len, ret; in usbhsf_dma_try_pop_with_rx_irq() local
1074 /* get enable DMA fifo */ in usbhsf_dma_try_pop_with_rx_irq()
1075 fifo = usbhsf_get_dma_fifo(priv, pkt); in usbhsf_dma_try_pop_with_rx_irq()
1076 if (!fifo) in usbhsf_dma_try_pop_with_rx_irq()
1079 if ((uintptr_t)(pkt->buf + pkt->actual) & 0x7) /* 8byte alignment */ in usbhsf_dma_try_pop_with_rx_irq()
1082 ret = usbhsf_fifo_select(pipe, fifo, 0); in usbhsf_dma_try_pop_with_rx_irq()
1087 len = usbhsf_fifo_rcv_len(priv, fifo); in usbhsf_dma_try_pop_with_rx_irq()
1088 len = min(pkt->length - pkt->actual, len); in usbhsf_dma_try_pop_with_rx_irq()
1089 if (len & 0x7) /* 8byte alignment */ in usbhsf_dma_try_pop_with_rx_irq()
1092 if (len < usbhs_get_dparam(priv, pio_dma_border)) in usbhsf_dma_try_pop_with_rx_irq()
1095 ret = usbhsf_fifo_barrier(priv, fifo); in usbhsf_dma_try_pop_with_rx_irq()
1111 pkt->trans = len; in usbhsf_dma_try_pop_with_rx_irq()
1113 INIT_WORK(&pkt->work, xfer_work); in usbhsf_dma_try_pop_with_rx_irq()
1114 schedule_work(&pkt->work); in usbhsf_dma_try_pop_with_rx_irq()
1119 usbhsf_fifo_unselect(pipe, fifo); in usbhsf_dma_try_pop_with_rx_irq()
1125 pkt->handler = &usbhs_fifo_pio_pop_handler; in usbhsf_dma_try_pop_with_rx_irq()
1127 return pkt->handler->try_run(pkt, is_done); in usbhsf_dma_try_pop_with_rx_irq()
1132 struct usbhs_priv *priv = usbhs_pipe_to_priv(pkt->pipe); in usbhsf_dma_try_pop()
1141 struct usbhs_pipe *pipe = pkt->pipe; in usbhsf_dma_pop_done_with_rx_irq()
1144 usbhsf_dma_stop(pipe, pipe->fifo); in usbhsf_dma_pop_done_with_rx_irq()
1146 usbhsf_fifo_unselect(pipe, pipe->fifo); in usbhsf_dma_pop_done_with_rx_irq()
1148 pkt->actual += pkt->trans; in usbhsf_dma_pop_done_with_rx_irq()
1150 if ((pkt->actual == pkt->length) || /* receive all data */ in usbhsf_dma_pop_done_with_rx_irq()
1151 (pkt->trans < maxp)) { /* short packet */ in usbhsf_dma_pop_done_with_rx_irq()
1155 /* re-enable */ in usbhsf_dma_pop_done_with_rx_irq()
1166 struct usbhs_pipe *pipe = pkt->pipe; in usbhs_dma_calc_received_size()
1170 received_size = pkt->length - pkt->dma_result->residue; in usbhs_dma_calc_received_size()
1173 received_size -= USBHS_USB_DMAC_XFER_SIZE; in usbhs_dma_calc_received_size()
1174 received_size &= ~(maxp - 1); in usbhs_dma_calc_received_size()
1184 struct usbhs_pipe *pipe = pkt->pipe; in usbhsf_dma_pop_done_with_usb_dmac()
1186 struct usbhs_fifo *fifo = usbhs_pipe_to_fifo(pipe); in usbhsf_dma_pop_done_with_usb_dmac() local
1187 struct dma_chan *chan = usbhsf_dma_chan_get(fifo, pkt); in usbhsf_dma_pop_done_with_usb_dmac()
1197 rcv_len = usbhsf_fifo_rcv_len(priv, fifo); in usbhsf_dma_pop_done_with_usb_dmac()
1198 usbhsf_fifo_clear(pipe, fifo); in usbhsf_dma_pop_done_with_usb_dmac()
1199 pkt->actual = usbhs_dma_calc_received_size(pkt, chan, rcv_len); in usbhsf_dma_pop_done_with_usb_dmac()
1202 usbhsf_dma_stop(pipe, fifo); in usbhsf_dma_pop_done_with_usb_dmac()
1204 usbhsf_fifo_unselect(pipe, pipe->fifo); in usbhsf_dma_pop_done_with_usb_dmac()
1214 struct usbhs_priv *priv = usbhs_pipe_to_priv(pkt->pipe); in usbhsf_dma_pop_done()
1240 if (0 == slave->shdma_slave.slave_id) in usbhsf_dma_filter()
1243 chan->private = slave; in usbhsf_dma_filter()
1248 static void usbhsf_dma_quit(struct usbhs_priv *priv, struct usbhs_fifo *fifo) in usbhsf_dma_quit() argument
1250 if (fifo->tx_chan) in usbhsf_dma_quit()
1251 dma_release_channel(fifo->tx_chan); in usbhsf_dma_quit()
1252 if (fifo->rx_chan) in usbhsf_dma_quit()
1253 dma_release_channel(fifo->rx_chan); in usbhsf_dma_quit()
1255 fifo->tx_chan = NULL; in usbhsf_dma_quit()
1256 fifo->rx_chan = NULL; in usbhsf_dma_quit()
1259 static void usbhsf_dma_init_pdev(struct usbhs_fifo *fifo) in usbhsf_dma_init_pdev() argument
1265 fifo->tx_chan = dma_request_channel(mask, usbhsf_dma_filter, in usbhsf_dma_init_pdev()
1266 &fifo->tx_slave); in usbhsf_dma_init_pdev()
1270 fifo->rx_chan = dma_request_channel(mask, usbhsf_dma_filter, in usbhsf_dma_init_pdev()
1271 &fifo->rx_slave); in usbhsf_dma_init_pdev()
1274 static void usbhsf_dma_init_dt(struct device *dev, struct usbhs_fifo *fifo, in usbhsf_dma_init_dt() argument
1275 int channel) in usbhsf_dma_init_dt() argument
1281 * DnFIFO as TX or RX direction (not bi-direction). in usbhsf_dma_init_dt()
1284 snprintf(name, sizeof(name), "ch%d", channel); in usbhsf_dma_init_dt()
1285 if (channel & 1) { in usbhsf_dma_init_dt()
1286 fifo->tx_chan = dma_request_chan(dev, name); in usbhsf_dma_init_dt()
1287 if (IS_ERR(fifo->tx_chan)) in usbhsf_dma_init_dt()
1288 fifo->tx_chan = NULL; in usbhsf_dma_init_dt()
1290 fifo->rx_chan = dma_request_chan(dev, name); in usbhsf_dma_init_dt()
1291 if (IS_ERR(fifo->rx_chan)) in usbhsf_dma_init_dt()
1292 fifo->rx_chan = NULL; in usbhsf_dma_init_dt()
1296 static void usbhsf_dma_init(struct usbhs_priv *priv, struct usbhs_fifo *fifo, in usbhsf_dma_init() argument
1297 int channel) in usbhsf_dma_init() argument
1302 usbhsf_dma_init_dt(dev, fifo, channel); in usbhsf_dma_init()
1304 usbhsf_dma_init_pdev(fifo); in usbhsf_dma_init()
1306 if (fifo->tx_chan || fifo->rx_chan) in usbhsf_dma_init()
1308 fifo->name, in usbhsf_dma_init()
1309 fifo->tx_chan ? "[TX]" : " ", in usbhsf_dma_init()
1310 fifo->rx_chan ? "[RX]" : " "); in usbhsf_dma_init()
1323 if (!irq_state->bempsts) { in usbhsf_irq_empty()
1325 return -EIO; in usbhsf_irq_empty()
1328 dev_dbg(dev, "irq empty [0x%04x]\n", irq_state->bempsts); in usbhsf_irq_empty()
1335 if (!(irq_state->bempsts & (1 << i))) in usbhsf_irq_empty()
1353 if (!irq_state->brdysts) { in usbhsf_irq_ready()
1355 return -EIO; in usbhsf_irq_ready()
1358 dev_dbg(dev, "irq ready [0x%04x]\n", irq_state->brdysts); in usbhsf_irq_ready()
1365 if (!(irq_state->brdysts & (1 << i))) in usbhsf_irq_ready()
1380 struct usbhs_pipe *pipe = pkt->pipe; in usbhsf_dma_complete()
1385 pkt->dma_result = result; in usbhsf_dma_complete()
1395 struct usbhs_fifo *fifo = usbhsf_get_cfifo(priv); /* CFIFO */ in usbhs_fifo_clear_dcp() local
1397 /* clear DCP FIFO of transmission */ in usbhs_fifo_clear_dcp()
1398 if (usbhsf_fifo_select(pipe, fifo, 1) < 0) in usbhs_fifo_clear_dcp()
1400 usbhsf_fifo_clear(pipe, fifo); in usbhs_fifo_clear_dcp()
1401 usbhsf_fifo_unselect(pipe, fifo); in usbhs_fifo_clear_dcp()
1403 /* clear DCP FIFO of reception */ in usbhs_fifo_clear_dcp()
1404 if (usbhsf_fifo_select(pipe, fifo, 0) < 0) in usbhs_fifo_clear_dcp()
1406 usbhsf_fifo_clear(pipe, fifo); in usbhs_fifo_clear_dcp()
1407 usbhsf_fifo_unselect(pipe, fifo); in usbhs_fifo_clear_dcp()
1411 * fifo init
1420 mod->irq_empty = usbhsf_irq_empty; in usbhs_fifo_init()
1421 mod->irq_ready = usbhsf_irq_ready; in usbhs_fifo_init()
1422 mod->irq_bempsts = 0; in usbhs_fifo_init()
1423 mod->irq_brdysts = 0; in usbhs_fifo_init()
1425 cfifo->pipe = NULL; in usbhs_fifo_init()
1427 dfifo->pipe = NULL; in usbhs_fifo_init()
1434 mod->irq_empty = NULL; in usbhs_fifo_quit()
1435 mod->irq_ready = NULL; in usbhs_fifo_quit()
1436 mod->irq_bempsts = 0; in usbhs_fifo_quit()
1437 mod->irq_brdysts = 0; in usbhs_fifo_quit()
1440 #define __USBHS_DFIFO_INIT(priv, fifo, channel, fifo_port) \ argument
1442 fifo = usbhsf_get_dnfifo(priv, channel); \
1443 fifo->name = "D"#channel"FIFO"; \
1444 fifo->port = fifo_port; \
1445 fifo->sel = D##channel##FIFOSEL; \
1446 fifo->ctr = D##channel##FIFOCTR; \
1447 fifo->tx_slave.shdma_slave.slave_id = \
1448 usbhs_get_dparam(priv, d##channel##_tx_id); \
1449 fifo->rx_slave.shdma_slave.slave_id = \
1450 usbhs_get_dparam(priv, d##channel##_rx_id); \
1451 usbhsf_dma_init(priv, fifo, channel); \
1454 #define USBHS_DFIFO_INIT(priv, fifo, channel) \ argument
1455 __USBHS_DFIFO_INIT(priv, fifo, channel, D##channel##FIFO)
1456 #define USBHS_DFIFO_INIT_NO_PORT(priv, fifo, channel) \ argument
1457 __USBHS_DFIFO_INIT(priv, fifo, channel, 0)
1461 struct usbhs_fifo *fifo; in usbhs_fifo_probe() local
1464 fifo = usbhsf_get_cfifo(priv); in usbhs_fifo_probe()
1465 fifo->name = "CFIFO"; in usbhs_fifo_probe()
1466 fifo->port = CFIFO; in usbhs_fifo_probe()
1467 fifo->sel = CFIFOSEL; in usbhs_fifo_probe()
1468 fifo->ctr = CFIFOCTR; in usbhs_fifo_probe()
1471 USBHS_DFIFO_INIT(priv, fifo, 0); in usbhs_fifo_probe()
1472 USBHS_DFIFO_INIT(priv, fifo, 1); in usbhs_fifo_probe()
1473 USBHS_DFIFO_INIT_NO_PORT(priv, fifo, 2); in usbhs_fifo_probe()
1474 USBHS_DFIFO_INIT_NO_PORT(priv, fifo, 3); in usbhs_fifo_probe()
1481 struct usbhs_fifo *fifo; in usbhs_fifo_remove() local
1484 usbhs_for_each_dfifo(priv, fifo, i) in usbhs_fifo_remove()
1485 usbhsf_dma_quit(priv, fifo); in usbhs_fifo_remove()