Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: gadget: atmel_usba: Cache INT_ENB register value

Cache INT_ENB register value in order to avoid uncached iomem access, and
thus improve access time to INT_ENB value.

Acked-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>

authored by

Boris Brezillon and committed by
Felipe Balbi
e3a912a1 9870d895

+30 -24
+28 -24
drivers/usb/gadget/udc/atmel_usba_udc.c
··· 316 316 } 317 317 #endif 318 318 319 + static inline u32 usba_int_enb_get(struct usba_udc *udc) 320 + { 321 + return udc->int_enb_cache; 322 + } 323 + 324 + static inline void usba_int_enb_set(struct usba_udc *udc, u32 val) 325 + { 326 + usba_writel(udc, INT_ENB, val); 327 + udc->int_enb_cache = val; 328 + } 329 + 319 330 static int vbus_is_present(struct usba_udc *udc) 320 331 { 321 332 if (gpio_is_valid(udc->vbus_pin)) ··· 608 597 if (ep->can_dma) { 609 598 u32 ctrl; 610 599 611 - usba_writel(udc, INT_ENB, 612 - (usba_readl(udc, INT_ENB) 613 - | USBA_BF(EPT_INT, 1 << ep->index) 614 - | USBA_BF(DMA_INT, 1 << ep->index))); 600 + usba_int_enb_set(udc, usba_int_enb_get(udc) | 601 + USBA_BF(EPT_INT, 1 << ep->index) | 602 + USBA_BF(DMA_INT, 1 << ep->index)); 615 603 ctrl = USBA_AUTO_VALID | USBA_INTDIS_DMA; 616 604 usba_ep_writel(ep, CTL_ENB, ctrl); 617 605 } else { 618 - usba_writel(udc, INT_ENB, 619 - (usba_readl(udc, INT_ENB) 620 - | USBA_BF(EPT_INT, 1 << ep->index))); 606 + usba_int_enb_set(udc, usba_int_enb_get(udc) | 607 + USBA_BF(EPT_INT, 1 << ep->index)); 621 608 } 622 609 623 610 spin_unlock_irqrestore(&udc->lock, flags); ··· 623 614 DBG(DBG_HW, "EPT_CFG%d after init: %#08lx\n", ep->index, 624 615 (unsigned long)usba_ep_readl(ep, CFG)); 625 616 DBG(DBG_HW, "INT_ENB after init: %#08lx\n", 626 - (unsigned long)usba_readl(udc, INT_ENB)); 617 + (unsigned long)usba_int_enb_get(udc)); 627 618 628 619 return 0; 629 620 } ··· 659 650 usba_dma_readl(ep, STATUS); 660 651 } 661 652 usba_ep_writel(ep, CTL_DIS, USBA_EPT_ENABLE); 662 - usba_writel(udc, INT_ENB, 663 - usba_readl(udc, INT_ENB) 664 - & ~USBA_BF(EPT_INT, 1 << ep->index)); 653 + usba_int_enb_set(udc, usba_int_enb_get(udc) & 654 + ~USBA_BF(EPT_INT, 1 << ep->index)); 665 655 666 656 request_complete_list(ep, &req_list, -ESHUTDOWN); 667 657 ··· 1614 1606 static irqreturn_t usba_udc_irq(int irq, void *devid) 1615 1607 { 1616 1608 struct usba_udc *udc = devid; 1617 - u32 status; 1609 + u32 status, int_enb; 1618 1610 u32 dma_status; 1619 1611 u32 ep_status; 1620 1612 1621 1613 spin_lock(&udc->lock); 1622 1614 1623 - status = usba_readl(udc, INT_STA) & usba_readl(udc, INT_ENB); 1615 + int_enb = usba_int_enb_get(udc); 1616 + status = usba_readl(udc, INT_STA) & int_enb; 1624 1617 DBG(DBG_INT, "irq, status=%#08x\n", status); 1625 1618 1626 1619 if (status & USBA_DET_SUSPEND) { 1627 1620 toggle_bias(udc, 0); 1628 1621 usba_writel(udc, INT_CLR, USBA_DET_SUSPEND); 1629 - usba_writel(udc, INT_ENB, 1630 - usba_readl(udc, INT_ENB) | USBA_WAKE_UP); 1622 + usba_int_enb_set(udc, int_enb | USBA_WAKE_UP); 1631 1623 udc->bias_pulse_needed = true; 1632 1624 DBG(DBG_BUS, "Suspend detected\n"); 1633 1625 if (udc->gadget.speed != USB_SPEED_UNKNOWN ··· 1641 1633 if (status & USBA_WAKE_UP) { 1642 1634 toggle_bias(udc, 1); 1643 1635 usba_writel(udc, INT_CLR, USBA_WAKE_UP); 1644 - usba_writel(udc, INT_ENB, 1645 - usba_readl(udc, INT_ENB) & ~USBA_WAKE_UP); 1636 + usba_int_enb_set(udc, int_enb & ~USBA_WAKE_UP); 1646 1637 DBG(DBG_BUS, "Wake Up CPU detected\n"); 1647 1638 } 1648 1639 ··· 1709 1702 | USBA_BF(BK_NUMBER, USBA_BK_NUMBER_ONE))); 1710 1703 usba_ep_writel(ep0, CTL_ENB, 1711 1704 USBA_EPT_ENABLE | USBA_RX_SETUP); 1712 - usba_writel(udc, INT_ENB, 1713 - (usba_readl(udc, INT_ENB) 1714 - | USBA_BF(EPT_INT, 1) 1715 - | USBA_DET_SUSPEND 1716 - | USBA_END_OF_RESUME)); 1705 + usba_int_enb_set(udc, int_enb | USBA_BF(EPT_INT, 1) | 1706 + USBA_DET_SUSPEND | USBA_END_OF_RESUME); 1717 1707 1718 1708 /* 1719 1709 * Unclear why we hit this irregularly, e.g. in usbtest, ··· 1745 1741 if (vbus) { 1746 1742 toggle_bias(udc, 1); 1747 1743 usba_writel(udc, CTRL, USBA_ENABLE_MASK); 1748 - usba_writel(udc, INT_ENB, USBA_END_OF_RESET); 1744 + usba_int_enb_set(udc, USBA_END_OF_RESET); 1749 1745 } else { 1750 1746 udc->gadget.speed = USB_SPEED_UNKNOWN; 1751 1747 reset_all_endpoints(udc); ··· 1797 1793 if (vbus_is_present(udc) && udc->vbus_prev == 0) { 1798 1794 toggle_bias(udc, 1); 1799 1795 usba_writel(udc, CTRL, USBA_ENABLE_MASK); 1800 - usba_writel(udc, INT_ENB, USBA_END_OF_RESET); 1796 + usba_int_enb_set(udc, USBA_END_OF_RESET); 1801 1797 } 1802 1798 spin_unlock_irqrestore(&udc->lock, flags); 1803 1799
+2
drivers/usb/gadget/udc/atmel_usba_udc.h
··· 334 334 u16 test_mode; 335 335 int vbus_prev; 336 336 337 + u32 int_enb_cache; 338 + 337 339 #ifdef CONFIG_USB_GADGET_DEBUG_FS 338 340 struct dentry *debugfs_root; 339 341 struct dentry *debugfs_regs;