usb: dwc3: gadget: Skip reading GEVNTSIZn
authorThinh Nguyen <Thinh.Nguyen@synopsys.com>
Tue, 30 Nov 2021 02:53:22 +0000 (18:53 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 3 Dec 2021 11:02:49 +0000 (12:02 +0100)
The driver knows what it needs to set for GEVNTSIZn, and the controller
doesn't modify this register unless there's a hard reset. To save a few
microseconds of register read in read-modify-write operation, simply do
register write with the expected values. This can improve performance
when there are many interrupts generated, which the driver needs to
check and handle.

Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Link: https://lore.kernel.org/r/efddf4ee5821c4bc5ae7ad90d629ec7a0ebcbf9a.1638240306.git.Thinh.Nguyen@synopsys.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc3/gadget.c

index f66baaef8a40cefc48b67fb2ab7cfbfec8e2219f..c0c89374716bcd785d82cd8ed69c668e0a74c0de 100644 (file)
@@ -4082,7 +4082,6 @@ static irqreturn_t dwc3_process_event_buf(struct dwc3_event_buffer *evt)
        struct dwc3 *dwc = evt->dwc;
        irqreturn_t ret = IRQ_NONE;
        int left;
-       u32 reg;
 
        left = evt->count;
 
@@ -4114,9 +4113,8 @@ static irqreturn_t dwc3_process_event_buf(struct dwc3_event_buffer *evt)
        ret = IRQ_HANDLED;
 
        /* Unmask interrupt */
-       reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(0));
-       reg &= ~DWC3_GEVNTSIZ_INTMASK;
-       dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg);
+       dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0),
+                   DWC3_GEVNTSIZ_SIZE(evt->length));
 
        if (dwc->imod_interval) {
                dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), DWC3_GEVNTCOUNT_EHB);
@@ -4145,7 +4143,6 @@ static irqreturn_t dwc3_check_event_buf(struct dwc3_event_buffer *evt)
        struct dwc3 *dwc = evt->dwc;
        u32 amount;
        u32 count;
-       u32 reg;
 
        if (pm_runtime_suspended(dwc->dev)) {
                pm_runtime_get(dwc->dev);
@@ -4172,9 +4169,8 @@ static irqreturn_t dwc3_check_event_buf(struct dwc3_event_buffer *evt)
        evt->flags |= DWC3_EVENT_PENDING;
 
        /* Mask interrupt */
-       reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(0));
-       reg |= DWC3_GEVNTSIZ_INTMASK;
-       dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg);
+       dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0),
+                   DWC3_GEVNTSIZ_INTMASK | DWC3_GEVNTSIZ_SIZE(evt->length));
 
        amount = min(count, evt->length - evt->lpos);
        memcpy(evt->cache + evt->lpos, evt->buf + evt->lpos, amount);