Lines Matching full:xudc
398 struct tegra_xudc *xudc; member
562 static inline u32 fpci_readl(struct tegra_xudc *xudc, unsigned int offset) in fpci_readl() argument
564 return readl(xudc->fpci + offset); in fpci_readl()
567 static inline void fpci_writel(struct tegra_xudc *xudc, u32 val, in fpci_writel() argument
570 writel(val, xudc->fpci + offset); in fpci_writel()
573 static inline u32 ipfs_readl(struct tegra_xudc *xudc, unsigned int offset) in ipfs_readl() argument
575 return readl(xudc->ipfs + offset); in ipfs_readl()
578 static inline void ipfs_writel(struct tegra_xudc *xudc, u32 val, in ipfs_writel() argument
581 writel(val, xudc->ipfs + offset); in ipfs_writel()
584 static inline u32 xudc_readl(struct tegra_xudc *xudc, unsigned int offset) in xudc_readl() argument
586 return readl(xudc->base + offset); in xudc_readl()
589 static inline void xudc_writel(struct tegra_xudc *xudc, u32 val, in xudc_writel() argument
592 writel(val, xudc->base + offset); in xudc_writel()
595 static inline int xudc_readl_poll(struct tegra_xudc *xudc, in xudc_readl_poll() argument
600 return readl_poll_timeout_atomic(xudc->base + offset, regval, in xudc_readl_poll()
619 static inline void dump_trb(struct tegra_xudc *xudc, const char *type, in dump_trb() argument
622 dev_dbg(xudc->dev, in dump_trb()
628 static void tegra_xudc_limit_port_speed(struct tegra_xudc *xudc) in tegra_xudc_limit_port_speed() argument
633 val = xudc_readl(xudc, SSPX_CORE_CNT56); in tegra_xudc_limit_port_speed()
636 xudc_writel(xudc, val, SSPX_CORE_CNT56); in tegra_xudc_limit_port_speed()
638 val = xudc_readl(xudc, SSPX_CORE_CNT57); in tegra_xudc_limit_port_speed()
641 xudc_writel(xudc, val, SSPX_CORE_CNT57); in tegra_xudc_limit_port_speed()
643 val = xudc_readl(xudc, SSPX_CORE_CNT65); in tegra_xudc_limit_port_speed()
646 xudc_writel(xudc, val, SSPX_CORE_CNT66); in tegra_xudc_limit_port_speed()
648 val = xudc_readl(xudc, SSPX_CORE_CNT66); in tegra_xudc_limit_port_speed()
651 xudc_writel(xudc, val, SSPX_CORE_CNT66); in tegra_xudc_limit_port_speed()
653 val = xudc_readl(xudc, SSPX_CORE_CNT67); in tegra_xudc_limit_port_speed()
656 xudc_writel(xudc, val, SSPX_CORE_CNT67); in tegra_xudc_limit_port_speed()
658 val = xudc_readl(xudc, SSPX_CORE_CNT72); in tegra_xudc_limit_port_speed()
661 xudc_writel(xudc, val, SSPX_CORE_CNT72); in tegra_xudc_limit_port_speed()
664 static void tegra_xudc_restore_port_speed(struct tegra_xudc *xudc) in tegra_xudc_restore_port_speed() argument
669 val = xudc_readl(xudc, SSPX_CORE_CNT56); in tegra_xudc_restore_port_speed()
672 xudc_writel(xudc, val, SSPX_CORE_CNT56); in tegra_xudc_restore_port_speed()
674 val = xudc_readl(xudc, SSPX_CORE_CNT57); in tegra_xudc_restore_port_speed()
677 xudc_writel(xudc, val, SSPX_CORE_CNT57); in tegra_xudc_restore_port_speed()
679 val = xudc_readl(xudc, SSPX_CORE_CNT65); in tegra_xudc_restore_port_speed()
682 xudc_writel(xudc, val, SSPX_CORE_CNT66); in tegra_xudc_restore_port_speed()
684 val = xudc_readl(xudc, SSPX_CORE_CNT66); in tegra_xudc_restore_port_speed()
687 xudc_writel(xudc, val, SSPX_CORE_CNT66); in tegra_xudc_restore_port_speed()
689 val = xudc_readl(xudc, SSPX_CORE_CNT67); in tegra_xudc_restore_port_speed()
692 xudc_writel(xudc, val, SSPX_CORE_CNT67); in tegra_xudc_restore_port_speed()
694 val = xudc_readl(xudc, SSPX_CORE_CNT72); in tegra_xudc_restore_port_speed()
697 xudc_writel(xudc, val, SSPX_CORE_CNT72); in tegra_xudc_restore_port_speed()
700 static void tegra_xudc_device_mode_on(struct tegra_xudc *xudc) in tegra_xudc_device_mode_on() argument
704 pm_runtime_get_sync(xudc->dev); in tegra_xudc_device_mode_on()
706 err = phy_power_on(xudc->curr_utmi_phy); in tegra_xudc_device_mode_on()
708 dev_err(xudc->dev, "UTMI power on failed: %d\n", err); in tegra_xudc_device_mode_on()
710 err = phy_power_on(xudc->curr_usb3_phy); in tegra_xudc_device_mode_on()
712 dev_err(xudc->dev, "USB3 PHY power on failed: %d\n", err); in tegra_xudc_device_mode_on()
714 dev_dbg(xudc->dev, "device mode on\n"); in tegra_xudc_device_mode_on()
716 phy_set_mode_ext(xudc->curr_utmi_phy, PHY_MODE_USB_OTG, in tegra_xudc_device_mode_on()
720 static void tegra_xudc_device_mode_off(struct tegra_xudc *xudc) in tegra_xudc_device_mode_off() argument
726 dev_dbg(xudc->dev, "device mode off\n"); in tegra_xudc_device_mode_off()
728 connected = !!(xudc_readl(xudc, PORTSC) & PORTSC_CCS); in tegra_xudc_device_mode_off()
730 reinit_completion(&xudc->disconnect_complete); in tegra_xudc_device_mode_off()
732 if (xudc->soc->port_speed_quirk) in tegra_xudc_device_mode_off()
733 tegra_xudc_restore_port_speed(xudc); in tegra_xudc_device_mode_off()
735 phy_set_mode_ext(xudc->curr_utmi_phy, PHY_MODE_USB_OTG, USB_ROLE_NONE); in tegra_xudc_device_mode_off()
737 pls = (xudc_readl(xudc, PORTSC) & PORTSC_PLS_MASK) >> in tegra_xudc_device_mode_off()
741 if (xudc->soc->pls_quirk && xudc->gadget.speed == USB_SPEED_SUPER && in tegra_xudc_device_mode_off()
743 val = xudc_readl(xudc, PORTPM); in tegra_xudc_device_mode_off()
745 xudc_writel(xudc, val, PORTPM); in tegra_xudc_device_mode_off()
747 val = xudc_readl(xudc, PORTSC); in tegra_xudc_device_mode_off()
750 xudc_writel(xudc, val, PORTSC); in tegra_xudc_device_mode_off()
755 wait_for_completion(&xudc->disconnect_complete); in tegra_xudc_device_mode_off()
758 synchronize_irq(xudc->irq); in tegra_xudc_device_mode_off()
760 err = phy_power_off(xudc->curr_utmi_phy); in tegra_xudc_device_mode_off()
762 dev_err(xudc->dev, "UTMI PHY power off failed: %d\n", err); in tegra_xudc_device_mode_off()
764 err = phy_power_off(xudc->curr_usb3_phy); in tegra_xudc_device_mode_off()
766 dev_err(xudc->dev, "USB3 PHY power off failed: %d\n", err); in tegra_xudc_device_mode_off()
768 pm_runtime_put(xudc->dev); in tegra_xudc_device_mode_off()
773 struct tegra_xudc *xudc = container_of(work, struct tegra_xudc, in tegra_xudc_usb_role_sw_work() local
776 if (xudc->device_mode) in tegra_xudc_usb_role_sw_work()
777 tegra_xudc_device_mode_on(xudc); in tegra_xudc_usb_role_sw_work()
779 tegra_xudc_device_mode_off(xudc); in tegra_xudc_usb_role_sw_work()
782 static int tegra_xudc_get_phy_index(struct tegra_xudc *xudc, in tegra_xudc_get_phy_index() argument
787 for (i = 0; i < xudc->soc->num_phys; i++) { in tegra_xudc_get_phy_index()
788 if (xudc->usbphy[i] && usbphy == xudc->usbphy[i]) in tegra_xudc_get_phy_index()
792 dev_info(xudc->dev, "phy index could not be found for shared USB PHY"); in tegra_xudc_get_phy_index()
799 struct tegra_xudc *xudc = container_of(nb, struct tegra_xudc, in tegra_xudc_vbus_notify() local
804 dev_dbg(xudc->dev, "%s(): event is %d\n", __func__, usbphy->last_event); in tegra_xudc_vbus_notify()
806 if ((xudc->device_mode && usbphy->last_event == USB_EVENT_VBUS) || in tegra_xudc_vbus_notify()
807 (!xudc->device_mode && usbphy->last_event != USB_EVENT_VBUS)) { in tegra_xudc_vbus_notify()
808 dev_dbg(xudc->dev, "Same role(%d) received. Ignore", in tegra_xudc_vbus_notify()
809 xudc->device_mode); in tegra_xudc_vbus_notify()
813 xudc->device_mode = (usbphy->last_event == USB_EVENT_VBUS) ? true : in tegra_xudc_vbus_notify()
816 phy_index = tegra_xudc_get_phy_index(xudc, usbphy); in tegra_xudc_vbus_notify()
817 dev_dbg(xudc->dev, "%s(): current phy index is %d\n", __func__, in tegra_xudc_vbus_notify()
820 if (!xudc->suspended && phy_index != -1) { in tegra_xudc_vbus_notify()
821 xudc->curr_utmi_phy = xudc->utmi_phy[phy_index]; in tegra_xudc_vbus_notify()
822 xudc->curr_usb3_phy = xudc->usb3_phy[phy_index]; in tegra_xudc_vbus_notify()
823 xudc->curr_usbphy = usbphy; in tegra_xudc_vbus_notify()
824 schedule_work(&xudc->usb_role_sw_work); in tegra_xudc_vbus_notify()
833 struct tegra_xudc *xudc = container_of(dwork, struct tegra_xudc, in tegra_xudc_plc_reset_work() local
837 spin_lock_irqsave(&xudc->lock, flags); in tegra_xudc_plc_reset_work()
839 if (xudc->wait_csc) { in tegra_xudc_plc_reset_work()
840 u32 pls = (xudc_readl(xudc, PORTSC) & PORTSC_PLS_MASK) >> in tegra_xudc_plc_reset_work()
844 dev_info(xudc->dev, "PLS = Inactive. Toggle VBUS\n"); in tegra_xudc_plc_reset_work()
845 phy_set_mode_ext(xudc->curr_utmi_phy, PHY_MODE_USB_OTG, in tegra_xudc_plc_reset_work()
847 phy_set_mode_ext(xudc->curr_utmi_phy, PHY_MODE_USB_OTG, in tegra_xudc_plc_reset_work()
850 xudc->wait_csc = false; in tegra_xudc_plc_reset_work()
854 spin_unlock_irqrestore(&xudc->lock, flags); in tegra_xudc_plc_reset_work()
860 struct tegra_xudc *xudc = in tegra_xudc_port_reset_war_work() local
866 spin_lock_irqsave(&xudc->lock, flags); in tegra_xudc_port_reset_war_work()
868 if (xudc->device_mode && xudc->wait_for_sec_prc) { in tegra_xudc_port_reset_war_work()
869 pls = (xudc_readl(xudc, PORTSC) & PORTSC_PLS_MASK) >> in tegra_xudc_port_reset_war_work()
871 dev_dbg(xudc->dev, "pls = %x\n", pls); in tegra_xudc_port_reset_war_work()
874 dev_dbg(xudc->dev, "toggle vbus\n"); in tegra_xudc_port_reset_war_work()
877 xudc->curr_utmi_phy); in tegra_xudc_port_reset_war_work()
879 xudc->wait_for_sec_prc = 0; in tegra_xudc_port_reset_war_work()
883 spin_unlock_irqrestore(&xudc->lock, flags); in tegra_xudc_port_reset_war_work()
915 static void ep_reload(struct tegra_xudc *xudc, unsigned int ep) in ep_reload() argument
917 xudc_writel(xudc, BIT(ep), EP_RELOAD); in ep_reload()
918 xudc_readl_poll(xudc, EP_RELOAD, BIT(ep), 0); in ep_reload()
921 static void ep_pause(struct tegra_xudc *xudc, unsigned int ep) in ep_pause() argument
925 val = xudc_readl(xudc, EP_PAUSE); in ep_pause()
930 xudc_writel(xudc, val, EP_PAUSE); in ep_pause()
932 xudc_readl_poll(xudc, EP_STCHG, BIT(ep), BIT(ep)); in ep_pause()
934 xudc_writel(xudc, BIT(ep), EP_STCHG); in ep_pause()
937 static void ep_unpause(struct tegra_xudc *xudc, unsigned int ep) in ep_unpause() argument
941 val = xudc_readl(xudc, EP_PAUSE); in ep_unpause()
946 xudc_writel(xudc, val, EP_PAUSE); in ep_unpause()
948 xudc_readl_poll(xudc, EP_STCHG, BIT(ep), BIT(ep)); in ep_unpause()
950 xudc_writel(xudc, BIT(ep), EP_STCHG); in ep_unpause()
953 static void ep_unpause_all(struct tegra_xudc *xudc) in ep_unpause_all() argument
957 val = xudc_readl(xudc, EP_PAUSE); in ep_unpause_all()
959 xudc_writel(xudc, 0, EP_PAUSE); in ep_unpause_all()
961 xudc_readl_poll(xudc, EP_STCHG, val, val); in ep_unpause_all()
963 xudc_writel(xudc, val, EP_STCHG); in ep_unpause_all()
966 static void ep_halt(struct tegra_xudc *xudc, unsigned int ep) in ep_halt() argument
970 val = xudc_readl(xudc, EP_HALT); in ep_halt()
974 xudc_writel(xudc, val, EP_HALT); in ep_halt()
976 xudc_readl_poll(xudc, EP_STCHG, BIT(ep), BIT(ep)); in ep_halt()
978 xudc_writel(xudc, BIT(ep), EP_STCHG); in ep_halt()
981 static void ep_unhalt(struct tegra_xudc *xudc, unsigned int ep) in ep_unhalt() argument
985 val = xudc_readl(xudc, EP_HALT); in ep_unhalt()
989 xudc_writel(xudc, val, EP_HALT); in ep_unhalt()
991 xudc_readl_poll(xudc, EP_STCHG, BIT(ep), BIT(ep)); in ep_unhalt()
993 xudc_writel(xudc, BIT(ep), EP_STCHG); in ep_unhalt()
996 static void ep_unhalt_all(struct tegra_xudc *xudc) in ep_unhalt_all() argument
1000 val = xudc_readl(xudc, EP_HALT); in ep_unhalt_all()
1003 xudc_writel(xudc, 0, EP_HALT); in ep_unhalt_all()
1005 xudc_readl_poll(xudc, EP_STCHG, val, val); in ep_unhalt_all()
1007 xudc_writel(xudc, val, EP_STCHG); in ep_unhalt_all()
1010 static void ep_wait_for_stopped(struct tegra_xudc *xudc, unsigned int ep) in ep_wait_for_stopped() argument
1012 xudc_readl_poll(xudc, EP_STOPPED, BIT(ep), BIT(ep)); in ep_wait_for_stopped()
1013 xudc_writel(xudc, BIT(ep), EP_STOPPED); in ep_wait_for_stopped()
1016 static void ep_wait_for_inactive(struct tegra_xudc *xudc, unsigned int ep) in ep_wait_for_inactive() argument
1018 xudc_readl_poll(xudc, EP_THREAD_ACTIVE, BIT(ep), 0); in ep_wait_for_inactive()
1024 struct tegra_xudc *xudc = ep->xudc; in tegra_xudc_req_done() local
1026 dev_dbg(xudc->dev, "completing request %p on EP %u with status %d\n", in tegra_xudc_req_done()
1035 usb_gadget_unmap_request(&xudc->gadget, &req->usb_req, in tegra_xudc_req_done()
1036 (xudc->setup_state == in tegra_xudc_req_done()
1039 usb_gadget_unmap_request(&xudc->gadget, &req->usb_req, in tegra_xudc_req_done()
1043 spin_unlock(&xudc->lock); in tegra_xudc_req_done()
1045 spin_lock(&xudc->lock); in tegra_xudc_req_done()
1075 struct tegra_xudc *xudc = ep->xudc; in tegra_xudc_queue_one_trb() local
1101 (xudc->setup_state == DATA_STAGE_RECV))) in tegra_xudc_queue_one_trb()
1107 if (xudc->setup_state == DATA_STAGE_XFER || in tegra_xudc_queue_one_trb()
1108 xudc->setup_state == DATA_STAGE_RECV) in tegra_xudc_queue_one_trb()
1113 if (xudc->setup_state == DATA_STAGE_XFER || in tegra_xudc_queue_one_trb()
1114 xudc->setup_state == STATUS_STAGE_XFER) in tegra_xudc_queue_one_trb()
1136 dump_trb(xudc, "TRANSFER", trb); in tegra_xudc_queue_one_trb()
1202 struct tegra_xudc *xudc = ep->xudc; in tegra_xudc_ep_ring_doorbell() local
1210 val |= DB_STREAMID(xudc->setup_seq_num); in tegra_xudc_ep_ring_doorbell()
1223 dev_dbg(xudc->dev, "ring doorbell: %#x\n", val); in tegra_xudc_ep_ring_doorbell()
1224 xudc_writel(xudc, val, DB); in tegra_xudc_ep_ring_doorbell()
1247 struct tegra_xudc *xudc = ep->xudc; in __tegra_xudc_ep_queue() local
1251 dev_err(xudc->dev, "control EP has pending transfers\n"); in __tegra_xudc_ep_queue()
1256 err = usb_gadget_map_request(&xudc->gadget, &req->usb_req, in __tegra_xudc_ep_queue()
1257 (xudc->setup_state == in __tegra_xudc_ep_queue()
1260 err = usb_gadget_map_request(&xudc->gadget, &req->usb_req, in __tegra_xudc_ep_queue()
1265 dev_err(xudc->dev, "failed to map request: %d\n", err); in __tegra_xudc_ep_queue()
1302 struct tegra_xudc *xudc; in tegra_xudc_ep_queue() local
1311 xudc = ep->xudc; in tegra_xudc_ep_queue()
1313 spin_lock_irqsave(&xudc->lock, flags); in tegra_xudc_ep_queue()
1314 if (xudc->powergated || !ep->desc) { in tegra_xudc_ep_queue()
1321 spin_unlock_irqrestore(&xudc->lock, flags); in tegra_xudc_ep_queue()
1374 dev_dbg(ep->xudc->dev, "%s: request %p -> %p; trb %p\n", __func__, in trb_in_request()
1398 dev_dbg(ep->xudc->dev, "%s: request %p -> %p; enq ptr: %p; trb %p\n", in trb_before_request()
1415 struct tegra_xudc *xudc = ep->xudc; in __tegra_xudc_ep_dequeue() local
1438 ep_pause(xudc, ep->index); in __tegra_xudc_ep_dequeue()
1439 ep_wait_for_inactive(xudc, ep->index); in __tegra_xudc_ep_dequeue()
1472 if (dma_mapping_error(xudc->dev, deq_ptr)) { in __tegra_xudc_ep_dequeue()
1477 ep_reload(xudc, ep->index); in __tegra_xudc_ep_dequeue()
1496 ep_unpause(xudc, ep->index); in __tegra_xudc_ep_dequeue()
1509 struct tegra_xudc *xudc; in tegra_xudc_ep_dequeue() local
1518 xudc = ep->xudc; in tegra_xudc_ep_dequeue()
1520 spin_lock_irqsave(&xudc->lock, flags); in tegra_xudc_ep_dequeue()
1522 if (xudc->powergated || !ep->desc) { in tegra_xudc_ep_dequeue()
1529 spin_unlock_irqrestore(&xudc->lock, flags); in tegra_xudc_ep_dequeue()
1536 struct tegra_xudc *xudc = ep->xudc; in __tegra_xudc_ep_set_halt() local
1542 dev_err(xudc->dev, "can't halt isochronous EP\n"); in __tegra_xudc_ep_set_halt()
1546 if (!!(xudc_readl(xudc, EP_HALT) & BIT(ep->index)) == halt) { in __tegra_xudc_ep_set_halt()
1547 dev_dbg(xudc->dev, "EP %u already %s\n", ep->index, in __tegra_xudc_ep_set_halt()
1553 ep_halt(xudc, ep->index); in __tegra_xudc_ep_set_halt()
1557 ep_reload(xudc, ep->index); in __tegra_xudc_ep_set_halt()
1562 ep_reload(xudc, ep->index); in __tegra_xudc_ep_set_halt()
1563 ep_unpause(xudc, ep->index); in __tegra_xudc_ep_set_halt()
1564 ep_unhalt(xudc, ep->index); in __tegra_xudc_ep_set_halt()
1575 struct tegra_xudc *xudc; in tegra_xudc_ep_set_halt() local
1583 xudc = ep->xudc; in tegra_xudc_ep_set_halt()
1585 spin_lock_irqsave(&xudc->lock, flags); in tegra_xudc_ep_set_halt()
1586 if (xudc->powergated) { in tegra_xudc_ep_set_halt()
1593 dev_err(xudc->dev, "can't halt EP with requests pending\n"); in tegra_xudc_ep_set_halt()
1600 spin_unlock_irqrestore(&xudc->lock, flags); in tegra_xudc_ep_set_halt()
1609 struct tegra_xudc *xudc = ep->xudc; in tegra_xudc_ep_context_setup() local
1614 if (xudc->gadget.speed == USB_SPEED_SUPER) { in tegra_xudc_ep_context_setup()
1620 } else if ((xudc->gadget.speed < USB_SPEED_SUPER) && in tegra_xudc_ep_context_setup()
1623 if (xudc->gadget.speed == USB_SPEED_HIGH) { in tegra_xudc_ep_context_setup()
1626 dev_warn(xudc->dev, in tegra_xudc_ep_context_setup()
1638 if (xudc->gadget.speed == USB_SPEED_SUPER) { in tegra_xudc_ep_context_setup()
1696 struct tegra_xudc *xudc = ep->xudc; in __tegra_xudc_ep_disable() local
1699 dev_err(xudc->dev, "endpoint %u already disabled\n", in __tegra_xudc_ep_disable()
1706 ep_reload(xudc, ep->index); in __tegra_xudc_ep_disable()
1710 xudc->nr_enabled_eps--; in __tegra_xudc_ep_disable()
1712 xudc->nr_isoch_eps--; in __tegra_xudc_ep_disable()
1719 ep_unpause(xudc, ep->index); in __tegra_xudc_ep_disable()
1720 ep_unhalt(xudc, ep->index); in __tegra_xudc_ep_disable()
1721 if (xudc_readl(xudc, EP_STOPPED) & BIT(ep->index)) in __tegra_xudc_ep_disable()
1722 xudc_writel(xudc, BIT(ep->index), EP_STOPPED); in __tegra_xudc_ep_disable()
1728 if ((xudc->device_state == USB_STATE_CONFIGURED) && in __tegra_xudc_ep_disable()
1729 (xudc->nr_enabled_eps == 1)) { in __tegra_xudc_ep_disable()
1732 xudc->device_state = USB_STATE_ADDRESS; in __tegra_xudc_ep_disable()
1733 usb_gadget_set_state(&xudc->gadget, xudc->device_state); in __tegra_xudc_ep_disable()
1735 val = xudc_readl(xudc, CTRL); in __tegra_xudc_ep_disable()
1737 xudc_writel(xudc, val, CTRL); in __tegra_xudc_ep_disable()
1740 dev_info(xudc->dev, "ep %u disabled\n", ep->index); in __tegra_xudc_ep_disable()
1748 struct tegra_xudc *xudc; in tegra_xudc_ep_disable() local
1756 xudc = ep->xudc; in tegra_xudc_ep_disable()
1758 spin_lock_irqsave(&xudc->lock, flags); in tegra_xudc_ep_disable()
1759 if (xudc->powergated) { in tegra_xudc_ep_disable()
1766 spin_unlock_irqrestore(&xudc->lock, flags); in tegra_xudc_ep_disable()
1774 struct tegra_xudc *xudc = ep->xudc; in __tegra_xudc_ep_enable() local
1778 if (xudc->gadget.speed == USB_SPEED_SUPER && in __tegra_xudc_ep_enable()
1790 if (xudc->nr_isoch_eps > XUDC_MAX_ISOCH_EPS) { in __tegra_xudc_ep_enable()
1791 dev_err(xudc->dev, "too many isochronous endpoints\n"); in __tegra_xudc_ep_enable()
1794 xudc->nr_isoch_eps++; in __tegra_xudc_ep_enable()
1805 xudc->nr_enabled_eps++; in __tegra_xudc_ep_enable()
1820 if (xudc->device_state == USB_STATE_ADDRESS) { in __tegra_xudc_ep_enable()
1821 val = xudc_readl(xudc, CTRL); in __tegra_xudc_ep_enable()
1823 xudc_writel(xudc, val, CTRL); in __tegra_xudc_ep_enable()
1825 xudc->device_state = USB_STATE_CONFIGURED; in __tegra_xudc_ep_enable()
1826 usb_gadget_set_state(&xudc->gadget, xudc->device_state); in __tegra_xudc_ep_enable()
1834 for (i = 0; i < ARRAY_SIZE(xudc->ep); i++) { in __tegra_xudc_ep_enable()
1835 if (xudc->ep[i].desc && in __tegra_xudc_ep_enable()
1836 usb_endpoint_xfer_bulk(xudc->ep[i].desc)) in __tegra_xudc_ep_enable()
1837 ep_pause(xudc, i); in __tegra_xudc_ep_enable()
1841 ep_reload(xudc, ep->index); in __tegra_xudc_ep_enable()
1842 ep_unpause(xudc, ep->index); in __tegra_xudc_ep_enable()
1843 ep_unhalt(xudc, ep->index); in __tegra_xudc_ep_enable()
1846 for (i = 0; i < ARRAY_SIZE(xudc->ep); i++) { in __tegra_xudc_ep_enable()
1847 if (xudc->ep[i].desc && in __tegra_xudc_ep_enable()
1848 usb_endpoint_xfer_bulk(xudc->ep[i].desc)) in __tegra_xudc_ep_enable()
1849 ep_unpause(xudc, i); in __tegra_xudc_ep_enable()
1854 dev_info(xudc->dev, "EP %u (type: %s, dir: %s) enabled\n", ep->index, in __tegra_xudc_ep_enable()
1865 struct tegra_xudc *xudc; in tegra_xudc_ep_enable() local
1873 xudc = ep->xudc; in tegra_xudc_ep_enable()
1875 spin_lock_irqsave(&xudc->lock, flags); in tegra_xudc_ep_enable()
1876 if (xudc->powergated) { in tegra_xudc_ep_enable()
1883 spin_unlock_irqrestore(&xudc->lock, flags); in tegra_xudc_ep_enable()
1943 struct tegra_xudc *xudc = to_xudc(gadget); in tegra_xudc_gadget_get_frame() local
1947 spin_lock_irqsave(&xudc->lock, flags); in tegra_xudc_gadget_get_frame()
1948 if (xudc->powergated) { in tegra_xudc_gadget_get_frame()
1953 ret = (xudc_readl(xudc, MFINDEX) & MFINDEX_FRAME_MASK) >> in tegra_xudc_gadget_get_frame()
1956 spin_unlock_irqrestore(&xudc->lock, flags); in tegra_xudc_gadget_get_frame()
1961 static void tegra_xudc_resume_device_state(struct tegra_xudc *xudc) in tegra_xudc_resume_device_state() argument
1966 ep_unpause_all(xudc); in tegra_xudc_resume_device_state()
1969 val = xudc_readl(xudc, PORTSC); in tegra_xudc_resume_device_state()
1973 xudc_writel(xudc, val, PORTSC); in tegra_xudc_resume_device_state()
1976 if (xudc->device_state == USB_STATE_SUSPENDED) { in tegra_xudc_resume_device_state()
1977 xudc->device_state = xudc->resume_state; in tegra_xudc_resume_device_state()
1978 usb_gadget_set_state(&xudc->gadget, xudc->device_state); in tegra_xudc_resume_device_state()
1979 xudc->resume_state = 0; in tegra_xudc_resume_device_state()
1987 for (i = 0; i < ARRAY_SIZE(xudc->ep); i++) in tegra_xudc_resume_device_state()
1988 tegra_xudc_ep_ring_doorbell(&xudc->ep[i]); in tegra_xudc_resume_device_state()
1993 struct tegra_xudc *xudc = to_xudc(gadget); in tegra_xudc_gadget_wakeup() local
1998 spin_lock_irqsave(&xudc->lock, flags); in tegra_xudc_gadget_wakeup()
2000 if (xudc->powergated) { in tegra_xudc_gadget_wakeup()
2004 val = xudc_readl(xudc, PORTPM); in tegra_xudc_gadget_wakeup()
2005 dev_dbg(xudc->dev, "%s: PORTPM=%#x, speed=%x\n", __func__, in tegra_xudc_gadget_wakeup()
2008 if (((xudc->gadget.speed <= USB_SPEED_HIGH) && in tegra_xudc_gadget_wakeup()
2010 ((xudc->gadget.speed == USB_SPEED_SUPER) && in tegra_xudc_gadget_wakeup()
2012 tegra_xudc_resume_device_state(xudc); in tegra_xudc_gadget_wakeup()
2015 if (xudc->gadget.speed == USB_SPEED_SUPER) { in tegra_xudc_gadget_wakeup()
2018 xudc_writel(xudc, 0, DEVNOTIF_HI); in tegra_xudc_gadget_wakeup()
2019 xudc_writel(xudc, val, DEVNOTIF_LO); in tegra_xudc_gadget_wakeup()
2024 dev_dbg(xudc->dev, "%s: ret value is %d", __func__, ret); in tegra_xudc_gadget_wakeup()
2025 spin_unlock_irqrestore(&xudc->lock, flags); in tegra_xudc_gadget_wakeup()
2032 struct tegra_xudc *xudc = to_xudc(gadget); in tegra_xudc_gadget_pullup() local
2036 pm_runtime_get_sync(xudc->dev); in tegra_xudc_gadget_pullup()
2038 spin_lock_irqsave(&xudc->lock, flags); in tegra_xudc_gadget_pullup()
2040 if (is_on != xudc->pullup) { in tegra_xudc_gadget_pullup()
2041 val = xudc_readl(xudc, CTRL); in tegra_xudc_gadget_pullup()
2046 xudc_writel(xudc, val, CTRL); in tegra_xudc_gadget_pullup()
2049 xudc->pullup = is_on; in tegra_xudc_gadget_pullup()
2050 dev_dbg(xudc->dev, "%s: pullup:%d", __func__, is_on); in tegra_xudc_gadget_pullup()
2052 spin_unlock_irqrestore(&xudc->lock, flags); in tegra_xudc_gadget_pullup()
2054 pm_runtime_put(xudc->dev); in tegra_xudc_gadget_pullup()
2062 struct tegra_xudc *xudc = to_xudc(gadget); in tegra_xudc_gadget_start() local
2071 pm_runtime_get_sync(xudc->dev); in tegra_xudc_gadget_start()
2073 spin_lock_irqsave(&xudc->lock, flags); in tegra_xudc_gadget_start()
2075 if (xudc->driver) { in tegra_xudc_gadget_start()
2080 xudc->setup_state = WAIT_FOR_SETUP; in tegra_xudc_gadget_start()
2081 xudc->device_state = USB_STATE_DEFAULT; in tegra_xudc_gadget_start()
2082 usb_gadget_set_state(&xudc->gadget, xudc->device_state); in tegra_xudc_gadget_start()
2084 ret = __tegra_xudc_ep_enable(&xudc->ep[0], &tegra_xudc_ep0_desc); in tegra_xudc_gadget_start()
2088 val = xudc_readl(xudc, CTRL); in tegra_xudc_gadget_start()
2090 xudc_writel(xudc, val, CTRL); in tegra_xudc_gadget_start()
2092 val = xudc_readl(xudc, PORTHALT); in tegra_xudc_gadget_start()
2094 xudc_writel(xudc, val, PORTHALT); in tegra_xudc_gadget_start()
2096 if (xudc->pullup) { in tegra_xudc_gadget_start()
2097 val = xudc_readl(xudc, CTRL); in tegra_xudc_gadget_start()
2099 xudc_writel(xudc, val, CTRL); in tegra_xudc_gadget_start()
2102 for (i = 0; i < xudc->soc->num_phys; i++) in tegra_xudc_gadget_start()
2103 if (xudc->usbphy[i]) in tegra_xudc_gadget_start()
2104 otg_set_peripheral(xudc->usbphy[i]->otg, gadget); in tegra_xudc_gadget_start()
2106 xudc->driver = driver; in tegra_xudc_gadget_start()
2108 dev_dbg(xudc->dev, "%s: ret value is %d", __func__, ret); in tegra_xudc_gadget_start()
2109 spin_unlock_irqrestore(&xudc->lock, flags); in tegra_xudc_gadget_start()
2111 pm_runtime_put(xudc->dev); in tegra_xudc_gadget_start()
2118 struct tegra_xudc *xudc = to_xudc(gadget); in tegra_xudc_gadget_stop() local
2123 pm_runtime_get_sync(xudc->dev); in tegra_xudc_gadget_stop()
2125 spin_lock_irqsave(&xudc->lock, flags); in tegra_xudc_gadget_stop()
2127 for (i = 0; i < xudc->soc->num_phys; i++) in tegra_xudc_gadget_stop()
2128 if (xudc->usbphy[i]) in tegra_xudc_gadget_stop()
2129 otg_set_peripheral(xudc->usbphy[i]->otg, NULL); in tegra_xudc_gadget_stop()
2131 val = xudc_readl(xudc, CTRL); in tegra_xudc_gadget_stop()
2133 xudc_writel(xudc, val, CTRL); in tegra_xudc_gadget_stop()
2135 __tegra_xudc_ep_disable(&xudc->ep[0]); in tegra_xudc_gadget_stop()
2137 xudc->driver = NULL; in tegra_xudc_gadget_stop()
2138 dev_dbg(xudc->dev, "Gadget stopped"); in tegra_xudc_gadget_stop()
2140 spin_unlock_irqrestore(&xudc->lock, flags); in tegra_xudc_gadget_stop()
2142 pm_runtime_put(xudc->dev); in tegra_xudc_gadget_stop()
2151 struct tegra_xudc *xudc = to_xudc(gadget); in tegra_xudc_gadget_vbus_draw() local
2153 dev_dbg(xudc->dev, "%s: %u mA\n", __func__, m_a); in tegra_xudc_gadget_vbus_draw()
2155 if (xudc->curr_usbphy->chg_type == SDP_TYPE) in tegra_xudc_gadget_vbus_draw()
2156 ret = usb_phy_set_power(xudc->curr_usbphy, m_a); in tegra_xudc_gadget_vbus_draw()
2163 struct tegra_xudc *xudc = to_xudc(gadget); in tegra_xudc_set_selfpowered() local
2165 dev_dbg(xudc->dev, "%s: %d\n", __func__, is_on); in tegra_xudc_set_selfpowered()
2166 xudc->selfpowered = !!is_on; in tegra_xudc_set_selfpowered()
2186 tegra_xudc_ep0_queue_status(struct tegra_xudc *xudc, in tegra_xudc_ep0_queue_status() argument
2189 xudc->ep0_req->usb_req.buf = NULL; in tegra_xudc_ep0_queue_status()
2190 xudc->ep0_req->usb_req.dma = 0; in tegra_xudc_ep0_queue_status()
2191 xudc->ep0_req->usb_req.length = 0; in tegra_xudc_ep0_queue_status()
2192 xudc->ep0_req->usb_req.complete = cmpl; in tegra_xudc_ep0_queue_status()
2193 xudc->ep0_req->usb_req.context = xudc; in tegra_xudc_ep0_queue_status()
2195 return __tegra_xudc_ep_queue(&xudc->ep[0], xudc->ep0_req); in tegra_xudc_ep0_queue_status()
2199 tegra_xudc_ep0_queue_data(struct tegra_xudc *xudc, void *buf, size_t len, in tegra_xudc_ep0_queue_data() argument
2202 xudc->ep0_req->usb_req.buf = buf; in tegra_xudc_ep0_queue_data()
2203 xudc->ep0_req->usb_req.length = len; in tegra_xudc_ep0_queue_data()
2204 xudc->ep0_req->usb_req.complete = cmpl; in tegra_xudc_ep0_queue_data()
2205 xudc->ep0_req->usb_req.context = xudc; in tegra_xudc_ep0_queue_data()
2207 return __tegra_xudc_ep_queue(&xudc->ep[0], xudc->ep0_req); in tegra_xudc_ep0_queue_data()
2210 static void tegra_xudc_ep0_req_done(struct tegra_xudc *xudc) in tegra_xudc_ep0_req_done() argument
2212 switch (xudc->setup_state) { in tegra_xudc_ep0_req_done()
2214 xudc->setup_state = STATUS_STAGE_RECV; in tegra_xudc_ep0_req_done()
2215 tegra_xudc_ep0_queue_status(xudc, no_op_complete); in tegra_xudc_ep0_req_done()
2218 xudc->setup_state = STATUS_STAGE_XFER; in tegra_xudc_ep0_req_done()
2219 tegra_xudc_ep0_queue_status(xudc, no_op_complete); in tegra_xudc_ep0_req_done()
2222 xudc->setup_state = WAIT_FOR_SETUP; in tegra_xudc_ep0_req_done()
2227 static int tegra_xudc_ep0_delegate_req(struct tegra_xudc *xudc, in tegra_xudc_ep0_delegate_req() argument
2232 spin_unlock(&xudc->lock); in tegra_xudc_ep0_delegate_req()
2233 ret = xudc->driver->setup(&xudc->gadget, ctrl); in tegra_xudc_ep0_delegate_req()
2234 spin_lock(&xudc->lock); in tegra_xudc_ep0_delegate_req()
2241 struct tegra_xudc *xudc = req->context; in set_feature_complete() local
2243 if (xudc->test_mode_pattern) { in set_feature_complete()
2244 xudc_writel(xudc, xudc->test_mode_pattern, PORT_TM); in set_feature_complete()
2245 xudc->test_mode_pattern = 0; in set_feature_complete()
2249 static int tegra_xudc_ep0_set_feature(struct tegra_xudc *xudc, in tegra_xudc_ep0_set_feature() argument
2265 if ((xudc->gadget.speed == USB_SPEED_SUPER) || in tegra_xudc_ep0_set_feature()
2266 (xudc->device_state == USB_STATE_DEFAULT)) in tegra_xudc_ep0_set_feature()
2269 val = xudc_readl(xudc, PORTPM); in tegra_xudc_ep0_set_feature()
2275 xudc_writel(xudc, val, PORTPM); in tegra_xudc_ep0_set_feature()
2279 if ((xudc->device_state != USB_STATE_CONFIGURED) || in tegra_xudc_ep0_set_feature()
2280 (xudc->gadget.speed != USB_SPEED_SUPER)) in tegra_xudc_ep0_set_feature()
2283 val = xudc_readl(xudc, PORTPM); in tegra_xudc_ep0_set_feature()
2285 xudc->soc->u1_enable) { in tegra_xudc_ep0_set_feature()
2293 xudc->soc->u2_enable) { in tegra_xudc_ep0_set_feature()
2300 xudc_writel(xudc, val, PORTPM); in tegra_xudc_ep0_set_feature()
2303 if (xudc->gadget.speed != USB_SPEED_HIGH) in tegra_xudc_ep0_set_feature()
2309 xudc->test_mode_pattern = index >> 8; in tegra_xudc_ep0_set_feature()
2317 if (xudc->device_state != USB_STATE_CONFIGURED) in tegra_xudc_ep0_set_feature()
2323 val = xudc_readl(xudc, PORTPM); in tegra_xudc_ep0_set_feature()
2330 xudc_writel(xudc, val, PORTPM); in tegra_xudc_ep0_set_feature()
2333 return tegra_xudc_ep0_delegate_req(xudc, ctrl); in tegra_xudc_ep0_set_feature()
2343 if ((xudc->device_state == USB_STATE_DEFAULT) || in tegra_xudc_ep0_set_feature()
2344 ((xudc->device_state == USB_STATE_ADDRESS) && in tegra_xudc_ep0_set_feature()
2348 ret = __tegra_xudc_ep_set_halt(&xudc->ep[ep], set); in tegra_xudc_ep0_set_feature()
2356 return tegra_xudc_ep0_queue_status(xudc, set_feature_complete); in tegra_xudc_ep0_set_feature()
2359 static int tegra_xudc_ep0_get_status(struct tegra_xudc *xudc, in tegra_xudc_ep0_get_status() argument
2375 val = xudc_readl(xudc, PORTPM); in tegra_xudc_ep0_get_status()
2377 if (xudc->selfpowered) in tegra_xudc_ep0_get_status()
2380 if ((xudc->gadget.speed < USB_SPEED_SUPER) && in tegra_xudc_ep0_get_status()
2384 if (xudc->gadget.speed == USB_SPEED_SUPER) { in tegra_xudc_ep0_get_status()
2392 if (xudc->gadget.speed == USB_SPEED_SUPER) { in tegra_xudc_ep0_get_status()
2394 val = xudc_readl(xudc, PORTPM); in tegra_xudc_ep0_get_status()
2402 ep_ctx = &xudc->ep_context[ep]; in tegra_xudc_ep0_get_status()
2404 if ((xudc->device_state != USB_STATE_CONFIGURED) && in tegra_xudc_ep0_get_status()
2405 ((xudc->device_state != USB_STATE_ADDRESS) || (ep != 0))) in tegra_xudc_ep0_get_status()
2411 if (xudc_readl(xudc, EP_HALT) & BIT(ep)) in tegra_xudc_ep0_get_status()
2418 xudc->status_buf = cpu_to_le16(status); in tegra_xudc_ep0_get_status()
2419 return tegra_xudc_ep0_queue_data(xudc, &xudc->status_buf, in tegra_xudc_ep0_get_status()
2420 sizeof(xudc->status_buf), in tegra_xudc_ep0_get_status()
2429 static int tegra_xudc_ep0_set_sel(struct tegra_xudc *xudc, in tegra_xudc_ep0_set_sel() argument
2436 if (xudc->device_state == USB_STATE_DEFAULT) in tegra_xudc_ep0_set_sel()
2444 return tegra_xudc_ep0_queue_data(xudc, &xudc->sel_timing, in tegra_xudc_ep0_set_sel()
2445 sizeof(xudc->sel_timing), in tegra_xudc_ep0_set_sel()
2454 static int tegra_xudc_ep0_set_isoch_delay(struct tegra_xudc *xudc, in tegra_xudc_ep0_set_isoch_delay() argument
2467 xudc->isoch_delay = delay; in tegra_xudc_ep0_set_isoch_delay()
2469 return tegra_xudc_ep0_queue_status(xudc, set_isoch_delay_complete); in tegra_xudc_ep0_set_isoch_delay()
2474 struct tegra_xudc *xudc = req->context; in set_address_complete() local
2476 if ((xudc->device_state == USB_STATE_DEFAULT) && in set_address_complete()
2477 (xudc->dev_addr != 0)) { in set_address_complete()
2478 xudc->device_state = USB_STATE_ADDRESS; in set_address_complete()
2479 usb_gadget_set_state(&xudc->gadget, xudc->device_state); in set_address_complete()
2480 } else if ((xudc->device_state == USB_STATE_ADDRESS) && in set_address_complete()
2481 (xudc->dev_addr == 0)) { in set_address_complete()
2482 xudc->device_state = USB_STATE_DEFAULT; in set_address_complete()
2483 usb_gadget_set_state(&xudc->gadget, xudc->device_state); in set_address_complete()
2487 static int tegra_xudc_ep0_set_address(struct tegra_xudc *xudc, in tegra_xudc_ep0_set_address() argument
2490 struct tegra_xudc_ep *ep0 = &xudc->ep[0]; in tegra_xudc_ep0_set_address()
2501 if (xudc->device_state == USB_STATE_CONFIGURED) in tegra_xudc_ep0_set_address()
2504 dev_dbg(xudc->dev, "set address: %u\n", addr); in tegra_xudc_ep0_set_address()
2506 xudc->dev_addr = addr; in tegra_xudc_ep0_set_address()
2507 val = xudc_readl(xudc, CTRL); in tegra_xudc_ep0_set_address()
2510 xudc_writel(xudc, val, CTRL); in tegra_xudc_ep0_set_address()
2514 return tegra_xudc_ep0_queue_status(xudc, set_address_complete); in tegra_xudc_ep0_set_address()
2517 static int tegra_xudc_ep0_standard_req(struct tegra_xudc *xudc, in tegra_xudc_ep0_standard_req() argument
2524 dev_dbg(xudc->dev, "USB_REQ_GET_STATUS\n"); in tegra_xudc_ep0_standard_req()
2525 ret = tegra_xudc_ep0_get_status(xudc, ctrl); in tegra_xudc_ep0_standard_req()
2528 dev_dbg(xudc->dev, "USB_REQ_SET_ADDRESS\n"); in tegra_xudc_ep0_standard_req()
2529 ret = tegra_xudc_ep0_set_address(xudc, ctrl); in tegra_xudc_ep0_standard_req()
2532 dev_dbg(xudc->dev, "USB_REQ_SET_SEL\n"); in tegra_xudc_ep0_standard_req()
2533 ret = tegra_xudc_ep0_set_sel(xudc, ctrl); in tegra_xudc_ep0_standard_req()
2536 dev_dbg(xudc->dev, "USB_REQ_SET_ISOCH_DELAY\n"); in tegra_xudc_ep0_standard_req()
2537 ret = tegra_xudc_ep0_set_isoch_delay(xudc, ctrl); in tegra_xudc_ep0_standard_req()
2541 dev_dbg(xudc->dev, "USB_REQ_CLEAR/SET_FEATURE\n"); in tegra_xudc_ep0_standard_req()
2542 ret = tegra_xudc_ep0_set_feature(xudc, ctrl); in tegra_xudc_ep0_standard_req()
2545 dev_dbg(xudc->dev, "USB_REQ_SET_CONFIGURATION\n"); in tegra_xudc_ep0_standard_req()
2553 ret = tegra_xudc_ep0_delegate_req(xudc, ctrl); in tegra_xudc_ep0_standard_req()
2560 static void tegra_xudc_handle_ep0_setup_packet(struct tegra_xudc *xudc, in tegra_xudc_handle_ep0_setup_packet() argument
2566 xudc->setup_seq_num = seq_num; in tegra_xudc_handle_ep0_setup_packet()
2569 ep_unhalt(xudc, 0); in tegra_xudc_handle_ep0_setup_packet()
2575 if (xudc->soc->invalid_seq_num && in tegra_xudc_handle_ep0_setup_packet()
2577 dev_warn(xudc->dev, "invalid sequence number detected\n"); in tegra_xudc_handle_ep0_setup_packet()
2578 ep_halt(xudc, 0); in tegra_xudc_handle_ep0_setup_packet()
2583 xudc->setup_state = (ctrl->bRequestType & USB_DIR_IN) ? in tegra_xudc_handle_ep0_setup_packet()
2586 xudc->setup_state = STATUS_STAGE_XFER; in tegra_xudc_handle_ep0_setup_packet()
2589 ret = tegra_xudc_ep0_standard_req(xudc, ctrl); in tegra_xudc_handle_ep0_setup_packet()
2591 ret = tegra_xudc_ep0_delegate_req(xudc, ctrl); in tegra_xudc_handle_ep0_setup_packet()
2594 dev_warn(xudc->dev, "setup request failed: %d\n", ret); in tegra_xudc_handle_ep0_setup_packet()
2595 xudc->setup_state = WAIT_FOR_SETUP; in tegra_xudc_handle_ep0_setup_packet()
2596 ep_halt(xudc, 0); in tegra_xudc_handle_ep0_setup_packet()
2600 static void tegra_xudc_handle_ep0_event(struct tegra_xudc *xudc, in tegra_xudc_handle_ep0_event() argument
2606 if (xudc->setup_state != WAIT_FOR_SETUP) { in tegra_xudc_handle_ep0_event()
2613 memcpy(&xudc->setup_packet.ctrl_req, ctrl, sizeof(*ctrl)); in tegra_xudc_handle_ep0_event()
2614 xudc->setup_packet.seq_num = seq_num; in tegra_xudc_handle_ep0_event()
2615 xudc->queued_setup_packet = true; in tegra_xudc_handle_ep0_event()
2617 tegra_xudc_handle_ep0_setup_packet(xudc, ctrl, seq_num); in tegra_xudc_handle_ep0_event()
2637 static void tegra_xudc_handle_transfer_completion(struct tegra_xudc *xudc, in tegra_xudc_handle_transfer_completion() argument
2663 dev_dbg(xudc->dev, "bytes transferred %u / %u\n", in tegra_xudc_handle_transfer_completion()
2669 tegra_xudc_ep0_req_done(xudc); in tegra_xudc_handle_transfer_completion()
2681 dev_warn(xudc->dev, "transfer event on dequeued request\n"); in tegra_xudc_handle_transfer_completion()
2688 static void tegra_xudc_handle_transfer_event(struct tegra_xudc *xudc, in tegra_xudc_handle_transfer_event() argument
2692 struct tegra_xudc_ep *ep = &xudc->ep[ep_index]; in tegra_xudc_handle_transfer_event()
2697 dev_warn(xudc->dev, "transfer event on disabled EP %u\n", in tegra_xudc_handle_transfer_event()
2716 tegra_xudc_handle_transfer_completion(xudc, ep, event); in tegra_xudc_handle_transfer_event()
2719 dev_info(xudc->dev, "stream rejected on EP %u\n", ep_index); in tegra_xudc_handle_transfer_event()
2724 dev_info(xudc->dev, "prime pipe received on EP %u\n", ep_index); in tegra_xudc_handle_transfer_event()
2733 ep_wait_for_stopped(xudc, ep_index); in tegra_xudc_handle_transfer_event()
2742 ep_wait_for_stopped(xudc, ep_index); in tegra_xudc_handle_transfer_event()
2754 dev_err(xudc->dev, "completion error %#x on EP %u\n", in tegra_xudc_handle_transfer_event()
2757 ep_halt(xudc, ep_index); in tegra_xudc_handle_transfer_event()
2760 dev_info(xudc->dev, "sequence number error\n"); in tegra_xudc_handle_transfer_event()
2767 xudc->setup_state = WAIT_FOR_SETUP; in tegra_xudc_handle_transfer_event()
2768 if (!xudc->queued_setup_packet) in tegra_xudc_handle_transfer_event()
2771 tegra_xudc_handle_ep0_setup_packet(xudc, in tegra_xudc_handle_transfer_event()
2772 &xudc->setup_packet.ctrl_req, in tegra_xudc_handle_transfer_event()
2773 xudc->setup_packet.seq_num); in tegra_xudc_handle_transfer_event()
2774 xudc->queued_setup_packet = false; in tegra_xudc_handle_transfer_event()
2777 dev_dbg(xudc->dev, "stop completion code on EP %u\n", in tegra_xudc_handle_transfer_event()
2784 dev_dbg(xudc->dev, "completion event %#x on EP %u\n", in tegra_xudc_handle_transfer_event()
2790 static void tegra_xudc_reset(struct tegra_xudc *xudc) in tegra_xudc_reset() argument
2792 struct tegra_xudc_ep *ep0 = &xudc->ep[0]; in tegra_xudc_reset()
2796 xudc->setup_state = WAIT_FOR_SETUP; in tegra_xudc_reset()
2797 xudc->device_state = USB_STATE_DEFAULT; in tegra_xudc_reset()
2798 usb_gadget_set_state(&xudc->gadget, xudc->device_state); in tegra_xudc_reset()
2800 ep_unpause_all(xudc); in tegra_xudc_reset()
2802 for (i = 0; i < ARRAY_SIZE(xudc->ep); i++) in tegra_xudc_reset()
2803 tegra_xudc_ep_nuke(&xudc->ep[i], -ESHUTDOWN); in tegra_xudc_reset()
2812 xudc->setup_seq_num = 0; in tegra_xudc_reset()
2813 xudc->queued_setup_packet = false; in tegra_xudc_reset()
2815 ep_ctx_write_seq_num(ep0->context, xudc->setup_seq_num); in tegra_xudc_reset()
2819 if (!dma_mapping_error(xudc->dev, deq_ptr)) { in tegra_xudc_reset()
2824 ep_unhalt_all(xudc); in tegra_xudc_reset()
2825 ep_reload(xudc, 0); in tegra_xudc_reset()
2826 ep_unpause(xudc, 0); in tegra_xudc_reset()
2829 static void tegra_xudc_port_connect(struct tegra_xudc *xudc) in tegra_xudc_port_connect() argument
2831 struct tegra_xudc_ep *ep0 = &xudc->ep[0]; in tegra_xudc_port_connect()
2835 val = (xudc_readl(xudc, PORTSC) & PORTSC_PS_MASK) >> PORTSC_PS_SHIFT; in tegra_xudc_port_connect()
2838 xudc->gadget.speed = USB_SPEED_LOW; in tegra_xudc_port_connect()
2841 xudc->gadget.speed = USB_SPEED_FULL; in tegra_xudc_port_connect()
2844 xudc->gadget.speed = USB_SPEED_HIGH; in tegra_xudc_port_connect()
2847 xudc->gadget.speed = USB_SPEED_SUPER; in tegra_xudc_port_connect()
2850 xudc->gadget.speed = USB_SPEED_UNKNOWN; in tegra_xudc_port_connect()
2854 xudc->device_state = USB_STATE_DEFAULT; in tegra_xudc_port_connect()
2855 usb_gadget_set_state(&xudc->gadget, xudc->device_state); in tegra_xudc_port_connect()
2857 xudc->setup_state = WAIT_FOR_SETUP; in tegra_xudc_port_connect()
2859 if (xudc->gadget.speed == USB_SPEED_SUPER) in tegra_xudc_port_connect()
2868 if (!xudc->soc->u1_enable) { in tegra_xudc_port_connect()
2869 val = xudc_readl(xudc, PORTPM); in tegra_xudc_port_connect()
2871 xudc_writel(xudc, val, PORTPM); in tegra_xudc_port_connect()
2874 if (!xudc->soc->u2_enable) { in tegra_xudc_port_connect()
2875 val = xudc_readl(xudc, PORTPM); in tegra_xudc_port_connect()
2877 xudc_writel(xudc, val, PORTPM); in tegra_xudc_port_connect()
2880 if (xudc->gadget.speed <= USB_SPEED_HIGH) { in tegra_xudc_port_connect()
2881 val = xudc_readl(xudc, PORTPM); in tegra_xudc_port_connect()
2883 if (xudc->soc->lpm_enable) in tegra_xudc_port_connect()
2887 xudc_writel(xudc, val, PORTPM); in tegra_xudc_port_connect()
2890 val = xudc_readl(xudc, ST); in tegra_xudc_port_connect()
2892 xudc_writel(xudc, ST_RC, ST); in tegra_xudc_port_connect()
2895 static void tegra_xudc_port_disconnect(struct tegra_xudc *xudc) in tegra_xudc_port_disconnect() argument
2897 tegra_xudc_reset(xudc); in tegra_xudc_port_disconnect()
2899 if (xudc->driver && xudc->driver->disconnect) { in tegra_xudc_port_disconnect()
2900 spin_unlock(&xudc->lock); in tegra_xudc_port_disconnect()
2901 xudc->driver->disconnect(&xudc->gadget); in tegra_xudc_port_disconnect()
2902 spin_lock(&xudc->lock); in tegra_xudc_port_disconnect()
2905 xudc->device_state = USB_STATE_NOTATTACHED; in tegra_xudc_port_disconnect()
2906 usb_gadget_set_state(&xudc->gadget, xudc->device_state); in tegra_xudc_port_disconnect()
2908 complete(&xudc->disconnect_complete); in tegra_xudc_port_disconnect()
2911 static void tegra_xudc_port_reset(struct tegra_xudc *xudc) in tegra_xudc_port_reset() argument
2913 tegra_xudc_reset(xudc); in tegra_xudc_port_reset()
2915 if (xudc->driver) { in tegra_xudc_port_reset()
2916 spin_unlock(&xudc->lock); in tegra_xudc_port_reset()
2917 usb_gadget_udc_reset(&xudc->gadget, xudc->driver); in tegra_xudc_port_reset()
2918 spin_lock(&xudc->lock); in tegra_xudc_port_reset()
2921 tegra_xudc_port_connect(xudc); in tegra_xudc_port_reset()
2924 static void tegra_xudc_port_suspend(struct tegra_xudc *xudc) in tegra_xudc_port_suspend() argument
2926 dev_dbg(xudc->dev, "port suspend\n"); in tegra_xudc_port_suspend()
2928 xudc->resume_state = xudc->device_state; in tegra_xudc_port_suspend()
2929 xudc->device_state = USB_STATE_SUSPENDED; in tegra_xudc_port_suspend()
2930 usb_gadget_set_state(&xudc->gadget, xudc->device_state); in tegra_xudc_port_suspend()
2932 if (xudc->driver->suspend) { in tegra_xudc_port_suspend()
2933 spin_unlock(&xudc->lock); in tegra_xudc_port_suspend()
2934 xudc->driver->suspend(&xudc->gadget); in tegra_xudc_port_suspend()
2935 spin_lock(&xudc->lock); in tegra_xudc_port_suspend()
2939 static void tegra_xudc_port_resume(struct tegra_xudc *xudc) in tegra_xudc_port_resume() argument
2941 dev_dbg(xudc->dev, "port resume\n"); in tegra_xudc_port_resume()
2943 tegra_xudc_resume_device_state(xudc); in tegra_xudc_port_resume()
2945 if (xudc->driver->resume) { in tegra_xudc_port_resume()
2946 spin_unlock(&xudc->lock); in tegra_xudc_port_resume()
2947 xudc->driver->resume(&xudc->gadget); in tegra_xudc_port_resume()
2948 spin_lock(&xudc->lock); in tegra_xudc_port_resume()
2952 static inline void clear_port_change(struct tegra_xudc *xudc, u32 flag) in clear_port_change() argument
2956 val = xudc_readl(xudc, PORTSC); in clear_port_change()
2959 xudc_writel(xudc, val, PORTSC); in clear_port_change()
2962 static void __tegra_xudc_handle_port_status(struct tegra_xudc *xudc) in __tegra_xudc_handle_port_status() argument
2966 porthalt = xudc_readl(xudc, PORTHALT); in __tegra_xudc_handle_port_status()
2969 dev_dbg(xudc->dev, "STCHG_REQ, PORTHALT = %#x\n", porthalt); in __tegra_xudc_handle_port_status()
2971 xudc_writel(xudc, porthalt, PORTHALT); in __tegra_xudc_handle_port_status()
2974 portsc = xudc_readl(xudc, PORTSC); in __tegra_xudc_handle_port_status()
2976 dev_dbg(xudc->dev, "PRC, PR, PORTSC = %#x\n", portsc); in __tegra_xudc_handle_port_status()
2977 clear_port_change(xudc, PORTSC_PRC | PORTSC_PED); in __tegra_xudc_handle_port_status()
2979 if (xudc->soc->port_reset_quirk) { in __tegra_xudc_handle_port_status()
2980 schedule_delayed_work(&xudc->port_reset_war_work, in __tegra_xudc_handle_port_status()
2982 xudc->wait_for_sec_prc = 1; in __tegra_xudc_handle_port_status()
2987 dev_dbg(xudc->dev, "PRC, Not PR, PORTSC = %#x\n", portsc); in __tegra_xudc_handle_port_status()
2988 clear_port_change(xudc, PORTSC_PRC | PORTSC_PED); in __tegra_xudc_handle_port_status()
2989 tegra_xudc_port_reset(xudc); in __tegra_xudc_handle_port_status()
2990 cancel_delayed_work(&xudc->port_reset_war_work); in __tegra_xudc_handle_port_status()
2991 xudc->wait_for_sec_prc = 0; in __tegra_xudc_handle_port_status()
2994 portsc = xudc_readl(xudc, PORTSC); in __tegra_xudc_handle_port_status()
2996 dev_dbg(xudc->dev, "WRC, PORTSC = %#x\n", portsc); in __tegra_xudc_handle_port_status()
2997 clear_port_change(xudc, PORTSC_WRC | PORTSC_PED); in __tegra_xudc_handle_port_status()
2998 if (!(xudc_readl(xudc, PORTSC) & PORTSC_WPR)) in __tegra_xudc_handle_port_status()
2999 tegra_xudc_port_reset(xudc); in __tegra_xudc_handle_port_status()
3002 portsc = xudc_readl(xudc, PORTSC); in __tegra_xudc_handle_port_status()
3004 dev_dbg(xudc->dev, "CSC, PORTSC = %#x\n", portsc); in __tegra_xudc_handle_port_status()
3005 clear_port_change(xudc, PORTSC_CSC); in __tegra_xudc_handle_port_status()
3008 tegra_xudc_port_connect(xudc); in __tegra_xudc_handle_port_status()
3010 tegra_xudc_port_disconnect(xudc); in __tegra_xudc_handle_port_status()
3012 if (xudc->wait_csc) { in __tegra_xudc_handle_port_status()
3013 cancel_delayed_work(&xudc->plc_reset_work); in __tegra_xudc_handle_port_status()
3014 xudc->wait_csc = false; in __tegra_xudc_handle_port_status()
3018 portsc = xudc_readl(xudc, PORTSC); in __tegra_xudc_handle_port_status()
3022 dev_dbg(xudc->dev, "PLC, PORTSC = %#x\n", portsc); in __tegra_xudc_handle_port_status()
3023 clear_port_change(xudc, PORTSC_PLC); in __tegra_xudc_handle_port_status()
3026 tegra_xudc_port_suspend(xudc); in __tegra_xudc_handle_port_status()
3029 if (xudc->gadget.speed < USB_SPEED_SUPER) in __tegra_xudc_handle_port_status()
3030 tegra_xudc_port_resume(xudc); in __tegra_xudc_handle_port_status()
3033 if (xudc->gadget.speed == USB_SPEED_SUPER) in __tegra_xudc_handle_port_status()
3034 tegra_xudc_port_resume(xudc); in __tegra_xudc_handle_port_status()
3037 schedule_delayed_work(&xudc->plc_reset_work, in __tegra_xudc_handle_port_status()
3039 xudc->wait_csc = true; in __tegra_xudc_handle_port_status()
3047 dev_warn(xudc->dev, "CEC, PORTSC = %#x\n", portsc); in __tegra_xudc_handle_port_status()
3048 clear_port_change(xudc, PORTSC_CEC); in __tegra_xudc_handle_port_status()
3051 dev_dbg(xudc->dev, "PORTSC = %#x\n", xudc_readl(xudc, PORTSC)); in __tegra_xudc_handle_port_status()
3054 static void tegra_xudc_handle_port_status(struct tegra_xudc *xudc) in tegra_xudc_handle_port_status() argument
3056 while ((xudc_readl(xudc, PORTSC) & PORTSC_CHANGE_MASK) || in tegra_xudc_handle_port_status()
3057 (xudc_readl(xudc, PORTHALT) & PORTHALT_STCHG_REQ)) in tegra_xudc_handle_port_status()
3058 __tegra_xudc_handle_port_status(xudc); in tegra_xudc_handle_port_status()
3061 static void tegra_xudc_handle_event(struct tegra_xudc *xudc, in tegra_xudc_handle_event() argument
3066 dump_trb(xudc, "EVENT", event); in tegra_xudc_handle_event()
3070 tegra_xudc_handle_port_status(xudc); in tegra_xudc_handle_event()
3073 tegra_xudc_handle_transfer_event(xudc, event); in tegra_xudc_handle_event()
3076 tegra_xudc_handle_ep0_event(xudc, event); in tegra_xudc_handle_event()
3079 dev_info(xudc->dev, "Unrecognized TRB type = %#x\n", type); in tegra_xudc_handle_event()
3084 static void tegra_xudc_process_event_ring(struct tegra_xudc *xudc) in tegra_xudc_process_event_ring() argument
3090 event = xudc->event_ring[xudc->event_ring_index] + in tegra_xudc_process_event_ring()
3091 xudc->event_ring_deq_ptr; in tegra_xudc_process_event_ring()
3093 if (trb_read_cycle(event) != xudc->ccs) in tegra_xudc_process_event_ring()
3096 tegra_xudc_handle_event(xudc, event); in tegra_xudc_process_event_ring()
3098 xudc->event_ring_deq_ptr++; in tegra_xudc_process_event_ring()
3099 if (xudc->event_ring_deq_ptr == XUDC_EVENT_RING_SIZE) { in tegra_xudc_process_event_ring()
3100 xudc->event_ring_deq_ptr = 0; in tegra_xudc_process_event_ring()
3101 xudc->event_ring_index++; in tegra_xudc_process_event_ring()
3104 if (xudc->event_ring_index == XUDC_NR_EVENT_RINGS) { in tegra_xudc_process_event_ring()
3105 xudc->event_ring_index = 0; in tegra_xudc_process_event_ring()
3106 xudc->ccs = !xudc->ccs; in tegra_xudc_process_event_ring()
3110 erdp = xudc->event_ring_phys[xudc->event_ring_index] + in tegra_xudc_process_event_ring()
3111 xudc->event_ring_deq_ptr * sizeof(*event); in tegra_xudc_process_event_ring()
3113 xudc_writel(xudc, upper_32_bits(erdp), ERDPHI); in tegra_xudc_process_event_ring()
3114 xudc_writel(xudc, lower_32_bits(erdp) | ERDPLO_EHB, ERDPLO); in tegra_xudc_process_event_ring()
3119 struct tegra_xudc *xudc = data; in tegra_xudc_irq() local
3123 val = xudc_readl(xudc, ST); in tegra_xudc_irq()
3126 xudc_writel(xudc, ST_IP, ST); in tegra_xudc_irq()
3128 spin_lock_irqsave(&xudc->lock, flags); in tegra_xudc_irq()
3129 tegra_xudc_process_event_ring(xudc); in tegra_xudc_irq()
3130 spin_unlock_irqrestore(&xudc->lock, flags); in tegra_xudc_irq()
3135 static int tegra_xudc_alloc_ep(struct tegra_xudc *xudc, unsigned int index) in tegra_xudc_alloc_ep() argument
3137 struct tegra_xudc_ep *ep = &xudc->ep[index]; in tegra_xudc_alloc_ep()
3139 ep->xudc = xudc; in tegra_xudc_alloc_ep()
3141 ep->context = &xudc->ep_context[index]; in tegra_xudc_alloc_ep()
3151 ep->transfer_ring = dma_pool_alloc(xudc->transfer_ring_pool, in tegra_xudc_alloc_ep()
3170 list_add_tail(&ep->usb_ep.ep_list, &xudc->gadget.ep_list); in tegra_xudc_alloc_ep()
3184 static void tegra_xudc_free_ep(struct tegra_xudc *xudc, unsigned int index) in tegra_xudc_free_ep() argument
3186 struct tegra_xudc_ep *ep = &xudc->ep[index]; in tegra_xudc_free_ep()
3195 dma_pool_free(xudc->transfer_ring_pool, ep->transfer_ring, in tegra_xudc_free_ep()
3199 static int tegra_xudc_alloc_eps(struct tegra_xudc *xudc) in tegra_xudc_alloc_eps() argument
3205 xudc->ep_context = in tegra_xudc_alloc_eps()
3206 dma_alloc_coherent(xudc->dev, XUDC_NR_EPS * in tegra_xudc_alloc_eps()
3207 sizeof(*xudc->ep_context), in tegra_xudc_alloc_eps()
3208 &xudc->ep_context_phys, GFP_KERNEL); in tegra_xudc_alloc_eps()
3209 if (!xudc->ep_context) in tegra_xudc_alloc_eps()
3212 xudc->transfer_ring_pool = in tegra_xudc_alloc_eps()
3213 dmam_pool_create(dev_name(xudc->dev), xudc->dev, in tegra_xudc_alloc_eps()
3217 if (!xudc->transfer_ring_pool) { in tegra_xudc_alloc_eps()
3222 INIT_LIST_HEAD(&xudc->gadget.ep_list); in tegra_xudc_alloc_eps()
3223 for (i = 0; i < ARRAY_SIZE(xudc->ep); i++) { in tegra_xudc_alloc_eps()
3224 err = tegra_xudc_alloc_ep(xudc, i); in tegra_xudc_alloc_eps()
3229 req = tegra_xudc_ep_alloc_request(&xudc->ep[0].usb_ep, GFP_KERNEL); in tegra_xudc_alloc_eps()
3234 xudc->ep0_req = to_xudc_req(req); in tegra_xudc_alloc_eps()
3240 tegra_xudc_free_ep(xudc, i - 1); in tegra_xudc_alloc_eps()
3242 dma_free_coherent(xudc->dev, XUDC_NR_EPS * sizeof(*xudc->ep_context), in tegra_xudc_alloc_eps()
3243 xudc->ep_context, xudc->ep_context_phys); in tegra_xudc_alloc_eps()
3247 static void tegra_xudc_init_eps(struct tegra_xudc *xudc) in tegra_xudc_init_eps() argument
3249 xudc_writel(xudc, lower_32_bits(xudc->ep_context_phys), ECPLO); in tegra_xudc_init_eps()
3250 xudc_writel(xudc, upper_32_bits(xudc->ep_context_phys), ECPHI); in tegra_xudc_init_eps()
3253 static void tegra_xudc_free_eps(struct tegra_xudc *xudc) in tegra_xudc_free_eps() argument
3257 tegra_xudc_ep_free_request(&xudc->ep[0].usb_ep, in tegra_xudc_free_eps()
3258 &xudc->ep0_req->usb_req); in tegra_xudc_free_eps()
3260 for (i = 0; i < ARRAY_SIZE(xudc->ep); i++) in tegra_xudc_free_eps()
3261 tegra_xudc_free_ep(xudc, i); in tegra_xudc_free_eps()
3263 dma_free_coherent(xudc->dev, XUDC_NR_EPS * sizeof(*xudc->ep_context), in tegra_xudc_free_eps()
3264 xudc->ep_context, xudc->ep_context_phys); in tegra_xudc_free_eps()
3267 static int tegra_xudc_alloc_event_ring(struct tegra_xudc *xudc) in tegra_xudc_alloc_event_ring() argument
3271 for (i = 0; i < ARRAY_SIZE(xudc->event_ring); i++) { in tegra_xudc_alloc_event_ring()
3272 xudc->event_ring[i] = in tegra_xudc_alloc_event_ring()
3273 dma_alloc_coherent(xudc->dev, XUDC_EVENT_RING_SIZE * in tegra_xudc_alloc_event_ring()
3274 sizeof(*xudc->event_ring[i]), in tegra_xudc_alloc_event_ring()
3275 &xudc->event_ring_phys[i], in tegra_xudc_alloc_event_ring()
3277 if (!xudc->event_ring[i]) in tegra_xudc_alloc_event_ring()
3285 dma_free_coherent(xudc->dev, XUDC_EVENT_RING_SIZE * in tegra_xudc_alloc_event_ring()
3286 sizeof(*xudc->event_ring[i - 1]), in tegra_xudc_alloc_event_ring()
3287 xudc->event_ring[i - 1], in tegra_xudc_alloc_event_ring()
3288 xudc->event_ring_phys[i - 1]); in tegra_xudc_alloc_event_ring()
3293 static void tegra_xudc_init_event_ring(struct tegra_xudc *xudc) in tegra_xudc_init_event_ring() argument
3298 val = xudc_readl(xudc, SPARAM); in tegra_xudc_init_event_ring()
3301 xudc_writel(xudc, val, SPARAM); in tegra_xudc_init_event_ring()
3303 for (i = 0; i < ARRAY_SIZE(xudc->event_ring); i++) { in tegra_xudc_init_event_ring()
3304 memset(xudc->event_ring[i], 0, XUDC_EVENT_RING_SIZE * in tegra_xudc_init_event_ring()
3305 sizeof(*xudc->event_ring[i])); in tegra_xudc_init_event_ring()
3307 val = xudc_readl(xudc, ERSTSZ); in tegra_xudc_init_event_ring()
3310 xudc_writel(xudc, val, ERSTSZ); in tegra_xudc_init_event_ring()
3312 xudc_writel(xudc, lower_32_bits(xudc->event_ring_phys[i]), in tegra_xudc_init_event_ring()
3314 xudc_writel(xudc, upper_32_bits(xudc->event_ring_phys[i]), in tegra_xudc_init_event_ring()
3318 val = lower_32_bits(xudc->event_ring_phys[0]); in tegra_xudc_init_event_ring()
3319 xudc_writel(xudc, val, ERDPLO); in tegra_xudc_init_event_ring()
3321 xudc_writel(xudc, val, EREPLO); in tegra_xudc_init_event_ring()
3323 val = upper_32_bits(xudc->event_ring_phys[0]); in tegra_xudc_init_event_ring()
3324 xudc_writel(xudc, val, ERDPHI); in tegra_xudc_init_event_ring()
3325 xudc_writel(xudc, val, EREPHI); in tegra_xudc_init_event_ring()
3327 xudc->ccs = true; in tegra_xudc_init_event_ring()
3328 xudc->event_ring_index = 0; in tegra_xudc_init_event_ring()
3329 xudc->event_ring_deq_ptr = 0; in tegra_xudc_init_event_ring()
3332 static void tegra_xudc_free_event_ring(struct tegra_xudc *xudc) in tegra_xudc_free_event_ring() argument
3336 for (i = 0; i < ARRAY_SIZE(xudc->event_ring); i++) { in tegra_xudc_free_event_ring()
3337 dma_free_coherent(xudc->dev, XUDC_EVENT_RING_SIZE * in tegra_xudc_free_event_ring()
3338 sizeof(*xudc->event_ring[i]), in tegra_xudc_free_event_ring()
3339 xudc->event_ring[i], in tegra_xudc_free_event_ring()
3340 xudc->event_ring_phys[i]); in tegra_xudc_free_event_ring()
3344 static void tegra_xudc_fpci_ipfs_init(struct tegra_xudc *xudc) in tegra_xudc_fpci_ipfs_init() argument
3348 if (xudc->soc->has_ipfs) { in tegra_xudc_fpci_ipfs_init()
3349 val = ipfs_readl(xudc, XUSB_DEV_CONFIGURATION_0); in tegra_xudc_fpci_ipfs_init()
3351 ipfs_writel(xudc, val, XUSB_DEV_CONFIGURATION_0); in tegra_xudc_fpci_ipfs_init()
3358 fpci_writel(xudc, val, XUSB_DEV_CFG_1); in tegra_xudc_fpci_ipfs_init()
3361 val = fpci_readl(xudc, XUSB_DEV_CFG_4); in tegra_xudc_fpci_ipfs_init()
3363 val |= xudc->phys_base & (XUSB_DEV_CFG_4_BASE_ADDR_MASK); in tegra_xudc_fpci_ipfs_init()
3365 fpci_writel(xudc, val, XUSB_DEV_CFG_4); in tegra_xudc_fpci_ipfs_init()
3366 fpci_writel(xudc, upper_32_bits(xudc->phys_base), XUSB_DEV_CFG_5); in tegra_xudc_fpci_ipfs_init()
3370 if (xudc->soc->has_ipfs) { in tegra_xudc_fpci_ipfs_init()
3372 val = ipfs_readl(xudc, XUSB_DEV_INTR_MASK_0); in tegra_xudc_fpci_ipfs_init()
3374 ipfs_writel(xudc, val, XUSB_DEV_INTR_MASK_0); in tegra_xudc_fpci_ipfs_init()
3378 static void tegra_xudc_device_params_init(struct tegra_xudc *xudc) in tegra_xudc_device_params_init() argument
3382 if (xudc->soc->has_ipfs) { in tegra_xudc_device_params_init()
3383 val = xudc_readl(xudc, BLCG); in tegra_xudc_device_params_init()
3391 xudc_writel(xudc, val, BLCG); in tegra_xudc_device_params_init()
3394 if (xudc->soc->port_speed_quirk) in tegra_xudc_device_params_init()
3395 tegra_xudc_limit_port_speed(xudc); in tegra_xudc_device_params_init()
3398 val = xudc_readl(xudc, SSPX_CORE_PADCTL4); in tegra_xudc_device_params_init()
3401 xudc_writel(xudc, val, SSPX_CORE_PADCTL4); in tegra_xudc_device_params_init()
3404 val = xudc_readl(xudc, SSPX_CORE_CNT0); in tegra_xudc_device_params_init()
3407 xudc_writel(xudc, val, SSPX_CORE_CNT0); in tegra_xudc_device_params_init()
3410 val = xudc_readl(xudc, SSPX_CORE_CNT30); in tegra_xudc_device_params_init()
3413 xudc_writel(xudc, val, SSPX_CORE_CNT30); in tegra_xudc_device_params_init()
3415 if (xudc->soc->lpm_enable) { in tegra_xudc_device_params_init()
3417 val = xudc_readl(xudc, HSFSPI_COUNT13); in tegra_xudc_device_params_init()
3420 xudc_writel(xudc, val, HSFSPI_COUNT13); in tegra_xudc_device_params_init()
3427 val = xudc_readl(xudc, SSPX_CORE_CNT32); in tegra_xudc_device_params_init()
3430 xudc_writel(xudc, val, SSPX_CORE_CNT32); in tegra_xudc_device_params_init()
3433 val = xudc_readl(xudc, CFG_DEV_FE); in tegra_xudc_device_params_init()
3436 xudc_writel(xudc, val, CFG_DEV_FE); in tegra_xudc_device_params_init()
3438 val = xudc_readl(xudc, PORTSC); in tegra_xudc_device_params_init()
3441 xudc_writel(xudc, val, PORTSC); in tegra_xudc_device_params_init()
3444 val = xudc_readl(xudc, CFG_DEV_FE); in tegra_xudc_device_params_init()
3447 xudc_writel(xudc, val, CFG_DEV_FE); in tegra_xudc_device_params_init()
3449 val = xudc_readl(xudc, PORTSC); in tegra_xudc_device_params_init()
3452 xudc_writel(xudc, val, PORTSC); in tegra_xudc_device_params_init()
3455 val = xudc_readl(xudc, CFG_DEV_FE); in tegra_xudc_device_params_init()
3457 xudc_writel(xudc, val, CFG_DEV_FE); in tegra_xudc_device_params_init()
3463 val = xudc_readl(xudc, CFG_DEV_FE); in tegra_xudc_device_params_init()
3465 xudc_writel(xudc, val, CFG_DEV_FE); in tegra_xudc_device_params_init()
3469 val = xudc_readl(xudc, RT_IMOD); in tegra_xudc_device_params_init()
3472 xudc_writel(xudc, val, RT_IMOD); in tegra_xudc_device_params_init()
3475 val = xudc_readl(xudc, CFG_DEV_SSPI_XFER); in tegra_xudc_device_params_init()
3478 xudc_writel(xudc, val, CFG_DEV_SSPI_XFER); in tegra_xudc_device_params_init()
3481 static int tegra_xudc_phy_get(struct tegra_xudc *xudc) in tegra_xudc_phy_get() argument
3486 xudc->utmi_phy = devm_kcalloc(xudc->dev, xudc->soc->num_phys, in tegra_xudc_phy_get()
3487 sizeof(*xudc->utmi_phy), GFP_KERNEL); in tegra_xudc_phy_get()
3488 if (!xudc->utmi_phy) in tegra_xudc_phy_get()
3491 xudc->usb3_phy = devm_kcalloc(xudc->dev, xudc->soc->num_phys, in tegra_xudc_phy_get()
3492 sizeof(*xudc->usb3_phy), GFP_KERNEL); in tegra_xudc_phy_get()
3493 if (!xudc->usb3_phy) in tegra_xudc_phy_get()
3496 xudc->usbphy = devm_kcalloc(xudc->dev, xudc->soc->num_phys, in tegra_xudc_phy_get()
3497 sizeof(*xudc->usbphy), GFP_KERNEL); in tegra_xudc_phy_get()
3498 if (!xudc->usbphy) in tegra_xudc_phy_get()
3501 xudc->vbus_nb.notifier_call = tegra_xudc_vbus_notify; in tegra_xudc_phy_get()
3503 for (i = 0; i < xudc->soc->num_phys; i++) { in tegra_xudc_phy_get()
3508 xudc->utmi_phy[i] = devm_phy_optional_get(xudc->dev, phy_name); in tegra_xudc_phy_get()
3509 if (IS_ERR(xudc->utmi_phy[i])) { in tegra_xudc_phy_get()
3510 err = PTR_ERR(xudc->utmi_phy[i]); in tegra_xudc_phy_get()
3511 dev_err_probe(xudc->dev, err, in tegra_xudc_phy_get()
3514 } else if (xudc->utmi_phy[i]) { in tegra_xudc_phy_get()
3516 xudc->usbphy[i] = devm_usb_get_phy_by_node(xudc->dev, in tegra_xudc_phy_get()
3517 xudc->utmi_phy[i]->dev.of_node, in tegra_xudc_phy_get()
3518 &xudc->vbus_nb); in tegra_xudc_phy_get()
3519 if (IS_ERR(xudc->usbphy[i])) { in tegra_xudc_phy_get()
3520 err = PTR_ERR(xudc->usbphy[i]); in tegra_xudc_phy_get()
3521 dev_err_probe(xudc->dev, err, in tegra_xudc_phy_get()
3525 } else if (!xudc->utmi_phy[i]) { in tegra_xudc_phy_get()
3531 usb3 = tegra_xusb_padctl_get_usb3_companion(xudc->padctl, i); in tegra_xudc_phy_get()
3536 xudc->usb3_phy[i] = devm_phy_optional_get(xudc->dev, phy_name); in tegra_xudc_phy_get()
3537 if (IS_ERR(xudc->usb3_phy[i])) { in tegra_xudc_phy_get()
3538 err = PTR_ERR(xudc->usb3_phy[i]); in tegra_xudc_phy_get()
3539 dev_err_probe(xudc->dev, err, in tegra_xudc_phy_get()
3542 } else if (xudc->usb3_phy[i]) in tegra_xudc_phy_get()
3543 dev_dbg(xudc->dev, "usb3-%d PHY registered", usb3); in tegra_xudc_phy_get()
3549 for (i = 0; i < xudc->soc->num_phys; i++) { in tegra_xudc_phy_get()
3550 xudc->usb3_phy[i] = NULL; in tegra_xudc_phy_get()
3551 xudc->utmi_phy[i] = NULL; in tegra_xudc_phy_get()
3552 xudc->usbphy[i] = NULL; in tegra_xudc_phy_get()
3558 static void tegra_xudc_phy_exit(struct tegra_xudc *xudc) in tegra_xudc_phy_exit() argument
3562 for (i = 0; i < xudc->soc->num_phys; i++) { in tegra_xudc_phy_exit()
3563 phy_exit(xudc->usb3_phy[i]); in tegra_xudc_phy_exit()
3564 phy_exit(xudc->utmi_phy[i]); in tegra_xudc_phy_exit()
3568 static int tegra_xudc_phy_init(struct tegra_xudc *xudc) in tegra_xudc_phy_init() argument
3573 for (i = 0; i < xudc->soc->num_phys; i++) { in tegra_xudc_phy_init()
3574 err = phy_init(xudc->utmi_phy[i]); in tegra_xudc_phy_init()
3576 dev_err(xudc->dev, "UTMI PHY #%u initialization failed: %d\n", i, err); in tegra_xudc_phy_init()
3580 err = phy_init(xudc->usb3_phy[i]); in tegra_xudc_phy_init()
3582 dev_err(xudc->dev, "USB3 PHY #%u initialization failed: %d\n", i, err); in tegra_xudc_phy_init()
3589 tegra_xudc_phy_exit(xudc); in tegra_xudc_phy_init()
3659 .compatible = "nvidia,tegra210-xudc",
3663 .compatible = "nvidia,tegra186-xudc",
3667 .compatible = "nvidia,tegra194-xudc",
3674 static void tegra_xudc_powerdomain_remove(struct tegra_xudc *xudc) in tegra_xudc_powerdomain_remove() argument
3676 if (xudc->genpd_dl_ss) in tegra_xudc_powerdomain_remove()
3677 device_link_del(xudc->genpd_dl_ss); in tegra_xudc_powerdomain_remove()
3678 if (xudc->genpd_dl_device) in tegra_xudc_powerdomain_remove()
3679 device_link_del(xudc->genpd_dl_device); in tegra_xudc_powerdomain_remove()
3680 if (xudc->genpd_dev_ss) in tegra_xudc_powerdomain_remove()
3681 dev_pm_domain_detach(xudc->genpd_dev_ss, true); in tegra_xudc_powerdomain_remove()
3682 if (xudc->genpd_dev_device) in tegra_xudc_powerdomain_remove()
3683 dev_pm_domain_detach(xudc->genpd_dev_device, true); in tegra_xudc_powerdomain_remove()
3686 static int tegra_xudc_powerdomain_init(struct tegra_xudc *xudc) in tegra_xudc_powerdomain_init() argument
3688 struct device *dev = xudc->dev; in tegra_xudc_powerdomain_init()
3691 xudc->genpd_dev_device = dev_pm_domain_attach_by_name(dev, "dev"); in tegra_xudc_powerdomain_init()
3692 if (IS_ERR(xudc->genpd_dev_device)) { in tegra_xudc_powerdomain_init()
3693 err = PTR_ERR(xudc->genpd_dev_device); in tegra_xudc_powerdomain_init()
3698 xudc->genpd_dev_ss = dev_pm_domain_attach_by_name(dev, "ss"); in tegra_xudc_powerdomain_init()
3699 if (IS_ERR(xudc->genpd_dev_ss)) { in tegra_xudc_powerdomain_init()
3700 err = PTR_ERR(xudc->genpd_dev_ss); in tegra_xudc_powerdomain_init()
3705 xudc->genpd_dl_device = device_link_add(dev, xudc->genpd_dev_device, in tegra_xudc_powerdomain_init()
3708 if (!xudc->genpd_dl_device) { in tegra_xudc_powerdomain_init()
3713 xudc->genpd_dl_ss = device_link_add(dev, xudc->genpd_dev_ss, in tegra_xudc_powerdomain_init()
3716 if (!xudc->genpd_dl_ss) { in tegra_xudc_powerdomain_init()
3726 struct tegra_xudc *xudc; in tegra_xudc_probe() local
3731 xudc = devm_kzalloc(&pdev->dev, sizeof(*xudc), GFP_KERNEL); in tegra_xudc_probe()
3732 if (!xudc) in tegra_xudc_probe()
3735 xudc->dev = &pdev->dev; in tegra_xudc_probe()
3736 platform_set_drvdata(pdev, xudc); in tegra_xudc_probe()
3738 xudc->soc = of_device_get_match_data(&pdev->dev); in tegra_xudc_probe()
3739 if (!xudc->soc) in tegra_xudc_probe()
3743 xudc->base = devm_ioremap_resource(&pdev->dev, res); in tegra_xudc_probe()
3744 if (IS_ERR(xudc->base)) in tegra_xudc_probe()
3745 return PTR_ERR(xudc->base); in tegra_xudc_probe()
3746 xudc->phys_base = res->start; in tegra_xudc_probe()
3748 xudc->fpci = devm_platform_ioremap_resource_byname(pdev, "fpci"); in tegra_xudc_probe()
3749 if (IS_ERR(xudc->fpci)) in tegra_xudc_probe()
3750 return PTR_ERR(xudc->fpci); in tegra_xudc_probe()
3752 if (xudc->soc->has_ipfs) { in tegra_xudc_probe()
3753 xudc->ipfs = devm_platform_ioremap_resource_byname(pdev, "ipfs"); in tegra_xudc_probe()
3754 if (IS_ERR(xudc->ipfs)) in tegra_xudc_probe()
3755 return PTR_ERR(xudc->ipfs); in tegra_xudc_probe()
3758 xudc->irq = platform_get_irq(pdev, 0); in tegra_xudc_probe()
3759 if (xudc->irq < 0) in tegra_xudc_probe()
3760 return xudc->irq; in tegra_xudc_probe()
3762 err = devm_request_irq(&pdev->dev, xudc->irq, tegra_xudc_irq, 0, in tegra_xudc_probe()
3763 dev_name(&pdev->dev), xudc); in tegra_xudc_probe()
3765 dev_err(xudc->dev, "failed to claim IRQ#%u: %d\n", xudc->irq, in tegra_xudc_probe()
3770 xudc->clks = devm_kcalloc(&pdev->dev, xudc->soc->num_clks, sizeof(*xudc->clks), in tegra_xudc_probe()
3772 if (!xudc->clks) in tegra_xudc_probe()
3775 for (i = 0; i < xudc->soc->num_clks; i++) in tegra_xudc_probe()
3776 xudc->clks[i].id = xudc->soc->clock_names[i]; in tegra_xudc_probe()
3778 err = devm_clk_bulk_get(&pdev->dev, xudc->soc->num_clks, xudc->clks); in tegra_xudc_probe()
3780 dev_err_probe(xudc->dev, err, "failed to request clocks\n"); in tegra_xudc_probe()
3784 xudc->supplies = devm_kcalloc(&pdev->dev, xudc->soc->num_supplies, in tegra_xudc_probe()
3785 sizeof(*xudc->supplies), GFP_KERNEL); in tegra_xudc_probe()
3786 if (!xudc->supplies) in tegra_xudc_probe()
3789 for (i = 0; i < xudc->soc->num_supplies; i++) in tegra_xudc_probe()
3790 xudc->supplies[i].supply = xudc->soc->supply_names[i]; in tegra_xudc_probe()
3792 err = devm_regulator_bulk_get(&pdev->dev, xudc->soc->num_supplies, in tegra_xudc_probe()
3793 xudc->supplies); in tegra_xudc_probe()
3795 dev_err_probe(xudc->dev, err, "failed to request regulators\n"); in tegra_xudc_probe()
3799 xudc->padctl = tegra_xusb_padctl_get(&pdev->dev); in tegra_xudc_probe()
3800 if (IS_ERR(xudc->padctl)) in tegra_xudc_probe()
3801 return PTR_ERR(xudc->padctl); in tegra_xudc_probe()
3803 err = regulator_bulk_enable(xudc->soc->num_supplies, xudc->supplies); in tegra_xudc_probe()
3805 dev_err(xudc->dev, "failed to enable regulators: %d\n", err); in tegra_xudc_probe()
3809 err = tegra_xudc_phy_get(xudc); in tegra_xudc_probe()
3813 err = tegra_xudc_powerdomain_init(xudc); in tegra_xudc_probe()
3817 err = tegra_xudc_phy_init(xudc); in tegra_xudc_probe()
3821 err = tegra_xudc_alloc_event_ring(xudc); in tegra_xudc_probe()
3825 err = tegra_xudc_alloc_eps(xudc); in tegra_xudc_probe()
3829 spin_lock_init(&xudc->lock); in tegra_xudc_probe()
3831 init_completion(&xudc->disconnect_complete); in tegra_xudc_probe()
3833 INIT_WORK(&xudc->usb_role_sw_work, tegra_xudc_usb_role_sw_work); in tegra_xudc_probe()
3835 INIT_DELAYED_WORK(&xudc->plc_reset_work, tegra_xudc_plc_reset_work); in tegra_xudc_probe()
3837 INIT_DELAYED_WORK(&xudc->port_reset_war_work, in tegra_xudc_probe()
3842 xudc->gadget.ops = &tegra_xudc_gadget_ops; in tegra_xudc_probe()
3843 xudc->gadget.ep0 = &xudc->ep[0].usb_ep; in tegra_xudc_probe()
3844 xudc->gadget.name = "tegra-xudc"; in tegra_xudc_probe()
3845 xudc->gadget.max_speed = USB_SPEED_SUPER; in tegra_xudc_probe()
3847 err = usb_add_gadget_udc(&pdev->dev, &xudc->gadget); in tegra_xudc_probe()
3857 tegra_xudc_free_eps(xudc); in tegra_xudc_probe()
3859 tegra_xudc_free_event_ring(xudc); in tegra_xudc_probe()
3861 tegra_xudc_phy_exit(xudc); in tegra_xudc_probe()
3863 tegra_xudc_powerdomain_remove(xudc); in tegra_xudc_probe()
3865 regulator_bulk_disable(xudc->soc->num_supplies, xudc->supplies); in tegra_xudc_probe()
3867 tegra_xusb_padctl_put(xudc->padctl); in tegra_xudc_probe()
3874 struct tegra_xudc *xudc = platform_get_drvdata(pdev); in tegra_xudc_remove() local
3877 pm_runtime_get_sync(xudc->dev); in tegra_xudc_remove()
3879 cancel_delayed_work_sync(&xudc->plc_reset_work); in tegra_xudc_remove()
3880 cancel_work_sync(&xudc->usb_role_sw_work); in tegra_xudc_remove()
3882 usb_del_gadget_udc(&xudc->gadget); in tegra_xudc_remove()
3884 tegra_xudc_free_eps(xudc); in tegra_xudc_remove()
3885 tegra_xudc_free_event_ring(xudc); in tegra_xudc_remove()
3887 tegra_xudc_powerdomain_remove(xudc); in tegra_xudc_remove()
3889 regulator_bulk_disable(xudc->soc->num_supplies, xudc->supplies); in tegra_xudc_remove()
3891 for (i = 0; i < xudc->soc->num_phys; i++) { in tegra_xudc_remove()
3892 phy_power_off(xudc->utmi_phy[i]); in tegra_xudc_remove()
3893 phy_power_off(xudc->usb3_phy[i]); in tegra_xudc_remove()
3896 tegra_xudc_phy_exit(xudc); in tegra_xudc_remove()
3898 pm_runtime_disable(xudc->dev); in tegra_xudc_remove()
3899 pm_runtime_put(xudc->dev); in tegra_xudc_remove()
3901 tegra_xusb_padctl_put(xudc->padctl); in tegra_xudc_remove()
3906 static int __maybe_unused tegra_xudc_powergate(struct tegra_xudc *xudc) in tegra_xudc_powergate() argument
3910 dev_dbg(xudc->dev, "entering ELPG\n"); in tegra_xudc_powergate()
3912 spin_lock_irqsave(&xudc->lock, flags); in tegra_xudc_powergate()
3914 xudc->powergated = true; in tegra_xudc_powergate()
3915 xudc->saved_regs.ctrl = xudc_readl(xudc, CTRL); in tegra_xudc_powergate()
3916 xudc->saved_regs.portpm = xudc_readl(xudc, PORTPM); in tegra_xudc_powergate()
3917 xudc_writel(xudc, 0, CTRL); in tegra_xudc_powergate()
3919 spin_unlock_irqrestore(&xudc->lock, flags); in tegra_xudc_powergate()
3921 clk_bulk_disable_unprepare(xudc->soc->num_clks, xudc->clks); in tegra_xudc_powergate()
3923 regulator_bulk_disable(xudc->soc->num_supplies, xudc->supplies); in tegra_xudc_powergate()
3925 dev_dbg(xudc->dev, "entering ELPG done\n"); in tegra_xudc_powergate()
3929 static int __maybe_unused tegra_xudc_unpowergate(struct tegra_xudc *xudc) in tegra_xudc_unpowergate() argument
3934 dev_dbg(xudc->dev, "exiting ELPG\n"); in tegra_xudc_unpowergate()
3936 err = regulator_bulk_enable(xudc->soc->num_supplies, in tegra_xudc_unpowergate()
3937 xudc->supplies); in tegra_xudc_unpowergate()
3941 err = clk_bulk_prepare_enable(xudc->soc->num_clks, xudc->clks); in tegra_xudc_unpowergate()
3945 tegra_xudc_fpci_ipfs_init(xudc); in tegra_xudc_unpowergate()
3947 tegra_xudc_device_params_init(xudc); in tegra_xudc_unpowergate()
3949 tegra_xudc_init_event_ring(xudc); in tegra_xudc_unpowergate()
3951 tegra_xudc_init_eps(xudc); in tegra_xudc_unpowergate()
3953 xudc_writel(xudc, xudc->saved_regs.portpm, PORTPM); in tegra_xudc_unpowergate()
3954 xudc_writel(xudc, xudc->saved_regs.ctrl, CTRL); in tegra_xudc_unpowergate()
3956 spin_lock_irqsave(&xudc->lock, flags); in tegra_xudc_unpowergate()
3957 xudc->powergated = false; in tegra_xudc_unpowergate()
3958 spin_unlock_irqrestore(&xudc->lock, flags); in tegra_xudc_unpowergate()
3960 dev_dbg(xudc->dev, "exiting ELPG done\n"); in tegra_xudc_unpowergate()
3966 struct tegra_xudc *xudc = dev_get_drvdata(dev); in tegra_xudc_suspend() local
3969 spin_lock_irqsave(&xudc->lock, flags); in tegra_xudc_suspend()
3970 xudc->suspended = true; in tegra_xudc_suspend()
3971 spin_unlock_irqrestore(&xudc->lock, flags); in tegra_xudc_suspend()
3973 flush_work(&xudc->usb_role_sw_work); in tegra_xudc_suspend()
3977 tegra_xudc_device_mode_off(xudc); in tegra_xudc_suspend()
3978 tegra_xudc_powergate(xudc); in tegra_xudc_suspend()
3988 struct tegra_xudc *xudc = dev_get_drvdata(dev); in tegra_xudc_resume() local
3992 err = tegra_xudc_unpowergate(xudc); in tegra_xudc_resume()
3996 spin_lock_irqsave(&xudc->lock, flags); in tegra_xudc_resume()
3997 xudc->suspended = false; in tegra_xudc_resume()
3998 spin_unlock_irqrestore(&xudc->lock, flags); in tegra_xudc_resume()
4000 schedule_work(&xudc->usb_role_sw_work); in tegra_xudc_resume()
4009 struct tegra_xudc *xudc = dev_get_drvdata(dev); in tegra_xudc_runtime_suspend() local
4011 return tegra_xudc_powergate(xudc); in tegra_xudc_runtime_suspend()
4016 struct tegra_xudc *xudc = dev_get_drvdata(dev); in tegra_xudc_runtime_resume() local
4018 return tegra_xudc_unpowergate(xudc); in tegra_xudc_runtime_resume()
4031 .name = "tegra-xudc",