]> git.ipfire.org Git - thirdparty/kernel/stable.git/blobdiff - drivers/usb/dwc2/hcd.c
usb: dwc2: Fix DMA cache alignment issues
[thirdparty/kernel/stable.git] / drivers / usb / dwc2 / hcd.c
index 6e2cdd7b93d46cf839fe2c515e88028dec22bb2e..9221a02e795801f9794f6957b644f47e93db9596 100644 (file)
@@ -75,10 +75,10 @@ static void dwc2_enable_common_interrupts(struct dwc2_hsotg *hsotg)
        u32 intmsk;
 
        /* Clear any pending OTG Interrupts */
-       dwc2_writel(0xffffffff, hsotg->regs + GOTGINT);
+       dwc2_writel(hsotg, 0xffffffff, GOTGINT);
 
        /* Clear any pending interrupts */
-       dwc2_writel(0xffffffff, hsotg->regs + GINTSTS);
+       dwc2_writel(hsotg, 0xffffffff, GINTSTS);
 
        /* Enable the interrupts in the GINTMSK */
        intmsk = GINTSTS_MODEMIS | GINTSTS_OTGINT;
@@ -94,7 +94,7 @@ static void dwc2_enable_common_interrupts(struct dwc2_hsotg *hsotg)
        if (dwc2_is_device_mode(hsotg) && hsotg->params.lpm)
                intmsk |= GINTSTS_LPMTRANRCVD;
 
-       dwc2_writel(intmsk, hsotg->regs + GINTMSK);
+       dwc2_writel(hsotg, intmsk, GINTMSK);
 }
 
 /*
@@ -117,10 +117,10 @@ static void dwc2_init_fs_ls_pclk_sel(struct dwc2_hsotg *hsotg)
        }
 
        dev_dbg(hsotg->dev, "Initializing HCFG.FSLSPClkSel to %08x\n", val);
-       hcfg = dwc2_readl(hsotg->regs + HCFG);
+       hcfg = dwc2_readl(hsotg, HCFG);
        hcfg &= ~HCFG_FSLSPCLKSEL_MASK;
        hcfg |= val << HCFG_FSLSPCLKSEL_SHIFT;
-       dwc2_writel(hcfg, hsotg->regs + HCFG);
+       dwc2_writel(hsotg, hcfg, HCFG);
 }
 
 static int dwc2_fs_phy_init(struct dwc2_hsotg *hsotg, bool select_phy)
@@ -135,10 +135,10 @@ static int dwc2_fs_phy_init(struct dwc2_hsotg *hsotg, bool select_phy)
        if (select_phy) {
                dev_dbg(hsotg->dev, "FS PHY selected\n");
 
-               usbcfg = dwc2_readl(hsotg->regs + GUSBCFG);
+               usbcfg = dwc2_readl(hsotg, GUSBCFG);
                if (!(usbcfg & GUSBCFG_PHYSEL)) {
                        usbcfg |= GUSBCFG_PHYSEL;
-                       dwc2_writel(usbcfg, hsotg->regs + GUSBCFG);
+                       dwc2_writel(hsotg, usbcfg, GUSBCFG);
 
                        /* Reset after a PHY select */
                        retval = dwc2_core_reset(hsotg, false);
@@ -151,7 +151,7 @@ static int dwc2_fs_phy_init(struct dwc2_hsotg *hsotg, bool select_phy)
                }
 
                if (hsotg->params.activate_stm_fs_transceiver) {
-                       ggpio = dwc2_readl(hsotg->regs + GGPIO);
+                       ggpio = dwc2_readl(hsotg, GGPIO);
                        if (!(ggpio & GGPIO_STM32_OTG_GCCFG_PWRDWN)) {
                                dev_dbg(hsotg->dev, "Activating transceiver\n");
                                /*
@@ -159,7 +159,7 @@ static int dwc2_fs_phy_init(struct dwc2_hsotg *hsotg, bool select_phy)
                                 * core configuration register.
                                 */
                                ggpio |= GGPIO_STM32_OTG_GCCFG_PWRDWN;
-                               dwc2_writel(ggpio, hsotg->regs + GGPIO);
+                               dwc2_writel(hsotg, ggpio, GGPIO);
                        }
                }
        }
@@ -176,18 +176,18 @@ static int dwc2_fs_phy_init(struct dwc2_hsotg *hsotg, bool select_phy)
                dev_dbg(hsotg->dev, "FS PHY enabling I2C\n");
 
                /* Program GUSBCFG.OtgUtmiFsSel to I2C */
-               usbcfg = dwc2_readl(hsotg->regs + GUSBCFG);
+               usbcfg = dwc2_readl(hsotg, GUSBCFG);
                usbcfg |= GUSBCFG_OTG_UTMI_FS_SEL;
-               dwc2_writel(usbcfg, hsotg->regs + GUSBCFG);
+               dwc2_writel(hsotg, usbcfg, GUSBCFG);
 
                /* Program GI2CCTL.I2CEn */
-               i2cctl = dwc2_readl(hsotg->regs + GI2CCTL);
+               i2cctl = dwc2_readl(hsotg, GI2CCTL);
                i2cctl &= ~GI2CCTL_I2CDEVADDR_MASK;
                i2cctl |= 1 << GI2CCTL_I2CDEVADDR_SHIFT;
                i2cctl &= ~GI2CCTL_I2CEN;
-               dwc2_writel(i2cctl, hsotg->regs + GI2CCTL);
+               dwc2_writel(hsotg, i2cctl, GI2CCTL);
                i2cctl |= GI2CCTL_I2CEN;
-               dwc2_writel(i2cctl, hsotg->regs + GI2CCTL);
+               dwc2_writel(hsotg, i2cctl, GI2CCTL);
        }
 
        return retval;
@@ -201,7 +201,7 @@ static int dwc2_hs_phy_init(struct dwc2_hsotg *hsotg, bool select_phy)
        if (!select_phy)
                return 0;
 
-       usbcfg = dwc2_readl(hsotg->regs + GUSBCFG);
+       usbcfg = dwc2_readl(hsotg, GUSBCFG);
        usbcfg_old = usbcfg;
 
        /*
@@ -236,7 +236,7 @@ static int dwc2_hs_phy_init(struct dwc2_hsotg *hsotg, bool select_phy)
        }
 
        if (usbcfg != usbcfg_old) {
-               dwc2_writel(usbcfg, hsotg->regs + GUSBCFG);
+               dwc2_writel(hsotg, usbcfg, GUSBCFG);
 
                /* Reset after setting the PHY parameters */
                retval = dwc2_core_reset(hsotg, false);
@@ -273,15 +273,15 @@ static int dwc2_phy_init(struct dwc2_hsotg *hsotg, bool select_phy)
            hsotg->hw_params.fs_phy_type == GHWCFG2_FS_PHY_TYPE_DEDICATED &&
            hsotg->params.ulpi_fs_ls) {
                dev_dbg(hsotg->dev, "Setting ULPI FSLS\n");
-               usbcfg = dwc2_readl(hsotg->regs + GUSBCFG);
+               usbcfg = dwc2_readl(hsotg, GUSBCFG);
                usbcfg |= GUSBCFG_ULPI_FS_LS;
                usbcfg |= GUSBCFG_ULPI_CLK_SUSP_M;
-               dwc2_writel(usbcfg, hsotg->regs + GUSBCFG);
+               dwc2_writel(hsotg, usbcfg, GUSBCFG);
        } else {
-               usbcfg = dwc2_readl(hsotg->regs + GUSBCFG);
+               usbcfg = dwc2_readl(hsotg, GUSBCFG);
                usbcfg &= ~GUSBCFG_ULPI_FS_LS;
                usbcfg &= ~GUSBCFG_ULPI_CLK_SUSP_M;
-               dwc2_writel(usbcfg, hsotg->regs + GUSBCFG);
+               dwc2_writel(hsotg, usbcfg, GUSBCFG);
        }
 
        return retval;
@@ -289,7 +289,7 @@ static int dwc2_phy_init(struct dwc2_hsotg *hsotg, bool select_phy)
 
 static int dwc2_gahbcfg_init(struct dwc2_hsotg *hsotg)
 {
-       u32 ahbcfg = dwc2_readl(hsotg->regs + GAHBCFG);
+       u32 ahbcfg = dwc2_readl(hsotg, GAHBCFG);
 
        switch (hsotg->hw_params.arch) {
        case GHWCFG2_EXT_DMA_ARCH:
@@ -316,7 +316,7 @@ static int dwc2_gahbcfg_init(struct dwc2_hsotg *hsotg)
        else
                hsotg->params.dma_desc_enable = false;
 
-       dwc2_writel(ahbcfg, hsotg->regs + GAHBCFG);
+       dwc2_writel(hsotg, ahbcfg, GAHBCFG);
 
        return 0;
 }
@@ -325,7 +325,7 @@ static void dwc2_gusbcfg_init(struct dwc2_hsotg *hsotg)
 {
        u32 usbcfg;
 
-       usbcfg = dwc2_readl(hsotg->regs + GUSBCFG);
+       usbcfg = dwc2_readl(hsotg, GUSBCFG);
        usbcfg &= ~(GUSBCFG_HNPCAP | GUSBCFG_SRPCAP);
 
        switch (hsotg->hw_params.op_mode) {
@@ -353,7 +353,7 @@ static void dwc2_gusbcfg_init(struct dwc2_hsotg *hsotg)
                break;
        }
 
-       dwc2_writel(usbcfg, hsotg->regs + GUSBCFG);
+       dwc2_writel(hsotg, usbcfg, GUSBCFG);
 }
 
 static int dwc2_vbus_supply_init(struct dwc2_hsotg *hsotg)
@@ -390,16 +390,16 @@ static void dwc2_enable_host_interrupts(struct dwc2_hsotg *hsotg)
        dev_dbg(hsotg->dev, "%s()\n", __func__);
 
        /* Disable all interrupts */
-       dwc2_writel(0, hsotg->regs + GINTMSK);
-       dwc2_writel(0, hsotg->regs + HAINTMSK);
+       dwc2_writel(hsotg, 0, GINTMSK);
+       dwc2_writel(hsotg, 0, HAINTMSK);
 
        /* Enable the common interrupts */
        dwc2_enable_common_interrupts(hsotg);
 
        /* Enable host mode interrupts without disturbing common interrupts */
-       intmsk = dwc2_readl(hsotg->regs + GINTMSK);
+       intmsk = dwc2_readl(hsotg, GINTMSK);
        intmsk |= GINTSTS_DISCONNINT | GINTSTS_PRTINT | GINTSTS_HCHINT;
-       dwc2_writel(intmsk, hsotg->regs + GINTMSK);
+       dwc2_writel(hsotg, intmsk, GINTMSK);
 }
 
 /**
@@ -409,12 +409,12 @@ static void dwc2_enable_host_interrupts(struct dwc2_hsotg *hsotg)
  */
 static void dwc2_disable_host_interrupts(struct dwc2_hsotg *hsotg)
 {
-       u32 intmsk = dwc2_readl(hsotg->regs + GINTMSK);
+       u32 intmsk = dwc2_readl(hsotg, GINTMSK);
 
        /* Disable host mode interrupts without disturbing common interrupts */
        intmsk &= ~(GINTSTS_SOF | GINTSTS_PRTINT | GINTSTS_HCHINT |
                    GINTSTS_PTXFEMP | GINTSTS_NPTXFEMP | GINTSTS_DISCONNINT);
-       dwc2_writel(intmsk, hsotg->regs + GINTMSK);
+       dwc2_writel(hsotg, intmsk, GINTMSK);
 }
 
 /*
@@ -494,37 +494,37 @@ static void dwc2_config_fifos(struct dwc2_hsotg *hsotg)
        dwc2_calculate_dynamic_fifo(hsotg);
 
        /* Rx FIFO */
