aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorFelipe Balbi <balbi@ti.com>2011-10-12 03:31:04 -0400
committerFelipe Balbi <balbi@ti.com>2011-12-12 04:48:11 -0500
commit9f622b2a407d8b34a5a7f5b4abd8b29b25cf4f32 (patch)
treea80c6f48a8f1c4fd70d0865b027035d3f8e0d44e /drivers
parent6c167fc9b0c23ead791edb94cf4debb6b8e534b5 (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.c21
-rw-r--r--drivers/usb/dwc3/core.h8
-rw-r--r--drivers/usb/dwc3/gadget.c2
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 */
175static int __devinit dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned num, 174static 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
310err1: 311err1:
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);