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()
141 static void mtu3_device_reset(struct mtu3 *mtu) in mtu3_device_reset() argument
143 void __iomem *ibase = mtu->ippc_base; in mtu3_device_reset()
151 static void mtu3_intr_disable(struct mtu3 *mtu) in mtu3_intr_disable() argument
153 void __iomem *mbase = mtu->mac_base; in mtu3_intr_disable()
161 static void mtu3_intr_status_clear(struct mtu3 *mtu) in mtu3_intr_status_clear() argument
163 void __iomem *mbase = mtu->mac_base; in mtu3_intr_status_clear()
176 static void mtu3_intr_enable(struct mtu3 *mtu) in mtu3_intr_enable() argument
178 void __iomem *mbase = mtu->mac_base; in mtu3_intr_enable()
189 if (mtu->is_u3_ip) { in mtu3_intr_enable()
208 struct mtu3 *mtu = mep->mtu; in mtu3_ep_reset() local
211 mtu3_setbits(mtu->mac_base, U3D_EP_RST, rst_bit); in mtu3_ep_reset()
212 mtu3_clrbits(mtu->mac_base, U3D_EP_RST, rst_bit); in mtu3_ep_reset()
218 struct mtu3 *mtu = mep->mtu; in mtu3_ep_stall_set() local
219 void __iomem *mbase = mtu->mac_base; in mtu3_ep_stall_set()
246 dev_dbg(mtu->dev, "%s: %s\n", mep->name, in mtu3_ep_stall_set()
250 void mtu3_dev_on_off(struct mtu3 *mtu, int is_on) in mtu3_dev_on_off() argument
252 if (mtu->is_u3_ip && mtu->max_speed >= USB_SPEED_SUPER) in mtu3_dev_on_off()
253 mtu3_ss_func_set(mtu, is_on); in mtu3_dev_on_off()
255 mtu3_hs_softconn_set(mtu, is_on); in mtu3_dev_on_off()
257 dev_info(mtu->dev, "gadget (%s) pullup D%s\n", in mtu3_dev_on_off()
258 usb_speed_string(mtu->max_speed), is_on ? "+" : "-"); in mtu3_dev_on_off()
261 void mtu3_start(struct mtu3 *mtu) in mtu3_start() argument
263 void __iomem *mbase = mtu->mac_base; in mtu3_start()
265 dev_dbg(mtu->dev, "%s devctl 0x%x\n", __func__, in mtu3_start()
268 mtu3_clrbits(mtu->ippc_base, U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN); in mtu3_start()
275 if (mtu->max_speed == USB_SPEED_FULL) in mtu3_start()
279 mtu3_intr_enable(mtu); in mtu3_start()
280 mtu->is_active = 1; in mtu3_start()
282 if (mtu->softconnect) in mtu3_start()
283 mtu3_dev_on_off(mtu, 1); in mtu3_start()
286 void mtu3_stop(struct mtu3 *mtu) in mtu3_stop() argument
288 dev_dbg(mtu->dev, "%s\n", __func__); in mtu3_stop()
290 mtu3_intr_disable(mtu); in mtu3_stop()
291 mtu3_intr_status_clear(mtu); in mtu3_stop()
293 if (mtu->softconnect) in mtu3_stop()
294 mtu3_dev_on_off(mtu, 0); in mtu3_stop()
296 mtu->is_active = 0; in mtu3_stop()
297 mtu3_setbits(mtu->ippc_base, U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN); in mtu3_stop()
301 int mtu3_config_ep(struct mtu3 *mtu, struct mtu3_ep *mep, in mtu3_config_ep() argument
304 void __iomem *mbase = mtu->mac_base; in mtu3_config_ep()
305 bool gen2cp = mtu->gen2cp; in mtu3_config_ep()
313 dev_err(mtu->dev, "alloc ep fifo failed(%d)\n", mep->maxp); in mtu3_config_ep()
317 dev_dbg(mtu->dev, "%s fifosz: %x(%x/%x)\n", __func__, fifo_sgsz, in mtu3_config_ep()
352 dev_dbg(mtu->dev, "U3D_TX%d CSR0:%#x, CSR1:%#x, CSR2:%#x\n", in mtu3_config_ep()
388 dev_dbg(mtu->dev, "U3D_RX%d CSR0:%#x, CSR1:%#x, CSR2:%#x\n", in mtu3_config_ep()
394 dev_dbg(mtu->dev, "csr0:%#x, csr1:%#x, csr2:%#x\n", csr0, csr1, csr2); in mtu3_config_ep()
395 dev_dbg(mtu->dev, "%s: %s, fifo-addr:%#x, fifo-size:%#x(%#x/%#x)\n", in mtu3_config_ep()
403 void mtu3_deconfig_ep(struct mtu3 *mtu, struct mtu3_ep *mep) in mtu3_deconfig_ep() argument
405 void __iomem *mbase = mtu->mac_base; in mtu3_deconfig_ep()
423 dev_dbg(mtu->dev, "%s: %s\n", __func__, mep->name); in mtu3_deconfig_ep()
438 static void get_ep_fifo_config(struct mtu3 *mtu) in get_ep_fifo_config() argument
444 if (mtu->is_u3_ip) { in get_ep_fifo_config()
445 fifosize = mtu3_readl(mtu->mac_base, U3D_CAP_EPNTXFFSZ); in get_ep_fifo_config()
446 tx_fifo = &mtu->tx_fifo; in get_ep_fifo_config()
451 fifosize = mtu3_readl(mtu->mac_base, U3D_CAP_EPNRXFFSZ); in get_ep_fifo_config()
452 rx_fifo = &mtu->rx_fifo; in get_ep_fifo_config()
456 mtu->slot = MTU3_U3_IP_SLOT_DEFAULT; in get_ep_fifo_config()
458 fifosize = mtu3_readl(mtu->mac_base, U3D_CAP_EPNTXFFSZ); in get_ep_fifo_config()
459 tx_fifo = &mtu->tx_fifo; in get_ep_fifo_config()
464 rx_fifo = &mtu->rx_fifo; in get_ep_fifo_config()
469 mtu->slot = MTU3_U2_IP_SLOT_DEFAULT; in get_ep_fifo_config()
472 dev_dbg(mtu->dev, "%s, TX: base-%d, limit-%d; RX: base-%d, limit-%d\n", in get_ep_fifo_config()
477 void mtu3_ep0_setup(struct mtu3 *mtu) in mtu3_ep0_setup() argument
479 u32 maxpacket = mtu->g.ep0->maxpacket; in mtu3_ep0_setup()
482 dev_dbg(mtu->dev, "%s maxpacket: %d\n", __func__, maxpacket); in mtu3_ep0_setup()
484 csr = mtu3_readl(mtu->mac_base, U3D_EP0CSR); in mtu3_ep0_setup()
488 mtu3_writel(mtu->mac_base, U3D_EP0CSR, csr); in mtu3_ep0_setup()
491 mtu3_writel(mtu->mac_base, U3D_EPIESR, EP0ISR | SETUPENDISR); in mtu3_ep0_setup()
494 static int mtu3_mem_alloc(struct mtu3 *mtu) in mtu3_mem_alloc() argument
496 void __iomem *mbase = mtu->mac_base; in mtu3_mem_alloc()
507 dev_info(mtu->dev, "fifosz/epnum: Tx=%#x/%d, Rx=%#x/%d\n", in mtu3_mem_alloc()
512 mtu->num_eps = min(in_ep_num, out_ep_num) + 1; in mtu3_mem_alloc()
513 ep_array = kcalloc(mtu->num_eps * 2, sizeof(*ep_array), GFP_KERNEL); in mtu3_mem_alloc()
517 mtu->ep_array = ep_array; in mtu3_mem_alloc()
518 mtu->in_eps = ep_array; in mtu3_mem_alloc()
519 mtu->out_eps = &ep_array[mtu->num_eps]; in mtu3_mem_alloc()
521 mtu->ep0 = mtu->in_eps; in mtu3_mem_alloc()
522 mtu->ep0->mtu = mtu; in mtu3_mem_alloc()
523 mtu->ep0->epnum = 0; in mtu3_mem_alloc()
525 for (i = 1; i < mtu->num_eps; i++) { in mtu3_mem_alloc()
526 struct mtu3_ep *mep = mtu->in_eps + i; in mtu3_mem_alloc()
528 mep->fifo = &mtu->tx_fifo; in mtu3_mem_alloc()
529 mep = mtu->out_eps + i; in mtu3_mem_alloc()
530 mep->fifo = &mtu->rx_fifo; in mtu3_mem_alloc()
533 get_ep_fifo_config(mtu); in mtu3_mem_alloc()
535 ret = mtu3_qmu_init(mtu); in mtu3_mem_alloc()
537 kfree(mtu->ep_array); in mtu3_mem_alloc()
542 static void mtu3_mem_free(struct mtu3 *mtu) in mtu3_mem_free() argument
544 mtu3_qmu_exit(mtu); in mtu3_mem_free()
545 kfree(mtu->ep_array); in mtu3_mem_free()
548 static void mtu3_set_speed(struct mtu3 *mtu) in mtu3_set_speed() argument
550 void __iomem *mbase = mtu->mac_base; in mtu3_set_speed()
552 if (!mtu->is_u3_ip && (mtu->max_speed > USB_SPEED_HIGH)) in mtu3_set_speed()
553 mtu->max_speed = USB_SPEED_HIGH; in mtu3_set_speed()
555 if (mtu->max_speed == USB_SPEED_FULL) { in mtu3_set_speed()
560 } else if (mtu->max_speed == USB_SPEED_HIGH) { in mtu3_set_speed()
564 } else if (mtu->max_speed == USB_SPEED_SUPER) { in mtu3_set_speed()
565 mtu3_clrbits(mtu->ippc_base, SSUSB_U3_CTRL(0), in mtu3_set_speed()
569 dev_info(mtu->dev, "max_speed: %s\n", in mtu3_set_speed()
570 usb_speed_string(mtu->max_speed)); in mtu3_set_speed()
573 static void mtu3_regs_init(struct mtu3 *mtu) in mtu3_regs_init() argument
576 void __iomem *mbase = mtu->mac_base; in mtu3_regs_init()
579 mtu3_intr_disable(mtu); in mtu3_regs_init()
580 mtu3_intr_status_clear(mtu); in mtu3_regs_init()
582 if (mtu->is_u3_ip) { in mtu3_regs_init()
597 mtu3_set_speed(mtu); in mtu3_regs_init()
609 if (mtu->gen2cp) in mtu3_regs_init()
613 static irqreturn_t mtu3_link_isr(struct mtu3 *mtu) in mtu3_link_isr() argument
615 void __iomem *mbase = mtu->mac_base; in mtu3_link_isr()
624 dev_dbg(mtu->dev, "=== LINK[%x] ===\n", link); in mtu3_link_isr()
660 dev_dbg(mtu->dev, "%s: %s\n", __func__, usb_speed_string(udev_speed)); in mtu3_link_isr()
661 mtu3_dbg_trace(mtu->dev, "link speed %s", in mtu3_link_isr()
664 mtu->g.speed = udev_speed; in mtu3_link_isr()
665 mtu->g.ep0->maxpacket = maxpkt; in mtu3_link_isr()
666 mtu->ep0_state = MU3D_EP0_STATE_SETUP; in mtu3_link_isr()
669 mtu3_gadget_disconnect(mtu); in mtu3_link_isr()
671 mtu3_ep0_setup(mtu); in mtu3_link_isr()
676 static irqreturn_t mtu3_u3_ltssm_isr(struct mtu3 *mtu) in mtu3_u3_ltssm_isr() argument
678 void __iomem *mbase = mtu->mac_base; in mtu3_u3_ltssm_isr()
684 dev_dbg(mtu->dev, "=== LTSSM[%x] ===\n", ltssm); in mtu3_u3_ltssm_isr()
688 mtu3_gadget_reset(mtu); in mtu3_u3_ltssm_isr()
691 mtu3_ss_func_set(mtu, false); in mtu3_u3_ltssm_isr()
692 mtu3_gadget_reset(mtu); in mtu3_u3_ltssm_isr()
696 mtu3_ss_func_set(mtu, true); in mtu3_u3_ltssm_isr()
699 mtu3_gadget_resume(mtu); in mtu3_u3_ltssm_isr()
702 mtu3_gadget_suspend(mtu); in mtu3_u3_ltssm_isr()
707 static irqreturn_t mtu3_u2_common_isr(struct mtu3 *mtu) in mtu3_u2_common_isr() argument
709 void __iomem *mbase = mtu->mac_base; in mtu3_u2_common_isr()
715 dev_dbg(mtu->dev, "=== U2COMM[%x] ===\n", u2comm); in mtu3_u2_common_isr()
719 mtu3_gadget_suspend(mtu); in mtu3_u2_common_isr()
722 mtu3_gadget_resume(mtu); in mtu3_u2_common_isr()
725 mtu3_gadget_reset(mtu); in mtu3_u2_common_isr()
732 struct mtu3 *mtu = (struct mtu3 *)data; in mtu3_irq() local
736 spin_lock_irqsave(&mtu->lock, flags); in mtu3_irq()
739 level1 = mtu3_readl(mtu->mac_base, U3D_LV1ISR); in mtu3_irq()
740 level1 &= mtu3_readl(mtu->mac_base, U3D_LV1IER); in mtu3_irq()
743 mtu3_link_isr(mtu); in mtu3_irq()
746 mtu3_u2_common_isr(mtu); in mtu3_irq()
749 mtu3_u3_ltssm_isr(mtu); in mtu3_irq()
752 mtu3_ep0_isr(mtu); in mtu3_irq()
755 mtu3_qmu_isr(mtu); in mtu3_irq()
757 spin_unlock_irqrestore(&mtu->lock, flags); in mtu3_irq()
762 static int mtu3_hw_init(struct mtu3 *mtu) in mtu3_hw_init() argument
767 value = mtu3_readl(mtu->ippc_base, U3D_SSUSB_IP_TRUNK_VERS); in mtu3_hw_init()
768 mtu->hw_version = IP_TRUNK_VERS(value); in mtu3_hw_init()
769 mtu->gen2cp = !!(mtu->hw_version >= MTU3_TRUNK_VERS_1003); in mtu3_hw_init()
771 value = mtu3_readl(mtu->ippc_base, U3D_SSUSB_IP_DEV_CAP); in mtu3_hw_init()
772 mtu->is_u3_ip = !!SSUSB_IP_DEV_U3_PORT_NUM(value); in mtu3_hw_init()
774 dev_info(mtu->dev, "IP version 0x%x(%s IP)\n", mtu->hw_version, in mtu3_hw_init()
775 mtu->is_u3_ip ? "U3" : "U2"); in mtu3_hw_init()
777 mtu3_device_reset(mtu); in mtu3_hw_init()
779 ret = mtu3_device_enable(mtu); in mtu3_hw_init()
781 dev_err(mtu->dev, "device enable failed %d\n", ret); in mtu3_hw_init()
785 ret = mtu3_mem_alloc(mtu); in mtu3_hw_init()
789 mtu3_regs_init(mtu); in mtu3_hw_init()
794 static void mtu3_hw_exit(struct mtu3 *mtu) in mtu3_hw_exit() argument
796 mtu3_device_disable(mtu); in mtu3_hw_exit()
797 mtu3_mem_free(mtu); in mtu3_hw_exit()
804 static int mtu3_set_dma_mask(struct mtu3 *mtu) in mtu3_set_dma_mask() argument
806 struct device *dev = mtu->dev; in mtu3_set_dma_mask()
811 value = mtu3_readl(mtu->mac_base, U3D_MISC_CTRL); in mtu3_set_dma_mask()
830 struct mtu3 *mtu = NULL; in ssusb_gadget_init() local
834 mtu = devm_kzalloc(dev, sizeof(struct mtu3), GFP_KERNEL); in ssusb_gadget_init()
835 if (mtu == NULL) in ssusb_gadget_init()
838 mtu->irq = platform_get_irq(pdev, 0); in ssusb_gadget_init()
839 if (mtu->irq < 0) in ssusb_gadget_init()
840 return mtu->irq; in ssusb_gadget_init()
841 dev_info(dev, "irq %d\n", mtu->irq); in ssusb_gadget_init()
844 mtu->mac_base = devm_ioremap_resource(dev, res); in ssusb_gadget_init()
845 if (IS_ERR(mtu->mac_base)) { in ssusb_gadget_init()
847 return PTR_ERR(mtu->mac_base); in ssusb_gadget_init()
850 spin_lock_init(&mtu->lock); in ssusb_gadget_init()
851 mtu->dev = dev; in ssusb_gadget_init()
852 mtu->ippc_base = ssusb->ippc_base; in ssusb_gadget_init()
853 ssusb->mac_base = mtu->mac_base; in ssusb_gadget_init()
854 ssusb->u3d = mtu; in ssusb_gadget_init()
855 mtu->ssusb = ssusb; in ssusb_gadget_init()
856 mtu->max_speed = usb_get_maximum_speed(dev); in ssusb_gadget_init()
859 switch (mtu->max_speed) { in ssusb_gadget_init()
867 usb_speed_string(mtu->max_speed)); in ssusb_gadget_init()
871 mtu->max_speed = USB_SPEED_SUPER_PLUS; in ssusb_gadget_init()
876 mtu->mac_base, mtu->ippc_base); in ssusb_gadget_init()
878 ret = mtu3_hw_init(mtu); in ssusb_gadget_init()
884 ret = mtu3_set_dma_mask(mtu); in ssusb_gadget_init()
890 ret = devm_request_irq(dev, mtu->irq, mtu3_irq, 0, dev_name(dev), mtu); in ssusb_gadget_init()
892 dev_err(dev, "request irq %d failed!\n", mtu->irq); in ssusb_gadget_init()
898 ret = mtu3_gadget_setup(mtu); in ssusb_gadget_init()
905 if (mtu->ssusb->dr_mode == USB_DR_MODE_OTG) in ssusb_gadget_init()
906 mtu3_stop(mtu); in ssusb_gadget_init()
919 mtu3_hw_exit(mtu); in ssusb_gadget_init()
928 struct mtu3 *mtu = ssusb->u3d; in ssusb_gadget_exit() local
930 mtu3_gadget_cleanup(mtu); in ssusb_gadget_exit()
932 mtu3_hw_exit(mtu); in ssusb_gadget_exit()