aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChunfeng Yun <chunfeng.yun@mediatek.com>2017-10-13 05:10:43 -0400
committerFelipe Balbi <felipe.balbi@linux.intel.com>2017-10-19 03:38:12 -0400
commit4d79e042ed8b45e01bcec90de6b0c79c6c29d2b5 (patch)
treea1cd69ef3da4b1d1ca611943763a0b15d9aabff8
parentc776f2c3e81308977e95a228b0665e3d5c63dff3 (diff)
usb: mtu3: add support for usb3.1 IP
Support SuperSpeedPlus for usb3.1 device IP Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com> Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
-rw-r--r--drivers/usb/mtu3/mtu3.h1
-rw-r--r--drivers/usb/mtu3/mtu3_core.c14
-rw-r--r--drivers/usb/mtu3/mtu3_gadget.c3
-rw-r--r--drivers/usb/mtu3/mtu3_gadget_ep0.c16
-rw-r--r--drivers/usb/mtu3/mtu3_hw_regs.h1
5 files changed, 23 insertions, 12 deletions
diff --git a/drivers/usb/mtu3/mtu3.h b/drivers/usb/mtu3/mtu3.h
index b0c2b5dca045..d80e4e813248 100644
--- a/drivers/usb/mtu3/mtu3.h
+++ b/drivers/usb/mtu3/mtu3.h
@@ -94,6 +94,7 @@ enum mtu3_speed {
94 MTU3_SPEED_FULL = 1, 94 MTU3_SPEED_FULL = 1,
95 MTU3_SPEED_HIGH = 3, 95 MTU3_SPEED_HIGH = 3,
96 MTU3_SPEED_SUPER = 4, 96 MTU3_SPEED_SUPER = 4,
97 MTU3_SPEED_SUPER_PLUS = 5,
97}; 98};
98 99
99/** 100/**
diff --git a/drivers/usb/mtu3/mtu3_core.c b/drivers/usb/mtu3/mtu3_core.c
index cd4528f5f337..67f7a309aba7 100644
--- a/drivers/usb/mtu3/mtu3_core.c
+++ b/drivers/usb/mtu3/mtu3_core.c
@@ -237,7 +237,7 @@ void mtu3_ep_stall_set(struct mtu3_ep *mep, bool set)
237 237
238void mtu3_dev_on_off(struct mtu3 *mtu, int is_on) 238void mtu3_dev_on_off(struct mtu3 *mtu, int is_on)
239{ 239{
240 if (mtu->is_u3_ip && (mtu->max_speed == USB_SPEED_SUPER)) 240 if (mtu->is_u3_ip && mtu->max_speed >= USB_SPEED_SUPER)
241 mtu3_ss_func_set(mtu, is_on); 241 mtu3_ss_func_set(mtu, is_on);
242 else 242 else
243 mtu3_hs_softconn_set(mtu, is_on); 243 mtu3_hs_softconn_set(mtu, is_on);
@@ -547,6 +547,9 @@ static void mtu3_set_speed(struct mtu3 *mtu)
547 mtu3_clrbits(mbase, U3D_USB3_CONFIG, USB3_EN); 547 mtu3_clrbits(mbase, U3D_USB3_CONFIG, USB3_EN);
548 /* HS/FS detected by HW */ 548 /* HS/FS detected by HW */
549 mtu3_setbits(mbase, U3D_POWER_MANAGEMENT, HS_ENABLE); 549 mtu3_setbits(mbase, U3D_POWER_MANAGEMENT, HS_ENABLE);
550 } else if (mtu->max_speed == USB_SPEED_SUPER) {
551 mtu3_clrbits(mtu->ippc_base, SSUSB_U3_CTRL(0),
552 SSUSB_U3_PORT_SSP_SPEED);
550 } 553 }
551 554
552 dev_info(mtu->dev, "max_speed: %s\n", 555 dev_info(mtu->dev, "max_speed: %s\n",
@@ -624,6 +627,10 @@ static irqreturn_t mtu3_link_isr(struct mtu3 *mtu)
624 udev_speed = USB_SPEED_SUPER; 627 udev_speed = USB_SPEED_SUPER;
625 maxpkt = 512; 628 maxpkt = 512;
626 break; 629 break;
630 case MTU3_SPEED_SUPER_PLUS:
631 udev_speed = USB_SPEED_SUPER_PLUS;
632 maxpkt = 512;
633 break;
627 default: 634 default:
628 udev_speed = USB_SPEED_UNKNOWN; 635 udev_speed = USB_SPEED_UNKNOWN;
629 break; 636 break;
@@ -825,14 +832,15 @@ int ssusb_gadget_init(struct ssusb_mtk *ssusb)
825 case USB_SPEED_FULL: 832 case USB_SPEED_FULL:
826 case USB_SPEED_HIGH: 833 case USB_SPEED_HIGH:
827 case USB_SPEED_SUPER: 834 case USB_SPEED_SUPER:
835 case USB_SPEED_SUPER_PLUS:
828 break; 836 break;
829 default: 837 default:
830 dev_err(dev, "invalid max_speed: %s\n", 838 dev_err(dev, "invalid max_speed: %s\n",
831 usb_speed_string(mtu->max_speed)); 839 usb_speed_string(mtu->max_speed));
832 /* fall through */ 840 /* fall through */
833 case USB_SPEED_UNKNOWN: 841 case USB_SPEED_UNKNOWN:
834 /* default as SS */ 842 /* default as SSP */
835 mtu->max_speed = USB_SPEED_SUPER; 843 mtu->max_speed = USB_SPEED_SUPER_PLUS;
836 break; 844 break;
837 } 845 }
838 846
diff --git a/drivers/usb/mtu3/mtu3_gadget.c b/drivers/usb/mtu3/mtu3_gadget.c
index 434fca58143c..b495471f689f 100644
--- a/drivers/usb/mtu3/mtu3_gadget.c
+++ b/drivers/usb/mtu3/mtu3_gadget.c
@@ -89,6 +89,7 @@ static int mtu3_ep_enable(struct mtu3_ep *mep)
89 89
90 switch (mtu->g.speed) { 90 switch (mtu->g.speed) {
91 case USB_SPEED_SUPER: 91 case USB_SPEED_SUPER:
92 case USB_SPEED_SUPER_PLUS:
92 if (usb_endpoint_xfer_int(desc) || 93 if (usb_endpoint_xfer_int(desc) ||
93 usb_endpoint_xfer_isoc(desc)) { 94 usb_endpoint_xfer_isoc(desc)) {
94 interval = desc->bInterval; 95 interval = desc->bInterval;
@@ -456,7 +457,7 @@ static int mtu3_gadget_wakeup(struct usb_gadget *gadget)
456 return -EOPNOTSUPP; 457 return -EOPNOTSUPP;
457 458
458 spin_lock_irqsave(&mtu->lock, flags); 459 spin_lock_irqsave(&mtu->lock, flags);
459 if (mtu->g.speed == USB_SPEED_SUPER) { 460 if (mtu->g.speed >= USB_SPEED_SUPER) {
460 mtu3_setbits(mtu->mac_base, U3D_LINK_POWER_CONTROL, UX_EXIT); 461 mtu3_setbits(mtu->mac_base, U3D_LINK_POWER_CONTROL, UX_EXIT);
461 } else { 462 } else {
462 mtu3_setbits(mtu->mac_base, U3D_POWER_MANAGEMENT, RESUME); 463 mtu3_setbits(mtu->mac_base, U3D_POWER_MANAGEMENT, RESUME);
diff --git a/drivers/usb/mtu3/mtu3_gadget_ep0.c b/drivers/usb/mtu3/mtu3_gadget_ep0.c
index 958d74dd2b78..020b25314a68 100644
--- a/drivers/usb/mtu3/mtu3_gadget_ep0.c
+++ b/drivers/usb/mtu3/mtu3_gadget_ep0.c
@@ -212,8 +212,8 @@ ep0_get_status(struct mtu3 *mtu, const struct usb_ctrlrequest *setup)
212 case USB_RECIP_DEVICE: 212 case USB_RECIP_DEVICE:
213 result[0] = mtu->is_self_powered << USB_DEVICE_SELF_POWERED; 213 result[0] = mtu->is_self_powered << USB_DEVICE_SELF_POWERED;
214 result[0] |= mtu->may_wakeup << USB_DEVICE_REMOTE_WAKEUP; 214 result[0] |= mtu->may_wakeup << USB_DEVICE_REMOTE_WAKEUP;
215 /* superspeed only */ 215
216 if (mtu->g.speed == USB_SPEED_SUPER) { 216 if (mtu->g.speed >= USB_SPEED_SUPER) {
217 result[0] |= mtu->u1_enable << USB_DEV_STAT_U1_ENABLED; 217 result[0] |= mtu->u1_enable << USB_DEV_STAT_U1_ENABLED;
218 result[0] |= mtu->u2_enable << USB_DEV_STAT_U2_ENABLED; 218 result[0] |= mtu->u2_enable << USB_DEV_STAT_U2_ENABLED;
219 } 219 }
@@ -329,8 +329,8 @@ static int ep0_handle_feature_dev(struct mtu3 *mtu,
329 handled = handle_test_mode(mtu, setup); 329 handled = handle_test_mode(mtu, setup);
330 break; 330 break;
331 case USB_DEVICE_U1_ENABLE: 331 case USB_DEVICE_U1_ENABLE:
332 if (mtu->g.speed != USB_SPEED_SUPER || 332 if (mtu->g.speed < USB_SPEED_SUPER ||
333 mtu->g.state != USB_STATE_CONFIGURED) 333 mtu->g.state != USB_STATE_CONFIGURED)
334 break; 334 break;
335 335
336 lpc = mtu3_readl(mbase, U3D_LINK_POWER_CONTROL); 336 lpc = mtu3_readl(mbase, U3D_LINK_POWER_CONTROL);
@@ -344,8 +344,8 @@ static int ep0_handle_feature_dev(struct mtu3 *mtu,
344 handled = 1; 344 handled = 1;
345 break; 345 break;
346 case USB_DEVICE_U2_ENABLE: 346 case USB_DEVICE_U2_ENABLE:
347 if (mtu->g.speed != USB_SPEED_SUPER || 347 if (mtu->g.speed < USB_SPEED_SUPER ||
348 mtu->g.state != USB_STATE_CONFIGURED) 348 mtu->g.state != USB_STATE_CONFIGURED)
349 break; 349 break;
350 350
351 lpc = mtu3_readl(mbase, U3D_LINK_POWER_CONTROL); 351 lpc = mtu3_readl(mbase, U3D_LINK_POWER_CONTROL);
@@ -384,8 +384,8 @@ static int ep0_handle_feature(struct mtu3 *mtu,
384 break; 384 break;
385 case USB_RECIP_INTERFACE: 385 case USB_RECIP_INTERFACE:
386 /* superspeed only */ 386 /* superspeed only */
387 if ((value == USB_INTRF_FUNC_SUSPEND) 387 if (value == USB_INTRF_FUNC_SUSPEND &&
388 && (mtu->g.speed == USB_SPEED_SUPER)) { 388 mtu->g.speed >= USB_SPEED_SUPER) {
389 /* 389 /*
390 * forward the request because function drivers 390 * forward the request because function drivers
391 * should handle it 391 * should handle it
diff --git a/drivers/usb/mtu3/mtu3_hw_regs.h b/drivers/usb/mtu3/mtu3_hw_regs.h
index a7e35f6ad90a..6953436a1688 100644
--- a/drivers/usb/mtu3/mtu3_hw_regs.h
+++ b/drivers/usb/mtu3/mtu3_hw_regs.h
@@ -467,6 +467,7 @@
467#define SSUSB_VBUS_CHG_INT_B_EN BIT(6) 467#define SSUSB_VBUS_CHG_INT_B_EN BIT(6)
468 468
469/* U3D_SSUSB_U3_CTRL_0P */ 469/* U3D_SSUSB_U3_CTRL_0P */
470#define SSUSB_U3_PORT_SSP_SPEED BIT(9)
470#define SSUSB_U3_PORT_HOST_SEL BIT(2) 471#define SSUSB_U3_PORT_HOST_SEL BIT(2)
471#define SSUSB_U3_PORT_PDN BIT(1) 472#define SSUSB_U3_PORT_PDN BIT(1)
472#define SSUSB_U3_PORT_DIS BIT(0) 473#define SSUSB_U3_PORT_DIS BIT(0)