Message ID | 20190916122417.27520-3-m.szyprowski@samsung.com |
---|---|
State | Superseded |
Delegated to: | Lukasz Majewski |
Headers | show |
Series | Raspberry Pi4: add support for DFU over USB | expand |
Hi Marek, > Broadcom 2835 SoC requires special conversion of physical memory > addresses for DMA purpose, so add needed wrappers to dwc2_udc_otg > driver. Also extend the list of compatible devices with > 'brcm,bcm2835-usb' entry. This allows to use USB gadget drivers (i.e. > DFU) on Raspberry Pi4 boards. > > Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> > --- > drivers/usb/gadget/dwc2_udc_otg.c | 2 ++ > drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c | 12 ++++++------ > 2 files changed, 8 insertions(+), 6 deletions(-) > > diff --git a/drivers/usb/gadget/dwc2_udc_otg.c > b/drivers/usb/gadget/dwc2_udc_otg.c index 35f4147840e..49f342eb211 > 100644 --- a/drivers/usb/gadget/dwc2_udc_otg.c > +++ b/drivers/usb/gadget/dwc2_udc_otg.c > @@ -31,6 +31,7 @@ > #include <linux/usb/otg.h> > #include <linux/usb/gadget.h> > > +#include <phys2bus.h> > #include <asm/byteorder.h> > #include <asm/unaligned.h> > #include <asm/io.h> > @@ -1213,6 +1214,7 @@ static int dwc2_udc_otg_remove(struct udevice > *dev) > static const struct udevice_id dwc2_udc_otg_ids[] = { > { .compatible = "snps,dwc2" }, > + { .compatible = "brcm,bcm2835-usb" }, > { .compatible = "st,stm32mp1-hsotg", > .data = (ulong)dwc2_set_stm32mp1_hsotg_params }, > {}, > diff --git a/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c > b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c index > 7eb632d3b14..5e695b4ff2a 100644 --- > a/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c +++ > b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c @@ -28,7 +28,7 @@ static > inline void dwc2_udc_ep0_zlp(struct dwc2_udc *dev) { > u32 ep_ctrl; > > - writel(usb_ctrl_dma_addr, ®->in_endp[EP0_CON].diepdma); > + writel(phys_to_bus((unsigned long)usb_ctrl_dma_addr), > ®->in_endp[EP0_CON].diepdma); writel(DIEPT_SIZ_PKT_CNT(1), > ®->in_endp[EP0_CON].dieptsiz); > ep_ctrl = readl(®->in_endp[EP0_CON].diepctl); > @@ -49,7 +49,7 @@ static void dwc2_udc_pre_setup(void) > > writel(DOEPT_SIZ_PKT_CNT(1) | sizeof(struct usb_ctrlrequest), > ®->out_endp[EP0_CON].doeptsiz); > - writel(usb_ctrl_dma_addr, ®->out_endp[EP0_CON].doepdma); > + writel(phys_to_bus((unsigned long)usb_ctrl_dma_addr), > ®->out_endp[EP0_CON].doepdma); > ep_ctrl = readl(®->out_endp[EP0_CON].doepctl); > writel(ep_ctrl|DEPCTL_EPENA, > ®->out_endp[EP0_CON].doepctl); @@ -75,7 +75,7 @@ static inline > void dwc2_ep0_complete_out(void) > writel(DOEPT_SIZ_PKT_CNT(1) | sizeof(struct usb_ctrlrequest), > ®->out_endp[EP0_CON].doeptsiz); > - writel(usb_ctrl_dma_addr, ®->out_endp[EP0_CON].doepdma); > + writel(phys_to_bus((unsigned long)usb_ctrl_dma_addr), > ®->out_endp[EP0_CON].doepdma); > ep_ctrl = readl(®->out_endp[EP0_CON].doepctl); > writel(ep_ctrl|DEPCTL_EPENA|DEPCTL_CNAK, > @@ -113,7 +113,7 @@ static int setdma_rx(struct dwc2_ep *ep, struct > dwc2_request *req) (unsigned long) ep->dma_buf + > ROUND(ep->len, > CONFIG_SYS_CACHELINE_SIZE)); > - writel((unsigned long) ep->dma_buf, > ®->out_endp[ep_num].doepdma); > + writel(phys_to_bus((unsigned long)ep->dma_buf), > ®->out_endp[ep_num].doepdma); writel(DOEPT_SIZ_PKT_CNT(pktcnt) | > DOEPT_SIZ_XFER_SIZE(length), ®->out_endp[ep_num].doeptsiz); > writel(DEPCTL_EPENA|DEPCTL_CNAK|ctrl, > ®->out_endp[ep_num].doepctl); @@ -161,7 +161,7 @@ static int > setdma_tx(struct dwc2_ep *ep, struct dwc2_request *req) while > (readl(®->grstctl) & TX_FIFO_FLUSH) ; > > - writel((unsigned long) ep->dma_buf, > ®->in_endp[ep_num].diepdma); > + writel(phys_to_bus((unsigned long)ep->dma_buf), > ®->in_endp[ep_num].diepdma); writel(DIEPT_SIZ_PKT_CNT(pktcnt) | > DIEPT_SIZ_XFER_SIZE(length), ®->in_endp[ep_num].dieptsiz); > > @@ -921,7 +921,7 @@ static int dwc2_udc_get_status(struct dwc2_udc > *dev, (unsigned long) usb_ctrl + > ROUND(sizeof(g_status), > CONFIG_SYS_CACHELINE_SIZE)); > - writel(usb_ctrl_dma_addr, ®->in_endp[EP0_CON].diepdma); > + writel(phys_to_bus(usb_ctrl_dma_addr), > ®->in_endp[EP0_CON].diepdma); writel(DIEPT_SIZ_PKT_CNT(1) | > DIEPT_SIZ_XFER_SIZE(2), ®->in_endp[EP0_CON].dieptsiz); > Reviewed-by: Lukasz Majewski <lukma@denx.de> Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
diff --git a/drivers/usb/gadget/dwc2_udc_otg.c b/drivers/usb/gadget/dwc2_udc_otg.c index 35f4147840e..49f342eb211 100644 --- a/drivers/usb/gadget/dwc2_udc_otg.c +++ b/drivers/usb/gadget/dwc2_udc_otg.c @@ -31,6 +31,7 @@ #include <linux/usb/otg.h> #include <linux/usb/gadget.h> +#include <phys2bus.h> #include <asm/byteorder.h> #include <asm/unaligned.h> #include <asm/io.h> @@ -1213,6 +1214,7 @@ static int dwc2_udc_otg_remove(struct udevice *dev) static const struct udevice_id dwc2_udc_otg_ids[] = { { .compatible = "snps,dwc2" }, + { .compatible = "brcm,bcm2835-usb" }, { .compatible = "st,stm32mp1-hsotg", .data = (ulong)dwc2_set_stm32mp1_hsotg_params }, {}, diff --git a/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c index 7eb632d3b14..5e695b4ff2a 100644 --- a/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c +++ b/drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c @@ -28,7 +28,7 @@ static inline void dwc2_udc_ep0_zlp(struct dwc2_udc *dev) { u32 ep_ctrl; - writel(usb_ctrl_dma_addr, ®->in_endp[EP0_CON].diepdma); + writel(phys_to_bus((unsigned long)usb_ctrl_dma_addr), ®->in_endp[EP0_CON].diepdma); writel(DIEPT_SIZ_PKT_CNT(1), ®->in_endp[EP0_CON].dieptsiz); ep_ctrl = readl(®->in_endp[EP0_CON].diepctl); @@ -49,7 +49,7 @@ static void dwc2_udc_pre_setup(void) writel(DOEPT_SIZ_PKT_CNT(1) | sizeof(struct usb_ctrlrequest), ®->out_endp[EP0_CON].doeptsiz); - writel(usb_ctrl_dma_addr, ®->out_endp[EP0_CON].doepdma); + writel(phys_to_bus((unsigned long)usb_ctrl_dma_addr), ®->out_endp[EP0_CON].doepdma); ep_ctrl = readl(®->out_endp[EP0_CON].doepctl); writel(ep_ctrl|DEPCTL_EPENA, ®->out_endp[EP0_CON].doepctl); @@ -75,7 +75,7 @@ static inline void dwc2_ep0_complete_out(void) writel(DOEPT_SIZ_PKT_CNT(1) | sizeof(struct usb_ctrlrequest), ®->out_endp[EP0_CON].doeptsiz); - writel(usb_ctrl_dma_addr, ®->out_endp[EP0_CON].doepdma); + writel(phys_to_bus((unsigned long)usb_ctrl_dma_addr), ®->out_endp[EP0_CON].doepdma); ep_ctrl = readl(®->out_endp[EP0_CON].doepctl); writel(ep_ctrl|DEPCTL_EPENA|DEPCTL_CNAK, @@ -113,7 +113,7 @@ static int setdma_rx(struct dwc2_ep *ep, struct dwc2_request *req) (unsigned long) ep->dma_buf + ROUND(ep->len, CONFIG_SYS_CACHELINE_SIZE)); - writel((unsigned long) ep->dma_buf, ®->out_endp[ep_num].doepdma); + writel(phys_to_bus((unsigned long)ep->dma_buf), ®->out_endp[ep_num].doepdma); writel(DOEPT_SIZ_PKT_CNT(pktcnt) | DOEPT_SIZ_XFER_SIZE(length), ®->out_endp[ep_num].doeptsiz); writel(DEPCTL_EPENA|DEPCTL_CNAK|ctrl, ®->out_endp[ep_num].doepctl); @@ -161,7 +161,7 @@ static int setdma_tx(struct dwc2_ep *ep, struct dwc2_request *req) while (readl(®->grstctl) & TX_FIFO_FLUSH) ; - writel((unsigned long) ep->dma_buf, ®->in_endp[ep_num].diepdma); + writel(phys_to_bus((unsigned long)ep->dma_buf), ®->in_endp[ep_num].diepdma); writel(DIEPT_SIZ_PKT_CNT(pktcnt) | DIEPT_SIZ_XFER_SIZE(length), ®->in_endp[ep_num].dieptsiz); @@ -921,7 +921,7 @@ static int dwc2_udc_get_status(struct dwc2_udc *dev, (unsigned long) usb_ctrl + ROUND(sizeof(g_status), CONFIG_SYS_CACHELINE_SIZE)); - writel(usb_ctrl_dma_addr, ®->in_endp[EP0_CON].diepdma); + writel(phys_to_bus(usb_ctrl_dma_addr), ®->in_endp[EP0_CON].diepdma); writel(DIEPT_SIZ_PKT_CNT(1) | DIEPT_SIZ_XFER_SIZE(2), ®->in_endp[EP0_CON].dieptsiz);
Broadcom 2835 SoC requires special conversion of physical memory addresses for DMA purpose, so add needed wrappers to dwc2_udc_otg driver. Also extend the list of compatible devices with 'brcm,bcm2835-usb' entry. This allows to use USB gadget drivers (i.e. DFU) on Raspberry Pi4 boards. Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> --- drivers/usb/gadget/dwc2_udc_otg.c | 2 ++ drivers/usb/gadget/dwc2_udc_otg_xfer_dma.c | 12 ++++++------ 2 files changed, 8 insertions(+), 6 deletions(-)