Lines Matching refs:hsotg
65 static void dwc2_qh_init(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh, in dwc2_qh_init() argument
71 dev_vdbg(hsotg->dev, "%s()\n", __func__); in dwc2_qh_init()
83 dev_speed = dwc2_host_get_speed(hsotg, urb->priv); in dwc2_qh_init()
85 dwc2_host_hub_info(hsotg, urb->priv, &hub_addr, &hub_port); in dwc2_qh_init()
89 dev_vdbg(hsotg->dev, in dwc2_qh_init()
111 hsotg->frame_number = dwc2_hcd_get_frame_number(hsotg); in dwc2_qh_init()
113 qh->sched_frame = dwc2_frame_num_inc(hsotg->frame_number, in dwc2_qh_init()
121 hprt = dwc2_readl(hsotg->regs + HPRT0); in dwc2_qh_init()
130 dev_dbg(hsotg->dev, "interval=%d\n", qh->interval); in dwc2_qh_init()
133 dev_vdbg(hsotg->dev, "DWC OTG HCD QH Initialized\n"); in dwc2_qh_init()
134 dev_vdbg(hsotg->dev, "DWC OTG HCD QH - qh = %p\n", qh); in dwc2_qh_init()
135 dev_vdbg(hsotg->dev, "DWC OTG HCD QH - Device Address = %d\n", in dwc2_qh_init()
137 dev_vdbg(hsotg->dev, "DWC OTG HCD QH - Endpoint %d, %s\n", in dwc2_qh_init()
157 dev_vdbg(hsotg->dev, "DWC OTG HCD QH - Speed = %s\n", speed); in dwc2_qh_init()
177 dev_vdbg(hsotg->dev, "DWC OTG HCD QH - Type = %s\n", type); in dwc2_qh_init()
180 dev_vdbg(hsotg->dev, "DWC OTG HCD QH - usecs = %d\n", in dwc2_qh_init()
182 dev_vdbg(hsotg->dev, "DWC OTG HCD QH - interval = %d\n", in dwc2_qh_init()
197 struct dwc2_qh *dwc2_hcd_qh_create(struct dwc2_hsotg *hsotg, in dwc2_hcd_qh_create() argument
211 dwc2_qh_init(hsotg, qh, urb); in dwc2_hcd_qh_create()
213 if (hsotg->core_params->dma_desc_enable > 0 && in dwc2_hcd_qh_create()
214 dwc2_hcd_qh_init_ddma(hsotg, qh, mem_flags) < 0) { in dwc2_hcd_qh_create()
215 dwc2_hcd_qh_free(hsotg, qh); in dwc2_hcd_qh_create()
233 void dwc2_hcd_qh_free(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_hcd_qh_free() argument
235 if (hsotg->core_params->dma_desc_enable > 0) { in dwc2_hcd_qh_free()
236 dwc2_hcd_qh_free_ddma(hsotg, qh); in dwc2_hcd_qh_free()
253 static int dwc2_periodic_channel_available(struct dwc2_hsotg *hsotg) in dwc2_periodic_channel_available() argument
263 num_channels = hsotg->core_params->host_channels; in dwc2_periodic_channel_available()
264 if (hsotg->periodic_channels + hsotg->non_periodic_channels < in dwc2_periodic_channel_available()
266 && hsotg->periodic_channels < num_channels - 1) { in dwc2_periodic_channel_available()
269 dev_dbg(hsotg->dev, in dwc2_periodic_channel_available()
272 hsotg->periodic_channels, hsotg->non_periodic_channels); in dwc2_periodic_channel_available()
291 static int dwc2_check_periodic_bandwidth(struct dwc2_hsotg *hsotg, in dwc2_check_periodic_bandwidth() argument
313 if (hsotg->periodic_usecs > max_claimed_usecs) { in dwc2_check_periodic_bandwidth()
314 dev_err(hsotg->dev, in dwc2_check_periodic_bandwidth()
316 __func__, hsotg->periodic_usecs, qh->usecs); in dwc2_check_periodic_bandwidth()
333 void dwc2_hcd_init_usecs(struct dwc2_hsotg *hsotg) in dwc2_hcd_init_usecs() argument
338 hsotg->frame_usecs[i] = max_uframe_usecs[i]; in dwc2_hcd_init_usecs()
341 static int dwc2_find_single_uframe(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_find_single_uframe() argument
348 if (utime <= hsotg->frame_usecs[i]) { in dwc2_find_single_uframe()
349 hsotg->frame_usecs[i] -= utime; in dwc2_find_single_uframe()
360 static int dwc2_find_multi_uframe(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_find_multi_uframe() argument
370 if (hsotg->frame_usecs[i] <= 0) in dwc2_find_multi_uframe()
377 xtime = hsotg->frame_usecs[i]; in dwc2_find_multi_uframe()
383 if (xtime + hsotg->frame_usecs[j] < utime) { in dwc2_find_multi_uframe()
384 if (hsotg->frame_usecs[j] < in dwc2_find_multi_uframe()
391 t_left -= hsotg->frame_usecs[k]; in dwc2_find_multi_uframe()
394 hsotg->frame_usecs[k] in dwc2_find_multi_uframe()
396 hsotg->frame_usecs[k] = -t_left; in dwc2_find_multi_uframe()
400 hsotg->frame_usecs[k]; in dwc2_find_multi_uframe()
401 hsotg->frame_usecs[k] = 0; in dwc2_find_multi_uframe()
406 xtime += hsotg->frame_usecs[j]; in dwc2_find_multi_uframe()
409 hsotg->frame_usecs[j] == max_uframe_usecs[j]) in dwc2_find_multi_uframe()
416 static int dwc2_find_uframe(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_find_uframe() argument
422 ret = dwc2_find_single_uframe(hsotg, qh); in dwc2_find_uframe()
428 ret = dwc2_find_multi_uframe(hsotg, qh); in dwc2_find_uframe()
443 static int dwc2_check_max_xfer_size(struct dwc2_hsotg *hsotg, in dwc2_check_max_xfer_size() argument
451 max_channel_xfer_size = hsotg->core_params->max_transfer_size; in dwc2_check_max_xfer_size()
454 dev_err(hsotg->dev, in dwc2_check_max_xfer_size()
473 static int dwc2_schedule_periodic(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_schedule_periodic() argument
477 if (hsotg->core_params->uframe_sched > 0) { in dwc2_schedule_periodic()
480 status = dwc2_find_uframe(hsotg, qh); in dwc2_schedule_periodic()
495 status = dwc2_periodic_channel_available(hsotg); in dwc2_schedule_periodic()
497 dev_info(hsotg->dev, in dwc2_schedule_periodic()
503 status = dwc2_check_periodic_bandwidth(hsotg, qh); in dwc2_schedule_periodic()
507 dev_dbg(hsotg->dev, in dwc2_schedule_periodic()
513 status = dwc2_check_max_xfer_size(hsotg, qh); in dwc2_schedule_periodic()
515 dev_dbg(hsotg->dev, in dwc2_schedule_periodic()
521 if (hsotg->core_params->dma_desc_enable > 0) in dwc2_schedule_periodic()
523 list_add_tail(&qh->qh_list_entry, &hsotg->periodic_sched_ready); in dwc2_schedule_periodic()
527 &hsotg->periodic_sched_inactive); in dwc2_schedule_periodic()
529 if (hsotg->core_params->uframe_sched <= 0) in dwc2_schedule_periodic()
531 hsotg->periodic_channels++; in dwc2_schedule_periodic()
534 hsotg->periodic_usecs += qh->usecs; in dwc2_schedule_periodic()
546 static void dwc2_deschedule_periodic(struct dwc2_hsotg *hsotg, in dwc2_deschedule_periodic() argument
554 hsotg->periodic_usecs -= qh->usecs; in dwc2_deschedule_periodic()
556 if (hsotg->core_params->uframe_sched > 0) { in dwc2_deschedule_periodic()
558 hsotg->frame_usecs[i] += qh->frame_usecs[i]; in dwc2_deschedule_periodic()
563 hsotg->periodic_channels--; in dwc2_deschedule_periodic()
577 int dwc2_hcd_qh_add(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_hcd_qh_add() argument
583 dev_vdbg(hsotg->dev, "%s()\n", __func__); in dwc2_hcd_qh_add()
589 if (!dwc2_frame_num_le(qh->sched_frame, hsotg->frame_number) && in dwc2_hcd_qh_add()
590 !hsotg->frame_number) { in dwc2_hcd_qh_add()
591 dev_dbg(hsotg->dev, in dwc2_hcd_qh_add()
593 qh->sched_frame = dwc2_frame_num_inc(hsotg->frame_number, in dwc2_hcd_qh_add()
601 &hsotg->non_periodic_sched_inactive); in dwc2_hcd_qh_add()
605 status = dwc2_schedule_periodic(hsotg, qh); in dwc2_hcd_qh_add()
608 if (!hsotg->periodic_qh_count) { in dwc2_hcd_qh_add()
609 intr_mask = dwc2_readl(hsotg->regs + GINTMSK); in dwc2_hcd_qh_add()
611 dwc2_writel(intr_mask, hsotg->regs + GINTMSK); in dwc2_hcd_qh_add()
613 hsotg->periodic_qh_count++; in dwc2_hcd_qh_add()
625 void dwc2_hcd_qh_unlink(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_hcd_qh_unlink() argument
629 dev_vdbg(hsotg->dev, "%s()\n", __func__); in dwc2_hcd_qh_unlink()
636 if (hsotg->non_periodic_qh_ptr == &qh->qh_list_entry) in dwc2_hcd_qh_unlink()
637 hsotg->non_periodic_qh_ptr = in dwc2_hcd_qh_unlink()
638 hsotg->non_periodic_qh_ptr->next; in dwc2_hcd_qh_unlink()
643 dwc2_deschedule_periodic(hsotg, qh); in dwc2_hcd_qh_unlink()
644 hsotg->periodic_qh_count--; in dwc2_hcd_qh_unlink()
645 if (!hsotg->periodic_qh_count) { in dwc2_hcd_qh_unlink()
646 intr_mask = dwc2_readl(hsotg->regs + GINTMSK); in dwc2_hcd_qh_unlink()
648 dwc2_writel(intr_mask, hsotg->regs + GINTMSK); in dwc2_hcd_qh_unlink()
655 static void dwc2_sched_periodic_split(struct dwc2_hsotg *hsotg, in dwc2_sched_periodic_split() argument
700 void dwc2_hcd_qh_deactivate(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh, in dwc2_hcd_qh_deactivate() argument
706 dev_vdbg(hsotg->dev, "%s()\n", __func__); in dwc2_hcd_qh_deactivate()
709 dwc2_hcd_qh_unlink(hsotg, qh); in dwc2_hcd_qh_deactivate()
712 dwc2_hcd_qh_add(hsotg, qh); in dwc2_hcd_qh_deactivate()
716 frame_number = dwc2_hcd_get_frame_number(hsotg); in dwc2_hcd_qh_deactivate()
719 dwc2_sched_periodic_split(hsotg, qh, frame_number, in dwc2_hcd_qh_deactivate()
729 dwc2_hcd_qh_unlink(hsotg, qh); in dwc2_hcd_qh_deactivate()
736 if ((hsotg->core_params->uframe_sched > 0 && in dwc2_hcd_qh_deactivate()
738 (hsotg->core_params->uframe_sched <= 0 && in dwc2_hcd_qh_deactivate()
740 list_move(&qh->qh_list_entry, &hsotg->periodic_sched_ready); in dwc2_hcd_qh_deactivate()
742 list_move(&qh->qh_list_entry, &hsotg->periodic_sched_inactive); in dwc2_hcd_qh_deactivate()
788 int dwc2_hcd_qtd_add(struct dwc2_hsotg *hsotg, struct dwc2_qtd *qtd, in dwc2_hcd_qtd_add() argument
794 dev_err(hsotg->dev, "%s: Invalid QH\n", __func__); in dwc2_hcd_qtd_add()
799 retval = dwc2_hcd_qh_add(hsotg, qh); in dwc2_hcd_qtd_add()