Lines Matching refs:chan
772 struct dwc2_host_chan *chan) in dwc2_hc_enable_slave_ints() argument
776 switch (chan->ep_type) { in dwc2_hc_enable_slave_ints()
784 if (chan->ep_is_in) { in dwc2_hc_enable_slave_ints()
789 if (chan->do_ping) in dwc2_hc_enable_slave_ints()
793 if (chan->do_split) { in dwc2_hc_enable_slave_ints()
795 if (chan->complete_split) in dwc2_hc_enable_slave_ints()
801 if (chan->error_state) in dwc2_hc_enable_slave_ints()
815 if (chan->ep_is_in) in dwc2_hc_enable_slave_ints()
817 if (chan->error_state) in dwc2_hc_enable_slave_ints()
819 if (chan->do_split) { in dwc2_hc_enable_slave_ints()
820 if (chan->complete_split) in dwc2_hc_enable_slave_ints()
834 if (chan->ep_is_in) { in dwc2_hc_enable_slave_ints()
844 writel(hcintmsk, hsotg->regs + HCINTMSK(chan->hc_num)); in dwc2_hc_enable_slave_ints()
845 if (dbg_hc(chan)) in dwc2_hc_enable_slave_ints()
850 struct dwc2_host_chan *chan) in dwc2_hc_enable_dma_ints() argument
859 if (dbg_hc(chan)) in dwc2_hc_enable_dma_ints()
863 if (dbg_hc(chan)) in dwc2_hc_enable_dma_ints()
865 if (chan->ep_type == USB_ENDPOINT_XFER_ISOC) in dwc2_hc_enable_dma_ints()
869 if (chan->error_state && !chan->do_split && in dwc2_hc_enable_dma_ints()
870 chan->ep_type != USB_ENDPOINT_XFER_ISOC) { in dwc2_hc_enable_dma_ints()
871 if (dbg_hc(chan)) in dwc2_hc_enable_dma_ints()
874 if (chan->ep_is_in) { in dwc2_hc_enable_dma_ints()
876 if (chan->ep_type != USB_ENDPOINT_XFER_INT) in dwc2_hc_enable_dma_ints()
881 writel(hcintmsk, hsotg->regs + HCINTMSK(chan->hc_num)); in dwc2_hc_enable_dma_ints()
882 if (dbg_hc(chan)) in dwc2_hc_enable_dma_ints()
887 struct dwc2_host_chan *chan) in dwc2_hc_enable_ints() argument
892 if (dbg_hc(chan)) in dwc2_hc_enable_ints()
894 dwc2_hc_enable_dma_ints(hsotg, chan); in dwc2_hc_enable_ints()
896 if (dbg_hc(chan)) in dwc2_hc_enable_ints()
898 dwc2_hc_enable_slave_ints(hsotg, chan); in dwc2_hc_enable_ints()
903 intmsk |= 1 << chan->hc_num; in dwc2_hc_enable_ints()
905 if (dbg_hc(chan)) in dwc2_hc_enable_ints()
912 if (dbg_hc(chan)) in dwc2_hc_enable_ints()
927 void dwc2_hc_init(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan) in dwc2_hc_init() argument
929 u8 hc_num = chan->hc_num; in dwc2_hc_init()
934 if (dbg_hc(chan)) in dwc2_hc_init()
943 dwc2_hc_enable_ints(hsotg, chan); in dwc2_hc_init()
949 hcchar = chan->dev_addr << HCCHAR_DEVADDR_SHIFT & HCCHAR_DEVADDR_MASK; in dwc2_hc_init()
950 hcchar |= chan->ep_num << HCCHAR_EPNUM_SHIFT & HCCHAR_EPNUM_MASK; in dwc2_hc_init()
951 if (chan->ep_is_in) in dwc2_hc_init()
953 if (chan->speed == USB_SPEED_LOW) in dwc2_hc_init()
955 hcchar |= chan->ep_type << HCCHAR_EPTYPE_SHIFT & HCCHAR_EPTYPE_MASK; in dwc2_hc_init()
956 hcchar |= chan->max_packet << HCCHAR_MPS_SHIFT & HCCHAR_MPS_MASK; in dwc2_hc_init()
958 if (dbg_hc(chan)) { in dwc2_hc_init()
965 chan->dev_addr); in dwc2_hc_init()
967 chan->ep_num); in dwc2_hc_init()
969 chan->ep_is_in); in dwc2_hc_init()
971 chan->speed == USB_SPEED_LOW); in dwc2_hc_init()
973 chan->ep_type); in dwc2_hc_init()
975 chan->max_packet); in dwc2_hc_init()
979 if (chan->do_split) { in dwc2_hc_init()
980 if (dbg_hc(chan)) in dwc2_hc_init()
984 chan->complete_split ? "CSPLIT" : "SSPLIT"); in dwc2_hc_init()
985 if (chan->complete_split) in dwc2_hc_init()
987 hcsplt |= chan->xact_pos << HCSPLT_XACTPOS_SHIFT & in dwc2_hc_init()
989 hcsplt |= chan->hub_addr << HCSPLT_HUBADDR_SHIFT & in dwc2_hc_init()
991 hcsplt |= chan->hub_port << HCSPLT_PRTADDR_SHIFT & in dwc2_hc_init()
993 if (dbg_hc(chan)) { in dwc2_hc_init()
995 chan->complete_split); in dwc2_hc_init()
997 chan->xact_pos); in dwc2_hc_init()
999 chan->hub_addr); in dwc2_hc_init()
1001 chan->hub_port); in dwc2_hc_init()
1003 chan->ep_is_in); in dwc2_hc_init()
1005 chan->max_packet); in dwc2_hc_init()
1007 chan->xfer_len); in dwc2_hc_init()
1042 void dwc2_hc_halt(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan, in dwc2_hc_halt() argument
1047 if (dbg_hc(chan)) in dwc2_hc_halt()
1063 writel(hcintmsk, hsotg->regs + HCINTMSK(chan->hc_num)); in dwc2_hc_halt()
1070 writel(~hcintmsk, hsotg->regs + HCINT(chan->hc_num)); in dwc2_hc_halt()
1077 chan->halt_status = halt_status; in dwc2_hc_halt()
1079 hcchar = readl(hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_halt()
1095 if (chan->halt_pending) { in dwc2_hc_halt()
1103 __func__, chan->hc_num); in dwc2_hc_halt()
1107 hcchar = readl(hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_halt()
1112 if (dbg_hc(chan)) in dwc2_hc_halt()
1116 if (dbg_hc(chan)) in dwc2_hc_halt()
1122 if (dbg_hc(chan)) in dwc2_hc_halt()
1127 if (chan->ep_type == USB_ENDPOINT_XFER_CONTROL || in dwc2_hc_halt()
1128 chan->ep_type == USB_ENDPOINT_XFER_BULK) { in dwc2_hc_halt()
1147 if (dbg_hc(chan)) in dwc2_hc_halt()
1151 writel(hcchar, hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_halt()
1152 chan->halt_status = halt_status; in dwc2_hc_halt()
1155 if (dbg_hc(chan)) in dwc2_hc_halt()
1157 chan->halt_pending = 1; in dwc2_hc_halt()
1158 chan->halt_on_queue = 0; in dwc2_hc_halt()
1160 if (dbg_hc(chan)) in dwc2_hc_halt()
1162 chan->halt_on_queue = 1; in dwc2_hc_halt()
1165 if (dbg_hc(chan)) { in dwc2_hc_halt()
1167 chan->hc_num); in dwc2_hc_halt()
1171 chan->halt_pending); in dwc2_hc_halt()
1173 chan->halt_on_queue); in dwc2_hc_halt()
1175 chan->halt_status); in dwc2_hc_halt()
1188 void dwc2_hc_cleanup(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan) in dwc2_hc_cleanup() argument
1192 chan->xfer_started = 0; in dwc2_hc_cleanup()
1198 writel(0, hsotg->regs + HCINTMSK(chan->hc_num)); in dwc2_hc_cleanup()
1201 writel(hcintmsk, hsotg->regs + HCINT(chan->hc_num)); in dwc2_hc_cleanup()
1215 struct dwc2_host_chan *chan, u32 *hcchar) in dwc2_hc_set_even_odd_frame() argument
1217 if (chan->ep_type == USB_ENDPOINT_XFER_INT || in dwc2_hc_set_even_odd_frame()
1218 chan->ep_type == USB_ENDPOINT_XFER_ISOC) { in dwc2_hc_set_even_odd_frame()
1225 static void dwc2_set_pid_isoc(struct dwc2_host_chan *chan) in dwc2_set_pid_isoc() argument
1228 if (chan->speed == USB_SPEED_HIGH) { in dwc2_set_pid_isoc()
1229 if (chan->ep_is_in) { in dwc2_set_pid_isoc()
1230 if (chan->multi_count == 1) in dwc2_set_pid_isoc()
1231 chan->data_pid_start = DWC2_HC_PID_DATA0; in dwc2_set_pid_isoc()
1232 else if (chan->multi_count == 2) in dwc2_set_pid_isoc()
1233 chan->data_pid_start = DWC2_HC_PID_DATA1; in dwc2_set_pid_isoc()
1235 chan->data_pid_start = DWC2_HC_PID_DATA2; in dwc2_set_pid_isoc()
1237 if (chan->multi_count == 1) in dwc2_set_pid_isoc()
1238 chan->data_pid_start = DWC2_HC_PID_DATA0; in dwc2_set_pid_isoc()
1240 chan->data_pid_start = DWC2_HC_PID_MDATA; in dwc2_set_pid_isoc()
1243 chan->data_pid_start = DWC2_HC_PID_DATA0; in dwc2_set_pid_isoc()
1262 struct dwc2_host_chan *chan) in dwc2_hc_write_packet() argument
1269 u32 *data_buf = (u32 *)chan->xfer_buf; in dwc2_hc_write_packet()
1271 if (dbg_hc(chan)) in dwc2_hc_write_packet()
1274 data_fifo = (u32 __iomem *)(hsotg->regs + HCFIFO(chan->hc_num)); in dwc2_hc_write_packet()
1276 remaining_count = chan->xfer_len - chan->xfer_count; in dwc2_hc_write_packet()
1277 if (remaining_count > chan->max_packet) in dwc2_hc_write_packet()
1278 byte_count = chan->max_packet; in dwc2_hc_write_packet()
1297 chan->xfer_count += byte_count; in dwc2_hc_write_packet()
1298 chan->xfer_buf += byte_count; in dwc2_hc_write_packet()
1335 struct dwc2_host_chan *chan) in dwc2_hc_start_transfer() argument
1343 if (dbg_hc(chan)) in dwc2_hc_start_transfer()
1346 if (chan->do_ping) { in dwc2_hc_start_transfer()
1348 if (dbg_hc(chan)) in dwc2_hc_start_transfer()
1350 dwc2_hc_do_ping(hsotg, chan); in dwc2_hc_start_transfer()
1351 chan->xfer_started = 1; in dwc2_hc_start_transfer()
1354 if (dbg_hc(chan)) in dwc2_hc_start_transfer()
1360 if (chan->do_split) { in dwc2_hc_start_transfer()
1361 if (dbg_hc(chan)) in dwc2_hc_start_transfer()
1365 if (chan->complete_split && !chan->ep_is_in) in dwc2_hc_start_transfer()
1370 chan->xfer_len = 0; in dwc2_hc_start_transfer()
1371 else if (chan->ep_is_in || chan->xfer_len > chan->max_packet) in dwc2_hc_start_transfer()
1372 chan->xfer_len = chan->max_packet; in dwc2_hc_start_transfer()
1373 else if (!chan->ep_is_in && chan->xfer_len > 188) in dwc2_hc_start_transfer()
1374 chan->xfer_len = 188; in dwc2_hc_start_transfer()
1376 hctsiz |= chan->xfer_len << TSIZ_XFERSIZE_SHIFT & in dwc2_hc_start_transfer()
1379 if (dbg_hc(chan)) in dwc2_hc_start_transfer()
1385 if (chan->ep_type == USB_ENDPOINT_XFER_INT || in dwc2_hc_start_transfer()
1386 chan->ep_type == USB_ENDPOINT_XFER_ISOC) { in dwc2_hc_start_transfer()
1395 chan->multi_count * chan->max_packet; in dwc2_hc_start_transfer()
1397 if (chan->xfer_len > max_periodic_len) in dwc2_hc_start_transfer()
1398 chan->xfer_len = max_periodic_len; in dwc2_hc_start_transfer()
1399 } else if (chan->xfer_len > max_hc_xfer_size) { in dwc2_hc_start_transfer()
1404 chan->xfer_len = in dwc2_hc_start_transfer()
1405 max_hc_xfer_size - chan->max_packet + 1; in dwc2_hc_start_transfer()
1408 if (chan->xfer_len > 0) { in dwc2_hc_start_transfer()
1409 num_packets = (chan->xfer_len + chan->max_packet - 1) / in dwc2_hc_start_transfer()
1410 chan->max_packet; in dwc2_hc_start_transfer()
1413 chan->xfer_len = num_packets * chan->max_packet; in dwc2_hc_start_transfer()
1420 if (chan->ep_is_in) in dwc2_hc_start_transfer()
1425 chan->xfer_len = num_packets * chan->max_packet; in dwc2_hc_start_transfer()
1427 if (chan->ep_type == USB_ENDPOINT_XFER_INT || in dwc2_hc_start_transfer()
1428 chan->ep_type == USB_ENDPOINT_XFER_ISOC) in dwc2_hc_start_transfer()
1433 chan->multi_count = num_packets; in dwc2_hc_start_transfer()
1435 if (chan->ep_type == USB_ENDPOINT_XFER_ISOC) in dwc2_hc_start_transfer()
1436 dwc2_set_pid_isoc(chan); in dwc2_hc_start_transfer()
1438 hctsiz |= chan->xfer_len << TSIZ_XFERSIZE_SHIFT & in dwc2_hc_start_transfer()
1442 chan->start_pkt_count = num_packets; in dwc2_hc_start_transfer()
1444 hctsiz |= chan->data_pid_start << TSIZ_SC_MC_PID_SHIFT & in dwc2_hc_start_transfer()
1446 writel(hctsiz, hsotg->regs + HCTSIZ(chan->hc_num)); in dwc2_hc_start_transfer()
1447 if (dbg_hc(chan)) { in dwc2_hc_start_transfer()
1449 hctsiz, chan->hc_num); in dwc2_hc_start_transfer()
1452 chan->hc_num); in dwc2_hc_start_transfer()
1467 if (chan->align_buf) { in dwc2_hc_start_transfer()
1468 if (dbg_hc(chan)) in dwc2_hc_start_transfer()
1470 dma_addr = chan->align_buf; in dwc2_hc_start_transfer()
1472 dma_addr = chan->xfer_dma; in dwc2_hc_start_transfer()
1474 writel((u32)dma_addr, hsotg->regs + HCDMA(chan->hc_num)); in dwc2_hc_start_transfer()
1475 if (dbg_hc(chan)) in dwc2_hc_start_transfer()
1477 (unsigned long)dma_addr, chan->hc_num); in dwc2_hc_start_transfer()
1481 if (chan->do_split) { in dwc2_hc_start_transfer()
1482 u32 hcsplt = readl(hsotg->regs + HCSPLT(chan->hc_num)); in dwc2_hc_start_transfer()
1485 writel(hcsplt, hsotg->regs + HCSPLT(chan->hc_num)); in dwc2_hc_start_transfer()
1488 hcchar = readl(hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_start_transfer()
1490 hcchar |= chan->multi_count << HCCHAR_MULTICNT_SHIFT & in dwc2_hc_start_transfer()
1492 dwc2_hc_set_even_odd_frame(hsotg, chan, &hcchar); in dwc2_hc_start_transfer()
1497 __func__, chan->hc_num, hcchar); in dwc2_hc_start_transfer()
1503 if (dbg_hc(chan)) in dwc2_hc_start_transfer()
1508 writel(hcchar, hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_start_transfer()
1509 if (dbg_hc(chan)) in dwc2_hc_start_transfer()
1511 chan->hc_num); in dwc2_hc_start_transfer()
1513 chan->xfer_started = 1; in dwc2_hc_start_transfer()
1514 chan->requests++; in dwc2_hc_start_transfer()
1517 !chan->ep_is_in && chan->xfer_len > 0) in dwc2_hc_start_transfer()
1519 dwc2_hc_write_packet(hsotg, chan); in dwc2_hc_start_transfer()
1537 struct dwc2_host_chan *chan) in dwc2_hc_start_transfer_ddma() argument
1543 if (chan->do_ping) in dwc2_hc_start_transfer_ddma()
1546 if (chan->ep_type == USB_ENDPOINT_XFER_ISOC) in dwc2_hc_start_transfer_ddma()
1547 dwc2_set_pid_isoc(chan); in dwc2_hc_start_transfer_ddma()
1550 hctsiz |= chan->data_pid_start << TSIZ_SC_MC_PID_SHIFT & in dwc2_hc_start_transfer_ddma()
1554 hctsiz |= (chan->ntd - 1) << TSIZ_NTD_SHIFT & TSIZ_NTD_MASK; in dwc2_hc_start_transfer_ddma()
1557 hctsiz |= chan->schinfo << TSIZ_SCHINFO_SHIFT & TSIZ_SCHINFO_MASK; in dwc2_hc_start_transfer_ddma()
1559 if (dbg_hc(chan)) { in dwc2_hc_start_transfer_ddma()
1561 chan->hc_num); in dwc2_hc_start_transfer_ddma()
1563 chan->data_pid_start); in dwc2_hc_start_transfer_ddma()
1564 dev_vdbg(hsotg->dev, " NTD: %d\n", chan->ntd - 1); in dwc2_hc_start_transfer_ddma()
1567 writel(hctsiz, hsotg->regs + HCTSIZ(chan->hc_num)); in dwc2_hc_start_transfer_ddma()
1569 hc_dma = (u32)chan->desc_list_addr & HCDMA_DMA_ADDR_MASK; in dwc2_hc_start_transfer_ddma()
1573 writel(hc_dma, hsotg->regs + HCDMA(chan->hc_num)); in dwc2_hc_start_transfer_ddma()
1574 if (dbg_hc(chan)) in dwc2_hc_start_transfer_ddma()
1576 hc_dma, chan->hc_num); in dwc2_hc_start_transfer_ddma()
1578 hcchar = readl(hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_start_transfer_ddma()
1580 hcchar |= chan->multi_count << HCCHAR_MULTICNT_SHIFT & in dwc2_hc_start_transfer_ddma()
1586 __func__, chan->hc_num, hcchar); in dwc2_hc_start_transfer_ddma()
1592 if (dbg_hc(chan)) in dwc2_hc_start_transfer_ddma()
1597 writel(hcchar, hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_start_transfer_ddma()
1598 if (dbg_hc(chan)) in dwc2_hc_start_transfer_ddma()
1600 chan->hc_num); in dwc2_hc_start_transfer_ddma()
1602 chan->xfer_started = 1; in dwc2_hc_start_transfer_ddma()
1603 chan->requests++; in dwc2_hc_start_transfer_ddma()
1627 struct dwc2_host_chan *chan) in dwc2_hc_continue_transfer() argument
1629 if (dbg_hc(chan)) in dwc2_hc_continue_transfer()
1631 chan->hc_num); in dwc2_hc_continue_transfer()
1633 if (chan->do_split) in dwc2_hc_continue_transfer()
1637 if (chan->data_pid_start == DWC2_HC_PID_SETUP) in dwc2_hc_continue_transfer()
1641 if (chan->ep_is_in) { in dwc2_hc_continue_transfer()
1654 u32 hcchar = readl(hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_continue_transfer()
1656 dwc2_hc_set_even_odd_frame(hsotg, chan, &hcchar); in dwc2_hc_continue_transfer()
1659 if (dbg_hc(chan)) in dwc2_hc_continue_transfer()
1662 writel(hcchar, hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_continue_transfer()
1663 chan->requests++; in dwc2_hc_continue_transfer()
1669 if (chan->xfer_count < chan->xfer_len) { in dwc2_hc_continue_transfer()
1670 if (chan->ep_type == USB_ENDPOINT_XFER_INT || in dwc2_hc_continue_transfer()
1671 chan->ep_type == USB_ENDPOINT_XFER_ISOC) { in dwc2_hc_continue_transfer()
1673 HCCHAR(chan->hc_num)); in dwc2_hc_continue_transfer()
1675 dwc2_hc_set_even_odd_frame(hsotg, chan, in dwc2_hc_continue_transfer()
1680 dwc2_hc_write_packet(hsotg, chan); in dwc2_hc_continue_transfer()
1681 chan->requests++; in dwc2_hc_continue_transfer()
1697 void dwc2_hc_do_ping(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan) in dwc2_hc_do_ping() argument
1702 if (dbg_hc(chan)) in dwc2_hc_do_ping()
1704 chan->hc_num); in dwc2_hc_do_ping()
1709 writel(hctsiz, hsotg->regs + HCTSIZ(chan->hc_num)); in dwc2_hc_do_ping()
1711 hcchar = readl(hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_do_ping()
1714 writel(hcchar, hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_do_ping()