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()
116 udc->virt_addr = devm_ioremap_resource(dev, res); in udc_plat_probe()
117 if (IS_ERR(udc->regs)) in udc_plat_probe()
118 return PTR_ERR(udc->regs); in udc_plat_probe()
120 /* udc csr registers base */ in udc_plat_probe()
121 udc->csr = udc->virt_addr + UDC_CSR_ADDR; in udc_plat_probe()
124 udc->regs = udc->virt_addr + UDC_DEVCFG_ADDR; in udc_plat_probe()
127 udc->ep_regs = udc->virt_addr + UDC_EPREGS_ADDR; in udc_plat_probe()
130 udc->rxfifo = (u32 __iomem *)(udc->virt_addr + UDC_RXFIFO_ADDR); in udc_plat_probe()
131 udc->txfifo = (u32 __iomem *)(udc->virt_addr + UDC_TXFIFO_ADDR); in udc_plat_probe()
133 udc->phys_addr = (unsigned long)res->start; in udc_plat_probe()
135 udc->irq = irq_of_parse_and_map(dev->of_node, 0); in udc_plat_probe()
136 if (udc->irq <= 0) { in udc_plat_probe()
141 udc->udc_phy = devm_of_phy_get_by_index(dev, dev->of_node, 0); in udc_plat_probe()
142 if (IS_ERR(udc->udc_phy)) { in udc_plat_probe()
144 return PTR_ERR(udc->udc_phy); in udc_plat_probe()
147 ret = phy_init(udc->udc_phy); in udc_plat_probe()
149 dev_err(dev, "UDC phy init failed"); in udc_plat_probe()
153 ret = phy_power_on(udc->udc_phy); in udc_plat_probe()
155 dev_err(dev, "UDC phy power on failed"); in udc_plat_probe()
156 phy_exit(udc->udc_phy); in udc_plat_probe()
162 udc->edev = extcon_get_edev_by_phandle(dev, 0); in udc_plat_probe()
163 if (IS_ERR(udc->edev)) { in udc_plat_probe()
164 if (PTR_ERR(udc->edev) == -EPROBE_DEFER) in udc_plat_probe()
167 ret = PTR_ERR(udc->edev); in udc_plat_probe()
171 udc->nb.notifier_call = usbd_connect_notify; in udc_plat_probe()
172 ret = extcon_register_notifier(udc->edev, EXTCON_USB, in udc_plat_probe()
173 &udc->nb); in udc_plat_probe()
179 ret = extcon_get_state(udc->edev, EXTCON_USB); in udc_plat_probe()
184 udc->conn_type = ret; in udc_plat_probe()
186 INIT_DELAYED_WORK(&udc->drd_work, udc_drd_work); in udc_plat_probe()
191 ret = init_dma_pools(udc); in udc_plat_probe()
196 ret = devm_request_irq(dev, udc->irq, udc_irq, IRQF_SHARED, in udc_plat_probe()
197 "snps-udc", udc); in udc_plat_probe()
199 dev_err(dev, "Request irq %d failed for UDC\n", udc->irq); in udc_plat_probe()
203 platform_set_drvdata(pdev, udc); in udc_plat_probe()
204 udc->chiprev = UDC_BCM_REV; in udc_plat_probe()
206 if (udc_probe(udc)) { in udc_plat_probe()
210 dev_info(dev, "Synopsys UDC platform driver probe successful\n"); in udc_plat_probe()
216 free_dma_pools(udc); in udc_plat_probe()
218 if (udc->edev) in udc_plat_probe()
219 extcon_unregister_notifier(udc->edev, EXTCON_USB, &udc->nb); in udc_plat_probe()
221 if (udc->udc_phy) { in udc_plat_probe()
222 phy_power_off(udc->udc_phy); in udc_plat_probe()
223 phy_exit(udc->udc_phy); in udc_plat_probe()
230 struct udc *dev; in udc_plat_remove()
255 dev_info(&pdev->dev, "Synopsys UDC platform driver removed\n"); in udc_plat_remove()
263 struct udc *udc; in udc_plat_suspend() local
265 udc = dev_get_drvdata(dev); in udc_plat_suspend()
266 stop_udc(udc); in udc_plat_suspend()
268 if (extcon_get_state(udc->edev, EXTCON_USB) > 0) { in udc_plat_suspend()
269 dev_dbg(udc->dev, "device -> idle\n"); in udc_plat_suspend()
270 stop_udc(udc); in udc_plat_suspend()
272 phy_power_off(udc->udc_phy); in udc_plat_suspend()
273 phy_exit(udc->udc_phy); in udc_plat_suspend()
280 struct udc *udc; in udc_plat_resume() local
283 udc = dev_get_drvdata(dev); in udc_plat_resume()
285 ret = phy_init(udc->udc_phy); in udc_plat_resume()
287 dev_err(udc->dev, "UDC phy init failure"); in udc_plat_resume()
291 ret = phy_power_on(udc->udc_phy); in udc_plat_resume()
293 dev_err(udc->dev, "UDC phy power on failure"); in udc_plat_resume()
294 phy_exit(udc->udc_phy); in udc_plat_resume()
298 if (extcon_get_state(udc->edev, EXTCON_USB) > 0) { in udc_plat_resume()
299 dev_dbg(udc->dev, "idle -> device\n"); in udc_plat_resume()
300 start_udc(udc); in udc_plat_resume()
313 { .compatible = "brcm,ns2-udc", },
314 { .compatible = "brcm,cygnus-udc", },
315 { .compatible = "brcm,iproc-udc", },
325 .name = "snps-udc-plat",