Lines Matching full:musb

3  * PolarFire SoC (MPFS) MUSB Glue Layer
27 struct platform_device *musb; member
52 static void mpfs_musb_set_vbus(struct musb *musb, int is_on) in mpfs_musb_set_vbus() argument
61 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in mpfs_musb_set_vbus()
64 musb->is_active = 1; in mpfs_musb_set_vbus()
65 musb->xceiv->otg->default_a = 1; in mpfs_musb_set_vbus()
66 musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE; in mpfs_musb_set_vbus()
68 MUSB_HST_MODE(musb); in mpfs_musb_set_vbus()
70 musb->is_active = 0; in mpfs_musb_set_vbus()
76 musb->xceiv->otg->default_a = 0; in mpfs_musb_set_vbus()
77 musb->xceiv->otg->state = OTG_STATE_B_IDLE; in mpfs_musb_set_vbus()
80 MUSB_DEV_MODE(musb); in mpfs_musb_set_vbus()
83 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); in mpfs_musb_set_vbus()
85 dev_dbg(musb->controller, "VBUS %s, devctl %02x\n", in mpfs_musb_set_vbus()
86 usb_otg_state_string(musb->xceiv->otg->state), in mpfs_musb_set_vbus()
87 musb_readb(musb->mregs, MUSB_DEVCTL)); in mpfs_musb_set_vbus()
94 struct musb *musb = timer_container_of(musb, t, in otg_timer() local
96 void __iomem *mregs = musb->mregs; in otg_timer()
105 dev_dbg(musb->controller, "Poll devctl %02x (%s)\n", devctl, in otg_timer()
106 usb_otg_state_string(musb->xceiv->otg->state)); in otg_timer()
108 spin_lock_irqsave(&musb->lock, flags); in otg_timer()
109 switch (musb->xceiv->otg->state) { in otg_timer()
112 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); in otg_timer()
114 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in otg_timer()
116 musb->xceiv->otg->state = OTG_STATE_B_IDLE; in otg_timer()
117 MUSB_DEV_MODE(musb); in otg_timer()
118 mod_timer(&musb->dev_timer, jiffies + POLL_SECONDS * HZ); in otg_timer()
120 musb->xceiv->otg->state = OTG_STATE_A_IDLE; in otg_timer()
121 MUSB_HST_MODE(musb); in otg_timer()
126 mod_timer(&musb->dev_timer, jiffies + POLL_SECONDS * HZ); in otg_timer()
129 musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE; in otg_timer()
147 mod_timer(&musb->dev_timer, jiffies + POLL_SECONDS * HZ); in otg_timer()
149 musb->xceiv->otg->state = OTG_STATE_A_IDLE; in otg_timer()
154 spin_unlock_irqrestore(&musb->lock, flags); in otg_timer()
157 static void __maybe_unused mpfs_musb_try_idle(struct musb *musb, unsigned long timeout) in mpfs_musb_try_idle() argument
165 if (musb->is_active || (musb->a_wait_bcon == 0 && in mpfs_musb_try_idle()
166 musb->xceiv->otg->state == OTG_STATE_A_WAIT_BCON)) { in mpfs_musb_try_idle()
167 dev_dbg(musb->controller, "%s active, deleting timer\n", in mpfs_musb_try_idle()
168 usb_otg_state_string(musb->xceiv->otg->state)); in mpfs_musb_try_idle()
169 timer_delete(&musb->dev_timer); in mpfs_musb_try_idle()
174 if (time_after(last_timer, timeout) && timer_pending(&musb->dev_timer)) { in mpfs_musb_try_idle()
175 dev_dbg(musb->controller, "Longer idle timer already pending, ignoring...\n"); in mpfs_musb_try_idle()
180 dev_dbg(musb->controller, "%s inactive, starting idle timer for %u ms\n", in mpfs_musb_try_idle()
181 usb_otg_state_string(musb->xceiv->otg->state), in mpfs_musb_try_idle()
183 mod_timer(&musb->dev_timer, timeout); in mpfs_musb_try_idle()
190 struct musb *musb = __hci; in mpfs_musb_interrupt() local
192 spin_lock_irqsave(&musb->lock, flags); in mpfs_musb_interrupt()
194 musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB); in mpfs_musb_interrupt()
195 musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX); in mpfs_musb_interrupt()
196 musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX); in mpfs_musb_interrupt()
198 if (musb->int_usb || musb->int_tx || musb->int_rx) { in mpfs_musb_interrupt()
199 musb_writeb(musb->mregs, MUSB_INTRUSB, musb->int_usb); in mpfs_musb_interrupt()
200 musb_writew(musb->mregs, MUSB_INTRTX, musb->int_tx); in mpfs_musb_interrupt()
201 musb_writew(musb->mregs, MUSB_INTRRX, musb->int_rx); in mpfs_musb_interrupt()
202 ret = musb_interrupt(musb); in mpfs_musb_interrupt()
206 if (musb->xceiv->otg->state == OTG_STATE_B_IDLE) in mpfs_musb_interrupt()
207 mod_timer(&musb->dev_timer, jiffies + POLL_SECONDS * HZ); in mpfs_musb_interrupt()
209 spin_unlock_irqrestore(&musb->lock, flags); in mpfs_musb_interrupt()
214 static int mpfs_musb_init(struct musb *musb) in mpfs_musb_init() argument
216 struct device *dev = musb->controller; in mpfs_musb_init()
218 musb->xceiv = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2); in mpfs_musb_init()
219 if (IS_ERR(musb->xceiv)) { in mpfs_musb_init()
221 return PTR_ERR(musb->xceiv); in mpfs_musb_init()
224 timer_setup(&musb->dev_timer, otg_timer, 0); in mpfs_musb_init()
226 musb->dyn_fifo = true; in mpfs_musb_init()
227 musb->isr = mpfs_musb_interrupt; in mpfs_musb_init()
229 musb_platform_set_vbus(musb, 1); in mpfs_musb_init()
234 static int mpfs_musb_exit(struct musb *musb) in mpfs_musb_exit() argument
236 timer_delete_sync(&musb->dev_timer); in mpfs_musb_exit()
269 musb_pdev = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO); in mpfs_probe()
271 dev_err(dev, "failed to allocate musb device\n"); in mpfs_probe()
294 glue->musb = musb_pdev; in mpfs_probe()
338 dev_err(dev, "failed to register musb device\n"); in mpfs_probe()
342 dev_info(&pdev->dev, "Registered MPFS MUSB driver\n"); in mpfs_probe()
359 platform_device_unregister(glue->musb); in mpfs_remove()
365 { .compatible = "microchip,mpfs-musb" },
375 .name = "mpfs-musb",
382 MODULE_DESCRIPTION("PolarFire SoC MUSB Glue Layer");