kernel: bump 4.14 to 4.14.99
[openwrt/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)