Lines Matching +full:usb +full:- +full:glue
2 * Microchip PIC32 MUSB "glue layer"
8 * SPDX-License-Identifier: GPL-2.0+
10 * Based on the dsps "glue layer" code.
14 #include <linux/usb/musb.h>
15 #include "linux-compat.h"
31 #define USBCRCON_USBIE BIT(2) /* Enable USB General interrupt */
33 #define USBCRCON_BSVALMONEN BIT(4) /* Enable B-Device VBUS monitoring */
34 #define USBCRCON_ASVALMONEN BIT(5) /* Enable A-Device VBUS monitoring */
37 #define USBCRCON_USBIDVAL BIT(8) /* USB ID value */
38 #define USBCRCON_USBIDOVEN BIT(9) /* USB ID override enable */
39 #define USBCRCON_USBWK BIT(24) /* USB Wakeup Status */
40 #define USBCRCON_USBRF BIT(25) /* USB Resume Status */
41 #define USBCRCON_USBIF BIT(26) /* USB General Interrupt Status */
61 musb_writeb(musb->mregs, MUSB_SOFTRST, MUSB_SOFTRST_NRSTX); in pic32_musb_enable()
63 musb_platform_set_mode(musb, musb->board_mode); in pic32_musb_enable()
74 /* ack usb core interrupts */ in pic32_interrupt()
75 musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB); in pic32_interrupt()
76 if (musb->int_usb) in pic32_interrupt()
77 musb_writeb(musb->mregs, MUSB_INTRUSB, musb->int_usb); in pic32_interrupt()
80 musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX) & PIC32_RX_EP_MASK; in pic32_interrupt()
81 if (musb->int_rx) in pic32_interrupt()
82 musb_writew(musb->mregs, MUSB_INTRRX, musb->int_rx); in pic32_interrupt()
84 musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX) & PIC32_TX_EP_MASK; in pic32_interrupt()
85 if (musb->int_tx) in pic32_interrupt()
86 musb_writew(musb->mregs, MUSB_INTRTX, musb->int_tx); in pic32_interrupt()
89 if (musb->int_usb & MUSB_INTR_DISCONNECT) { in pic32_interrupt()
90 musb->int_tx = 0; in pic32_interrupt()
91 musb->int_rx = 0; in pic32_interrupt()
94 if (musb->int_tx || musb->int_rx || musb->int_usb) in pic32_interrupt()
102 struct device *dev = musb->controller; in pic32_musb_set_mode()
107 clrsetbits_le32(pdata->musb_glue + USBCRCON, in pic32_musb_set_mode()
111 setbits_le32(pdata->musb_glue + USBCRCON, in pic32_musb_set_mode()
119 return -EINVAL; in pic32_musb_set_mode()
127 struct pic32_musb_data *pdata = to_pic32_musb_data(musb->controller); in pic32_musb_init()
132 hwvers = musb_read_hwvers(musb->mregs); in pic32_musb_init()
134 return -ENODEV; in pic32_musb_init()
137 power = musb_readb(musb->mregs, MUSB_POWER); in pic32_musb_init()
139 musb_writeb(musb->mregs, MUSB_POWER, power); in pic32_musb_init()
142 /* Start the on-chip PHY and its PLL. */ in pic32_musb_init()
144 musb_writeb(musb->mregs, MUSB_POWER, power); in pic32_musb_init()
146 musb->isr = pic32_interrupt; in pic32_musb_init()
153 writel(ctrl, pdata->musb_glue + USBCRCON); in pic32_musb_init()
161 void __iomem *fifo = hw_ep->fifo; in musb_read_fifo()
164 /* USB stack ensures dst is always 32bit aligned. */ in musb_read_fifo()
180 /* PIC32 default FIFO config - fits in 8KB */
219 struct musb_host_data *mdata = &pdata->mdata; in musb_usb_probe()
220 struct fdt_resource mc, glue; in musb_usb_probe() local
221 void *fdt = (void *)gd->fdt_blob; in musb_usb_probe()
226 priv->desc_before_addr = true; in musb_usb_probe()
228 ret = fdt_get_named_resource(fdt, node, "reg", "reg-names", in musb_usb_probe()
231 printf("pic32-musb: resource \"mc\" not found\n"); in musb_usb_probe()
235 ret = fdt_get_named_resource(fdt, node, "reg", "reg-names", in musb_usb_probe()
236 "control", &glue); in musb_usb_probe()
238 printf("pic32-musb: resource \"control\" not found\n"); in musb_usb_probe()
243 pdata->musb_glue = ioremap(glue.start, fdt_resource_size(&glue)); in musb_usb_probe()
247 mdata->host = musb_init_controller(&pic32_musb_plat, in musb_usb_probe()
248 &pdata->dev, mregs); in musb_usb_probe()
249 if (!mdata->host) in musb_usb_probe()
250 return -EIO; in musb_usb_probe()
255 ret = musb_register(&pic32_musb_plat, &pdata->dev, mregs); in musb_usb_probe()
267 musb_stop(pdata->mdata.host); in musb_usb_remove()
273 { .compatible = "microchip,pic32mzda-usb" },
278 .name = "pic32-musb",