-       grxfsiz = dwc2_readl(hsotg->regs + GRXFSIZ);
+       grxfsiz = dwc2_readl(hsotg, GRXFSIZ);
        dev_dbg(hsotg->dev, "initial grxfsiz=%08x\n", grxfsiz);
        grxfsiz &= ~GRXFSIZ_DEPTH_MASK;
        grxfsiz |= params->host_rx_fifo_size <<
                   GRXFSIZ_DEPTH_SHIFT & GRXFSIZ_DEPTH_MASK;
-       dwc2_writel(grxfsiz, hsotg->regs + GRXFSIZ);
+       dwc2_writel(hsotg, grxfsiz, GRXFSIZ);
        dev_dbg(hsotg->dev, "new grxfsiz=%08x\n",
-               dwc2_readl(hsotg->regs + GRXFSIZ));
+               dwc2_readl(hsotg, GRXFSIZ));
 
        /* Non-periodic Tx FIFO */
        dev_dbg(hsotg->dev, "initial gnptxfsiz=%08x\n",
-               dwc2_readl(hsotg->regs + GNPTXFSIZ));
+               dwc2_readl(hsotg, GNPTXFSIZ));
        nptxfsiz = params->host_nperio_tx_fifo_size <<
                   FIFOSIZE_DEPTH_SHIFT & FIFOSIZE_DEPTH_MASK;
        nptxfsiz |= params->host_rx_fifo_size <<
                    FIFOSIZE_STARTADDR_SHIFT & FIFOSIZE_STARTADDR_MASK;
-       dwc2_writel(nptxfsiz, hsotg->regs + GNPTXFSIZ);
+       dwc2_writel(hsotg, nptxfsiz, GNPTXFSIZ);
        dev_dbg(hsotg->dev, "new gnptxfsiz=%08x\n",
-               dwc2_readl(hsotg->regs + GNPTXFSIZ));
+               dwc2_readl(hsotg, GNPTXFSIZ));
 
        /* Periodic Tx FIFO */
        dev_dbg(hsotg->dev, "initial hptxfsiz=%08x\n",
-               dwc2_readl(hsotg->regs + HPTXFSIZ));
+               dwc2_readl(hsotg, HPTXFSIZ));
        hptxfsiz = params->host_perio_tx_fifo_size <<
                   FIFOSIZE_DEPTH_SHIFT & FIFOSIZE_DEPTH_MASK;
        hptxfsiz |= (params->host_rx_fifo_size +
                     params->host_nperio_tx_fifo_size) <<
                    FIFOSIZE_STARTADDR_SHIFT & FIFOSIZE_STARTADDR_MASK;
-       dwc2_writel(hptxfsiz, hsotg->regs + HPTXFSIZ);
+       dwc2_writel(hsotg, hptxfsiz, HPTXFSIZ);
        dev_dbg(hsotg->dev, "new hptxfsiz=%08x\n",
-               dwc2_readl(hsotg->regs + HPTXFSIZ));
+               dwc2_readl(hsotg, HPTXFSIZ));
 
        if (hsotg->params.en_multiple_tx_fifo &&
            hsotg->hw_params.snpsid >= DWC2_CORE_REV_2_91a) {
@@ -533,14 +533,14 @@ static void dwc2_config_fifos(struct dwc2_hsotg *hsotg)
                 * Global DFIFOCFG calculation for Host mode -
                 * include RxFIFO, NPTXFIFO and HPTXFIFO
                 */
-               dfifocfg = dwc2_readl(hsotg->regs + GDFIFOCFG);
+               dfifocfg = dwc2_readl(hsotg, GDFIFOCFG);
                dfifocfg &= ~GDFIFOCFG_EPINFOBASE_MASK;
                dfifocfg |= (params->host_rx_fifo_size +
                             params->host_nperio_tx_fifo_size +
                             params->host_perio_tx_fifo_size) <<
                            GDFIFOCFG_EPINFOBASE_SHIFT &
                            GDFIFOCFG_EPINFOBASE_MASK;
-               dwc2_writel(dfifocfg, hsotg->regs + GDFIFOCFG);
+               dwc2_writel(hsotg, dfifocfg, GDFIFOCFG);
        }
 }
 
@@ -560,8 +560,8 @@ u32 dwc2_calc_frame_interval(struct dwc2_hsotg *hsotg)
        u32 hprt0;
        int clock = 60; /* default value */
 
-       usbcfg = dwc2_readl(hsotg->regs + GUSBCFG);
-       hprt0 = dwc2_readl(hsotg->regs + HPRT0);
+       usbcfg = dwc2_readl(hsotg, GUSBCFG);
+       hprt0 = dwc2_readl(hsotg, HPRT0);
 
        if (!(usbcfg & GUSBCFG_PHYSEL) && (usbcfg & GUSBCFG_ULPI_UTMI_SEL) &&
            !(usbcfg & GUSBCFG_PHYIF16))
@@ -603,7 +603,6 @@ u32 dwc2_calc_frame_interval(struct dwc2_hsotg *hsotg)
  */
 void dwc2_read_packet(struct dwc2_hsotg *hsotg, u8 *dest, u16 bytes)
 {
-       u32 __iomem *fifo = hsotg->regs + HCFIFO(0);
        u32 *data_buf = (u32 *)dest;
        int word_count = (bytes + 3) / 4;
        int i;
@@ -617,7 +616,7 @@ void dwc2_read_packet(struct dwc2_hsotg *hsotg, u8 *dest, u16 bytes)
        dev_vdbg(hsotg->dev, "%s(%p,%p,%d)\n", __func__, hsotg, dest, bytes);
 
        for (i = 0; i < word_count; i++, data_buf++)
-               *data_buf = dwc2_readl(fifo);
+               *data_buf = dwc2_readl(hsotg, HCFIFO(0));
 }
 
 /**
@@ -646,10 +645,10 @@ static void dwc2_dump_channel_info(struct dwc2_hsotg *hsotg,
        if (!chan)
                return;
 
-       hcchar = dwc2_readl(hsotg->regs + HCCHAR(chan->hc_num));
-       hcsplt = dwc2_readl(hsotg->regs + HCSPLT(chan->hc_num));
-       hctsiz = dwc2_readl(hsotg->regs + HCTSIZ(chan->hc_num));
-       hc_dma = dwc2_readl(hsotg->regs + HCDMA(chan->hc_num));
+       hcchar = dwc2_readl(hsotg, HCCHAR(chan->hc_num));
+       hcsplt = dwc2_readl(hsotg, HCSPLT(chan->hc_num));
+       hctsiz = dwc2_readl(hsotg, HCTSIZ(chan->hc_num));
+       hc_dma = dwc2_readl(hsotg, HCDMA(chan->hc_num));
 
        dev_dbg(hsotg->dev, "  Assigned to channel %p:\n", chan);
        dev_dbg(hsotg->dev, "    hcchar 0x%08x, hcsplt 0x%08x\n",
@@ -797,7 +796,7 @@ static void dwc2_hc_enable_slave_ints(struct dwc2_hsotg *hsotg,
                break;
        }
 
-       dwc2_writel(hcintmsk, hsotg->regs + HCINTMSK(chan->hc_num));
+       dwc2_writel(hsotg, hcintmsk, HCINTMSK(chan->hc_num));
        if (dbg_hc(chan))
                dev_vdbg(hsotg->dev, "set HCINTMSK to %08x\n", hcintmsk);
 }
@@ -834,7 +833,7 @@ static void dwc2_hc_enable_dma_ints(struct dwc2_hsotg *hsotg,
                }
        }
 
-       dwc2_writel(hcintmsk, hsotg->regs + HCINTMSK(chan->hc_num));
+       dwc2_writel(hsotg, hcintmsk, HCINTMSK(chan->hc_num));
        if (dbg_hc(chan))
                dev_vdbg(hsotg->dev, "set HCINTMSK to %08x\n", hcintmsk);
 }
@@ -855,16 +854,16 @@ static void dwc2_hc_enable_ints(struct dwc2_hsotg *hsotg,
        }
 
        /* Enable the top level host channel interrupt */
-       intmsk = dwc2_readl(hsotg->regs + HAINTMSK);
+       intmsk = dwc2_readl(hsotg, HAINTMSK);
        intmsk |= 1 << chan->hc_num;
-       dwc2_writel(intmsk, hsotg->regs + HAINTMSK);
+       dwc2_writel(hsotg, intmsk, HAINTMSK);
        if (dbg_hc(chan))
                dev_vdbg(hsotg->dev, "set HAINTMSK to %08x\n", intmsk);
 
        /* Make sure host channel interrupts are enabled */
-       intmsk = dwc2_readl(hsotg->regs + GINTMSK);
+       intmsk = dwc2_readl(hsotg, GINTMSK);
        intmsk |= GINTSTS_HCHINT;
-       dwc2_writel(intmsk, hsotg->regs + GINTMSK);
+       dwc2_writel(hsotg, intmsk, GINTMSK);
        if (dbg_hc(chan))
                dev_vdbg(hsotg->dev, "set GINTMSK to %08x\n", intmsk);
 }
@@ -893,7 +892,7 @@ static void dwc2_hc_init(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan)
        /* Clear old interrupt conditions for this host channel */
        hcintmsk = 0xffffffff;
        hcintmsk &= ~HCINTMSK_RESERVED14_31;
-       dwc2_writel(hcintmsk, hsotg->regs + HCINT(hc_num));
+       dwc2_writel(hsotg, hcintmsk, HCINT(hc_num));
 
        /* Enable channel interrupts required for this transfer */
        dwc2_hc_enable_ints(hsotg, chan);
@@ -910,7 +909,7 @@ static void dwc2_hc_init(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan)
                hcchar |= HCCHAR_LSPDDEV;
        hcchar |= chan->ep_type << HCCHAR_EPTYPE_SHIFT & HCCHAR_EPTYPE_MASK;
        hcchar |= chan->max_packet << HCCHAR_MPS_SHIFT & HCCHAR_MPS_MASK;
