MTU3_SPEED_FULL = 1,
        MTU3_SPEED_HIGH = 3,
        MTU3_SPEED_SUPER = 4,
+       MTU3_SPEED_SUPER_PLUS = 5,
 };
 
 /**
 
 
 void mtu3_dev_on_off(struct mtu3 *mtu, int is_on)
 {
-       if (mtu->is_u3_ip && (mtu->max_speed == USB_SPEED_SUPER))
+       if (mtu->is_u3_ip && mtu->max_speed >= USB_SPEED_SUPER)
                mtu3_ss_func_set(mtu, is_on);
        else
                mtu3_hs_softconn_set(mtu, is_on);
                mtu3_clrbits(mbase, U3D_USB3_CONFIG, USB3_EN);
                /* HS/FS detected by HW */
                mtu3_setbits(mbase, U3D_POWER_MANAGEMENT, HS_ENABLE);
+       } else if (mtu->max_speed == USB_SPEED_SUPER) {
+               mtu3_clrbits(mtu->ippc_base, SSUSB_U3_CTRL(0),
+                            SSUSB_U3_PORT_SSP_SPEED);
        }
 
        dev_info(mtu->dev, "max_speed: %s\n",
                udev_speed = USB_SPEED_SUPER;
                maxpkt = 512;
                break;
+       case MTU3_SPEED_SUPER_PLUS:
+               udev_speed = USB_SPEED_SUPER_PLUS;
+               maxpkt = 512;
+               break;
        default:
                udev_speed = USB_SPEED_UNKNOWN;
                break;
        case USB_SPEED_FULL:
        case USB_SPEED_HIGH:
        case USB_SPEED_SUPER:
+       case USB_SPEED_SUPER_PLUS:
                break;
        default:
                dev_err(dev, "invalid max_speed: %s\n",
                        usb_speed_string(mtu->max_speed));
                /* fall through */
        case USB_SPEED_UNKNOWN:
-               /* default as SS */
-               mtu->max_speed = USB_SPEED_SUPER;
+               /* default as SSP */
+               mtu->max_speed = USB_SPEED_SUPER_PLUS;
                break;
        }
 
 
 
        switch (mtu->g.speed) {
        case USB_SPEED_SUPER:
+       case USB_SPEED_SUPER_PLUS:
                if (usb_endpoint_xfer_int(desc) ||
                                usb_endpoint_xfer_isoc(desc)) {
                        interval = desc->bInterval;
                return  -EOPNOTSUPP;
 
        spin_lock_irqsave(&mtu->lock, flags);
-       if (mtu->g.speed == USB_SPEED_SUPER) {
+       if (mtu->g.speed >= USB_SPEED_SUPER) {
                mtu3_setbits(mtu->mac_base, U3D_LINK_POWER_CONTROL, UX_EXIT);
        } else {
                mtu3_setbits(mtu->mac_base, U3D_POWER_MANAGEMENT, RESUME);
 
        case USB_RECIP_DEVICE:
                result[0] = mtu->is_self_powered << USB_DEVICE_SELF_POWERED;
                result[0] |= mtu->may_wakeup << USB_DEVICE_REMOTE_WAKEUP;
-               /* superspeed only */
-               if (mtu->g.speed == USB_SPEED_SUPER) {
+
+               if (mtu->g.speed >= USB_SPEED_SUPER) {
                        result[0] |= mtu->u1_enable << USB_DEV_STAT_U1_ENABLED;
                        result[0] |= mtu->u2_enable << USB_DEV_STAT_U2_ENABLED;
                }
                handled = handle_test_mode(mtu, setup);
                break;
        case USB_DEVICE_U1_ENABLE:
-               if (mtu->g.speed != USB_SPEED_SUPER ||
-                       mtu->g.state != USB_STATE_CONFIGURED)
+               if (mtu->g.speed < USB_SPEED_SUPER ||
+                   mtu->g.state != USB_STATE_CONFIGURED)
                        break;
 
                lpc = mtu3_readl(mbase, U3D_LINK_POWER_CONTROL);
                handled = 1;
                break;
        case USB_DEVICE_U2_ENABLE:
-               if (mtu->g.speed != USB_SPEED_SUPER ||
-                       mtu->g.state != USB_STATE_CONFIGURED)
+               if (mtu->g.speed < USB_SPEED_SUPER ||
+                   mtu->g.state != USB_STATE_CONFIGURED)
                        break;
 
                lpc = mtu3_readl(mbase, U3D_LINK_POWER_CONTROL);
                break;
        case USB_RECIP_INTERFACE:
                /* superspeed only */
-               if ((value == USB_INTRF_FUNC_SUSPEND)
-                       && (mtu->g.speed == USB_SPEED_SUPER)) {
+               if (value == USB_INTRF_FUNC_SUSPEND &&
+                   mtu->g.speed >= USB_SPEED_SUPER) {
                        /*
                         * forward the request because function drivers
                         * should handle it
 
 #define SSUSB_VBUS_CHG_INT_B_EN                BIT(6)
 
 /* U3D_SSUSB_U3_CTRL_0P */
+#define SSUSB_U3_PORT_SSP_SPEED        BIT(9)
 #define SSUSB_U3_PORT_HOST_SEL         BIT(2)
 #define SSUSB_U3_PORT_PDN              BIT(1)
 #define SSUSB_U3_PORT_DIS              BIT(0)