Lines Matching refs:isp116x
90 static void write_ptddata_to_fifo(struct isp116x *isp116x, void *buf, int len) in write_ptddata_to_fifo() argument
106 isp116x_raw_write_data16(isp116x, w); in write_ptddata_to_fifo()
109 isp116x_write_data16(isp116x, (u16) * dp); in write_ptddata_to_fifo()
114 isp116x_raw_write_data16(isp116x, cpu_to_le16(*dp2++)); in write_ptddata_to_fifo()
118 isp116x_write_data16(isp116x, 0xff & *((u8 *) dp2)); in write_ptddata_to_fifo()
121 isp116x_raw_write_data16(isp116x, 0); in write_ptddata_to_fifo()
127 static void read_ptddata_from_fifo(struct isp116x *isp116x, void *buf, int len) in read_ptddata_from_fifo() argument
141 w = isp116x_raw_read_data16(isp116x); in read_ptddata_from_fifo()
147 *dp = 0xff & isp116x_read_data16(isp116x); in read_ptddata_from_fifo()
152 *dp2++ = le16_to_cpu(isp116x_raw_read_data16(isp116x)); in read_ptddata_from_fifo()
156 *(u8 *) dp2 = 0xff & isp116x_read_data16(isp116x); in read_ptddata_from_fifo()
159 isp116x_raw_read_data16(isp116x); in read_ptddata_from_fifo()
166 static void pack_fifo(struct isp116x *isp116x) in pack_fifo() argument
170 int buflen = isp116x->atl_last_dir == PTD_DIR_IN in pack_fifo()
171 ? isp116x->atl_bufshrt : isp116x->atl_buflen; in pack_fifo()
173 isp116x_write_reg16(isp116x, HCuPINT, HCuPINT_AIIEOT); in pack_fifo()
174 isp116x_write_reg16(isp116x, HCXFERCTR, buflen); in pack_fifo()
175 isp116x_write_addr(isp116x, HCATLPORT | ISP116x_WRITE_OFFSET); in pack_fifo()
176 for (ep = isp116x->atl_active; ep; ep = ep->active) { in pack_fifo()
180 isp116x_write_data16(isp116x, ptd->count); in pack_fifo()
181 isp116x_write_data16(isp116x, ptd->mps); in pack_fifo()
182 isp116x_write_data16(isp116x, ptd->len); in pack_fifo()
183 isp116x_write_data16(isp116x, ptd->faddr); in pack_fifo()
186 if (ep->active || (isp116x->atl_last_dir != PTD_DIR_IN)) { in pack_fifo()
187 write_ptddata_to_fifo(isp116x, ep->data, ep->length); in pack_fifo()
198 static void unpack_fifo(struct isp116x *isp116x) in unpack_fifo() argument
202 int buflen = isp116x->atl_last_dir == PTD_DIR_IN in unpack_fifo()
203 ? isp116x->atl_buflen : isp116x->atl_bufshrt; in unpack_fifo()
205 isp116x_write_reg16(isp116x, HCuPINT, HCuPINT_AIIEOT); in unpack_fifo()
206 isp116x_write_reg16(isp116x, HCXFERCTR, buflen); in unpack_fifo()
207 isp116x_write_addr(isp116x, HCATLPORT); in unpack_fifo()
208 for (ep = isp116x->atl_active; ep; ep = ep->active) { in unpack_fifo()
210 ptd->count = isp116x_read_data16(isp116x); in unpack_fifo()
211 ptd->mps = isp116x_read_data16(isp116x); in unpack_fifo()
212 ptd->len = isp116x_read_data16(isp116x); in unpack_fifo()
213 ptd->faddr = isp116x_read_data16(isp116x); in unpack_fifo()
216 if (ep->active || (isp116x->atl_last_dir == PTD_DIR_IN)) { in unpack_fifo()
217 read_ptddata_from_fifo(isp116x, ep->data, ep->length); in unpack_fifo()
231 static void preproc_atl_queue(struct isp116x *isp116x) in preproc_atl_queue() argument
238 for (ep = isp116x->atl_active; ep; ep = ep->active) { in preproc_atl_queue()
283 isp116x->atl_last_dir = dir; in preproc_atl_queue()
285 isp116x->atl_bufshrt = sizeof(struct ptd) + isp116x->atl_buflen; in preproc_atl_queue()
286 isp116x->atl_buflen = isp116x->atl_bufshrt + ALIGN(len, 4); in preproc_atl_queue()
294 static void finish_request(struct isp116x *isp116x, struct isp116x_ep *ep, in finish_request() argument
296 __releases(isp116x->lock) __acquires(isp116x->lock) in finish_request()
307 usb_hcd_unlink_urb_from_ep(isp116x_to_hcd(isp116x), urb); in finish_request()
308 spin_unlock(&isp116x->lock); in finish_request()
309 usb_hcd_giveback_urb(isp116x_to_hcd(isp116x), urb, status); in finish_request()
310 spin_lock(&isp116x->lock); in finish_request()
326 struct isp116x_ep **prev = &isp116x->periodic[i]; in finish_request()
332 isp116x->load[i] -= ep->load; in finish_request()
335 isp116x_to_hcd(isp116x)->self.bandwidth_allocated -= in finish_request()
339 if (!--isp116x->periodic_count) { in finish_request()
340 isp116x->irqenb &= ~HCuPINT_SOF; in finish_request()
341 isp116x->irqenb |= HCuPINT_ATL; in finish_request()
348 static void postproc_atl_queue(struct isp116x *isp116x) in postproc_atl_queue() argument
358 for (ep = isp116x->atl_active; ep; ep = ep->active) { in postproc_atl_queue()
472 finish_request(isp116x, ep, urb, status); in postproc_atl_queue()
480 static void start_atl_transfers(struct isp116x *isp116x) in start_atl_transfers() argument
487 if (atomic_read(&isp116x->atl_finishing)) in start_atl_transfers()
490 if (!HC_IS_RUNNING(isp116x_to_hcd(isp116x)->state)) in start_atl_transfers()
494 if (isp116x_read_reg16(isp116x, HCBUFSTAT) & HCBUFSTAT_ATL_FULL) in start_atl_transfers()
497 isp116x->atl_active = NULL; in start_atl_transfers()
498 isp116x->atl_buflen = isp116x->atl_bufshrt = 0; in start_atl_transfers()
501 if (isp116x->periodic_count) { in start_atl_transfers()
502 isp116x->fmindex = index = in start_atl_transfers()
503 (isp116x->fmindex + 1) & (PERIODIC_SIZE - 1); in start_atl_transfers()
504 load = isp116x->load[index]; in start_atl_transfers()
508 isp116x->atl_active = last_ep = in start_atl_transfers()
509 isp116x->periodic[index]; in start_atl_transfers()
517 list_for_each_entry(ep, &isp116x->async, schedule) { in start_atl_transfers()
560 isp116x->atl_active = ep; in start_atl_transfers()
565 if ((&isp116x->async)->next != (&isp116x->async)->prev) in start_atl_transfers()
566 list_move(&isp116x->async, (&isp116x->async)->next); in start_atl_transfers()
568 if (isp116x->atl_active) { in start_atl_transfers()
569 preproc_atl_queue(isp116x); in start_atl_transfers()
570 pack_fifo(isp116x); in start_atl_transfers()
577 static void finish_atl_transfers(struct isp116x *isp116x) in finish_atl_transfers() argument
579 if (!isp116x->atl_active) in finish_atl_transfers()
582 if (!(isp116x_read_reg16(isp116x, HCBUFSTAT) & HCBUFSTAT_ATL_DONE)) in finish_atl_transfers()
585 atomic_inc(&isp116x->atl_finishing); in finish_atl_transfers()
586 unpack_fifo(isp116x); in finish_atl_transfers()
587 postproc_atl_queue(isp116x); in finish_atl_transfers()
588 atomic_dec(&isp116x->atl_finishing); in finish_atl_transfers()
593 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_irq() local
597 spin_lock(&isp116x->lock); in isp116x_irq()
598 isp116x_write_reg16(isp116x, HCuPINTENB, 0); in isp116x_irq()
599 irqstat = isp116x_read_reg16(isp116x, HCuPINT); in isp116x_irq()
600 isp116x_write_reg16(isp116x, HCuPINT, irqstat); in isp116x_irq()
604 finish_atl_transfers(isp116x); in isp116x_irq()
608 u32 intstat = isp116x_read_reg32(isp116x, HCINTSTAT); in isp116x_irq()
609 isp116x_write_reg32(isp116x, HCINTSTAT, intstat); in isp116x_irq()
634 start_atl_transfers(isp116x); in isp116x_irq()
637 isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb); in isp116x_irq()
639 spin_unlock(&isp116x->lock); in isp116x_irq()
652 static int balance(struct isp116x *isp116x, u16 period, u16 load) in balance() argument
659 if (branch < 0 || isp116x->load[branch] > isp116x->load[i]) { in balance()
663 if ((isp116x->load[j] + load) in balance()
685 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_urb_enqueue() local
711 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_urb_enqueue()
773 list_add_tail(&ep->schedule, &isp116x->async); in isp116x_urb_enqueue()
784 ep->branch = ret = balance(isp116x, ep->period, ep->load); in isp116x_urb_enqueue()
789 urb->start_frame = (isp116x->fmindex & (PERIODIC_SIZE - 1)) in isp116x_urb_enqueue()
797 struct isp116x_ep **prev = &isp116x->periodic[i]; in isp116x_urb_enqueue()
810 isp116x->load[i] += ep->load; in isp116x_urb_enqueue()
815 if (!isp116x->periodic_count++) { in isp116x_urb_enqueue()
816 isp116x->irqenb &= ~HCuPINT_ATL; in isp116x_urb_enqueue()
817 isp116x->irqenb |= HCuPINT_SOF; in isp116x_urb_enqueue()
818 isp116x_write_reg16(isp116x, HCuPINTENB, in isp116x_urb_enqueue()
819 isp116x->irqenb); in isp116x_urb_enqueue()
824 start_atl_transfers(isp116x); in isp116x_urb_enqueue()
830 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_urb_enqueue()
840 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_urb_dequeue() local
846 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_urb_dequeue()
858 for (ep_act = isp116x->atl_active; ep_act; in isp116x_urb_dequeue()
868 finish_request(isp116x, ep, urb, status); in isp116x_urb_dequeue()
870 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_urb_dequeue()
895 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_get_frame() local
899 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_get_frame()
900 fmnum = isp116x_read_reg32(isp116x, HCFMNUM); in isp116x_get_frame()
901 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_get_frame()
910 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_hub_status_data() local
922 ports = isp116x->rhdesca & RH_A_NDP; in isp116x_hub_status_data()
923 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_hub_status_data()
924 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS); in isp116x_hub_status_data()
925 if (isp116x->rhstatus & (RH_HS_LPSC | RH_HS_OCIC)) in isp116x_hub_status_data()
931 u32 status = isp116x_read_reg32(isp116x, i ? HCRHPORT2 : HCRHPORT1); in isp116x_hub_status_data()
939 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_hub_status_data()
943 static void isp116x_hub_descriptor(struct isp116x *isp116x, in isp116x_hub_descriptor() argument
946 u32 reg = isp116x->rhdesca; in isp116x_hub_descriptor()
970 static inline void root_port_reset(struct isp116x *isp116x, unsigned port) in root_port_reset() argument
980 spin_lock_irqsave(&isp116x->lock, flags); in root_port_reset()
983 tmp = isp116x_read_reg32(isp116x, port ? in root_port_reset()
991 spin_unlock_irqrestore(&isp116x->lock, flags); in root_port_reset()
995 isp116x_write_reg32(isp116x, port ? HCRHPORT2 : in root_port_reset()
997 spin_unlock_irqrestore(&isp116x->lock, flags); in root_port_reset()
1007 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_hub_control() local
1010 int ports = isp116x->rhdesca & RH_A_NDP; in isp116x_hub_control()
1019 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_hub_control()
1020 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_OCIC); in isp116x_hub_control()
1021 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_hub_control()
1043 isp116x_hub_descriptor(isp116x, in isp116x_hub_control()
1054 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_hub_control()
1055 tmp = isp116x_read_reg32(isp116x, (--wIndex) ? HCRHPORT2 : HCRHPORT1); in isp116x_hub_control()
1056 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_hub_control()
1102 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_hub_control()
1103 isp116x_write_reg32(isp116x, wIndex in isp116x_hub_control()
1105 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_hub_control()
1115 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_hub_control()
1116 isp116x_write_reg32(isp116x, wIndex in isp116x_hub_control()
1118 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_hub_control()
1122 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_hub_control()
1123 isp116x_write_reg32(isp116x, wIndex in isp116x_hub_control()
1125 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_hub_control()
1129 root_port_reset(isp116x, wIndex); in isp116x_hub_control()
1173 struct isp116x *isp116x = s->private; in isp116x_debug_show() local
1176 isp116x_to_hcd(isp116x)->product_desc, hcd_name, in isp116x_debug_show()
1179 if (HC_IS_SUSPENDED(isp116x_to_hcd(isp116x)->state)) { in isp116x_debug_show()
1183 if (!HC_IS_RUNNING(isp116x_to_hcd(isp116x)->state)) { in isp116x_debug_show()
1188 spin_lock_irq(&isp116x->lock); in isp116x_debug_show()
1189 dump_irq(s, "hc_irq_enable", isp116x_read_reg16(isp116x, HCuPINTENB)); in isp116x_debug_show()
1190 dump_irq(s, "hc_irq_status", isp116x_read_reg16(isp116x, HCuPINT)); in isp116x_debug_show()
1191 dump_int(s, "hc_int_enable", isp116x_read_reg32(isp116x, HCINTENB)); in isp116x_debug_show()
1192 dump_int(s, "hc_int_status", isp116x_read_reg32(isp116x, HCINTSTAT)); in isp116x_debug_show()
1193 isp116x_show_regs_seq(isp116x, s); in isp116x_debug_show()
1194 spin_unlock_irq(&isp116x->lock); in isp116x_debug_show()
1201 static void create_debug_file(struct isp116x *isp116x) in create_debug_file() argument
1203 isp116x->dentry = debugfs_create_file(hcd_name, in create_debug_file()
1204 S_IRUGO, NULL, isp116x, in create_debug_file()
1208 static void remove_debug_file(struct isp116x *isp116x) in remove_debug_file() argument
1210 debugfs_remove(isp116x->dentry); in remove_debug_file()
1215 static inline void create_debug_file(struct isp116x *isp116x) { } in create_debug_file() argument
1216 static inline void remove_debug_file(struct isp116x *isp116x) { } in remove_debug_file() argument
1225 static int isp116x_sw_reset(struct isp116x *isp116x) in isp116x_sw_reset() argument
1231 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_sw_reset()
1232 isp116x_write_reg16(isp116x, HCSWRES, HCSWRES_MAGIC); in isp116x_sw_reset()
1233 isp116x_write_reg32(isp116x, HCCMDSTAT, HCCMDSTAT_HCR); in isp116x_sw_reset()
1237 if (!(isp116x_read_reg32(isp116x, HCCMDSTAT) & HCCMDSTAT_HCR)) in isp116x_sw_reset()
1244 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_sw_reset()
1250 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_reset() local
1255 ret = isp116x_sw_reset(isp116x); in isp116x_reset()
1262 spin_lock_irq(&isp116x->lock); in isp116x_reset()
1263 clkrdy = isp116x_read_reg16(isp116x, HCuPINT) & HCuPINT_CLKRDY; in isp116x_reset()
1264 spin_unlock_irq(&isp116x->lock); in isp116x_reset()
1280 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_stop() local
1284 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_stop()
1285 isp116x_write_reg16(isp116x, HCuPINTENB, 0); in isp116x_stop()
1289 val = isp116x_read_reg32(isp116x, HCRHDESCA); in isp116x_stop()
1291 isp116x_write_reg32(isp116x, HCRHDESCA, val); in isp116x_stop()
1292 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_LPS); in isp116x_stop()
1293 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_stop()
1295 isp116x_sw_reset(isp116x); in isp116x_stop()
1303 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_start() local
1304 struct isp116x_platform_data *board = isp116x->board; in isp116x_start()
1308 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_start()
1311 isp116x_write_reg16(isp116x, HCuPINT, 0xff); in isp116x_start()
1312 isp116x_write_reg16(isp116x, HCuPINTENB, 0); in isp116x_start()
1314 val = isp116x_read_reg16(isp116x, HCCHIPID); in isp116x_start()
1317 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_start()
1324 isp116x_write_reg16(isp116x, HCITLBUFLEN, ISP116x_ITL_BUFSIZE); in isp116x_start()
1325 isp116x_write_reg16(isp116x, HCATLBUFLEN, ISP116x_ATL_BUFSIZE); in isp116x_start()
1340 isp116x_write_reg16(isp116x, HCHWCFG, val); in isp116x_start()
1350 isp116x_write_reg32(isp116x, HCRHDESCA, val); in isp116x_start()
1351 isp116x->rhdesca = isp116x_read_reg32(isp116x, HCRHDESCA); in isp116x_start()
1354 isp116x_write_reg32(isp116x, HCRHDESCB, val); in isp116x_start()
1355 isp116x->rhdescb = isp116x_read_reg32(isp116x, HCRHDESCB); in isp116x_start()
1363 isp116x_write_reg32(isp116x, HCRHSTATUS, val); in isp116x_start()
1364 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS); in isp116x_start()
1366 isp116x_write_reg32(isp116x, HCFMINTVL, 0x27782edf); in isp116x_start()
1371 isp116x->intenb = HCINT_MIE | HCINT_RHSC | HCINT_UE; in isp116x_start()
1373 isp116x->intenb |= HCINT_RD; in isp116x_start()
1374 isp116x->irqenb = HCuPINT_ATL | HCuPINT_OPR; /* | HCuPINT_SUSP; */ in isp116x_start()
1375 isp116x_write_reg32(isp116x, HCINTENB, isp116x->intenb); in isp116x_start()
1376 isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb); in isp116x_start()
1382 isp116x_write_reg32(isp116x, HCCONTROL, val); in isp116x_start()
1385 isp116x_write_reg32(isp116x, HCRHPORT1, RH_PS_CCS); in isp116x_start()
1386 isp116x_write_reg32(isp116x, HCRHPORT2, RH_PS_CCS); in isp116x_start()
1388 isp116x_show_regs_log(isp116x); in isp116x_start()
1389 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_start()
1397 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_bus_suspend() local
1402 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_bus_suspend()
1403 val = isp116x_read_reg32(isp116x, HCCONTROL); in isp116x_bus_suspend()
1407 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_bus_suspend()
1414 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_bus_suspend()
1415 isp116x_write_reg32(isp116x, HCCONTROL, val); in isp116x_bus_suspend()
1416 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_bus_suspend()
1421 isp116x_write_reg32(isp116x, HCCONTROL, in isp116x_bus_suspend()
1429 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_bus_suspend()
1438 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_bus_resume() local
1442 spin_lock_irq(&isp116x->lock); in isp116x_bus_resume()
1444 val = isp116x_read_reg32(isp116x, HCCONTROL); in isp116x_bus_resume()
1449 isp116x_write_reg32(isp116x, HCCONTROL, val); in isp116x_bus_resume()
1453 spin_unlock_irq(&isp116x->lock); in isp116x_bus_resume()
1458 spin_unlock_irq(&isp116x->lock); in isp116x_bus_resume()
1464 if ((isp116x->rhdesca & RH_A_NDP) == 2) in isp116x_bus_resume()
1470 val = isp116x->rhdesca & RH_A_NDP; in isp116x_bus_resume()
1473 isp116x_read_reg32(isp116x, val ? HCRHPORT2 : HCRHPORT1); in isp116x_bus_resume()
1478 isp116x_write_reg32(isp116x, RH_PS_POCI, val in isp116x_bus_resume()
1481 spin_unlock_irq(&isp116x->lock); in isp116x_bus_resume()
1487 spin_lock_irq(&isp116x->lock); in isp116x_bus_resume()
1488 val = isp116x_read_reg32(isp116x, HCCONTROL); in isp116x_bus_resume()
1489 isp116x_write_reg32(isp116x, HCCONTROL, in isp116x_bus_resume()
1491 spin_unlock_irq(&isp116x->lock); in isp116x_bus_resume()
1507 .hcd_priv_size = sizeof(struct isp116x),
1533 struct isp116x *isp116x; in isp116x_remove() local
1538 isp116x = hcd_to_isp116x(hcd); in isp116x_remove()
1539 remove_debug_file(isp116x); in isp116x_remove()
1542 iounmap(isp116x->data_reg); in isp116x_remove()
1545 iounmap(isp116x->addr_reg); in isp116x_remove()
1556 struct isp116x *isp116x; in isp116x_probe() local
1617 isp116x = hcd_to_isp116x(hcd); in isp116x_probe()
1618 isp116x->data_reg = data_reg; in isp116x_probe()
1619 isp116x->addr_reg = addr_reg; in isp116x_probe()
1620 spin_lock_init(&isp116x->lock); in isp116x_probe()
1621 INIT_LIST_HEAD(&isp116x->async); in isp116x_probe()
1622 isp116x->board = dev_get_platdata(&pdev->dev); in isp116x_probe()
1624 if (!isp116x->board) { in isp116x_probe()
1629 if (isp116x_check_platform_delay(isp116x)) { in isp116x_probe()
1643 create_debug_file(isp116x); in isp116x_probe()