-       dwc2_writel(hcchar, hsotg->regs + HCCHAR(hc_num));
+       dwc2_writel(hsotg, hcchar, HCCHAR(hc_num));
        if (dbg_hc(chan)) {
                dev_vdbg(hsotg->dev, "set HCCHAR(%d) to %08x\n",
                         hc_num, hcchar);
@@ -964,7 +963,7 @@ static void dwc2_hc_init(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan)
                }
        }
 
-       dwc2_writel(hcsplt, hsotg->regs + HCSPLT(hc_num));
+       dwc2_writel(hsotg, hcsplt, HCSPLT(hc_num));
 }
 
 /**
@@ -1034,14 +1033,14 @@ void dwc2_hc_halt(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan,
                u32 hcintmsk = HCINTMSK_CHHLTD;
 
                dev_vdbg(hsotg->dev, "dequeue/error\n");
-               dwc2_writel(hcintmsk, hsotg->regs + HCINTMSK(chan->hc_num));
+               dwc2_writel(hsotg, hcintmsk, HCINTMSK(chan->hc_num));
 
                /*
                 * Make sure no other interrupts besides halt are currently
                 * pending. Handling another interrupt could cause a crash due
                 * to the QTD and QH state.
                 */
-               dwc2_writel(~hcintmsk, hsotg->regs + HCINT(chan->hc_num));
+               dwc2_writel(hsotg, ~hcintmsk, HCINT(chan->hc_num));
 
                /*
                 * Make sure the halt status is set to URB_DEQUEUE or AHB_ERR
@@ -1050,7 +1049,7 @@ void dwc2_hc_halt(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan,
                 */
                chan->halt_status = halt_status;
 
