提交 9f622b2a 编写于 作者: F Felipe Balbi

usb: dwc3: calculate number of event buffers dynamically

This will allow us to only allocate memory when
we actually need.
Signed-off-by: NFelipe Balbi <balbi@ti.com>
上级 6c167fc9
...@@ -154,7 +154,7 @@ static void dwc3_free_event_buffers(struct dwc3 *dwc) ...@@ -154,7 +154,7 @@ static void dwc3_free_event_buffers(struct dwc3 *dwc)
struct dwc3_event_buffer *evt; struct dwc3_event_buffer *evt;
int i; int i;
for (i = 0; i < DWC3_EVENT_BUFFERS_NUM; i++) { for (i = 0; i < dwc->num_event_buffers; i++) {
evt = dwc->ev_buffs[i]; evt = dwc->ev_buffs[i];
if (evt) { if (evt) {
dwc3_free_one_event_buffer(dwc, evt); dwc3_free_one_event_buffer(dwc, evt);
...@@ -166,17 +166,19 @@ static void dwc3_free_event_buffers(struct dwc3 *dwc) ...@@ -166,17 +166,19 @@ static void dwc3_free_event_buffers(struct dwc3 *dwc)
/** /**
* dwc3_alloc_event_buffers - Allocates @num event buffers of size @length * dwc3_alloc_event_buffers - Allocates @num event buffers of size @length
* @dwc: Pointer to out controller context structure * @dwc: Pointer to out controller context structure
* @num: number of event buffers to allocate
* @length: size of event buffer * @length: size of event buffer
* *
* Returns 0 on success otherwise negative errno. In error the case, dwc * Returns 0 on success otherwise negative errno. In error the case, dwc
* may contain some buffers allocated but not all which were requested. * may contain some buffers allocated but not all which were requested.
*/ */
static int __devinit dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned num, static int __devinit dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned length)
unsigned length)
{ {
int num;
int i; int i;
num = DWC3_NUM_INT(dwc->hwparams.hwparams1);
dwc->num_event_buffers = num;
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
struct dwc3_event_buffer *evt; struct dwc3_event_buffer *evt;
...@@ -202,7 +204,7 @@ static int __devinit dwc3_event_buffers_setup(struct dwc3 *dwc) ...@@ -202,7 +204,7 @@ static int __devinit dwc3_event_buffers_setup(struct dwc3 *dwc)
struct dwc3_event_buffer *evt; struct dwc3_event_buffer *evt;
int n; int n;
for (n = 0; n < DWC3_EVENT_BUFFERS_NUM; n++) { for (n = 0; n < dwc->num_event_buffers; n++) {
evt = dwc->ev_buffs[n]; evt = dwc->ev_buffs[n];
dev_dbg(dwc->dev, "Event buf %p dma %08llx length %d\n", dev_dbg(dwc->dev, "Event buf %p dma %08llx length %d\n",
evt->buf, (unsigned long long) evt->dma, evt->buf, (unsigned long long) evt->dma,
...@@ -225,7 +227,7 @@ static void dwc3_event_buffers_cleanup(struct dwc3 *dwc) ...@@ -225,7 +227,7 @@ static void dwc3_event_buffers_cleanup(struct dwc3 *dwc)
struct dwc3_event_buffer *evt; struct dwc3_event_buffer *evt;
int n; int n;
for (n = 0; n < DWC3_EVENT_BUFFERS_NUM; n++) { for (n = 0; n < dwc->num_event_buffers; n++) {
evt = dwc->ev_buffs[n]; evt = dwc->ev_buffs[n];
dwc3_writel(dwc->regs, DWC3_GEVNTADRLO(n), 0); dwc3_writel(dwc->regs, DWC3_GEVNTADRLO(n), 0);
dwc3_writel(dwc->regs, DWC3_GEVNTADRHI(n), 0); dwc3_writel(dwc->regs, DWC3_GEVNTADRHI(n), 0);
...@@ -289,8 +291,9 @@ static int __devinit dwc3_core_init(struct dwc3 *dwc) ...@@ -289,8 +291,9 @@ static int __devinit dwc3_core_init(struct dwc3 *dwc)
cpu_relax(); cpu_relax();
} while (true); } while (true);
ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_NUM, dwc3_cache_hwparams(dwc);
DWC3_EVENT_BUFFERS_SIZE);
ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_SIZE);
if (ret) { if (ret) {
dev_err(dwc->dev, "failed to allocate event buffers\n"); dev_err(dwc->dev, "failed to allocate event buffers\n");
ret = -ENOMEM; ret = -ENOMEM;
...@@ -303,8 +306,6 @@ static int __devinit dwc3_core_init(struct dwc3 *dwc) ...@@ -303,8 +306,6 @@ static int __devinit dwc3_core_init(struct dwc3 *dwc)
goto err1; goto err1;
} }
dwc3_cache_hwparams(dwc);
return 0; return 0;
err1: err1:
......
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
/* Global constants */ /* Global constants */
#define DWC3_ENDPOINTS_NUM 32 #define DWC3_ENDPOINTS_NUM 32
#define DWC3_EVENT_BUFFERS_NUM 2 #define DWC3_EVENT_BUFFERS_MAX 2
#define DWC3_EVENT_BUFFERS_SIZE PAGE_SIZE #define DWC3_EVENT_BUFFERS_SIZE PAGE_SIZE
#define DWC3_EVENT_TYPE_MASK 0xfe #define DWC3_EVENT_TYPE_MASK 0xfe
...@@ -536,6 +536,8 @@ struct dwc3_hwparams { ...@@ -536,6 +536,8 @@ struct dwc3_hwparams {
u32 hwparams8; u32 hwparams8;
}; };
#define DWC3_NUM_INT(n) (((n) & (0x3f << 15)) >> 15)
/** /**
* struct dwc3 - representation of our controller * struct dwc3 - representation of our controller
* @ctrl_req: usb control request which is used for ep0 * @ctrl_req: usb control request which is used for ep0
...@@ -555,6 +557,7 @@ struct dwc3_hwparams { ...@@ -555,6 +557,7 @@ struct dwc3_hwparams {
* @regs: base address for our registers * @regs: base address for our registers
* @regs_size: address space size * @regs_size: address space size
* @irq: IRQ number * @irq: IRQ number
* @num_event_buffers: calculated number of event buffers
* @maximum_speed: maximum speed requested (mainly for testing purposes) * @maximum_speed: maximum speed requested (mainly for testing purposes)
* @revision: revision register contents * @revision: revision register contents
* @is_selfpowered: true when we are selfpowered * @is_selfpowered: true when we are selfpowered
...@@ -585,7 +588,7 @@ struct dwc3 { ...@@ -585,7 +588,7 @@ struct dwc3 {
spinlock_t lock; spinlock_t lock;
struct device *dev; struct device *dev;
struct dwc3_event_buffer *ev_buffs[DWC3_EVENT_BUFFERS_NUM]; struct dwc3_event_buffer *ev_buffs[DWC3_EVENT_BUFFERS_MAX];
struct dwc3_ep *eps[DWC3_ENDPOINTS_NUM]; struct dwc3_ep *eps[DWC3_ENDPOINTS_NUM];
struct usb_gadget gadget; struct usb_gadget gadget;
...@@ -596,6 +599,7 @@ struct dwc3 { ...@@ -596,6 +599,7 @@ struct dwc3 {
int irq; int irq;
u32 num_event_buffers;
u32 maximum_speed; u32 maximum_speed;
u32 revision; u32 revision;
......
...@@ -1925,7 +1925,7 @@ static irqreturn_t dwc3_interrupt(int irq, void *_dwc) ...@@ -1925,7 +1925,7 @@ static irqreturn_t dwc3_interrupt(int irq, void *_dwc)
spin_lock(&dwc->lock); spin_lock(&dwc->lock);
for (i = 0; i < DWC3_EVENT_BUFFERS_NUM; i++) { for (i = 0; i < dwc->num_event_buffers; i++) {
irqreturn_t status; irqreturn_t status;
status = dwc3_process_event_buf(dwc, i); status = dwc3_process_event_buf(dwc, i);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册