aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/mtu3/mtu3_core.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/mtu3/mtu3_core.c')
-rw-r--r--drivers/usb/mtu3/mtu3_core.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/drivers/usb/mtu3/mtu3_core.c b/drivers/usb/mtu3/mtu3_core.c
index 4fee200795a5..f8bd1d57e795 100644
--- a/drivers/usb/mtu3/mtu3_core.c
+++ b/drivers/usb/mtu3/mtu3_core.c
@@ -16,6 +16,8 @@
16#include <linux/platform_device.h> 16#include <linux/platform_device.h>
17 17
18#include "mtu3.h" 18#include "mtu3.h"
19#include "mtu3_debug.h"
20#include "mtu3_trace.h"
19 21
20static int ep_fifo_alloc(struct mtu3_ep *mep, u32 seg_size) 22static int ep_fifo_alloc(struct mtu3_ep *mep, u32 seg_size)
21{ 23{
@@ -299,6 +301,7 @@ int mtu3_config_ep(struct mtu3 *mtu, struct mtu3_ep *mep,
299 int interval, int burst, int mult) 301 int interval, int burst, int mult)
300{ 302{
301 void __iomem *mbase = mtu->mac_base; 303 void __iomem *mbase = mtu->mac_base;
304 bool gen2cp = mtu->gen2cp;
302 int epnum = mep->epnum; 305 int epnum = mep->epnum;
303 u32 csr0, csr1, csr2; 306 u32 csr0, csr1, csr2;
304 int fifo_sgsz, fifo_addr; 307 int fifo_sgsz, fifo_addr;
@@ -319,7 +322,7 @@ int mtu3_config_ep(struct mtu3 *mtu, struct mtu3_ep *mep,
319 322
320 num_pkts = (burst + 1) * (mult + 1) - 1; 323 num_pkts = (burst + 1) * (mult + 1) - 1;
321 csr1 = TX_SS_BURST(burst) | TX_SLOT(mep->slot); 324 csr1 = TX_SS_BURST(burst) | TX_SLOT(mep->slot);
322 csr1 |= TX_MAX_PKT(num_pkts) | TX_MULT(mult); 325 csr1 |= TX_MAX_PKT(gen2cp, num_pkts) | TX_MULT(gen2cp, mult);
323 326
324 csr2 = TX_FIFOADDR(fifo_addr >> 4); 327 csr2 = TX_FIFOADDR(fifo_addr >> 4);
325 csr2 |= TX_FIFOSEGSIZE(fifo_sgsz); 328 csr2 |= TX_FIFOSEGSIZE(fifo_sgsz);
@@ -355,7 +358,7 @@ int mtu3_config_ep(struct mtu3 *mtu, struct mtu3_ep *mep,
355 358
356 num_pkts = (burst + 1) * (mult + 1) - 1; 359 num_pkts = (burst + 1) * (mult + 1) - 1;
357 csr1 = RX_SS_BURST(burst) | RX_SLOT(mep->slot); 360 csr1 = RX_SS_BURST(burst) | RX_SLOT(mep->slot);
358 csr1 |= RX_MAX_PKT(num_pkts) | RX_MULT(mult); 361 csr1 |= RX_MAX_PKT(gen2cp, num_pkts) | RX_MULT(gen2cp, mult);
359 362
360 csr2 = RX_FIFOADDR(fifo_addr >> 4); 363 csr2 = RX_FIFOADDR(fifo_addr >> 4);
361 csr2 |= RX_FIFOSEGSIZE(fifo_sgsz); 364 csr2 |= RX_FIFOSEGSIZE(fifo_sgsz);
@@ -600,6 +603,10 @@ static void mtu3_regs_init(struct mtu3 *mtu)
600 mtu3_clrbits(mbase, U3D_MISC_CTRL, VBUS_FRC_EN | VBUS_ON); 603 mtu3_clrbits(mbase, U3D_MISC_CTRL, VBUS_FRC_EN | VBUS_ON);
601 /* enable automatical HWRW from L1 */ 604 /* enable automatical HWRW from L1 */
602 mtu3_setbits(mbase, U3D_POWER_MANAGEMENT, LPM_HRWE); 605 mtu3_setbits(mbase, U3D_POWER_MANAGEMENT, LPM_HRWE);
606
607 /* use new QMU format when HW version >= 0x1003 */
608 if (mtu->gen2cp)
609 mtu3_writel(mbase, U3D_QFCR, ~0x0);
603} 610}
604 611
605static irqreturn_t mtu3_link_isr(struct mtu3 *mtu) 612static irqreturn_t mtu3_link_isr(struct mtu3 *mtu)
@@ -650,6 +657,8 @@ static irqreturn_t mtu3_link_isr(struct mtu3 *mtu)
650 break; 657 break;
651 } 658 }
652 dev_dbg(mtu->dev, "%s: %s\n", __func__, usb_speed_string(udev_speed)); 659 dev_dbg(mtu->dev, "%s: %s\n", __func__, usb_speed_string(udev_speed));
660 mtu3_dbg_trace(mtu->dev, "link speed %s",
661 usb_speed_string(udev_speed));
653 662
654 mtu->g.speed = udev_speed; 663 mtu->g.speed = udev_speed;
655 mtu->g.ep0->maxpacket = maxpkt; 664 mtu->g.ep0->maxpacket = maxpkt;
@@ -672,6 +681,7 @@ static irqreturn_t mtu3_u3_ltssm_isr(struct mtu3 *mtu)
672 ltssm &= mtu3_readl(mbase, U3D_LTSSM_INTR_ENABLE); 681 ltssm &= mtu3_readl(mbase, U3D_LTSSM_INTR_ENABLE);
673 mtu3_writel(mbase, U3D_LTSSM_INTR, ltssm); /* W1C */ 682 mtu3_writel(mbase, U3D_LTSSM_INTR, ltssm); /* W1C */
674 dev_dbg(mtu->dev, "=== LTSSM[%x] ===\n", ltssm); 683 dev_dbg(mtu->dev, "=== LTSSM[%x] ===\n", ltssm);
684 trace_mtu3_u3_ltssm_isr(ltssm);
675 685
676 if (ltssm & (HOT_RST_INTR | WARM_RST_INTR)) 686 if (ltssm & (HOT_RST_INTR | WARM_RST_INTR))
677 mtu3_gadget_reset(mtu); 687 mtu3_gadget_reset(mtu);
@@ -702,6 +712,7 @@ static irqreturn_t mtu3_u2_common_isr(struct mtu3 *mtu)
702 u2comm &= mtu3_readl(mbase, U3D_COMMON_USB_INTR_ENABLE); 712 u2comm &= mtu3_readl(mbase, U3D_COMMON_USB_INTR_ENABLE);
703 mtu3_writel(mbase, U3D_COMMON_USB_INTR, u2comm); /* W1C */ 713 mtu3_writel(mbase, U3D_COMMON_USB_INTR, u2comm); /* W1C */
704 dev_dbg(mtu->dev, "=== U2COMM[%x] ===\n", u2comm); 714 dev_dbg(mtu->dev, "=== U2COMM[%x] ===\n", u2comm);
715 trace_mtu3_u2_common_isr(u2comm);
705 716
706 if (u2comm & SUSPEND_INTR) 717 if (u2comm & SUSPEND_INTR)
707 mtu3_gadget_suspend(mtu); 718 mtu3_gadget_suspend(mtu);
@@ -749,13 +760,15 @@ static irqreturn_t mtu3_irq(int irq, void *data)
749 760
750static int mtu3_hw_init(struct mtu3 *mtu) 761static int mtu3_hw_init(struct mtu3 *mtu)
751{ 762{
752 u32 cap_dev; 763 u32 value;
753 int ret; 764 int ret;
754 765
755 mtu->hw_version = mtu3_readl(mtu->ippc_base, U3D_SSUSB_HW_ID); 766 value = mtu3_readl(mtu->ippc_base, U3D_SSUSB_IP_TRUNK_VERS);
767 mtu->hw_version = IP_TRUNK_VERS(value);
768 mtu->gen2cp = !!(mtu->hw_version >= MTU3_TRUNK_VERS_1003);
756 769
757 cap_dev = mtu3_readl(mtu->ippc_base, U3D_SSUSB_IP_DEV_CAP); 770 value = mtu3_readl(mtu->ippc_base, U3D_SSUSB_IP_DEV_CAP);
758 mtu->is_u3_ip = !!SSUSB_IP_DEV_U3_PORT_NUM(cap_dev); 771 mtu->is_u3_ip = !!SSUSB_IP_DEV_U3_PORT_NUM(value);
759 772
760 dev_info(mtu->dev, "IP version 0x%x(%s IP)\n", mtu->hw_version, 773 dev_info(mtu->dev, "IP version 0x%x(%s IP)\n", mtu->hw_version,
761 mtu->is_u3_ip ? "U3" : "U2"); 774 mtu->is_u3_ip ? "U3" : "U2");
@@ -893,6 +906,8 @@ int ssusb_gadget_init(struct ssusb_mtk *ssusb)
893 if (mtu->ssusb->dr_mode == USB_DR_MODE_OTG) 906 if (mtu->ssusb->dr_mode == USB_DR_MODE_OTG)
894 mtu3_stop(mtu); 907 mtu3_stop(mtu);
895 908
909 ssusb_dev_debugfs_init(ssusb);
910
896 dev_dbg(dev, " %s() done...\n", __func__); 911 dev_dbg(dev, " %s() done...\n", __func__);
897 912
898 return 0; 913 return 0;