Lines Matching +full:otg +full:- +full:rev
10 * SPDX-License-Identifier: GPL-2.0
23 #include <linux/dma-mapping.h>
35 #include "linux-compat.h"
143 * dsps_musb_enable - enable interrupts
152 struct device *dev = musb->controller; in dsps_musb_enable()
153 struct platform_device *pdev = to_platform_device(dev->parent); in dsps_musb_enable()
155 const struct dsps_musb_wrapper *wrp = glue->wrp; in dsps_musb_enable()
159 void __iomem *reg_base = musb->ctrl_base; in dsps_musb_enable()
163 epmask = ((musb->epmask & wrp->txep_mask) << wrp->txep_shift) | in dsps_musb_enable()
164 ((musb->epmask & wrp->rxep_mask) << wrp->rxep_shift); in dsps_musb_enable()
165 coremask = (wrp->usb_bitmap & ~MUSB_INTR_SOF); in dsps_musb_enable()
167 dsps_writel(reg_base, wrp->epintr_set, epmask); in dsps_musb_enable()
168 dsps_writel(reg_base, wrp->coreintr_set, coremask); in dsps_musb_enable()
172 dsps_writel(reg_base, wrp->coreintr_set, in dsps_musb_enable()
173 (1 << wrp->drvvbus) << wrp->usb_shift); in dsps_musb_enable()
180 * dsps_musb_disable - disable HDRC and flush interrupts
185 struct device *dev = musb->controller; in dsps_musb_disable()
186 struct platform_device *pdev = to_platform_device(dev->parent); in dsps_musb_disable()
188 const struct dsps_musb_wrapper *wrp = glue->wrp; in dsps_musb_disable()
189 void __iomem *reg_base = musb->ctrl_base; in dsps_musb_disable()
191 dsps_writel(reg_base, wrp->coreintr_clear, wrp->usb_bitmap); in dsps_musb_disable()
192 dsps_writel(reg_base, wrp->epintr_clear, in dsps_musb_disable()
193 wrp->txep_bitmap | wrp->rxep_bitmap); in dsps_musb_disable()
194 dsps_writeb(musb->mregs, MUSB_DEVCTL, 0); in dsps_musb_disable()
195 dsps_writel(reg_base, wrp->eoi, 0); in dsps_musb_disable()
203 void __iomem *mregs = musb->mregs; in otg_timer()
204 struct device *dev = musb->controller; in otg_timer()
205 struct platform_device *pdev = to_platform_device(dev->parent); in otg_timer()
207 const struct dsps_musb_wrapper *wrp = glue->wrp; in otg_timer()
212 * We poll because DSPS IP's won't expose several OTG-critical in otg_timer()
216 dev_dbg(musb->controller, "Poll devctl %02x (%s)\n", devctl, in otg_timer()
217 otg_state_string(musb->xceiv->state)); in otg_timer()
219 spin_lock_irqsave(&musb->lock, flags); in otg_timer()
220 switch (musb->xceiv->state) { in otg_timer()
223 dsps_writeb(musb->mregs, MUSB_DEVCTL, devctl); in otg_timer()
225 devctl = dsps_readb(musb->mregs, MUSB_DEVCTL); in otg_timer()
227 musb->xceiv->state = OTG_STATE_B_IDLE; in otg_timer()
230 musb->xceiv->state = OTG_STATE_A_IDLE; in otg_timer()
235 musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; in otg_timer()
236 dsps_writel(musb->ctrl_base, wrp->coreintr_set, in otg_timer()
237 MUSB_INTR_VBUSERROR << wrp->usb_shift); in otg_timer()
245 mod_timer(&glue->timer, in otg_timer()
246 jiffies + wrp->poll_seconds * HZ); in otg_timer()
248 musb->xceiv->state = OTG_STATE_A_IDLE; in otg_timer()
253 spin_unlock_irqrestore(&musb->lock, flags); in otg_timer()
258 struct device *dev = musb->controller; in dsps_musb_try_idle()
259 struct platform_device *pdev = to_platform_device(dev->parent); in dsps_musb_try_idle()
270 if (musb->is_active || (musb->a_wait_bcon == 0 && in dsps_musb_try_idle()
271 musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) { in dsps_musb_try_idle()
272 dev_dbg(musb->controller, "%s active, deleting timer\n", in dsps_musb_try_idle()
273 otg_state_string(musb->xceiv->state)); in dsps_musb_try_idle()
274 del_timer(&glue->timer); in dsps_musb_try_idle()
279 if (time_after(last_timer, timeout) && timer_pending(&glue->timer)) { in dsps_musb_try_idle()
280 dev_dbg(musb->controller, in dsps_musb_try_idle()
286 dev_dbg(musb->controller, "%s inactive, starting idle timer for %u ms\n", in dsps_musb_try_idle()
287 otg_state_string(musb->xceiv->state), in dsps_musb_try_idle()
288 jiffies_to_msecs(timeout - jiffies)); in dsps_musb_try_idle()
289 mod_timer(&glue->timer, timeout); in dsps_musb_try_idle()
296 void __iomem *reg_base = musb->ctrl_base; in dsps_interrupt()
298 struct device *dev = musb->controller; in dsps_interrupt()
299 struct platform_device *pdev = to_platform_device(dev->parent); in dsps_interrupt()
301 const struct dsps_musb_wrapper *wrp = glue->wrp; in dsps_interrupt()
309 spin_lock_irqsave(&musb->lock, flags); in dsps_interrupt()
312 epintr = dsps_readl(reg_base, wrp->epintr_status); in dsps_interrupt()
313 musb->int_rx = (epintr & wrp->rxep_bitmap) >> wrp->rxep_shift; in dsps_interrupt()
314 musb->int_tx = (epintr & wrp->txep_bitmap) >> wrp->txep_shift; in dsps_interrupt()
317 dsps_writel(reg_base, wrp->epintr_status, epintr); in dsps_interrupt()
320 usbintr = dsps_readl(reg_base, wrp->coreintr_status); in dsps_interrupt()
324 musb->int_usb = (usbintr & wrp->usb_bitmap) >> wrp->usb_shift; in dsps_interrupt()
326 dsps_writel(reg_base, wrp->coreintr_status, usbintr); in dsps_interrupt()
328 dev_dbg(musb->controller, "usbintr (%x) epintr(%x)\n", in dsps_interrupt()
334 * switch appropriately between halves of the OTG state machine. in dsps_interrupt()
342 if (usbintr & ((1 << wrp->drvvbus) << wrp->usb_shift)) { in dsps_interrupt()
343 int drvvbus = dsps_readl(reg_base, wrp->status); in dsps_interrupt()
344 void __iomem *mregs = musb->mregs; in dsps_interrupt()
348 err = is_host_enabled(musb) && (musb->int_usb & in dsps_interrupt()
354 * means it's not uncommon for bus-powered devices in dsps_interrupt()
358 * seems to allow a better one: "re"-starting sessions in dsps_interrupt()
362 musb->int_usb &= ~MUSB_INTR_VBUSERROR; in dsps_interrupt()
363 musb->xceiv->state = OTG_STATE_A_WAIT_VFALL; in dsps_interrupt()
364 mod_timer(&glue->timer, in dsps_interrupt()
365 jiffies + wrp->poll_seconds * HZ); in dsps_interrupt()
368 musb->is_active = 1; in dsps_interrupt()
370 musb->xceiv->otg->default_a = 1; in dsps_interrupt()
371 musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; in dsps_interrupt()
372 del_timer(&glue->timer); in dsps_interrupt()
374 musb->is_active = 0; in dsps_interrupt()
376 musb->xceiv->otg->default_a = 0; in dsps_interrupt()
377 musb->xceiv->state = OTG_STATE_B_IDLE; in dsps_interrupt()
380 /* NOTE: this must complete power-on within 100 ms. */ in dsps_interrupt()
381 dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n", in dsps_interrupt()
383 otg_state_string(musb->xceiv->state), in dsps_interrupt()
390 if (musb->int_tx || musb->int_rx || musb->int_usb) in dsps_interrupt()
394 /* EOI needs to be written for the IRQ to be re-asserted. */ in dsps_interrupt()
396 dsps_writel(reg_base, wrp->eoi, 1); in dsps_interrupt()
400 if (is_otg_enabled(musb) && musb->xceiv->state == OTG_STATE_B_IDLE) in dsps_interrupt()
401 mod_timer(&glue->timer, jiffies + wrp->poll_seconds * HZ); in dsps_interrupt()
404 spin_unlock_irqrestore(&musb->lock, flags); in dsps_interrupt()
412 struct device *dev = musb->controller; in dsps_musb_init()
413 struct musb_hdrc_platform_data *plat = dev->platform_data; in dsps_musb_init()
414 struct platform_device *pdev = to_platform_device(dev->parent); in dsps_musb_init()
416 const struct dsps_musb_wrapper *wrp = glue->wrp; in dsps_musb_init()
417 struct omap_musb_board_data *data = plat->board_data; in dsps_musb_init()
420 (struct omap_musb_board_data *)musb->controller; in dsps_musb_init()
423 void __iomem *reg_base = musb->ctrl_base; in dsps_musb_init()
424 u32 rev, val; in dsps_musb_init() local
428 musb->mregs += wrp->musb_core_offset; in dsps_musb_init()
433 musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2); in dsps_musb_init()
434 if (IS_ERR_OR_NULL(musb->xceiv)) in dsps_musb_init()
435 return -ENODEV; in dsps_musb_init()
439 rev = dsps_readl(reg_base, wrp->revision); in dsps_musb_init()
440 if (!rev) { in dsps_musb_init()
441 status = -ENODEV; in dsps_musb_init()
447 setup_timer(&glue->timer, otg_timer, (unsigned long) musb); in dsps_musb_init()
451 dsps_writel(reg_base, wrp->control, (1 << wrp->reset)); in dsps_musb_init()
453 /* Start the on-chip PHY and its PLL. */ in dsps_musb_init()
454 if (data->set_phy_power) in dsps_musb_init()
455 data->set_phy_power(data->dev, 1); in dsps_musb_init()
457 musb->isr = dsps_interrupt; in dsps_musb_init()
460 val = dsps_readl(reg_base, wrp->phy_utmi); in dsps_musb_init()
461 val &= ~(1 << wrp->otg_disable); in dsps_musb_init()
462 dsps_writel(musb->ctrl_base, wrp->phy_utmi, val); in dsps_musb_init()
465 dsps_writel(reg_base, wrp->eoi, 0); in dsps_musb_init()
470 usb_put_phy(musb->xceiv); in dsps_musb_init()
479 struct device *dev = musb->controller; in dsps_musb_exit()
480 struct musb_hdrc_platform_data *plat = dev->platform_data; in dsps_musb_exit()
481 struct omap_musb_board_data *data = plat->board_data; in dsps_musb_exit()
482 struct platform_device *pdev = to_platform_device(dev->parent); in dsps_musb_exit()
486 (struct omap_musb_board_data *)musb->controller; in dsps_musb_exit()
491 del_timer_sync(&glue->timer); in dsps_musb_exit()
494 /* Shutdown the on-chip PHY and its PLL. */ in dsps_musb_exit()
495 if (data->set_phy_power) in dsps_musb_exit()
496 data->set_phy_power(data->dev, 0); in dsps_musb_exit()
500 usb_put_phy(musb->xceiv); in dsps_musb_exit()
530 struct device *dev = glue->dev; in dsps_create_musb_pdev()
532 struct musb_hdrc_platform_data *pdata = dev->platform_data; in dsps_create_musb_pdev()
544 ret = -ENODEV; in dsps_create_musb_pdev()
547 res->parent = NULL; in dsps_create_musb_pdev()
551 sprintf(res_name, "musb%d-irq", id); in dsps_create_musb_pdev()
555 ret = -ENODEV; in dsps_create_musb_pdev()
558 res->parent = NULL; in dsps_create_musb_pdev()
563 musb = platform_device_alloc("musb-hdrc", -1); in dsps_create_musb_pdev()
566 ret = -ENOMEM; in dsps_create_musb_pdev()
570 musb->dev.parent = dev; in dsps_create_musb_pdev()
571 musb->dev.dma_mask = &musb_dmamask; in dsps_create_musb_pdev()
572 musb->dev.coherent_dma_mask = musb_dmamask; in dsps_create_musb_pdev()
574 glue->musb = musb; in dsps_create_musb_pdev()
576 pdata->platform_ops = &dsps_ops; in dsps_create_musb_pdev()
606 platform_device_del(glue->musb); in dsps_delete_musb_pdev()
607 platform_device_put(glue->musb); in dsps_delete_musb_pdev()
614 (struct dsps_musb_wrapper *)id->driver_data; in dsps_probe()
622 dev_err(&pdev->dev, "unable to allocate glue memory\n"); in dsps_probe()
623 ret = -ENOMEM; in dsps_probe()
630 dev_err(&pdev->dev, "failed to get usbss mem resource\n"); in dsps_probe()
631 ret = -ENODEV; in dsps_probe()
635 glue->dev = &pdev->dev; in dsps_probe()
637 glue->wrp = kmemdup(wrp, sizeof(*wrp), GFP_KERNEL); in dsps_probe()
638 if (!glue->wrp) { in dsps_probe()
639 dev_err(&pdev->dev, "failed to duplicate wrapper struct memory\n"); in dsps_probe()
640 ret = -ENOMEM; in dsps_probe()
646 pm_runtime_enable(&pdev->dev); in dsps_probe()
648 ret = pm_runtime_get_sync(&pdev->dev); in dsps_probe()
650 dev_err(&pdev->dev, "pm_runtime_get_sync FAILED"); in dsps_probe()
657 dev_err(&pdev->dev, "failed to create child pdev\n"); in dsps_probe()
664 pm_runtime_put(&pdev->dev); in dsps_probe()
666 pm_runtime_disable(&pdev->dev); in dsps_probe()
667 kfree(glue->wrp); in dsps_probe()
681 pm_runtime_put(&pdev->dev); in dsps_remove()
682 pm_runtime_disable(&pdev->dev); in dsps_remove()
683 kfree(glue->wrp); in dsps_remove()
691 struct musb_hdrc_platform_data *plat = dev->platform_data; in dsps_suspend()
692 struct omap_musb_board_data *data = plat->board_data; in dsps_suspend()
694 /* Shutdown the on-chip PHY and its PLL. */ in dsps_suspend()
695 if (data->set_phy_power) in dsps_suspend()
696 data->set_phy_power(data->dev, 0); in dsps_suspend()
703 struct musb_hdrc_platform_data *plat = dev->platform_data; in dsps_resume()
704 struct omap_musb_board_data *data = plat->board_data; in dsps_resume()
706 /* Start the on-chip PHY and its PLL. */ in dsps_resume()
707 if (data->set_phy_power) in dsps_resume()
708 data->set_phy_power(data->dev, 1); in dsps_resume()
720 .name = "musb-ti81xx",
728 { .compatible = "musb-ti81xx", },
729 { .compatible = "ti,ti81xx-musb", },
730 { .compatible = "ti,am335x-musb", },
739 .name = "musb-dsps",