diff options
author | Felipe Balbi <balbi@ti.com> | 2011-10-12 03:31:04 -0400 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2011-12-12 04:48:11 -0500 |
commit | 9f622b2a407d8b34a5a7f5b4abd8b29b25cf4f32 (patch) | |
tree | a80c6f48a8f1c4fd70d0865b027035d3f8e0d44e /drivers/usb/dwc3/core.c | |
parent | 6c167fc9b0c23ead791edb94cf4debb6b8e534b5 (diff) |
usb: dwc3: calculate number of event buffers dynamically
This will allow us to only allocate memory when
we actually need.
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/dwc3/core.c')
-rw-r--r-- | drivers/usb/dwc3/core.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index ca3b01f5fffa..1f67606fd4fb 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
@@ -154,7 +154,7 @@ static void dwc3_free_event_buffers(struct dwc3 *dwc) | |||
154 | struct dwc3_event_buffer *evt; | 154 | struct dwc3_event_buffer *evt; |
155 | int i; | 155 | int i; |
156 | 156 | ||
157 | for (i = 0; i < DWC3_EVENT_BUFFERS_NUM; i++) { | 157 | for (i = 0; i < dwc->num_event_buffers; i++) { |
158 | evt = dwc->ev_buffs[i]; | 158 | evt = dwc->ev_buffs[i]; |
159 | if (evt) { | 159 | if (evt) { |
160 | dwc3_free_one_event_buffer(dwc, evt); | 160 | dwc3_free_one_event_buffer(dwc, evt); |
@@ -166,17 +166,19 @@ static void dwc3_free_event_buffers(struct dwc3 *dwc) | |||
166 | /** | 166 | /** |
167 | * dwc3_alloc_event_buffers - Allocates @num event buffers of size @length | 167 | * dwc3_alloc_event_buffers - Allocates @num event buffers of size @length |
168 | * @dwc: Pointer to out controller context structure | 168 | * @dwc: Pointer to out controller context structure |
169 | * @num: number of event buffers to allocate | ||
170 | * @length: size of event buffer | 169 | * @length: size of event buffer |
171 | * | 170 | * |
172 | * Returns 0 on success otherwise negative errno. In error the case, dwc | 171 | * Returns 0 on success otherwise negative errno. In error the case, dwc |
173 | * may contain some buffers allocated but not all which were requested. | 172 | * may contain some buffers allocated but not all which were requested. |
174 | */ | 173 | */ |
175 | static int __devinit dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned num, | 174 | static int __devinit dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned length) |
176 | unsigned length) | ||
177 | { | 175 | { |
176 | int num; | ||
178 | int i; | 177 | int i; |
179 | 178 | ||
179 | num = DWC3_NUM_INT(dwc->hwparams.hwparams1); | ||
180 | dwc->num_event_buffers = num; | ||
181 | |||
180 | for (i = 0; i < num; i++) { | 182 | for (i = 0; i < num; i++) { |
181 | struct dwc3_event_buffer *evt; | 183 | struct dwc3_event_buffer *evt; |
182 | 184 | ||
@@ -202,7 +204,7 @@ static int __devinit dwc3_event_buffers_setup(struct dwc3 *dwc) | |||
202 | struct dwc3_event_buffer *evt; | 204 | struct dwc3_event_buffer *evt; |
203 | int n; | 205 | int n; |
204 | 206 | ||
205 | for (n = 0; n < DWC3_EVENT_BUFFERS_NUM; n++) { | 207 | for (n = 0; n < dwc->num_event_buffers; n++) { |
206 | evt = dwc->ev_buffs[n]; | 208 | evt = dwc->ev_buffs[n]; |
207 | dev_dbg(dwc->dev, "Event buf %p dma %08llx length %d\n", | 209 | dev_dbg(dwc->dev, "Event buf %p dma %08llx length %d\n", |
208 | evt->buf, (unsigned long long) evt->dma, | 210 | evt->buf, (unsigned long long) evt->dma, |
@@ -225,7 +227,7 @@ static void dwc3_event_buffers_cleanup(struct dwc3 *dwc) | |||
225 | struct dwc3_event_buffer *evt; | 227 | struct dwc3_event_buffer *evt; |
226 | int n; | 228 | int n; |
227 | 229 | ||
228 | for (n = 0; n < DWC3_EVENT_BUFFERS_NUM; n++) { | 230 | for (n = 0; n < dwc->num_event_buffers; n++) { |
229 | evt = dwc->ev_buffs[n]; | 231 | evt = dwc->ev_buffs[n]; |
230 | dwc3_writel(dwc->regs, DWC3_GEVNTADRLO(n), 0); | 232 | dwc3_writel(dwc->regs, DWC3_GEVNTADRLO(n), 0); |
231 | dwc3_writel(dwc->regs, DWC3_GEVNTADRHI(n), 0); | 233 | dwc3_writel(dwc->regs, DWC3_GEVNTADRHI(n), 0); |
@@ -289,8 +291,9 @@ static int __devinit dwc3_core_init(struct dwc3 *dwc) | |||
289 | cpu_relax(); | 291 | cpu_relax(); |
290 | } while (true); | 292 | } while (true); |
291 | 293 | ||
292 | ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_NUM, | 294 | dwc3_cache_hwparams(dwc); |
293 | DWC3_EVENT_BUFFERS_SIZE); | 295 | |
296 | ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_SIZE); | ||
294 | if (ret) { | 297 | if (ret) { |
295 | dev_err(dwc->dev, "failed to allocate event buffers\n"); | 298 | dev_err(dwc->dev, "failed to allocate event buffers\n"); |
296 | ret = -ENOMEM; | 299 | ret = -ENOMEM; |
@@ -303,8 +306,6 @@ static int __devinit dwc3_core_init(struct dwc3 *dwc) | |||
303 | goto err1; | 306 | goto err1; |
304 | } | 307 | } |
305 | 308 | ||
306 | dwc3_cache_hwparams(dwc); | ||
307 | |||
308 | return 0; | 309 | return 0; |
309 | 310 | ||
310 | err1: | 311 | err1: |