Lines Matching full:mtu
45 dev_dbg(mep->mtu->dev, "%s fifo:%#x/%#x, start_bit: %d\n", in ep_fifo_alloc()
66 dev_dbg(mep->mtu->dev, "%s size:%#x/%#x, start_bit: %d\n", in ep_fifo_free()
71 static inline void mtu3_ss_func_set(struct mtu3 *mtu, bool enable) in mtu3_ss_func_set() argument
75 mtu3_setbits(mtu->mac_base, U3D_USB3_CONFIG, USB3_EN); in mtu3_ss_func_set()
77 mtu3_clrbits(mtu->mac_base, U3D_USB3_CONFIG, USB3_EN); in mtu3_ss_func_set()
79 dev_dbg(mtu->dev, "USB3_EN = %d\n", !!enable); in mtu3_ss_func_set()
83 static inline void mtu3_hs_softconn_set(struct mtu3 *mtu, bool enable) in mtu3_hs_softconn_set() argument
86 mtu3_setbits(mtu->mac_base, U3D_POWER_MANAGEMENT, in mtu3_hs_softconn_set()
89 mtu3_clrbits(mtu->mac_base, U3D_POWER_MANAGEMENT, in mtu3_hs_softconn_set()
92 dev_dbg(mtu->dev, "SOFTCONN = %d\n", !!enable); in mtu3_hs_softconn_set()
96 static int mtu3_device_enable(struct mtu3 *mtu) in mtu3_device_enable() argument
98 void __iomem *ibase = mtu->ippc_base; in mtu3_device_enable()
103 if (mtu->is_u3_ip) { in mtu3_device_enable()
113 if (mtu->ssusb->dr_mode == USB_DR_MODE_OTG) { in mtu3_device_enable()
115 if (mtu->is_u3_ip) in mtu3_device_enable()
120 return ssusb_check_clocks(mtu->ssusb, check_clk); in mtu3_device_enable()
123 static void mtu3_device_disable(struct mtu3 *mtu) in mtu3_device_disable() argument
125 void __iomem *ibase = mtu->ippc_base; in mtu3_device_disable()
127 if (mtu->is_u3_ip) in mtu3_device_disable()
134 if (mtu->ssusb->dr_mode == USB_DR_MODE_OTG) { in mtu3_device_disable()
136 if (mtu->is_u3_ip) in mtu3_device_disable()
145 static void mtu3_device_reset(struct mtu3 *mtu) in mtu3_device_reset() argument
147 void __iomem *ibase = mtu->ippc_base; in mtu3_device_reset()
154 static void mtu3_intr_status_clear(struct mtu3 *mtu) in mtu3_intr_status_clear() argument
156 void __iomem *mbase = mtu->mac_base; in mtu3_intr_status_clear()
171 static void mtu3_intr_disable(struct mtu3 *mtu) in mtu3_intr_disable() argument
174 mtu3_writel(mtu->mac_base, U3D_LV1IECR, ~0x0); in mtu3_intr_disable()
176 mtu3_writel(mtu->mac_base, U3D_EPIECR, ~0x0); in mtu3_intr_disable()
177 mtu3_intr_status_clear(mtu); in mtu3_intr_disable()
181 static void mtu3_intr_enable(struct mtu3 *mtu) in mtu3_intr_enable() argument
183 void __iomem *mbase = mtu->mac_base; in mtu3_intr_enable()
194 if (mtu->is_u3_ip) { in mtu3_intr_enable()
210 void mtu3_set_speed(struct mtu3 *mtu, enum usb_device_speed speed) in mtu3_set_speed() argument
212 void __iomem *mbase = mtu->mac_base; in mtu3_set_speed()
214 if (speed > mtu->max_speed) in mtu3_set_speed()
215 speed = mtu->max_speed; in mtu3_set_speed()
230 mtu3_clrbits(mtu->ippc_base, SSUSB_U3_CTRL(0), in mtu3_set_speed()
234 mtu3_setbits(mtu->ippc_base, SSUSB_U3_CTRL(0), in mtu3_set_speed()
238 dev_err(mtu->dev, "invalid speed: %s\n", in mtu3_set_speed()
243 mtu->speed = speed; in mtu3_set_speed()
244 dev_dbg(mtu->dev, "set speed: %s\n", usb_speed_string(speed)); in mtu3_set_speed()
248 static void mtu3_csr_init(struct mtu3 *mtu) in mtu3_csr_init() argument
250 void __iomem *mbase = mtu->mac_base; in mtu3_csr_init()
252 if (mtu->is_u3_ip) { in mtu3_csr_init()
276 struct mtu3 *mtu = mep->mtu; in mtu3_ep_reset() local
279 mtu3_setbits(mtu->mac_base, U3D_EP_RST, rst_bit); in mtu3_ep_reset()
280 mtu3_clrbits(mtu->mac_base, U3D_EP_RST, rst_bit); in mtu3_ep_reset()
286 struct mtu3 *mtu = mep->mtu; in mtu3_ep_stall_set() local
287 void __iomem *mbase = mtu->mac_base; in mtu3_ep_stall_set()
314 dev_dbg(mtu->dev, "%s: %s\n", mep->name, in mtu3_ep_stall_set()
318 void mtu3_dev_on_off(struct mtu3 *mtu, int is_on) in mtu3_dev_on_off() argument
320 if (mtu->is_u3_ip && mtu->speed >= USB_SPEED_SUPER) in mtu3_dev_on_off()
321 mtu3_ss_func_set(mtu, is_on); in mtu3_dev_on_off()
323 mtu3_hs_softconn_set(mtu, is_on); in mtu3_dev_on_off()
325 dev_info(mtu->dev, "gadget (%s) pullup D%s\n", in mtu3_dev_on_off()
326 usb_speed_string(mtu->speed), is_on ? "+" : "-"); in mtu3_dev_on_off()
329 void mtu3_start(struct mtu3 *mtu) in mtu3_start() argument
331 void __iomem *mbase = mtu->mac_base; in mtu3_start()
333 dev_dbg(mtu->dev, "%s devctl 0x%x\n", __func__, in mtu3_start()
336 mtu3_clrbits(mtu->ippc_base, U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN); in mtu3_start()
338 mtu3_csr_init(mtu); in mtu3_start()
339 mtu3_set_speed(mtu, mtu->speed); in mtu3_start()
342 mtu3_intr_enable(mtu); in mtu3_start()
343 mtu->is_active = 1; in mtu3_start()
345 if (mtu->softconnect) in mtu3_start()
346 mtu3_dev_on_off(mtu, 1); in mtu3_start()
349 void mtu3_stop(struct mtu3 *mtu) in mtu3_stop() argument
351 dev_dbg(mtu->dev, "%s\n", __func__); in mtu3_stop()
353 mtu3_intr_disable(mtu); in mtu3_stop()
355 if (mtu->softconnect) in mtu3_stop()
356 mtu3_dev_on_off(mtu, 0); in mtu3_stop()
358 mtu->is_active = 0; in mtu3_stop()
359 mtu3_setbits(mtu->ippc_base, U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN); in mtu3_stop()
363 int mtu3_config_ep(struct mtu3 *mtu, struct mtu3_ep *mep, in mtu3_config_ep() argument
366 void __iomem *mbase = mtu->mac_base; in mtu3_config_ep()
367 bool gen2cp = mtu->gen2cp; in mtu3_config_ep()
375 dev_err(mtu->dev, "alloc ep fifo failed(%d)\n", mep->maxp); in mtu3_config_ep()
379 dev_dbg(mtu->dev, "%s fifosz: %x(%x/%x)\n", __func__, fifo_sgsz, in mtu3_config_ep()
414 dev_dbg(mtu->dev, "U3D_TX%d CSR0:%#x, CSR1:%#x, CSR2:%#x\n", in mtu3_config_ep()
450 dev_dbg(mtu->dev, "U3D_RX%d CSR0:%#x, CSR1:%#x, CSR2:%#x\n", in mtu3_config_ep()
456 dev_dbg(mtu->dev, "csr0:%#x, csr1:%#x, csr2:%#x\n", csr0, csr1, csr2); in mtu3_config_ep()
457 dev_dbg(mtu->dev, "%s: %s, fifo-addr:%#x, fifo-size:%#x(%#x/%#x)\n", in mtu3_config_ep()
465 void mtu3_deconfig_ep(struct mtu3 *mtu, struct mtu3_ep *mep) in mtu3_deconfig_ep() argument
467 void __iomem *mbase = mtu->mac_base; in mtu3_deconfig_ep()
485 dev_dbg(mtu->dev, "%s: %s\n", __func__, mep->name); in mtu3_deconfig_ep()
500 static void get_ep_fifo_config(struct mtu3 *mtu) in get_ep_fifo_config() argument
506 if (mtu->is_u3_ip) { in get_ep_fifo_config()
507 fifosize = mtu3_readl(mtu->mac_base, U3D_CAP_EPNTXFFSZ); in get_ep_fifo_config()
508 tx_fifo = &mtu->tx_fifo; in get_ep_fifo_config()
513 fifosize = mtu3_readl(mtu->mac_base, U3D_CAP_EPNRXFFSZ); in get_ep_fifo_config()
514 rx_fifo = &mtu->rx_fifo; in get_ep_fifo_config()
518 mtu->slot = MTU3_U3_IP_SLOT_DEFAULT; in get_ep_fifo_config()
520 fifosize = mtu3_readl(mtu->mac_base, U3D_CAP_EPNTXFFSZ); in get_ep_fifo_config()
521 tx_fifo = &mtu->tx_fifo; in get_ep_fifo_config()
526 rx_fifo = &mtu->rx_fifo; in get_ep_fifo_config()
531 mtu->slot = MTU3_U2_IP_SLOT_DEFAULT; in get_ep_fifo_config()
534 dev_dbg(mtu->dev, "%s, TX: base-%d, limit-%d; RX: base-%d, limit-%d\n", in get_ep_fifo_config()
539 void mtu3_ep0_setup(struct mtu3 *mtu) in mtu3_ep0_setup() argument
541 u32 maxpacket = mtu->g.ep0->maxpacket; in mtu3_ep0_setup()
544 dev_dbg(mtu->dev, "%s maxpacket: %d\n", __func__, maxpacket); in mtu3_ep0_setup()
546 csr = mtu3_readl(mtu->mac_base, U3D_EP0CSR); in mtu3_ep0_setup()
550 mtu3_writel(mtu->mac_base, U3D_EP0CSR, csr); in mtu3_ep0_setup()
553 mtu3_writel(mtu->mac_base, U3D_EPIESR, EP0ISR | SETUPENDISR); in mtu3_ep0_setup()
556 static int mtu3_mem_alloc(struct mtu3 *mtu) in mtu3_mem_alloc() argument
558 void __iomem *mbase = mtu->mac_base; in mtu3_mem_alloc()
569 dev_info(mtu->dev, "fifosz/epnum: Tx=%#x/%d, Rx=%#x/%d\n", in mtu3_mem_alloc()
574 mtu->num_eps = min(in_ep_num, out_ep_num) + 1; in mtu3_mem_alloc()
575 ep_array = kcalloc(mtu->num_eps * 2, sizeof(*ep_array), GFP_KERNEL); in mtu3_mem_alloc()
579 mtu->ep_array = ep_array; in mtu3_mem_alloc()
580 mtu->in_eps = ep_array; in mtu3_mem_alloc()
581 mtu->out_eps = &ep_array[mtu->num_eps]; in mtu3_mem_alloc()
583 mtu->ep0 = mtu->in_eps; in mtu3_mem_alloc()
584 mtu->ep0->mtu = mtu; in mtu3_mem_alloc()
585 mtu->ep0->epnum = 0; in mtu3_mem_alloc()
587 for (i = 1; i < mtu->num_eps; i++) { in mtu3_mem_alloc()
588 struct mtu3_ep *mep = mtu->in_eps + i; in mtu3_mem_alloc()
590 mep->fifo = &mtu->tx_fifo; in mtu3_mem_alloc()
591 mep = mtu->out_eps + i; in mtu3_mem_alloc()
592 mep->fifo = &mtu->rx_fifo; in mtu3_mem_alloc()
595 get_ep_fifo_config(mtu); in mtu3_mem_alloc()
597 ret = mtu3_qmu_init(mtu); in mtu3_mem_alloc()
599 kfree(mtu->ep_array); in mtu3_mem_alloc()
604 static void mtu3_mem_free(struct mtu3 *mtu) in mtu3_mem_free() argument
606 mtu3_qmu_exit(mtu); in mtu3_mem_free()
607 kfree(mtu->ep_array); in mtu3_mem_free()
610 static void mtu3_regs_init(struct mtu3 *mtu) in mtu3_regs_init() argument
612 void __iomem *mbase = mtu->mac_base; in mtu3_regs_init()
615 mtu3_intr_disable(mtu); in mtu3_regs_init()
617 mtu3_csr_init(mtu); in mtu3_regs_init()
624 if (mtu->gen2cp) in mtu3_regs_init()
628 static irqreturn_t mtu3_link_isr(struct mtu3 *mtu) in mtu3_link_isr() argument
630 void __iomem *mbase = mtu->mac_base; in mtu3_link_isr()
639 dev_dbg(mtu->dev, "=== LINK[%x] ===\n", link); in mtu3_link_isr()
675 dev_dbg(mtu->dev, "%s: %s\n", __func__, usb_speed_string(udev_speed)); in mtu3_link_isr()
676 mtu3_dbg_trace(mtu->dev, "link speed %s", in mtu3_link_isr()
679 mtu->g.speed = udev_speed; in mtu3_link_isr()
680 mtu->g.ep0->maxpacket = maxpkt; in mtu3_link_isr()
681 mtu->ep0_state = MU3D_EP0_STATE_SETUP; in mtu3_link_isr()
684 mtu3_gadget_disconnect(mtu); in mtu3_link_isr()
686 mtu3_ep0_setup(mtu); in mtu3_link_isr()
691 static irqreturn_t mtu3_u3_ltssm_isr(struct mtu3 *mtu) in mtu3_u3_ltssm_isr() argument
693 void __iomem *mbase = mtu->mac_base; in mtu3_u3_ltssm_isr()
699 dev_dbg(mtu->dev, "=== LTSSM[%x] ===\n", ltssm); in mtu3_u3_ltssm_isr()
703 mtu3_gadget_reset(mtu); in mtu3_u3_ltssm_isr()
706 mtu3_ss_func_set(mtu, false); in mtu3_u3_ltssm_isr()
707 mtu3_gadget_reset(mtu); in mtu3_u3_ltssm_isr()
711 mtu3_ss_func_set(mtu, true); in mtu3_u3_ltssm_isr()
714 mtu3_gadget_resume(mtu); in mtu3_u3_ltssm_isr()
717 mtu3_gadget_suspend(mtu); in mtu3_u3_ltssm_isr()
722 static irqreturn_t mtu3_u2_common_isr(struct mtu3 *mtu) in mtu3_u2_common_isr() argument
724 void __iomem *mbase = mtu->mac_base; in mtu3_u2_common_isr()
730 dev_dbg(mtu->dev, "=== U2COMM[%x] ===\n", u2comm); in mtu3_u2_common_isr()
734 mtu3_gadget_suspend(mtu); in mtu3_u2_common_isr()
737 mtu3_gadget_resume(mtu); in mtu3_u2_common_isr()
740 mtu3_gadget_reset(mtu); in mtu3_u2_common_isr()
747 struct mtu3 *mtu = (struct mtu3 *)data; in mtu3_irq() local
751 spin_lock_irqsave(&mtu->lock, flags); in mtu3_irq()
754 level1 = mtu3_readl(mtu->mac_base, U3D_LV1ISR); in mtu3_irq()
755 level1 &= mtu3_readl(mtu->mac_base, U3D_LV1IER); in mtu3_irq()
758 mtu3_link_isr(mtu); in mtu3_irq()
761 mtu3_u2_common_isr(mtu); in mtu3_irq()
764 mtu3_u3_ltssm_isr(mtu); in mtu3_irq()
767 mtu3_ep0_isr(mtu); in mtu3_irq()
770 mtu3_qmu_isr(mtu); in mtu3_irq()
772 spin_unlock_irqrestore(&mtu->lock, flags); in mtu3_irq()
777 static void mtu3_check_params(struct mtu3 *mtu) in mtu3_check_params() argument
780 switch (mtu->max_speed) { in mtu3_check_params()
787 dev_err(mtu->dev, "invalid max_speed: %s\n", in mtu3_check_params()
788 usb_speed_string(mtu->max_speed)); in mtu3_check_params()
792 mtu->max_speed = USB_SPEED_SUPER_PLUS; in mtu3_check_params()
796 if (!mtu->is_u3_ip && (mtu->max_speed > USB_SPEED_HIGH)) in mtu3_check_params()
797 mtu->max_speed = USB_SPEED_HIGH; in mtu3_check_params()
799 mtu->speed = mtu->max_speed; in mtu3_check_params()
801 dev_info(mtu->dev, "max_speed: %s\n", in mtu3_check_params()
802 usb_speed_string(mtu->max_speed)); in mtu3_check_params()
805 static int mtu3_hw_init(struct mtu3 *mtu) in mtu3_hw_init() argument
810 value = mtu3_readl(mtu->ippc_base, U3D_SSUSB_IP_TRUNK_VERS); in mtu3_hw_init()
811 mtu->hw_version = IP_TRUNK_VERS(value); in mtu3_hw_init()
812 mtu->gen2cp = !!(mtu->hw_version >= MTU3_TRUNK_VERS_1003); in mtu3_hw_init()
814 value = mtu3_readl(mtu->ippc_base, U3D_SSUSB_IP_DEV_CAP); in mtu3_hw_init()
815 mtu->is_u3_ip = !!SSUSB_IP_DEV_U3_PORT_NUM(value); in mtu3_hw_init()
817 dev_info(mtu->dev, "IP version 0x%x(%s IP)\n", mtu->hw_version, in mtu3_hw_init()
818 mtu->is_u3_ip ? "U3" : "U2"); in mtu3_hw_init()
820 mtu3_check_params(mtu); in mtu3_hw_init()
822 mtu3_device_reset(mtu); in mtu3_hw_init()
824 ret = mtu3_device_enable(mtu); in mtu3_hw_init()
826 dev_err(mtu->dev, "device enable failed %d\n", ret); in mtu3_hw_init()
830 ret = mtu3_mem_alloc(mtu); in mtu3_hw_init()
834 mtu3_regs_init(mtu); in mtu3_hw_init()
839 static void mtu3_hw_exit(struct mtu3 *mtu) in mtu3_hw_exit() argument
841 mtu3_device_disable(mtu); in mtu3_hw_exit()
842 mtu3_mem_free(mtu); in mtu3_hw_exit()
849 static int mtu3_set_dma_mask(struct mtu3 *mtu) in mtu3_set_dma_mask() argument
851 struct device *dev = mtu->dev; in mtu3_set_dma_mask()
856 value = mtu3_readl(mtu->mac_base, U3D_MISC_CTRL); in mtu3_set_dma_mask()
875 struct mtu3 *mtu = NULL; in ssusb_gadget_init() local
878 mtu = devm_kzalloc(dev, sizeof(struct mtu3), GFP_KERNEL); in ssusb_gadget_init()
879 if (mtu == NULL) in ssusb_gadget_init()
882 mtu->irq = platform_get_irq(pdev, 0); in ssusb_gadget_init()
883 if (mtu->irq < 0) in ssusb_gadget_init()
884 return mtu->irq; in ssusb_gadget_init()
885 dev_info(dev, "irq %d\n", mtu->irq); in ssusb_gadget_init()
887 mtu->mac_base = devm_platform_ioremap_resource_byname(pdev, "mac"); in ssusb_gadget_init()
888 if (IS_ERR(mtu->mac_base)) { in ssusb_gadget_init()
890 return PTR_ERR(mtu->mac_base); in ssusb_gadget_init()
893 spin_lock_init(&mtu->lock); in ssusb_gadget_init()
894 mtu->dev = dev; in ssusb_gadget_init()
895 mtu->ippc_base = ssusb->ippc_base; in ssusb_gadget_init()
896 ssusb->mac_base = mtu->mac_base; in ssusb_gadget_init()
897 ssusb->u3d = mtu; in ssusb_gadget_init()
898 mtu->ssusb = ssusb; in ssusb_gadget_init()
899 mtu->max_speed = usb_get_maximum_speed(dev); in ssusb_gadget_init()
902 mtu->mac_base, mtu->ippc_base); in ssusb_gadget_init()
904 ret = mtu3_hw_init(mtu); in ssusb_gadget_init()
910 ret = mtu3_set_dma_mask(mtu); in ssusb_gadget_init()
916 ret = devm_request_irq(dev, mtu->irq, mtu3_irq, 0, dev_name(dev), mtu); in ssusb_gadget_init()
918 dev_err(dev, "request irq %d failed!\n", mtu->irq); in ssusb_gadget_init()
924 ret = mtu3_gadget_setup(mtu); in ssusb_gadget_init()
931 if (mtu->ssusb->dr_mode == USB_DR_MODE_OTG) in ssusb_gadget_init()
932 mtu3_stop(mtu); in ssusb_gadget_init()
945 mtu3_hw_exit(mtu); in ssusb_gadget_init()
954 struct mtu3 *mtu = ssusb->u3d; in ssusb_gadget_exit() local
956 mtu3_gadget_cleanup(mtu); in ssusb_gadget_exit()
958 mtu3_hw_exit(mtu); in ssusb_gadget_exit()