Lines Matching refs:isp1362_hcd

118 static inline void isp1362_enable_int(struct isp1362_hcd *isp1362_hcd, u16 mask)  in isp1362_enable_int()  argument
120 if ((isp1362_hcd->irqenb | mask) == isp1362_hcd->irqenb) in isp1362_enable_int()
122 if (mask & ~isp1362_hcd->irqenb) in isp1362_enable_int()
123 isp1362_write_reg16(isp1362_hcd, HCuPINT, mask & ~isp1362_hcd->irqenb); in isp1362_enable_int()
124 isp1362_hcd->irqenb |= mask; in isp1362_enable_int()
125 if (isp1362_hcd->irq_active) in isp1362_enable_int()
127 isp1362_write_reg16(isp1362_hcd, HCuPINTENB, isp1362_hcd->irqenb); in isp1362_enable_int()
132 static inline struct isp1362_ep_queue *get_ptd_queue(struct isp1362_hcd *isp1362_hcd, in get_ptd_queue() argument
137 if (offset < isp1362_hcd->istl_queue[1].buf_start) in get_ptd_queue()
138 epq = &isp1362_hcd->istl_queue[0]; in get_ptd_queue()
139 else if (offset < isp1362_hcd->intl_queue.buf_start) in get_ptd_queue()
140 epq = &isp1362_hcd->istl_queue[1]; in get_ptd_queue()
141 else if (offset < isp1362_hcd->atl_queue.buf_start) in get_ptd_queue()
142 epq = &isp1362_hcd->intl_queue; in get_ptd_queue()
143 else if (offset < isp1362_hcd->atl_queue.buf_start + in get_ptd_queue()
144 isp1362_hcd->atl_queue.buf_size) in get_ptd_queue()
145 epq = &isp1362_hcd->atl_queue; in get_ptd_queue()
258 static void prepare_ptd(struct isp1362_hcd *isp1362_hcd, struct urb *urb, in prepare_ptd() argument
343 static void isp1362_write_ptd(struct isp1362_hcd *isp1362_hcd, struct isp1362_ep *ep, in isp1362_write_ptd() argument
350 isp1362_write_buffer(isp1362_hcd, ptd, ep->ptd_offset, PTD_HEADER_SIZE); in isp1362_write_ptd()
352 isp1362_write_buffer(isp1362_hcd, ep->data, in isp1362_write_ptd()
359 static void isp1362_read_ptd(struct isp1362_hcd *isp1362_hcd, struct isp1362_ep *ep, in isp1362_read_ptd() argument
372 isp1362_read_buffer(isp1362_hcd, ptd, ep->ptd_offset, PTD_HEADER_SIZE); in isp1362_read_ptd()
386 isp1362_read_buffer(isp1362_hcd, ep->data, in isp1362_read_ptd()
396 static void remove_ptd(struct isp1362_hcd *isp1362_hcd, struct isp1362_ep *ep) in remove_ptd() argument
405 epq = get_ptd_queue(isp1362_hcd, ep->ptd_offset); in remove_ptd()
410 list_add_tail(&ep->remove_list, &isp1362_hcd->remove_list); in remove_ptd()
412 isp1362_enable_int(isp1362_hcd, HCuPINT_SOF); in remove_ptd()
424 if (epq == &isp1362_hcd->atl_queue) { in remove_ptd()
426 isp1362_read_reg32(isp1362_hcd, HCATLSKIP), epq->skip_map); in remove_ptd()
427 isp1362_write_reg32(isp1362_hcd, HCATLSKIP, epq->skip_map); in remove_ptd()
429 isp1362_clr_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_ATL_ACTIVE); in remove_ptd()
430 } else if (epq == &isp1362_hcd->intl_queue) { in remove_ptd()
432 isp1362_read_reg32(isp1362_hcd, HCINTLSKIP), epq->skip_map); in remove_ptd()
433 isp1362_write_reg32(isp1362_hcd, HCINTLSKIP, epq->skip_map); in remove_ptd()
435 isp1362_clr_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_INTL_ACTIVE); in remove_ptd()
443 static void finish_request(struct isp1362_hcd *isp1362_hcd, struct isp1362_ep *ep, in finish_request() argument
445 __releases(isp1362_hcd->lock) in finish_request()
446 __acquires(isp1362_hcd->lock) in finish_request()
467 usb_hcd_unlink_urb_from_ep(isp1362_hcd_to_hcd(isp1362_hcd), urb); in finish_request()
468 spin_unlock(&isp1362_hcd->lock); in finish_request()
469 usb_hcd_giveback_urb(isp1362_hcd_to_hcd(isp1362_hcd), urb, status); in finish_request()
470 spin_lock(&isp1362_hcd->lock); in finish_request()
487 isp1362_hcd->load[ep->branch], in finish_request()
488 isp1362_hcd->load[ep->branch] - ep->load); in finish_request()
489 isp1362_hcd->load[ep->branch] -= ep->load; in finish_request()
497 static void postproc_ep(struct isp1362_hcd *isp1362_hcd, struct isp1362_ep *ep) in postproc_ep() argument
647 finish_request(isp1362_hcd, ep, urb, urbstat); in postproc_ep()
651 static void finish_unlinks(struct isp1362_hcd *isp1362_hcd) in finish_unlinks() argument
656 list_for_each_entry_safe(ep, tmp, &isp1362_hcd->remove_list, remove_list) { in finish_unlinks()
658 get_ptd_queue(isp1362_hcd, ep->ptd_offset); in finish_unlinks()
672 finish_request(isp1362_hcd, ep, urb, -ESHUTDOWN); in finish_unlinks()
685 static inline void enable_atl_transfers(struct isp1362_hcd *isp1362_hcd, int count) in enable_atl_transfers() argument
688 if (count < isp1362_hcd->atl_queue.ptd_count) in enable_atl_transfers()
689 isp1362_write_reg16(isp1362_hcd, HCATLDTC, count); in enable_atl_transfers()
690 isp1362_enable_int(isp1362_hcd, HCuPINT_ATL); in enable_atl_transfers()
691 isp1362_write_reg32(isp1362_hcd, HCATLSKIP, isp1362_hcd->atl_queue.skip_map); in enable_atl_transfers()
692 isp1362_set_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_ATL_ACTIVE); in enable_atl_transfers()
694 isp1362_enable_int(isp1362_hcd, HCuPINT_SOF); in enable_atl_transfers()
697 static inline void enable_intl_transfers(struct isp1362_hcd *isp1362_hcd) in enable_intl_transfers() argument
699 isp1362_enable_int(isp1362_hcd, HCuPINT_INTL); in enable_intl_transfers()
700 isp1362_set_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_INTL_ACTIVE); in enable_intl_transfers()
701 isp1362_write_reg32(isp1362_hcd, HCINTLSKIP, isp1362_hcd->intl_queue.skip_map); in enable_intl_transfers()
704 static inline void enable_istl_transfers(struct isp1362_hcd *isp1362_hcd, int flip) in enable_istl_transfers() argument
706 isp1362_enable_int(isp1362_hcd, flip ? HCuPINT_ISTL1 : HCuPINT_ISTL0); in enable_istl_transfers()
707 isp1362_set_mask16(isp1362_hcd, HCBUFSTAT, flip ? in enable_istl_transfers()
711 static int submit_req(struct isp1362_hcd *isp1362_hcd, struct urb *urb, in submit_req() argument
716 prepare_ptd(isp1362_hcd, urb, ep, epq, 0); in submit_req()
734 isp1362_write_ptd(isp1362_hcd, ep, epq); in submit_req()
740 static void start_atl_transfers(struct isp1362_hcd *isp1362_hcd) in start_atl_transfers() argument
743 struct isp1362_ep_queue *epq = &isp1362_hcd->atl_queue; in start_atl_transfers()
752 list_for_each_entry(ep, &isp1362_hcd->async, schedule) { in start_atl_transfers()
764 ret = submit_req(isp1362_hcd, urb, ep, epq); in start_atl_transfers()
779 if (isp1362_hcd->async.next != isp1362_hcd->async.prev) { in start_atl_transfers()
781 list_move(&isp1362_hcd->async, isp1362_hcd->async.next); in start_atl_transfers()
784 enable_atl_transfers(isp1362_hcd, defer ? 0 : ptd_count); in start_atl_transfers()
793 static void start_intl_transfers(struct isp1362_hcd *isp1362_hcd) in start_intl_transfers() argument
796 struct isp1362_ep_queue *epq = &isp1362_hcd->intl_queue; in start_intl_transfers()
804 list_for_each_entry(ep, &isp1362_hcd->periodic, schedule) { in start_intl_transfers()
816 ret = submit_req(isp1362_hcd, urb, ep, epq); in start_intl_transfers()
831 enable_intl_transfers(isp1362_hcd); in start_intl_transfers()
854 static void start_iso_transfers(struct isp1362_hcd *isp1362_hcd) in start_iso_transfers() argument
857 int flip = isp1362_hcd->istl_flip; in start_iso_transfers()
862 u16 fno = isp1362_read_reg32(isp1362_hcd, HCFMNUM); in start_iso_transfers()
865 epq = &isp1362_hcd->istl_queue[flip]; in start_iso_transfers()
875 list_for_each_entry_safe(ep, tmp, &isp1362_hcd->isoc, schedule) { in start_iso_transfers()
883 finish_request(isp1362_hcd, ep, urb, -EOVERFLOW); in start_iso_transfers()
893 prepare_ptd(isp1362_hcd, urb, ep, epq, fno); in start_iso_transfers()
914 isp1362_write_ptd(isp1362_hcd, ep, epq); in start_iso_transfers()
919 enable_istl_transfers(isp1362_hcd, flip); in start_iso_transfers()
926 if (!(isp1362_read_reg16(isp1362_hcd, HCBUFSTAT) & in start_iso_transfers()
935 static void finish_transfers(struct isp1362_hcd *isp1362_hcd, unsigned long done_map, in finish_transfers() argument
957 isp1362_read_ptd(isp1362_hcd, ep, epq); in finish_transfers()
970 postproc_ep(isp1362_hcd, ep); in finish_transfers()
981 static void finish_iso_transfers(struct isp1362_hcd *isp1362_hcd, struct isp1362_ep_queue *epq) in finish_iso_transfers() argument
997 isp1362_read_ptd(isp1362_hcd, ep, epq); in finish_iso_transfers()
999 postproc_ep(isp1362_hcd, ep); in finish_iso_transfers()
1008 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd); in isp1362_irq() local
1012 spin_lock(&isp1362_hcd->lock); in isp1362_irq()
1014 BUG_ON(isp1362_hcd->irq_active++); in isp1362_irq()
1016 isp1362_write_reg16(isp1362_hcd, HCuPINTENB, 0); in isp1362_irq()
1018 irqstat = isp1362_read_reg16(isp1362_hcd, HCuPINT); in isp1362_irq()
1019 DBG(3, "%s: got IRQ %04x:%04x\n", __func__, irqstat, isp1362_hcd->irqenb); in isp1362_irq()
1022 irqstat &= isp1362_hcd->irqenb; in isp1362_irq()
1023 isp1362_write_reg16(isp1362_hcd, HCuPINT, irqstat); in isp1362_irq()
1027 isp1362_hcd->irqenb &= ~HCuPINT_SOF; in isp1362_irq()
1028 isp1362_hcd->irq_stat[ISP1362_INT_SOF]++; in isp1362_irq()
1032 isp1362_hcd->fmindex = isp1362_read_reg32(isp1362_hcd, HCFMNUM); in isp1362_irq()
1033 if (!list_empty(&isp1362_hcd->remove_list)) in isp1362_irq()
1034 finish_unlinks(isp1362_hcd); in isp1362_irq()
1035 if (!list_empty(&isp1362_hcd->async) && !(irqstat & HCuPINT_ATL)) { in isp1362_irq()
1036 if (list_empty(&isp1362_hcd->atl_queue.active)) { in isp1362_irq()
1037 start_atl_transfers(isp1362_hcd); in isp1362_irq()
1039 isp1362_enable_int(isp1362_hcd, HCuPINT_ATL); in isp1362_irq()
1040 isp1362_write_reg32(isp1362_hcd, HCATLSKIP, in isp1362_irq()
1041 isp1362_hcd->atl_queue.skip_map); in isp1362_irq()
1042 isp1362_set_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_ATL_ACTIVE); in isp1362_irq()
1048 isp1362_hcd->irq_stat[ISP1362_INT_ISTL0]++; in isp1362_irq()
1051 isp1362_clr_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_ISTL0_FULL); in isp1362_irq()
1053 WARN_ON((int)!!isp1362_hcd->istl_flip); in isp1362_irq()
1054 WARN_ON(isp1362_read_reg16(isp1362_hcd, HCBUFSTAT) & in isp1362_irq()
1056 WARN_ON(!(isp1362_read_reg16(isp1362_hcd, HCBUFSTAT) & in isp1362_irq()
1058 isp1362_hcd->irqenb &= ~HCuPINT_ISTL0; in isp1362_irq()
1062 isp1362_hcd->irq_stat[ISP1362_INT_ISTL1]++; in isp1362_irq()
1065 isp1362_clr_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_ISTL1_FULL); in isp1362_irq()
1067 WARN_ON(!(int)isp1362_hcd->istl_flip); in isp1362_irq()
1068 WARN_ON(isp1362_read_reg16(isp1362_hcd, HCBUFSTAT) & in isp1362_irq()
1070 WARN_ON(!(isp1362_read_reg16(isp1362_hcd, HCBUFSTAT) & in isp1362_irq()
1072 isp1362_hcd->irqenb &= ~HCuPINT_ISTL1; in isp1362_irq()
1078 finish_iso_transfers(isp1362_hcd, in isp1362_irq()
1079 &isp1362_hcd->istl_queue[isp1362_hcd->istl_flip]); in isp1362_irq()
1080 start_iso_transfers(isp1362_hcd); in isp1362_irq()
1081 isp1362_hcd->istl_flip = 1 - isp1362_hcd->istl_flip; in isp1362_irq()
1085 u32 done_map = isp1362_read_reg32(isp1362_hcd, HCINTLDONE); in isp1362_irq()
1086 u32 skip_map = isp1362_read_reg32(isp1362_hcd, HCINTLSKIP); in isp1362_irq()
1087 isp1362_hcd->irq_stat[ISP1362_INT_INTL]++; in isp1362_irq()
1093 isp1362_write_reg32(isp1362_hcd, HCINTLSKIP, skip_map | done_map); in isp1362_irq()
1096 isp1362_clr_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_INTL_ACTIVE); in isp1362_irq()
1102 finish_transfers(isp1362_hcd, done_map, &isp1362_hcd->intl_queue); in isp1362_irq()
1103 start_intl_transfers(isp1362_hcd); in isp1362_irq()
1108 u32 done_map = isp1362_read_reg32(isp1362_hcd, HCATLDONE); in isp1362_irq()
1109 u32 skip_map = isp1362_read_reg32(isp1362_hcd, HCATLSKIP); in isp1362_irq()
1110 isp1362_hcd->irq_stat[ISP1362_INT_ATL]++; in isp1362_irq()
1116 isp1362_write_reg32(isp1362_hcd, HCATLSKIP, skip_map | done_map); in isp1362_irq()
1118 isp1362_clr_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_ATL_ACTIVE); in isp1362_irq()
1121 finish_transfers(isp1362_hcd, done_map, &isp1362_hcd->atl_queue); in isp1362_irq()
1122 start_atl_transfers(isp1362_hcd); in isp1362_irq()
1128 u32 intstat = isp1362_read_reg32(isp1362_hcd, HCINTSTAT); in isp1362_irq()
1129 isp1362_hcd->irq_stat[ISP1362_INT_OPR]++; in isp1362_irq()
1132 DBG(2, "%s: OPR %08x:%08x\n", __func__, intstat, isp1362_hcd->intenb); in isp1362_irq()
1133 intstat &= isp1362_hcd->intenb; in isp1362_irq()
1139 isp1362_hcd->rhstatus = isp1362_read_reg32(isp1362_hcd, HCRHSTATUS); in isp1362_irq()
1140 isp1362_hcd->rhport[0] = isp1362_read_reg32(isp1362_hcd, HCRHPORT1); in isp1362_irq()
1141 isp1362_hcd->rhport[1] = isp1362_read_reg32(isp1362_hcd, HCRHPORT2); in isp1362_irq()
1145 isp1362_show_reg(isp1362_hcd, HCCONTROL); in isp1362_irq()
1148 isp1362_write_reg32(isp1362_hcd, HCINTSTAT, intstat); in isp1362_irq()
1154 isp1362_hcd->irq_stat[ISP1362_INT_SUSP]++; in isp1362_irq()
1162 isp1362_hcd->irq_stat[ISP1362_INT_CLKRDY]++; in isp1362_irq()
1164 isp1362_hcd->irqenb &= ~HCuPINT_CLKRDY; in isp1362_irq()
1172 isp1362_write_reg16(isp1362_hcd, HCuPINTENB, isp1362_hcd->irqenb); in isp1362_irq()
1173 isp1362_hcd->irq_active--; in isp1362_irq()
1174 spin_unlock(&isp1362_hcd->lock); in isp1362_irq()
1182 static int balance(struct isp1362_hcd *isp1362_hcd, u16 interval, u16 load) in balance() argument
1190 if (branch < 0 || isp1362_hcd->load[branch] > isp1362_hcd->load[i]) { in balance()
1194 if ((isp1362_hcd->load[j] + load) > MAX_PERIODIC_LOAD) { in balance()
1196 load, j, isp1362_hcd->load[j], MAX_PERIODIC_LOAD); in balance()
1218 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd); in isp1362_urb_enqueue() local
1254 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_urb_enqueue()
1257 if (!((isp1362_hcd->rhport[0] | isp1362_hcd->rhport[1]) & in isp1362_urb_enqueue()
1306 ep->num_req = isp1362_hcd->req_serial++; in isp1362_urb_enqueue()
1315 list_add_tail(&ep->schedule, &isp1362_hcd->async); in isp1362_urb_enqueue()
1326 retval = balance(isp1362_hcd, ep->interval, ep->load); in isp1362_urb_enqueue()
1333 isp1362_hcd->fmindex = isp1362_read_reg32(isp1362_hcd, HCFMNUM); in isp1362_urb_enqueue()
1335 __func__, isp1362_hcd->fmindex, ep->branch, in isp1362_urb_enqueue()
1336 ((isp1362_hcd->fmindex + PERIODIC_SIZE - 1) & in isp1362_urb_enqueue()
1338 (isp1362_hcd->fmindex & (PERIODIC_SIZE - 1)) + ep->branch); in isp1362_urb_enqueue()
1342 u16 frame = isp1362_hcd->fmindex; in isp1362_urb_enqueue()
1347 if (frame_before(frame, isp1362_hcd->fmindex)) in isp1362_urb_enqueue()
1352 list_add_tail(&ep->schedule, &isp1362_hcd->isoc); in isp1362_urb_enqueue()
1355 list_add_tail(&ep->schedule, &isp1362_hcd->periodic); in isp1362_urb_enqueue()
1361 ep->load / ep->interval, isp1362_hcd->load[ep->branch], in isp1362_urb_enqueue()
1362 isp1362_hcd->load[ep->branch] + ep->load); in isp1362_urb_enqueue()
1363 isp1362_hcd->load[ep->branch] += ep->load; in isp1362_urb_enqueue()
1367 ALIGNSTAT(isp1362_hcd, urb->transfer_buffer); in isp1362_urb_enqueue()
1372 start_atl_transfers(isp1362_hcd); in isp1362_urb_enqueue()
1375 start_intl_transfers(isp1362_hcd); in isp1362_urb_enqueue()
1378 start_iso_transfers(isp1362_hcd); in isp1362_urb_enqueue()
1389 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_urb_enqueue()
1397 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd); in isp1362_urb_dequeue() local
1405 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_urb_dequeue()
1413 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_urb_dequeue()
1425 remove_ptd(isp1362_hcd, ep); in isp1362_urb_dequeue()
1432 finish_request(isp1362_hcd, ep, urb, status); in isp1362_urb_dequeue()
1440 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_urb_dequeue()
1450 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd); in isp1362_endpoint_disable() local
1456 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_endpoint_disable()
1461 remove_ptd(isp1362_hcd, ep); in isp1362_endpoint_disable()
1465 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_endpoint_disable()
1479 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd); in isp1362_get_frame() local
1483 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_get_frame()
1484 fmnum = isp1362_read_reg32(isp1362_hcd, HCFMNUM); in isp1362_get_frame()
1485 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_get_frame()
1495 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd); in isp1362_hub_status_data() local
1507 ports = isp1362_hcd->rhdesca & RH_A_NDP; in isp1362_hub_status_data()
1510 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_hub_status_data()
1512 if (isp1362_hcd->rhstatus & (RH_HS_LPSC | RH_HS_OCIC)) in isp1362_hub_status_data()
1518 u32 status = isp1362_hcd->rhport[i]; in isp1362_hub_status_data()
1530 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_hub_status_data()
1534 static void isp1362_hub_descriptor(struct isp1362_hcd *isp1362_hcd, in isp1362_hub_descriptor() argument
1537 u32 reg = isp1362_hcd->rhdesca; in isp1362_hub_descriptor()
1564 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd); in isp1362_hub_control() local
1568 int ports = isp1362_hcd->rhdesca & RH_A_NDP; in isp1362_hub_control()
1577 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_hub_control()
1578 isp1362_write_reg32(isp1362_hcd, HCRHSTATUS, RH_HS_OCIC); in isp1362_hub_control()
1579 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_hub_control()
1600 isp1362_hub_descriptor(isp1362_hcd, (struct usb_hub_descriptor *)buf); in isp1362_hub_control()
1612 tmp = isp1362_hcd->rhport[--wIndex]; in isp1362_hub_control()
1659 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_hub_control()
1660 isp1362_write_reg32(isp1362_hcd, HCRHPORT1 + wIndex, tmp); in isp1362_hub_control()
1661 isp1362_hcd->rhport[wIndex] = in isp1362_hub_control()
1662 isp1362_read_reg32(isp1362_hcd, HCRHPORT1 + wIndex); in isp1362_hub_control()
1663 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_hub_control()
1673 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_hub_control()
1674 isp1362_write_reg32(isp1362_hcd, HCRHPORT1 + wIndex, RH_PS_PSS); in isp1362_hub_control()
1675 isp1362_hcd->rhport[wIndex] = in isp1362_hub_control()
1676 isp1362_read_reg32(isp1362_hcd, HCRHPORT1 + wIndex); in isp1362_hub_control()
1677 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_hub_control()
1681 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_hub_control()
1682 isp1362_write_reg32(isp1362_hcd, HCRHPORT1 + wIndex, RH_PS_PPS); in isp1362_hub_control()
1683 isp1362_hcd->rhport[wIndex] = in isp1362_hub_control()
1684 isp1362_read_reg32(isp1362_hcd, HCRHPORT1 + wIndex); in isp1362_hub_control()
1685 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_hub_control()
1689 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_hub_control()
1695 tmp = isp1362_read_reg32(isp1362_hcd, HCRHPORT1 + wIndex); in isp1362_hub_control()
1703 isp1362_write_reg32(isp1362_hcd, HCRHPORT1 + wIndex, (RH_PS_PRS)); in isp1362_hub_control()
1705 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_hub_control()
1707 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_hub_control()
1710 isp1362_hcd->rhport[wIndex] = isp1362_read_reg32(isp1362_hcd, in isp1362_hub_control()
1712 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_hub_control()
1733 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd); in isp1362_bus_suspend() local
1736 if (time_before(jiffies, isp1362_hcd->next_statechange)) in isp1362_bus_suspend()
1739 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_bus_suspend()
1741 isp1362_hcd->hc_control = isp1362_read_reg32(isp1362_hcd, HCCONTROL); in isp1362_bus_suspend()
1742 switch (isp1362_hcd->hc_control & OHCI_CTRL_HCFS) { in isp1362_bus_suspend()
1745 isp1362_hcd->hc_control &= ~OHCI_CTRL_HCFS; in isp1362_bus_suspend()
1746 isp1362_hcd->hc_control |= OHCI_USB_RESET; in isp1362_bus_suspend()
1747 isp1362_write_reg32(isp1362_hcd, HCCONTROL, isp1362_hcd->hc_control); in isp1362_bus_suspend()
1761 if (!list_empty(&isp1362_hcd->atl_queue.active) || in isp1362_bus_suspend()
1762 !list_empty(&isp1362_hcd->intl_queue.active) || in isp1362_bus_suspend()
1763 !list_empty(&isp1362_hcd->istl_queue[0] .active) || in isp1362_bus_suspend()
1764 !list_empty(&isp1362_hcd->istl_queue[1] .active)) { in isp1362_bus_suspend()
1767 isp1362_write_reg32(isp1362_hcd, HCATLSKIP, ~0); in isp1362_bus_suspend()
1768 isp1362_write_reg32(isp1362_hcd, HCINTLSKIP, ~0); in isp1362_bus_suspend()
1769 isp1362_write_reg16(isp1362_hcd, HCBUFSTAT, 0); in isp1362_bus_suspend()
1770 isp1362_write_reg16(isp1362_hcd, HCuPINTENB, 0); in isp1362_bus_suspend()
1771 isp1362_write_reg32(isp1362_hcd, HCINTSTAT, OHCI_INTR_SF); in isp1362_bus_suspend()
1778 if (isp1362_read_reg32(isp1362_hcd, HCINTSTAT) & OHCI_INTR_SF) in isp1362_bus_suspend()
1782 if (isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_ATL) { in isp1362_bus_suspend()
1783 u32 done_map = isp1362_read_reg32(isp1362_hcd, HCATLDONE); in isp1362_bus_suspend()
1784 finish_transfers(isp1362_hcd, done_map, &isp1362_hcd->atl_queue); in isp1362_bus_suspend()
1786 if (isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_INTL) { in isp1362_bus_suspend()
1787 u32 done_map = isp1362_read_reg32(isp1362_hcd, HCINTLDONE); in isp1362_bus_suspend()
1788 finish_transfers(isp1362_hcd, done_map, &isp1362_hcd->intl_queue); in isp1362_bus_suspend()
1790 if (isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_ISTL0) in isp1362_bus_suspend()
1791 finish_iso_transfers(isp1362_hcd, &isp1362_hcd->istl_queue[0]); in isp1362_bus_suspend()
1792 if (isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_ISTL1) in isp1362_bus_suspend()
1793 finish_iso_transfers(isp1362_hcd, &isp1362_hcd->istl_queue[1]); in isp1362_bus_suspend()
1796 isp1362_read_reg32(isp1362_hcd, HCINTSTAT)); in isp1362_bus_suspend()
1797 isp1362_write_reg32(isp1362_hcd, HCINTSTAT, in isp1362_bus_suspend()
1798 isp1362_read_reg32(isp1362_hcd, HCINTSTAT)); in isp1362_bus_suspend()
1801 isp1362_hcd->hc_control = OHCI_USB_SUSPEND; in isp1362_bus_suspend()
1802 isp1362_show_reg(isp1362_hcd, HCCONTROL); in isp1362_bus_suspend()
1803 isp1362_write_reg32(isp1362_hcd, HCCONTROL, isp1362_hcd->hc_control); in isp1362_bus_suspend()
1804 isp1362_show_reg(isp1362_hcd, HCCONTROL); in isp1362_bus_suspend()
1807 isp1362_hcd->hc_control = isp1362_read_reg32(isp1362_hcd, HCCONTROL); in isp1362_bus_suspend()
1808 if ((isp1362_hcd->hc_control & OHCI_CTRL_HCFS) != OHCI_USB_SUSPEND) { in isp1362_bus_suspend()
1810 isp1362_hcd->hc_control); in isp1362_bus_suspend()
1816 isp1362_hcd->next_statechange = jiffies + msecs_to_jiffies(5); in isp1362_bus_suspend()
1822 isp1362_read_reg32(isp1362_hcd, HCCONTROL)); in isp1362_bus_suspend()
1824 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_bus_suspend()
1830 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd); in isp1362_bus_resume() local
1835 if (time_before(jiffies, isp1362_hcd->next_statechange)) in isp1362_bus_resume()
1838 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_bus_resume()
1839 isp1362_hcd->hc_control = isp1362_read_reg32(isp1362_hcd, HCCONTROL); in isp1362_bus_resume()
1840 pr_info("%s: HCCONTROL: %08x\n", __func__, isp1362_hcd->hc_control); in isp1362_bus_resume()
1845 switch (isp1362_hcd->hc_control & OHCI_CTRL_HCFS) { in isp1362_bus_resume()
1848 isp1362_hcd->hc_control &= ~OHCI_CTRL_HCFS; in isp1362_bus_resume()
1849 isp1362_hcd->hc_control |= OHCI_USB_RESUME; in isp1362_bus_resume()
1850 isp1362_write_reg32(isp1362_hcd, HCCONTROL, isp1362_hcd->hc_control); in isp1362_bus_resume()
1865 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_bus_resume()
1873 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_bus_resume()
1874 port = isp1362_read_reg32(isp1362_hcd, HCRHDESCA) & RH_A_NDP; in isp1362_bus_resume()
1876 u32 stat = isp1362_read_reg32(isp1362_hcd, HCRHPORT1 + port); in isp1362_bus_resume()
1884 isp1362_write_reg32(isp1362_hcd, HCRHPORT1 + port, RH_PS_POCI); in isp1362_bus_resume()
1886 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_bus_resume()
1892 isp1362_hcd->hc_control = OHCI_USB_OPER; in isp1362_bus_resume()
1893 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_bus_resume()
1894 isp1362_show_reg(isp1362_hcd, HCCONTROL); in isp1362_bus_resume()
1895 isp1362_write_reg32(isp1362_hcd, HCCONTROL, isp1362_hcd->hc_control); in isp1362_bus_resume()
1896 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_bus_resume()
1901 isp1362_hcd->next_statechange = jiffies + msecs_to_jiffies(250); in isp1362_bus_resume()
1964 static void dump_regs(struct seq_file *s, struct isp1362_hcd *isp1362_hcd) in dump_regs() argument
1967 isp1362_read_reg32(isp1362_hcd, HCREVISION)); in dump_regs()
1969 isp1362_read_reg32(isp1362_hcd, HCCONTROL)); in dump_regs()
1971 isp1362_read_reg32(isp1362_hcd, HCCMDSTAT)); in dump_regs()
1973 isp1362_read_reg32(isp1362_hcd, HCINTSTAT)); in dump_regs()
1975 isp1362_read_reg32(isp1362_hcd, HCINTENB)); in dump_regs()
1977 isp1362_read_reg32(isp1362_hcd, HCFMINTVL)); in dump_regs()
1979 isp1362_read_reg32(isp1362_hcd, HCFMREM)); in dump_regs()
1981 isp1362_read_reg32(isp1362_hcd, HCFMNUM)); in dump_regs()
1983 isp1362_read_reg32(isp1362_hcd, HCLSTHRESH)); in dump_regs()
1985 isp1362_read_reg32(isp1362_hcd, HCRHDESCA)); in dump_regs()
1987 isp1362_read_reg32(isp1362_hcd, HCRHDESCB)); in dump_regs()
1989 isp1362_read_reg32(isp1362_hcd, HCRHSTATUS)); in dump_regs()
1991 isp1362_read_reg32(isp1362_hcd, HCRHPORT1)); in dump_regs()
1993 isp1362_read_reg32(isp1362_hcd, HCRHPORT2)); in dump_regs()
1996 isp1362_read_reg16(isp1362_hcd, HCHWCFG)); in dump_regs()
1998 isp1362_read_reg16(isp1362_hcd, HCDMACFG)); in dump_regs()
2000 isp1362_read_reg16(isp1362_hcd, HCXFERCTR)); in dump_regs()
2002 isp1362_read_reg16(isp1362_hcd, HCuPINT)); in dump_regs()
2004 isp1362_read_reg16(isp1362_hcd, HCuPINTENB)); in dump_regs()
2006 isp1362_read_reg16(isp1362_hcd, HCCHIPID)); in dump_regs()
2008 isp1362_read_reg16(isp1362_hcd, HCSCRATCH)); in dump_regs()
2010 isp1362_read_reg16(isp1362_hcd, HCBUFSTAT)); in dump_regs()
2012 isp1362_read_reg32(isp1362_hcd, HCDIRADDR)); in dump_regs()
2015 isp1362_read_reg16(isp1362_hcd, HCDIRDATA)); in dump_regs()
2018 isp1362_read_reg16(isp1362_hcd, HCISTLBUFSZ)); in dump_regs()
2020 isp1362_read_reg16(isp1362_hcd, HCISTLRATE)); in dump_regs()
2023 isp1362_read_reg16(isp1362_hcd, HCINTLBUFSZ)); in dump_regs()
2025 isp1362_read_reg16(isp1362_hcd, HCINTLBLKSZ)); in dump_regs()
2027 isp1362_read_reg32(isp1362_hcd, HCINTLDONE)); in dump_regs()
2029 isp1362_read_reg32(isp1362_hcd, HCINTLSKIP)); in dump_regs()
2031 isp1362_read_reg32(isp1362_hcd, HCINTLLAST)); in dump_regs()
2033 isp1362_read_reg16(isp1362_hcd, HCINTLCURR)); in dump_regs()
2036 isp1362_read_reg16(isp1362_hcd, HCATLBUFSZ)); in dump_regs()
2038 isp1362_read_reg16(isp1362_hcd, HCATLBLKSZ)); in dump_regs()
2041 isp1362_read_reg32(isp1362_hcd, HCATLDONE)); in dump_regs()
2044 isp1362_read_reg32(isp1362_hcd, HCATLSKIP)); in dump_regs()
2046 isp1362_read_reg32(isp1362_hcd, HCATLLAST)); in dump_regs()
2048 isp1362_read_reg16(isp1362_hcd, HCATLCURR)); in dump_regs()
2051 isp1362_read_reg16(isp1362_hcd, HCATLDTC)); in dump_regs()
2053 isp1362_read_reg16(isp1362_hcd, HCATLDTCTO)); in dump_regs()
2058 struct isp1362_hcd *isp1362_hcd = s->private; in isp1362_show() local
2063 isp1362_hcd_to_hcd(isp1362_hcd)->product_desc, hcd_name, DRIVER_VERSION); in isp1362_show()
2069 isp1362_hcd->stat16, isp1362_hcd->stat8, isp1362_hcd->stat4, in isp1362_show()
2070 isp1362_hcd->stat2, isp1362_hcd->stat1); in isp1362_show()
2071 seq_printf(s, "max # ptds in ATL fifo: %d\n", isp1362_hcd->atl_queue.stat_maxptds); in isp1362_show()
2072 seq_printf(s, "max # ptds in INTL fifo: %d\n", isp1362_hcd->intl_queue.stat_maxptds); in isp1362_show()
2074 max(isp1362_hcd->istl_queue[0] .stat_maxptds, in isp1362_show()
2075 isp1362_hcd->istl_queue[1] .stat_maxptds)); in isp1362_show()
2078 spin_lock_irq(&isp1362_hcd->lock); in isp1362_show()
2080 dump_irq(s, "hc_irq_enable", isp1362_read_reg16(isp1362_hcd, HCuPINTENB)); in isp1362_show()
2081 dump_irq(s, "hc_irq_status", isp1362_read_reg16(isp1362_hcd, HCuPINT)); in isp1362_show()
2082 dump_int(s, "ohci_int_enable", isp1362_read_reg32(isp1362_hcd, HCINTENB)); in isp1362_show()
2083 dump_int(s, "ohci_int_status", isp1362_read_reg32(isp1362_hcd, HCINTSTAT)); in isp1362_show()
2084 dump_ctrl(s, "ohci_control", isp1362_read_reg32(isp1362_hcd, HCCONTROL)); in isp1362_show()
2087 if (isp1362_hcd->irq_stat[i]) in isp1362_show()
2089 ISP1362_INT_NAME(i), isp1362_hcd->irq_stat[i]); in isp1362_show()
2091 dump_regs(s, isp1362_hcd); in isp1362_show()
2092 list_for_each_entry(ep, &isp1362_hcd->async, schedule) { in isp1362_show()
2122 if (!list_empty(&isp1362_hcd->async)) in isp1362_show()
2124 dump_ptd_queue(&isp1362_hcd->atl_queue); in isp1362_show()
2128 list_for_each_entry(ep, &isp1362_hcd->periodic, schedule) { in isp1362_show()
2130 isp1362_hcd->load[ep->branch], ep->ptd_index, ep->ptd_offset); in isp1362_show()
2140 dump_ptd_queue(&isp1362_hcd->intl_queue); in isp1362_show()
2144 list_for_each_entry(ep, &isp1362_hcd->isoc, schedule) { in isp1362_show()
2154 spin_unlock_irq(&isp1362_hcd->lock); in isp1362_show()
2173 static void create_debug_file(struct isp1362_hcd *isp1362_hcd) in create_debug_file() argument
2175 isp1362_hcd->debug_file = debugfs_create_file("isp1362", S_IRUGO, in create_debug_file()
2177 isp1362_hcd, &debug_ops); in create_debug_file()
2180 static void remove_debug_file(struct isp1362_hcd *isp1362_hcd) in remove_debug_file() argument
2182 debugfs_remove(isp1362_hcd->debug_file); in remove_debug_file()
2187 static void __isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd) in __isp1362_sw_reset() argument
2191 isp1362_write_reg16(isp1362_hcd, HCSWRES, HCSWRES_MAGIC); in __isp1362_sw_reset()
2192 isp1362_write_reg32(isp1362_hcd, HCCMDSTAT, OHCI_HCR); in __isp1362_sw_reset()
2195 if (!(isp1362_read_reg32(isp1362_hcd, HCCMDSTAT) & OHCI_HCR)) in __isp1362_sw_reset()
2202 static void isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd) in isp1362_sw_reset() argument
2206 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_sw_reset()
2207 __isp1362_sw_reset(isp1362_hcd); in isp1362_sw_reset()
2208 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_sw_reset()
2213 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd); in isp1362_mem_config() local
2254 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_mem_config()
2257 isp1362_hcd->istl_queue[i].buf_start = i * istl_size / 2, in isp1362_mem_config()
2258 isp1362_hcd->istl_queue[i].buf_size = istl_size / 2; in isp1362_mem_config()
2259 isp1362_hcd->istl_queue[i].blk_size = 4; in isp1362_mem_config()
2260 INIT_LIST_HEAD(&isp1362_hcd->istl_queue[i].active); in isp1362_mem_config()
2261 snprintf(isp1362_hcd->istl_queue[i].name, in isp1362_mem_config()
2262 sizeof(isp1362_hcd->istl_queue[i].name), "ISTL%d", i); in isp1362_mem_config()
2264 isp1362_hcd->istl_queue[i].name, in isp1362_mem_config()
2265 isp1362_hcd->istl_queue[i].buf_start, in isp1362_mem_config()
2266 isp1362_hcd->istl_queue[i].buf_size); in isp1362_mem_config()
2268 isp1362_write_reg16(isp1362_hcd, HCISTLBUFSZ, istl_size / 2); in isp1362_mem_config()
2270 isp1362_hcd->intl_queue.buf_start = istl_size; in isp1362_mem_config()
2271 isp1362_hcd->intl_queue.buf_size = intl_size; in isp1362_mem_config()
2272 isp1362_hcd->intl_queue.buf_count = ISP1362_INTL_BUFFERS; in isp1362_mem_config()
2273 isp1362_hcd->intl_queue.blk_size = intl_blksize; in isp1362_mem_config()
2274 isp1362_hcd->intl_queue.buf_avail = isp1362_hcd->intl_queue.buf_count; in isp1362_mem_config()
2275 isp1362_hcd->intl_queue.skip_map = ~0; in isp1362_mem_config()
2276 INIT_LIST_HEAD(&isp1362_hcd->intl_queue.active); in isp1362_mem_config()
2278 isp1362_write_reg16(isp1362_hcd, HCINTLBUFSZ, in isp1362_mem_config()
2279 isp1362_hcd->intl_queue.buf_size); in isp1362_mem_config()
2280 isp1362_write_reg16(isp1362_hcd, HCINTLBLKSZ, in isp1362_mem_config()
2281 isp1362_hcd->intl_queue.blk_size - PTD_HEADER_SIZE); in isp1362_mem_config()
2282 isp1362_write_reg32(isp1362_hcd, HCINTLSKIP, ~0); in isp1362_mem_config()
2283 isp1362_write_reg32(isp1362_hcd, HCINTLLAST, in isp1362_mem_config()
2286 isp1362_hcd->atl_queue.buf_start = istl_size + intl_size; in isp1362_mem_config()
2287 isp1362_hcd->atl_queue.buf_size = atl_size; in isp1362_mem_config()
2288 isp1362_hcd->atl_queue.buf_count = atl_buffers; in isp1362_mem_config()
2289 isp1362_hcd->atl_queue.blk_size = atl_blksize; in isp1362_mem_config()
2290 isp1362_hcd->atl_queue.buf_avail = isp1362_hcd->atl_queue.buf_count; in isp1362_mem_config()
2291 isp1362_hcd->atl_queue.skip_map = ~0; in isp1362_mem_config()
2292 INIT_LIST_HEAD(&isp1362_hcd->atl_queue.active); in isp1362_mem_config()
2294 isp1362_write_reg16(isp1362_hcd, HCATLBUFSZ, in isp1362_mem_config()
2295 isp1362_hcd->atl_queue.buf_size); in isp1362_mem_config()
2296 isp1362_write_reg16(isp1362_hcd, HCATLBLKSZ, in isp1362_mem_config()
2297 isp1362_hcd->atl_queue.blk_size - PTD_HEADER_SIZE); in isp1362_mem_config()
2298 isp1362_write_reg32(isp1362_hcd, HCATLSKIP, ~0); in isp1362_mem_config()
2299 isp1362_write_reg32(isp1362_hcd, HCATLLAST, in isp1362_mem_config()
2302 snprintf(isp1362_hcd->atl_queue.name, in isp1362_mem_config()
2303 sizeof(isp1362_hcd->atl_queue.name), "ATL"); in isp1362_mem_config()
2304 snprintf(isp1362_hcd->intl_queue.name, in isp1362_mem_config()
2305 sizeof(isp1362_hcd->intl_queue.name), "INTL"); in isp1362_mem_config()
2307 isp1362_hcd->intl_queue.name, in isp1362_mem_config()
2308 isp1362_hcd->intl_queue.buf_start, in isp1362_mem_config()
2309 ISP1362_INTL_BUFFERS, isp1362_hcd->intl_queue.blk_size, in isp1362_mem_config()
2310 isp1362_hcd->intl_queue.buf_size); in isp1362_mem_config()
2312 isp1362_hcd->atl_queue.name, in isp1362_mem_config()
2313 isp1362_hcd->atl_queue.buf_start, in isp1362_mem_config()
2314 atl_buffers, isp1362_hcd->atl_queue.blk_size, in isp1362_mem_config()
2315 isp1362_hcd->atl_queue.buf_size); in isp1362_mem_config()
2317 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_mem_config()
2325 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd); in isp1362_hc_reset() local
2333 if (isp1362_hcd->board && isp1362_hcd->board->reset) { in isp1362_hc_reset()
2334 isp1362_hcd->board->reset(hcd->self.controller, 1); in isp1362_hc_reset()
2336 if (isp1362_hcd->board->clock) in isp1362_hc_reset()
2337 isp1362_hcd->board->clock(hcd->self.controller, 1); in isp1362_hc_reset()
2338 isp1362_hcd->board->reset(hcd->self.controller, 0); in isp1362_hc_reset()
2340 isp1362_sw_reset(isp1362_hcd); in isp1362_hc_reset()
2345 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_hc_reset()
2346 clkrdy = isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_CLKRDY; in isp1362_hc_reset()
2347 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_hc_reset()
2352 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_hc_reset()
2353 isp1362_write_reg16(isp1362_hcd, HCuPINT, HCuPINT_CLKRDY); in isp1362_hc_reset()
2354 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_hc_reset()
2364 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd); in isp1362_hc_stop() local
2372 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_hc_stop()
2374 isp1362_write_reg16(isp1362_hcd, HCuPINTENB, 0); in isp1362_hc_stop()
2377 tmp = isp1362_read_reg32(isp1362_hcd, HCRHDESCA); in isp1362_hc_stop()
2379 isp1362_write_reg32(isp1362_hcd, HCRHDESCA, tmp); in isp1362_hc_stop()
2380 isp1362_write_reg32(isp1362_hcd, HCRHSTATUS, RH_HS_LPS); in isp1362_hc_stop()
2383 if (isp1362_hcd->board && isp1362_hcd->board->reset) in isp1362_hc_stop()
2384 isp1362_hcd->board->reset(hcd->self.controller, 1); in isp1362_hc_stop()
2386 __isp1362_sw_reset(isp1362_hcd); in isp1362_hc_stop()
2388 if (isp1362_hcd->board && isp1362_hcd->board->clock) in isp1362_hc_stop()
2389 isp1362_hcd->board->clock(hcd->self.controller, 0); in isp1362_hc_stop()
2391 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_hc_stop()
2395 static int isp1362_chip_test(struct isp1362_hcd *isp1362_hcd) in isp1362_chip_test() argument
2415 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_chip_test()
2416 isp1362_write_buffer(isp1362_hcd, (u8 *)ref + offset, 0, j); in isp1362_chip_test()
2417 isp1362_read_buffer(isp1362_hcd, (u8 *)tst + offset, 0, j); in isp1362_chip_test()
2418 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_chip_test()
2430 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_chip_test()
2431 isp1362_write_buffer(isp1362_hcd, ref, 0, ISP1362_BUF_SIZE); in isp1362_chip_test()
2432 isp1362_read_buffer(isp1362_hcd, tst, 0, ISP1362_BUF_SIZE); in isp1362_chip_test()
2433 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_chip_test()
2447 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_chip_test()
2448 isp1362_write_buffer(isp1362_hcd, tst, 0, ISP1362_BUF_SIZE); in isp1362_chip_test()
2449 isp1362_read_buffer(isp1362_hcd, tst, 0, ISP1362_BUF_SIZE); in isp1362_chip_test()
2450 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_chip_test()
2457 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_chip_test()
2458 isp1362_write_buffer(isp1362_hcd, ref, offset * 2, PTD_HEADER_SIZE); in isp1362_chip_test()
2459 isp1362_write_buffer(isp1362_hcd, ref + PTD_HEADER_SIZE / sizeof(*ref), in isp1362_chip_test()
2461 isp1362_read_buffer(isp1362_hcd, tst, offset * 2, in isp1362_chip_test()
2463 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_chip_test()
2467 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_chip_test()
2468 isp1362_read_buffer(isp1362_hcd, tst, offset * 2, in isp1362_chip_test()
2470 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_chip_test()
2490 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd); in isp1362_hc_start() local
2491 struct isp1362_platform_data *board = isp1362_hcd->board; in isp1362_hc_start()
2498 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_hc_start()
2499 chipid = isp1362_read_reg16(isp1362_hcd, HCCHIPID); in isp1362_hc_start()
2500 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_hc_start()
2508 ret = isp1362_chip_test(isp1362_hcd); in isp1362_hc_start()
2512 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_hc_start()
2514 isp1362_write_reg16(isp1362_hcd, HCuPINT, 0xff); in isp1362_hc_start()
2515 isp1362_write_reg16(isp1362_hcd, HCuPINTENB, 0); in isp1362_hc_start()
2534 isp1362_write_reg16(isp1362_hcd, HCHWCFG, hwcfg); in isp1362_hc_start()
2535 isp1362_show_reg(isp1362_hcd, HCHWCFG); in isp1362_hc_start()
2536 isp1362_write_reg16(isp1362_hcd, HCDMACFG, 0); in isp1362_hc_start()
2537 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_hc_start()
2543 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_hc_start()
2546 isp1362_hcd->rhdesca = 0; in isp1362_hc_start()
2548 isp1362_hcd->rhdesca |= RH_A_NPS; in isp1362_hc_start()
2550 isp1362_hcd->rhdesca |= RH_A_PSM; in isp1362_hc_start()
2552 isp1362_hcd->rhdesca |= (board->potpg << 24) & RH_A_POTPGT; in isp1362_hc_start()
2554 isp1362_hcd->rhdesca |= (25 << 24) & RH_A_POTPGT; in isp1362_hc_start()
2556 isp1362_write_reg32(isp1362_hcd, HCRHDESCA, isp1362_hcd->rhdesca & ~RH_A_OCPM); in isp1362_hc_start()
2557 isp1362_write_reg32(isp1362_hcd, HCRHDESCA, isp1362_hcd->rhdesca | RH_A_OCPM); in isp1362_hc_start()
2558 isp1362_hcd->rhdesca = isp1362_read_reg32(isp1362_hcd, HCRHDESCA); in isp1362_hc_start()
2560 isp1362_hcd->rhdescb = RH_B_PPCM; in isp1362_hc_start()
2561 isp1362_write_reg32(isp1362_hcd, HCRHDESCB, isp1362_hcd->rhdescb); in isp1362_hc_start()
2562 isp1362_hcd->rhdescb = isp1362_read_reg32(isp1362_hcd, HCRHDESCB); in isp1362_hc_start()
2564 isp1362_read_reg32(isp1362_hcd, HCFMINTVL); in isp1362_hc_start()
2565 isp1362_write_reg32(isp1362_hcd, HCFMINTVL, (FSMP(FI) << 16) | FI); in isp1362_hc_start()
2566 isp1362_write_reg32(isp1362_hcd, HCLSTHRESH, LSTHRESH); in isp1362_hc_start()
2568 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_hc_start()
2570 isp1362_hcd->hc_control = OHCI_USB_OPER; in isp1362_hc_start()
2573 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_hc_start()
2575 isp1362_hcd->intenb = OHCI_INTR_MIE | OHCI_INTR_RHSC | OHCI_INTR_UE; in isp1362_hc_start()
2576 isp1362_hcd->intenb |= OHCI_INTR_RD; in isp1362_hc_start()
2577 isp1362_hcd->irqenb = HCuPINT_OPR | HCuPINT_SUSP; in isp1362_hc_start()
2578 isp1362_write_reg32(isp1362_hcd, HCINTENB, isp1362_hcd->intenb); in isp1362_hc_start()
2579 isp1362_write_reg16(isp1362_hcd, HCuPINTENB, isp1362_hcd->irqenb); in isp1362_hc_start()
2582 isp1362_write_reg32(isp1362_hcd, HCCONTROL, isp1362_hcd->hc_control); in isp1362_hc_start()
2584 isp1362_write_reg32(isp1362_hcd, HCRHSTATUS, RH_HS_LPSC | RH_HS_DRWE); in isp1362_hc_start()
2586 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_hc_start()
2596 .hcd_priv_size = sizeof(struct isp1362_hcd),
2622 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd); in isp1362_remove() local
2624 remove_debug_file(isp1362_hcd); in isp1362_remove()
2637 struct isp1362_hcd *isp1362_hcd; in isp1362_probe() local
2683 isp1362_hcd = hcd_to_isp1362_hcd(hcd); in isp1362_probe()
2684 isp1362_hcd->data_reg = data_reg; in isp1362_probe()
2685 isp1362_hcd->addr_reg = addr_reg; in isp1362_probe()
2687 isp1362_hcd->next_statechange = jiffies; in isp1362_probe()
2688 spin_lock_init(&isp1362_hcd->lock); in isp1362_probe()
2689 INIT_LIST_HEAD(&isp1362_hcd->async); in isp1362_probe()
2690 INIT_LIST_HEAD(&isp1362_hcd->periodic); in isp1362_probe()
2691 INIT_LIST_HEAD(&isp1362_hcd->isoc); in isp1362_probe()
2692 INIT_LIST_HEAD(&isp1362_hcd->remove_list); in isp1362_probe()
2693 isp1362_hcd->board = dev_get_platdata(&pdev->dev); in isp1362_probe()
2695 if (!isp1362_hcd->board->delay) { in isp1362_probe()
2718 create_debug_file(isp1362_hcd); in isp1362_probe()
2732 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd); in isp1362_suspend() local
2743 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_suspend()
2744 isp1362_write_reg32(isp1362_hcd, HCRHSTATUS, RH_HS_LPS); in isp1362_suspend()
2745 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_suspend()
2755 struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd); in isp1362_resume() local
2762 spin_lock_irqsave(&isp1362_hcd->lock, flags); in isp1362_resume()
2763 isp1362_write_reg32(isp1362_hcd, HCRHSTATUS, RH_HS_LPSC); in isp1362_resume()
2764 spin_unlock_irqrestore(&isp1362_hcd->lock, flags); in isp1362_resume()
2770 return isp1362_bus_resume(isp1362_hcd_to_hcd(isp1362_hcd)); in isp1362_resume()