Lines Matching refs:chan

1140 				      struct dwc2_host_chan *chan)  in dwc2_hc_enable_slave_ints()  argument
1144 switch (chan->ep_type) { in dwc2_hc_enable_slave_ints()
1152 if (chan->ep_is_in) { in dwc2_hc_enable_slave_ints()
1157 if (chan->do_ping) in dwc2_hc_enable_slave_ints()
1161 if (chan->do_split) { in dwc2_hc_enable_slave_ints()
1163 if (chan->complete_split) in dwc2_hc_enable_slave_ints()
1169 if (chan->error_state) in dwc2_hc_enable_slave_ints()
1183 if (chan->ep_is_in) in dwc2_hc_enable_slave_ints()
1185 if (chan->error_state) in dwc2_hc_enable_slave_ints()
1187 if (chan->do_split) { in dwc2_hc_enable_slave_ints()
1188 if (chan->complete_split) in dwc2_hc_enable_slave_ints()
1202 if (chan->ep_is_in) { in dwc2_hc_enable_slave_ints()
1212 dwc2_writel(hcintmsk, hsotg->regs + HCINTMSK(chan->hc_num)); in dwc2_hc_enable_slave_ints()
1213 if (dbg_hc(chan)) in dwc2_hc_enable_slave_ints()
1218 struct dwc2_host_chan *chan) in dwc2_hc_enable_dma_ints() argument
1227 if (dbg_hc(chan)) in dwc2_hc_enable_dma_ints()
1231 if (dbg_hc(chan)) in dwc2_hc_enable_dma_ints()
1233 if (chan->ep_type == USB_ENDPOINT_XFER_ISOC) in dwc2_hc_enable_dma_ints()
1237 if (chan->error_state && !chan->do_split && in dwc2_hc_enable_dma_ints()
1238 chan->ep_type != USB_ENDPOINT_XFER_ISOC) { in dwc2_hc_enable_dma_ints()
1239 if (dbg_hc(chan)) in dwc2_hc_enable_dma_ints()
1242 if (chan->ep_is_in) { in dwc2_hc_enable_dma_ints()
1244 if (chan->ep_type != USB_ENDPOINT_XFER_INT) in dwc2_hc_enable_dma_ints()
1249 dwc2_writel(hcintmsk, hsotg->regs + HCINTMSK(chan->hc_num)); in dwc2_hc_enable_dma_ints()
1250 if (dbg_hc(chan)) in dwc2_hc_enable_dma_ints()
1255 struct dwc2_host_chan *chan) in dwc2_hc_enable_ints() argument
1260 if (dbg_hc(chan)) in dwc2_hc_enable_ints()
1262 dwc2_hc_enable_dma_ints(hsotg, chan); in dwc2_hc_enable_ints()
1264 if (dbg_hc(chan)) in dwc2_hc_enable_ints()
1266 dwc2_hc_enable_slave_ints(hsotg, chan); in dwc2_hc_enable_ints()
1271 intmsk |= 1 << chan->hc_num; in dwc2_hc_enable_ints()
1273 if (dbg_hc(chan)) in dwc2_hc_enable_ints()
1280 if (dbg_hc(chan)) in dwc2_hc_enable_ints()
1295 void dwc2_hc_init(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan) in dwc2_hc_init() argument
1297 u8 hc_num = chan->hc_num; in dwc2_hc_init()
1302 if (dbg_hc(chan)) in dwc2_hc_init()
1311 dwc2_hc_enable_ints(hsotg, chan); in dwc2_hc_init()
1317 hcchar = chan->dev_addr << HCCHAR_DEVADDR_SHIFT & HCCHAR_DEVADDR_MASK; in dwc2_hc_init()
1318 hcchar |= chan->ep_num << HCCHAR_EPNUM_SHIFT & HCCHAR_EPNUM_MASK; in dwc2_hc_init()
1319 if (chan->ep_is_in) in dwc2_hc_init()
1321 if (chan->speed == USB_SPEED_LOW) in dwc2_hc_init()
1323 hcchar |= chan->ep_type << HCCHAR_EPTYPE_SHIFT & HCCHAR_EPTYPE_MASK; in dwc2_hc_init()
1324 hcchar |= chan->max_packet << HCCHAR_MPS_SHIFT & HCCHAR_MPS_MASK; in dwc2_hc_init()
1326 if (dbg_hc(chan)) { in dwc2_hc_init()
1333 chan->dev_addr); in dwc2_hc_init()
1335 chan->ep_num); in dwc2_hc_init()
1337 chan->ep_is_in); in dwc2_hc_init()
1339 chan->speed == USB_SPEED_LOW); in dwc2_hc_init()
1341 chan->ep_type); in dwc2_hc_init()
1343 chan->max_packet); in dwc2_hc_init()
1347 if (chan->do_split) { in dwc2_hc_init()
1348 if (dbg_hc(chan)) in dwc2_hc_init()
1352 chan->complete_split ? "CSPLIT" : "SSPLIT"); in dwc2_hc_init()
1353 if (chan->complete_split) in dwc2_hc_init()
1355 hcsplt |= chan->xact_pos << HCSPLT_XACTPOS_SHIFT & in dwc2_hc_init()
1357 hcsplt |= chan->hub_addr << HCSPLT_HUBADDR_SHIFT & in dwc2_hc_init()
1359 hcsplt |= chan->hub_port << HCSPLT_PRTADDR_SHIFT & in dwc2_hc_init()
1361 if (dbg_hc(chan)) { in dwc2_hc_init()
1363 chan->complete_split); in dwc2_hc_init()
1365 chan->xact_pos); in dwc2_hc_init()
1367 chan->hub_addr); in dwc2_hc_init()
1369 chan->hub_port); in dwc2_hc_init()
1371 chan->ep_is_in); in dwc2_hc_init()
1373 chan->max_packet); in dwc2_hc_init()
1375 chan->xfer_len); in dwc2_hc_init()
1410 void dwc2_hc_halt(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan, in dwc2_hc_halt() argument
1415 if (dbg_hc(chan)) in dwc2_hc_halt()
1431 dwc2_writel(hcintmsk, hsotg->regs + HCINTMSK(chan->hc_num)); in dwc2_hc_halt()
1438 dwc2_writel(~hcintmsk, hsotg->regs + HCINT(chan->hc_num)); in dwc2_hc_halt()
1445 chan->halt_status = halt_status; in dwc2_hc_halt()
1447 hcchar = dwc2_readl(hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_halt()
1463 if (chan->halt_pending) { in dwc2_hc_halt()
1471 __func__, chan->hc_num); in dwc2_hc_halt()
1475 hcchar = dwc2_readl(hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_halt()
1480 if (dbg_hc(chan)) in dwc2_hc_halt()
1484 if (dbg_hc(chan)) in dwc2_hc_halt()
1490 if (dbg_hc(chan)) in dwc2_hc_halt()
1495 if (chan->ep_type == USB_ENDPOINT_XFER_CONTROL || in dwc2_hc_halt()
1496 chan->ep_type == USB_ENDPOINT_XFER_BULK) { in dwc2_hc_halt()
1515 if (dbg_hc(chan)) in dwc2_hc_halt()
1519 dwc2_writel(hcchar, hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_halt()
1520 chan->halt_status = halt_status; in dwc2_hc_halt()
1523 if (dbg_hc(chan)) in dwc2_hc_halt()
1525 chan->halt_pending = 1; in dwc2_hc_halt()
1526 chan->halt_on_queue = 0; in dwc2_hc_halt()
1528 if (dbg_hc(chan)) in dwc2_hc_halt()
1530 chan->halt_on_queue = 1; in dwc2_hc_halt()
1533 if (dbg_hc(chan)) { in dwc2_hc_halt()
1535 chan->hc_num); in dwc2_hc_halt()
1539 chan->halt_pending); in dwc2_hc_halt()
1541 chan->halt_on_queue); in dwc2_hc_halt()
1543 chan->halt_status); in dwc2_hc_halt()
1556 void dwc2_hc_cleanup(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan) in dwc2_hc_cleanup() argument
1560 chan->xfer_started = 0; in dwc2_hc_cleanup()
1566 dwc2_writel(0, hsotg->regs + HCINTMSK(chan->hc_num)); in dwc2_hc_cleanup()
1569 dwc2_writel(hcintmsk, hsotg->regs + HCINT(chan->hc_num)); in dwc2_hc_cleanup()
1583 struct dwc2_host_chan *chan, u32 *hcchar) in dwc2_hc_set_even_odd_frame() argument
1585 if (chan->ep_type == USB_ENDPOINT_XFER_INT || in dwc2_hc_set_even_odd_frame()
1586 chan->ep_type == USB_ENDPOINT_XFER_ISOC) { in dwc2_hc_set_even_odd_frame()
1593 static void dwc2_set_pid_isoc(struct dwc2_host_chan *chan) in dwc2_set_pid_isoc() argument
1596 if (chan->speed == USB_SPEED_HIGH) { in dwc2_set_pid_isoc()
1597 if (chan->ep_is_in) { in dwc2_set_pid_isoc()
1598 if (chan->multi_count == 1) in dwc2_set_pid_isoc()
1599 chan->data_pid_start = DWC2_HC_PID_DATA0; in dwc2_set_pid_isoc()
1600 else if (chan->multi_count == 2) in dwc2_set_pid_isoc()
1601 chan->data_pid_start = DWC2_HC_PID_DATA1; in dwc2_set_pid_isoc()
1603 chan->data_pid_start = DWC2_HC_PID_DATA2; in dwc2_set_pid_isoc()
1605 if (chan->multi_count == 1) in dwc2_set_pid_isoc()
1606 chan->data_pid_start = DWC2_HC_PID_DATA0; in dwc2_set_pid_isoc()
1608 chan->data_pid_start = DWC2_HC_PID_MDATA; in dwc2_set_pid_isoc()
1611 chan->data_pid_start = DWC2_HC_PID_DATA0; in dwc2_set_pid_isoc()
1630 struct dwc2_host_chan *chan) in dwc2_hc_write_packet() argument
1637 u32 *data_buf = (u32 *)chan->xfer_buf; in dwc2_hc_write_packet()
1639 if (dbg_hc(chan)) in dwc2_hc_write_packet()
1642 data_fifo = (u32 __iomem *)(hsotg->regs + HCFIFO(chan->hc_num)); in dwc2_hc_write_packet()
1644 remaining_count = chan->xfer_len - chan->xfer_count; in dwc2_hc_write_packet()
1645 if (remaining_count > chan->max_packet) in dwc2_hc_write_packet()
1646 byte_count = chan->max_packet; in dwc2_hc_write_packet()
1665 chan->xfer_count += byte_count; in dwc2_hc_write_packet()
1666 chan->xfer_buf += byte_count; in dwc2_hc_write_packet()
1703 struct dwc2_host_chan *chan) in dwc2_hc_start_transfer() argument
1711 if (dbg_hc(chan)) in dwc2_hc_start_transfer()
1714 if (chan->do_ping) { in dwc2_hc_start_transfer()
1716 if (dbg_hc(chan)) in dwc2_hc_start_transfer()
1718 dwc2_hc_do_ping(hsotg, chan); in dwc2_hc_start_transfer()
1719 chan->xfer_started = 1; in dwc2_hc_start_transfer()
1722 if (dbg_hc(chan)) in dwc2_hc_start_transfer()
1728 if (chan->do_split) { in dwc2_hc_start_transfer()
1729 if (dbg_hc(chan)) in dwc2_hc_start_transfer()
1733 if (chan->complete_split && !chan->ep_is_in) in dwc2_hc_start_transfer()
1738 chan->xfer_len = 0; in dwc2_hc_start_transfer()
1739 else if (chan->ep_is_in || chan->xfer_len > chan->max_packet) in dwc2_hc_start_transfer()
1740 chan->xfer_len = chan->max_packet; in dwc2_hc_start_transfer()
1741 else if (!chan->ep_is_in && chan->xfer_len > 188) in dwc2_hc_start_transfer()
1742 chan->xfer_len = 188; in dwc2_hc_start_transfer()
1744 hctsiz |= chan->xfer_len << TSIZ_XFERSIZE_SHIFT & in dwc2_hc_start_transfer()
1747 if (dbg_hc(chan)) in dwc2_hc_start_transfer()
1753 if (chan->ep_type == USB_ENDPOINT_XFER_INT || in dwc2_hc_start_transfer()
1754 chan->ep_type == USB_ENDPOINT_XFER_ISOC) { in dwc2_hc_start_transfer()
1763 chan->multi_count * chan->max_packet; in dwc2_hc_start_transfer()
1765 if (chan->xfer_len > max_periodic_len) in dwc2_hc_start_transfer()
1766 chan->xfer_len = max_periodic_len; in dwc2_hc_start_transfer()
1767 } else if (chan->xfer_len > max_hc_xfer_size) { in dwc2_hc_start_transfer()
1772 chan->xfer_len = in dwc2_hc_start_transfer()
1773 max_hc_xfer_size - chan->max_packet + 1; in dwc2_hc_start_transfer()
1776 if (chan->xfer_len > 0) { in dwc2_hc_start_transfer()
1777 num_packets = (chan->xfer_len + chan->max_packet - 1) / in dwc2_hc_start_transfer()
1778 chan->max_packet; in dwc2_hc_start_transfer()
1781 chan->xfer_len = num_packets * chan->max_packet; in dwc2_hc_start_transfer()
1788 if (chan->ep_is_in) in dwc2_hc_start_transfer()
1793 chan->xfer_len = num_packets * chan->max_packet; in dwc2_hc_start_transfer()
1795 if (chan->ep_type == USB_ENDPOINT_XFER_INT || in dwc2_hc_start_transfer()
1796 chan->ep_type == USB_ENDPOINT_XFER_ISOC) in dwc2_hc_start_transfer()
1801 chan->multi_count = num_packets; in dwc2_hc_start_transfer()
1803 if (chan->ep_type == USB_ENDPOINT_XFER_ISOC) in dwc2_hc_start_transfer()
1804 dwc2_set_pid_isoc(chan); in dwc2_hc_start_transfer()
1806 hctsiz |= chan->xfer_len << TSIZ_XFERSIZE_SHIFT & in dwc2_hc_start_transfer()
1810 chan->start_pkt_count = num_packets; in dwc2_hc_start_transfer()
1812 hctsiz |= chan->data_pid_start << TSIZ_SC_MC_PID_SHIFT & in dwc2_hc_start_transfer()
1814 dwc2_writel(hctsiz, hsotg->regs + HCTSIZ(chan->hc_num)); in dwc2_hc_start_transfer()
1815 if (dbg_hc(chan)) { in dwc2_hc_start_transfer()
1817 hctsiz, chan->hc_num); in dwc2_hc_start_transfer()
1820 chan->hc_num); in dwc2_hc_start_transfer()
1835 if (chan->align_buf) { in dwc2_hc_start_transfer()
1836 if (dbg_hc(chan)) in dwc2_hc_start_transfer()
1838 dma_addr = chan->align_buf; in dwc2_hc_start_transfer()
1840 dma_addr = chan->xfer_dma; in dwc2_hc_start_transfer()
1842 dwc2_writel((u32)dma_addr, hsotg->regs + HCDMA(chan->hc_num)); in dwc2_hc_start_transfer()
1843 if (dbg_hc(chan)) in dwc2_hc_start_transfer()
1845 (unsigned long)dma_addr, chan->hc_num); in dwc2_hc_start_transfer()
1849 if (chan->do_split) { in dwc2_hc_start_transfer()
1850 u32 hcsplt = dwc2_readl(hsotg->regs + HCSPLT(chan->hc_num)); in dwc2_hc_start_transfer()
1853 dwc2_writel(hcsplt, hsotg->regs + HCSPLT(chan->hc_num)); in dwc2_hc_start_transfer()
1856 hcchar = dwc2_readl(hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_start_transfer()
1858 hcchar |= chan->multi_count << HCCHAR_MULTICNT_SHIFT & in dwc2_hc_start_transfer()
1860 dwc2_hc_set_even_odd_frame(hsotg, chan, &hcchar); in dwc2_hc_start_transfer()
1865 __func__, chan->hc_num, hcchar); in dwc2_hc_start_transfer()
1871 if (dbg_hc(chan)) in dwc2_hc_start_transfer()
1876 dwc2_writel(hcchar, hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_start_transfer()
1877 if (dbg_hc(chan)) in dwc2_hc_start_transfer()
1879 chan->hc_num); in dwc2_hc_start_transfer()
1881 chan->xfer_started = 1; in dwc2_hc_start_transfer()
1882 chan->requests++; in dwc2_hc_start_transfer()
1885 !chan->ep_is_in && chan->xfer_len > 0) in dwc2_hc_start_transfer()
1887 dwc2_hc_write_packet(hsotg, chan); in dwc2_hc_start_transfer()
1905 struct dwc2_host_chan *chan) in dwc2_hc_start_transfer_ddma() argument
1911 if (chan->do_ping) in dwc2_hc_start_transfer_ddma()
1914 if (chan->ep_type == USB_ENDPOINT_XFER_ISOC) in dwc2_hc_start_transfer_ddma()
1915 dwc2_set_pid_isoc(chan); in dwc2_hc_start_transfer_ddma()
1918 hctsiz |= chan->data_pid_start << TSIZ_SC_MC_PID_SHIFT & in dwc2_hc_start_transfer_ddma()
1922 hctsiz |= (chan->ntd - 1) << TSIZ_NTD_SHIFT & TSIZ_NTD_MASK; in dwc2_hc_start_transfer_ddma()
1925 hctsiz |= chan->schinfo << TSIZ_SCHINFO_SHIFT & TSIZ_SCHINFO_MASK; in dwc2_hc_start_transfer_ddma()
1927 if (dbg_hc(chan)) { in dwc2_hc_start_transfer_ddma()
1929 chan->hc_num); in dwc2_hc_start_transfer_ddma()
1931 chan->data_pid_start); in dwc2_hc_start_transfer_ddma()
1932 dev_vdbg(hsotg->dev, " NTD: %d\n", chan->ntd - 1); in dwc2_hc_start_transfer_ddma()
1935 dwc2_writel(hctsiz, hsotg->regs + HCTSIZ(chan->hc_num)); in dwc2_hc_start_transfer_ddma()
1937 hc_dma = (u32)chan->desc_list_addr & HCDMA_DMA_ADDR_MASK; in dwc2_hc_start_transfer_ddma()
1941 dwc2_writel(hc_dma, hsotg->regs + HCDMA(chan->hc_num)); in dwc2_hc_start_transfer_ddma()
1942 if (dbg_hc(chan)) in dwc2_hc_start_transfer_ddma()
1944 hc_dma, chan->hc_num); in dwc2_hc_start_transfer_ddma()
1946 hcchar = dwc2_readl(hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_start_transfer_ddma()
1948 hcchar |= chan->multi_count << HCCHAR_MULTICNT_SHIFT & in dwc2_hc_start_transfer_ddma()
1954 __func__, chan->hc_num, hcchar); in dwc2_hc_start_transfer_ddma()
1960 if (dbg_hc(chan)) in dwc2_hc_start_transfer_ddma()
1965 dwc2_writel(hcchar, hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_start_transfer_ddma()
1966 if (dbg_hc(chan)) in dwc2_hc_start_transfer_ddma()
1968 chan->hc_num); in dwc2_hc_start_transfer_ddma()
1970 chan->xfer_started = 1; in dwc2_hc_start_transfer_ddma()
1971 chan->requests++; in dwc2_hc_start_transfer_ddma()
1995 struct dwc2_host_chan *chan) in dwc2_hc_continue_transfer() argument
1997 if (dbg_hc(chan)) in dwc2_hc_continue_transfer()
1999 chan->hc_num); in dwc2_hc_continue_transfer()
2001 if (chan->do_split) in dwc2_hc_continue_transfer()
2005 if (chan->data_pid_start == DWC2_HC_PID_SETUP) in dwc2_hc_continue_transfer()
2009 if (chan->ep_is_in) { in dwc2_hc_continue_transfer()
2022 u32 hcchar = dwc2_readl(hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_continue_transfer()
2024 dwc2_hc_set_even_odd_frame(hsotg, chan, &hcchar); in dwc2_hc_continue_transfer()
2027 if (dbg_hc(chan)) in dwc2_hc_continue_transfer()
2030 dwc2_writel(hcchar, hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_continue_transfer()
2031 chan->requests++; in dwc2_hc_continue_transfer()
2037 if (chan->xfer_count < chan->xfer_len) { in dwc2_hc_continue_transfer()
2038 if (chan->ep_type == USB_ENDPOINT_XFER_INT || in dwc2_hc_continue_transfer()
2039 chan->ep_type == USB_ENDPOINT_XFER_ISOC) { in dwc2_hc_continue_transfer()
2041 HCCHAR(chan->hc_num)); in dwc2_hc_continue_transfer()
2043 dwc2_hc_set_even_odd_frame(hsotg, chan, in dwc2_hc_continue_transfer()
2048 dwc2_hc_write_packet(hsotg, chan); in dwc2_hc_continue_transfer()
2049 chan->requests++; in dwc2_hc_continue_transfer()
2065 void dwc2_hc_do_ping(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan) in dwc2_hc_do_ping() argument
2070 if (dbg_hc(chan)) in dwc2_hc_do_ping()
2072 chan->hc_num); in dwc2_hc_do_ping()
2077 dwc2_writel(hctsiz, hsotg->regs + HCTSIZ(chan->hc_num)); in dwc2_hc_do_ping()
2079 hcchar = dwc2_readl(hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_do_ping()
2082 dwc2_writel(hcchar, hsotg->regs + HCCHAR(chan->hc_num)); in dwc2_hc_do_ping()