Searched refs:fotg210 (Results 1 - 6 of 6) sorted by relevance

/linux-4.4.14/drivers/usb/gadget/udc/
H A Dfotg210-udc.c22 #include "fotg210.h"
33 u32 value = ioread32(ep->fotg210->reg + FOTG210_DMISGR1); fotg210_disable_fifo_int()
39 iowrite32(value, ep->fotg210->reg + FOTG210_DMISGR1); fotg210_disable_fifo_int()
44 u32 value = ioread32(ep->fotg210->reg + FOTG210_DMISGR1); fotg210_enable_fifo_int()
50 iowrite32(value, ep->fotg210->reg + FOTG210_DMISGR1); fotg210_enable_fifo_int()
53 static void fotg210_set_cxdone(struct fotg210_udc *fotg210) fotg210_set_cxdone() argument
55 u32 value = ioread32(fotg210->reg + FOTG210_DCFESR); fotg210_set_cxdone()
58 iowrite32(value, fotg210->reg + FOTG210_DCFESR); fotg210_set_cxdone()
67 if (ep->fotg210->gadget.speed == USB_SPEED_UNKNOWN) fotg210_done()
72 spin_unlock(&ep->fotg210->lock); fotg210_done()
74 spin_lock(&ep->fotg210->lock); fotg210_done()
80 fotg210_set_cxdone(ep->fotg210); fotg210_done()
87 struct fotg210_udc *fotg210 = ep->fotg210; fotg210_fifo_ep_mapping() local
95 val = ioread32(fotg210->reg + FOTG210_EPMAP); fotg210_fifo_ep_mapping()
98 iowrite32(val, fotg210->reg + FOTG210_EPMAP); fotg210_fifo_ep_mapping()
101 val = ioread32(fotg210->reg + FOTG210_FIFOMAP); fotg210_fifo_ep_mapping()
104 iowrite32(val, fotg210->reg + FOTG210_FIFOMAP); fotg210_fifo_ep_mapping()
107 val = ioread32(fotg210->reg + FOTG210_FIFOCF); fotg210_fifo_ep_mapping()
109 iowrite32(val, fotg210->reg + FOTG210_FIFOCF); fotg210_fifo_ep_mapping()
114 struct fotg210_udc *fotg210 = ep->fotg210; fotg210_set_fifo_dir() local
117 val = ioread32(fotg210->reg + FOTG210_FIFOMAP); fotg210_set_fifo_dir()
119 iowrite32(val, fotg210->reg + FOTG210_FIFOMAP); fotg210_set_fifo_dir()
124 struct fotg210_udc *fotg210 = ep->fotg210; fotg210_set_tfrtype() local
127 val = ioread32(fotg210->reg + FOTG210_FIFOCF); fotg210_set_tfrtype()
129 iowrite32(val, fotg210->reg + FOTG210_FIFOCF); fotg210_set_tfrtype()
135 struct fotg210_udc *fotg210 = ep->fotg210; fotg210_set_mps() local
140 val = ioread32(fotg210->reg + offset); fotg210_set_mps()
142 iowrite32(val, fotg210->reg + offset); fotg210_set_mps()
148 struct fotg210_udc *fotg210 = ep->fotg210; fotg210_config_ep() local
155 fotg210->ep[ep->epnum] = ep; fotg210_config_ep()
176 static void fotg210_reset_tseq(struct fotg210_udc *fotg210, u8 epnum) fotg210_reset_tseq() argument
178 struct fotg210_ep *ep = fotg210->ep[epnum]; fotg210_reset_tseq()
183 fotg210->reg + FOTG210_INEPMPSR(epnum) : fotg210_reset_tseq()
184 fotg210->reg + FOTG210_OUTEPMPSR(epnum); fotg210_reset_tseq()
207 fotg210_reset_tseq(ep->fotg210, ep->epnum); fotg210_ep_release()
225 spin_lock_irqsave(&ep->fotg210->lock, flags); fotg210_ep_disable()
227 spin_unlock_irqrestore(&ep->fotg210->lock, flags); fotg210_ep_disable()
260 struct fotg210_udc *fotg210 = ep->fotg210; fotg210_enable_dma() local
263 value = ioread32(fotg210->reg + FOTG210_DMACPSR1); fotg210_enable_dma()
266 iowrite32(value, fotg210->reg + FOTG210_DMACPSR1); fotg210_enable_dma()
269 value = ioread32(fotg210->reg + FOTG210_DMATFNR); fotg210_enable_dma()
274 iowrite32(value, fotg210->reg + FOTG210_DMATFNR); fotg210_enable_dma()
277 iowrite32(d, fotg210->reg + FOTG210_DMACPSR2); fotg210_enable_dma()
280 value = ioread32(fotg210->reg + FOTG210_DMISGR2); fotg210_enable_dma()
282 iowrite32(value, fotg210->reg + FOTG210_DMISGR2); fotg210_enable_dma()
285 value = ioread32(fotg210->reg + FOTG210_DMACPSR1); fotg210_enable_dma()
287 iowrite32(value, fotg210->reg + FOTG210_DMACPSR1); fotg210_enable_dma()
292 iowrite32(DMATFNR_DISDMA, ep->fotg210->reg + FOTG210_DMATFNR); fotg210_disable_dma()
300 value = ioread32(ep->fotg210->reg + FOTG210_DISGR2); fotg210_wait_dma_done()
307 iowrite32(value, ep->fotg210->reg + FOTG210_DISGR2); fotg210_wait_dma_done()
311 value = ioread32(ep->fotg210->reg + FOTG210_DMACPSR1); fotg210_wait_dma_done()
313 iowrite32(value, ep->fotg210->reg + FOTG210_DMACPSR1); fotg210_wait_dma_done()
317 value = ioread32(ep->fotg210->reg + fotg210_wait_dma_done()
320 iowrite32(value, ep->fotg210->reg + fotg210_wait_dma_done()
323 value = ioread32(ep->fotg210->reg + FOTG210_DCFESR); fotg210_wait_dma_done()
325 iowrite32(value, ep->fotg210->reg + FOTG210_DCFESR); fotg210_wait_dma_done()
342 length = ioread32(ep->fotg210->reg + fotg210_start_dma()
392 u32 value = ioread32(ep->fotg210->reg + FOTG210_DMISGR0); fotg210_ep0_queue()
395 iowrite32(value, ep->fotg210->reg + FOTG210_DMISGR0); fotg210_ep0_queue()
410 if (ep->fotg210->gadget.speed == USB_SPEED_UNKNOWN) fotg210_ep_queue()
413 spin_lock_irqsave(&ep->fotg210->lock, flags); fotg210_ep_queue()
428 spin_unlock_irqrestore(&ep->fotg210->lock, flags); fotg210_ep_queue()
442 spin_lock_irqsave(&ep->fotg210->lock, flags); fotg210_ep_dequeue()
445 spin_unlock_irqrestore(&ep->fotg210->lock, flags); fotg210_ep_dequeue()
452 struct fotg210_udc *fotg210 = ep->fotg210; fotg210_set_epnstall() local
459 value = ioread32(fotg210->reg + FOTG210_DCFESR); fotg210_set_epnstall()
464 fotg210->reg + FOTG210_INEPMPSR(ep->epnum) : fotg210_set_epnstall()
465 fotg210->reg + FOTG210_OUTEPMPSR(ep->epnum); fotg210_set_epnstall()
473 struct fotg210_udc *fotg210 = ep->fotg210; fotg210_clear_epnstall() local
478 fotg210->reg + FOTG210_INEPMPSR(ep->epnum) : fotg210_clear_epnstall()
479 fotg210->reg + FOTG210_OUTEPMPSR(ep->epnum); fotg210_clear_epnstall()
488 struct fotg210_udc *fotg210; fotg210_set_halt_and_wedge() local
494 fotg210 = ep->fotg210; fotg210_set_halt_and_wedge()
496 spin_lock_irqsave(&ep->fotg210->lock, flags); fotg210_set_halt_and_wedge()
504 fotg210_reset_tseq(fotg210, ep->epnum); fotg210_set_halt_and_wedge()
512 spin_unlock_irqrestore(&ep->fotg210->lock, flags); fotg210_set_halt_and_wedge()
545 static void fotg210_clear_tx0byte(struct fotg210_udc *fotg210) fotg210_clear_tx0byte() argument
547 u32 value = ioread32(fotg210->reg + FOTG210_TX0BYTE); fotg210_clear_tx0byte()
551 iowrite32(value, fotg210->reg + FOTG210_TX0BYTE); fotg210_clear_tx0byte()
554 static void fotg210_clear_rx0byte(struct fotg210_udc *fotg210) fotg210_clear_rx0byte() argument
556 u32 value = ioread32(fotg210->reg + FOTG210_RX0BYTE); fotg210_clear_rx0byte()
560 iowrite32(value, fotg210->reg + FOTG210_RX0BYTE); fotg210_clear_rx0byte()
564 static void fotg210_rdsetupp(struct fotg210_udc *fotg210, fotg210_rdsetupp() argument
572 iowrite32(DMATFNR_ACC_CXF, fotg210->reg + FOTG210_DMATFNR); fotg210_rdsetupp()
575 data = ioread32(fotg210->reg + FOTG210_CXPORT); fotg210_rdsetupp()
585 data = ioread32(fotg210->reg + FOTG210_CXPORT); fotg210_rdsetupp()
589 data = ioread32(fotg210->reg + FOTG210_CXPORT); fotg210_rdsetupp()
594 data = ioread32(fotg210->reg + FOTG210_CXPORT); fotg210_rdsetupp()
603 iowrite32(DMATFNR_DISDMA, fotg210->reg + FOTG210_DMATFNR); fotg210_rdsetupp()
606 static void fotg210_set_configuration(struct fotg210_udc *fotg210) fotg210_set_configuration() argument
608 u32 value = ioread32(fotg210->reg + FOTG210_DAR); fotg210_set_configuration()
611 iowrite32(value, fotg210->reg + FOTG210_DAR); fotg210_set_configuration()
614 static void fotg210_set_dev_addr(struct fotg210_udc *fotg210, u32 addr) fotg210_set_dev_addr() argument
616 u32 value = ioread32(fotg210->reg + FOTG210_DAR); fotg210_set_dev_addr()
619 iowrite32(value, fotg210->reg + FOTG210_DAR); fotg210_set_dev_addr()
622 static void fotg210_set_cxstall(struct fotg210_udc *fotg210) fotg210_set_cxstall() argument
624 u32 value = ioread32(fotg210->reg + FOTG210_DCFESR); fotg210_set_cxstall()
627 iowrite32(value, fotg210->reg + FOTG210_DCFESR); fotg210_set_cxstall()
630 static void fotg210_request_error(struct fotg210_udc *fotg210) fotg210_request_error() argument
632 fotg210_set_cxstall(fotg210); fotg210_request_error()
636 static void fotg210_set_address(struct fotg210_udc *fotg210, fotg210_set_address() argument
640 fotg210_request_error(fotg210); fotg210_set_address()
642 fotg210_set_dev_addr(fotg210, ctrl->wValue); fotg210_set_address()
643 fotg210_set_cxdone(fotg210); fotg210_set_address()
647 static void fotg210_set_feature(struct fotg210_udc *fotg210, fotg210_set_feature() argument
652 fotg210_set_cxdone(fotg210); fotg210_set_feature()
655 fotg210_set_cxdone(fotg210); fotg210_set_feature()
661 fotg210_set_epnstall(fotg210->ep[epnum]); fotg210_set_feature()
663 fotg210_set_cxstall(fotg210); fotg210_set_feature()
664 fotg210_set_cxdone(fotg210); fotg210_set_feature()
668 fotg210_request_error(fotg210); fotg210_set_feature()
673 static void fotg210_clear_feature(struct fotg210_udc *fotg210, fotg210_clear_feature() argument
677 fotg210->ep[ctrl->wIndex & USB_ENDPOINT_NUMBER_MASK]; fotg210_clear_feature()
681 fotg210_set_cxdone(fotg210); fotg210_clear_feature()
684 fotg210_set_cxdone(fotg210); fotg210_clear_feature()
689 fotg210_set_cxdone(fotg210); fotg210_clear_feature()
695 fotg210_set_cxdone(fotg210); fotg210_clear_feature()
698 fotg210_request_error(fotg210); fotg210_clear_feature()
705 struct fotg210_udc *fotg210 = ep->fotg210; fotg210_is_epnstall() local
710 fotg210->reg + FOTG210_INEPMPSR(ep->epnum) : fotg210_is_epnstall()
711 fotg210->reg + FOTG210_OUTEPMPSR(ep->epnum); fotg210_is_epnstall()
716 static void fotg210_get_status(struct fotg210_udc *fotg210, fotg210_get_status() argument
723 fotg210->ep0_data = 1 << USB_DEVICE_SELF_POWERED; fotg210_get_status()
726 fotg210->ep0_data = 0; fotg210_get_status()
731 fotg210->ep0_data = fotg210_get_status()
732 fotg210_is_epnstall(fotg210->ep[epnum]) fotg210_get_status()
735 fotg210_request_error(fotg210); fotg210_get_status()
739 fotg210_request_error(fotg210); fotg210_get_status()
743 fotg210->ep0_req->buf = &fotg210->ep0_data; fotg210_get_status()
744 fotg210->ep0_req->length = 2; fotg210_get_status()
746 spin_unlock(&fotg210->lock); fotg210_get_status()
747 fotg210_ep_queue(fotg210->gadget.ep0, fotg210->ep0_req, GFP_KERNEL); fotg210_get_status()
748 spin_lock(&fotg210->lock); fotg210_get_status()
751 static int fotg210_setup_packet(struct fotg210_udc *fotg210, fotg210_setup_packet() argument
757 fotg210_rdsetupp(fotg210, p); fotg210_setup_packet()
759 fotg210->ep[0]->dir_in = ctrl->bRequestType & USB_DIR_IN; fotg210_setup_packet()
761 if (fotg210->gadget.speed == USB_SPEED_UNKNOWN) { fotg210_setup_packet()
762 u32 value = ioread32(fotg210->reg + FOTG210_DMCR); fotg210_setup_packet()
763 fotg210->gadget.speed = value & DMCR_HS_EN ? fotg210_setup_packet()
771 fotg210_get_status(fotg210, ctrl); fotg210_setup_packet()
774 fotg210_clear_feature(fotg210, ctrl); fotg210_setup_packet()
777 fotg210_set_feature(fotg210, ctrl); fotg210_setup_packet()
780 fotg210_set_address(fotg210, ctrl); fotg210_setup_packet()
783 fotg210_set_configuration(fotg210); fotg210_setup_packet()
797 static void fotg210_ep0out(struct fotg210_udc *fotg210) fotg210_ep0out() argument
799 struct fotg210_ep *ep = fotg210->ep[0]; fotg210_ep0out()
817 static void fotg210_ep0in(struct fotg210_udc *fotg210) fotg210_ep0in() argument
819 struct fotg210_ep *ep = fotg210->ep[0]; fotg210_ep0in()
833 fotg210_set_cxdone(fotg210); fotg210_ep0in()
837 static void fotg210_clear_comabt_int(struct fotg210_udc *fotg210) fotg210_clear_comabt_int() argument
839 u32 value = ioread32(fotg210->reg + FOTG210_DISGR0); fotg210_clear_comabt_int()
842 iowrite32(value, fotg210->reg + FOTG210_DISGR0); fotg210_clear_comabt_int()
870 struct fotg210_udc *fotg210 = _fotg210; fotg210_irq() local
871 u32 int_grp = ioread32(fotg210->reg + FOTG210_DIGR); fotg210_irq()
872 u32 int_msk = ioread32(fotg210->reg + FOTG210_DMIGR); fotg210_irq()
876 spin_lock(&fotg210->lock); fotg210_irq()
879 void __iomem *reg = fotg210->reg + FOTG210_DISGR2; fotg210_irq()
881 u32 int_msk2 = ioread32(fotg210->reg + FOTG210_DMISGR2); fotg210_irq()
890 pr_info("fotg210 udc reset\n"); fotg210_irq()
896 pr_info("fotg210 udc suspend\n"); fotg210_irq()
902 pr_info("fotg210 udc resume\n"); fotg210_irq()
908 pr_info("fotg210 iso sequence error\n"); fotg210_irq()
914 pr_info("fotg210 iso sequence abort\n"); fotg210_irq()
917 fotg210_clear_tx0byte(fotg210); fotg210_irq()
921 pr_info("fotg210 transferred 0 byte\n"); fotg210_irq()
924 fotg210_clear_rx0byte(fotg210); fotg210_irq()
928 pr_info("fotg210 received 0 byte\n"); fotg210_irq()
938 void __iomem *reg = fotg210->reg + FOTG210_DISGR0; fotg210_irq()
940 u32 int_msk0 = ioread32(fotg210->reg + FOTG210_DMISGR0); fotg210_irq()
947 fotg210_clear_comabt_int(fotg210); fotg210_irq()
948 pr_info("fotg210 CX command abort\n"); fotg210_irq()
952 if (fotg210_setup_packet(fotg210, &ctrl)) { fotg210_irq()
953 spin_unlock(&fotg210->lock); fotg210_irq()
954 if (fotg210->driver->setup(&fotg210->gadget, fotg210_irq()
956 fotg210_set_cxstall(fotg210); fotg210_irq()
957 spin_lock(&fotg210->lock); fotg210_irq()
961 pr_info("fotg210 cmd end\n"); fotg210_irq()
964 fotg210_ep0in(fotg210); fotg210_irq()
967 fotg210_ep0out(fotg210); fotg210_irq()
970 fotg210_set_cxstall(fotg210); fotg210_irq()
971 pr_info("fotg210 ep0 fail\n"); fotg210_irq()
976 void __iomem *reg = fotg210->reg + FOTG210_DISGR1; fotg210_irq()
978 u32 int_msk1 = ioread32(fotg210->reg + FOTG210_DMISGR1); fotg210_irq()
985 fotg210_in_fifo_handler(fotg210->ep[fifo + 1]); fotg210_irq()
989 fotg210_out_fifo_handler(fotg210->ep[fifo + 1]); fotg210_irq()
993 spin_unlock(&fotg210->lock); fotg210_irq()
998 static void fotg210_disable_unplug(struct fotg210_udc *fotg210) fotg210_disable_unplug() argument
1000 u32 reg = ioread32(fotg210->reg + FOTG210_PHYTMSR); fotg210_disable_unplug()
1003 iowrite32(reg, fotg210->reg + FOTG210_PHYTMSR); fotg210_disable_unplug()
1009 struct fotg210_udc *fotg210 = gadget_to_fotg210(g); fotg210_udc_start() local
1014 fotg210->driver = driver; fotg210_udc_start()
1017 value = ioread32(fotg210->reg + FOTG210_DMCR); fotg210_udc_start()
1019 iowrite32(value, fotg210->reg + FOTG210_DMCR); fotg210_udc_start()
1024 static void fotg210_init(struct fotg210_udc *fotg210) fotg210_init() argument
1030 fotg210->reg + FOTG210_GMIR); fotg210_init()
1033 value = ioread32(fotg210->reg + FOTG210_DMCR); fotg210_init()
1035 iowrite32(value, fotg210->reg + FOTG210_DMCR); fotg210_init()
1038 iowrite32(~(u32)0, fotg210->reg + FOTG210_DMISGR1); fotg210_init()
1041 value = ioread32(fotg210->reg + FOTG210_DMISGR0); fotg210_init()
1043 iowrite32(value, fotg210->reg + FOTG210_DMISGR0); fotg210_init()
1048 struct fotg210_udc *fotg210 = gadget_to_fotg210(g); fotg210_udc_stop() local
1051 spin_lock_irqsave(&fotg210->lock, flags); fotg210_udc_stop()
1053 fotg210_init(fotg210); fotg210_udc_stop()
1054 fotg210->driver = NULL; fotg210_udc_stop()
1056 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_udc_stop()
1068 struct fotg210_udc *fotg210 = platform_get_drvdata(pdev); fotg210_udc_remove() local
1070 usb_del_gadget_udc(&fotg210->gadget); fotg210_udc_remove()
1071 iounmap(fotg210->reg); fotg210_udc_remove()
1072 free_irq(platform_get_irq(pdev, 0), fotg210); fotg210_udc_remove()
1074 fotg210_ep_free_request(&fotg210->ep[0]->ep, fotg210->ep0_req); fotg210_udc_remove()
1075 kfree(fotg210); fotg210_udc_remove()
1083 struct fotg210_udc *fotg210 = NULL; fotg210_udc_probe() local
1103 fotg210 = kzalloc(sizeof(struct fotg210_udc), GFP_KERNEL); fotg210_udc_probe()
1104 if (fotg210 == NULL) fotg210_udc_probe()
1111 fotg210->ep[i] = _ep[i]; fotg210_udc_probe()
1114 fotg210->reg = ioremap(res->start, resource_size(res)); fotg210_udc_probe()
1115 if (fotg210->reg == NULL) { fotg210_udc_probe()
1120 spin_lock_init(&fotg210->lock); fotg210_udc_probe()
1122 platform_set_drvdata(pdev, fotg210); fotg210_udc_probe()
1124 fotg210->gadget.ops = &fotg210_gadget_ops; fotg210_udc_probe()
1126 fotg210->gadget.max_speed = USB_SPEED_HIGH; fotg210_udc_probe()
1127 fotg210->gadget.dev.parent = &pdev->dev; fotg210_udc_probe()
1128 fotg210->gadget.dev.dma_mask = pdev->dev.dma_mask; fotg210_udc_probe()
1129 fotg210->gadget.name = udc_name; fotg210_udc_probe()
1131 INIT_LIST_HEAD(&fotg210->gadget.ep_list); fotg210_udc_probe()
1134 struct fotg210_ep *ep = fotg210->ep[i]; fotg210_udc_probe()
1137 INIT_LIST_HEAD(&fotg210->ep[i]->ep.ep_list); fotg210_udc_probe()
1138 list_add_tail(&fotg210->ep[i]->ep.ep_list, fotg210_udc_probe()
1139 &fotg210->gadget.ep_list); fotg210_udc_probe()
1141 ep->fotg210 = fotg210; fotg210_udc_probe()
1158 usb_ep_set_maxpacket_limit(&fotg210->ep[0]->ep, 0x40); fotg210_udc_probe()
1159 fotg210->gadget.ep0 = &fotg210->ep[0]->ep; fotg210_udc_probe()
1160 INIT_LIST_HEAD(&fotg210->gadget.ep0->ep_list); fotg210_udc_probe()
1162 fotg210->ep0_req = fotg210_ep_alloc_request(&fotg210->ep[0]->ep, fotg210_udc_probe()
1164 if (fotg210->ep0_req == NULL) fotg210_udc_probe()
1167 fotg210_init(fotg210); fotg210_udc_probe()
1169 fotg210_disable_unplug(fotg210); fotg210_udc_probe()
1172 udc_name, fotg210); fotg210_udc_probe()
1178 ret = usb_add_gadget_udc(&pdev->dev, &fotg210->gadget); fotg210_udc_probe()
1187 free_irq(ires->start, fotg210); fotg210_udc_probe()
1190 fotg210_ep_free_request(&fotg210->ep[0]->ep, fotg210->ep0_req); fotg210_udc_probe()
1193 if (fotg210->reg) fotg210_udc_probe()
1194 iounmap(fotg210->reg); fotg210_udc_probe()
1197 kfree(fotg210); fotg210_udc_probe()
H A DMakefile29 obj-$(CONFIG_USB_FOTG210_UDC) += fotg210-udc.o
H A Dfotg210.h221 struct fotg210_udc *fotg210; member in struct:fotg210_ep
/linux-4.4.14/drivers/usb/host/
H A Dfotg210-hcd.c90 #include "fotg210.h"
92 #define fotg210_dbg(fotg210, fmt, args...) \
93 dev_dbg(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args)
94 #define fotg210_err(fotg210, fmt, args...) \
95 dev_err(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args)
96 #define fotg210_info(fotg210, fmt, args...) \
97 dev_info(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args)
98 #define fotg210_warn(fotg210, fmt, args...) \
99 dev_warn(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args)
104 static void dbg_hcs_params(struct fotg210_hcd *fotg210, char *label) dbg_hcs_params() argument
106 u32 params = fotg210_readl(fotg210, &fotg210->caps->hcs_params); dbg_hcs_params()
108 fotg210_dbg(fotg210, "%s hcs_params 0x%x ports=%d\n", label, params, dbg_hcs_params()
115 static void dbg_hcc_params(struct fotg210_hcd *fotg210, char *label) dbg_hcc_params() argument
117 u32 params = fotg210_readl(fotg210, &fotg210->caps->hcc_params); dbg_hcc_params()
119 fotg210_dbg(fotg210, "%s hcc_params %04x uframes %s%s\n", label, dbg_hcc_params()
126 dbg_qtd(const char *label, struct fotg210_hcd *fotg210, struct fotg210_qtd *qtd) dbg_qtd() argument
128 fotg210_dbg(fotg210, "%s td %p n%08x %08x t%08x p0=%08x\n", label, qtd, dbg_qtd()
129 hc32_to_cpup(fotg210, &qtd->hw_next), dbg_qtd()
130 hc32_to_cpup(fotg210, &qtd->hw_alt_next), dbg_qtd()
131 hc32_to_cpup(fotg210, &qtd->hw_token), dbg_qtd()
132 hc32_to_cpup(fotg210, &qtd->hw_buf[0])); dbg_qtd()
134 fotg210_dbg(fotg210, " p1=%08x p2=%08x p3=%08x p4=%08x\n", dbg_qtd()
135 hc32_to_cpup(fotg210, &qtd->hw_buf[1]), dbg_qtd()
136 hc32_to_cpup(fotg210, &qtd->hw_buf[2]), dbg_qtd()
137 hc32_to_cpup(fotg210, &qtd->hw_buf[3]), dbg_qtd()
138 hc32_to_cpup(fotg210, &qtd->hw_buf[4])); dbg_qtd()
142 dbg_qh(const char *label, struct fotg210_hcd *fotg210, struct fotg210_qh *qh) dbg_qh() argument
146 fotg210_dbg(fotg210, "%s qh %p n%08x info %x %x qtd %x\n", label, qh, dbg_qh()
150 dbg_qtd("overlay", fotg210, (struct fotg210_qtd *) &hw->hw_qtd_next); dbg_qh()
154 dbg_itd(const char *label, struct fotg210_hcd *fotg210, struct fotg210_itd *itd) dbg_itd() argument
156 fotg210_dbg(fotg210, "%s[%d] itd %p, next %08x, urb %p\n", label, dbg_itd()
157 itd->frame, itd, hc32_to_cpu(fotg210, itd->hw_next), dbg_itd()
160 fotg210_dbg(fotg210, dbg_itd()
162 hc32_to_cpu(fotg210, itd->hw_transaction[0]), dbg_itd()
163 hc32_to_cpu(fotg210, itd->hw_transaction[1]), dbg_itd()
164 hc32_to_cpu(fotg210, itd->hw_transaction[2]), dbg_itd()
165 hc32_to_cpu(fotg210, itd->hw_transaction[3]), dbg_itd()
166 hc32_to_cpu(fotg210, itd->hw_transaction[4]), dbg_itd()
167 hc32_to_cpu(fotg210, itd->hw_transaction[5]), dbg_itd()
168 hc32_to_cpu(fotg210, itd->hw_transaction[6]), dbg_itd()
169 hc32_to_cpu(fotg210, itd->hw_transaction[7])); dbg_itd()
171 fotg210_dbg(fotg210, dbg_itd()
173 hc32_to_cpu(fotg210, itd->hw_bufp[0]), dbg_itd()
174 hc32_to_cpu(fotg210, itd->hw_bufp[1]), dbg_itd()
175 hc32_to_cpu(fotg210, itd->hw_bufp[2]), dbg_itd()
176 hc32_to_cpu(fotg210, itd->hw_bufp[3]), dbg_itd()
177 hc32_to_cpu(fotg210, itd->hw_bufp[4]), dbg_itd()
178 hc32_to_cpu(fotg210, itd->hw_bufp[5]), dbg_itd()
179 hc32_to_cpu(fotg210, itd->hw_bufp[6])); dbg_itd()
181 fotg210_dbg(fotg210, " index: %d %d %d %d %d %d %d %d\n", dbg_itd()
273 #define dbg_status(fotg210, label, status) { \
276 fotg210_dbg(fotg210, "%s\n", _buf); \
279 #define dbg_cmd(fotg210, label, command) { \
282 fotg210_dbg(fotg210, "%s\n", _buf); \
285 #define dbg_port(fotg210, label, port, status) { \
287 fotg210_dbg(fotg210, "%s\n", \
350 static inline char token_mark(struct fotg210_hcd *fotg210, __hc32 token) token_mark() argument
352 __u32 v = hc32_to_cpu(fotg210, token); token_mark()
364 static void qh_lines(struct fotg210_hcd *fotg210, struct fotg210_qh *qh, qh_lines() argument
374 __le32 list_end = FOTG210_LIST_END(fotg210); qh_lines()
380 mark = token_mark(fotg210, hw->hw_token); qh_lines()
382 if ((hw->hw_alt_next & QTD_MASK(fotg210)) == qh_lines()
383 fotg210->async->hw->hw_alt_next) qh_lines()
389 scratch = hc32_to_cpup(fotg210, &hw->hw_info1); qh_lines()
390 hw_curr = (mark == '*') ? hc32_to_cpup(fotg210, &hw->hw_current) : 0; qh_lines()
396 scratch, hc32_to_cpup(fotg210, &hw->hw_info2), qh_lines()
397 hc32_to_cpup(fotg210, &hw->hw_token), mark, qh_lines()
398 (cpu_to_hc32(fotg210, QTD_TOGGLE) & hw->hw_token) qh_lines()
400 (hc32_to_cpup(fotg210, &hw->hw_alt_next) >> 1) & 0x0f); qh_lines()
406 scratch = hc32_to_cpup(fotg210, &td->hw_token); qh_lines()
410 else if (hw->hw_qtd_next == cpu_to_hc32(fotg210, td->qtd_dma)) qh_lines()
413 if (td->hw_alt_next == fotg210->async->hw->hw_alt_next) qh_lines()
461 struct fotg210_hcd *fotg210; fill_async_buffer() local
468 fotg210 = hcd_to_fotg210(hcd); fill_async_buffer()
478 spin_lock_irqsave(&fotg210->lock, flags); fill_async_buffer()
479 for (qh = fotg210->async->qh_next.qh; size > 0 && qh; fill_async_buffer()
481 qh_lines(fotg210, qh, &next, &size); fill_async_buffer()
482 if (fotg210->async_unlink && size > 0) { fill_async_buffer()
487 for (qh = fotg210->async_unlink; size > 0 && qh; fill_async_buffer()
489 qh_lines(fotg210, qh, &next, &size); fill_async_buffer()
491 spin_unlock_irqrestore(&fotg210->lock, flags); fill_async_buffer()
497 static unsigned output_buf_tds_dir(char *buf, struct fotg210_hcd *fotg210, output_buf_tds_dir() argument
500 u32 scratch = hc32_to_cpup(fotg210, &hw->hw_info1); output_buf_tds_dir()
508 switch ((hc32_to_cpu(fotg210, qtd->hw_token) >> 8) & 0x03) { output_buf_tds_dir()
528 struct fotg210_hcd *fotg210; fill_periodic_buffer() local
543 fotg210 = hcd_to_fotg210(hcd); fill_periodic_buffer()
547 temp = scnprintf(next, size, "size = %d\n", fotg210->periodic_size); fill_periodic_buffer()
554 spin_lock_irqsave(&fotg210->lock, flags); fill_periodic_buffer()
555 for (i = 0; i < fotg210->periodic_size; i++) { fill_periodic_buffer()
556 p = fotg210->pshadow[i]; fill_periodic_buffer()
560 tag = Q_NEXT_TYPE(fotg210, fotg210->periodic[i]); fill_periodic_buffer()
569 switch (hc32_to_cpu(fotg210, tag)) { fill_periodic_buffer()
574 hc32_to_cpup(fotg210, fill_periodic_buffer()
596 fotg210, hw, fill_periodic_buffer()
603 tag = Q_NEXT_TYPE(fotg210, hw->hw_next); fill_periodic_buffer()
610 tag = Q_NEXT_TYPE(fotg210, p.fstn->hw_next); fill_periodic_buffer()
616 tag = Q_NEXT_TYPE(fotg210, p.itd->hw_next); fill_periodic_buffer()
628 spin_unlock_irqrestore(&fotg210->lock, flags); fill_periodic_buffer()
635 static const char *rh_state_string(struct fotg210_hcd *fotg210) rh_state_string() argument
637 switch (fotg210->rh_state) { rh_state_string()
653 struct fotg210_hcd *fotg210; fill_registers_buffer() local
661 fotg210 = hcd_to_fotg210(hcd); fill_registers_buffer()
665 spin_lock_irqsave(&fotg210->lock, flags); fill_registers_buffer()
679 i = HC_VERSION(fotg210, fotg210_readl(fotg210, fill_registers_buffer()
680 &fotg210->caps->hc_capbase)); fill_registers_buffer()
688 i >> 8, i & 0x0ff, rh_state_string(fotg210)); fill_registers_buffer()
693 i = fotg210_readl(fotg210, &fotg210->caps->hcs_params); fill_registers_buffer()
698 i = fotg210_readl(fotg210, &fotg210->caps->hcc_params); fill_registers_buffer()
705 fotg210_readl(fotg210, &fotg210->regs->status)); fill_registers_buffer()
711 fotg210_readl(fotg210, &fotg210->regs->command)); fill_registers_buffer()
717 fotg210_readl(fotg210, &fotg210->regs->intr_enable)); fill_registers_buffer()
723 fotg210_read_frame_index(fotg210)); fill_registers_buffer()
727 if (fotg210->async_unlink) { fill_registers_buffer()
729 fotg210->async_unlink); fill_registers_buffer()
737 fotg210->stats.normal, fotg210->stats.error, fill_registers_buffer()
738 fotg210->stats.iaa, fotg210->stats.lost_iaa); fill_registers_buffer()
743 fotg210->stats.complete, fotg210->stats.unlink); fill_registers_buffer()
749 spin_unlock_irqrestore(&fotg210->lock, flags); fill_registers_buffer()
857 static inline void create_debug_files(struct fotg210_hcd *fotg210) create_debug_files() argument
859 struct usb_bus *bus = &fotg210_to_hcd(fotg210)->self; create_debug_files()
861 fotg210->debug_dir = debugfs_create_dir(bus->bus_name, create_debug_files()
863 if (!fotg210->debug_dir) create_debug_files()
866 if (!debugfs_create_file("async", S_IRUGO, fotg210->debug_dir, bus, create_debug_files()
870 if (!debugfs_create_file("periodic", S_IRUGO, fotg210->debug_dir, bus, create_debug_files()
874 if (!debugfs_create_file("registers", S_IRUGO, fotg210->debug_dir, bus, create_debug_files()
881 debugfs_remove_recursive(fotg210->debug_dir); create_debug_files()
884 static inline void remove_debug_files(struct fotg210_hcd *fotg210) remove_debug_files() argument
886 debugfs_remove_recursive(fotg210->debug_dir); remove_debug_files()
905 static int handshake(struct fotg210_hcd *fotg210, void __iomem *ptr, handshake() argument
911 result = fotg210_readl(fotg210, ptr); handshake()
926 static int fotg210_halt(struct fotg210_hcd *fotg210) fotg210_halt() argument
930 spin_lock_irq(&fotg210->lock); fotg210_halt()
933 fotg210_writel(fotg210, 0, &fotg210->regs->intr_enable); fotg210_halt()
936 * This routine gets called during probe before fotg210->command fotg210_halt()
939 fotg210->command &= ~CMD_RUN; fotg210_halt()
940 temp = fotg210_readl(fotg210, &fotg210->regs->command); fotg210_halt()
942 fotg210_writel(fotg210, temp, &fotg210->regs->command); fotg210_halt()
944 spin_unlock_irq(&fotg210->lock); fotg210_halt()
945 synchronize_irq(fotg210_to_hcd(fotg210)->irq); fotg210_halt()
947 return handshake(fotg210, &fotg210->regs->status, fotg210_halt()
954 static int fotg210_reset(struct fotg210_hcd *fotg210) fotg210_reset() argument
957 u32 command = fotg210_readl(fotg210, &fotg210->regs->command); fotg210_reset()
962 if (fotg210->debug && !dbgp_reset_prep(fotg210_to_hcd(fotg210))) fotg210_reset()
963 fotg210->debug = NULL; fotg210_reset()
966 dbg_cmd(fotg210, "reset", command); fotg210_reset()
967 fotg210_writel(fotg210, command, &fotg210->regs->command); fotg210_reset()
968 fotg210->rh_state = FOTG210_RH_HALTED; fotg210_reset()
969 fotg210->next_statechange = jiffies; fotg210_reset()
970 retval = handshake(fotg210, &fotg210->regs->command, fotg210_reset()
976 if (fotg210->debug) fotg210_reset()
977 dbgp_external_startup(fotg210_to_hcd(fotg210)); fotg210_reset()
979 fotg210->port_c_suspend = fotg210->suspended_ports = fotg210_reset()
980 fotg210->resuming_ports = 0; fotg210_reset()
987 static void fotg210_quiesce(struct fotg210_hcd *fotg210) fotg210_quiesce() argument
991 if (fotg210->rh_state != FOTG210_RH_RUNNING) fotg210_quiesce()
995 temp = (fotg210->command << 10) & (STS_ASS | STS_PSS); fotg210_quiesce()
996 handshake(fotg210, &fotg210->regs->status, STS_ASS | STS_PSS, temp, fotg210_quiesce()
1000 spin_lock_irq(&fotg210->lock); fotg210_quiesce()
1001 fotg210->command &= ~(CMD_ASE | CMD_PSE); fotg210_quiesce()
1002 fotg210_writel(fotg210, fotg210->command, &fotg210->regs->command); fotg210_quiesce()
1003 spin_unlock_irq(&fotg210->lock); fotg210_quiesce()
1006 handshake(fotg210, &fotg210->regs->status, STS_ASS | STS_PSS, 0, fotg210_quiesce()
1010 static void end_unlink_async(struct fotg210_hcd *fotg210);
1011 static void unlink_empty_async(struct fotg210_hcd *fotg210);
1012 static void fotg210_work(struct fotg210_hcd *fotg210);
1013 static void start_unlink_intr(struct fotg210_hcd *fotg210,
1015 static void end_unlink_intr(struct fotg210_hcd *fotg210, struct fotg210_qh *qh);
1018 static void fotg210_set_command_bit(struct fotg210_hcd *fotg210, u32 bit) fotg210_set_command_bit() argument
1020 fotg210->command |= bit; fotg210_set_command_bit()
1021 fotg210_writel(fotg210, fotg210->command, &fotg210->regs->command); fotg210_set_command_bit()
1024 fotg210_readl(fotg210, &fotg210->regs->command); fotg210_set_command_bit()
1028 static void fotg210_clear_command_bit(struct fotg210_hcd *fotg210, u32 bit) fotg210_clear_command_bit() argument
1030 fotg210->command &= ~bit; fotg210_clear_command_bit()
1031 fotg210_writel(fotg210, fotg210->command, &fotg210->regs->command); fotg210_clear_command_bit()
1034 fotg210_readl(fotg210, &fotg210->regs->command); fotg210_clear_command_bit()
1039 * Lots of different events are triggered from fotg210->hrtimer. Whenever
1043 * fotg210->enabled_hrtimer_events, and they are numbered in order of
1048 * fotg210->next_hrtimer_event. Whenever fotg210->hrtimer gets restarted, its
1061 * the event types indexed by enum fotg210_hrtimer_event in fotg210.h.
1077 static void fotg210_enable_event(struct fotg210_hcd *fotg210, unsigned event, fotg210_enable_event() argument
1080 ktime_t *timeout = &fotg210->hr_timeouts[event]; fotg210_enable_event()
1085 fotg210->enabled_hrtimer_events |= (1 << event); fotg210_enable_event()
1088 if (event < fotg210->next_hrtimer_event) { fotg210_enable_event()
1089 fotg210->next_hrtimer_event = event; fotg210_enable_event()
1090 hrtimer_start_range_ns(&fotg210->hrtimer, *timeout, fotg210_enable_event()
1097 static void fotg210_poll_ASS(struct fotg210_hcd *fotg210) fotg210_poll_ASS() argument
1102 if (fotg210->rh_state != FOTG210_RH_RUNNING) fotg210_poll_ASS()
1105 want = (fotg210->command & CMD_ASE) ? STS_ASS : 0; fotg210_poll_ASS()
1106 actual = fotg210_readl(fotg210, &fotg210->regs->status) & STS_ASS; fotg210_poll_ASS()
1111 if (fotg210->ASS_poll_count++ < 20) { fotg210_poll_ASS()
1112 fotg210_enable_event(fotg210, FOTG210_HRTIMER_POLL_ASS, fotg210_poll_ASS()
1116 fotg210_dbg(fotg210, "Waited too long for the async schedule status (%x/%x), giving up\n", fotg210_poll_ASS()
1119 fotg210->ASS_poll_count = 0; fotg210_poll_ASS()
1123 if (fotg210->async_count > 0) fotg210_poll_ASS()
1124 fotg210_set_command_bit(fotg210, CMD_ASE); fotg210_poll_ASS()
1127 if (fotg210->async_count == 0) { fotg210_poll_ASS()
1130 fotg210_enable_event(fotg210, fotg210_poll_ASS()
1138 static void fotg210_disable_ASE(struct fotg210_hcd *fotg210) fotg210_disable_ASE() argument
1140 fotg210_clear_command_bit(fotg210, CMD_ASE); fotg210_disable_ASE()
1145 static void fotg210_poll_PSS(struct fotg210_hcd *fotg210) fotg210_poll_PSS() argument
1150 if (fotg210->rh_state != FOTG210_RH_RUNNING) fotg210_poll_PSS()
1153 want = (fotg210->command & CMD_PSE) ? STS_PSS : 0; fotg210_poll_PSS()
1154 actual = fotg210_readl(fotg210, &fotg210->regs->status) & STS_PSS; fotg210_poll_PSS()
1159 if (fotg210->PSS_poll_count++ < 20) { fotg210_poll_PSS()
1160 fotg210_enable_event(fotg210, FOTG210_HRTIMER_POLL_PSS, fotg210_poll_PSS()
1164 fotg210_dbg(fotg210, "Waited too long for the periodic schedule status (%x/%x), giving up\n", fotg210_poll_PSS()
1167 fotg210->PSS_poll_count = 0; fotg210_poll_PSS()
1171 if (fotg210->periodic_count > 0) fotg210_poll_PSS()
1172 fotg210_set_command_bit(fotg210, CMD_PSE); fotg210_poll_PSS()
1175 if (fotg210->periodic_count == 0) { fotg210_poll_PSS()
1178 fotg210_enable_event(fotg210, fotg210_poll_PSS()
1186 static void fotg210_disable_PSE(struct fotg210_hcd *fotg210) fotg210_disable_PSE() argument
1188 fotg210_clear_command_bit(fotg210, CMD_PSE); fotg210_disable_PSE()
1193 static void fotg210_handle_controller_death(struct fotg210_hcd *fotg210) fotg210_handle_controller_death() argument
1195 if (!(fotg210_readl(fotg210, &fotg210->regs->status) & STS_HALT)) { fotg210_handle_controller_death()
1198 if (fotg210->died_poll_count++ < 5) { fotg210_handle_controller_death()
1200 fotg210_enable_event(fotg210, fotg210_handle_controller_death()
1204 fotg210_warn(fotg210, "Waited too long for the controller to stop, giving up\n"); fotg210_handle_controller_death()
1208 fotg210->rh_state = FOTG210_RH_HALTED; fotg210_handle_controller_death()
1209 fotg210_writel(fotg210, 0, &fotg210->regs->intr_enable); fotg210_handle_controller_death()
1210 fotg210_work(fotg210); fotg210_handle_controller_death()
1211 end_unlink_async(fotg210); fotg210_handle_controller_death()
1218 static void fotg210_handle_intr_unlinks(struct fotg210_hcd *fotg210) fotg210_handle_intr_unlinks() argument
1220 bool stopped = (fotg210->rh_state < FOTG210_RH_RUNNING); fotg210_handle_intr_unlinks()
1229 fotg210->intr_unlinking = true; fotg210_handle_intr_unlinks()
1230 while (fotg210->intr_unlink) { fotg210_handle_intr_unlinks()
1231 struct fotg210_qh *qh = fotg210->intr_unlink; fotg210_handle_intr_unlinks()
1233 if (!stopped && qh->unlink_cycle == fotg210->intr_unlink_cycle) fotg210_handle_intr_unlinks()
1235 fotg210->intr_unlink = qh->unlink_next; fotg210_handle_intr_unlinks()
1237 end_unlink_intr(fotg210, qh); fotg210_handle_intr_unlinks()
1241 if (fotg210->intr_unlink) { fotg210_handle_intr_unlinks()
1242 fotg210_enable_event(fotg210, FOTG210_HRTIMER_UNLINK_INTR, fotg210_handle_intr_unlinks()
1244 ++fotg210->intr_unlink_cycle; fotg210_handle_intr_unlinks()
1246 fotg210->intr_unlinking = false; fotg210_handle_intr_unlinks()
1251 static void start_free_itds(struct fotg210_hcd *fotg210) start_free_itds() argument
1253 if (!(fotg210->enabled_hrtimer_events & start_free_itds()
1255 fotg210->last_itd_to_free = list_entry( start_free_itds()
1256 fotg210->cached_itd_list.prev, start_free_itds()
1258 fotg210_enable_event(fotg210, FOTG210_HRTIMER_FREE_ITDS, true); start_free_itds()
1263 static void end_free_itds(struct fotg210_hcd *fotg210) end_free_itds() argument
1267 if (fotg210->rh_state < FOTG210_RH_RUNNING) end_free_itds()
1268 fotg210->last_itd_to_free = NULL; end_free_itds()
1270 list_for_each_entry_safe(itd, n, &fotg210->cached_itd_list, itd_list) { end_free_itds()
1272 dma_pool_free(fotg210->itd_pool, itd, itd->itd_dma); end_free_itds()
1273 if (itd == fotg210->last_itd_to_free) end_free_itds()
1277 if (!list_empty(&fotg210->cached_itd_list)) end_free_itds()
1278 start_free_itds(fotg210); end_free_itds()
1283 static void fotg210_iaa_watchdog(struct fotg210_hcd *fotg210) fotg210_iaa_watchdog() argument
1285 if (fotg210->rh_state != FOTG210_RH_RUNNING) fotg210_iaa_watchdog()
1294 if (fotg210->async_iaa) { fotg210_iaa_watchdog()
1303 cmd = fotg210_readl(fotg210, &fotg210->regs->command); fotg210_iaa_watchdog()
1312 status = fotg210_readl(fotg210, &fotg210->regs->status); fotg210_iaa_watchdog()
1314 COUNT(fotg210->stats.lost_iaa); fotg210_iaa_watchdog()
1315 fotg210_writel(fotg210, STS_IAA, fotg210_iaa_watchdog()
1316 &fotg210->regs->status); fotg210_iaa_watchdog()
1319 fotg210_dbg(fotg210, "IAA watchdog: status %x cmd %x\n", fotg210_iaa_watchdog()
1321 end_unlink_async(fotg210); fotg210_iaa_watchdog()
1327 static void turn_on_io_watchdog(struct fotg210_hcd *fotg210) turn_on_io_watchdog() argument
1330 if (fotg210->rh_state != FOTG210_RH_RUNNING || turn_on_io_watchdog()
1331 (fotg210->enabled_hrtimer_events & turn_on_io_watchdog()
1339 if (fotg210->isoc_count > 0 || (fotg210->need_io_watchdog && turn_on_io_watchdog()
1340 fotg210->async_count + fotg210->intr_count > 0)) turn_on_io_watchdog()
1341 fotg210_enable_event(fotg210, FOTG210_HRTIMER_IO_WATCHDOG, turn_on_io_watchdog()
1348 * enum fotg210_hrtimer_event in fotg210.h.
1365 struct fotg210_hcd *fotg210 = fotg210_hrtimer_func() local
1372 spin_lock_irqsave(&fotg210->lock, flags); fotg210_hrtimer_func()
1374 events = fotg210->enabled_hrtimer_events; fotg210_hrtimer_func()
1375 fotg210->enabled_hrtimer_events = 0; fotg210_hrtimer_func()
1376 fotg210->next_hrtimer_event = FOTG210_HRTIMER_NO_EVENT; fotg210_hrtimer_func()
1384 if (now.tv64 >= fotg210->hr_timeouts[e].tv64) fotg210_hrtimer_func()
1385 event_handlers[e](fotg210); fotg210_hrtimer_func()
1387 fotg210_enable_event(fotg210, e, false); fotg210_hrtimer_func()
1390 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_hrtimer_func()
1397 static int check_reset_complete(struct fotg210_hcd *fotg210, int index, check_reset_complete() argument
1406 fotg210_dbg(fotg210, "Failed to enable port %d on root hub TT\n", check_reset_complete()
1409 fotg210_dbg(fotg210, "port %d reset complete, port enabled\n", check_reset_complete()
1420 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_hub_status_data() local
1432 status = fotg210->resuming_ports; fotg210_hub_status_data()
1440 spin_lock_irqsave(&fotg210->lock, flags); fotg210_hub_status_data()
1442 temp = fotg210_readl(fotg210, &fotg210->regs->port_status); fotg210_hub_status_data()
1451 if ((temp & mask) != 0 || test_bit(0, &fotg210->port_c_suspend) || fotg210_hub_status_data()
1452 (fotg210->reset_done[0] && fotg210_hub_status_data()
1453 time_after_eq(jiffies, fotg210->reset_done[0]))) { fotg210_hub_status_data()
1458 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_hub_status_data()
1462 static void fotg210_hub_descriptor(struct fotg210_hcd *fotg210, fotg210_hub_descriptor() argument
1465 int ports = HCS_N_PORTS(fotg210->hcs_params); fotg210_hub_descriptor()
1469 desc->bPwrOn2PwrGood = 10; /* fotg210 1.0, 2.3.9 says 20ms max */ fotg210_hub_descriptor()
1488 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_hub_control() local
1489 int ports = HCS_N_PORTS(fotg210->hcs_params); fotg210_hub_control()
1490 u32 __iomem *status_reg = &fotg210->regs->port_status; fotg210_hub_control()
1503 spin_lock_irqsave(&fotg210->lock, flags); fotg210_hub_control()
1519 temp = fotg210_readl(fotg210, status_reg); fotg210_hub_control()
1531 fotg210_writel(fotg210, temp & ~PORT_PE, status_reg); fotg210_hub_control()
1534 fotg210_writel(fotg210, temp | PORT_PEC, status_reg); fotg210_hub_control()
1545 fotg210_writel(fotg210, temp | PORT_RESUME, status_reg); fotg210_hub_control()
1546 fotg210->reset_done[wIndex] = jiffies fotg210_hub_control()
1550 clear_bit(wIndex, &fotg210->port_c_suspend); fotg210_hub_control()
1553 fotg210_writel(fotg210, temp | PORT_CSC, status_reg); fotg210_hub_control()
1556 fotg210_writel(fotg210, temp | OTGISR_OVC, fotg210_hub_control()
1557 &fotg210->regs->otgisr); fotg210_hub_control()
1565 fotg210_readl(fotg210, &fotg210->regs->command); fotg210_hub_control()
1568 fotg210_hub_descriptor(fotg210, (struct usb_hub_descriptor *) fotg210_hub_control()
1581 temp = fotg210_readl(fotg210, status_reg); fotg210_hub_control()
1589 temp1 = fotg210_readl(fotg210, &fotg210->regs->otgisr); fotg210_hub_control()
1597 if (!fotg210->reset_done[wIndex]) { fotg210_hub_control()
1599 fotg210->reset_done[wIndex] = jiffies fotg210_hub_control()
1602 mod_timer(&fotg210_to_hcd(fotg210)->rh_timer, fotg210_hub_control()
1603 fotg210->reset_done[wIndex]); fotg210_hub_control()
1608 fotg210->reset_done[wIndex])) { fotg210_hub_control()
1609 clear_bit(wIndex, &fotg210->suspended_ports); fotg210_hub_control()
1610 set_bit(wIndex, &fotg210->port_c_suspend); fotg210_hub_control()
1611 fotg210->reset_done[wIndex] = 0; fotg210_hub_control()
1614 temp = fotg210_readl(fotg210, status_reg); fotg210_hub_control()
1615 fotg210_writel(fotg210, temp & fotg210_hub_control()
1618 clear_bit(wIndex, &fotg210->resuming_ports); fotg210_hub_control()
1619 retval = handshake(fotg210, status_reg, fotg210_hub_control()
1622 fotg210_err(fotg210, fotg210_hub_control()
1633 fotg210->reset_done[wIndex])) { fotg210_hub_control()
1635 fotg210->reset_done[wIndex] = 0; fotg210_hub_control()
1636 clear_bit(wIndex, &fotg210->resuming_ports); fotg210_hub_control()
1639 fotg210_writel(fotg210, fotg210_hub_control()
1645 retval = handshake(fotg210, status_reg, fotg210_hub_control()
1648 fotg210_err(fotg210, "port %d reset error %d\n", fotg210_hub_control()
1654 temp = check_reset_complete(fotg210, wIndex, status_reg, fotg210_hub_control()
1655 fotg210_readl(fotg210, status_reg)); fotg210_hub_control()
1659 fotg210->reset_done[wIndex] = 0; fotg210_hub_control()
1660 clear_bit(wIndex, &fotg210->resuming_ports); fotg210_hub_control()
1665 test_bit(wIndex, &fotg210->companion_ports)) { fotg210_hub_control()
1667 fotg210_writel(fotg210, temp, status_reg); fotg210_hub_control()
1668 fotg210_dbg(fotg210, "port %d --> companion\n", fotg210_hub_control()
1670 temp = fotg210_readl(fotg210, status_reg); fotg210_hub_control()
1681 status |= fotg210_port_speed(fotg210, temp); fotg210_hub_control()
1689 } else if (test_bit(wIndex, &fotg210->suspended_ports)) { fotg210_hub_control()
1690 clear_bit(wIndex, &fotg210->suspended_ports); fotg210_hub_control()
1691 clear_bit(wIndex, &fotg210->resuming_ports); fotg210_hub_control()
1692 fotg210->reset_done[wIndex] = 0; fotg210_hub_control()
1694 set_bit(wIndex, &fotg210->port_c_suspend); fotg210_hub_control()
1697 temp1 = fotg210_readl(fotg210, &fotg210->regs->otgisr); fotg210_hub_control()
1702 if (test_bit(wIndex, &fotg210->port_c_suspend)) fotg210_hub_control()
1706 dbg_port(fotg210, "GetStatus", wIndex + 1, temp); fotg210_hub_control()
1726 temp = fotg210_readl(fotg210, status_reg); fotg210_hub_control()
1738 fotg210_writel(fotg210, temp | PORT_SUSPEND, fotg210_hub_control()
1740 set_bit(wIndex, &fotg210->suspended_ports); fotg210_hub_control()
1749 fotg210_dbg(fotg210, "port %d reset\n", wIndex + 1); fotg210_hub_control()
1757 fotg210->reset_done[wIndex] = jiffies fotg210_hub_control()
1759 fotg210_writel(fotg210, temp, status_reg); fotg210_hub_control()
1771 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_hub_control()
1772 fotg210_quiesce(fotg210); fotg210_hub_control()
1773 spin_lock_irqsave(&fotg210->lock, flags); fotg210_hub_control()
1776 temp = fotg210_readl(fotg210, status_reg) & fotg210_hub_control()
1779 fotg210_writel(fotg210, temp | PORT_SUSPEND, fotg210_hub_control()
1782 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_hub_control()
1783 fotg210_halt(fotg210); fotg210_hub_control()
1784 spin_lock_irqsave(&fotg210->lock, flags); fotg210_hub_control()
1786 temp = fotg210_readl(fotg210, status_reg); fotg210_hub_control()
1788 fotg210_writel(fotg210, temp, status_reg); fotg210_hub_control()
1794 fotg210_readl(fotg210, &fotg210->regs->command); fotg210_hub_control()
1802 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_hub_control()
1829 static inline void fotg210_qtd_init(struct fotg210_hcd *fotg210, fotg210_qtd_init() argument
1834 qtd->hw_token = cpu_to_hc32(fotg210, QTD_STS_HALT); fotg210_qtd_init()
1835 qtd->hw_next = FOTG210_LIST_END(fotg210); fotg210_qtd_init()
1836 qtd->hw_alt_next = FOTG210_LIST_END(fotg210); fotg210_qtd_init()
1840 static struct fotg210_qtd *fotg210_qtd_alloc(struct fotg210_hcd *fotg210, fotg210_qtd_alloc() argument
1846 qtd = dma_pool_alloc(fotg210->qtd_pool, flags, &dma); fotg210_qtd_alloc()
1848 fotg210_qtd_init(fotg210, qtd, dma); fotg210_qtd_alloc()
1853 static inline void fotg210_qtd_free(struct fotg210_hcd *fotg210, fotg210_qtd_free() argument
1856 dma_pool_free(fotg210->qtd_pool, qtd, qtd->qtd_dma); fotg210_qtd_free()
1860 static void qh_destroy(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) qh_destroy() argument
1864 fotg210_dbg(fotg210, "unused qh not empty!\n"); qh_destroy()
1868 fotg210_qtd_free(fotg210, qh->dummy); qh_destroy()
1869 dma_pool_free(fotg210->qh_pool, qh->hw, qh->qh_dma); qh_destroy()
1873 static struct fotg210_qh *fotg210_qh_alloc(struct fotg210_hcd *fotg210, fotg210_qh_alloc() argument
1883 dma_pool_alloc(fotg210->qh_pool, flags, &dma); fotg210_qh_alloc()
1891 qh->dummy = fotg210_qtd_alloc(fotg210, flags); fotg210_qh_alloc()
1893 fotg210_dbg(fotg210, "no dummy td\n"); fotg210_qh_alloc()
1899 dma_pool_free(fotg210->qh_pool, qh->hw, qh->qh_dma); fotg210_qh_alloc()
1910 static void fotg210_mem_cleanup(struct fotg210_hcd *fotg210) fotg210_mem_cleanup() argument
1912 if (fotg210->async) fotg210_mem_cleanup()
1913 qh_destroy(fotg210, fotg210->async); fotg210_mem_cleanup()
1914 fotg210->async = NULL; fotg210_mem_cleanup()
1916 if (fotg210->dummy) fotg210_mem_cleanup()
1917 qh_destroy(fotg210, fotg210->dummy); fotg210_mem_cleanup()
1918 fotg210->dummy = NULL; fotg210_mem_cleanup()
1921 dma_pool_destroy(fotg210->qtd_pool); fotg210_mem_cleanup()
1922 fotg210->qtd_pool = NULL; fotg210_mem_cleanup()
1924 dma_pool_destroy(fotg210->qh_pool); fotg210_mem_cleanup()
1925 fotg210->qh_pool = NULL; fotg210_mem_cleanup()
1927 dma_pool_destroy(fotg210->itd_pool); fotg210_mem_cleanup()
1928 fotg210->itd_pool = NULL; fotg210_mem_cleanup()
1930 if (fotg210->periodic) fotg210_mem_cleanup()
1931 dma_free_coherent(fotg210_to_hcd(fotg210)->self.controller, fotg210_mem_cleanup()
1932 fotg210->periodic_size * sizeof(u32), fotg210_mem_cleanup()
1933 fotg210->periodic, fotg210->periodic_dma); fotg210_mem_cleanup()
1934 fotg210->periodic = NULL; fotg210_mem_cleanup()
1937 kfree(fotg210->pshadow); fotg210_mem_cleanup()
1938 fotg210->pshadow = NULL; fotg210_mem_cleanup()
1942 static int fotg210_mem_init(struct fotg210_hcd *fotg210, gfp_t flags) fotg210_mem_init() argument
1947 fotg210->qtd_pool = dma_pool_create("fotg210_qtd", fotg210_mem_init()
1948 fotg210_to_hcd(fotg210)->self.controller, fotg210_mem_init()
1952 if (!fotg210->qtd_pool) fotg210_mem_init()
1956 fotg210->qh_pool = dma_pool_create("fotg210_qh", fotg210_mem_init()
1957 fotg210_to_hcd(fotg210)->self.controller, fotg210_mem_init()
1961 if (!fotg210->qh_pool) fotg210_mem_init()
1964 fotg210->async = fotg210_qh_alloc(fotg210, flags); fotg210_mem_init()
1965 if (!fotg210->async) fotg210_mem_init()
1969 fotg210->itd_pool = dma_pool_create("fotg210_itd", fotg210_mem_init()
1970 fotg210_to_hcd(fotg210)->self.controller, fotg210_mem_init()
1974 if (!fotg210->itd_pool) fotg210_mem_init()
1978 fotg210->periodic = (__le32 *) fotg210_mem_init()
1979 dma_alloc_coherent(fotg210_to_hcd(fotg210)->self.controller, fotg210_mem_init()
1980 fotg210->periodic_size * sizeof(__le32), fotg210_mem_init()
1981 &fotg210->periodic_dma, 0); fotg210_mem_init()
1982 if (fotg210->periodic == NULL) fotg210_mem_init()
1985 for (i = 0; i < fotg210->periodic_size; i++) fotg210_mem_init()
1986 fotg210->periodic[i] = FOTG210_LIST_END(fotg210); fotg210_mem_init()
1989 fotg210->pshadow = kcalloc(fotg210->periodic_size, sizeof(void *), fotg210_mem_init()
1991 if (fotg210->pshadow != NULL) fotg210_mem_init()
1995 fotg210_dbg(fotg210, "couldn't init memory\n"); fotg210_mem_init()
1996 fotg210_mem_cleanup(fotg210); fotg210_mem_init()
2017 static int qtd_fill(struct fotg210_hcd *fotg210, struct fotg210_qtd *qtd, qtd_fill() argument
2024 qtd->hw_buf[0] = cpu_to_hc32(fotg210, (u32)addr); qtd_fill()
2025 qtd->hw_buf_hi[0] = cpu_to_hc32(fotg210, (u32)(addr >> 32)); qtd_fill()
2036 qtd->hw_buf[i] = cpu_to_hc32(fotg210, (u32)addr); qtd_fill()
2037 qtd->hw_buf_hi[i] = cpu_to_hc32(fotg210, qtd_fill()
2050 qtd->hw_token = cpu_to_hc32(fotg210, (count << 16) | token); qtd_fill()
2056 static inline void qh_update(struct fotg210_hcd *fotg210, qh_update() argument
2064 hw->hw_qtd_next = QTD_NEXT(fotg210, qtd->qtd_dma); qh_update()
2065 hw->hw_alt_next = FOTG210_LIST_END(fotg210); qh_update()
2072 if (!(hw->hw_info1 & cpu_to_hc32(fotg210, QH_TOGGLE_CTL))) { qh_update()
2076 epnum = (hc32_to_cpup(fotg210, &hw->hw_info1) >> 8) & 0x0f; qh_update()
2078 hw->hw_token &= ~cpu_to_hc32(fotg210, QTD_TOGGLE); qh_update()
2083 hw->hw_token &= cpu_to_hc32(fotg210, QTD_TOGGLE | QTD_STS_PING); qh_update()
2090 static void qh_refresh(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) qh_refresh() argument
2106 if (cpu_to_hc32(fotg210, qtd->qtd_dma) == qh->hw->hw_current) { qh_refresh()
2113 qh_update(fotg210, qh, qtd); qh_refresh()
2116 static void qh_link_async(struct fotg210_hcd *fotg210, struct fotg210_qh *qh);
2121 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_clear_tt_buffer_complete() local
2125 spin_lock_irqsave(&fotg210->lock, flags); fotg210_clear_tt_buffer_complete()
2128 && fotg210->rh_state == FOTG210_RH_RUNNING) fotg210_clear_tt_buffer_complete()
2129 qh_link_async(fotg210, qh); fotg210_clear_tt_buffer_complete()
2130 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_clear_tt_buffer_complete()
2133 static void fotg210_clear_tt_buffer(struct fotg210_hcd *fotg210, fotg210_clear_tt_buffer() argument
2152 fotg210_to_hcd(fotg210)->self.root_hub) { fotg210_clear_tt_buffer()
2159 static int qtd_copy_status(struct fotg210_hcd *fotg210, struct urb *urb, qtd_copy_status() argument
2198 fotg210_dbg(fotg210, "devpath %s ep%d%s 3strikes\n", qtd_copy_status()
2207 fotg210_dbg(fotg210, qtd_copy_status()
2218 static void fotg210_urb_done(struct fotg210_hcd *fotg210, struct urb *urb,
2220 __releases(fotg210->lock)
2221 __acquires(fotg210->lock)
2227 if ((qh->hw->hw_info2 & cpu_to_hc32(fotg210, QH_SMASK)) != 0) {
2230 fotg210_to_hcd(fotg210)->self.bandwidth_int_reqs--;
2235 COUNT(fotg210->stats.unlink);
2240 COUNT(fotg210->stats.complete);
2244 fotg210_dbg(fotg210,
2254 usb_hcd_unlink_urb_from_ep(fotg210_to_hcd(fotg210), urb);
2255 spin_unlock(&fotg210->lock);
2256 usb_hcd_giveback_urb(fotg210_to_hcd(fotg210), urb, status);
2257 spin_lock(&fotg210->lock);
2260 static int qh_schedule(struct fotg210_hcd *fotg210, struct fotg210_qh *qh);
2266 static unsigned qh_completions(struct fotg210_hcd *fotg210, qh_completions() argument
2315 fotg210_urb_done(fotg210, last->urb, qh_completions()
2320 fotg210_qtd_free(fotg210, last); qh_completions()
2330 token = hc32_to_cpu(fotg210, qtd->hw_token); qh_completions()
2338 fotg210_dbg(fotg210, qh_completions()
2357 fotg210_dbg(fotg210, qh_completions()
2371 qtd->hw_token = cpu_to_hc32(fotg210, qh_completions()
2374 hw->hw_token = cpu_to_hc32(fotg210, qh_completions()
2391 FOTG210_LIST_END(fotg210))) { qh_completions()
2397 && fotg210->rh_state >= FOTG210_RH_RUNNING)) { qh_completions()
2405 if (fotg210->rh_state < FOTG210_RH_RUNNING) qh_completions()
2416 cpu_to_hc32(fotg210, qtd->qtd_dma) qh_completions()
2418 token = hc32_to_cpu(fotg210, hw->hw_token); qh_completions()
2424 fotg210_clear_tt_buffer(fotg210, qh, urb, qh_completions()
2437 last_status = qtd_copy_status(fotg210, urb, qh_completions()
2441 FOTG210_LIST_END(fotg210))) qh_completions()
2459 fotg210_clear_tt_buffer(fotg210, qh, qh_completions()
2483 fotg210_urb_done(fotg210, last->urb, last_status); qh_completions()
2485 fotg210_qtd_free(fotg210, last); qh_completions()
2510 if (stopped != 0 || hw->hw_qtd_next == FOTG210_LIST_END(fotg210)) { qh_completions()
2513 qh_refresh(fotg210, qh); qh_completions()
2546 static void qtd_list_free(struct fotg210_hcd *fotg210, struct urb *urb, qtd_list_free() argument
2556 fotg210_qtd_free(fotg210, qtd); list_for_each_safe()
2562 static struct list_head *qh_urb_transaction(struct fotg210_hcd *fotg210, qh_urb_transaction() argument
2576 qtd = fotg210_qtd_alloc(fotg210, flags); qh_urb_transaction()
2590 qtd_fill(fotg210, qtd, urb->setup_dma, qh_urb_transaction()
2597 qtd = fotg210_qtd_alloc(fotg210, flags); qh_urb_transaction()
2601 qtd_prev->hw_next = QTD_NEXT(fotg210, qtd->qtd_dma); qh_urb_transaction()
2641 this_qtd_len = qtd_fill(fotg210, qtd, buf, this_sg_len, token, qh_urb_transaction()
2653 qtd->hw_alt_next = fotg210->async->hw->hw_alt_next; qh_urb_transaction()
2668 qtd = fotg210_qtd_alloc(fotg210, flags); qh_urb_transaction()
2672 qtd_prev->hw_next = QTD_NEXT(fotg210, qtd->qtd_dma); qh_urb_transaction()
2683 qtd->hw_alt_next = FOTG210_LIST_END(fotg210); qh_urb_transaction()
2704 qtd = fotg210_qtd_alloc(fotg210, flags); qh_urb_transaction()
2708 qtd_prev->hw_next = QTD_NEXT(fotg210, qtd->qtd_dma); qh_urb_transaction()
2712 qtd_fill(fotg210, qtd, 0, 0, token, 0); qh_urb_transaction()
2718 qtd->hw_token |= cpu_to_hc32(fotg210, QTD_IOC); qh_urb_transaction()
2722 qtd_list_free(fotg210, urb, head); qh_urb_transaction()
2741 static struct fotg210_qh *qh_make(struct fotg210_hcd *fotg210, struct urb *urb, qh_make() argument
2744 struct fotg210_qh *qh = fotg210_qh_alloc(fotg210, flags); qh_make()
2768 fotg210_dbg(fotg210, "bogus qh maxpacket %d\n", qh_make()
2798 } else if (qh->period > fotg210->periodic_size) { qh_make()
2799 qh->period = fotg210->periodic_size; qh_make()
2823 if (qh->period > fotg210->periodic_size) { qh_make()
2824 qh->period = fotg210->periodic_size; qh_make()
2854 if (fotg210_has_fsl_portno_bug(fotg210)) qh_make()
2862 if (tt && tt->hub != fotg210_to_hcd(fotg210)->self.root_hub) qh_make()
2892 fotg210_dbg(fotg210, "bogus dev %p speed %d\n", urb->dev, qh_make()
2895 qh_destroy(fotg210, qh); qh_make()
2904 hw->hw_info1 = cpu_to_hc32(fotg210, info1); qh_make()
2905 hw->hw_info2 = cpu_to_hc32(fotg210, info2); qh_make()
2908 qh_refresh(fotg210, qh); qh_make()
2912 static void enable_async(struct fotg210_hcd *fotg210) enable_async() argument
2914 if (fotg210->async_count++) enable_async()
2918 fotg210->enabled_hrtimer_events &= ~BIT(FOTG210_HRTIMER_DISABLE_ASYNC); enable_async()
2921 fotg210_poll_ASS(fotg210); enable_async()
2922 turn_on_io_watchdog(fotg210); enable_async()
2925 static void disable_async(struct fotg210_hcd *fotg210) disable_async() argument
2927 if (--fotg210->async_count) disable_async()
2931 WARN_ON(fotg210->async->qh_next.qh || fotg210->async_unlink); disable_async()
2934 fotg210_poll_ASS(fotg210); disable_async()
2939 static void qh_link_async(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) qh_link_async() argument
2941 __hc32 dma = QH_NEXT(fotg210, qh->qh_dma); qh_link_async()
2951 qh_refresh(fotg210, qh); qh_link_async()
2954 head = fotg210->async; qh_link_async()
2966 enable_async(fotg210); qh_link_async()
2974 static struct fotg210_qh *qh_append_tds(struct fotg210_hcd *fotg210, qh_append_tds() argument
2979 __hc32 qh_addr_mask = cpu_to_hc32(fotg210, 0x7f); qh_append_tds()
2983 /* can't sleep here, we have fotg210->lock... */ qh_append_tds()
2984 qh = qh_make(fotg210, urb, GFP_ATOMIC); qh_append_tds()
3017 qtd->hw_token = HALT_BIT(fotg210); qh_append_tds()
3029 fotg210_qtd_init(fotg210, qtd, qtd->qtd_dma); qh_append_tds()
3036 qtd->hw_next = QTD_NEXT(fotg210, dma); qh_append_tds()
3048 static int submit_async(struct fotg210_hcd *fotg210, struct urb *urb, submit_async() argument
3063 fotg210_dbg(fotg210, submit_async()
3073 spin_lock_irqsave(&fotg210->lock, flags); submit_async()
3074 if (unlikely(!HCD_HW_ACCESSIBLE(fotg210_to_hcd(fotg210)))) { submit_async()
3078 rc = usb_hcd_link_urb_to_ep(fotg210_to_hcd(fotg210), urb); submit_async()
3082 qh = qh_append_tds(fotg210, urb, qtd_list, epnum, &urb->ep->hcpriv); submit_async()
3084 usb_hcd_unlink_urb_from_ep(fotg210_to_hcd(fotg210), urb); submit_async()
3093 qh_link_async(fotg210, qh); submit_async()
3095 spin_unlock_irqrestore(&fotg210->lock, flags); submit_async()
3097 qtd_list_free(fotg210, urb, qtd_list); submit_async()
3101 static void single_unlink_async(struct fotg210_hcd *fotg210, single_unlink_async() argument
3108 if (fotg210->async_unlink) single_unlink_async()
3109 fotg210->async_unlink_last->unlink_next = qh; single_unlink_async()
3111 fotg210->async_unlink = qh; single_unlink_async()
3112 fotg210->async_unlink_last = qh; single_unlink_async()
3115 prev = fotg210->async; single_unlink_async()
3121 if (fotg210->qh_scan_next == qh) single_unlink_async()
3122 fotg210->qh_scan_next = qh->qh_next.qh; single_unlink_async()
3125 static void start_iaa_cycle(struct fotg210_hcd *fotg210, bool nested) start_iaa_cycle() argument
3131 if (fotg210->async_iaa || fotg210->async_unlinking) start_iaa_cycle()
3135 fotg210->async_iaa = fotg210->async_unlink; start_iaa_cycle()
3136 fotg210->async_unlink = NULL; start_iaa_cycle()
3139 if (unlikely(fotg210->rh_state < FOTG210_RH_RUNNING)) { start_iaa_cycle()
3141 end_unlink_async(fotg210); start_iaa_cycle()
3144 } else if (likely(fotg210->rh_state == FOTG210_RH_RUNNING)) { start_iaa_cycle()
3148 fotg210_writel(fotg210, fotg210->command | CMD_IAAD, start_iaa_cycle()
3149 &fotg210->regs->command); start_iaa_cycle()
3150 fotg210_readl(fotg210, &fotg210->regs->command); start_iaa_cycle()
3151 fotg210_enable_event(fotg210, FOTG210_HRTIMER_IAA_WATCHDOG, start_iaa_cycle()
3158 static void end_unlink_async(struct fotg210_hcd *fotg210) end_unlink_async() argument
3164 fotg210->async_unlinking = true; end_unlink_async()
3165 while (fotg210->async_iaa) { end_unlink_async()
3166 qh = fotg210->async_iaa; end_unlink_async()
3167 fotg210->async_iaa = qh->unlink_next; end_unlink_async()
3173 qh_completions(fotg210, qh); end_unlink_async()
3175 fotg210->rh_state == FOTG210_RH_RUNNING) end_unlink_async()
3176 qh_link_async(fotg210, qh); end_unlink_async()
3177 disable_async(fotg210); end_unlink_async()
3179 fotg210->async_unlinking = false; end_unlink_async()
3182 if (fotg210->async_unlink) { end_unlink_async()
3183 start_iaa_cycle(fotg210, true); end_unlink_async()
3184 if (unlikely(fotg210->rh_state < FOTG210_RH_RUNNING)) end_unlink_async()
3189 static void unlink_empty_async(struct fotg210_hcd *fotg210) unlink_empty_async() argument
3192 bool stopped = (fotg210->rh_state < FOTG210_RH_RUNNING); unlink_empty_async()
3196 next = fotg210->async->qh_next.qh; unlink_empty_async()
3204 fotg210->async_unlink_cycle) unlink_empty_async()
3207 single_unlink_async(fotg210, qh); unlink_empty_async()
3212 if (fotg210->async_unlink) unlink_empty_async()
3213 start_iaa_cycle(fotg210, false); unlink_empty_async()
3217 fotg210_enable_event(fotg210, FOTG210_HRTIMER_ASYNC_UNLINKS, unlink_empty_async()
3219 ++fotg210->async_unlink_cycle; unlink_empty_async()
3224 /* caller must own fotg210->lock */
3226 static void start_unlink_async(struct fotg210_hcd *fotg210, start_unlink_async() argument
3240 single_unlink_async(fotg210, qh); start_unlink_async()
3241 start_iaa_cycle(fotg210, false); start_unlink_async()
3244 static void scan_async(struct fotg210_hcd *fotg210) scan_async() argument
3249 fotg210->qh_scan_next = fotg210->async->qh_next.qh; scan_async()
3250 while (fotg210->qh_scan_next) { scan_async()
3251 qh = fotg210->qh_scan_next; scan_async()
3252 fotg210->qh_scan_next = qh->qh_next.qh; scan_async()
3260 * drops the lock. That's why fotg210->qh_scan_next scan_async()
3262 * gets unlinked then fotg210->qh_scan_next is adjusted scan_async()
3265 temp = qh_completions(fotg210, qh); scan_async()
3267 start_unlink_async(fotg210, qh); scan_async()
3270 qh->unlink_cycle = fotg210->async_unlink_cycle; scan_async()
3283 if (check_unlinks_later && fotg210->rh_state == FOTG210_RH_RUNNING && scan_async()
3284 !(fotg210->enabled_hrtimer_events & scan_async()
3286 fotg210_enable_event(fotg210, scan_async()
3288 ++fotg210->async_unlink_cycle; scan_async()
3308 static union fotg210_shadow *periodic_next_shadow(struct fotg210_hcd *fotg210, periodic_next_shadow() argument
3311 switch (hc32_to_cpu(fotg210, tag)) { periodic_next_shadow()
3321 static __hc32 *shadow_next_periodic(struct fotg210_hcd *fotg210, shadow_next_periodic() argument
3324 switch (hc32_to_cpu(fotg210, tag)) { shadow_next_periodic()
3334 /* caller must hold fotg210->lock */ periodic_unlink()
3335 static void periodic_unlink(struct fotg210_hcd *fotg210, unsigned frame, periodic_unlink() argument
3338 union fotg210_shadow *prev_p = &fotg210->pshadow[frame]; periodic_unlink()
3339 __hc32 *hw_p = &fotg210->periodic[frame]; periodic_unlink()
3344 prev_p = periodic_next_shadow(fotg210, prev_p, periodic_unlink()
3345 Q_NEXT_TYPE(fotg210, *hw_p)); periodic_unlink()
3346 hw_p = shadow_next_periodic(fotg210, &here, periodic_unlink()
3347 Q_NEXT_TYPE(fotg210, *hw_p)); periodic_unlink()
3357 *prev_p = *periodic_next_shadow(fotg210, &here, periodic_unlink()
3358 Q_NEXT_TYPE(fotg210, *hw_p)); periodic_unlink()
3360 *hw_p = *shadow_next_periodic(fotg210, &here, periodic_unlink()
3361 Q_NEXT_TYPE(fotg210, *hw_p)); periodic_unlink()
3365 static unsigned short periodic_usecs(struct fotg210_hcd *fotg210, periodic_usecs() argument
3368 __hc32 *hw_p = &fotg210->periodic[frame]; periodic_usecs()
3369 union fotg210_shadow *q = &fotg210->pshadow[frame]; periodic_usecs()
3374 switch (hc32_to_cpu(fotg210, Q_NEXT_TYPE(fotg210, *hw_p))) { periodic_usecs()
3378 if (hw->hw_info2 & cpu_to_hc32(fotg210, 1 << uframe)) periodic_usecs()
3381 if (hw->hw_info2 & cpu_to_hc32(fotg210, periodic_usecs()
3392 if (q->fstn->hw_prev != FOTG210_LIST_END(fotg210)) periodic_usecs()
3393 fotg210_dbg(fotg210, "ignoring FSTN cost ...\n"); periodic_usecs()
3406 if (usecs > fotg210->uframe_periodic_max) periodic_usecs()
3407 fotg210_err(fotg210, "uframe %d sched overrun: %d usecs\n", periodic_usecs()
3428 static int tt_no_collision(struct fotg210_hcd *fotg210, unsigned period, tt_no_collision() argument
3438 for (; frame < fotg210->periodic_size; frame += period) { tt_no_collision()
3443 here = fotg210->pshadow[frame]; tt_no_collision()
3444 type = Q_NEXT_TYPE(fotg210, fotg210->periodic[frame]); tt_no_collision()
3446 switch (hc32_to_cpu(fotg210, type)) { tt_no_collision()
3448 type = Q_NEXT_TYPE(fotg210, here.itd->hw_next); tt_no_collision()
3456 mask = hc32_to_cpu(fotg210, tt_no_collision()
3463 type = Q_NEXT_TYPE(fotg210, hw->hw_next); tt_no_collision()
3468 fotg210_dbg(fotg210, tt_no_collision()
3482 static void enable_periodic(struct fotg210_hcd *fotg210) enable_periodic() argument
3484 if (fotg210->periodic_count++) enable_periodic()
3488 fotg210->enabled_hrtimer_events &= enable_periodic()
3492 fotg210_poll_PSS(fotg210); enable_periodic()
3493 turn_on_io_watchdog(fotg210); enable_periodic()
3496 static void disable_periodic(struct fotg210_hcd *fotg210) disable_periodic() argument
3498 if (--fotg210->periodic_count) disable_periodic()
3502 fotg210_poll_PSS(fotg210); disable_periodic()
3509 * no FSTN support (yet; fotg210 0.96+)
3511 static void qh_link_periodic(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) qh_link_periodic() argument
3518 hc32_to_cpup(fotg210, &qh->hw->hw_info2) & qh_link_periodic()
3526 for (i = qh->start; i < fotg210->periodic_size; i += period) { qh_link_periodic()
3527 union fotg210_shadow *prev = &fotg210->pshadow[i]; qh_link_periodic()
3528 __hc32 *hw_p = &fotg210->periodic[i]; qh_link_periodic()
3534 type = Q_NEXT_TYPE(fotg210, *hw_p); qh_link_periodic()
3535 if (type == cpu_to_hc32(fotg210, Q_TYPE_QH)) qh_link_periodic()
3537 prev = periodic_next_shadow(fotg210, prev, type); qh_link_periodic()
3538 hw_p = shadow_next_periodic(fotg210, &here, type); qh_link_periodic()
3559 *hw_p = QH_NEXT(fotg210, qh->qh_dma); qh_link_periodic()
3566 fotg210_to_hcd(fotg210)->self.bandwidth_allocated += qh->period qh_link_periodic()
3570 list_add(&qh->intr_node, &fotg210->intr_qh_list); qh_link_periodic()
3573 ++fotg210->intr_count; qh_link_periodic()
3574 enable_periodic(fotg210); qh_link_periodic()
3577 static void qh_unlink_periodic(struct fotg210_hcd *fotg210, qh_unlink_periodic() argument
3603 for (i = qh->start; i < fotg210->periodic_size; i += period) qh_unlink_periodic()
3604 periodic_unlink(fotg210, i, qh); qh_unlink_periodic()
3607 fotg210_to_hcd(fotg210)->self.bandwidth_allocated -= qh->period qh_unlink_periodic()
3613 qh->period, hc32_to_cpup(fotg210, &qh->hw->hw_info2) & qh_unlink_periodic()
3621 if (fotg210->qh_scan_next == qh) qh_unlink_periodic()
3622 fotg210->qh_scan_next = list_entry(qh->intr_node.next, qh_unlink_periodic()
3627 static void start_unlink_intr(struct fotg210_hcd *fotg210, start_unlink_intr() argument
3640 qh_unlink_periodic(fotg210, qh); start_unlink_intr()
3650 qh->unlink_cycle = fotg210->intr_unlink_cycle; start_unlink_intr()
3653 if (fotg210->intr_unlink) start_unlink_intr()
3654 fotg210->intr_unlink_last->unlink_next = qh; start_unlink_intr()
3656 fotg210->intr_unlink = qh; start_unlink_intr()
3657 fotg210->intr_unlink_last = qh; start_unlink_intr()
3659 if (fotg210->intr_unlinking) start_unlink_intr()
3661 else if (fotg210->rh_state < FOTG210_RH_RUNNING) start_unlink_intr()
3662 fotg210_handle_intr_unlinks(fotg210); start_unlink_intr()
3663 else if (fotg210->intr_unlink == qh) { start_unlink_intr()
3664 fotg210_enable_event(fotg210, FOTG210_HRTIMER_UNLINK_INTR, start_unlink_intr()
3666 ++fotg210->intr_unlink_cycle; start_unlink_intr()
3670 static void end_unlink_intr(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) end_unlink_intr() argument
3676 hw->hw_next = FOTG210_LIST_END(fotg210); end_unlink_intr()
3678 qh_completions(fotg210, qh); end_unlink_intr()
3682 fotg210->rh_state == FOTG210_RH_RUNNING) { end_unlink_intr()
3683 rc = qh_schedule(fotg210, qh); end_unlink_intr()
3692 fotg210_err(fotg210, "can't reschedule qh %p, err %d\n", end_unlink_intr()
3697 --fotg210->intr_count; end_unlink_intr()
3698 disable_periodic(fotg210); end_unlink_intr()
3701 static int check_period(struct fotg210_hcd *fotg210, unsigned frame, check_period() argument
3713 usecs = fotg210->uframe_periodic_max - usecs; check_period()
3721 claimed = periodic_usecs(fotg210, frame, check_period()
3726 } while ((frame += 1) < fotg210->periodic_size); check_period()
3731 claimed = periodic_usecs(fotg210, frame, uframe); check_period()
3734 } while ((frame += period) < fotg210->periodic_size); check_period()
3741 static int check_intr_schedule(struct fotg210_hcd *fotg210, unsigned frame, check_intr_schedule() argument
3750 if (!check_period(fotg210, frame, uframe, qh->period, qh->usecs)) check_intr_schedule()
3766 *c_maskp = cpu_to_hc32(fotg210, mask << 8); check_intr_schedule()
3769 if (tt_no_collision(fotg210, qh->period, qh->dev, frame, mask)) { check_intr_schedule()
3770 if (!check_period(fotg210, frame, uframe + qh->gap_uf + 1, check_intr_schedule()
3773 if (!check_period(fotg210, frame, uframe + qh->gap_uf, check_intr_schedule()
3785 static int qh_schedule(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) qh_schedule() argument
3793 qh_refresh(fotg210, qh); qh_schedule()
3794 hw->hw_next = FOTG210_LIST_END(fotg210); qh_schedule()
3799 uframe = ffs(hc32_to_cpup(fotg210, &hw->hw_info2) & QH_SMASK); qh_schedule()
3800 status = check_intr_schedule(fotg210, frame, --uframe, qh_schedule()
3817 frame = ++fotg210->random_frame % qh->period; qh_schedule()
3819 status = check_intr_schedule(fotg210, qh_schedule()
3830 status = check_intr_schedule(fotg210, 0, 0, qh, qh_schedule()
3838 hw->hw_info2 &= cpu_to_hc32(fotg210, ~(QH_CMASK | QH_SMASK)); qh_schedule()
3840 ? cpu_to_hc32(fotg210, 1 << uframe) qh_schedule()
3841 : cpu_to_hc32(fotg210, QH_SMASK); qh_schedule()
3844 fotg210_dbg(fotg210, "reused qh %p schedule\n", qh); qh_schedule()
3847 qh_link_periodic(fotg210, qh); qh_schedule()
3852 static int intr_submit(struct fotg210_hcd *fotg210, struct urb *urb, intr_submit() argument
3864 spin_lock_irqsave(&fotg210->lock, flags); intr_submit()
3866 if (unlikely(!HCD_HW_ACCESSIBLE(fotg210_to_hcd(fotg210)))) { intr_submit()
3870 status = usb_hcd_link_urb_to_ep(fotg210_to_hcd(fotg210), urb); intr_submit()
3876 qh = qh_append_tds(fotg210, urb, &empty, epnum, &urb->ep->hcpriv); intr_submit()
3882 status = qh_schedule(fotg210, qh); intr_submit()
3888 qh = qh_append_tds(fotg210, urb, qtd_list, epnum, &urb->ep->hcpriv); intr_submit()
3892 fotg210_to_hcd(fotg210)->self.bandwidth_int_reqs++; intr_submit()
3896 usb_hcd_unlink_urb_from_ep(fotg210_to_hcd(fotg210), urb); intr_submit()
3898 spin_unlock_irqrestore(&fotg210->lock, flags); intr_submit()
3900 qtd_list_free(fotg210, urb, qtd_list); intr_submit()
3905 static void scan_intr(struct fotg210_hcd *fotg210) scan_intr() argument
3909 list_for_each_entry_safe(qh, fotg210->qh_scan_next, scan_intr()
3910 &fotg210->intr_qh_list, intr_node) { scan_intr()
3918 * drops the lock. That's why fotg210->qh_scan_next scan_intr()
3920 * gets unlinked then fotg210->qh_scan_next is adjusted scan_intr()
3923 temp = qh_completions(fotg210, qh); scan_intr()
3927 start_unlink_intr(fotg210, qh); scan_intr()
3949 static void iso_stream_init(struct fotg210_hcd *fotg210, iso_stream_init() argument
3976 stream->buf0 = cpu_to_hc32(fotg210, (epnum << 8) | dev->devnum); iso_stream_init()
3977 stream->buf1 = cpu_to_hc32(fotg210, buf1); iso_stream_init()
3978 stream->buf2 = cpu_to_hc32(fotg210, multi); iso_stream_init()
4002 static struct fotg210_iso_stream *iso_stream_find(struct fotg210_hcd *fotg210, iso_stream_find() argument
4016 spin_lock_irqsave(&fotg210->lock, flags); iso_stream_find()
4024 iso_stream_init(fotg210, stream, urb->dev, urb->pipe, iso_stream_find()
4030 fotg210_dbg(fotg210, "dev %s ep%d%s, not iso??\n", iso_stream_find()
4036 spin_unlock_irqrestore(&fotg210->lock, flags); iso_stream_find()
4056 static inline void itd_sched_init(struct fotg210_hcd *fotg210, itd_sched_init() argument
4084 uframe->transaction = cpu_to_hc32(fotg210, trans); itd_sched_init()
4099 /* caller must hold fotg210->lock!*/ iso_sched_free()
4105 struct fotg210_hcd *fotg210, struct urb *urb, gfp_t mem_flags) itd_urb_transaction()
4118 itd_sched_init(fotg210, sched, stream, urb); itd_urb_transaction()
4126 spin_lock_irqsave(&fotg210->lock, flags); itd_urb_transaction()
4136 if (itd->frame == fotg210->now_frame) itd_urb_transaction()
4142 spin_unlock_irqrestore(&fotg210->lock, flags); itd_urb_transaction()
4143 itd = dma_pool_alloc(fotg210->itd_pool, mem_flags, itd_urb_transaction()
4145 spin_lock_irqsave(&fotg210->lock, flags); itd_urb_transaction()
4148 spin_unlock_irqrestore(&fotg210->lock, flags); itd_urb_transaction()
4157 spin_unlock_irqrestore(&fotg210->lock, flags); itd_urb_transaction()
4165 static inline int itd_slot_ok(struct fotg210_hcd *fotg210, u32 mod, u32 uframe, itd_slot_ok() argument
4171 if (periodic_usecs(fotg210, uframe >> 3, uframe & 0x7) itd_slot_ok()
4172 > (fotg210->uframe_periodic_max - usecs)) itd_slot_ok()
4185 * Also avoid queue depths of less than fotg210's worst irq latency (affected
4193 static int iso_stream_schedule(struct fotg210_hcd *fotg210, struct urb *urb, iso_stream_schedule() argument
4198 unsigned mod = fotg210->periodic_size << 3; iso_stream_schedule()
4205 fotg210_dbg(fotg210, "iso request %p too long\n", urb); iso_stream_schedule()
4210 now = fotg210_read_frame_index(fotg210) & (mod - 1); iso_stream_schedule()
4225 if (!stream->highspeed && fotg210->fs_i_thresh) iso_stream_schedule()
4226 next = now + fotg210->i_thresh; iso_stream_schedule()
4241 fotg210_dbg(fotg210, "request %p would overflow (%d+%d >= %d)\n", iso_stream_schedule()
4250 * this is bigger than fotg210->i_thresh allows; scheduling itself iso_stream_schedule()
4272 if (itd_slot_ok(fotg210, mod, start, iso_stream_schedule()
4279 fotg210_dbg(fotg210, "iso resched full %p (now %d max %d)\n", iso_stream_schedule()
4289 fotg210_dbg(fotg210, "request %p would overflow (%d+%d >= %d)\n", iso_stream_schedule()
4304 if (fotg210->isoc_count == 0) iso_stream_schedule()
4305 fotg210->next_frame = now >> 3; iso_stream_schedule()
4314 static inline void itd_init(struct fotg210_hcd *fotg210, itd_init() argument
4320 itd->hw_next = FOTG210_LIST_END(fotg210); itd_init()
4331 static inline void itd_patch(struct fotg210_hcd *fotg210, itd_patch() argument
4342 itd->hw_transaction[uframe] |= cpu_to_hc32(fotg210, pg << 12); itd_patch()
4343 itd->hw_bufp[pg] |= cpu_to_hc32(fotg210, uf->bufp & ~(u32)0); itd_patch()
4344 itd->hw_bufp_hi[pg] |= cpu_to_hc32(fotg210, (u32)(uf->bufp >> 32)); itd_patch()
4351 itd->hw_bufp[pg] |= cpu_to_hc32(fotg210, bufp & ~(u32)0); itd_patch()
4352 itd->hw_bufp_hi[pg] |= cpu_to_hc32(fotg210, (u32)(bufp >> 32)); itd_patch()
4356 static inline void itd_link(struct fotg210_hcd *fotg210, unsigned frame, itd_link() argument
4359 union fotg210_shadow *prev = &fotg210->pshadow[frame]; itd_link()
4360 __hc32 *hw_p = &fotg210->periodic[frame]; itd_link()
4366 type = Q_NEXT_TYPE(fotg210, *hw_p); itd_link()
4367 if (type == cpu_to_hc32(fotg210, Q_TYPE_QH)) itd_link()
4369 prev = periodic_next_shadow(fotg210, prev, type); itd_link()
4370 hw_p = shadow_next_periodic(fotg210, &here, type); itd_link()
4379 *hw_p = cpu_to_hc32(fotg210, itd->itd_dma | Q_TYPE_ITD); itd_link()
4383 static void itd_link_urb(struct fotg210_hcd *fotg210, struct urb *urb, itd_link_urb() argument
4394 fotg210_to_hcd(fotg210)->self.bandwidth_allocated itd_link_urb()
4396 fotg210_dbg(fotg210, itd_link_urb()
4416 itd_init(fotg210, stream, itd); itd_link_urb()
4422 itd_patch(fotg210, itd, iso_sched, packet, uframe); itd_link_urb()
4431 itd_link(fotg210, frame & (fotg210->periodic_size - 1), itd_link_urb()
4442 ++fotg210->isoc_count; itd_link_urb()
4443 enable_periodic(fotg210); itd_link_urb()
4459 static bool itd_complete(struct fotg210_hcd *fotg210, struct fotg210_itd *itd) itd_complete() argument
4477 t = hc32_to_cpup(fotg210, &itd->hw_transaction[uframe]); itd_complete()
4519 fotg210_urb_done(fotg210, urb, 0); itd_complete()
4523 --fotg210->isoc_count; itd_complete()
4524 disable_periodic(fotg210); itd_complete()
4527 fotg210_to_hcd(fotg210)->self.bandwidth_allocated itd_complete()
4529 fotg210_dbg(fotg210, itd_complete()
4544 &fotg210->cached_itd_list); itd_complete()
4545 start_free_itds(fotg210); itd_complete()
4551 static int itd_submit(struct fotg210_hcd *fotg210, struct urb *urb, itd_submit() argument
4559 stream = iso_stream_find(fotg210, urb); itd_submit()
4561 fotg210_dbg(fotg210, "can't get iso stream\n"); itd_submit()
4565 fotg210_port_speed(fotg210, 0) == itd_submit()
4567 fotg210_dbg(fotg210, "can't change iso interval %d --> %d\n", itd_submit()
4573 fotg210_dbg(fotg210, itd_submit()
4584 status = itd_urb_transaction(stream, fotg210, urb, mem_flags); itd_submit()
4586 fotg210_dbg(fotg210, "can't init itds\n"); itd_submit()
4591 spin_lock_irqsave(&fotg210->lock, flags); itd_submit()
4592 if (unlikely(!HCD_HW_ACCESSIBLE(fotg210_to_hcd(fotg210)))) { itd_submit()
4596 status = usb_hcd_link_urb_to_ep(fotg210_to_hcd(fotg210), urb); itd_submit()
4599 status = iso_stream_schedule(fotg210, urb, stream); itd_submit()
4601 itd_link_urb(fotg210, urb, fotg210->periodic_size << 3, stream); itd_submit()
4603 usb_hcd_unlink_urb_from_ep(fotg210_to_hcd(fotg210), urb); itd_submit()
4605 spin_unlock_irqrestore(&fotg210->lock, flags); itd_submit()
4610 static inline int scan_frame_queue(struct fotg210_hcd *fotg210, unsigned frame, scan_frame_queue() argument
4619 q_p = &fotg210->pshadow[frame]; scan_frame_queue()
4620 hw_p = &fotg210->periodic[frame]; scan_frame_queue()
4622 type = Q_NEXT_TYPE(fotg210, *hw_p); scan_frame_queue()
4626 switch (hc32_to_cpu(fotg210, type)) { scan_frame_queue()
4637 ITD_ACTIVE(fotg210)) scan_frame_queue()
4643 type = Q_NEXT_TYPE(fotg210, scan_frame_queue()
4657 type = Q_NEXT_TYPE(fotg210, q.itd->hw_next); scan_frame_queue()
4659 modified = itd_complete(fotg210, q.itd); scan_frame_queue()
4663 fotg210_dbg(fotg210, "corrupt type %d frame %d shadow %p\n", scan_frame_queue()
4674 if (unlikely(modified && fotg210->isoc_count > 0)) scan_frame_queue()
4680 static void scan_isoc(struct fotg210_hcd *fotg210) scan_isoc() argument
4683 unsigned fmask = fotg210->periodic_size - 1; scan_isoc()
4691 if (fotg210->rh_state >= FOTG210_RH_RUNNING) { scan_isoc()
4692 uf = fotg210_read_frame_index(fotg210); scan_isoc()
4696 now_frame = (fotg210->next_frame - 1) & fmask; scan_isoc()
4699 fotg210->now_frame = now_frame; scan_isoc()
4701 frame = fotg210->next_frame; scan_isoc()
4705 ret = scan_frame_queue(fotg210, frame, scan_isoc()
4713 fotg210->next_frame = now_frame; scan_isoc()
4721 struct fotg210_hcd *fotg210; show_uframe_periodic_max() local
4724 fotg210 = hcd_to_fotg210(bus_to_hcd(dev_get_drvdata(dev))); show_uframe_periodic_max()
4725 n = scnprintf(buf, PAGE_SIZE, "%d\n", fotg210->uframe_periodic_max); show_uframe_periodic_max()
4733 struct fotg210_hcd *fotg210; store_uframe_periodic_max() local
4740 fotg210 = hcd_to_fotg210(bus_to_hcd(dev_get_drvdata(dev))); store_uframe_periodic_max()
4745 fotg210_info(fotg210, "rejecting invalid request for uframe_periodic_max=%u\n", store_uframe_periodic_max()
4756 spin_lock_irqsave(&fotg210->lock, flags); store_uframe_periodic_max()
4763 if (uframe_periodic_max < fotg210->uframe_periodic_max) { store_uframe_periodic_max()
4766 for (frame = 0; frame < fotg210->periodic_size; ++frame) store_uframe_periodic_max()
4769 periodic_usecs(fotg210, frame, store_uframe_periodic_max()
4773 fotg210_info(fotg210, store_uframe_periodic_max()
4782 fotg210_info(fotg210, store_uframe_periodic_max()
4787 fotg210_warn(fotg210, "max periodic bandwidth set is non-standard\n"); store_uframe_periodic_max()
4789 fotg210->uframe_periodic_max = uframe_periodic_max; store_uframe_periodic_max()
4793 spin_unlock_irqrestore(&fotg210->lock, flags); store_uframe_periodic_max()
4800 static inline int create_sysfs_files(struct fotg210_hcd *fotg210) create_sysfs_files() argument
4802 struct device *controller = fotg210_to_hcd(fotg210)->self.controller; create_sysfs_files()
4813 static inline void remove_sysfs_files(struct fotg210_hcd *fotg210) remove_sysfs_files() argument
4815 struct device *controller = fotg210_to_hcd(fotg210)->self.controller; remove_sysfs_files()
4823 static void fotg210_turn_off_all_ports(struct fotg210_hcd *fotg210) fotg210_turn_off_all_ports() argument
4825 u32 __iomem *status_reg = &fotg210->regs->port_status; fotg210_turn_off_all_ports()
4827 fotg210_writel(fotg210, PORT_RWC_BITS, status_reg); fotg210_turn_off_all_ports()
4833 static void fotg210_silence_controller(struct fotg210_hcd *fotg210) fotg210_silence_controller() argument
4835 fotg210_halt(fotg210); fotg210_silence_controller()
4837 spin_lock_irq(&fotg210->lock); fotg210_silence_controller()
4838 fotg210->rh_state = FOTG210_RH_HALTED; fotg210_silence_controller()
4839 fotg210_turn_off_all_ports(fotg210); fotg210_silence_controller()
4840 spin_unlock_irq(&fotg210->lock); fotg210_silence_controller()
4849 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_shutdown() local
4851 spin_lock_irq(&fotg210->lock); fotg210_shutdown()
4852 fotg210->shutdown = true; fotg210_shutdown()
4853 fotg210->rh_state = FOTG210_RH_STOPPING; fotg210_shutdown()
4854 fotg210->enabled_hrtimer_events = 0; fotg210_shutdown()
4855 spin_unlock_irq(&fotg210->lock); fotg210_shutdown()
4857 fotg210_silence_controller(fotg210); fotg210_shutdown()
4859 hrtimer_cancel(&fotg210->hrtimer); fotg210_shutdown()
4863 * it calls driver completion functions, after dropping fotg210->lock.
4865 static void fotg210_work(struct fotg210_hcd *fotg210) fotg210_work() argument
4867 /* another CPU may drop fotg210->lock during a schedule scan while fotg210_work()
4871 if (fotg210->scanning) { fotg210_work()
4872 fotg210->need_rescan = true; fotg210_work()
4875 fotg210->scanning = true; fotg210_work()
4878 fotg210->need_rescan = false; fotg210_work()
4879 if (fotg210->async_count) fotg210_work()
4880 scan_async(fotg210); fotg210_work()
4881 if (fotg210->intr_count > 0) fotg210_work()
4882 scan_intr(fotg210); fotg210_work()
4883 if (fotg210->isoc_count > 0) fotg210_work()
4884 scan_isoc(fotg210); fotg210_work()
4885 if (fotg210->need_rescan) fotg210_work()
4887 fotg210->scanning = false; fotg210_work()
4893 turn_on_io_watchdog(fotg210); fotg210_work()
4900 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_stop() local
4902 fotg210_dbg(fotg210, "stop\n"); fotg210_stop()
4906 spin_lock_irq(&fotg210->lock); fotg210_stop()
4907 fotg210->enabled_hrtimer_events = 0; fotg210_stop()
4908 spin_unlock_irq(&fotg210->lock); fotg210_stop()
4910 fotg210_quiesce(fotg210); fotg210_stop()
4911 fotg210_silence_controller(fotg210); fotg210_stop()
4912 fotg210_reset(fotg210); fotg210_stop()
4914 hrtimer_cancel(&fotg210->hrtimer); fotg210_stop()
4915 remove_sysfs_files(fotg210); fotg210_stop()
4916 remove_debug_files(fotg210); fotg210_stop()
4919 spin_lock_irq(&fotg210->lock); fotg210_stop()
4920 end_free_itds(fotg210); fotg210_stop()
4921 spin_unlock_irq(&fotg210->lock); fotg210_stop()
4922 fotg210_mem_cleanup(fotg210); fotg210_stop()
4925 fotg210_dbg(fotg210, "irq normal %ld err %ld iaa %ld (lost %ld)\n", fotg210_stop()
4926 fotg210->stats.normal, fotg210->stats.error, fotg210_stop()
4927 fotg210->stats.iaa, fotg210->stats.lost_iaa); fotg210_stop()
4928 fotg210_dbg(fotg210, "complete %ld unlink %ld\n", fotg210_stop()
4929 fotg210->stats.complete, fotg210->stats.unlink); fotg210_stop()
4932 dbg_status(fotg210, "fotg210_stop completed", fotg210_stop()
4933 fotg210_readl(fotg210, &fotg210->regs->status)); fotg210_stop()
4939 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); hcd_fotg210_init() local
4945 spin_lock_init(&fotg210->lock); hcd_fotg210_init()
4950 fotg210->need_io_watchdog = 1; hcd_fotg210_init()
4952 hrtimer_init(&fotg210->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); hcd_fotg210_init()
4953 fotg210->hrtimer.function = fotg210_hrtimer_func; hcd_fotg210_init()
4954 fotg210->next_hrtimer_event = FOTG210_HRTIMER_NO_EVENT; hcd_fotg210_init()
4956 hcc_params = fotg210_readl(fotg210, &fotg210->caps->hcc_params); hcd_fotg210_init()
4962 fotg210->uframe_periodic_max = 100; hcd_fotg210_init()
4968 fotg210->periodic_size = DEFAULT_I_TDPS; hcd_fotg210_init()
4969 INIT_LIST_HEAD(&fotg210->intr_qh_list); hcd_fotg210_init()
4970 INIT_LIST_HEAD(&fotg210->cached_itd_list); hcd_fotg210_init()
4976 fotg210->periodic_size = 1024; hcd_fotg210_init()
4979 fotg210->periodic_size = 512; hcd_fotg210_init()
4982 fotg210->periodic_size = 256; hcd_fotg210_init()
4988 retval = fotg210_mem_init(fotg210, GFP_KERNEL); hcd_fotg210_init()
4993 fotg210->i_thresh = 2; hcd_fotg210_init()
5002 fotg210->async->qh_next.qh = NULL; hcd_fotg210_init()
5003 hw = fotg210->async->hw; hcd_fotg210_init()
5004 hw->hw_next = QH_NEXT(fotg210, fotg210->async->qh_dma); hcd_fotg210_init()
5005 hw->hw_info1 = cpu_to_hc32(fotg210, QH_HEAD); hcd_fotg210_init()
5006 hw->hw_token = cpu_to_hc32(fotg210, QTD_STS_HALT); hcd_fotg210_init()
5007 hw->hw_qtd_next = FOTG210_LIST_END(fotg210); hcd_fotg210_init()
5008 fotg210->async->qh_state = QH_STATE_LINKED; hcd_fotg210_init()
5009 hw->hw_alt_next = QTD_NEXT(fotg210, fotg210->async->dummy->qtd_dma); hcd_fotg210_init()
5028 fotg210_dbg(fotg210, "park %d\n", park); hcd_fotg210_init()
5035 fotg210->command = temp; hcd_fotg210_init()
5046 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_run() local
5054 fotg210_writel(fotg210, fotg210->periodic_dma, fotg210_run()
5055 &fotg210->regs->frame_list); fotg210_run()
5056 fotg210_writel(fotg210, (u32)fotg210->async->qh_dma, fotg210_run()
5057 &fotg210->regs->async_next); fotg210_run()
5060 * hcc_params controls whether fotg210->regs->segment must (!!!) fotg210_run()
5071 hcc_params = fotg210_readl(fotg210, &fotg210->caps->hcc_params); fotg210_run()
5077 fotg210->command &= ~(CMD_IAAD|CMD_PSE|CMD_ASE|CMD_RESET); fotg210_run()
5078 fotg210->command |= CMD_RUN; fotg210_run()
5079 fotg210_writel(fotg210, fotg210->command, &fotg210->regs->command); fotg210_run()
5080 dbg_cmd(fotg210, "init", fotg210->command); fotg210_run()
5097 fotg210->rh_state = FOTG210_RH_RUNNING; fotg210_run()
5099 fotg210_readl(fotg210, &fotg210->regs->command); fotg210_run()
5102 fotg210->last_periodic_enable = ktime_get_real(); fotg210_run()
5104 temp = HC_VERSION(fotg210, fotg210_run()
5105 fotg210_readl(fotg210, &fotg210->caps->hc_capbase)); fotg210_run()
5106 fotg210_info(fotg210, fotg210_run()
5108 ((fotg210->sbrn & 0xf0) >> 4), (fotg210->sbrn & 0x0f), fotg210_run()
5111 fotg210_writel(fotg210, INTR_MASK, fotg210_run()
5112 &fotg210->regs->intr_enable); /* Turn On Interrupts */ fotg210_run()
5118 create_debug_files(fotg210); fotg210_run()
5119 create_sysfs_files(fotg210); fotg210_run()
5126 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_setup() local
5129 fotg210->regs = (void __iomem *)fotg210->caps + fotg210_setup()
5130 HC_LENGTH(fotg210, fotg210_setup()
5131 fotg210_readl(fotg210, &fotg210->caps->hc_capbase)); fotg210_setup()
5132 dbg_hcs_params(fotg210, "reset"); fotg210_setup()
5133 dbg_hcc_params(fotg210, "reset"); fotg210_setup()
5136 fotg210->hcs_params = fotg210_readl(fotg210, fotg210_setup()
5137 &fotg210->caps->hcs_params); fotg210_setup()
5139 fotg210->sbrn = HCD_USB2; fotg210_setup()
5146 retval = fotg210_halt(fotg210); fotg210_setup()
5150 fotg210_reset(fotg210); fotg210_setup()
5157 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_irq() local
5161 spin_lock(&fotg210->lock); fotg210_irq()
5163 status = fotg210_readl(fotg210, &fotg210->regs->status); fotg210_irq()
5167 fotg210_dbg(fotg210, "device removed\n"); fotg210_irq()
5179 unlikely(fotg210->rh_state == FOTG210_RH_HALTED)) { fotg210_irq()
5180 spin_unlock(&fotg210->lock); fotg210_irq()
5185 fotg210_writel(fotg210, masked_status, &fotg210->regs->status); fotg210_irq()
5186 cmd = fotg210_readl(fotg210, &fotg210->regs->command); fotg210_irq()
5190 dbg_status(fotg210, "irq", status); fotg210_irq()
5197 COUNT(fotg210->stats.normal); fotg210_irq()
5199 COUNT(fotg210->stats.error); fotg210_irq()
5207 fotg210->enabled_hrtimer_events &= fotg210_irq()
5217 if (fotg210->next_hrtimer_event == FOTG210_HRTIMER_IAA_WATCHDOG) fotg210_irq()
5218 ++fotg210->next_hrtimer_event; fotg210_irq()
5222 fotg210_dbg(fotg210, "IAA with IAAD still set?\n"); fotg210_irq()
5223 if (fotg210->async_iaa) { fotg210_irq()
5224 COUNT(fotg210->stats.iaa); fotg210_irq()
5225 end_unlink_async(fotg210); fotg210_irq()
5227 fotg210_dbg(fotg210, "IAA with nothing unlinked?\n"); fotg210_irq()
5233 u32 __iomem *status_reg = &fotg210->regs->port_status; fotg210_irq()
5239 if (fotg210->rh_state == FOTG210_RH_SUSPENDED) fotg210_irq()
5242 pstatus = fotg210_readl(fotg210, status_reg); fotg210_irq()
5244 if (test_bit(0, &fotg210->suspended_ports) && fotg210_irq()
5248 fotg210->reset_done[0] == 0) { fotg210_irq()
5255 fotg210->reset_done[0] = jiffies + msecs_to_jiffies(25); fotg210_irq()
5256 set_bit(0, &fotg210->resuming_ports); fotg210_irq()
5257 fotg210_dbg(fotg210, "port 1 remote wakeup\n"); fotg210_irq()
5258 mod_timer(&hcd->rh_timer, fotg210->reset_done[0]); fotg210_irq()
5264 fotg210_err(fotg210, "fatal error\n"); fotg210_irq()
5265 dbg_cmd(fotg210, "fatal", cmd); fotg210_irq()
5266 dbg_status(fotg210, "fatal", status); fotg210_irq()
5271 fotg210->shutdown = true; fotg210_irq()
5272 fotg210->rh_state = FOTG210_RH_STOPPING; fotg210_irq()
5273 fotg210->command &= ~(CMD_RUN | CMD_ASE | CMD_PSE); fotg210_irq()
5274 fotg210_writel(fotg210, fotg210->command, fotg210_irq()
5275 &fotg210->regs->command); fotg210_irq()
5276 fotg210_writel(fotg210, 0, &fotg210->regs->intr_enable); fotg210_irq()
5277 fotg210_handle_controller_death(fotg210); fotg210_irq()
5284 fotg210_work(fotg210); fotg210_irq()
5285 spin_unlock(&fotg210->lock); fotg210_irq()
5305 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_urb_enqueue() local
5320 if (!qh_urb_transaction(fotg210, urb, &qtd_list, mem_flags)) fotg210_urb_enqueue()
5322 return submit_async(fotg210, urb, &qtd_list, mem_flags); fotg210_urb_enqueue()
5325 if (!qh_urb_transaction(fotg210, urb, &qtd_list, mem_flags)) fotg210_urb_enqueue()
5327 return intr_submit(fotg210, urb, &qtd_list, mem_flags); fotg210_urb_enqueue()
5330 return itd_submit(fotg210, urb, mem_flags); fotg210_urb_enqueue()
5340 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_urb_dequeue() local
5345 spin_lock_irqsave(&fotg210->lock, flags); fotg210_urb_dequeue()
5360 start_unlink_async(fotg210, qh); fotg210_urb_dequeue()
5368 qh_completions(fotg210, qh); fotg210_urb_dequeue()
5380 start_unlink_intr(fotg210, qh); fotg210_urb_dequeue()
5383 qh_completions(fotg210, qh); fotg210_urb_dequeue()
5386 fotg210_dbg(fotg210, "bogus qh %p state %d\n", fotg210_urb_dequeue()
5400 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_urb_dequeue()
5409 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_endpoint_disable() local
5417 spin_lock_irqsave(&fotg210->lock, flags); fotg210_endpoint_disable()
5436 if (fotg210->rh_state < FOTG210_RH_RUNNING) fotg210_endpoint_disable()
5441 for (tmp = fotg210->async->qh_next.qh; fotg210_endpoint_disable()
5449 start_unlink_async(fotg210, qh); fotg210_endpoint_disable()
5454 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_endpoint_disable()
5461 qh_destroy(fotg210, qh); fotg210_endpoint_disable()
5469 fotg210_err(fotg210, "qh %p (#%02x) state %d%s\n", fotg210_endpoint_disable()
5476 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_endpoint_disable()
5482 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_endpoint_reset() local
5492 spin_lock_irqsave(&fotg210->lock, flags); fotg210_endpoint_reset()
5512 start_unlink_async(fotg210, qh); fotg210_endpoint_reset()
5514 start_unlink_intr(fotg210, qh); fotg210_endpoint_reset()
5517 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_endpoint_reset()
5522 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_get_frame() local
5524 return (fotg210_read_frame_index(fotg210) >> 3) % fotg210_get_frame()
5525 fotg210->periodic_size; fotg210_get_frame()
5531 * give the fotg210 driver exclusive access to those.
5583 static void fotg210_init(struct fotg210_hcd *fotg210) fotg210_init() argument
5588 &fotg210->regs->gmir); fotg210_init()
5590 value = ioread32(&fotg210->regs->otgcsr); fotg210_init()
5593 iowrite32(value, &fotg210->regs->otgcsr); fotg210_init()
5610 struct fotg210_hcd *fotg210; fotg210_hcd_probe() local
5646 fotg210 = hcd_to_fotg210(hcd); fotg210_hcd_probe()
5648 fotg210->caps = hcd->regs; fotg210_hcd_probe()
5654 fotg210_init(fotg210); fotg210_hcd_probe()
5693 .name = "fotg210-hcd",
5717 fotg210_debug_root = debugfs_create_dir("fotg210", usb_debug_root); fotg210_hcd_init()
4104 itd_urb_transaction(struct fotg210_iso_stream *stream, struct fotg210_hcd *fotg210, struct urb *urb, gfp_t mem_flags) itd_urb_transaction() argument
H A Dfotg210.h193 static inline struct usb_hcd *fotg210_to_hcd(struct fotg210_hcd *fotg210) fotg210_to_hcd() argument
195 return container_of((void *) fotg210, struct usb_hcd, hcd_priv); fotg210_to_hcd()
211 #define HC_LENGTH(fotg210, p) (0x00ff&((p) >> /* bits 7:0 / offset 00h */ \
212 (fotg210_big_endian_capbase(fotg210) ? 24 : 0)))
213 #define HC_VERSION(fotg210, p) (0xffff&((p) >> /* bits 31:16 / offset 02h */ \
214 (fotg210_big_endian_capbase(fotg210) ? 0 : 16)))
306 #define QTD_NEXT(fotg210, dma) cpu_to_hc32(fotg210, (u32)dma)
335 #define ACTIVE_BIT(fotg210) cpu_to_hc32(fotg210, QTD_STS_ACTIVE)
336 #define HALT_BIT(fotg210) cpu_to_hc32(fotg210, QTD_STS_HALT)
337 #define STATUS_BIT(fotg210) cpu_to_hc32(fotg210, QTD_STS_STS)
350 #define QTD_MASK(fotg210) cpu_to_hc32(fotg210, ~0x1f)
357 #define Q_NEXT_TYPE(fotg210, dma) ((dma) & cpu_to_hc32(fotg210, 3 << 1))
373 #define QH_NEXT(fotg210, dma) \
374 (cpu_to_hc32(fotg210, (((u32)dma)&~0x01f)|Q_TYPE_QH))
377 #define FOTG210_LIST_END(fotg210) \
378 cpu_to_hc32(fotg210, 1) /* "null pointer" to hw */
550 #define ITD_ACTIVE(fotg210) cpu_to_hc32(fotg210, FOTG210_ISOC_ACTIVE)
593 #define fotg210_prepare_ports_for_controller_suspend(fotg210, do_wakeup) \
594 fotg210_adjust_port_wakeup_flags(fotg210, true, do_wakeup)
596 #define fotg210_prepare_ports_for_controller_resume(fotg210) \
597 fotg210_adjust_port_wakeup_flags(fotg210, false, false)
609 fotg210_get_speed(struct fotg210_hcd *fotg210, unsigned int portsc) fotg210_get_speed() argument
611 return (readl(&fotg210->regs->otgcsr) fotg210_get_speed()
617 fotg210_port_speed(struct fotg210_hcd *fotg210, unsigned int portsc) fotg210_port_speed() argument
619 switch (fotg210_get_speed(fotg210, portsc)) { fotg210_port_speed()
648 static inline unsigned int fotg210_readl(const struct fotg210_hcd *fotg210, fotg210_readl() argument
654 static inline void fotg210_writel(const struct fotg210_hcd *fotg210, fotg210_writel() argument
660 /* cpu to fotg210 */ cpu_to_hc32()
661 static inline __hc32 cpu_to_hc32(const struct fotg210_hcd *fotg210, const u32 x) cpu_to_hc32() argument
666 /* fotg210 to cpu */ hc32_to_cpu()
667 static inline u32 hc32_to_cpu(const struct fotg210_hcd *fotg210, const __hc32 x) hc32_to_cpu() argument
672 static inline u32 hc32_to_cpup(const struct fotg210_hcd *fotg210, hc32_to_cpup() argument
680 static inline unsigned fotg210_read_frame_index(struct fotg210_hcd *fotg210) fotg210_read_frame_index() argument
682 return fotg210_readl(fotg210, &fotg210->regs->frame_index); fotg210_read_frame_index()
H A DMakefile77 obj-$(CONFIG_USB_FOTG210_HCD) += fotg210-hcd.o

Completed in 187 milliseconds