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()
110 qh->sched_frame = dwc2_frame_num_inc(hsotg->frame_number, in dwc2_qh_init()
118 hprt = readl(hsotg->regs + HPRT0); in dwc2_qh_init()
127 dev_dbg(hsotg->dev, "interval=%d\n", qh->interval); in dwc2_qh_init()
130 dev_vdbg(hsotg->dev, "DWC OTG HCD QH Initialized\n"); in dwc2_qh_init()
131 dev_vdbg(hsotg->dev, "DWC OTG HCD QH - qh = %p\n", qh); in dwc2_qh_init()
132 dev_vdbg(hsotg->dev, "DWC OTG HCD QH - Device Address = %d\n", in dwc2_qh_init()
134 dev_vdbg(hsotg->dev, "DWC OTG HCD QH - Endpoint %d, %s\n", in dwc2_qh_init()
154 dev_vdbg(hsotg->dev, "DWC OTG HCD QH - Speed = %s\n", speed); in dwc2_qh_init()
174 dev_vdbg(hsotg->dev, "DWC OTG HCD QH - Type = %s\n", type); in dwc2_qh_init()
177 dev_vdbg(hsotg->dev, "DWC OTG HCD QH - usecs = %d\n", in dwc2_qh_init()
179 dev_vdbg(hsotg->dev, "DWC OTG HCD QH - interval = %d\n", in dwc2_qh_init()
194 static struct dwc2_qh *dwc2_hcd_qh_create(struct dwc2_hsotg *hsotg, in dwc2_hcd_qh_create() argument
208 dwc2_qh_init(hsotg, qh, urb); in dwc2_hcd_qh_create()
210 if (hsotg->core_params->dma_desc_enable > 0 && in dwc2_hcd_qh_create()
211 dwc2_hcd_qh_init_ddma(hsotg, qh, mem_flags) < 0) { in dwc2_hcd_qh_create()
212 dwc2_hcd_qh_free(hsotg, qh); in dwc2_hcd_qh_create()
230 void dwc2_hcd_qh_free(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_hcd_qh_free() argument
232 if (hsotg->core_params->dma_desc_enable > 0) in dwc2_hcd_qh_free()
233 dwc2_hcd_qh_free_ddma(hsotg, qh); in dwc2_hcd_qh_free()
235 dma_free_coherent(hsotg->dev, qh->dw_align_buf_size, in dwc2_hcd_qh_free()
248 static int dwc2_periodic_channel_available(struct dwc2_hsotg *hsotg) in dwc2_periodic_channel_available() argument
258 num_channels = hsotg->core_params->host_channels; in dwc2_periodic_channel_available()
259 if (hsotg->periodic_channels + hsotg->non_periodic_channels < in dwc2_periodic_channel_available()
261 && hsotg->periodic_channels < num_channels - 1) { in dwc2_periodic_channel_available()
264 dev_dbg(hsotg->dev, in dwc2_periodic_channel_available()
267 hsotg->periodic_channels, hsotg->non_periodic_channels); in dwc2_periodic_channel_available()
286 static int dwc2_check_periodic_bandwidth(struct dwc2_hsotg *hsotg, in dwc2_check_periodic_bandwidth() argument
308 if (hsotg->periodic_usecs > max_claimed_usecs) { in dwc2_check_periodic_bandwidth()
309 dev_err(hsotg->dev, in dwc2_check_periodic_bandwidth()
311 __func__, hsotg->periodic_usecs, qh->usecs); in dwc2_check_periodic_bandwidth()
328 void dwc2_hcd_init_usecs(struct dwc2_hsotg *hsotg) in dwc2_hcd_init_usecs() argument
333 hsotg->frame_usecs[i] = max_uframe_usecs[i]; in dwc2_hcd_init_usecs()
336 static int dwc2_find_single_uframe(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_find_single_uframe() argument
343 if (utime <= hsotg->frame_usecs[i]) { in dwc2_find_single_uframe()
344 hsotg->frame_usecs[i] -= utime; in dwc2_find_single_uframe()
355 static int dwc2_find_multi_uframe(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_find_multi_uframe() argument
365 if (hsotg->frame_usecs[i] <= 0) in dwc2_find_multi_uframe()
372 xtime = hsotg->frame_usecs[i]; in dwc2_find_multi_uframe()
378 if (xtime + hsotg->frame_usecs[j] < utime) { in dwc2_find_multi_uframe()
379 if (hsotg->frame_usecs[j] < in dwc2_find_multi_uframe()
386 t_left -= hsotg->frame_usecs[k]; in dwc2_find_multi_uframe()
389 hsotg->frame_usecs[k] in dwc2_find_multi_uframe()
391 hsotg->frame_usecs[k] = -t_left; in dwc2_find_multi_uframe()
395 hsotg->frame_usecs[k]; in dwc2_find_multi_uframe()
396 hsotg->frame_usecs[k] = 0; in dwc2_find_multi_uframe()
401 xtime += hsotg->frame_usecs[j]; in dwc2_find_multi_uframe()
404 hsotg->frame_usecs[j] == max_uframe_usecs[j]) in dwc2_find_multi_uframe()
411 static int dwc2_find_uframe(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_find_uframe() argument
417 ret = dwc2_find_single_uframe(hsotg, qh); in dwc2_find_uframe()
423 ret = dwc2_find_multi_uframe(hsotg, qh); in dwc2_find_uframe()
438 static int dwc2_check_max_xfer_size(struct dwc2_hsotg *hsotg, in dwc2_check_max_xfer_size() argument
446 max_channel_xfer_size = hsotg->core_params->max_transfer_size; in dwc2_check_max_xfer_size()
449 dev_err(hsotg->dev, in dwc2_check_max_xfer_size()
468 static int dwc2_schedule_periodic(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_schedule_periodic() argument
472 if (hsotg->core_params->uframe_sched > 0) { in dwc2_schedule_periodic()
475 status = dwc2_find_uframe(hsotg, qh); in dwc2_schedule_periodic()
490 status = dwc2_periodic_channel_available(hsotg); in dwc2_schedule_periodic()
492 dev_info(hsotg->dev, in dwc2_schedule_periodic()
498 status = dwc2_check_periodic_bandwidth(hsotg, qh); in dwc2_schedule_periodic()
502 dev_dbg(hsotg->dev, in dwc2_schedule_periodic()
508 status = dwc2_check_max_xfer_size(hsotg, qh); in dwc2_schedule_periodic()
510 dev_dbg(hsotg->dev, in dwc2_schedule_periodic()
516 if (hsotg->core_params->dma_desc_enable > 0) in dwc2_schedule_periodic()
518 list_add_tail(&qh->qh_list_entry, &hsotg->periodic_sched_ready); in dwc2_schedule_periodic()
522 &hsotg->periodic_sched_inactive); in dwc2_schedule_periodic()
524 if (hsotg->core_params->uframe_sched <= 0) in dwc2_schedule_periodic()
526 hsotg->periodic_channels++; in dwc2_schedule_periodic()
529 hsotg->periodic_usecs += qh->usecs; in dwc2_schedule_periodic()
541 static void dwc2_deschedule_periodic(struct dwc2_hsotg *hsotg, in dwc2_deschedule_periodic() argument
549 hsotg->periodic_usecs -= qh->usecs; in dwc2_deschedule_periodic()
551 if (hsotg->core_params->uframe_sched > 0) { in dwc2_deschedule_periodic()
553 hsotg->frame_usecs[i] += qh->frame_usecs[i]; in dwc2_deschedule_periodic()
558 hsotg->periodic_channels--; in dwc2_deschedule_periodic()
572 int dwc2_hcd_qh_add(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_hcd_qh_add() argument
578 dev_vdbg(hsotg->dev, "%s()\n", __func__); in dwc2_hcd_qh_add()
588 &hsotg->non_periodic_sched_inactive); in dwc2_hcd_qh_add()
592 status = dwc2_schedule_periodic(hsotg, qh); in dwc2_hcd_qh_add()
595 if (!hsotg->periodic_qh_count) { in dwc2_hcd_qh_add()
596 intr_mask = readl(hsotg->regs + GINTMSK); in dwc2_hcd_qh_add()
598 writel(intr_mask, hsotg->regs + GINTMSK); in dwc2_hcd_qh_add()
600 hsotg->periodic_qh_count++; in dwc2_hcd_qh_add()
612 void dwc2_hcd_qh_unlink(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) in dwc2_hcd_qh_unlink() argument
616 dev_vdbg(hsotg->dev, "%s()\n", __func__); in dwc2_hcd_qh_unlink()
623 if (hsotg->non_periodic_qh_ptr == &qh->qh_list_entry) in dwc2_hcd_qh_unlink()
624 hsotg->non_periodic_qh_ptr = in dwc2_hcd_qh_unlink()
625 hsotg->non_periodic_qh_ptr->next; in dwc2_hcd_qh_unlink()
630 dwc2_deschedule_periodic(hsotg, qh); in dwc2_hcd_qh_unlink()
631 hsotg->periodic_qh_count--; in dwc2_hcd_qh_unlink()
632 if (!hsotg->periodic_qh_count) { in dwc2_hcd_qh_unlink()
633 intr_mask = readl(hsotg->regs + GINTMSK); in dwc2_hcd_qh_unlink()
635 writel(intr_mask, hsotg->regs + GINTMSK); in dwc2_hcd_qh_unlink()
642 static void dwc2_sched_periodic_split(struct dwc2_hsotg *hsotg, in dwc2_sched_periodic_split() argument
687 void dwc2_hcd_qh_deactivate(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh, in dwc2_hcd_qh_deactivate() argument
693 dev_vdbg(hsotg->dev, "%s()\n", __func__); in dwc2_hcd_qh_deactivate()
696 dwc2_hcd_qh_unlink(hsotg, qh); in dwc2_hcd_qh_deactivate()
699 dwc2_hcd_qh_add(hsotg, qh); in dwc2_hcd_qh_deactivate()
703 frame_number = dwc2_hcd_get_frame_number(hsotg); in dwc2_hcd_qh_deactivate()
706 dwc2_sched_periodic_split(hsotg, qh, frame_number, in dwc2_hcd_qh_deactivate()
716 dwc2_hcd_qh_unlink(hsotg, qh); in dwc2_hcd_qh_deactivate()
723 if ((hsotg->core_params->uframe_sched > 0 && in dwc2_hcd_qh_deactivate()
725 (hsotg->core_params->uframe_sched <= 0 && in dwc2_hcd_qh_deactivate()
727 list_move(&qh->qh_list_entry, &hsotg->periodic_sched_ready); in dwc2_hcd_qh_deactivate()
729 list_move(&qh->qh_list_entry, &hsotg->periodic_sched_inactive); in dwc2_hcd_qh_deactivate()
776 int dwc2_hcd_qtd_add(struct dwc2_hsotg *hsotg, struct dwc2_qtd *qtd, in dwc2_hcd_qtd_add() argument
789 *qh = dwc2_hcd_qh_create(hsotg, urb, mem_flags); in dwc2_hcd_qtd_add()
795 spin_lock_irqsave(&hsotg->lock, flags); in dwc2_hcd_qtd_add()
797 retval = dwc2_hcd_qh_add(hsotg, *qh); in dwc2_hcd_qtd_add()
803 spin_unlock_irqrestore(&hsotg->lock, flags); in dwc2_hcd_qtd_add()
813 dwc2_hcd_qh_unlink(hsotg, qh_tmp); in dwc2_hcd_qtd_add()
818 dwc2_hcd_qtd_unlink_and_free(hsotg, qtd2, qh_tmp); in dwc2_hcd_qtd_add()
820 spin_unlock_irqrestore(&hsotg->lock, flags); in dwc2_hcd_qtd_add()
821 dwc2_hcd_qh_free(hsotg, qh_tmp); in dwc2_hcd_qtd_add()
823 spin_unlock_irqrestore(&hsotg->lock, flags); in dwc2_hcd_qtd_add()