-               hcchar = dwc2_readl(hsotg->regs + HCCHAR(chan->hc_num));
+               hcchar = dwc2_readl(hsotg, HCCHAR(chan->hc_num));
                if (!(hcchar & HCCHAR_CHENA)) {
                        /*
                         * The channel is either already halted or it hasn't
@@ -1078,7 +1077,7 @@ void dwc2_hc_halt(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan,
                return;
        }
 
-       hcchar = dwc2_readl(hsotg->regs + HCCHAR(chan->hc_num));
+       hcchar = dwc2_readl(hsotg, HCCHAR(chan->hc_num));
 
        /* No need to set the bit in DDMA for disabling the channel */
        /* TODO check it everywhere channel is disabled */
@@ -1101,7 +1100,7 @@ void dwc2_hc_halt(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan,
                if (chan->ep_type == USB_ENDPOINT_XFER_CONTROL ||
                    chan->ep_type == USB_ENDPOINT_XFER_BULK) {
                        dev_vdbg(hsotg->dev, "control/bulk\n");
-                       nptxsts = dwc2_readl(hsotg->regs + GNPTXSTS);
+                       nptxsts = dwc2_readl(hsotg, GNPTXSTS);
                        if ((nptxsts & TXSTS_QSPCAVAIL_MASK) == 0) {
                                dev_vdbg(hsotg->dev, "Disabling channel\n");
                                hcchar &= ~HCCHAR_CHENA;
@@ -1109,7 +1108,7 @@ void dwc2_hc_halt(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan,
                } else {
                        if (dbg_perio())
                                dev_vdbg(hsotg->dev, "isoc/intr\n");
-                       hptxsts = dwc2_readl(hsotg->regs + HPTXSTS);
+                       hptxsts = dwc2_readl(hsotg, HPTXSTS);
                        if ((hptxsts & TXSTS_QSPCAVAIL_MASK) == 0 ||
                            hsotg->queuing_high_bandwidth) {
                                if (dbg_perio())
@@ -1122,7 +1121,7 @@ void dwc2_hc_halt(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan,
                        dev_vdbg(hsotg->dev, "DMA enabled\n");
        }
 
-       dwc2_writel(hcchar, hsotg->regs + HCCHAR(chan->hc_num));
+       dwc2_writel(hsotg, hcchar, HCCHAR(chan->hc_num));
        chan->halt_status = halt_status;
 
        if (hcchar & HCCHAR_CHENA) {
@@ -1171,10 +1170,10 @@ void dwc2_hc_cleanup(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan)
         * Clear channel interrupt enables and any unhandled channel interrupt
         * conditions
         */
-       dwc2_writel(0, hsotg->regs + HCINTMSK(chan->hc_num));
+       dwc2_writel(hsotg, 0, HCINTMSK(chan->hc_num));
        hcintmsk = 0xffffffff;
        hcintmsk &= ~HCINTMSK_RESERVED14_31;
-       dwc2_writel(hcintmsk, hsotg->regs + HCINT(chan->hc_num));
+       dwc2_writel(hsotg, hcintmsk, HCINT(chan->hc_num));
 }
 
 /**
@@ -1228,7 +1227,7 @@ static void dwc2_hc_set_even_odd_frame(struct dwc2_hsotg *hsotg,
                              !chan->do_split) ? chan->speed : USB_SPEED_HIGH;
 
                /* See how many bytes are in the periodic FIFO right now */
-               fifo_space = (dwc2_readl(hsotg->regs + HPTXSTS) &
+               fifo_space = (dwc2_readl(hsotg, HPTXSTS) &
                              TXSTS_FSPCAVAIL_MASK) >> TXSTS_FSPCAVAIL_SHIFT;
                bytes_in_fifo = sizeof(u32) *
                                (hsotg->params.host_perio_tx_fifo_size -
@@ -1348,13 +1347,13 @@ static void dwc2_hc_write_packet(struct dwc2_hsotg *hsotg,
        if (((unsigned long)data_buf & 0x3) == 0) {
                /* xfer_buf is DWORD aligned */
                for (i = 0; i < dword_count; i++, data_buf++)
-                       dwc2_writel(*data_buf, data_fifo);
+                       dwc2_writel(hsotg, *data_buf, HCFIFO(chan->hc_num));
        } else {
                /* xfer_buf is not DWORD aligned */
                for (i = 0; i < dword_count; i++, data_buf++) {
                        u32 data = data_buf[0] | data_buf[1] << 8 |
                                   data_buf[2] << 16 | data_buf[3] << 24;
-                       dwc2_writel(data, data_fifo);
+                       dwc2_writel(hsotg, data, HCFIFO(chan->hc_num));
                }
        }
 
@@ -1383,12 +1382,12 @@ static void dwc2_hc_do_ping(struct dwc2_hsotg *hsotg,
 
        hctsiz = TSIZ_DOPNG;
        hctsiz |= 1 << TSIZ_PKTCNT_SHIFT;
-       dwc2_writel(hctsiz, hsotg->regs + HCTSIZ(chan->hc_num));
+       dwc2_writel(hsotg, hctsiz, HCTSIZ(chan->hc_num));
 
-       hcchar = dwc2_readl(hsotg->regs + HCCHAR(chan->hc_num));
+       hcchar = dwc2_readl(hsotg, HCCHAR(chan->hc_num));
        hcchar |= HCCHAR_CHENA;
        hcchar &= ~HCCHAR_CHDIS;
-       dwc2_writel(hcchar, hsotg->regs + HCCHAR(chan->hc_num));
+       dwc2_writel(hsotg, hcchar, HCCHAR(chan->hc_num));
 }
 
 /**
@@ -1548,7 +1547,7 @@ static void dwc2_hc_start_transfer(struct dwc2_hsotg *hsotg,
        hctsiz |= num_packets << TSIZ_PKTCNT_SHIFT & TSIZ_PKTCNT_MASK;
        hctsiz |= chan->data_pid_start << TSIZ_SC_MC_PID_SHIFT &
                  TSIZ_SC_MC_PID_MASK;
-       dwc2_writel(hctsiz, hsotg->regs + HCTSIZ(chan->hc_num));
+       dwc2_writel(hsotg, hctsiz, HCTSIZ(chan->hc_num));
        if (dbg_hc(chan)) {
                dev_vdbg(hsotg->dev, "Wrote %08x to HCTSIZ(%d)\n",
                         hctsiz, chan->hc_num);
@@ -1576,7 +1575,7 @@ static void dwc2_hc_start_transfer(struct dwc2_hsotg *hsotg,
                } else {
                        dma_addr = chan->xfer_dma;
                }
-               dwc2_writel((u32)dma_addr, hsotg->regs + HCDMA(chan->hc_num));
+               dwc2_writel(hsotg, (u32)dma_addr, HCDMA(chan->hc_num));
 
                if (dbg_hc(chan))
                        dev_vdbg(hsotg->dev, "Wrote %08lx to HCDMA(%d)\n",
@@ -1585,13 +1584,13 @@ static void dwc2_hc_start_transfer(struct dwc2_hsotg *hsotg,
 
        /* Start the split */
        if (chan->do_split) {
-               u32 hcsplt = dwc2_readl(hsotg->regs + HCSPLT(chan->hc_num));
+               u32 hcsplt = dwc2_readl(hsotg, HCSPLT(chan->hc_num));
 
                hcsplt |= HCSPLT_SPLTENA;
-               dwc2_writel(hcsplt, hsotg->regs + HCSPLT(chan->hc_num));
+               dwc2_writel(hsotg, hcsplt, HCSPLT(chan->hc_num));
        }
 
-       hcchar = dwc2_readl(hsotg->regs + HCCHAR(chan->hc_num));
+       hcchar = dwc2_readl(hsotg, HCCHAR(chan->hc_num));
        hcchar &= ~HCCHAR_MULTICNT_MASK;
        hcchar |= (ec_mc << HCCHAR_MULTICNT_SHIFT) & HCCHAR_MULTICNT_MASK;
        dwc2_hc_set_even_odd_frame(hsotg, chan, &hcchar);
@@ -1610,7 +1609,7 @@ static void dwc2_hc_start_transfer(struct dwc2_hsotg *hsotg,
                         (hcchar & HCCHAR_MULTICNT_MASK) >>
                         HCCHAR_MULTICNT_SHIFT);
 
-       dwc2_writel(hcchar, hsotg->regs + HCCHAR(chan->hc_num));
+       dwc2_writel(hsotg, hcchar, HCCHAR(chan->hc_num));
        if (dbg_hc(chan))
                dev_vdbg(hsotg->dev, "Wrote %08x to HCCHAR(%d)\n", hcchar,
                         chan->hc_num);
@@ -1668,18 +1667,18 @@ void dwc2_hc_start_transfer_ddma(struct dwc2_hsotg *hsotg,
                dev_vdbg(hsotg->dev, "   NTD: %d\n", chan->ntd - 1);
        }
 
-       dwc2_writel(hctsiz, hsotg->regs + HCTSIZ(chan->hc_num));
+       dwc2_writel(hsotg, hctsiz, HCTSIZ(chan->hc_num));
 
        dma_sync_single_for_device(hsotg->dev, chan->desc_list_addr,
                                   chan->desc_list_sz, DMA_TO_DEVICE);
 
-       dwc2_writel(chan->desc_list_addr, hsotg->regs + HCDMA(chan->hc_num));
+       dwc2_writel(hsotg, chan->desc_list_addr, HCDMA(chan->hc_num));
 
        if (dbg_hc(chan))
                dev_vdbg(hsotg->dev, "Wrote %pad to HCDMA(%d)\n",
                         &chan->desc_list_addr, chan->hc_num);
 
-       hcchar = dwc2_readl(hsotg->regs + HCCHAR(chan->hc_num));
+       hcchar = dwc2_readl(hsotg, HCCHAR(chan->hc_num));
        hcchar &= ~HCCHAR_MULTICNT_MASK;
        hcchar |= chan->multi_count << HCCHAR_MULTICNT_SHIFT &
                  HCCHAR_MULTICNT_MASK;
@@ -1698,7 +1697,7 @@ void dwc2_hc_start_transfer_ddma(struct dwc2_hsotg *hsotg,
                         (hcchar & HCCHAR_MULTICNT_MASK) >>
                         HCCHAR_MULTICNT_SHIFT);
 
-       dwc2_writel(hcchar, hsotg->regs + HCCHAR(chan->hc_num));
+       dwc2_writel(hsotg, hcchar, HCCHAR(chan->hc_num));
        if (dbg_hc(chan))
                dev_vdbg(hsotg->dev, "Wrote %08x to HCCHAR(%d)\n", hcchar,
                         chan->hc_num);
@@ -1755,7 +1754,7 @@ static int dwc2_hc_continue_transfer(struct dwc2_hsotg *hsotg,
                 * transfer completes, the extra requests for the channel will
                 * be flushed.
                 */
-               u32 hcchar = dwc2_readl(hsotg->regs + HCCHAR(chan->hc_num));
+               u32 hcchar = dwc2_readl(hsotg, HCCHAR(chan->hc_num));
 
                dwc2_hc_set_even_odd_frame(hsotg, chan, &hcchar);
                hcchar |= HCCHAR_CHENA;
@@ -1763,7 +1762,7 @@ static int dwc2_hc_continue_transfer(struct dwc2_hsotg *hsotg,
                if (dbg_hc(chan))
                        dev_vdbg(hsotg->dev, "   IN xfer: hcchar = 0x%08x\n",
                                 hcchar);
-               dwc2_writel(hcchar, hsotg->regs + HCCHAR(chan->hc_num));
+               dwc2_writel(hsotg, hcchar, HCCHAR(chan->hc_num));
                chan->requests++;
                return 1;
        }
@@ -1773,7 +1772,7 @@ static int dwc2_hc_continue_transfer(struct dwc2_hsotg *hsotg,
        if (chan->xfer_count < chan->xfer_len) {
                if (chan->ep_type == USB_ENDPOINT_XFER_INT ||
                    chan->ep_type == USB_ENDPOINT_XFER_ISOC) {
-                       u32 hcchar = dwc2_readl(hsotg->regs +
+                       u32 hcchar = dwc2_readl(hsotg,
                                                HCCHAR(chan->hc_num));
 
                        dwc2_hc_set_even_odd_frame(hsotg, chan,
@@ -1887,7 +1886,7 @@ void dwc2_hcd_start(struct dwc2_hsotg *hsotg)
                 */
                hprt0 = dwc2_read_hprt0(hsotg);
                hprt0 |= HPRT0_RST;
-               dwc2_writel(hprt0, hsotg->regs + HPRT0);
+               dwc2_writel(hsotg, hprt0, HPRT0);
        }
 
        queue_delayed_work(hsotg->wq_otg, &hsotg->start_work,
@@ -1908,11 +1907,11 @@ static void dwc2_hcd_cleanup_channels(struct dwc2_hsotg *hsotg)
                        channel = hsotg->hc_ptr_array[i];
                        if (!list_empty(&channel->hc_list_entry))
                                continue;
-                       hcchar = dwc2_readl(hsotg->regs + HCCHAR(i));
+                       hcchar = dwc2_readl(hsotg, HCCHAR(i));
                        if (hcchar & HCCHAR_CHENA) {
                                hcchar &= ~(HCCHAR_CHENA | HCCHAR_EPDIR);
                                hcchar |= HCCHAR_CHDIS;
-                               dwc2_writel(hcchar, hsotg->regs + HCCHAR(i));
+                               dwc2_writel(hsotg, hcchar, HCCHAR(i));
                        }
                }
        }
@@ -1921,11 +1920,11 @@ static void dwc2_hcd_cleanup_channels(struct dwc2_hsotg *hsotg)
                channel = hsotg->hc_ptr_array[i];
                if (!list_empty(&channel->hc_list_entry))
                        continue;
-               hcchar = dwc2_readl(hsotg->regs + HCCHAR(i));
+               hcchar = dwc2_readl(hsotg, HCCHAR(i));
                if (hcchar & HCCHAR_CHENA) {
                        /* Halt the channel */
                        hcchar |= HCCHAR_CHDIS;
-                       dwc2_writel(hcchar, hsotg->regs + HCCHAR(i));
+                       dwc2_writel(hsotg, hcchar, HCCHAR(i));
                }
 
                dwc2_hc_cleanup(hsotg, channel);
@@ -1985,11 +1984,11 @@ void dwc2_hcd_disconnect(struct dwc2_hsotg *hsotg, bool force)
         * interrupt mask and status bits and disabling subsequent host
         * channel interrupts.
         */
-       intr = dwc2_readl(hsotg->regs + GINTMSK);
+       intr = dwc2_readl(hsotg, GINTMSK);
        intr &= ~(GINTSTS_NPTXFEMP | GINTSTS_PTXFEMP | GINTSTS_HCHINT);
-       dwc2_writel(intr, hsotg->regs + GINTMSK);
+       dwc2_writel(hsotg, intr, GINTMSK);
        intr = GINTSTS_NPTXFEMP | GINTSTS_PTXFEMP | GINTSTS_HCHINT;
-       dwc2_writel(intr, hsotg->regs + GINTSTS);
+       dwc2_writel(hsotg, intr, GINTSTS);
 
        /*
         * Turn off the vbus power only if the core has transitioned to device
@@ -1999,7 +1998,7 @@ void dwc2_hcd_disconnect(struct dwc2_hsotg *hsotg, bool force)
        if (dwc2_is_device_mode(hsotg)) {
                if (hsotg->op_state != OTG_STATE_A_SUSPEND) {
                        dev_dbg(hsotg->dev, "Disconnect: PortPower off\n");
-                       dwc2_writel(0, hsotg->regs + HPRT0);
+                       dwc2_writel(hsotg, 0, HPRT0);
                }
 
                dwc2_disable_host_interrupts(hsotg);
@@ -2027,7 +2026,7 @@ void dwc2_hcd_disconnect(struct dwc2_hsotg *hsotg, bool force)
         * and won't get any future interrupts to handle the connect.
         */
        if (!force) {
-               hprt0 = dwc2_readl(hsotg->regs + HPRT0);
+               hprt0 = dwc2_readl(hsotg, HPRT0);
                if (!(hprt0 & HPRT0_CONNDET) && (hprt0 & HPRT0_CONNSTS))
                        dwc2_hcd_connect(hsotg);
        }
@@ -2071,7 +2070,7 @@ void dwc2_hcd_stop(struct dwc2_hsotg *hsotg)
 
        /* Turn off the vbus power */
        dev_dbg(hsotg->dev, "PortPower off\n");
-       dwc2_writel(0, hsotg->regs + HPRT0);
+       dwc2_writel(hsotg, 0, HPRT0);
 }
 
 /* Caller must hold driver lock */
@@ -2095,7 +2094,7 @@ static int dwc2_hcd_urb_enqueue(struct dwc2_hsotg *hsotg,
        if ((dev_speed == USB_SPEED_LOW) &&
            (hsotg->hw_params.fs_phy_type == GHWCFG2_FS_PHY_TYPE_DEDICATED) &&
            (hsotg->hw_params.hs_phy_type == GHWCFG2_HS_PHY_TYPE_UTMI)) {
-               u32 hprt0 = dwc2_readl(hsotg->regs + HPRT0);
+               u32 hprt0 = dwc2_readl(hsotg, HPRT0);
                u32 prtspd = (hprt0 & HPRT0_SPD_MASK) >> HPRT0_SPD_SHIFT;
 
                if (prtspd == HPRT0_SPD_FULL_SPEED)
@@ -2114,7 +2113,7 @@ static int dwc2_hcd_urb_enqueue(struct dwc2_hsotg *hsotg,
                return retval;
        }
 
-       intr_mask = dwc2_readl(hsotg->regs + GINTMSK);
+       intr_mask = dwc2_readl(hsotg, GINTMSK);
        if (!(intr_mask & GINTSTS_SOF)) {
                enum dwc2_transaction_type tr_type;
 
@@ -2279,7 +2278,7 @@ int dwc2_core_init(struct dwc2_hsotg *hsotg, bool initial_setup)
 
        dev_dbg(hsotg->dev, "%s(%p)\n", __func__, hsotg);
 
-       usbcfg = dwc2_readl(hsotg->regs + GUSBCFG);
+       usbcfg = dwc2_readl(hsotg, GUSBCFG);
 
        /* Set ULPI External VBUS bit if needed */
        usbcfg &= ~GUSBCFG_ULPI_EXT_VBUS_DRV;
@@ -2291,7 +2290,7 @@ int dwc2_core_init(struct dwc2_hsotg *hsotg, bool initial_setup)
        if (hsotg->params.ts_dline)
                usbcfg |= GUSBCFG_TERMSELDLPULSE;
 
-       dwc2_writel(usbcfg, hsotg->regs + GUSBCFG);
+       dwc2_writel(hsotg, usbcfg, GUSBCFG);
 
        /*
         * Reset the Controller
@@ -2325,9 +2324,9 @@ int dwc2_core_init(struct dwc2_hsotg *hsotg, bool initial_setup)
        dwc2_gusbcfg_init(hsotg);
 
        /* Program the GOTGCTL register */
-       otgctl = dwc2_readl(hsotg->regs + GOTGCTL);
+       otgctl = dwc2_readl(hsotg, GOTGCTL);
        otgctl &= ~GOTGCTL_OTGVER;
-       dwc2_writel(otgctl, hsotg->regs + GOTGCTL);
+       dwc2_writel(hsotg, otgctl, GOTGCTL);
 
        /* Clear the SRP success bit for FS-I2c */
        hsotg->srp_success = 0;
@@ -2374,20 +2373,20 @@ static void dwc2_core_host_init(struct dwc2_hsotg *hsotg)
         * introduced by the PHY in generating the linestate condition
         * can vary from one PHY to another.
         */
-       usbcfg = dwc2_readl(hsotg->regs + GUSBCFG);
+       usbcfg = dwc2_readl(hsotg, GUSBCFG);
        usbcfg |= GUSBCFG_TOUTCAL(7);
-       dwc2_writel(usbcfg, hsotg->regs + GUSBCFG);
+       dwc2_writel(hsotg, usbcfg, GUSBCFG);
 
        /* Restart the Phy Clock */
-       dwc2_writel(0, hsotg->regs + PCGCTL);
+       dwc2_writel(hsotg, 0, PCGCTL);
 
        /* Initialize Host Configuration Register */
        dwc2_init_fs_ls_pclk_sel(hsotg);
        if (hsotg->params.speed == DWC2_SPEED_PARAM_FULL ||
            hsotg->params.speed == DWC2_SPEED_PARAM_LOW) {
-               hcfg = dwc2_readl(hsotg->regs + HCFG);
+               hcfg = dwc2_readl(hsotg, HCFG);
                hcfg |= HCFG_FSLSSUPP;
-               dwc2_writel(hcfg, hsotg->regs + HCFG);
+               dwc2_writel(hsotg, hcfg, HCFG);
        }
 
        /*
@@ -2396,9 +2395,9 @@ static void dwc2_core_host_init(struct dwc2_hsotg *hsotg)
         * and its value must not be changed during runtime.
         */
        if (hsotg->params.reload_ctl) {
-               hfir = dwc2_readl(hsotg->regs + HFIR);
+               hfir = dwc2_readl(hsotg, HFIR);
                hfir |= HFIR_RLDCTRL;
-               dwc2_writel(hfir, hsotg->regs + HFIR);
+               dwc2_writel(hsotg, hfir, HFIR);
        }
 
        if (hsotg->params.dma_desc_enable) {
@@ -2415,9 +2414,9 @@ static void dwc2_core_host_init(struct dwc2_hsotg *hsotg)
                                "falling back to buffer DMA mode.\n");
                        hsotg->params.dma_desc_enable = false;
                } else {
-                       hcfg = dwc2_readl(hsotg->regs + HCFG);
+                       hcfg = dwc2_readl(hsotg, HCFG);
                        hcfg |= HCFG_DESCDMA;
-                       dwc2_writel(hcfg, hsotg->regs + HCFG);
+                       dwc2_writel(hsotg, hcfg, HCFG);
                }
        }
 
@@ -2426,18 +2425,18 @@ static void dwc2_core_host_init(struct dwc2_hsotg *hsotg)
 
        /* TODO - check this */
        /* Clear Host Set HNP Enable in the OTG Control Register */
-       otgctl = dwc2_readl(hsotg->regs + GOTGCTL);
+       otgctl = dwc2_readl(hsotg, GOTGCTL);
        otgctl &= ~GOTGCTL_HSTSETHNPEN;
-       dwc2_writel(otgctl, hsotg->regs + GOTGCTL);
+       dwc2_writel(hsotg, otgctl, GOTGCTL);
 
        /* Make sure the FIFOs are flushed */
        dwc2_flush_tx_fifo(hsotg, 0x10 /* all TX FIFOs */);
        dwc2_flush_rx_fifo(hsotg);
 
        /* Clear Host Set HNP Enable in the OTG Control Register */
-       otgctl = dwc2_readl(hsotg->regs + GOTGCTL);
+       otgctl = dwc2_readl(hsotg, GOTGCTL);
        otgctl &= ~GOTGCTL_HSTSETHNPEN;
-       dwc2_writel(otgctl, hsotg->regs + GOTGCTL);
+       dwc2_writel(hsotg, otgctl, GOTGCTL);
 
        if (!hsotg->params.dma_desc_enable) {
                int num_channels, i;
@@ -2446,19 +2445,19 @@ static void dwc2_core_host_init(struct dwc2_hsotg *hsotg)
                /* Flush out any leftover queued requests */
                num_channels = hsotg->params.host_channels;
                for (i = 0; i < num_channels; i++) {
-                       hcchar = dwc2_readl(hsotg->regs + HCCHAR(i));
+                       hcchar = dwc2_readl(hsotg, HCCHAR(i));
                        hcchar &= ~HCCHAR_CHENA;
                        hcchar |= HCCHAR_CHDIS;
                        hcchar &= ~HCCHAR_EPDIR;
-                       dwc2_writel(hcchar, hsotg->regs + HCCHAR(i));
+                       dwc2_writel(hsotg, hcchar, HCCHAR(i));
                }
 
                /* Halt all channels to put them into a known state */
                for (i = 0; i < num_channels; i++) {
-                       hcchar = dwc2_readl(hsotg->regs + HCCHAR(i));
+                       hcchar = dwc2_readl(hsotg, HCCHAR(i));
                        hcchar |= HCCHAR_CHENA | HCCHAR_CHDIS;
                        hcchar &= ~HCCHAR_EPDIR;
-                       dwc2_writel(hcchar, hsotg->regs + HCCHAR(i));
+                       dwc2_writel(hsotg, hcchar, HCCHAR(i));
                        dev_dbg(hsotg->dev, "%s: Halt channel %d\n",
                                __func__, i);
 
@@ -2482,7 +2481,7 @@ static void dwc2_core_host_init(struct dwc2_hsotg *hsotg)
                        !!(hprt0 & HPRT0_PWR));
                if (!(hprt0 & HPRT0_PWR)) {
                        hprt0 |= HPRT0_PWR;
-                       dwc2_writel(hprt0, hsotg->regs + HPRT0);
+                       dwc2_writel(hsotg, hprt0, HPRT0);
                }
        }
 
@@ -2674,8 +2673,10 @@ static void dwc2_free_dma_aligned_buffer(struct urb *urb)
                return;
 
        /* Restore urb->transfer_buffer from the end of the allocated area */
-       memcpy(&stored_xfer_buffer, urb->transfer_buffer +
-              urb->transfer_buffer_length, sizeof(urb->transfer_buffer));
+       memcpy(&stored_xfer_buffer,
+              PTR_ALIGN(urb->transfer_buffer + urb->transfer_buffer_length,
+                        dma_get_cache_alignment()),
+              sizeof(urb->transfer_buffer));
 
        if (usb_urb_dir_in(urb)) {
                if (usb_pipeisoc(urb->pipe))
@@ -2707,6 +2708,7 @@ static int dwc2_alloc_dma_aligned_buffer(struct urb *urb, gfp_t mem_flags)
         * DMA
         */
        kmalloc_size = urb->transfer_buffer_length +
+               (dma_get_cache_alignment() - 1) +
                sizeof(urb->transfer_buffer);
 
        kmalloc_ptr = kmalloc(kmalloc_size, mem_flags);
@@ -2717,7 +2719,8 @@ static int dwc2_alloc_dma_aligned_buffer(struct urb *urb, gfp_t mem_flags)
         * Position value of original urb->transfer_buffer pointer to the end
         * of allocation for later referencing
         */
-       memcpy(kmalloc_ptr + urb->transfer_buffer_length,
+       memcpy(PTR_ALIGN(kmalloc_ptr + urb->transfer_buffer_length,
+                        dma_get_cache_alignment()),
               &urb->transfer_buffer, sizeof(urb->transfer_buffer));
 
        if (usb_urb_dir_out(urb))
@@ -3084,7 +3087,7 @@ static void dwc2_process_periodic_channels(struct dwc2_hsotg *hsotg)
        if (dbg_perio())
                dev_vdbg(hsotg->dev, "Queue periodic transactions\n");
 
-       tx_status = dwc2_readl(hsotg->regs + HPTXSTS);
+       tx_status = dwc2_readl(hsotg, HPTXSTS);
        qspcavail = (tx_status & TXSTS_QSPCAVAIL_MASK) >>
                    TXSTS_QSPCAVAIL_SHIFT;
        fspcavail = (tx_status & TXSTS_FSPCAVAIL_MASK) >>
@@ -3099,7 +3102,7 @@ static void dwc2_process_periodic_channels(struct dwc2_hsotg *hsotg)
 
        qh_ptr = hsotg->periodic_sched_assigned.next;
        while (qh_ptr != &hsotg->periodic_sched_assigned) {
-               tx_status = dwc2_readl(hsotg->regs + HPTXSTS);
+               tx_status = dwc2_readl(hsotg, HPTXSTS);
                qspcavail = (tx_status & TXSTS_QSPCAVAIL_MASK) >>
                            TXSTS_QSPCAVAIL_SHIFT;
                if (qspcavail == 0) {
@@ -3169,10 +3172,10 @@ exit:
                 * level to ensure that new requests are loaded as
                 * soon as possible.)
                 */
-               gintmsk = dwc2_readl(hsotg->regs + GINTMSK);
+               gintmsk = dwc2_readl(hsotg, GINTMSK);
                if (!(gintmsk & GINTSTS_PTXFEMP)) {
                        gintmsk |= GINTSTS_PTXFEMP;
-                       dwc2_writel(gintmsk, hsotg->regs + GINTMSK);
+                       dwc2_writel(hsotg, gintmsk, GINTMSK);
                }
        } else {
                /*
@@ -3182,10 +3185,10 @@ exit:
                 * handlers to queue more transactions as transfer
                 * states change.
                 */
-               gintmsk = dwc2_readl(hsotg->regs + GINTMSK);
+               gintmsk = dwc2_readl(hsotg, GINTMSK);
                if (gintmsk & GINTSTS_PTXFEMP) {
                        gintmsk &= ~GINTSTS_PTXFEMP;
-                       dwc2_writel(gintmsk, hsotg->regs + GINTMSK);
+                       dwc2_writel(hsotg, gintmsk, GINTMSK);
                }
        }
 }
@@ -3214,7 +3217,7 @@ static void dwc2_process_non_periodic_channels(struct dwc2_hsotg *hsotg)
 
        dev_vdbg(hsotg->dev, "Queue non-periodic transactions\n");
 
-       tx_status = dwc2_readl(hsotg->regs + GNPTXSTS);
+       tx_status = dwc2_readl(hsotg, GNPTXSTS);
        qspcavail = (tx_status & TXSTS_QSPCAVAIL_MASK) >>
                    TXSTS_QSPCAVAIL_SHIFT;
        fspcavail = (tx_status & TXSTS_FSPCAVAIL_MASK) >>
@@ -3237,7 +3240,7 @@ static void dwc2_process_non_periodic_channels(struct dwc2_hsotg *hsotg)
         * available in the request queue or the Tx FIFO
         */
        do {
-               tx_status = dwc2_readl(hsotg->regs + GNPTXSTS);
+               tx_status = dwc2_readl(hsotg, GNPTXSTS);
                qspcavail = (tx_status & TXSTS_QSPCAVAIL_MASK) >>
                            TXSTS_QSPCAVAIL_SHIFT;
                if (!hsotg->params.host_dma && qspcavail == 0) {
@@ -3274,7 +3277,7 @@ next:
        } while (hsotg->non_periodic_qh_ptr != orig_qh_ptr);
 
        if (!hsotg->params.host_dma) {
-               tx_status = dwc2_readl(hsotg->regs + GNPTXSTS);
+               tx_status = dwc2_readl(hsotg, GNPTXSTS);
                qspcavail = (tx_status & TXSTS_QSPCAVAIL_MASK) >>
                            TXSTS_QSPCAVAIL_SHIFT;
                fspcavail = (tx_status & TXSTS_FSPCAVAIL_MASK) >>
@@ -3294,9 +3297,9 @@ next:
                         * level to ensure that new requests are loaded as
                         * soon as possible.)
                         */
-                       gintmsk = dwc2_readl(hsotg->regs + GINTMSK);
+                       gintmsk = dwc2_readl(hsotg, GINTMSK);
                        gintmsk |= GINTSTS_NPTXFEMP;
-                       dwc2_writel(gintmsk, hsotg->regs + GINTMSK);
+                       dwc2_writel(hsotg, gintmsk, GINTMSK);
                } else {
                        /*
                         * Disable the Tx FIFO empty interrupt since there are
@@ -3305,9 +3308,9 @@ next:
                         * handlers to queue more transactions as transfer
                         * states change.
                         */
-                       gintmsk = dwc2_readl(hsotg->regs + GINTMSK);
+                       gintmsk = dwc2_readl(hsotg, GINTMSK);
                        gintmsk &= ~GINTSTS_NPTXFEMP;
-                       dwc2_writel(gintmsk, hsotg->regs + GINTMSK);
+                       dwc2_writel(hsotg, gintmsk, GINTMSK);
                }
        }
 }
@@ -3344,10 +3347,10 @@ void dwc2_hcd_queue_transactions(struct dwc2_hsotg *hsotg,
                         * Ensure NP Tx FIFO empty interrupt is disabled when
                         * there are no non-periodic transfers to process
                         */
-                       u32 gintmsk = dwc2_readl(hsotg->regs + GINTMSK);
+                       u32 gintmsk = dwc2_readl(hsotg, GINTMSK);
 
                        gintmsk &= ~GINTSTS_NPTXFEMP;
-                       dwc2_writel(gintmsk, hsotg->regs + GINTMSK);
+                       dwc2_writel(hsotg, gintmsk, GINTMSK);
                }
        }
 }
@@ -3362,7 +3365,7 @@ static void dwc2_conn_id_status_change(struct work_struct *work)
 
        dev_dbg(hsotg->dev, "%s()\n", __func__);
 
-       gotgctl = dwc2_readl(hsotg->regs + GOTGCTL);
+       gotgctl = dwc2_readl(hsotg, GOTGCTL);
        dev_dbg(hsotg->dev, "gotgctl=%0x\n", gotgctl);
        dev_dbg(hsotg->dev, "gotgctl.b.conidsts=%d\n",
                !!(gotgctl & GOTGCTL_CONID_B));
@@ -3388,7 +3391,7 @@ static void dwc2_conn_id_status_change(struct work_struct *work)
                         * check it again and jump to host mode if that was
                         * the case.
                         */
-                       gotgctl = dwc2_readl(hsotg->regs + GOTGCTL);
+                       gotgctl = dwc2_readl(hsotg, GOTGCTL);
                        if (!(gotgctl & GOTGCTL_CONID_B))
                                goto host;
                        if (++count > 250)
@@ -3448,9 +3451,9 @@ static void dwc2_wakeup_detected(struct timer_list *t)
        hprt0 = dwc2_read_hprt0(hsotg);
        dev_dbg(hsotg->dev, "Resume: HPRT0=%0x\n", hprt0);
        hprt0 &= ~HPRT0_RES;
-       dwc2_writel(hprt0, hsotg->regs + HPRT0);
+       dwc2_writel(hsotg, hprt0, HPRT0);
        dev_dbg(hsotg->dev, "Clear Resume: HPRT0=%0x\n",
-               dwc2_readl(hsotg->regs + HPRT0));
+               dwc2_readl(hsotg, HPRT0));
 
        dwc2_hcd_rem_wakeup(hsotg);
        hsotg->bus_suspended = false;
@@ -3479,15 +3482,15 @@ static void dwc2_port_suspend(struct dwc2_hsotg *hsotg, u16 windex)
        spin_lock_irqsave(&hsotg->lock, flags);
 
        if (windex == hsotg->otg_port && dwc2_host_is_b_hnp_enabled(hsotg)) {
-               gotgctl = dwc2_readl(hsotg->regs + GOTGCTL);
+               gotgctl = dwc2_readl(hsotg, GOTGCTL);
                gotgctl |= GOTGCTL_HSTSETHNPEN;
-               dwc2_writel(gotgctl, hsotg->regs + GOTGCTL);
+               dwc2_writel(hsotg, gotgctl, GOTGCTL);
                hsotg->op_state = OTG_STATE_A_SUSPEND;
        }
 
        hprt0 = dwc2_read_hprt0(hsotg);
        hprt0 |= HPRT0_SUSP;
-       dwc2_writel(hprt0, hsotg->regs + HPRT0);
+       dwc2_writel(hsotg, hprt0, HPRT0);
 
        hsotg->bus_suspended = true;
 
@@ -3497,17 +3500,17 @@ static void dwc2_port_suspend(struct dwc2_hsotg *hsotg, u16 windex)
         */
        if (!hsotg->params.power_down) {
                /* Suspend the Phy Clock */
-               pcgctl = dwc2_readl(hsotg->regs + PCGCTL);
+               pcgctl = dwc2_readl(hsotg, PCGCTL);
                pcgctl |= PCGCTL_STOPPCLK;
-               dwc2_writel(pcgctl, hsotg->regs + PCGCTL);
+               dwc2_writel(hsotg, pcgctl, PCGCTL);
                udelay(10);
        }
 
        /* For HNP the bus must be suspended for at least 200ms */
        if (dwc2_host_is_b_hnp_enabled(hsotg)) {
-               pcgctl = dwc2_readl(hsotg->regs + PCGCTL);
+               pcgctl = dwc2_readl(hsotg, PCGCTL);
                pcgctl &= ~PCGCTL_STOPPCLK;
-               dwc2_writel(pcgctl, hsotg->regs + PCGCTL);
+               dwc2_writel(hsotg, pcgctl, PCGCTL);
 
                spin_unlock_irqrestore(&hsotg->lock, flags);
 
@@ -3531,9 +3534,9 @@ static void dwc2_port_resume(struct dwc2_hsotg *hsotg)
         * after registers restore.
         */
        if (!hsotg->params.power_down) {
-               pcgctl = dwc2_readl(hsotg->regs + PCGCTL);
+               pcgctl = dwc2_readl(hsotg, PCGCTL);
                pcgctl &= ~PCGCTL_STOPPCLK;
-               dwc2_writel(pcgctl, hsotg->regs + PCGCTL);
+               dwc2_writel(hsotg, pcgctl, PCGCTL);
                spin_unlock_irqrestore(&hsotg->lock, flags);
                msleep(20);
                spin_lock_irqsave(&hsotg->lock, flags);
@@ -3542,7 +3545,7 @@ static void dwc2_port_resume(struct dwc2_hsotg *hsotg)
        hprt0 = dwc2_read_hprt0(hsotg);
        hprt0 |= HPRT0_RES;
        hprt0 &= ~HPRT0_SUSP;
-       dwc2_writel(hprt0, hsotg->regs + HPRT0);
+       dwc2_writel(hsotg, hprt0, HPRT0);
        spin_unlock_irqrestore(&hsotg->lock, flags);
 
        msleep(USB_RESUME_TIMEOUT);
@@ -3550,7 +3553,7 @@ static void dwc2_port_resume(struct dwc2_hsotg *hsotg)
        spin_lock_irqsave(&hsotg->lock, flags);
        hprt0 = dwc2_read_hprt0(hsotg);
        hprt0 &= ~(HPRT0_RES | HPRT0_SUSP);
-       dwc2_writel(hprt0, hsotg->regs + HPRT0);
+       dwc2_writel(hsotg, hprt0, HPRT0);
        hsotg->bus_suspended = false;
        spin_unlock_irqrestore(&hsotg->lock, flags);
 }
@@ -3594,7 +3597,7 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq,
                                "ClearPortFeature USB_PORT_FEAT_ENABLE\n");
                        hprt0 = dwc2_read_hprt0(hsotg);
                        hprt0 |= HPRT0_ENA;
-                       dwc2_writel(hprt0, hsotg->regs + HPRT0);
+                       dwc2_writel(hsotg, hprt0, HPRT0);
                        break;
 
                case USB_PORT_FEAT_SUSPEND:
@@ -3614,7 +3617,7 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq,
                                "ClearPortFeature USB_PORT_FEAT_POWER\n");
                        hprt0 = dwc2_read_hprt0(hsotg);
                        hprt0 &= ~HPRT0_PWR;
-                       dwc2_writel(hprt0, hsotg->regs + HPRT0);
+                       dwc2_writel(hsotg, hprt0, HPRT0);
                        break;
 
                case USB_PORT_FEAT_INDICATOR:
@@ -3735,7 +3738,7 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq,
                        break;
                }
 
-               hprt0 = dwc2_readl(hsotg->regs + HPRT0);
+               hprt0 = dwc2_readl(hsotg, HPRT0);
                dev_vdbg(hsotg->dev, "  HPRT0: 0x%08x\n", hprt0);
 
                if (hprt0 & HPRT0_CONNSTS)
@@ -3776,9 +3779,9 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq,
 
                                dev_info(hsotg->dev, "Enabling descriptor DMA mode\n");
                                hsotg->params.dma_desc_enable = true;
-                               hcfg = dwc2_readl(hsotg->regs + HCFG);
+                               hcfg = dwc2_readl(hsotg, HCFG);
                                hcfg |= HCFG_DESCDMA;
-                               dwc2_writel(hcfg, hsotg->regs + HCFG);
+                               dwc2_writel(hsotg, hcfg, HCFG);
                                hsotg->new_connection = false;
                        }
                }
@@ -3825,7 +3828,7 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq,
                                "SetPortFeature - USB_PORT_FEAT_POWER\n");
                        hprt0 = dwc2_read_hprt0(hsotg);
                        hprt0 |= HPRT0_PWR;
-                       dwc2_writel(hprt0, hsotg->regs + HPRT0);
+                       dwc2_writel(hsotg, hprt0, HPRT0);
                        break;
 
                case USB_PORT_FEAT_RESET:
@@ -3835,11 +3838,11 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq,
                        hprt0 = dwc2_read_hprt0(hsotg);
                        dev_dbg(hsotg->dev,
                                "SetPortFeature - USB_PORT_FEAT_RESET\n");
-                       pcgctl = dwc2_readl(hsotg->regs + PCGCTL);
+                       pcgctl = dwc2_readl(hsotg, PCGCTL);
                        pcgctl &= ~(PCGCTL_ENBL_SLEEP_GATING | PCGCTL_STOPPCLK);
-                       dwc2_writel(pcgctl, hsotg->regs + PCGCTL);
+                       dwc2_writel(hsotg, pcgctl, PCGCTL);
                        /* ??? Original driver does this */
-                       dwc2_writel(0, hsotg->regs + PCGCTL);
+                       dwc2_writel(hsotg, 0, PCGCTL);
 
                        hprt0 = dwc2_read_hprt0(hsotg);
                        /* Clear suspend bit if resetting from suspend state */
@@ -3854,13 +3857,13 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq,
                                hprt0 |= HPRT0_PWR | HPRT0_RST;
                                dev_dbg(hsotg->dev,
                                        "In host mode, hprt0=%08x\n", hprt0);
-                               dwc2_writel(hprt0, hsotg->regs + HPRT0);
+                               dwc2_writel(hsotg, hprt0, HPRT0);
                        }
 
                        /* Clear reset bit in 10ms (FS/LS) or 50ms (HS) */
                        msleep(50);
                        hprt0 &= ~HPRT0_RST;
-                       dwc2_writel(hprt0, hsotg->regs + HPRT0);
+                       dwc2_writel(hsotg, hprt0, HPRT0);
                        hsotg->lx_state = DWC2_L0; /* Now back to On state */
                        break;
 
@@ -3876,7 +3879,7 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq,
                                "SetPortFeature - USB_PORT_FEAT_TEST\n");
                        hprt0 &= ~HPRT0_TSTCTL_MASK;
                        hprt0 |= (windex >> 8) << HPRT0_TSTCTL_SHIFT;
-                       dwc2_writel(hprt0, hsotg->regs + HPRT0);
+                       dwc2_writel(hsotg, hprt0, HPRT0);
                        break;
 
                default:
@@ -3933,7 +3936,7 @@ static int dwc2_hcd_is_status_changed(struct dwc2_hsotg *hsotg, int port)
 
 int dwc2_hcd_get_frame_number(struct dwc2_hsotg *hsotg)
 {
-       u32 hfnum = dwc2_readl(hsotg->regs + HFNUM);
+       u32 hfnum = dwc2_readl(hsotg, HFNUM);
 
 #ifdef DWC2_DEBUG_SOF
        dev_vdbg(hsotg->dev, "DWC OTG HCD GET FRAME NUMBER %d\n",
@@ -3944,9 +3947,9 @@ int dwc2_hcd_get_frame_number(struct dwc2_hsotg *hsotg)
 
 int dwc2_hcd_get_future_frame_number(struct dwc2_hsotg *hsotg, int us)
 {
-       u32 hprt = dwc2_readl(hsotg->regs + HPRT0);
-       u32 hfir = dwc2_readl(hsotg->regs + HFIR);
-       u32 hfnum = dwc2_readl(hsotg->regs + HFNUM);
+       u32 hprt = dwc2_readl(hsotg, HPRT0);
+       u32 hfir = dwc2_readl(hsotg, HFIR);
+       u32 hfnum = dwc2_readl(hsotg, HFNUM);
        unsigned int us_per_frame;
        unsigned int frame_number;
        unsigned int remaining;
@@ -4065,11 +4068,11 @@ void dwc2_hcd_dump_state(struct dwc2_hsotg *hsotg)
                if (chan->xfer_started) {
                        u32 hfnum, hcchar, hctsiz, hcint, hcintmsk;
 
-                       hfnum = dwc2_readl(hsotg->regs + HFNUM);
-                       hcchar = dwc2_readl(hsotg->regs + HCCHAR(i));
-                       hctsiz = dwc2_readl(hsotg->regs + HCTSIZ(i));
-                       hcint = dwc2_readl(hsotg->regs + HCINT(i));
-                       hcintmsk = dwc2_readl(hsotg->regs + HCINTMSK(i));
+                       hfnum = dwc2_readl(hsotg, HFNUM);
+                       hcchar = dwc2_readl(hsotg, HCCHAR(i));
+                       hctsiz = dwc2_readl(hsotg, HCTSIZ(i));
+                       hcint = dwc2_readl(hsotg, HCINT(i));
+                       hcintmsk = dwc2_readl(hsotg, HCINTMSK(i));
                        dev_dbg(hsotg->dev, "    hfnum: 0x%08x\n", hfnum);
                        dev_dbg(hsotg->dev, "    hcchar: 0x%08x\n", hcchar);
                        dev_dbg(hsotg->dev, "    hctsiz: 0x%08x\n", hctsiz);
@@ -4117,12 +4120,12 @@ void dwc2_hcd_dump_state(struct dwc2_hsotg *hsotg)
        dev_dbg(hsotg->dev, "  periodic_channels: %d\n",
                hsotg->periodic_channels);
        dev_dbg(hsotg->dev, "  periodic_usecs: %d\n", hsotg->periodic_usecs);
-       np_tx_status = dwc2_readl(hsotg->regs + GNPTXSTS);
+       np_tx_status = dwc2_readl(hsotg, GNPTXSTS);
        dev_dbg(hsotg->dev, "  NP Tx Req Queue Space Avail: %d\n",
                (np_tx_status & TXSTS_QSPCAVAIL_MASK) >> TXSTS_QSPCAVAIL_SHIFT);
        dev_dbg(hsotg->dev, "  NP Tx FIFO Space Avail: %d\n",
                (np_tx_status & TXSTS_FSPCAVAIL_MASK) >> TXSTS_FSPCAVAIL_SHIFT);
-       p_tx_status = dwc2_readl(hsotg->regs + HPTXSTS);
+       p_tx_status = dwc2_readl(hsotg, HPTXSTS);
        dev_dbg(hsotg->dev, "  P Tx Req Queue Space Avail: %d\n",
                (p_tx_status & TXSTS_QSPCAVAIL_MASK) >> TXSTS_QSPCAVAIL_SHIFT);
        dev_dbg(hsotg->dev, "  P Tx FIFO Space Avail: %d\n",
@@ -4372,7 +4375,7 @@ static void dwc2_hcd_reset_func(struct work_struct *work)
 
        hprt0 = dwc2_read_hprt0(hsotg);
        hprt0 &= ~HPRT0_RST;
-       dwc2_writel(hprt0, hsotg->regs + HPRT0);
+       dwc2_writel(hsotg, hprt0, HPRT0);
        hsotg->flags.b.port_reset_change = 1;
 
        spin_unlock_irqrestore(&hsotg->lock, flags);
@@ -4394,6 +4397,7 @@ static int _dwc2_hcd_start(struct usb_hcd *hcd)
        struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd);
        struct usb_bus *bus = hcd_to_bus(hcd);
        unsigned long flags;
+       int ret;
 
        dev_dbg(hsotg->dev, "DWC OTG HCD START\n");
 
@@ -4409,6 +4413,13 @@ static int _dwc2_hcd_start(struct usb_hcd *hcd)
 
        dwc2_hcd_reinit(hsotg);
 
+       /* enable external vbus supply before resuming root hub */
+       spin_unlock_irqrestore(&hsotg->lock, flags);
+       ret = dwc2_vbus_supply_init(hsotg);
+       if (ret)
+               return ret;
+       spin_lock_irqsave(&hsotg->lock, flags);
+
        /* Initialize and connect root hub if one is not already attached */
        if (bus->root_hub) {
                dev_dbg(hsotg->dev, "DWC OTG HCD Has Root Hub\n");
@@ -4418,7 +4429,7 @@ static int _dwc2_hcd_start(struct usb_hcd *hcd)
 
        spin_unlock_irqrestore(&hsotg->lock, flags);
 
-       return dwc2_vbus_supply_init(hsotg);
+       return 0;
 }
 
 /*
@@ -4482,8 +4493,10 @@ static int _dwc2_hcd_suspend(struct usb_hcd *hcd)
                hprt0 = dwc2_read_hprt0(hsotg);
                hprt0 |= HPRT0_SUSP;
                hprt0 &= ~HPRT0_PWR;
-               dwc2_writel(hprt0, hsotg->regs + HPRT0);
+               dwc2_writel(hsotg, hprt0, HPRT0);
+               spin_unlock_irqrestore(&hsotg->lock, flags);
                dwc2_vbus_supply_exit(hsotg);
+               spin_lock_irqsave(&hsotg->lock, flags);
        }
 
        /* Enter partial_power_down */
@@ -4573,8 +4586,8 @@ static int _dwc2_hcd_resume(struct usb_hcd *hcd)
                 * Clear Port Enable and Port Status changes.
                 * Enable Port Power.
                 */
-               dwc2_writel(HPRT0_PWR | HPRT0_CONNDET |
-                               HPRT0_ENACHG, hsotg->regs + HPRT0);
+               dwc2_writel(hsotg, HPRT0_PWR | HPRT0_CONNDET |
+                               HPRT0_ENACHG, HPRT0);
                /* Wait for controller to detect Port Connect */
                usleep_range(5000, 7000);
        }
@@ -5094,17 +5107,17 @@ static void dwc2_hcd_free(struct dwc2_hsotg *hsotg)
                hsotg->status_buf = NULL;
        }
 
-       ahbcfg = dwc2_readl(hsotg->regs + GAHBCFG);
+       ahbcfg = dwc2_readl(hsotg, GAHBCFG);
 
        /* Disable all interrupts */
        ahbcfg &= ~GAHBCFG_GLBL_INTR_EN;
-       dwc2_writel(ahbcfg, hsotg->regs + GAHBCFG);
-       dwc2_writel(0, hsotg->regs + GINTMSK);
+       dwc2_writel(hsotg, ahbcfg, GAHBCFG);
+       dwc2_writel(hsotg, 0, GINTMSK);
 
        if (hsotg->hw_params.snpsid >= DWC2_CORE_REV_3_00a) {
-               dctl = dwc2_readl(hsotg->regs + DCTL);
+               dctl = dwc2_readl(hsotg, DCTL);
                dctl |= DCTL_SFTDISCON;
-               dwc2_writel(dctl, hsotg->regs + DCTL);
+               dwc2_writel(hsotg, dctl, DCTL);
        }
 
        if (hsotg->wq_otg) {
@@ -5147,7 +5160,7 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg)
 
        retval = -ENOMEM;
 
-       hcfg = dwc2_readl(hsotg->regs + HCFG);
+       hcfg = dwc2_readl(hsotg, HCFG);
        dev_dbg(hsotg->dev, "hcfg=%08x\n", hcfg);
 
 #ifdef CONFIG_USB_DWC2_TRACK_MISSED_SOFS
@@ -5437,14 +5450,14 @@ int dwc2_backup_host_registers(struct dwc2_hsotg *hsotg)
 
        /* Backup Host regs */
        hr = &hsotg->hr_backup;
-       hr->hcfg = dwc2_readl(hsotg->regs + HCFG);
-       hr->haintmsk = dwc2_readl(hsotg->regs + HAINTMSK);
+       hr->hcfg = dwc2_readl(hsotg, HCFG);
+       hr->haintmsk = dwc2_readl(hsotg, HAINTMSK);
        for (i = 0; i < hsotg->params.host_channels; ++i)
-               hr->hcintmsk[i] = dwc2_readl(hsotg->regs + HCINTMSK(i));
+               hr->hcintmsk[i] = dwc2_readl(hsotg, HCINTMSK(i));
 
        hr->hprt0 = dwc2_read_hprt0(hsotg);
-       hr->hfir = dwc2_readl(hsotg->regs + HFIR);
-       hr->hptxfsiz = dwc2_readl(hsotg->regs + HPTXFSIZ);
+       hr->hfir = dwc2_readl(hsotg, HFIR);
+       hr->hptxfsiz = dwc2_readl(hsotg, HPTXFSIZ);
        hr->valid = true;
 
        return 0;
@@ -5473,15 +5486,15 @@ int dwc2_restore_host_registers(struct dwc2_hsotg *hsotg)
        }
        hr->valid = false;
 
-       dwc2_writel(hr->hcfg, hsotg->regs + HCFG);
-       dwc2_writel(hr->haintmsk, hsotg->regs + HAINTMSK);
+       dwc2_writel(hsotg, hr->hcfg, HCFG);
+       dwc2_writel(hsotg, hr->haintmsk, HAINTMSK);
 
        for (i = 0; i < hsotg->params.host_channels; ++i)
-               dwc2_writel(hr->hcintmsk[i], hsotg->regs + HCINTMSK(i));
+               dwc2_writel(hsotg, hr->hcintmsk[i], HCINTMSK(i));
 
-       dwc2_writel(hr->hprt0, hsotg->regs + HPRT0);
-       dwc2_writel(hr->hfir, hsotg->regs + HFIR);
-       dwc2_writel(hr->hptxfsiz, hsotg->regs + HPTXFSIZ);
+       dwc2_writel(hsotg, hr->hprt0, HPRT0);
+       dwc2_writel(hsotg, hr->hfir, HFIR);
+       dwc2_writel(hsotg, hr->hptxfsiz, HPTXFSIZ);
        hsotg->frame_number = 0;
 
        return 0;
@@ -5516,10 +5529,10 @@ int dwc2_host_enter_hibernation(struct dwc2_hsotg *hsotg)
        }
 
        /* Enter USB Suspend Mode */
-       hprt0 = dwc2_readl(hsotg->regs + HPRT0);
+       hprt0 = dwc2_readl(hsotg, HPRT0);
        hprt0 |= HPRT0_SUSP;
        hprt0 &= ~HPRT0_ENA;
-       dwc2_writel(hprt0, hsotg->regs + HPRT0);
+       dwc2_writel(hsotg, hprt0, HPRT0);
 
        /* Wait for the HPRT0.PrtSusp register field to be set */
        if (dwc2_hsotg_wait_bit_set(hsotg, HPRT0, HPRT0_SUSP, 3000))
@@ -5532,56 +5545,56 @@ int dwc2_host_enter_hibernation(struct dwc2_hsotg *hsotg)
        spin_lock_irqsave(&hsotg->lock, flags);
        hsotg->lx_state = DWC2_L2;
 
-       gusbcfg = dwc2_readl(hsotg->regs + GUSBCFG);
+       gusbcfg = dwc2_readl(hsotg, GUSBCFG);
        if (gusbcfg & GUSBCFG_ULPI_UTMI_SEL) {
                /* ULPI interface */
                /* Suspend the Phy Clock */
-               pcgcctl = dwc2_readl(hsotg->regs + PCGCTL);
+               pcgcctl = dwc2_readl(hsotg, PCGCTL);
                pcgcctl |= PCGCTL_STOPPCLK;
-               dwc2_writel(pcgcctl, hsotg->regs + PCGCTL);
+               dwc2_writel(hsotg, pcgcctl, PCGCTL);
                udelay(10);
 
-               gpwrdn = dwc2_readl(hsotg->regs + GPWRDN);
+               gpwrdn = dwc2_readl(hsotg, GPWRDN);
                gpwrdn |= GPWRDN_PMUACTV;
-               dwc2_writel(gpwrdn, hsotg->regs + GPWRDN);
+               dwc2_writel(hsotg, gpwrdn, GPWRDN);
                udelay(10);
        } else {
                /* UTMI+ Interface */
-               gpwrdn = dwc2_readl(hsotg->regs + GPWRDN);
+               gpwrdn = dwc2_readl(hsotg, GPWRDN);
                gpwrdn |= GPWRDN_PMUACTV;
-               dwc2_writel(gpwrdn, hsotg->regs + GPWRDN);
+               dwc2_writel(hsotg, gpwrdn, GPWRDN);
                udelay(10);
 
-               pcgcctl = dwc2_readl(hsotg->regs + PCGCTL);
+               pcgcctl = dwc2_readl(hsotg, PCGCTL);
                pcgcctl |= PCGCTL_STOPPCLK;
-               dwc2_writel(pcgcctl, hsotg->regs + PCGCTL);
+               dwc2_writel(hsotg, pcgcctl, PCGCTL);
                udelay(10);
        }
 
        /* Enable interrupts from wake up logic */
-       gpwrdn = dwc2_readl(hsotg->regs + GPWRDN);
+       gpwrdn = dwc2_readl(hsotg, GPWRDN);
        gpwrdn |= GPWRDN_PMUINTSEL;
-       dwc2_writel(gpwrdn, hsotg->regs + GPWRDN);
+       dwc2_writel(hsotg, gpwrdn, GPWRDN);
        udelay(10);
 
        /* Unmask host mode interrupts in GPWRDN */
-       gpwrdn = dwc2_readl(hsotg->regs + GPWRDN);
+       gpwrdn = dwc2_readl(hsotg, GPWRDN);
        gpwrdn |= GPWRDN_DISCONN_DET_MSK;
        gpwrdn |= GPWRDN_LNSTSCHG_MSK;
        gpwrdn |= GPWRDN_STS_CHGINT_MSK;
-       dwc2_writel(gpwrdn, hsotg->regs + GPWRDN);
+       dwc2_writel(hsotg, gpwrdn, GPWRDN);
        udelay(10);
 
        /* Enable Power Down Clamp */
-       gpwrdn = dwc2_readl(hsotg->regs + GPWRDN);
+       gpwrdn = dwc2_readl(hsotg, GPWRDN);
        gpwrdn |= GPWRDN_PWRDNCLMP;
-       dwc2_writel(gpwrdn, hsotg->regs + GPWRDN);
+       dwc2_writel(hsotg, gpwrdn, GPWRDN);
        udelay(10);
 
        /* Switch off VDD */
-       gpwrdn = dwc2_readl(hsotg->regs + GPWRDN);
+       gpwrdn = dwc2_readl(hsotg, GPWRDN);
        gpwrdn |= GPWRDN_PWRDNSWTCH;
-       dwc2_writel(gpwrdn, hsotg->regs + GPWRDN);
+       dwc2_writel(hsotg, gpwrdn, GPWRDN);
 
        hsotg->hibernated = 1;
        hsotg->bus_suspended = 1;
@@ -5629,29 +5642,29 @@ int dwc2_host_exit_hibernation(struct dwc2_hsotg *hsotg, int rem_wakeup,
        mdelay(100);
 
        /* Clear all pending interupts */
-       dwc2_writel(0xffffffff, hsotg->regs + GINTSTS);
+       dwc2_writel(hsotg, 0xffffffff, GINTSTS);
 
        /* De-assert Restore */
-       gpwrdn = dwc2_readl(hsotg->regs + GPWRDN);
+       gpwrdn = dwc2_readl(hsotg, GPWRDN);
        gpwrdn &= ~GPWRDN_RESTORE;
-       dwc2_writel(gpwrdn, hsotg->regs + GPWRDN);
+       dwc2_writel(hsotg, gpwrdn, GPWRDN);
        udelay(10);
 
        /* Restore GUSBCFG, HCFG */
-       dwc2_writel(gr->gusbcfg, hsotg->regs + GUSBCFG);
-       dwc2_writel(hr->hcfg, hsotg->regs + HCFG);
+       dwc2_writel(hsotg, gr->gusbcfg, GUSBCFG);
+       dwc2_writel(hsotg, hr->hcfg, HCFG);
 
        /* De-assert Wakeup Logic */
-       gpwrdn = dwc2_readl(hsotg->regs + GPWRDN);
+       gpwrdn = dwc2_readl(hsotg, GPWRDN);
        gpwrdn &= ~GPWRDN_PMUACTV;
-       dwc2_writel(gpwrdn, hsotg->regs + GPWRDN);
+       dwc2_writel(hsotg, gpwrdn, GPWRDN);
        udelay(10);
 
        hprt0 = hr->hprt0;
        hprt0 |= HPRT0_PWR;
        hprt0 &= ~HPRT0_ENA;
        hprt0 &= ~HPRT0_SUSP;
-       dwc2_writel(hprt0, hsotg->regs + HPRT0);
+       dwc2_writel(hsotg, hprt0, HPRT0);
 
        hprt0 = hr->hprt0;
        hprt0 |= HPRT0_PWR;
@@ -5660,32 +5673,32 @@ int dwc2_host_exit_hibernation(struct dwc2_hsotg *hsotg, int rem_wakeup,
 
        if (reset) {
                hprt0 |= HPRT0_RST;
-               dwc2_writel(hprt0, hsotg->regs + HPRT0);
+               dwc2_writel(hsotg, hprt0, HPRT0);
 
                /* Wait for Resume time and then program HPRT again */
                mdelay(60);
                hprt0 &= ~HPRT0_RST;
-               dwc2_writel(hprt0, hsotg->regs + HPRT0);
+               dwc2_writel(hsotg, hprt0, HPRT0);
        } else {
                hprt0 |= HPRT0_RES;
-               dwc2_writel(hprt0, hsotg->regs + HPRT0);
+               dwc2_writel(hsotg, hprt0, HPRT0);
 
                /* Wait for Resume time and then program HPRT again */
                mdelay(100);
                hprt0 &= ~HPRT0_RES;
-               dwc2_writel(hprt0, hsotg->regs + HPRT0);
+               dwc2_writel(hsotg, hprt0, HPRT0);
        }
        /* Clear all interrupt status */
-       hprt0 = dwc2_readl(hsotg->regs + HPRT0);
+       hprt0 = dwc2_readl(hsotg, HPRT0);
        hprt0 |= HPRT0_CONNDET;
        hprt0 |= HPRT0_ENACHG;
        hprt0 &= ~HPRT0_ENA;
-       dwc2_writel(hprt0, hsotg->regs + HPRT0);
+       dwc2_writel(hsotg, hprt0, HPRT0);
 
-       hprt0 = dwc2_readl(hsotg->regs + HPRT0);
+       hprt0 = dwc2_readl(hsotg, HPRT0);
 
        /* Clear all pending interupts */
-       dwc2_writel(0xffffffff, hsotg->regs + GINTSTS);
+       dwc2_writel(hsotg, 0xffffffff, GINTSTS);
 
        /* Restore global registers */
        ret = dwc2_restore_global_registers(hsotg);