diff options
author | Chunfeng Yun <chunfeng.yun@mediatek.com> | 2017-10-13 05:10:43 -0400 |
---|---|---|
committer | Felipe Balbi <felipe.balbi@linux.intel.com> | 2017-10-19 03:38:12 -0400 |
commit | 4d79e042ed8b45e01bcec90de6b0c79c6c29d2b5 (patch) | |
tree | a1cd69ef3da4b1d1ca611943763a0b15d9aabff8 | |
parent | c776f2c3e81308977e95a228b0665e3d5c63dff3 (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.h | 1 | ||||
-rw-r--r-- | drivers/usb/mtu3/mtu3_core.c | 14 | ||||
-rw-r--r-- | drivers/usb/mtu3/mtu3_gadget.c | 3 | ||||
-rw-r--r-- | drivers/usb/mtu3/mtu3_gadget_ep0.c | 16 | ||||
-rw-r--r-- | drivers/usb/mtu3/mtu3_hw_regs.h | 1 |
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 | ||
238 | void mtu3_dev_on_off(struct mtu3 *mtu, int is_on) | 238 | void 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) |