kernel: bump 4.14 to 4.14.125 (FS#2305 FS#2297)
[oweals/openwrt.git] / target / linux / mediatek / patches-4.14 / 0109-usb-mtu3-add-support-for-usb3.1-IP.patch
1 From 8f444887e23b9f0ea31aaae74fbc18171714d8d2 Mon Sep 17 00:00:00 2001
2 From: Chunfeng Yun <chunfeng.yun@mediatek.com>
3 Date: Fri, 13 Oct 2017 17:10:43 +0800
4 Subject: [PATCH 109/224] usb: mtu3: add support for usb3.1 IP
5
6 Support SuperSpeedPlus for usb3.1 device IP
7
8 Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
9 Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
10 ---
11  drivers/usb/mtu3/mtu3.h            |  1 +
12  drivers/usb/mtu3/mtu3_core.c       | 14 +++++++++++---
13  drivers/usb/mtu3/mtu3_gadget.c     |  3 ++-
14  drivers/usb/mtu3/mtu3_gadget_ep0.c | 16 ++++++++--------
15  drivers/usb/mtu3/mtu3_hw_regs.h    |  1 +
16  5 files changed, 23 insertions(+), 12 deletions(-)
17
18 --- a/drivers/usb/mtu3/mtu3.h
19 +++ b/drivers/usb/mtu3/mtu3.h
20 @@ -94,6 +94,7 @@ enum mtu3_speed {
21         MTU3_SPEED_FULL = 1,
22         MTU3_SPEED_HIGH = 3,
23         MTU3_SPEED_SUPER = 4,
24 +       MTU3_SPEED_SUPER_PLUS = 5,
25  };
26  
27  /**
28 --- a/drivers/usb/mtu3/mtu3_core.c
29 +++ b/drivers/usb/mtu3/mtu3_core.c
30 @@ -237,7 +237,7 @@ void mtu3_ep_stall_set(struct mtu3_ep *m
31  
32  void mtu3_dev_on_off(struct mtu3 *mtu, int is_on)
33  {
34 -       if (mtu->is_u3_ip && (mtu->max_speed == USB_SPEED_SUPER))
35 +       if (mtu->is_u3_ip && mtu->max_speed >= USB_SPEED_SUPER)
36                 mtu3_ss_func_set(mtu, is_on);
37         else
38                 mtu3_hs_softconn_set(mtu, is_on);
39 @@ -547,6 +547,9 @@ static void mtu3_set_speed(struct mtu3 *
40                 mtu3_clrbits(mbase, U3D_USB3_CONFIG, USB3_EN);
41                 /* HS/FS detected by HW */
42                 mtu3_setbits(mbase, U3D_POWER_MANAGEMENT, HS_ENABLE);
43 +       } else if (mtu->max_speed == USB_SPEED_SUPER) {
44 +               mtu3_clrbits(mtu->ippc_base, SSUSB_U3_CTRL(0),
45 +                            SSUSB_U3_PORT_SSP_SPEED);
46         }
47  
48         dev_info(mtu->dev, "max_speed: %s\n",
49 @@ -626,6 +629,10 @@ static irqreturn_t mtu3_link_isr(struct
50                 udev_speed = USB_SPEED_SUPER;
51                 maxpkt = 512;
52                 break;
53 +       case MTU3_SPEED_SUPER_PLUS:
54 +               udev_speed = USB_SPEED_SUPER_PLUS;
55 +               maxpkt = 512;
56 +               break;
57         default:
58                 udev_speed = USB_SPEED_UNKNOWN;
59                 break;
60 @@ -827,14 +834,15 @@ int ssusb_gadget_init(struct ssusb_mtk *
61         case USB_SPEED_FULL:
62         case USB_SPEED_HIGH:
63         case USB_SPEED_SUPER:
64 +       case USB_SPEED_SUPER_PLUS:
65                 break;
66         default:
67                 dev_err(dev, "invalid max_speed: %s\n",
68                         usb_speed_string(mtu->max_speed));
69                 /* fall through */
70         case USB_SPEED_UNKNOWN:
71 -               /* default as SS */
72 -               mtu->max_speed = USB_SPEED_SUPER;
73 +               /* default as SSP */
74 +               mtu->max_speed = USB_SPEED_SUPER_PLUS;
75                 break;
76         }
77  
78 --- a/drivers/usb/mtu3/mtu3_gadget.c
79 +++ b/drivers/usb/mtu3/mtu3_gadget.c
80 @@ -89,6 +89,7 @@ static int mtu3_ep_enable(struct mtu3_ep
81  
82         switch (mtu->g.speed) {
83         case USB_SPEED_SUPER:
84 +       case USB_SPEED_SUPER_PLUS:
85                 if (usb_endpoint_xfer_int(desc) ||
86                                 usb_endpoint_xfer_isoc(desc)) {
87                         interval = desc->bInterval;
88 @@ -456,7 +457,7 @@ static int mtu3_gadget_wakeup(struct usb
89                 return  -EOPNOTSUPP;
90  
91         spin_lock_irqsave(&mtu->lock, flags);
92 -       if (mtu->g.speed == USB_SPEED_SUPER) {
93 +       if (mtu->g.speed >= USB_SPEED_SUPER) {
94                 mtu3_setbits(mtu->mac_base, U3D_LINK_POWER_CONTROL, UX_EXIT);
95         } else {
96                 mtu3_setbits(mtu->mac_base, U3D_POWER_MANAGEMENT, RESUME);
97 --- a/drivers/usb/mtu3/mtu3_gadget_ep0.c
98 +++ b/drivers/usb/mtu3/mtu3_gadget_ep0.c
99 @@ -212,8 +212,8 @@ ep0_get_status(struct mtu3 *mtu, const s
100         case USB_RECIP_DEVICE:
101                 result[0] = mtu->is_self_powered << USB_DEVICE_SELF_POWERED;
102                 result[0] |= mtu->may_wakeup << USB_DEVICE_REMOTE_WAKEUP;
103 -               /* superspeed only */
104 -               if (mtu->g.speed == USB_SPEED_SUPER) {
105 +
106 +               if (mtu->g.speed >= USB_SPEED_SUPER) {
107                         result[0] |= mtu->u1_enable << USB_DEV_STAT_U1_ENABLED;
108                         result[0] |= mtu->u2_enable << USB_DEV_STAT_U2_ENABLED;
109                 }
110 @@ -329,8 +329,8 @@ static int ep0_handle_feature_dev(struct
111                 handled = handle_test_mode(mtu, setup);
112                 break;
113         case USB_DEVICE_U1_ENABLE:
114 -               if (mtu->g.speed != USB_SPEED_SUPER ||
115 -                       mtu->g.state != USB_STATE_CONFIGURED)
116 +               if (mtu->g.speed < USB_SPEED_SUPER ||
117 +                   mtu->g.state != USB_STATE_CONFIGURED)
118                         break;
119  
120                 lpc = mtu3_readl(mbase, U3D_LINK_POWER_CONTROL);
121 @@ -344,8 +344,8 @@ static int ep0_handle_feature_dev(struct
122                 handled = 1;
123                 break;
124         case USB_DEVICE_U2_ENABLE:
125 -               if (mtu->g.speed != USB_SPEED_SUPER ||
126 -                       mtu->g.state != USB_STATE_CONFIGURED)
127 +               if (mtu->g.speed < USB_SPEED_SUPER ||
128 +                   mtu->g.state != USB_STATE_CONFIGURED)
129                         break;
130  
131                 lpc = mtu3_readl(mbase, U3D_LINK_POWER_CONTROL);
132 @@ -384,8 +384,8 @@ static int ep0_handle_feature(struct mtu
133                 break;
134         case USB_RECIP_INTERFACE:
135                 /* superspeed only */
136 -               if ((value == USB_INTRF_FUNC_SUSPEND)
137 -                       && (mtu->g.speed == USB_SPEED_SUPER)) {
138 +               if (value == USB_INTRF_FUNC_SUSPEND &&
139 +                   mtu->g.speed >= USB_SPEED_SUPER) {
140                         /*
141                          * forward the request because function drivers
142                          * should handle it
143 --- a/drivers/usb/mtu3/mtu3_hw_regs.h
144 +++ b/drivers/usb/mtu3/mtu3_hw_regs.h
145 @@ -467,6 +467,7 @@
146  #define SSUSB_VBUS_CHG_INT_B_EN                BIT(6)
147  
148  /* U3D_SSUSB_U3_CTRL_0P */
149 +#define SSUSB_U3_PORT_SSP_SPEED        BIT(9)
150  #define SSUSB_U3_PORT_HOST_SEL         BIT(2)
151  #define SSUSB_U3_PORT_PDN              BIT(1)
152  #define SSUSB_U3_PORT_DIS              BIT(0)