Lines Matching refs:bdc

65 static void srr_dqp_index_advc(struct bdc *bdc, u32 srr_num)  in srr_dqp_index_advc()  argument
69 srr = &bdc->srr; in srr_dqp_index_advc()
70 dev_dbg_ratelimited(bdc->dev, "srr->dqp_index:%d\n", srr->dqp_index); in srr_dqp_index_advc()
78 static void bdc_uspc_connected(struct bdc *bdc) in bdc_uspc_connected() argument
84 temp = bdc_readl(bdc->regs, BDC_USPC); in bdc_uspc_connected()
86 dev_dbg(bdc->dev, "%s speed=%x\n", __func__, speed); in bdc_uspc_connected()
91 bdc->gadget.ep0->maxpacket = EP0_MAX_PKT_SIZE; in bdc_uspc_connected()
92 bdc->gadget.speed = USB_SPEED_SUPER; in bdc_uspc_connected()
94 usppms = bdc_readl(bdc->regs, BDC_USPPMS); in bdc_uspc_connected()
98 bdc_writel(bdc->regs, BDC_USPPMS, usppms); in bdc_uspc_connected()
103 bdc->gadget.ep0->maxpacket = 64; in bdc_uspc_connected()
104 bdc->gadget.speed = USB_SPEED_HIGH; in bdc_uspc_connected()
109 bdc->gadget.ep0->maxpacket = 64; in bdc_uspc_connected()
110 bdc->gadget.speed = USB_SPEED_FULL; in bdc_uspc_connected()
115 bdc->gadget.ep0->maxpacket = 8; in bdc_uspc_connected()
116 bdc->gadget.speed = USB_SPEED_LOW; in bdc_uspc_connected()
119 dev_err(bdc->dev, "UNDEFINED SPEED\n"); in bdc_uspc_connected()
122 dev_dbg(bdc->dev, "connected at %s\n", conn_speed_str[speed]); in bdc_uspc_connected()
124 bdc->bdc_ep_array[1]->desc = &bdc_gadget_ep0_desc; in bdc_uspc_connected()
125 ret = bdc_config_ep(bdc, bdc->bdc_ep_array[1]); in bdc_uspc_connected()
127 dev_err(bdc->dev, "EP0 config failed\n"); in bdc_uspc_connected()
128 bdc->bdc_ep_array[1]->usb_ep.desc = &bdc_gadget_ep0_desc; in bdc_uspc_connected()
129 bdc->bdc_ep_array[1]->flags |= BDC_EP_ENABLED; in bdc_uspc_connected()
130 usb_gadget_set_state(&bdc->gadget, USB_STATE_DEFAULT); in bdc_uspc_connected()
134 static void bdc_uspc_disconnected(struct bdc *bdc, bool reinit) in bdc_uspc_disconnected() argument
138 dev_dbg(bdc->dev, "%s\n", __func__); in bdc_uspc_disconnected()
143 ep = bdc->bdc_ep_array[1]; in bdc_uspc_disconnected()
148 if (bdc->gadget_driver && bdc->gadget_driver->disconnect) { in bdc_uspc_disconnected()
149 spin_unlock(&bdc->lock); in bdc_uspc_disconnected()
150 bdc->gadget_driver->disconnect(&bdc->gadget); in bdc_uspc_disconnected()
151 spin_lock(&bdc->lock); in bdc_uspc_disconnected()
154 bdc->gadget.speed = USB_SPEED_UNKNOWN; in bdc_uspc_disconnected()
155 bdc->devstatus &= DEVSTATUS_CLEAR; in bdc_uspc_disconnected()
156 bdc->delayed_status = false; in bdc_uspc_disconnected()
157 bdc->reinit = reinit; in bdc_uspc_disconnected()
158 bdc->test_mode = false; in bdc_uspc_disconnected()
164 struct bdc *bdc = container_of(work, struct bdc, func_wake_notify.work); in bdc_func_wake_timer() local
167 dev_dbg(bdc->dev, "%s\n", __func__); in bdc_func_wake_timer()
168 spin_lock_irqsave(&bdc->lock, flags); in bdc_func_wake_timer()
173 if (bdc->devstatus & FUNC_WAKE_ISSUED) { in bdc_func_wake_timer()
174 dev_dbg(bdc->dev, "FUNC_WAKE_ISSUED FLAG IS STILL SET\n"); in bdc_func_wake_timer()
176 bdc_function_wake_fh(bdc, 0); in bdc_func_wake_timer()
177 schedule_delayed_work(&bdc->func_wake_notify, in bdc_func_wake_timer()
180 spin_unlock_irqrestore(&bdc->lock, flags); in bdc_func_wake_timer()
184 static void handle_link_state_change(struct bdc *bdc, u32 uspc) in handle_link_state_change() argument
188 dev_dbg(bdc->dev, "Link state change"); in handle_link_state_change()
192 if ((bdc->gadget.speed != USB_SPEED_UNKNOWN) && in handle_link_state_change()
193 bdc->gadget_driver->suspend) { in handle_link_state_change()
194 dev_dbg(bdc->dev, "Entered Suspend mode\n"); in handle_link_state_change()
195 spin_unlock(&bdc->lock); in handle_link_state_change()
196 bdc->devstatus |= DEVICE_SUSPENDED; in handle_link_state_change()
197 bdc->gadget_driver->suspend(&bdc->gadget); in handle_link_state_change()
198 spin_lock(&bdc->lock); in handle_link_state_change()
202 if (bdc->devstatus & REMOTE_WAKEUP_ISSUED) { in handle_link_state_change()
203 bdc->devstatus &= ~REMOTE_WAKEUP_ISSUED; in handle_link_state_change()
204 if (bdc->gadget.speed == USB_SPEED_SUPER) { in handle_link_state_change()
205 bdc_function_wake_fh(bdc, 0); in handle_link_state_change()
206 bdc->devstatus |= FUNC_WAKE_ISSUED; in handle_link_state_change()
215 &bdc->func_wake_notify, in handle_link_state_change()
217 dev_dbg(bdc->dev, "sched func_wake_notify\n"); in handle_link_state_change()
223 dev_dbg(bdc->dev, "Resumed from Suspend\n"); in handle_link_state_change()
224 if (bdc->devstatus & DEVICE_SUSPENDED) { in handle_link_state_change()
225 bdc->gadget_driver->resume(&bdc->gadget); in handle_link_state_change()
226 bdc->devstatus &= ~DEVICE_SUSPENDED; in handle_link_state_change()
230 dev_dbg(bdc->dev, "link state:%d\n", link_state); in handle_link_state_change()
235 void bdc_sr_uspc(struct bdc *bdc, struct bdc_sr *sreport) in bdc_sr_uspc() argument
242 uspc = bdc_readl(bdc->regs, BDC_USPC); in bdc_sr_uspc()
243 dev_dbg(bdc->dev, "%s uspc=0x%08x\n", __func__, uspc); in bdc_sr_uspc()
256 if (bdc->pullup) { in bdc_sr_uspc()
257 dev_dbg(bdc->dev, "Do a softconnect\n"); in bdc_sr_uspc()
259 bdc_softconn(bdc); in bdc_sr_uspc()
260 usb_gadget_set_state(&bdc->gadget, USB_STATE_POWERED); in bdc_sr_uspc()
265 dev_dbg(bdc->dev, "Port reset or disconn\n"); in bdc_sr_uspc()
266 bdc_uspc_disconnected(bdc, disconn); in bdc_sr_uspc()
270 handle_link_state_change(bdc, uspc); in bdc_sr_uspc()
281 dev_dbg(bdc->dev, "Connected\n"); in bdc_sr_uspc()
282 bdc_uspc_connected(bdc); in bdc_sr_uspc()
283 bdc->devstatus &= ~(DEVICE_SUSPENDED); in bdc_sr_uspc()
285 uspc = bdc_readl(bdc->regs, BDC_USPC); in bdc_sr_uspc()
287 dev_dbg(bdc->dev, "uspc=%x\n", uspc); in bdc_sr_uspc()
288 bdc_writel(bdc->regs, BDC_USPC, clear_flags); in bdc_sr_uspc()
296 struct bdc *bdc = _bdc; in bdc_udc_interrupt() local
300 spin_lock(&bdc->lock); in bdc_udc_interrupt()
301 status = bdc_readl(bdc->regs, BDC_BDCSC); in bdc_udc_interrupt()
303 spin_unlock(&bdc->lock); in bdc_udc_interrupt()
306 srr_int = bdc_readl(bdc->regs, BDC_SRRINT(0)); in bdc_udc_interrupt()
309 dev_warn(bdc->dev, "Global irq pending but SRR IP is 0\n"); in bdc_udc_interrupt()
310 spin_unlock(&bdc->lock); in bdc_udc_interrupt()
315 dev_dbg(bdc->dev, in bdc_udc_interrupt()
317 __func__, eqp_index, dqp_index, bdc->srr.dqp_index); in bdc_udc_interrupt()
321 dev_dbg(bdc->dev, "SRR empty?\n"); in bdc_udc_interrupt()
322 spin_unlock(&bdc->lock); in bdc_udc_interrupt()
326 while (bdc->srr.dqp_index != eqp_index) { in bdc_udc_interrupt()
327 sreport = &bdc->srr.sr_bds[bdc->srr.dqp_index]; in bdc_udc_interrupt()
331 dev_dbg_ratelimited(bdc->dev, "sr_type=%d\n", sr_type); in bdc_udc_interrupt()
334 bdc->sr_handler[0](bdc, sreport); in bdc_udc_interrupt()
338 bdc->sr_handler[1](bdc, sreport); in bdc_udc_interrupt()
341 dev_warn(bdc->dev, "SR:%d not handled\n", sr_type); in bdc_udc_interrupt()
344 srr_dqp_index_advc(bdc, 0); in bdc_udc_interrupt()
347 srr_int = bdc_readl(bdc->regs, BDC_SRRINT(0)); in bdc_udc_interrupt()
350 srr_int |= ((bdc->srr.dqp_index) << 16); in bdc_udc_interrupt()
352 bdc_writel(bdc->regs, BDC_SRRINT(0), srr_int); in bdc_udc_interrupt()
353 srr_int = bdc_readl(bdc->regs, BDC_SRRINT(0)); in bdc_udc_interrupt()
354 if (bdc->reinit) { in bdc_udc_interrupt()
355 ret = bdc_reinit(bdc); in bdc_udc_interrupt()
357 dev_err(bdc->dev, "err in bdc reinit\n"); in bdc_udc_interrupt()
360 spin_unlock(&bdc->lock); in bdc_udc_interrupt()
369 struct bdc *bdc = gadget_to_bdc(gadget); in bdc_udc_start() local
373 dev_dbg(bdc->dev, "%s()\n", __func__); in bdc_udc_start()
374 spin_lock_irqsave(&bdc->lock, flags); in bdc_udc_start()
375 if (bdc->gadget_driver) { in bdc_udc_start()
376 dev_err(bdc->dev, "%s is already bound to %s\n", in bdc_udc_start()
377 bdc->gadget.name, in bdc_udc_start()
378 bdc->gadget_driver->driver.name); in bdc_udc_start()
387 ret = bdc_run(bdc); in bdc_udc_start()
389 dev_err(bdc->dev, "%s bdc run fail\n", __func__); in bdc_udc_start()
392 bdc->gadget_driver = driver; in bdc_udc_start()
393 bdc->gadget.dev.driver = &driver->driver; in bdc_udc_start()
395 spin_unlock_irqrestore(&bdc->lock, flags); in bdc_udc_start()
402 struct bdc *bdc = gadget_to_bdc(gadget); in bdc_udc_stop() local
405 dev_dbg(bdc->dev, "%s()\n", __func__); in bdc_udc_stop()
406 spin_lock_irqsave(&bdc->lock, flags); in bdc_udc_stop()
407 bdc_stop(bdc); in bdc_udc_stop()
408 bdc->gadget_driver = NULL; in bdc_udc_stop()
409 bdc->gadget.dev.driver = NULL; in bdc_udc_stop()
410 spin_unlock_irqrestore(&bdc->lock, flags); in bdc_udc_stop()
417 struct bdc *bdc = gadget_to_bdc(gadget); in bdc_udc_pullup() local
421 dev_dbg(bdc->dev, "%s() is_on:%d\n", __func__, is_on); in bdc_udc_pullup()
425 spin_lock_irqsave(&bdc->lock, flags); in bdc_udc_pullup()
427 bdc_softdisconn(bdc); in bdc_udc_pullup()
428 bdc->pullup = false; in bdc_udc_pullup()
435 bdc->pullup = true; in bdc_udc_pullup()
441 uspc = bdc_readl(bdc->regs, BDC_USPC); in bdc_udc_pullup()
443 bdc_softconn(bdc); in bdc_udc_pullup()
445 spin_unlock_irqrestore(&bdc->lock, flags); in bdc_udc_pullup()
453 struct bdc *bdc = gadget_to_bdc(gadget); in bdc_udc_set_selfpowered() local
456 dev_dbg(bdc->dev, "%s()\n", __func__); in bdc_udc_set_selfpowered()
458 spin_lock_irqsave(&bdc->lock, flags); in bdc_udc_set_selfpowered()
460 bdc->devstatus |= 1 << USB_DEVICE_SELF_POWERED; in bdc_udc_set_selfpowered()
462 bdc->devstatus &= ~(1 << USB_DEVICE_SELF_POWERED); in bdc_udc_set_selfpowered()
464 spin_unlock_irqrestore(&bdc->lock, flags); in bdc_udc_set_selfpowered()
471 struct bdc *bdc = gadget_to_bdc(gadget); in bdc_udc_wakeup() local
477 dev_dbg(bdc->dev, in bdc_udc_wakeup()
479 __func__, bdc->devstatus); in bdc_udc_wakeup()
481 if (!(bdc->devstatus & REMOTE_WAKE_ENABLE)) in bdc_udc_wakeup()
484 spin_lock_irqsave(&bdc->lock, flags); in bdc_udc_wakeup()
485 uspc = bdc_readl(bdc->regs, BDC_USPC); in bdc_udc_wakeup()
487 dev_dbg(bdc->dev, "link_state =%d portsc=%x", link_state, uspc); in bdc_udc_wakeup()
489 dev_warn(bdc->dev, in bdc_udc_wakeup()
495 if (bdc->gadget.speed == USB_SPEED_SUPER) in bdc_udc_wakeup()
496 bdc->devstatus |= REMOTE_WAKEUP_ISSUED; in bdc_udc_wakeup()
502 bdc_writel(bdc->regs, BDC_USPC, uspc); in bdc_udc_wakeup()
503 uspc = bdc_readl(bdc->regs, BDC_USPC); in bdc_udc_wakeup()
505 dev_dbg(bdc->dev, "link_state =%d portsc=%x", link_state, uspc); in bdc_udc_wakeup()
507 spin_unlock_irqrestore(&bdc->lock, flags); in bdc_udc_wakeup()
521 int bdc_udc_init(struct bdc *bdc) in bdc_udc_init() argument
526 dev_dbg(bdc->dev, "%s()\n", __func__); in bdc_udc_init()
527 bdc->gadget.ops = &bdc_gadget_ops; in bdc_udc_init()
528 bdc->gadget.max_speed = USB_SPEED_SUPER; in bdc_udc_init()
529 bdc->gadget.speed = USB_SPEED_UNKNOWN; in bdc_udc_init()
530 bdc->gadget.dev.parent = bdc->dev; in bdc_udc_init()
532 bdc->gadget.sg_supported = false; in bdc_udc_init()
535 bdc->gadget.name = BRCM_BDC_NAME; in bdc_udc_init()
536 ret = devm_request_irq(bdc->dev, bdc->irq, bdc_udc_interrupt, in bdc_udc_init()
537 IRQF_SHARED , BRCM_BDC_NAME, bdc); in bdc_udc_init()
539 dev_err(bdc->dev, in bdc_udc_init()
541 bdc->irq, ret); in bdc_udc_init()
545 ret = bdc_init_ep(bdc); in bdc_udc_init()
547 dev_err(bdc->dev, "bdc init ep fail: %d\n", ret); in bdc_udc_init()
551 ret = usb_add_gadget_udc(bdc->dev, &bdc->gadget); in bdc_udc_init()
553 dev_err(bdc->dev, "failed to register udc\n"); in bdc_udc_init()
556 usb_gadget_set_state(&bdc->gadget, USB_STATE_NOTATTACHED); in bdc_udc_init()
557 bdc->bdc_ep_array[1]->desc = &bdc_gadget_ep0_desc; in bdc_udc_init()
562 ret = bdc_ep_enable(bdc->bdc_ep_array[1]); in bdc_udc_init()
564 dev_err(bdc->dev, "fail to enable %s\n", in bdc_udc_init()
565 bdc->bdc_ep_array[1]->name); in bdc_udc_init()
568 INIT_DELAYED_WORK(&bdc->func_wake_notify, bdc_func_wake_timer); in bdc_udc_init()
570 temp = bdc_readl(bdc->regs, BDC_BDCSC); in bdc_udc_init()
572 bdc_writel(bdc->regs, BDC_BDCSC, temp); in bdc_udc_init()
575 usb_del_gadget_udc(&bdc->gadget); in bdc_udc_init()
577 bdc_free_ep(bdc); in bdc_udc_init()
582 void bdc_udc_exit(struct bdc *bdc) in bdc_udc_exit() argument
584 dev_dbg(bdc->dev, "%s()\n", __func__); in bdc_udc_exit()
585 bdc_ep_disable(bdc->bdc_ep_array[1]); in bdc_udc_exit()
586 usb_del_gadget_udc(&bdc->gadget); in bdc_udc_exit()
587 bdc_free_ep(bdc); in bdc_udc_exit()