• Home
  • Raw
  • Download

Lines Matching +full:usb +full:- +full:glue

1 // SPDX-License-Identifier: GPL-2.0+
3 * Ingenic JZ4740 "glue layer"
9 #include <linux/dma-mapping.h>
15 #include <linux/usb/role.h>
16 #include <linux/usb/usb_phy_generic.h>
33 if (IS_ENABLED(CONFIG_USB_INVENTRA_DMA) && musb->dma_controller) in jz4740_musb_interrupt()
34 retval_dma = dma_controller_irq(irq, musb->dma_controller); in jz4740_musb_interrupt()
36 spin_lock_irqsave(&musb->lock, flags); in jz4740_musb_interrupt()
38 musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB); in jz4740_musb_interrupt()
39 musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX); in jz4740_musb_interrupt()
40 musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX); in jz4740_musb_interrupt()
47 musb->int_usb &= MUSB_INTR_SUSPEND | MUSB_INTR_RESUME | in jz4740_musb_interrupt()
50 if (musb->int_usb || musb->int_tx || musb->int_rx) in jz4740_musb_interrupt()
53 spin_unlock_irqrestore(&musb->lock, flags); in jz4740_musb_interrupt()
68 /* Silicon does not implement USB OTG. */
81 struct jz4740_glue *glue = usb_role_switch_get_drvdata(sw); in jz4740_musb_role_switch_set() local
82 struct usb_phy *phy = glue->musb->xceiv; in jz4740_musb_role_switch_set()
86 atomic_notifier_call_chain(&phy->notifier, USB_EVENT_NONE, phy); in jz4740_musb_role_switch_set()
89 atomic_notifier_call_chain(&phy->notifier, USB_EVENT_VBUS, phy); in jz4740_musb_role_switch_set()
92 atomic_notifier_call_chain(&phy->notifier, USB_EVENT_ID, phy); in jz4740_musb_role_switch_set()
101 struct device *dev = musb->controller->parent; in jz4740_musb_init()
102 struct jz4740_glue *glue = dev_get_drvdata(dev); in jz4740_musb_init() local
105 .driver_data = glue, in jz4740_musb_init()
110 glue->musb = musb; in jz4740_musb_init()
112 if (dev->of_node) in jz4740_musb_init()
113 musb->xceiv = devm_usb_get_phy_by_phandle(dev, "phys", 0); in jz4740_musb_init()
115 musb->xceiv = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2); in jz4740_musb_init()
116 if (IS_ERR(musb->xceiv)) { in jz4740_musb_init()
117 err = PTR_ERR(musb->xceiv); in jz4740_musb_init()
118 if (err != -EPROBE_DEFER) in jz4740_musb_init()
123 glue->role_sw = usb_role_switch_register(dev, &role_sw_desc); in jz4740_musb_init()
124 if (IS_ERR(glue->role_sw)) { in jz4740_musb_init()
125 dev_err(dev, "Failed to register USB role switch"); in jz4740_musb_init()
126 return PTR_ERR(glue->role_sw); in jz4740_musb_init()
133 musb->dyn_fifo = true; in jz4740_musb_init()
135 musb->isr = jz4740_musb_interrupt; in jz4740_musb_init()
142 struct jz4740_glue *glue = dev_get_drvdata(musb->controller->parent); in jz4740_musb_exit() local
144 usb_role_switch_unregister(glue->role_sw); in jz4740_musb_exit()
195 struct device *dev = &pdev->dev; in jz4740_probe()
198 struct jz4740_glue *glue; in jz4740_probe() local
202 glue = devm_kzalloc(dev, sizeof(*glue), GFP_KERNEL); in jz4740_probe()
203 if (!glue) in jz4740_probe()
204 return -ENOMEM; in jz4740_probe()
209 return -EINVAL; in jz4740_probe()
212 musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO); in jz4740_probe()
215 return -ENOMEM; in jz4740_probe()
231 musb->dev.parent = dev; in jz4740_probe()
232 musb->dev.dma_mask = &musb->dev.coherent_dma_mask; in jz4740_probe()
233 musb->dev.coherent_dma_mask = DMA_BIT_MASK(32); in jz4740_probe()
235 glue->pdev = musb; in jz4740_probe()
236 glue->clk = clk; in jz4740_probe()
238 platform_set_drvdata(pdev, glue); in jz4740_probe()
240 ret = platform_device_add_resources(musb, pdev->resource, in jz4740_probe()
241 pdev->num_resources); in jz4740_probe()
270 struct jz4740_glue *glue = platform_get_drvdata(pdev); in jz4740_remove() local
272 platform_device_unregister(glue->pdev); in jz4740_remove()
273 clk_disable_unprepare(glue->clk); in jz4740_remove()
279 { .compatible = "ingenic,jz4740-musb", .data = &jz4740_musb_pdata },
280 { .compatible = "ingenic,jz4770-musb", .data = &jz4770_musb_pdata },
289 .name = "musb-jz4740",
294 MODULE_DESCRIPTION("JZ4740 MUSB Glue Layer");