Lines Matching refs:bdc
60 static void srr_dqp_index_advc(struct bdc *bdc, u32 srr_num) in srr_dqp_index_advc() argument
64 srr = &bdc->srr; in srr_dqp_index_advc()
65 dev_dbg_ratelimited(bdc->dev, "srr->dqp_index:%d\n", srr->dqp_index); in srr_dqp_index_advc()
73 static void bdc_uspc_connected(struct bdc *bdc) in bdc_uspc_connected() argument
79 temp = bdc_readl(bdc->regs, BDC_USPC); in bdc_uspc_connected()
81 dev_dbg(bdc->dev, "%s speed=%x\n", __func__, speed); in bdc_uspc_connected()
86 bdc->gadget.ep0->maxpacket = EP0_MAX_PKT_SIZE; in bdc_uspc_connected()
87 bdc->gadget.speed = USB_SPEED_SUPER; in bdc_uspc_connected()
89 usppms = bdc_readl(bdc->regs, BDC_USPPMS); in bdc_uspc_connected()
93 bdc_writel(bdc->regs, BDC_USPPMS, usppms); in bdc_uspc_connected()
98 bdc->gadget.ep0->maxpacket = 64; in bdc_uspc_connected()
99 bdc->gadget.speed = USB_SPEED_HIGH; in bdc_uspc_connected()
104 bdc->gadget.ep0->maxpacket = 64; in bdc_uspc_connected()
105 bdc->gadget.speed = USB_SPEED_FULL; in bdc_uspc_connected()
110 bdc->gadget.ep0->maxpacket = 8; in bdc_uspc_connected()
111 bdc->gadget.speed = USB_SPEED_LOW; in bdc_uspc_connected()
114 dev_err(bdc->dev, "UNDEFINED SPEED\n"); in bdc_uspc_connected()
117 dev_dbg(bdc->dev, "connected at %s\n", conn_speed_str[speed]); in bdc_uspc_connected()
119 bdc->bdc_ep_array[1]->desc = &bdc_gadget_ep0_desc; in bdc_uspc_connected()
120 ret = bdc_config_ep(bdc, bdc->bdc_ep_array[1]); in bdc_uspc_connected()
122 dev_err(bdc->dev, "EP0 config failed\n"); in bdc_uspc_connected()
123 bdc->bdc_ep_array[1]->usb_ep.desc = &bdc_gadget_ep0_desc; in bdc_uspc_connected()
124 bdc->bdc_ep_array[1]->flags |= BDC_EP_ENABLED; in bdc_uspc_connected()
125 usb_gadget_set_state(&bdc->gadget, USB_STATE_DEFAULT); in bdc_uspc_connected()
129 static void bdc_uspc_disconnected(struct bdc *bdc, bool reinit) in bdc_uspc_disconnected() argument
133 dev_dbg(bdc->dev, "%s\n", __func__); in bdc_uspc_disconnected()
138 ep = bdc->bdc_ep_array[1]; in bdc_uspc_disconnected()
143 if (bdc->gadget_driver && bdc->gadget_driver->disconnect) { in bdc_uspc_disconnected()
144 spin_unlock(&bdc->lock); in bdc_uspc_disconnected()
145 bdc->gadget_driver->disconnect(&bdc->gadget); in bdc_uspc_disconnected()
146 spin_lock(&bdc->lock); in bdc_uspc_disconnected()
149 bdc->gadget.speed = USB_SPEED_UNKNOWN; in bdc_uspc_disconnected()
150 bdc->devstatus &= DEVSTATUS_CLEAR; in bdc_uspc_disconnected()
151 bdc->delayed_status = false; in bdc_uspc_disconnected()
152 bdc->reinit = reinit; in bdc_uspc_disconnected()
153 bdc->test_mode = false; in bdc_uspc_disconnected()
154 usb_gadget_set_state(&bdc->gadget, USB_STATE_NOTATTACHED); in bdc_uspc_disconnected()
160 struct bdc *bdc = container_of(work, struct bdc, func_wake_notify.work); in bdc_func_wake_timer() local
163 dev_dbg(bdc->dev, "%s\n", __func__); in bdc_func_wake_timer()
164 spin_lock_irqsave(&bdc->lock, flags); in bdc_func_wake_timer()
169 if (bdc->devstatus & FUNC_WAKE_ISSUED) { in bdc_func_wake_timer()
170 dev_dbg(bdc->dev, "FUNC_WAKE_ISSUED FLAG IS STILL SET\n"); in bdc_func_wake_timer()
172 bdc_function_wake_fh(bdc, 0); in bdc_func_wake_timer()
173 schedule_delayed_work(&bdc->func_wake_notify, in bdc_func_wake_timer()
176 spin_unlock_irqrestore(&bdc->lock, flags); in bdc_func_wake_timer()
180 static void handle_link_state_change(struct bdc *bdc, u32 uspc) in handle_link_state_change() argument
184 dev_dbg(bdc->dev, "Link state change"); in handle_link_state_change()
188 if ((bdc->gadget.speed != USB_SPEED_UNKNOWN) && in handle_link_state_change()
189 bdc->gadget_driver->suspend) { in handle_link_state_change()
190 dev_dbg(bdc->dev, "Entered Suspend mode\n"); in handle_link_state_change()
191 spin_unlock(&bdc->lock); in handle_link_state_change()
192 bdc->devstatus |= DEVICE_SUSPENDED; in handle_link_state_change()
193 bdc->gadget_driver->suspend(&bdc->gadget); in handle_link_state_change()
194 spin_lock(&bdc->lock); in handle_link_state_change()
198 if (bdc->devstatus & REMOTE_WAKEUP_ISSUED) { in handle_link_state_change()
199 bdc->devstatus &= ~REMOTE_WAKEUP_ISSUED; in handle_link_state_change()
200 if (bdc->gadget.speed == USB_SPEED_SUPER) { in handle_link_state_change()
201 bdc_function_wake_fh(bdc, 0); in handle_link_state_change()
202 bdc->devstatus |= FUNC_WAKE_ISSUED; in handle_link_state_change()
211 &bdc->func_wake_notify, in handle_link_state_change()
213 dev_dbg(bdc->dev, "sched func_wake_notify\n"); in handle_link_state_change()
219 dev_dbg(bdc->dev, "Resumed from Suspend\n"); in handle_link_state_change()
220 if (bdc->devstatus & DEVICE_SUSPENDED) { in handle_link_state_change()
221 bdc->gadget_driver->resume(&bdc->gadget); in handle_link_state_change()
222 bdc->devstatus &= ~DEVICE_SUSPENDED; in handle_link_state_change()
226 dev_dbg(bdc->dev, "link state:%d\n", link_state); in handle_link_state_change()
231 void bdc_sr_uspc(struct bdc *bdc, struct bdc_sr *sreport) in bdc_sr_uspc() argument
238 uspc = bdc_readl(bdc->regs, BDC_USPC); in bdc_sr_uspc()
239 dev_dbg(bdc->dev, "%s uspc=0x%08x\n", __func__, uspc); in bdc_sr_uspc()
253 if (bdc->pullup) { in bdc_sr_uspc()
254 dev_dbg(bdc->dev, "Do a softconnect\n"); in bdc_sr_uspc()
256 bdc_softconn(bdc); in bdc_sr_uspc()
257 usb_gadget_set_state(&bdc->gadget, USB_STATE_POWERED); in bdc_sr_uspc()
262 dev_dbg(bdc->dev, "Port reset or disconn\n"); in bdc_sr_uspc()
263 bdc_uspc_disconnected(bdc, disconn); in bdc_sr_uspc()
267 handle_link_state_change(bdc, uspc); in bdc_sr_uspc()
278 dev_dbg(bdc->dev, "Connected\n"); in bdc_sr_uspc()
279 bdc_uspc_connected(bdc); in bdc_sr_uspc()
280 bdc->devstatus &= ~(DEVICE_SUSPENDED); in bdc_sr_uspc()
282 uspc = bdc_readl(bdc->regs, BDC_USPC); in bdc_sr_uspc()
284 dev_dbg(bdc->dev, "uspc=%x\n", uspc); in bdc_sr_uspc()
285 bdc_writel(bdc->regs, BDC_USPC, clear_flags); in bdc_sr_uspc()
293 struct bdc *bdc = _bdc; in bdc_udc_interrupt() local
297 spin_lock(&bdc->lock); in bdc_udc_interrupt()
298 status = bdc_readl(bdc->regs, BDC_BDCSC); in bdc_udc_interrupt()
300 spin_unlock(&bdc->lock); in bdc_udc_interrupt()
303 srr_int = bdc_readl(bdc->regs, BDC_SRRINT(0)); in bdc_udc_interrupt()
306 dev_warn(bdc->dev, "Global irq pending but SRR IP is 0\n"); in bdc_udc_interrupt()
307 spin_unlock(&bdc->lock); in bdc_udc_interrupt()
312 dev_dbg(bdc->dev, in bdc_udc_interrupt()
314 __func__, eqp_index, dqp_index, bdc->srr.dqp_index); in bdc_udc_interrupt()
318 dev_dbg(bdc->dev, "SRR empty?\n"); in bdc_udc_interrupt()
319 spin_unlock(&bdc->lock); in bdc_udc_interrupt()
323 while (bdc->srr.dqp_index != eqp_index) { in bdc_udc_interrupt()
324 sreport = &bdc->srr.sr_bds[bdc->srr.dqp_index]; in bdc_udc_interrupt()
328 dev_dbg_ratelimited(bdc->dev, "sr_type=%d\n", sr_type); in bdc_udc_interrupt()
331 bdc->sr_handler[0](bdc, sreport); in bdc_udc_interrupt()
335 bdc->sr_handler[1](bdc, sreport); in bdc_udc_interrupt()
338 dev_warn(bdc->dev, "SR:%d not handled\n", sr_type); in bdc_udc_interrupt()
341 srr_dqp_index_advc(bdc, 0); in bdc_udc_interrupt()
344 srr_int = bdc_readl(bdc->regs, BDC_SRRINT(0)); in bdc_udc_interrupt()
347 srr_int |= ((bdc->srr.dqp_index) << 16); in bdc_udc_interrupt()
349 bdc_writel(bdc->regs, BDC_SRRINT(0), srr_int); in bdc_udc_interrupt()
350 srr_int = bdc_readl(bdc->regs, BDC_SRRINT(0)); in bdc_udc_interrupt()
351 if (bdc->reinit) { in bdc_udc_interrupt()
352 ret = bdc_reinit(bdc); in bdc_udc_interrupt()
354 dev_err(bdc->dev, "err in bdc reinit\n"); in bdc_udc_interrupt()
357 spin_unlock(&bdc->lock); in bdc_udc_interrupt()
366 struct bdc *bdc = gadget_to_bdc(gadget); in bdc_udc_start() local
370 dev_dbg(bdc->dev, "%s()\n", __func__); in bdc_udc_start()
371 spin_lock_irqsave(&bdc->lock, flags); in bdc_udc_start()
372 if (bdc->gadget_driver) { in bdc_udc_start()
373 dev_err(bdc->dev, "%s is already bound to %s\n", in bdc_udc_start()
374 bdc->gadget.name, in bdc_udc_start()
375 bdc->gadget_driver->driver.name); in bdc_udc_start()
384 ret = bdc_run(bdc); in bdc_udc_start()
386 dev_err(bdc->dev, "%s bdc run fail\n", __func__); in bdc_udc_start()
389 bdc->gadget_driver = driver; in bdc_udc_start()
390 bdc->gadget.dev.driver = &driver->driver; in bdc_udc_start()
392 spin_unlock_irqrestore(&bdc->lock, flags); in bdc_udc_start()
399 struct bdc *bdc = gadget_to_bdc(gadget); in bdc_udc_stop() local
402 dev_dbg(bdc->dev, "%s()\n", __func__); in bdc_udc_stop()
403 spin_lock_irqsave(&bdc->lock, flags); in bdc_udc_stop()
404 bdc_stop(bdc); in bdc_udc_stop()
405 bdc->gadget_driver = NULL; in bdc_udc_stop()
406 bdc->gadget.dev.driver = NULL; in bdc_udc_stop()
407 spin_unlock_irqrestore(&bdc->lock, flags); in bdc_udc_stop()
414 struct bdc *bdc = gadget_to_bdc(gadget); in bdc_udc_pullup() local
418 dev_dbg(bdc->dev, "%s() is_on:%d\n", __func__, is_on); in bdc_udc_pullup()
422 spin_lock_irqsave(&bdc->lock, flags); in bdc_udc_pullup()
424 bdc_softdisconn(bdc); in bdc_udc_pullup()
425 bdc->pullup = false; in bdc_udc_pullup()
432 bdc->pullup = true; in bdc_udc_pullup()
438 uspc = bdc_readl(bdc->regs, BDC_USPC); in bdc_udc_pullup()
440 bdc_softconn(bdc); in bdc_udc_pullup()
442 spin_unlock_irqrestore(&bdc->lock, flags); in bdc_udc_pullup()
450 struct bdc *bdc = gadget_to_bdc(gadget); in bdc_udc_set_selfpowered() local
453 dev_dbg(bdc->dev, "%s()\n", __func__); in bdc_udc_set_selfpowered()
455 spin_lock_irqsave(&bdc->lock, flags); in bdc_udc_set_selfpowered()
457 bdc->devstatus |= 1 << USB_DEVICE_SELF_POWERED; in bdc_udc_set_selfpowered()
459 bdc->devstatus &= ~(1 << USB_DEVICE_SELF_POWERED); in bdc_udc_set_selfpowered()
461 spin_unlock_irqrestore(&bdc->lock, flags); in bdc_udc_set_selfpowered()
468 struct bdc *bdc = gadget_to_bdc(gadget); in bdc_udc_wakeup() local
474 dev_dbg(bdc->dev, in bdc_udc_wakeup()
476 __func__, bdc->devstatus); in bdc_udc_wakeup()
478 if (!(bdc->devstatus & REMOTE_WAKE_ENABLE)) in bdc_udc_wakeup()
481 spin_lock_irqsave(&bdc->lock, flags); in bdc_udc_wakeup()
482 uspc = bdc_readl(bdc->regs, BDC_USPC); in bdc_udc_wakeup()
484 dev_dbg(bdc->dev, "link_state =%d portsc=%x", link_state, uspc); in bdc_udc_wakeup()
486 dev_warn(bdc->dev, in bdc_udc_wakeup()
492 if (bdc->gadget.speed == USB_SPEED_SUPER) in bdc_udc_wakeup()
493 bdc->devstatus |= REMOTE_WAKEUP_ISSUED; in bdc_udc_wakeup()
499 bdc_writel(bdc->regs, BDC_USPC, uspc); in bdc_udc_wakeup()
500 uspc = bdc_readl(bdc->regs, BDC_USPC); in bdc_udc_wakeup()
502 dev_dbg(bdc->dev, "link_state =%d portsc=%x", link_state, uspc); in bdc_udc_wakeup()
504 spin_unlock_irqrestore(&bdc->lock, flags); in bdc_udc_wakeup()
518 int bdc_udc_init(struct bdc *bdc) in bdc_udc_init() argument
523 dev_dbg(bdc->dev, "%s()\n", __func__); in bdc_udc_init()
524 bdc->gadget.ops = &bdc_gadget_ops; in bdc_udc_init()
525 bdc->gadget.max_speed = USB_SPEED_SUPER; in bdc_udc_init()
526 bdc->gadget.speed = USB_SPEED_UNKNOWN; in bdc_udc_init()
527 bdc->gadget.dev.parent = bdc->dev; in bdc_udc_init()
529 bdc->gadget.sg_supported = false; in bdc_udc_init()
532 bdc->gadget.name = BRCM_BDC_NAME; in bdc_udc_init()
533 ret = devm_request_irq(bdc->dev, bdc->irq, bdc_udc_interrupt, in bdc_udc_init()
534 IRQF_SHARED, BRCM_BDC_NAME, bdc); in bdc_udc_init()
536 dev_err(bdc->dev, in bdc_udc_init()
538 bdc->irq, ret); in bdc_udc_init()
542 ret = bdc_init_ep(bdc); in bdc_udc_init()
544 dev_err(bdc->dev, "bdc init ep fail: %d\n", ret); in bdc_udc_init()
548 ret = usb_add_gadget_udc(bdc->dev, &bdc->gadget); in bdc_udc_init()
550 dev_err(bdc->dev, "failed to register udc\n"); in bdc_udc_init()
553 usb_gadget_set_state(&bdc->gadget, USB_STATE_NOTATTACHED); in bdc_udc_init()
554 bdc->bdc_ep_array[1]->desc = &bdc_gadget_ep0_desc; in bdc_udc_init()
559 ret = bdc_ep_enable(bdc->bdc_ep_array[1]); in bdc_udc_init()
561 dev_err(bdc->dev, "fail to enable %s\n", in bdc_udc_init()
562 bdc->bdc_ep_array[1]->name); in bdc_udc_init()
565 INIT_DELAYED_WORK(&bdc->func_wake_notify, bdc_func_wake_timer); in bdc_udc_init()
567 temp = bdc_readl(bdc->regs, BDC_BDCSC); in bdc_udc_init()
569 bdc_writel(bdc->regs, BDC_BDCSC, temp); in bdc_udc_init()
572 usb_del_gadget_udc(&bdc->gadget); in bdc_udc_init()
574 bdc_free_ep(bdc); in bdc_udc_init()
579 void bdc_udc_exit(struct bdc *bdc) in bdc_udc_exit() argument
583 dev_dbg(bdc->dev, "%s()\n", __func__); in bdc_udc_exit()
584 spin_lock_irqsave(&bdc->lock, flags); in bdc_udc_exit()
585 bdc_ep_disable(bdc->bdc_ep_array[1]); in bdc_udc_exit()
586 spin_unlock_irqrestore(&bdc->lock, flags); in bdc_udc_exit()
588 usb_del_gadget_udc(&bdc->gadget); in bdc_udc_exit()
589 bdc_free_ep(bdc); in bdc_udc_exit()