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 | |
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')
-rw-r--r-- | drivers/usb/dwc3/core.c | 21 | ||||
-rw-r--r-- | drivers/usb/dwc3/core.h | 8 | ||||
-rw-r--r-- | drivers/usb/dwc3/gadget.c | 2 |
3 files changed, 18 insertions, 13 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: |
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index b7d56c3a1fbb..4b6c673ed608 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h | |||
@@ -52,7 +52,7 @@ | |||
52 | /* Global constants */ | 52 | /* Global constants */ |
53 | #define DWC3_ENDPOINTS_NUM 32 | 53 | #define DWC3_ENDPOINTS_NUM 32 |
54 | 54 | ||
55 | #define DWC3_EVENT_BUFFERS_NUM 2 | 55 | #define DWC3_EVENT_BUFFERS_MAX 2 |
56 | #define DWC3_EVENT_BUFFERS_SIZE PAGE_SIZE | 56 | #define DWC3_EVENT_BUFFERS_SIZE PAGE_SIZE |
57 | #define DWC3_EVENT_TYPE_MASK 0xfe | 57 | #define DWC3_EVENT_TYPE_MASK 0xfe |
58 | 58 | ||
@@ -536,6 +536,8 @@ struct dwc3_hwparams { | |||
536 | u32 hwparams8; | 536 | u32 hwparams8; |
537 | }; | 537 | }; |
538 | 538 | ||
539 | #define DWC3_NUM_INT(n) (((n) & (0x3f << 15)) >> 15) | ||
540 | |||
539 | /** | 541 | /** |
540 | * struct dwc3 - representation of our controller | 542 | * struct dwc3 - representation of our controller |
541 | * @ctrl_req: usb control request which is used for ep0 | 543 | * @ctrl_req: usb control request which is used for ep0 |
@@ -555,6 +557,7 @@ struct dwc3_hwparams { | |||
555 | * @regs: base address for our registers | 557 | * @regs: base address for our registers |
556 | * @regs_size: address space size | 558 | * @regs_size: address space size |
557 | * @irq: IRQ number | 559 | * @irq: IRQ number |
560 | * @num_event_buffers: calculated number of event buffers | ||
558 | * @maximum_speed: maximum speed requested (mainly for testing purposes) | 561 | * @maximum_speed: maximum speed requested (mainly for testing purposes) |
559 | * @revision: revision register contents | 562 | * @revision: revision register contents |
560 | * @is_selfpowered: true when we are selfpowered | 563 | * @is_selfpowered: true when we are selfpowered |
@@ -585,7 +588,7 @@ struct dwc3 { | |||
585 | spinlock_t lock; | 588 | spinlock_t lock; |
586 | struct device *dev; | 589 | struct device *dev; |
587 | 590 | ||
588 | struct dwc3_event_buffer *ev_buffs[DWC3_EVENT_BUFFERS_NUM]; | 591 | struct dwc3_event_buffer *ev_buffs[DWC3_EVENT_BUFFERS_MAX]; |
589 | struct dwc3_ep *eps[DWC3_ENDPOINTS_NUM]; | 592 | struct dwc3_ep *eps[DWC3_ENDPOINTS_NUM]; |
590 | 593 | ||
591 | struct usb_gadget gadget; | 594 | struct usb_gadget gadget; |
@@ -596,6 +599,7 @@ struct dwc3 { | |||
596 | 599 | ||
597 | int irq; | 600 | int irq; |
598 | 601 | ||
602 | u32 num_event_buffers; | ||
599 | u32 maximum_speed; | 603 | u32 maximum_speed; |
600 | u32 revision; | 604 | u32 revision; |
601 | 605 | ||
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 807737aec00e..b84418e88774 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
@@ -1925,7 +1925,7 @@ static irqreturn_t dwc3_interrupt(int irq, void *_dwc) | |||
1925 | 1925 | ||
1926 | spin_lock(&dwc->lock); | 1926 | spin_lock(&dwc->lock); |
1927 | 1927 | ||
1928 | for (i = 0; i < DWC3_EVENT_BUFFERS_NUM; i++) { | 1928 | for (i = 0; i < dwc->num_event_buffers; i++) { |
1929 | irqreturn_t status; | 1929 | irqreturn_t status; |
1930 | 1930 | ||
1931 | status = dwc3_process_event_buf(dwc, i); | 1931 | status = dwc3_process_event_buf(dwc, i); |