Lines Matching refs:priv_dev
113 static int cdns3_get_dma_pos(struct cdns3_device *priv_dev, in cdns3_get_dma_pos() argument
118 dma_index = readl(&priv_dev->regs->ep_traddr) - priv_ep->trb_pool_dma; in cdns3_get_dma_pos()
161 void cdns3_select_ep(struct cdns3_device *priv_dev, u32 ep) in cdns3_select_ep() argument
163 if (priv_dev->selected_ep == ep) in cdns3_select_ep()
166 priv_dev->selected_ep = ep; in cdns3_select_ep()
167 writel(ep, &priv_dev->regs->ep_sel); in cdns3_select_ep()
177 static int cdns3_get_tdl(struct cdns3_device *priv_dev) in cdns3_get_tdl() argument
179 if (priv_dev->dev_ver < DEV_VER_V3) in cdns3_get_tdl()
180 return EP_CMD_TDL_GET(readl(&priv_dev->regs->ep_cmd)); in cdns3_get_tdl()
182 return readl(&priv_dev->regs->ep_tdl); in cdns3_get_tdl()
210 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_free_trb_pool() local
213 dma_free_coherent(priv_dev->sysdev, in cdns3_free_trb_pool()
228 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_allocate_trb_pool() local
237 priv_ep->trb_pool = dma_alloc_coherent(priv_dev->sysdev, in cdns3_allocate_trb_pool()
278 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_ep_stall_flush() local
284 &priv_dev->regs->ep_cmd); in cdns3_ep_stall_flush()
287 readl_poll_timeout_atomic(&priv_dev->regs->ep_cmd, val, in cdns3_ep_stall_flush()
297 void cdns3_hw_reset_eps_config(struct cdns3_device *priv_dev) in cdns3_hw_reset_eps_config() argument
301 writel(USB_CONF_CFGRST, &priv_dev->regs->usb_conf); in cdns3_hw_reset_eps_config()
303 cdns3_allow_enable_l1(priv_dev, 0); in cdns3_hw_reset_eps_config()
304 priv_dev->hw_configured_flag = 0; in cdns3_hw_reset_eps_config()
305 priv_dev->onchip_used_size = 0; in cdns3_hw_reset_eps_config()
306 priv_dev->out_mem_is_allocated = 0; in cdns3_hw_reset_eps_config()
307 priv_dev->wait_for_setup = 0; in cdns3_hw_reset_eps_config()
308 priv_dev->using_streams = 0; in cdns3_hw_reset_eps_config()
311 if (priv_dev->eps[i]) in cdns3_hw_reset_eps_config()
312 priv_dev->eps[i]->flags &= ~EP_CONFIGURED; in cdns3_hw_reset_eps_config()
365 void cdns3_allow_enable_l1(struct cdns3_device *priv_dev, int enable) in cdns3_allow_enable_l1() argument
368 writel(USB_CONF_L1EN, &priv_dev->regs->usb_conf); in cdns3_allow_enable_l1()
370 writel(USB_CONF_L1DS, &priv_dev->regs->usb_conf); in cdns3_allow_enable_l1()
373 enum usb_device_speed cdns3_get_speed(struct cdns3_device *priv_dev) in cdns3_get_speed() argument
377 reg = readl(&priv_dev->regs->usb_sts); in cdns3_get_speed()
398 static int cdns3_start_all_request(struct cdns3_device *priv_dev, in cdns3_start_all_request() argument
418 dev_dbg(priv_dev->dev, "Blocking external request\n"); in cdns3_start_all_request()
452 #define cdns3_wa2_enable_detection(priv_dev, priv_ep, reg) do { \ argument
524 static struct usb_request *cdns3_wa2_gadget_giveback(struct cdns3_device *priv_dev, in cdns3_wa2_gadget_giveback() argument
540 usb_gadget_unmap_request_by_dev(priv_dev->sysdev, req, in cdns3_wa2_gadget_giveback()
548 usb_gadget_map_request_by_dev(priv_dev->sysdev, req, in cdns3_wa2_gadget_giveback()
557 cdns3_start_all_request(priv_dev, priv_ep); in cdns3_wa2_gadget_giveback()
564 static int cdns3_wa2_gadget_ep_queue(struct cdns3_device *priv_dev, in cdns3_wa2_gadget_ep_queue() argument
578 cdns3_select_ep(priv_dev, priv_ep->num | priv_ep->dir); in cdns3_wa2_gadget_ep_queue()
580 reg = readl(&priv_dev->regs->ep_sts_en); in cdns3_wa2_gadget_ep_queue()
583 writel(reg, &priv_dev->regs->ep_sts_en); in cdns3_wa2_gadget_ep_queue()
726 static void cdns3_wa2_reset_tdl(struct cdns3_device *priv_dev) in cdns3_wa2_reset_tdl() argument
728 u16 tdl = EP_CMD_TDL_GET(readl(&priv_dev->regs->ep_cmd)); in cdns3_wa2_reset_tdl()
734 &priv_dev->regs->ep_cmd); in cdns3_wa2_reset_tdl()
738 static void cdns3_wa2_check_outq_status(struct cdns3_device *priv_dev) in cdns3_wa2_check_outq_status() argument
743 cdns3_select_ep(priv_dev, 0); in cdns3_wa2_check_outq_status()
745 ep_sts_reg = readl(&priv_dev->regs->ep_sts); in cdns3_wa2_check_outq_status()
749 struct cdns3_endpoint *outq_ep = priv_dev->eps[outq_ep_num]; in cdns3_wa2_check_outq_status()
762 cdns3_select_ep(priv_dev, outq_ep->num | in cdns3_wa2_check_outq_status()
764 ep_sts_en_reg = readl(&priv_dev->regs->ep_sts_en); in cdns3_wa2_check_outq_status()
765 ep_cmd_reg = readl(&priv_dev->regs->ep_cmd); in cdns3_wa2_check_outq_status()
768 cdns3_set_register_bit(&priv_dev->regs->ep_cfg, in cdns3_wa2_check_outq_status()
771 cdns3_wa2_enable_detection(priv_dev, outq_ep, in cdns3_wa2_check_outq_status()
774 &priv_dev->regs->ep_sts_en); in cdns3_wa2_check_outq_status()
776 cdns3_wa2_reset_tdl(priv_dev); in cdns3_wa2_check_outq_status()
791 &priv_dev->regs->ep_cmd); in cdns3_wa2_check_outq_status()
812 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_gadget_giveback() local
820 usb_gadget_unmap_request_by_dev(priv_dev->sysdev, request, in cdns3_gadget_giveback()
833 if (priv_dev->dev_ver < DEV_VER_V2) { in cdns3_gadget_giveback()
834 request = cdns3_wa2_gadget_giveback(priv_dev, priv_ep, in cdns3_gadget_giveback()
841 spin_unlock(&priv_dev->lock); in cdns3_gadget_giveback()
844 spin_lock(&priv_dev->lock); in cdns3_gadget_giveback()
847 if (request->buf == priv_dev->zlp_buf) in cdns3_gadget_giveback()
871 struct cdns3_device *priv_dev = container_of(work, struct cdns3_device, in cdns3_free_aligned_request_buf() local
876 spin_lock_irqsave(&priv_dev->lock, flags); in cdns3_free_aligned_request_buf()
878 list_for_each_entry_safe(buf, tmp, &priv_dev->aligned_buf_list, list) { in cdns3_free_aligned_request_buf()
887 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_free_aligned_request_buf()
888 dma_free_coherent(priv_dev->sysdev, buf->size, in cdns3_free_aligned_request_buf()
891 spin_lock_irqsave(&priv_dev->lock, flags); in cdns3_free_aligned_request_buf()
895 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_free_aligned_request_buf()
901 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_prepare_aligned_request_buf() local
917 buf->buf = dma_alloc_coherent(priv_dev->sysdev, in cdns3_prepare_aligned_request_buf()
930 &priv_dev->aligned_buf_wq); in cdns3_prepare_aligned_request_buf()
937 &priv_dev->aligned_buf_list); in cdns3_prepare_aligned_request_buf()
954 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_wa1_update_guard() local
959 doorbell = !!(readl(&priv_dev->regs->ep_cmd) & EP_CMD_DRDY); in cdns3_wa1_update_guard()
973 static void cdns3_wa1_tray_restore_cycle_bit(struct cdns3_device *priv_dev, in cdns3_wa1_tray_restore_cycle_bit() argument
979 doorbell = !!(readl(&priv_dev->regs->ep_cmd) & EP_CMD_DRDY); in cdns3_wa1_tray_restore_cycle_bit()
980 dma_index = cdns3_get_dma_pos(priv_dev, priv_ep); in cdns3_wa1_tray_restore_cycle_bit()
989 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_ep_run_stream_transfer() local
1038 if (priv_dev->dev_ver >= DEV_VER_V2) { in cdns3_ep_run_stream_transfer()
1039 if (priv_dev->gadget.speed == USB_SPEED_SUPER) in cdns3_ep_run_stream_transfer()
1056 &priv_dev->regs->ep_traddr); in cdns3_ep_run_stream_transfer()
1061 writel(EP_STS_TRBERR | EP_STS_DESCMIS, &priv_dev->regs->ep_sts); in cdns3_ep_run_stream_transfer()
1070 if (priv_dev->dev_ver < DEV_VER_V2) in cdns3_ep_run_stream_transfer()
1072 &priv_dev->regs->ep_cmd); in cdns3_ep_run_stream_transfer()
1073 else if (priv_dev->dev_ver > DEV_VER_V2) in cdns3_ep_run_stream_transfer()
1074 writel(tdl, &priv_dev->regs->ep_tdl); in cdns3_ep_run_stream_transfer()
1077 writel(EP_CMD_DRDY, &priv_dev->regs->ep_cmd); in cdns3_ep_run_stream_transfer()
1079 EP_CMD_ERDY, &priv_dev->regs->ep_cmd); in cdns3_ep_run_stream_transfer()
1082 readl(&priv_dev->regs->ep_traddr)); in cdns3_ep_run_stream_transfer()
1086 __cdns3_gadget_wakeup(priv_dev); in cdns3_ep_run_stream_transfer()
1093 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_rearm_drdy_if_needed() local
1095 if (priv_dev->dev_ver < DEV_VER_V3) in cdns3_rearm_drdy_if_needed()
1098 if (readl(&priv_dev->regs->ep_sts) & EP_STS_TRBERR) { in cdns3_rearm_drdy_if_needed()
1099 writel(EP_STS_TRBERR, &priv_dev->regs->ep_sts); in cdns3_rearm_drdy_if_needed()
1100 writel(EP_CMD_DRDY, &priv_dev->regs->ep_cmd); in cdns3_rearm_drdy_if_needed()
1114 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_ep_run_transfer() local
1161 doorbell = !!(readl(&priv_dev->regs->ep_cmd) & EP_CMD_DRDY); in cdns3_ep_run_transfer()
1162 dma_index = cdns3_get_dma_pos(priv_dev, priv_ep); in cdns3_ep_run_transfer()
1188 if (priv_dev->dev_ver <= DEV_VER_V2) in cdns3_ep_run_transfer()
1197 if (priv_dev->dev_ver >= DEV_VER_V2) { in cdns3_ep_run_transfer()
1202 if (priv_dev->gadget.speed == USB_SPEED_SUPER) in cdns3_ep_run_transfer()
1274 if (priv_dev->dev_ver < DEV_VER_V2 && in cdns3_ep_run_transfer()
1277 u16 old_tdl = EP_CMD_TDL_GET(readl(&priv_dev->regs->ep_cmd)); in cdns3_ep_run_transfer()
1287 &priv_dev->regs->ep_cmd); in cdns3_ep_run_transfer()
1300 if (priv_dev->dev_ver <= DEV_VER_V2) in cdns3_ep_run_transfer()
1301 cdns3_wa1_tray_restore_cycle_bit(priv_dev, priv_ep); in cdns3_ep_run_transfer()
1339 cdns3_set_register_bit(&priv_dev->regs->ep_cfg, in cdns3_ep_run_transfer()
1345 &priv_dev->regs->ep_traddr); in cdns3_ep_run_transfer()
1353 writel(EP_STS_TRBERR | EP_STS_DESCMIS, &priv_dev->regs->ep_sts); in cdns3_ep_run_transfer()
1354 writel(EP_CMD_DRDY, &priv_dev->regs->ep_cmd); in cdns3_ep_run_transfer()
1357 readl(&priv_dev->regs->ep_traddr)); in cdns3_ep_run_transfer()
1361 __cdns3_gadget_wakeup(priv_dev); in cdns3_ep_run_transfer()
1366 void cdns3_set_hw_configuration(struct cdns3_device *priv_dev) in cdns3_set_hw_configuration() argument
1371 if (priv_dev->hw_configured_flag) in cdns3_set_hw_configuration()
1374 writel(USB_CONF_CFGSET, &priv_dev->regs->usb_conf); in cdns3_set_hw_configuration()
1376 cdns3_set_register_bit(&priv_dev->regs->usb_conf, in cdns3_set_hw_configuration()
1379 priv_dev->hw_configured_flag = 1; in cdns3_set_hw_configuration()
1381 list_for_each_entry(ep, &priv_dev->gadget.ep_list, ep_list) { in cdns3_set_hw_configuration()
1384 cdns3_start_all_request(priv_dev, priv_ep); in cdns3_set_hw_configuration()
1388 cdns3_allow_enable_l1(priv_dev, 1); in cdns3_set_hw_configuration()
1433 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_trb_handled() local
1439 current_index = cdns3_get_dma_pos(priv_dev, priv_ep); in cdns3_trb_handled()
1440 doorbell = !!(readl(&priv_dev->regs->ep_cmd) & EP_CMD_DRDY); in cdns3_trb_handled()
1493 static void cdns3_transfer_completed(struct cdns3_device *priv_dev, in cdns3_transfer_completed() argument
1519 cdns3_select_ep(priv_dev, priv_ep->endpoint.address); in cdns3_transfer_completed()
1556 cdns3_select_ep(priv_dev, priv_ep->endpoint.address); in cdns3_transfer_completed()
1562 dev_warn(priv_dev->dev, in cdns3_transfer_completed()
1584 cdns3_start_all_request(priv_dev, priv_ep); in cdns3_transfer_completed()
1589 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_rearm_transfer() local
1598 writel(EP_CMD_DRDY, &priv_dev->regs->ep_cmd); in cdns3_rearm_transfer()
1600 __cdns3_gadget_wakeup(priv_dev); in cdns3_rearm_transfer()
1603 readl(&priv_dev->regs->ep_traddr)); in cdns3_rearm_transfer()
1610 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_reprogram_tdl() local
1619 writel(EP_CMD_TDL_SET(tdl) | EP_CMD_STDL, &priv_dev->regs->ep_cmd); in cdns3_reprogram_tdl()
1630 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_check_ep_interrupt_proceed() local
1636 cdns3_select_ep(priv_dev, priv_ep->endpoint.address); in cdns3_check_ep_interrupt_proceed()
1638 trace_cdns3_epx_irq(priv_dev, priv_ep); in cdns3_check_ep_interrupt_proceed()
1640 ep_sts_reg = readl(&priv_dev->regs->ep_sts); in cdns3_check_ep_interrupt_proceed()
1641 writel(ep_sts_reg, &priv_dev->regs->ep_sts); in cdns3_check_ep_interrupt_proceed()
1646 tdl = cdns3_get_tdl(priv_dev); in cdns3_check_ep_interrupt_proceed()
1659 &priv_dev->regs->ep_cmd); in cdns3_check_ep_interrupt_proceed()
1668 cdns3_start_all_request(priv_dev, priv_ep); in cdns3_check_ep_interrupt_proceed()
1676 priv_dev->dev_ver < DEV_VER_V2)) { in cdns3_check_ep_interrupt_proceed()
1690 u32 ep_cfg = readl(&priv_dev->regs->ep_cfg); in cdns3_check_ep_interrupt_proceed()
1693 writel(ep_cfg, &priv_dev->regs->ep_cfg); in cdns3_check_ep_interrupt_proceed()
1697 cdns3_transfer_completed(priv_dev, priv_ep); in cdns3_check_ep_interrupt_proceed()
1702 cdns3_start_all_request(priv_dev, priv_ep); in cdns3_check_ep_interrupt_proceed()
1722 cdns3_transfer_completed(priv_dev, priv_ep); in cdns3_check_ep_interrupt_proceed()
1731 cdns3_transfer_completed(priv_dev, priv_ep); in cdns3_check_ep_interrupt_proceed()
1742 cdns3_transfer_completed(priv_dev, priv_ep); in cdns3_check_ep_interrupt_proceed()
1751 if (ep_sts_reg & EP_STS_DESCMIS && priv_dev->dev_ver < DEV_VER_V2 && in cdns3_check_ep_interrupt_proceed()
1758 static void cdns3_disconnect_gadget(struct cdns3_device *priv_dev) in cdns3_disconnect_gadget() argument
1760 if (priv_dev->gadget_driver && priv_dev->gadget_driver->disconnect) in cdns3_disconnect_gadget()
1761 priv_dev->gadget_driver->disconnect(&priv_dev->gadget); in cdns3_disconnect_gadget()
1770 static void cdns3_check_usb_interrupt_proceed(struct cdns3_device *priv_dev, in cdns3_check_usb_interrupt_proceed() argument
1772 __must_hold(&priv_dev->lock) in cdns3_check_usb_interrupt_proceed()
1776 trace_cdns3_usb_irq(priv_dev, usb_ists); in cdns3_check_usb_interrupt_proceed()
1783 if (readl(&priv_dev->regs->drbl)) in cdns3_check_usb_interrupt_proceed()
1784 __cdns3_gadget_wakeup(priv_dev); in cdns3_check_usb_interrupt_proceed()
1789 speed = cdns3_get_speed(priv_dev); in cdns3_check_usb_interrupt_proceed()
1790 priv_dev->gadget.speed = speed; in cdns3_check_usb_interrupt_proceed()
1791 usb_gadget_set_state(&priv_dev->gadget, USB_STATE_POWERED); in cdns3_check_usb_interrupt_proceed()
1792 cdns3_ep0_config(priv_dev); in cdns3_check_usb_interrupt_proceed()
1797 spin_unlock(&priv_dev->lock); in cdns3_check_usb_interrupt_proceed()
1798 cdns3_disconnect_gadget(priv_dev); in cdns3_check_usb_interrupt_proceed()
1799 spin_lock(&priv_dev->lock); in cdns3_check_usb_interrupt_proceed()
1800 priv_dev->gadget.speed = USB_SPEED_UNKNOWN; in cdns3_check_usb_interrupt_proceed()
1801 usb_gadget_set_state(&priv_dev->gadget, USB_STATE_NOTATTACHED); in cdns3_check_usb_interrupt_proceed()
1802 cdns3_hw_reset_eps_config(priv_dev); in cdns3_check_usb_interrupt_proceed()
1806 if (priv_dev->gadget_driver && in cdns3_check_usb_interrupt_proceed()
1807 priv_dev->gadget_driver->suspend) { in cdns3_check_usb_interrupt_proceed()
1808 spin_unlock(&priv_dev->lock); in cdns3_check_usb_interrupt_proceed()
1809 priv_dev->gadget_driver->suspend(&priv_dev->gadget); in cdns3_check_usb_interrupt_proceed()
1810 spin_lock(&priv_dev->lock); in cdns3_check_usb_interrupt_proceed()
1815 if (priv_dev->gadget_driver && in cdns3_check_usb_interrupt_proceed()
1816 priv_dev->gadget_driver->resume) { in cdns3_check_usb_interrupt_proceed()
1817 spin_unlock(&priv_dev->lock); in cdns3_check_usb_interrupt_proceed()
1818 priv_dev->gadget_driver->resume(&priv_dev->gadget); in cdns3_check_usb_interrupt_proceed()
1819 spin_lock(&priv_dev->lock); in cdns3_check_usb_interrupt_proceed()
1825 if (priv_dev->gadget_driver) { in cdns3_check_usb_interrupt_proceed()
1826 spin_unlock(&priv_dev->lock); in cdns3_check_usb_interrupt_proceed()
1827 usb_gadget_udc_reset(&priv_dev->gadget, in cdns3_check_usb_interrupt_proceed()
1828 priv_dev->gadget_driver); in cdns3_check_usb_interrupt_proceed()
1829 spin_lock(&priv_dev->lock); in cdns3_check_usb_interrupt_proceed()
1832 speed = cdns3_get_speed(priv_dev); in cdns3_check_usb_interrupt_proceed()
1833 priv_dev->gadget.speed = speed; in cdns3_check_usb_interrupt_proceed()
1834 cdns3_hw_reset_eps_config(priv_dev); in cdns3_check_usb_interrupt_proceed()
1835 cdns3_ep0_config(priv_dev); in cdns3_check_usb_interrupt_proceed()
1850 struct cdns3_device *priv_dev = data; in cdns3_device_irq_handler() local
1851 struct cdns3 *cdns = dev_get_drvdata(priv_dev->dev); in cdns3_device_irq_handler()
1859 reg = readl(&priv_dev->regs->usb_ists); in cdns3_device_irq_handler()
1868 reg = ~reg & readl(&priv_dev->regs->usb_ien); in cdns3_device_irq_handler()
1870 writel(reg, &priv_dev->regs->usb_ien); in cdns3_device_irq_handler()
1875 reg = readl(&priv_dev->regs->ep_ists); in cdns3_device_irq_handler()
1877 writel(0, &priv_dev->regs->ep_ien); in cdns3_device_irq_handler()
1895 struct cdns3_device *priv_dev = data; in cdns3_device_thread_irq_handler() local
1901 spin_lock_irqsave(&priv_dev->lock, flags); in cdns3_device_thread_irq_handler()
1903 reg = readl(&priv_dev->regs->usb_ists); in cdns3_device_thread_irq_handler()
1905 writel(reg, &priv_dev->regs->usb_ists); in cdns3_device_thread_irq_handler()
1906 writel(USB_IEN_INIT, &priv_dev->regs->usb_ien); in cdns3_device_thread_irq_handler()
1907 cdns3_check_usb_interrupt_proceed(priv_dev, reg); in cdns3_device_thread_irq_handler()
1911 reg = readl(&priv_dev->regs->ep_ists); in cdns3_device_thread_irq_handler()
1915 cdns3_check_ep0_interrupt_proceed(priv_dev, USB_DIR_OUT); in cdns3_device_thread_irq_handler()
1921 cdns3_check_ep0_interrupt_proceed(priv_dev, USB_DIR_IN); in cdns3_device_thread_irq_handler()
1932 cdns3_check_ep_interrupt_proceed(priv_dev->eps[bit]); in cdns3_device_thread_irq_handler()
1936 if (priv_dev->dev_ver < DEV_VER_V2 && priv_dev->using_streams) in cdns3_device_thread_irq_handler()
1937 cdns3_wa2_check_outq_status(priv_dev); in cdns3_device_thread_irq_handler()
1940 writel(~0, &priv_dev->regs->ep_ien); in cdns3_device_thread_irq_handler()
1941 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_device_thread_irq_handler()
1958 static int cdns3_ep_onchip_buffer_reserve(struct cdns3_device *priv_dev, in cdns3_ep_onchip_buffer_reserve() argument
1964 remained = priv_dev->onchip_buffers - priv_dev->onchip_used_size - 2; in cdns3_ep_onchip_buffer_reserve()
1970 priv_dev->onchip_used_size += size; in cdns3_ep_onchip_buffer_reserve()
1978 if (priv_dev->out_mem_is_allocated >= size) in cdns3_ep_onchip_buffer_reserve()
1981 required = size - priv_dev->out_mem_is_allocated; in cdns3_ep_onchip_buffer_reserve()
1986 priv_dev->out_mem_is_allocated += required; in cdns3_ep_onchip_buffer_reserve()
1987 priv_dev->onchip_used_size += required; in cdns3_ep_onchip_buffer_reserve()
1993 static void cdns3_configure_dmult(struct cdns3_device *priv_dev, in cdns3_configure_dmult() argument
1996 struct cdns3_usb_regs __iomem *regs = priv_dev->regs; in cdns3_configure_dmult()
1999 if (priv_dev->dev_ver <= DEV_VER_V2) in cdns3_configure_dmult()
2002 if (priv_dev->dev_ver == DEV_VER_V2) in cdns3_configure_dmult()
2005 if (priv_dev->dev_ver >= DEV_VER_V3 && priv_ep) { in cdns3_configure_dmult()
2035 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_ep_config() local
2046 cdns3_configure_dmult(priv_dev, priv_ep); in cdns3_ep_config()
2052 if (priv_dev->dev_ver >= DEV_VER_V2 && !priv_ep->dir) in cdns3_ep_config()
2058 if (priv_dev->dev_ver >= DEV_VER_V2 && !priv_ep->dir) in cdns3_ep_config()
2067 switch (priv_dev->gadget.speed) { in cdns3_ep_config()
2102 if (!priv_dev->hw_configured_flag) { in cdns3_ep_config()
2103 ret = cdns3_ep_onchip_buffer_reserve(priv_dev, buffering + 1, in cdns3_ep_config()
2106 dev_err(priv_dev->dev, "onchip mem is full, ep is invalid\n"); in cdns3_ep_config()
2114 if (priv_ep->use_streams && priv_dev->gadget.speed >= USB_SPEED_SUPER) { in cdns3_ep_config()
2115 if (priv_dev->dev_ver >= DEV_VER_V3) { in cdns3_ep_config()
2122 cdns3_clear_register_bit(&priv_dev->regs->tdl_from_trb, in cdns3_ep_config()
2135 cdns3_select_ep(priv_dev, bEndpointAddress); in cdns3_ep_config()
2136 writel(ep_cfg, &priv_dev->regs->ep_cfg); in cdns3_ep_config()
2139 dev_dbg(priv_dev->dev, "Configure %s: with val %08x\n", in cdns3_ep_config()
2154 cdns3_endpoint *cdns3_find_available_ep(struct cdns3_device *priv_dev, in cdns3_find_available_ep() argument
2160 list_for_each_entry(ep, &priv_dev->gadget.ep_list, ep_list) { in cdns3_find_available_ep()
2203 struct cdns3_device *priv_dev = gadget_to_cdns3_device(gadget); in cdns3_gadget_match_ep() local
2207 priv_ep = cdns3_find_available_ep(priv_dev, desc); in cdns3_gadget_match_ep()
2209 dev_err(priv_dev->dev, "no available ep\n"); in cdns3_gadget_match_ep()
2213 dev_dbg(priv_dev->dev, "match endpoint: %s\n", priv_ep->name); in cdns3_gadget_match_ep()
2215 spin_lock_irqsave(&priv_dev->lock, flags); in cdns3_gadget_match_ep()
2222 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_gadget_match_ep()
2277 struct cdns3_device *priv_dev; in cdns3_gadget_ep_enable() local
2292 priv_dev = priv_ep->cdns3_dev; in cdns3_gadget_ep_enable()
2296 dev_dbg(priv_dev->dev, "usbss: invalid parameters\n"); in cdns3_gadget_ep_enable()
2301 dev_err(priv_dev->dev, "usbss: missing wMaxPacketSize\n"); in cdns3_gadget_ep_enable()
2305 if (dev_WARN_ONCE(priv_dev->dev, priv_ep->flags & EP_ENABLED, in cdns3_gadget_ep_enable()
2309 spin_lock_irqsave(&priv_dev->lock, flags); in cdns3_gadget_ep_enable()
2317 dev_err(priv_dev->dev, "Driver is limited to %d period\n", in cdns3_gadget_ep_enable()
2325 cdns3_select_ep(priv_dev, bEndpointAddress); in cdns3_gadget_ep_enable()
2343 if (priv_dev->gadget.speed >= USB_SPEED_SUPER) { in cdns3_gadget_ep_enable()
2349 priv_dev->using_streams |= true; in cdns3_gadget_ep_enable()
2363 cdns3_select_ep(priv_dev, bEndpointAddress); in cdns3_gadget_ep_enable()
2367 writel(EP_CMD_EPRST, &priv_dev->regs->ep_cmd); in cdns3_gadget_ep_enable()
2369 ret = readl_poll_timeout_atomic(&priv_dev->regs->ep_cmd, val, in cdns3_gadget_ep_enable()
2380 cdns3_set_register_bit(&priv_dev->regs->ep_ien, in cdns3_gadget_ep_enable()
2383 if (priv_dev->dev_ver < DEV_VER_V2) in cdns3_gadget_ep_enable()
2384 cdns3_wa2_enable_detection(priv_dev, priv_ep, reg); in cdns3_gadget_ep_enable()
2386 writel(reg, &priv_dev->regs->ep_sts_en); in cdns3_gadget_ep_enable()
2395 reg = readl(&priv_dev->regs->ep_sts); in cdns3_gadget_ep_enable()
2401 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_gadget_ep_enable()
2416 struct cdns3_device *priv_dev; in cdns3_gadget_ep_disable() local
2429 priv_dev = priv_ep->cdns3_dev; in cdns3_gadget_ep_disable()
2431 if (dev_WARN_ONCE(priv_dev->dev, !(priv_ep->flags & EP_ENABLED), in cdns3_gadget_ep_disable()
2435 spin_lock_irqsave(&priv_dev->lock, flags); in cdns3_gadget_ep_disable()
2439 cdns3_select_ep(priv_dev, ep->desc->bEndpointAddress); in cdns3_gadget_ep_disable()
2441 ep_cfg = readl(&priv_dev->regs->ep_cfg); in cdns3_gadget_ep_disable()
2443 writel(ep_cfg, &priv_dev->regs->ep_cfg); in cdns3_gadget_ep_disable()
2450 readl_poll_timeout_atomic(&priv_dev->regs->ep_sts, val, in cdns3_gadget_ep_disable()
2452 writel(EP_CMD_EPRST, &priv_dev->regs->ep_cmd); in cdns3_gadget_ep_disable()
2454 readl_poll_timeout_atomic(&priv_dev->regs->ep_cmd, val, in cdns3_gadget_ep_disable()
2458 dev_err(priv_dev->dev, "Timeout: %s resetting failed.\n", in cdns3_gadget_ep_disable()
2491 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_gadget_ep_disable()
2509 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in __cdns3_gadget_ep_queue() local
2518 if (priv_dev->dev_ver < DEV_VER_V2) { in __cdns3_gadget_ep_queue()
2519 ret = cdns3_wa2_gadget_ep_queue(priv_dev, priv_ep, in __cdns3_gadget_ep_queue()
2530 ret = usb_gadget_map_request_by_dev(priv_dev->sysdev, request, in __cdns3_gadget_ep_queue()
2545 if (priv_dev->hw_configured_flag && in __cdns3_gadget_ep_queue()
2548 cdns3_start_all_request(priv_dev, priv_ep); in __cdns3_gadget_ep_queue()
2550 if (priv_dev->hw_configured_flag && priv_ep->prime_flag) in __cdns3_gadget_ep_queue()
2551 cdns3_start_all_request(priv_dev, priv_ep); in __cdns3_gadget_ep_queue()
2562 struct cdns3_device *priv_dev; in cdns3_gadget_ep_queue() local
2570 priv_dev = priv_ep->cdns3_dev; in cdns3_gadget_ep_queue()
2572 spin_lock_irqsave(&priv_dev->lock, flags); in cdns3_gadget_ep_queue()
2581 zlp_request->buf = priv_dev->zlp_buf; in cdns3_gadget_ep_queue()
2587 dev_dbg(priv_dev->dev, "Queuing ZLP for endpoint: %s\n", in cdns3_gadget_ep_queue()
2592 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_gadget_ep_queue()
2607 struct cdns3_device *priv_dev; in cdns3_gadget_ep_dequeue() local
2618 priv_dev = priv_ep->cdns3_dev; in cdns3_gadget_ep_dequeue()
2620 spin_lock_irqsave(&priv_dev->lock, flags); in cdns3_gadget_ep_dequeue()
2626 cdns3_select_ep(priv_dev, ep->desc->bEndpointAddress); in cdns3_gadget_ep_dequeue()
2661 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_gadget_ep_dequeue()
2672 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in __cdns3_gadget_ep_set_halt() local
2677 u32 ep_sts_reg = readl(&priv_dev->regs->ep_sts); in __cdns3_gadget_ep_set_halt()
2693 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in __cdns3_gadget_ep_clear_halt() local
2713 writel(EP_CMD_CSTALL | EP_CMD_EPRST, &priv_dev->regs->ep_cmd); in __cdns3_gadget_ep_clear_halt()
2716 ret = readl_poll_timeout_atomic(&priv_dev->regs->ep_cmd, val, in __cdns3_gadget_ep_clear_halt()
2730 cdns3_start_all_request(priv_dev, priv_ep); in __cdns3_gadget_ep_clear_halt()
2744 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_gadget_ep_set_halt() local
2751 spin_lock_irqsave(&priv_dev->lock, flags); in cdns3_gadget_ep_set_halt()
2753 cdns3_select_ep(priv_dev, ep->desc->bEndpointAddress); in cdns3_gadget_ep_set_halt()
2762 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_gadget_ep_set_halt()
2788 struct cdns3_device *priv_dev = gadget_to_cdns3_device(gadget); in cdns3_gadget_get_frame() local
2790 return readl(&priv_dev->regs->usb_itpn); in cdns3_gadget_get_frame()
2793 int __cdns3_gadget_wakeup(struct cdns3_device *priv_dev) in __cdns3_gadget_wakeup() argument
2797 speed = cdns3_get_speed(priv_dev); in __cdns3_gadget_wakeup()
2803 writel(USB_CONF_LGO_L0, &priv_dev->regs->usb_conf); in __cdns3_gadget_wakeup()
2810 struct cdns3_device *priv_dev = gadget_to_cdns3_device(gadget); in cdns3_gadget_wakeup() local
2814 spin_lock_irqsave(&priv_dev->lock, flags); in cdns3_gadget_wakeup()
2815 ret = __cdns3_gadget_wakeup(priv_dev); in cdns3_gadget_wakeup()
2816 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_gadget_wakeup()
2823 struct cdns3_device *priv_dev = gadget_to_cdns3_device(gadget); in cdns3_gadget_set_selfpowered() local
2826 spin_lock_irqsave(&priv_dev->lock, flags); in cdns3_gadget_set_selfpowered()
2827 priv_dev->is_selfpowered = !!is_selfpowered; in cdns3_gadget_set_selfpowered()
2828 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_gadget_set_selfpowered()
2834 struct cdns3_device *priv_dev = gadget_to_cdns3_device(gadget); in cdns3_gadget_pullup() local
2837 writel(USB_CONF_DEVEN, &priv_dev->regs->usb_conf); in cdns3_gadget_pullup()
2839 writel(~0, &priv_dev->regs->ep_ists); in cdns3_gadget_pullup()
2840 writel(~0, &priv_dev->regs->usb_ists); in cdns3_gadget_pullup()
2841 writel(USB_CONF_DEVDS, &priv_dev->regs->usb_conf); in cdns3_gadget_pullup()
2847 static void cdns3_gadget_config(struct cdns3_device *priv_dev) in cdns3_gadget_config() argument
2849 struct cdns3_usb_regs __iomem *regs = priv_dev->regs; in cdns3_gadget_config()
2852 cdns3_ep0_config(priv_dev); in cdns3_gadget_config()
2861 if (priv_dev->dev_ver == DEV_VER_TI_V1) { in cdns3_gadget_config()
2884 writel(PUSB_PWR_FST_REG_ACCESS, &priv_dev->regs->usb_pwr); in cdns3_gadget_config()
2886 cdns3_configure_dmult(priv_dev, NULL); in cdns3_gadget_config()
2899 struct cdns3_device *priv_dev = gadget_to_cdns3_device(gadget); in cdns3_gadget_udc_start() local
2903 spin_lock_irqsave(&priv_dev->lock, flags); in cdns3_gadget_udc_start()
2904 priv_dev->gadget_driver = driver; in cdns3_gadget_udc_start()
2911 writel(USB_CONF_SFORCE_FS, &priv_dev->regs->usb_conf); in cdns3_gadget_udc_start()
2912 writel(USB_CONF_USB3DIS, &priv_dev->regs->usb_conf); in cdns3_gadget_udc_start()
2915 writel(USB_CONF_USB3DIS, &priv_dev->regs->usb_conf); in cdns3_gadget_udc_start()
2920 dev_err(priv_dev->dev, in cdns3_gadget_udc_start()
2930 cdns3_gadget_config(priv_dev); in cdns3_gadget_udc_start()
2931 spin_unlock_irqrestore(&priv_dev->lock, flags); in cdns3_gadget_udc_start()
2943 struct cdns3_device *priv_dev = gadget_to_cdns3_device(gadget); in cdns3_gadget_udc_stop() local
2949 priv_dev->gadget_driver = NULL; in cdns3_gadget_udc_stop()
2951 priv_dev->onchip_used_size = 0; in cdns3_gadget_udc_stop()
2952 priv_dev->out_mem_is_allocated = 0; in cdns3_gadget_udc_stop()
2953 priv_dev->gadget.speed = USB_SPEED_UNKNOWN; in cdns3_gadget_udc_stop()
2955 list_for_each_entry(ep, &priv_dev->gadget.ep_list, ep_list) { in cdns3_gadget_udc_stop()
2958 cdns3_select_ep(priv_dev, bEndpointAddress); in cdns3_gadget_udc_stop()
2959 writel(EP_CMD_EPRST, &priv_dev->regs->ep_cmd); in cdns3_gadget_udc_stop()
2960 readl_poll_timeout_atomic(&priv_dev->regs->ep_cmd, val, in cdns3_gadget_udc_stop()
2967 writel(0, &priv_dev->regs->usb_ien); in cdns3_gadget_udc_stop()
2968 writel(0, &priv_dev->regs->usb_pwr); in cdns3_gadget_udc_stop()
2969 writel(USB_CONF_DEVDS, &priv_dev->regs->usb_conf); in cdns3_gadget_udc_stop()
2984 static void cdns3_free_all_eps(struct cdns3_device *priv_dev) in cdns3_free_all_eps() argument
2989 priv_dev->eps[16] = NULL; in cdns3_free_all_eps()
2992 if (priv_dev->eps[i]) { in cdns3_free_all_eps()
2993 cdns3_free_trb_pool(priv_dev->eps[i]); in cdns3_free_all_eps()
2994 devm_kfree(priv_dev->dev, priv_dev->eps[i]); in cdns3_free_all_eps()
3004 static int cdns3_init_eps(struct cdns3_device *priv_dev) in cdns3_init_eps() argument
3014 ep_enabled_reg = readl(&priv_dev->regs->usb_cap3); in cdns3_init_eps()
3015 iso_ep_reg = readl(&priv_dev->regs->usb_cap4); in cdns3_init_eps()
3017 dev_dbg(priv_dev->dev, "Initializing non-zero endpoints\n"); in cdns3_init_eps()
3028 priv_dev->eps[i] = priv_dev->eps[0]; in cdns3_init_eps()
3032 priv_ep = devm_kzalloc(priv_dev->dev, sizeof(*priv_ep), in cdns3_init_eps()
3038 priv_ep->cdns3_dev = priv_dev; in cdns3_init_eps()
3039 priv_dev->eps[i] = priv_ep; in cdns3_init_eps()
3044 ret = cdns3_init_ep0(priv_dev, priv_ep); in cdns3_init_eps()
3046 dev_err(priv_dev->dev, "Failed to init ep0\n"); in cdns3_init_eps()
3070 &priv_dev->gadget.ep_list); in cdns3_init_eps()
3075 dev_dbg(priv_dev->dev, "Initialized %s support: %s %s\n", in cdns3_init_eps()
3087 cdns3_free_all_eps(priv_dev); in cdns3_init_eps()
3093 struct cdns3_device *priv_dev = container_of(dev, in cdns3_gadget_release() local
3096 kfree(priv_dev); in cdns3_gadget_release()
3101 struct cdns3_device *priv_dev; in cdns3_gadget_exit() local
3103 priv_dev = cdns->gadget_dev; in cdns3_gadget_exit()
3109 usb_del_gadget(&priv_dev->gadget); in cdns3_gadget_exit()
3110 devm_free_irq(cdns->dev, cdns->dev_irq, priv_dev); in cdns3_gadget_exit()
3112 cdns3_free_all_eps(priv_dev); in cdns3_gadget_exit()
3114 while (!list_empty(&priv_dev->aligned_buf_list)) { in cdns3_gadget_exit()
3117 buf = cdns3_next_align_buf(&priv_dev->aligned_buf_list); in cdns3_gadget_exit()
3118 dma_free_coherent(priv_dev->sysdev, buf->size, in cdns3_gadget_exit()
3126 dma_free_coherent(priv_dev->sysdev, 8, priv_dev->setup_buf, in cdns3_gadget_exit()
3127 priv_dev->setup_dma); in cdns3_gadget_exit()
3129 kfree(priv_dev->zlp_buf); in cdns3_gadget_exit()
3130 usb_put_gadget(&priv_dev->gadget); in cdns3_gadget_exit()
3137 struct cdns3_device *priv_dev; in cdns3_gadget_start() local
3141 priv_dev = kzalloc(sizeof(*priv_dev), GFP_KERNEL); in cdns3_gadget_start()
3142 if (!priv_dev) in cdns3_gadget_start()
3145 usb_initialize_gadget(cdns->dev, &priv_dev->gadget, in cdns3_gadget_start()
3147 cdns->gadget_dev = priv_dev; in cdns3_gadget_start()
3148 priv_dev->sysdev = cdns->dev; in cdns3_gadget_start()
3149 priv_dev->dev = cdns->dev; in cdns3_gadget_start()
3150 priv_dev->regs = cdns->dev_regs; in cdns3_gadget_start()
3152 device_property_read_u16(priv_dev->dev, "cdns,on-chip-buff-size", in cdns3_gadget_start()
3153 &priv_dev->onchip_buffers); in cdns3_gadget_start()
3155 if (priv_dev->onchip_buffers <= 0) { in cdns3_gadget_start()
3156 u32 reg = readl(&priv_dev->regs->usb_cap2); in cdns3_gadget_start()
3158 priv_dev->onchip_buffers = USB_CAP2_ACTUAL_MEM_SIZE(reg); in cdns3_gadget_start()
3161 if (!priv_dev->onchip_buffers) in cdns3_gadget_start()
3162 priv_dev->onchip_buffers = 256; in cdns3_gadget_start()
3183 priv_dev->gadget.max_speed = max_speed; in cdns3_gadget_start()
3184 priv_dev->gadget.speed = USB_SPEED_UNKNOWN; in cdns3_gadget_start()
3185 priv_dev->gadget.ops = &cdns3_gadget_ops; in cdns3_gadget_start()
3186 priv_dev->gadget.name = "usb-ss-gadget"; in cdns3_gadget_start()
3187 priv_dev->gadget.quirk_avoids_skb_reserve = 1; in cdns3_gadget_start()
3188 priv_dev->gadget.irq = cdns->dev_irq; in cdns3_gadget_start()
3190 spin_lock_init(&priv_dev->lock); in cdns3_gadget_start()
3191 INIT_WORK(&priv_dev->pending_status_wq, in cdns3_gadget_start()
3194 INIT_WORK(&priv_dev->aligned_buf_wq, in cdns3_gadget_start()
3198 INIT_LIST_HEAD(&priv_dev->gadget.ep_list); in cdns3_gadget_start()
3199 INIT_LIST_HEAD(&priv_dev->aligned_buf_list); in cdns3_gadget_start()
3201 ret = cdns3_init_eps(priv_dev); in cdns3_gadget_start()
3203 dev_err(priv_dev->dev, "Failed to create endpoints\n"); in cdns3_gadget_start()
3208 priv_dev->setup_buf = dma_alloc_coherent(priv_dev->sysdev, 8, in cdns3_gadget_start()
3209 &priv_dev->setup_dma, GFP_DMA); in cdns3_gadget_start()
3210 if (!priv_dev->setup_buf) { in cdns3_gadget_start()
3215 priv_dev->dev_ver = readl(&priv_dev->regs->usb_cap6); in cdns3_gadget_start()
3217 dev_dbg(priv_dev->dev, "Device Controller version: %08x\n", in cdns3_gadget_start()
3218 readl(&priv_dev->regs->usb_cap6)); in cdns3_gadget_start()
3219 dev_dbg(priv_dev->dev, "USB Capabilities:: %08x\n", in cdns3_gadget_start()
3220 readl(&priv_dev->regs->usb_cap1)); in cdns3_gadget_start()
3221 dev_dbg(priv_dev->dev, "On-Chip memory configuration: %08x\n", in cdns3_gadget_start()
3222 readl(&priv_dev->regs->usb_cap2)); in cdns3_gadget_start()
3224 priv_dev->dev_ver = GET_DEV_BASE_VERSION(priv_dev->dev_ver); in cdns3_gadget_start()
3225 if (priv_dev->dev_ver >= DEV_VER_V2) in cdns3_gadget_start()
3226 priv_dev->gadget.sg_supported = 1; in cdns3_gadget_start()
3228 priv_dev->zlp_buf = kzalloc(CDNS3_EP_ZLP_BUF_SIZE, GFP_KERNEL); in cdns3_gadget_start()
3229 if (!priv_dev->zlp_buf) { in cdns3_gadget_start()
3235 ret = usb_add_gadget(&priv_dev->gadget); in cdns3_gadget_start()
3237 dev_err(priv_dev->dev, "Failed to add gadget\n"); in cdns3_gadget_start()
3243 kfree(priv_dev->zlp_buf); in cdns3_gadget_start()
3245 dma_free_coherent(priv_dev->sysdev, 8, priv_dev->setup_buf, in cdns3_gadget_start()
3246 priv_dev->setup_dma); in cdns3_gadget_start()
3248 cdns3_free_all_eps(priv_dev); in cdns3_gadget_start()
3250 usb_put_gadget(&priv_dev->gadget); in cdns3_gadget_start()
3297 struct cdns3_device *priv_dev = cdns->gadget_dev; in cdns3_gadget_suspend() local
3300 cdns3_disconnect_gadget(priv_dev); in cdns3_gadget_suspend()
3303 priv_dev->gadget.speed = USB_SPEED_UNKNOWN; in cdns3_gadget_suspend()
3304 usb_gadget_set_state(&priv_dev->gadget, USB_STATE_NOTATTACHED); in cdns3_gadget_suspend()
3305 cdns3_hw_reset_eps_config(priv_dev); in cdns3_gadget_suspend()
3308 writel(0, &priv_dev->regs->usb_ien); in cdns3_gadget_suspend()
3315 struct cdns3_device *priv_dev = cdns->gadget_dev; in cdns3_gadget_resume() local
3317 if (!priv_dev->gadget_driver) in cdns3_gadget_resume()
3320 cdns3_gadget_config(priv_dev); in cdns3_gadget_resume()