Lines Matching refs:mtu

45 	dev_dbg(mep->mtu->dev, "%s fifo:%#x/%#x, start_bit: %d\n",
66 dev_dbg(mep->mtu->dev, "%s size:%#x/%#x, start_bit: %d\n",
71 static inline void mtu3_ss_func_set(struct mtu3 *mtu, bool enable)
75 mtu3_setbits(mtu->mac_base, U3D_USB3_CONFIG, USB3_EN);
77 mtu3_clrbits(mtu->mac_base, U3D_USB3_CONFIG, USB3_EN);
79 dev_dbg(mtu->dev, "USB3_EN = %d\n", !!enable);
83 static inline void mtu3_hs_softconn_set(struct mtu3 *mtu, bool enable)
86 mtu3_setbits(mtu->mac_base, U3D_POWER_MANAGEMENT,
89 mtu3_clrbits(mtu->mac_base, U3D_POWER_MANAGEMENT,
92 dev_dbg(mtu->dev, "SOFTCONN = %d\n", !!enable);
96 static int mtu3_device_enable(struct mtu3 *mtu)
98 void __iomem *ibase = mtu->ippc_base;
103 if (mtu->u3_capable) {
113 if (mtu->ssusb->dr_mode == USB_DR_MODE_OTG) {
115 if (mtu->u3_capable)
120 return ssusb_check_clocks(mtu->ssusb, check_clk);
123 static void mtu3_device_disable(struct mtu3 *mtu)
125 void __iomem *ibase = mtu->ippc_base;
127 if (mtu->u3_capable)
134 if (mtu->ssusb->dr_mode == USB_DR_MODE_OTG) {
136 if (mtu->u3_capable)
144 static void mtu3_dev_power_on(struct mtu3 *mtu)
146 void __iomem *ibase = mtu->ippc_base;
149 if (mtu->u3_capable)
155 static void mtu3_dev_power_down(struct mtu3 *mtu)
157 void __iomem *ibase = mtu->ippc_base;
159 if (mtu->u3_capable)
167 static void mtu3_device_reset(struct mtu3 *mtu)
169 void __iomem *ibase = mtu->ippc_base;
176 static void mtu3_intr_status_clear(struct mtu3 *mtu)
178 void __iomem *mbase = mtu->mac_base;
193 static void mtu3_intr_disable(struct mtu3 *mtu)
196 mtu3_writel(mtu->mac_base, U3D_LV1IECR, ~0x0);
198 mtu3_writel(mtu->mac_base, U3D_EPIECR, ~0x0);
199 mtu3_intr_status_clear(mtu);
203 static void mtu3_intr_enable(struct mtu3 *mtu)
205 void __iomem *mbase = mtu->mac_base;
216 if (mtu->u3_capable) {
232 static void mtu3_set_speed(struct mtu3 *mtu, enum usb_device_speed speed)
234 void __iomem *mbase = mtu->mac_base;
236 if (speed > mtu->max_speed)
237 speed = mtu->max_speed;
253 mtu3_clrbits(mtu->ippc_base, SSUSB_U3_CTRL(0),
258 mtu3_setbits(mtu->ippc_base, SSUSB_U3_CTRL(0),
262 dev_err(mtu->dev, "invalid speed: %s\n",
267 mtu->speed = speed;
268 dev_dbg(mtu->dev, "set speed: %s\n", usb_speed_string(speed));
272 static void mtu3_csr_init(struct mtu3 *mtu)
274 void __iomem *mbase = mtu->mac_base;
276 if (mtu->u3_capable) {
300 struct mtu3 *mtu = mep->mtu;
303 mtu3_setbits(mtu->mac_base, U3D_EP_RST, rst_bit);
304 mtu3_clrbits(mtu->mac_base, U3D_EP_RST, rst_bit);
310 struct mtu3 *mtu = mep->mtu;
311 void __iomem *mbase = mtu->mac_base;
338 dev_dbg(mtu->dev, "%s: %s\n", mep->name,
342 void mtu3_dev_on_off(struct mtu3 *mtu, int is_on)
344 if (mtu->u3_capable && mtu->speed >= USB_SPEED_SUPER)
345 mtu3_ss_func_set(mtu, is_on);
347 mtu3_hs_softconn_set(mtu, is_on);
349 dev_info(mtu->dev, "gadget (%s) pullup D%s\n",
350 usb_speed_string(mtu->speed), is_on ? "+" : "-");
353 void mtu3_start(struct mtu3 *mtu)
355 void __iomem *mbase = mtu->mac_base;
357 dev_dbg(mtu->dev, "%s devctl 0x%x\n", __func__,
360 mtu3_dev_power_on(mtu);
361 mtu3_csr_init(mtu);
362 mtu3_set_speed(mtu, mtu->speed);
365 mtu3_intr_enable(mtu);
366 mtu->is_active = 1;
368 if (mtu->softconnect)
369 mtu3_dev_on_off(mtu, 1);
372 void mtu3_stop(struct mtu3 *mtu)
374 dev_dbg(mtu->dev, "%s\n", __func__);
376 mtu3_intr_disable(mtu);
378 if (mtu->softconnect)
379 mtu3_dev_on_off(mtu, 0);
381 mtu->is_active = 0;
382 mtu3_dev_power_down(mtu);
385 static void mtu3_dev_suspend(struct mtu3 *mtu)
387 if (!mtu->is_active)
390 mtu3_intr_disable(mtu);
391 mtu3_dev_power_down(mtu);
394 static void mtu3_dev_resume(struct mtu3 *mtu)
396 if (!mtu->is_active)
399 mtu3_dev_power_on(mtu);
400 mtu3_intr_enable(mtu);
404 int mtu3_config_ep(struct mtu3 *mtu, struct mtu3_ep *mep,
407 void __iomem *mbase = mtu->mac_base;
408 bool gen2cp = mtu->gen2cp;
416 dev_err(mtu->dev, "alloc ep fifo failed(%d)\n", mep->maxp);
420 dev_dbg(mtu->dev, "%s fifosz: %x(%x/%x)\n", __func__, fifo_sgsz,
455 dev_dbg(mtu->dev, "U3D_TX%d CSR0:%#x, CSR1:%#x, CSR2:%#x\n",
491 dev_dbg(mtu->dev, "U3D_RX%d CSR0:%#x, CSR1:%#x, CSR2:%#x\n",
497 dev_dbg(mtu->dev, "csr0:%#x, csr1:%#x, csr2:%#x\n", csr0, csr1, csr2);
498 dev_dbg(mtu->dev, "%s: %s, fifo-addr:%#x, fifo-size:%#x(%#x/%#x)\n",
506 void mtu3_deconfig_ep(struct mtu3 *mtu, struct mtu3_ep *mep)
508 void __iomem *mbase = mtu->mac_base;
526 dev_dbg(mtu->dev, "%s: %s\n", __func__, mep->name);
541 static void get_ep_fifo_config(struct mtu3 *mtu)
547 if (mtu->separate_fifo) {
548 fifosize = mtu3_readl(mtu->mac_base, U3D_CAP_EPNTXFFSZ);
549 tx_fifo = &mtu->tx_fifo;
554 fifosize = mtu3_readl(mtu->mac_base, U3D_CAP_EPNRXFFSZ);
555 rx_fifo = &mtu->rx_fifo;
559 mtu->slot = MTU3_U3_IP_SLOT_DEFAULT;
561 fifosize = mtu3_readl(mtu->mac_base, U3D_CAP_EPNTXFFSZ);
562 tx_fifo = &mtu->tx_fifo;
567 rx_fifo = &mtu->rx_fifo;
572 mtu->slot = MTU3_U2_IP_SLOT_DEFAULT;
575 dev_dbg(mtu->dev, "%s, TX: base-%d, limit-%d; RX: base-%d, limit-%d\n",
580 static void mtu3_ep0_setup(struct mtu3 *mtu)
582 u32 maxpacket = mtu->g.ep0->maxpacket;
585 dev_dbg(mtu->dev, "%s maxpacket: %d\n", __func__, maxpacket);
587 csr = mtu3_readl(mtu->mac_base, U3D_EP0CSR);
591 mtu3_writel(mtu->mac_base, U3D_EP0CSR, csr);
594 mtu3_writel(mtu->mac_base, U3D_EPIESR, EP0ISR | SETUPENDISR);
597 static int mtu3_mem_alloc(struct mtu3 *mtu)
599 void __iomem *mbase = mtu->mac_base;
610 dev_info(mtu->dev, "fifosz/epnum: Tx=%#x/%d, Rx=%#x/%d\n",
615 mtu->num_eps = min(in_ep_num, out_ep_num) + 1;
616 ep_array = kcalloc(mtu->num_eps * 2, sizeof(*ep_array), GFP_KERNEL);
620 mtu->ep_array = ep_array;
621 mtu->in_eps = ep_array;
622 mtu->out_eps = &ep_array[mtu->num_eps];
624 mtu->ep0 = mtu->in_eps;
625 mtu->ep0->mtu = mtu;
626 mtu->ep0->epnum = 0;
628 for (i = 1; i < mtu->num_eps; i++) {
629 struct mtu3_ep *mep = mtu->in_eps + i;
631 mep->fifo = &mtu->tx_fifo;
632 mep = mtu->out_eps + i;
633 mep->fifo = &mtu->rx_fifo;
636 get_ep_fifo_config(mtu);
638 ret = mtu3_qmu_init(mtu);
640 kfree(mtu->ep_array);
645 static void mtu3_mem_free(struct mtu3 *mtu)
647 mtu3_qmu_exit(mtu);
648 kfree(mtu->ep_array);
651 static void mtu3_regs_init(struct mtu3 *mtu)
653 void __iomem *mbase = mtu->mac_base;
656 mtu3_intr_disable(mtu);
658 mtu3_csr_init(mtu);
665 if (mtu->gen2cp)
669 static irqreturn_t mtu3_link_isr(struct mtu3 *mtu)
671 void __iomem *mbase = mtu->mac_base;
680 dev_dbg(mtu->dev, "=== LINK[%x] ===\n", link);
716 dev_dbg(mtu->dev, "%s: %s\n", __func__, usb_speed_string(udev_speed));
717 mtu3_dbg_trace(mtu->dev, "link speed %s",
720 mtu->g.speed = udev_speed;
721 mtu->g.ep0->maxpacket = maxpkt;
722 mtu->ep0_state = MU3D_EP0_STATE_SETUP;
723 mtu->connected = !!(udev_speed != USB_SPEED_UNKNOWN);
726 mtu3_gadget_disconnect(mtu);
727 pm_runtime_put(mtu->dev);
729 pm_runtime_get(mtu->dev);
730 mtu3_ep0_setup(mtu);
736 static irqreturn_t mtu3_u3_ltssm_isr(struct mtu3 *mtu)
738 void __iomem *mbase = mtu->mac_base;
744 dev_dbg(mtu->dev, "=== LTSSM[%x] ===\n", ltssm);
748 mtu3_gadget_reset(mtu);
751 mtu3_ss_func_set(mtu, false);
752 mtu3_gadget_reset(mtu);
756 mtu3_ss_func_set(mtu, true);
759 mtu3_gadget_resume(mtu);
762 mtu3_gadget_suspend(mtu);
767 static irqreturn_t mtu3_u2_common_isr(struct mtu3 *mtu)
769 void __iomem *mbase = mtu->mac_base;
775 dev_dbg(mtu->dev, "=== U2COMM[%x] ===\n", u2comm);
779 mtu3_gadget_suspend(mtu);
782 mtu3_gadget_resume(mtu);
785 mtu3_gadget_reset(mtu);
792 struct mtu3 *mtu = (struct mtu3 *)data;
796 spin_lock_irqsave(&mtu->lock, flags);
799 level1 = mtu3_readl(mtu->mac_base, U3D_LV1ISR);
800 level1 &= mtu3_readl(mtu->mac_base, U3D_LV1IER);
803 mtu3_link_isr(mtu);
806 mtu3_u2_common_isr(mtu);
809 mtu3_u3_ltssm_isr(mtu);
812 mtu3_ep0_isr(mtu);
815 mtu3_qmu_isr(mtu);
817 spin_unlock_irqrestore(&mtu->lock, flags);
822 static void mtu3_check_params(struct mtu3 *mtu)
825 if (mtu->u3_capable && (mtu->ssusb->u3p_dis_msk & BIT(0)))
826 mtu->u3_capable = 0;
829 switch (mtu->max_speed) {
836 dev_err(mtu->dev, "invalid max_speed: %s\n",
837 usb_speed_string(mtu->max_speed));
841 mtu->max_speed = USB_SPEED_SUPER_PLUS;
845 if (!mtu->u3_capable && (mtu->max_speed > USB_SPEED_HIGH))
846 mtu->max_speed = USB_SPEED_HIGH;
848 mtu->speed = mtu->max_speed;
850 dev_info(mtu->dev, "max_speed: %s\n",
851 usb_speed_string(mtu->max_speed));
854 static int mtu3_hw_init(struct mtu3 *mtu)
859 value = mtu3_readl(mtu->ippc_base, U3D_SSUSB_IP_TRUNK_VERS);
860 mtu->hw_version = IP_TRUNK_VERS(value);
861 mtu->gen2cp = !!(mtu->hw_version >= MTU3_TRUNK_VERS_1003);
863 value = mtu3_readl(mtu->ippc_base, U3D_SSUSB_IP_DEV_CAP);
864 mtu->u3_capable = !!SSUSB_IP_DEV_U3_PORT_NUM(value);
866 mtu->separate_fifo = mtu->u3_capable;
868 dev_info(mtu->dev, "IP version 0x%x(%s IP)\n", mtu->hw_version,
869 mtu->u3_capable ? "U3" : "U2");
871 mtu3_check_params(mtu);
873 mtu3_device_reset(mtu);
875 ret = mtu3_device_enable(mtu);
877 dev_err(mtu->dev, "device enable failed %d\n", ret);
881 ret = mtu3_mem_alloc(mtu);
885 mtu3_regs_init(mtu);
890 static void mtu3_hw_exit(struct mtu3 *mtu)
892 mtu3_device_disable(mtu);
893 mtu3_mem_free(mtu);
900 static int mtu3_set_dma_mask(struct mtu3 *mtu)
902 struct device *dev = mtu->dev;
907 value = mtu3_readl(mtu->mac_base, U3D_MISC_CTRL);
926 struct mtu3 *mtu = NULL;
929 mtu = devm_kzalloc(dev, sizeof(struct mtu3), GFP_KERNEL);
930 if (mtu == NULL)
933 mtu->irq = platform_get_irq_byname_optional(pdev, "device");
934 if (mtu->irq < 0) {
935 if (mtu->irq == -EPROBE_DEFER)
936 return mtu->irq;
939 mtu->irq = platform_get_irq(pdev, 0);
940 if (mtu->irq < 0)
941 return mtu->irq;
943 dev_info(dev, "irq %d\n", mtu->irq);
945 mtu->mac_base = devm_platform_ioremap_resource_byname(pdev, "mac");
946 if (IS_ERR(mtu->mac_base)) {
948 return PTR_ERR(mtu->mac_base);
951 spin_lock_init(&mtu->lock);
952 mtu->dev = dev;
953 mtu->ippc_base = ssusb->ippc_base;
954 ssusb->mac_base = mtu->mac_base;
955 ssusb->u3d = mtu;
956 mtu->ssusb = ssusb;
957 mtu->max_speed = usb_get_maximum_speed(dev);
960 mtu->mac_base, mtu->ippc_base);
962 ret = mtu3_hw_init(mtu);
968 ret = mtu3_set_dma_mask(mtu);
974 ret = devm_request_threaded_irq(dev, mtu->irq, NULL, mtu3_irq,
975 IRQF_ONESHOT, dev_name(dev), mtu);
977 dev_err(dev, "request irq %d failed!\n", mtu->irq);
982 mtu3_stop(mtu);
984 ret = mtu3_gadget_setup(mtu);
1001 mtu3_hw_exit(mtu);
1010 struct mtu3 *mtu = ssusb->u3d;
1012 mtu3_gadget_cleanup(mtu);
1014 mtu3_hw_exit(mtu);
1019 struct mtu3 *mtu = ssusb->u3d;
1022 if (!mtu)
1026 if (mtu->is_active && mtu->softconnect)
1035 struct mtu3 *mtu = ssusb->u3d;
1037 if (!mtu->gadget_driver)
1040 if (mtu->connected)
1043 mtu3_dev_suspend(mtu);
1044 synchronize_irq(mtu->irq);
1051 struct mtu3 *mtu = ssusb->u3d;
1053 if (!mtu->gadget_driver)
1056 mtu3_dev_resume(mtu);