Lines Matching full:udc

3  * snps_udc_plat.c - Synopsys UDC Platform Driver
21 #define UDC_MOD_DESCRIPTION "Synopsys UDC platform driver"
23 static void start_udc(struct udc *udc) in start_udc() argument
25 if (udc->driver) { in start_udc()
26 dev_info(udc->dev, "Connecting...\n"); in start_udc()
27 udc_enable_dev_setup_interrupts(udc); in start_udc()
28 udc_basic_init(udc); in start_udc()
29 udc->connected = 1; in start_udc()
33 static void stop_udc(struct udc *udc) in stop_udc() argument
38 spin_lock(&udc->lock); in stop_udc()
41 reg = readl(&udc->regs->ctl); in stop_udc()
43 writel(reg, &udc->regs->ctl); in stop_udc()
45 reg = readl(&udc->regs->ctl); in stop_udc()
47 writel(reg, &udc->regs->ctl); in stop_udc()
48 dev_dbg(udc->dev, "ep rx queue flushed\n"); in stop_udc()
51 * UDC is connected to a DRD phy. in stop_udc()
53 udc_mask_unused_interrupts(udc); in stop_udc()
56 if (udc->driver) { in stop_udc()
57 spin_unlock(&udc->lock); in stop_udc()
58 udc->driver->disconnect(&udc->gadget); in stop_udc()
59 spin_lock(&udc->lock); in stop_udc()
63 empty_req_queue(&udc->ep[tmp]); in stop_udc()
65 udc->connected = 0; in stop_udc()
67 spin_unlock(&udc->lock); in stop_udc()
68 dev_info(udc->dev, "Device disconnected\n"); in stop_udc()
73 struct udc *udc; in udc_drd_work() local
75 udc = container_of(to_delayed_work(work), in udc_drd_work()
76 struct udc, drd_work); in udc_drd_work()
78 if (udc->conn_type) { in udc_drd_work()
79 dev_dbg(udc->dev, "idle -> device\n"); in udc_drd_work()
80 start_udc(udc); in udc_drd_work()
82 dev_dbg(udc->dev, "device -> idle\n"); in udc_drd_work()
83 stop_udc(udc); in udc_drd_work()
90 struct udc *udc = container_of(self, struct udc, nb); in usbd_connect_notify() local
92 dev_dbg(udc->dev, "%s: event: %lu\n", __func__, event); in usbd_connect_notify()
94 udc->conn_type = event; in usbd_connect_notify()
96 schedule_delayed_work(&udc->drd_work, 0); in usbd_connect_notify()
105 struct udc *udc; in udc_plat_probe() local
108 udc = devm_kzalloc(dev, sizeof(*udc), GFP_KERNEL); in udc_plat_probe()
109 if (!udc) in udc_plat_probe()
112 spin_lock_init(&udc->lock); in udc_plat_probe()
113 udc->dev = dev; in udc_plat_probe()
115 udc->virt_addr = devm_platform_get_and_ioremap_resource(pdev, 0, &res); in udc_plat_probe()
116 if (IS_ERR(udc->virt_addr)) in udc_plat_probe()
117 return PTR_ERR(udc->virt_addr); in udc_plat_probe()
119 /* udc csr registers base */ in udc_plat_probe()
120 udc->csr = udc->virt_addr + UDC_CSR_ADDR; in udc_plat_probe()
123 udc->regs = udc->virt_addr + UDC_DEVCFG_ADDR; in udc_plat_probe()
126 udc->ep_regs = udc->virt_addr + UDC_EPREGS_ADDR; in udc_plat_probe()
129 udc->rxfifo = (u32 __iomem *)(udc->virt_addr + UDC_RXFIFO_ADDR); in udc_plat_probe()
130 udc->txfifo = (u32 __iomem *)(udc->virt_addr + UDC_TXFIFO_ADDR); in udc_plat_probe()
132 udc->phys_addr = (unsigned long)res->start; in udc_plat_probe()
134 udc->irq = irq_of_parse_and_map(dev->of_node, 0); in udc_plat_probe()
135 if (udc->irq <= 0) { in udc_plat_probe()
140 udc->udc_phy = devm_of_phy_get_by_index(dev, dev->of_node, 0); in udc_plat_probe()
141 if (IS_ERR(udc->udc_phy)) { in udc_plat_probe()
143 return PTR_ERR(udc->udc_phy); in udc_plat_probe()
146 ret = phy_init(udc->udc_phy); in udc_plat_probe()
148 dev_err(dev, "UDC phy init failed"); in udc_plat_probe()
152 ret = phy_power_on(udc->udc_phy); in udc_plat_probe()
154 dev_err(dev, "UDC phy power on failed"); in udc_plat_probe()
155 phy_exit(udc->udc_phy); in udc_plat_probe()
161 udc->edev = extcon_get_edev_by_phandle(dev, 0); in udc_plat_probe()
162 if (IS_ERR(udc->edev)) { in udc_plat_probe()
163 if (PTR_ERR(udc->edev) == -EPROBE_DEFER) in udc_plat_probe()
166 ret = PTR_ERR(udc->edev); in udc_plat_probe()
170 udc->nb.notifier_call = usbd_connect_notify; in udc_plat_probe()
171 ret = extcon_register_notifier(udc->edev, EXTCON_USB, in udc_plat_probe()
172 &udc->nb); in udc_plat_probe()
178 ret = extcon_get_state(udc->edev, EXTCON_USB); in udc_plat_probe()
183 udc->conn_type = ret; in udc_plat_probe()
185 INIT_DELAYED_WORK(&udc->drd_work, udc_drd_work); in udc_plat_probe()
190 ret = init_dma_pools(udc); in udc_plat_probe()
195 ret = devm_request_irq(dev, udc->irq, udc_irq, IRQF_SHARED, in udc_plat_probe()
196 "snps-udc", udc); in udc_plat_probe()
198 dev_err(dev, "Request irq %d failed for UDC\n", udc->irq); in udc_plat_probe()
202 platform_set_drvdata(pdev, udc); in udc_plat_probe()
203 udc->chiprev = UDC_BCM_REV; in udc_plat_probe()
205 if (udc_probe(udc)) { in udc_plat_probe()
209 dev_info(dev, "Synopsys UDC platform driver probe successful\n"); in udc_plat_probe()
215 free_dma_pools(udc); in udc_plat_probe()
217 if (udc->edev) in udc_plat_probe()
218 extcon_unregister_notifier(udc->edev, EXTCON_USB, &udc->nb); in udc_plat_probe()
220 if (udc->udc_phy) { in udc_plat_probe()
221 phy_power_off(udc->udc_phy); in udc_plat_probe()
222 phy_exit(udc->udc_phy); in udc_plat_probe()
229 struct udc *dev; in udc_plat_remove()
249 dev_info(&pdev->dev, "Synopsys UDC platform driver removed\n"); in udc_plat_remove()
255 struct udc *udc; in udc_plat_suspend() local
257 udc = dev_get_drvdata(dev); in udc_plat_suspend()
258 stop_udc(udc); in udc_plat_suspend()
260 if (extcon_get_state(udc->edev, EXTCON_USB) > 0) { in udc_plat_suspend()
261 dev_dbg(udc->dev, "device -> idle\n"); in udc_plat_suspend()
262 stop_udc(udc); in udc_plat_suspend()
264 phy_power_off(udc->udc_phy); in udc_plat_suspend()
265 phy_exit(udc->udc_phy); in udc_plat_suspend()
272 struct udc *udc; in udc_plat_resume() local
275 udc = dev_get_drvdata(dev); in udc_plat_resume()
277 ret = phy_init(udc->udc_phy); in udc_plat_resume()
279 dev_err(udc->dev, "UDC phy init failure"); in udc_plat_resume()
283 ret = phy_power_on(udc->udc_phy); in udc_plat_resume()
285 dev_err(udc->dev, "UDC phy power on failure"); in udc_plat_resume()
286 phy_exit(udc->udc_phy); in udc_plat_resume()
290 if (extcon_get_state(udc->edev, EXTCON_USB) > 0) { in udc_plat_resume()
291 dev_dbg(udc->dev, "idle -> device\n"); in udc_plat_resume()
292 start_udc(udc); in udc_plat_resume()
304 { .compatible = "brcm,ns2-udc", },
305 { .compatible = "brcm,cygnus-udc", },
306 { .compatible = "brcm,iproc-udc", },
315 .name = "snps-udc-plat",