123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- From 660e9bde74d6915227d7ee3485b11e5f52637b26 Mon Sep 17 00:00:00 2001
- From: Felipe Balbi <felipe.balbi@linux.intel.com>
- Date: Wed, 30 Mar 2016 09:26:24 +0300
- Subject: usb: dwc3: remove num_event_buffers
- We never, ever route any of the other event buffers
- so we might as well drop support for them.
- Until someone has a real, proper benefit for
- multiple event buffers, we will rely on a single
- one. This also helps reduce memory footprint of
- dwc3.ko which won't allocate memory for the extra
- event buffers.
- Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
- ---
- drivers/usb/dwc3/core.c | 81 +++++++++++++++++++----------------------------
- drivers/usb/dwc3/core.h | 2 --
- drivers/usb/dwc3/gadget.c | 38 +++++++---------------
- 3 files changed, 44 insertions(+), 77 deletions(-)
- --- a/drivers/usb/dwc3/core.c
- +++ b/drivers/usb/dwc3/core.c
- @@ -203,13 +203,10 @@ static struct dwc3_event_buffer *dwc3_al
- static void dwc3_free_event_buffers(struct dwc3 *dwc)
- {
- struct dwc3_event_buffer *evt;
- - int i;
-
- - for (i = 0; i < dwc->num_event_buffers; i++) {
- - evt = dwc->ev_buffs[i];
- - if (evt)
- - dwc3_free_one_event_buffer(dwc, evt);
- - }
- + evt = dwc->ev_buffs[0];
- + if (evt)
- + dwc3_free_one_event_buffer(dwc, evt);
- }
-
- /**
- @@ -222,27 +219,19 @@ static void dwc3_free_event_buffers(stru
- */
- static int dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned length)
- {
- - int num;
- - int i;
- -
- - num = DWC3_NUM_INT(dwc->hwparams.hwparams1);
- - dwc->num_event_buffers = num;
- + struct dwc3_event_buffer *evt;
-
- - dwc->ev_buffs = devm_kzalloc(dwc->dev, sizeof(*dwc->ev_buffs) * num,
- + dwc->ev_buffs = devm_kzalloc(dwc->dev, sizeof(*dwc->ev_buffs),
- GFP_KERNEL);
- if (!dwc->ev_buffs)
- return -ENOMEM;
-
- - for (i = 0; i < num; i++) {
- - struct dwc3_event_buffer *evt;
- -
- - evt = dwc3_alloc_one_event_buffer(dwc, length);
- - if (IS_ERR(evt)) {
- - dev_err(dwc->dev, "can't allocate event buffer\n");
- - return PTR_ERR(evt);
- - }
- - dwc->ev_buffs[i] = evt;
- + evt = dwc3_alloc_one_event_buffer(dwc, length);
- + if (IS_ERR(evt)) {
- + dev_err(dwc->dev, "can't allocate event buffer\n");
- + return PTR_ERR(evt);
- }
- + dwc->ev_buffs[0] = evt;
-
- return 0;
- }
- @@ -256,25 +245,22 @@ static int dwc3_alloc_event_buffers(stru
- static int dwc3_event_buffers_setup(struct dwc3 *dwc)
- {
- struct dwc3_event_buffer *evt;
- - int n;
-
- - for (n = 0; n < dwc->num_event_buffers; n++) {
- - evt = dwc->ev_buffs[n];
- - dwc3_trace(trace_dwc3_core,
- - "Event buf %p dma %08llx length %d\n",
- - evt->buf, (unsigned long long) evt->dma,
- - evt->length);
- -
- - evt->lpos = 0;
- -
- - dwc3_writel(dwc->regs, DWC3_GEVNTADRLO(n),
- - lower_32_bits(evt->dma));
- - dwc3_writel(dwc->regs, DWC3_GEVNTADRHI(n),
- - upper_32_bits(evt->dma));
- - dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(n),
- - DWC3_GEVNTSIZ_SIZE(evt->length));
- - dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(n), 0);
- - }
- + evt = dwc->ev_buffs[0];
- + dwc3_trace(trace_dwc3_core,
- + "Event buf %p dma %08llx length %d\n",
- + evt->buf, (unsigned long long) evt->dma,
- + evt->length);
- +
- + evt->lpos = 0;
- +
- + dwc3_writel(dwc->regs, DWC3_GEVNTADRLO(0),
- + lower_32_bits(evt->dma));
- + dwc3_writel(dwc->regs, DWC3_GEVNTADRHI(0),
- + upper_32_bits(evt->dma));
- + dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0),
- + DWC3_GEVNTSIZ_SIZE(evt->length));
- + dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), 0);
-
- return 0;
- }
- @@ -282,19 +268,16 @@ static int dwc3_event_buffers_setup(stru
- static void dwc3_event_buffers_cleanup(struct dwc3 *dwc)
- {
- struct dwc3_event_buffer *evt;
- - int n;
-
- - for (n = 0; n < dwc->num_event_buffers; n++) {
- - evt = dwc->ev_buffs[n];
- + evt = dwc->ev_buffs[0];
-
- - evt->lpos = 0;
- + evt->lpos = 0;
-
- - dwc3_writel(dwc->regs, DWC3_GEVNTADRLO(n), 0);
- - dwc3_writel(dwc->regs, DWC3_GEVNTADRHI(n), 0);
- - dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(n), DWC3_GEVNTSIZ_INTMASK
- - | DWC3_GEVNTSIZ_SIZE(0));
- - dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(n), 0);
- - }
- + dwc3_writel(dwc->regs, DWC3_GEVNTADRLO(0), 0);
- + dwc3_writel(dwc->regs, DWC3_GEVNTADRHI(0), 0);
- + dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), DWC3_GEVNTSIZ_INTMASK
- + | DWC3_GEVNTSIZ_SIZE(0));
- + dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), 0);
- }
-
- static int dwc3_alloc_scratch_buffers(struct dwc3 *dwc)
- --- a/drivers/usb/dwc3/core.h
- +++ b/drivers/usb/dwc3/core.h
- @@ -665,7 +665,6 @@ struct dwc3_scratchpad_array {
- * @regs: base address for our registers
- * @regs_size: address space size
- * @nr_scratch: number of scratch buffers
- - * @num_event_buffers: calculated number of event buffers
- * @u1u2: only used on revisions <1.83a for workaround
- * @maximum_speed: maximum speed requested (mainly for testing purposes)
- * @revision: revision register contents
- @@ -775,7 +774,6 @@ struct dwc3 {
- u32 gctl;
-
- u32 nr_scratch;
- - u32 num_event_buffers;
- u32 u1u2;
- u32 maximum_speed;
-
- --- a/drivers/usb/dwc3/gadget.c
- +++ b/drivers/usb/dwc3/gadget.c
- @@ -2572,14 +2572,14 @@ static void dwc3_process_event_entry(str
- }
- }
-
- -static irqreturn_t dwc3_process_event_buf(struct dwc3 *dwc, u32 buf)
- +static irqreturn_t dwc3_process_event_buf(struct dwc3 *dwc)
- {
- struct dwc3_event_buffer *evt;
- irqreturn_t ret = IRQ_NONE;
- int left;
- u32 reg;
-
- - evt = dwc->ev_buffs[buf];
- + evt = dwc->ev_buffs[0];
- left = evt->count;
-
- if (!(evt->flags & DWC3_EVENT_PENDING))
- @@ -2604,7 +2604,7 @@ static irqreturn_t dwc3_process_event_bu
- evt->lpos = (evt->lpos + 4) % DWC3_EVENT_BUFFERS_SIZE;
- left -= 4;
-
- - dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(buf), 4);
- + dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), 4);
- }
-
- evt->count = 0;
- @@ -2612,9 +2612,9 @@ static irqreturn_t dwc3_process_event_bu
- ret = IRQ_HANDLED;
-
- /* Unmask interrupt */
- - reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(buf));
- + reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(0));
- reg &= ~DWC3_GEVNTSIZ_INTMASK;
- - dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(buf), reg);
- + dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg);
-
- return ret;
- }
- @@ -2624,27 +2624,23 @@ static irqreturn_t dwc3_thread_interrupt
- struct dwc3 *dwc = _dwc;
- unsigned long flags;
- irqreturn_t ret = IRQ_NONE;
- - int i;
-
- spin_lock_irqsave(&dwc->lock, flags);
- -
- - for (i = 0; i < dwc->num_event_buffers; i++)
- - ret |= dwc3_process_event_buf(dwc, i);
- -
- + ret = dwc3_process_event_buf(dwc);
- spin_unlock_irqrestore(&dwc->lock, flags);
-
- return ret;
- }
-
- -static irqreturn_t dwc3_check_event_buf(struct dwc3 *dwc, u32 buf)
- +static irqreturn_t dwc3_check_event_buf(struct dwc3 *dwc)
- {
- struct dwc3_event_buffer *evt;
- u32 count;
- u32 reg;
-
- - evt = dwc->ev_buffs[buf];
- + evt = dwc->ev_buffs[0];
-
- - count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(buf));
- + count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(0));
- count &= DWC3_GEVNTCOUNT_MASK;
- if (!count)
- return IRQ_NONE;
- @@ -2653,9 +2649,9 @@ static irqreturn_t dwc3_check_event_buf(
- evt->flags |= DWC3_EVENT_PENDING;
-
- /* Mask interrupt */
- - reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(buf));
- + reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(0));
- reg |= DWC3_GEVNTSIZ_INTMASK;
- - dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(buf), reg);
- + dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg);
-
- return IRQ_WAKE_THREAD;
- }
- @@ -2663,18 +2659,8 @@ static irqreturn_t dwc3_check_event_buf(
- static irqreturn_t dwc3_interrupt(int irq, void *_dwc)
- {
- struct dwc3 *dwc = _dwc;
- - int i;
- - irqreturn_t ret = IRQ_NONE;
- -
- - for (i = 0; i < dwc->num_event_buffers; i++) {
- - irqreturn_t status;
-
- - status = dwc3_check_event_buf(dwc, i);
- - if (status == IRQ_WAKE_THREAD)
- - ret = status;
- - }
- -
- - return ret;
- + return dwc3_check_event_buf(dwc);
- }
-
- /**
|