ipq806x: switch to upstream usb driver and backport fixes
[openwrt/staging/dedeckeh.git] / target / linux / ipq806x / patches-4.4 / 096-08-usb-dwc3-remove-num_event_buffers.patch
1 From 660e9bde74d6915227d7ee3485b11e5f52637b26 Mon Sep 17 00:00:00 2001
2 From: Felipe Balbi <felipe.balbi@linux.intel.com>
3 Date: Wed, 30 Mar 2016 09:26:24 +0300
4 Subject: usb: dwc3: remove num_event_buffers
5
6 We never, ever route any of the other event buffers
7 so we might as well drop support for them.
8
9 Until someone has a real, proper benefit for
10 multiple event buffers, we will rely on a single
11 one. This also helps reduce memory footprint of
12 dwc3.ko which won't allocate memory for the extra
13 event buffers.
14
15 Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
16 ---
17 drivers/usb/dwc3/core.c | 81 +++++++++++++++++++----------------------------
18 drivers/usb/dwc3/core.h | 2 --
19 drivers/usb/dwc3/gadget.c | 38 +++++++---------------
20 3 files changed, 44 insertions(+), 77 deletions(-)
21
22 diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
23 index 67d183a..9e5c57c7 100644
24 --- a/drivers/usb/dwc3/core.c
25 +++ b/drivers/usb/dwc3/core.c
26 @@ -203,13 +203,10 @@ static struct dwc3_event_buffer *dwc3_alloc_one_event_buffer(struct dwc3 *dwc,
27 static void dwc3_free_event_buffers(struct dwc3 *dwc)
28 {
29 struct dwc3_event_buffer *evt;
30 - int i;
31
32 - for (i = 0; i < dwc->num_event_buffers; i++) {
33 - evt = dwc->ev_buffs[i];
34 - if (evt)
35 - dwc3_free_one_event_buffer(dwc, evt);
36 - }
37 + evt = dwc->ev_buffs[0];
38 + if (evt)
39 + dwc3_free_one_event_buffer(dwc, evt);
40 }
41
42 /**
43 @@ -222,27 +219,19 @@ static void dwc3_free_event_buffers(struct dwc3 *dwc)
44 */
45 static int dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned length)
46 {
47 - int num;
48 - int i;
49 -
50 - num = DWC3_NUM_INT(dwc->hwparams.hwparams1);
51 - dwc->num_event_buffers = num;
52 + struct dwc3_event_buffer *evt;
53
54 - dwc->ev_buffs = devm_kzalloc(dwc->dev, sizeof(*dwc->ev_buffs) * num,
55 + dwc->ev_buffs = devm_kzalloc(dwc->dev, sizeof(*dwc->ev_buffs),
56 GFP_KERNEL);
57 if (!dwc->ev_buffs)
58 return -ENOMEM;
59
60 - for (i = 0; i < num; i++) {
61 - struct dwc3_event_buffer *evt;
62 -
63 - evt = dwc3_alloc_one_event_buffer(dwc, length);
64 - if (IS_ERR(evt)) {
65 - dev_err(dwc->dev, "can't allocate event buffer\n");
66 - return PTR_ERR(evt);
67 - }
68 - dwc->ev_buffs[i] = evt;
69 + evt = dwc3_alloc_one_event_buffer(dwc, length);
70 + if (IS_ERR(evt)) {
71 + dev_err(dwc->dev, "can't allocate event buffer\n");
72 + return PTR_ERR(evt);
73 }
74 + dwc->ev_buffs[0] = evt;
75
76 return 0;
77 }
78 @@ -256,25 +245,22 @@ static int dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned length)
79 static int dwc3_event_buffers_setup(struct dwc3 *dwc)
80 {
81 struct dwc3_event_buffer *evt;
82 - int n;
83
84 - for (n = 0; n < dwc->num_event_buffers; n++) {
85 - evt = dwc->ev_buffs[n];
86 - dwc3_trace(trace_dwc3_core,
87 - "Event buf %p dma %08llx length %d\n",
88 - evt->buf, (unsigned long long) evt->dma,
89 - evt->length);
90 -
91 - evt->lpos = 0;
92 -
93 - dwc3_writel(dwc->regs, DWC3_GEVNTADRLO(n),
94 - lower_32_bits(evt->dma));
95 - dwc3_writel(dwc->regs, DWC3_GEVNTADRHI(n),
96 - upper_32_bits(evt->dma));
97 - dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(n),
98 - DWC3_GEVNTSIZ_SIZE(evt->length));
99 - dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(n), 0);
100 - }
101 + evt = dwc->ev_buffs[0];
102 + dwc3_trace(trace_dwc3_core,
103 + "Event buf %p dma %08llx length %d\n",
104 + evt->buf, (unsigned long long) evt->dma,
105 + evt->length);
106 +
107 + evt->lpos = 0;
108 +
109 + dwc3_writel(dwc->regs, DWC3_GEVNTADRLO(0),
110 + lower_32_bits(evt->dma));
111 + dwc3_writel(dwc->regs, DWC3_GEVNTADRHI(0),
112 + upper_32_bits(evt->dma));
113 + dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0),
114 + DWC3_GEVNTSIZ_SIZE(evt->length));
115 + dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), 0);
116
117 return 0;
118 }
119 @@ -282,19 +268,16 @@ static int dwc3_event_buffers_setup(struct dwc3 *dwc)
120 static void dwc3_event_buffers_cleanup(struct dwc3 *dwc)
121 {
122 struct dwc3_event_buffer *evt;
123 - int n;
124
125 - for (n = 0; n < dwc->num_event_buffers; n++) {
126 - evt = dwc->ev_buffs[n];
127 + evt = dwc->ev_buffs[0];
128
129 - evt->lpos = 0;
130 + evt->lpos = 0;
131
132 - dwc3_writel(dwc->regs, DWC3_GEVNTADRLO(n), 0);
133 - dwc3_writel(dwc->regs, DWC3_GEVNTADRHI(n), 0);
134 - dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(n), DWC3_GEVNTSIZ_INTMASK
135 - | DWC3_GEVNTSIZ_SIZE(0));
136 - dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(n), 0);
137 - }
138 + dwc3_writel(dwc->regs, DWC3_GEVNTADRLO(0), 0);
139 + dwc3_writel(dwc->regs, DWC3_GEVNTADRHI(0), 0);
140 + dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), DWC3_GEVNTSIZ_INTMASK
141 + | DWC3_GEVNTSIZ_SIZE(0));
142 + dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), 0);
143 }
144
145 static int dwc3_alloc_scratch_buffers(struct dwc3 *dwc)
146 diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
147 index 4ea4b51..be03999 100644
148 --- a/drivers/usb/dwc3/core.h
149 +++ b/drivers/usb/dwc3/core.h
150 @@ -667,7 +667,6 @@ struct dwc3_scratchpad_array {
151 * @regs: base address for our registers
152 * @regs_size: address space size
153 * @nr_scratch: number of scratch buffers
154 - * @num_event_buffers: calculated number of event buffers
155 * @u1u2: only used on revisions <1.83a for workaround
156 * @maximum_speed: maximum speed requested (mainly for testing purposes)
157 * @revision: revision register contents
158 @@ -778,7 +777,6 @@ struct dwc3 {
159 u32 gctl;
160
161 u32 nr_scratch;
162 - u32 num_event_buffers;
163 u32 u1u2;
164 u32 maximum_speed;
165
166 diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
167 index e6bd3a9..5e6a495 100644
168 --- a/drivers/usb/dwc3/gadget.c
169 +++ b/drivers/usb/dwc3/gadget.c
170 @@ -2602,14 +2602,14 @@ static void dwc3_process_event_entry(struct dwc3 *dwc,
171 }
172 }
173
174 -static irqreturn_t dwc3_process_event_buf(struct dwc3 *dwc, u32 buf)
175 +static irqreturn_t dwc3_process_event_buf(struct dwc3 *dwc)
176 {
177 struct dwc3_event_buffer *evt;
178 irqreturn_t ret = IRQ_NONE;
179 int left;
180 u32 reg;
181
182 - evt = dwc->ev_buffs[buf];
183 + evt = dwc->ev_buffs[0];
184 left = evt->count;
185
186 if (!(evt->flags & DWC3_EVENT_PENDING))
187 @@ -2634,7 +2634,7 @@ static irqreturn_t dwc3_process_event_buf(struct dwc3 *dwc, u32 buf)
188 evt->lpos = (evt->lpos + 4) % DWC3_EVENT_BUFFERS_SIZE;
189 left -= 4;
190
191 - dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(buf), 4);
192 + dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), 4);
193 }
194
195 evt->count = 0;
196 @@ -2642,9 +2642,9 @@ static irqreturn_t dwc3_process_event_buf(struct dwc3 *dwc, u32 buf)
197 ret = IRQ_HANDLED;
198
199 /* Unmask interrupt */
200 - reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(buf));
201 + reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(0));
202 reg &= ~DWC3_GEVNTSIZ_INTMASK;
203 - dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(buf), reg);
204 + dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg);
205
206 return ret;
207 }
208 @@ -2654,27 +2654,23 @@ static irqreturn_t dwc3_thread_interrupt(int irq, void *_dwc)
209 struct dwc3 *dwc = _dwc;
210 unsigned long flags;
211 irqreturn_t ret = IRQ_NONE;
212 - int i;
213
214 spin_lock_irqsave(&dwc->lock, flags);
215 -
216 - for (i = 0; i < dwc->num_event_buffers; i++)
217 - ret |= dwc3_process_event_buf(dwc, i);
218 -
219 + ret = dwc3_process_event_buf(dwc);
220 spin_unlock_irqrestore(&dwc->lock, flags);
221
222 return ret;
223 }
224
225 -static irqreturn_t dwc3_check_event_buf(struct dwc3 *dwc, u32 buf)
226 +static irqreturn_t dwc3_check_event_buf(struct dwc3 *dwc)
227 {
228 struct dwc3_event_buffer *evt;
229 u32 count;
230 u32 reg;
231
232 - evt = dwc->ev_buffs[buf];
233 + evt = dwc->ev_buffs[0];
234
235 - count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(buf));
236 + count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(0));
237 count &= DWC3_GEVNTCOUNT_MASK;
238 if (!count)
239 return IRQ_NONE;
240 @@ -2683,9 +2679,9 @@ static irqreturn_t dwc3_check_event_buf(struct dwc3 *dwc, u32 buf)
241 evt->flags |= DWC3_EVENT_PENDING;
242
243 /* Mask interrupt */
244 - reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(buf));
245 + reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(0));
246 reg |= DWC3_GEVNTSIZ_INTMASK;
247 - dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(buf), reg);
248 + dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg);
249
250 return IRQ_WAKE_THREAD;
251 }
252 @@ -2693,18 +2689,8 @@ static irqreturn_t dwc3_check_event_buf(struct dwc3 *dwc, u32 buf)
253 static irqreturn_t dwc3_interrupt(int irq, void *_dwc)
254 {
255 struct dwc3 *dwc = _dwc;
256 - int i;
257 - irqreturn_t ret = IRQ_NONE;
258 -
259 - for (i = 0; i < dwc->num_event_buffers; i++) {
260 - irqreturn_t status;
261
262 - status = dwc3_check_event_buf(dwc, i);
263 - if (status == IRQ_WAKE_THREAD)
264 - ret = status;
265 - }
266 -
267 - return ret;
268 + return dwc3_check_event_buf(dwc);
269 }
270
271 /**
272 --
273 cgit v0.12