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()
772 list_add_tail(&ep->schedule, &isp116x->async); in isp116x_urb_enqueue()
783 ep->branch = ret = balance(isp116x, ep->period, ep->load); in isp116x_urb_enqueue()
788 urb->start_frame = (isp116x->fmindex & (PERIODIC_SIZE - 1)) in isp116x_urb_enqueue()
796 struct isp116x_ep **prev = &isp116x->periodic[i]; in isp116x_urb_enqueue()
809 isp116x->load[i] += ep->load; in isp116x_urb_enqueue()
814 if (!isp116x->periodic_count++) { in isp116x_urb_enqueue()
815 isp116x->irqenb &= ~HCuPINT_ATL; in isp116x_urb_enqueue()
816 isp116x->irqenb |= HCuPINT_SOF; in isp116x_urb_enqueue()
817 isp116x_write_reg16(isp116x, HCuPINTENB, in isp116x_urb_enqueue()
818 isp116x->irqenb); in isp116x_urb_enqueue()
823 start_atl_transfers(isp116x); in isp116x_urb_enqueue()
829 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_urb_enqueue()
839 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_urb_dequeue() local
845 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_urb_dequeue()
857 for (ep_act = isp116x->atl_active; ep_act; in isp116x_urb_dequeue()
867 finish_request(isp116x, ep, urb, status); in isp116x_urb_dequeue()
869 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_urb_dequeue()
894 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_get_frame() local
898 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_get_frame()
899 fmnum = isp116x_read_reg32(isp116x, HCFMNUM); in isp116x_get_frame()
900 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_get_frame()
909 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_hub_status_data() local
921 ports = isp116x->rhdesca & RH_A_NDP; in isp116x_hub_status_data()
922 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_hub_status_data()
923 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS); in isp116x_hub_status_data()
924 if (isp116x->rhstatus & (RH_HS_LPSC | RH_HS_OCIC)) in isp116x_hub_status_data()
930 u32 status = isp116x_read_reg32(isp116x, i ? HCRHPORT2 : HCRHPORT1); in isp116x_hub_status_data()
938 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_hub_status_data()
942 static void isp116x_hub_descriptor(struct isp116x *isp116x, in isp116x_hub_descriptor() argument
945 u32 reg = isp116x->rhdesca; in isp116x_hub_descriptor()
969 static inline void root_port_reset(struct isp116x *isp116x, unsigned port) in root_port_reset() argument
979 spin_lock_irqsave(&isp116x->lock, flags); in root_port_reset()
982 tmp = isp116x_read_reg32(isp116x, port ? in root_port_reset()
990 spin_unlock_irqrestore(&isp116x->lock, flags); in root_port_reset()
994 isp116x_write_reg32(isp116x, port ? HCRHPORT2 : in root_port_reset()
996 spin_unlock_irqrestore(&isp116x->lock, flags); in root_port_reset()
1006 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_hub_control() local
1009 int ports = isp116x->rhdesca & RH_A_NDP; in isp116x_hub_control()
1018 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_hub_control()
1019 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_OCIC); in isp116x_hub_control()
1020 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_hub_control()
1042 isp116x_hub_descriptor(isp116x, in isp116x_hub_control()
1053 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_hub_control()
1054 tmp = isp116x_read_reg32(isp116x, (--wIndex) ? HCRHPORT2 : HCRHPORT1); in isp116x_hub_control()
1055 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_hub_control()
1101 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_hub_control()
1102 isp116x_write_reg32(isp116x, wIndex in isp116x_hub_control()
1104 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_hub_control()
1114 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_hub_control()
1115 isp116x_write_reg32(isp116x, wIndex in isp116x_hub_control()
1117 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_hub_control()
1121 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_hub_control()
1122 isp116x_write_reg32(isp116x, wIndex in isp116x_hub_control()
1124 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_hub_control()
1128 root_port_reset(isp116x, wIndex); in isp116x_hub_control()
1172 struct isp116x *isp116x = s->private; in isp116x_debug_show() local
1175 isp116x_to_hcd(isp116x)->product_desc, hcd_name, in isp116x_debug_show()
1178 if (HC_IS_SUSPENDED(isp116x_to_hcd(isp116x)->state)) { in isp116x_debug_show()
1182 if (!HC_IS_RUNNING(isp116x_to_hcd(isp116x)->state)) { in isp116x_debug_show()
1187 spin_lock_irq(&isp116x->lock); in isp116x_debug_show()
1188 dump_irq(s, "hc_irq_enable", isp116x_read_reg16(isp116x, HCuPINTENB)); in isp116x_debug_show()
1189 dump_irq(s, "hc_irq_status", isp116x_read_reg16(isp116x, HCuPINT)); in isp116x_debug_show()
1190 dump_int(s, "hc_int_enable", isp116x_read_reg32(isp116x, HCINTENB)); in isp116x_debug_show()
1191 dump_int(s, "hc_int_status", isp116x_read_reg32(isp116x, HCINTSTAT)); in isp116x_debug_show()
1192 isp116x_show_regs_seq(isp116x, s); in isp116x_debug_show()
1193 spin_unlock_irq(&isp116x->lock); in isp116x_debug_show()
1200 static void create_debug_file(struct isp116x *isp116x) in create_debug_file() argument
1202 debugfs_create_file(hcd_name, S_IRUGO, usb_debug_root, isp116x, in create_debug_file()
1206 static void remove_debug_file(struct isp116x *isp116x) in remove_debug_file() argument
1213 static inline void create_debug_file(struct isp116x *isp116x) { } in create_debug_file() argument
1214 static inline void remove_debug_file(struct isp116x *isp116x) { } in remove_debug_file() argument
1223 static int isp116x_sw_reset(struct isp116x *isp116x) in isp116x_sw_reset() argument
1229 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_sw_reset()
1230 isp116x_write_reg16(isp116x, HCSWRES, HCSWRES_MAGIC); in isp116x_sw_reset()
1231 isp116x_write_reg32(isp116x, HCCMDSTAT, HCCMDSTAT_HCR); in isp116x_sw_reset()
1235 if (!(isp116x_read_reg32(isp116x, HCCMDSTAT) & HCCMDSTAT_HCR)) in isp116x_sw_reset()
1242 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_sw_reset()
1248 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_reset() local
1253 ret = isp116x_sw_reset(isp116x); in isp116x_reset()
1260 spin_lock_irq(&isp116x->lock); in isp116x_reset()
1261 clkrdy = isp116x_read_reg16(isp116x, HCuPINT) & HCuPINT_CLKRDY; in isp116x_reset()
1262 spin_unlock_irq(&isp116x->lock); in isp116x_reset()
1278 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_stop() local
1282 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_stop()
1283 isp116x_write_reg16(isp116x, HCuPINTENB, 0); in isp116x_stop()
1287 val = isp116x_read_reg32(isp116x, HCRHDESCA); in isp116x_stop()
1289 isp116x_write_reg32(isp116x, HCRHDESCA, val); in isp116x_stop()
1290 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_LPS); in isp116x_stop()
1291 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_stop()
1293 isp116x_sw_reset(isp116x); in isp116x_stop()
1301 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_start() local
1302 struct isp116x_platform_data *board = isp116x->board; in isp116x_start()
1306 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_start()
1309 isp116x_write_reg16(isp116x, HCuPINT, 0xff); in isp116x_start()
1310 isp116x_write_reg16(isp116x, HCuPINTENB, 0); in isp116x_start()
1312 val = isp116x_read_reg16(isp116x, HCCHIPID); in isp116x_start()
1315 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_start()
1322 isp116x_write_reg16(isp116x, HCITLBUFLEN, ISP116x_ITL_BUFSIZE); in isp116x_start()
1323 isp116x_write_reg16(isp116x, HCATLBUFLEN, ISP116x_ATL_BUFSIZE); in isp116x_start()
1338 isp116x_write_reg16(isp116x, HCHWCFG, val); in isp116x_start()
1348 isp116x_write_reg32(isp116x, HCRHDESCA, val); in isp116x_start()
1349 isp116x->rhdesca = isp116x_read_reg32(isp116x, HCRHDESCA); in isp116x_start()
1352 isp116x_write_reg32(isp116x, HCRHDESCB, val); in isp116x_start()
1353 isp116x->rhdescb = isp116x_read_reg32(isp116x, HCRHDESCB); in isp116x_start()
1361 isp116x_write_reg32(isp116x, HCRHSTATUS, val); in isp116x_start()
1362 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS); in isp116x_start()
1364 isp116x_write_reg32(isp116x, HCFMINTVL, 0x27782edf); in isp116x_start()
1369 isp116x->intenb = HCINT_MIE | HCINT_RHSC | HCINT_UE; in isp116x_start()
1371 isp116x->intenb |= HCINT_RD; in isp116x_start()
1372 isp116x->irqenb = HCuPINT_ATL | HCuPINT_OPR; /* | HCuPINT_SUSP; */ in isp116x_start()
1373 isp116x_write_reg32(isp116x, HCINTENB, isp116x->intenb); in isp116x_start()
1374 isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb); in isp116x_start()
1380 isp116x_write_reg32(isp116x, HCCONTROL, val); in isp116x_start()
1383 isp116x_write_reg32(isp116x, HCRHPORT1, RH_PS_CCS); in isp116x_start()
1384 isp116x_write_reg32(isp116x, HCRHPORT2, RH_PS_CCS); in isp116x_start()
1386 isp116x_show_regs_log(isp116x); in isp116x_start()
1387 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_start()
1395 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_bus_suspend() local
1400 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_bus_suspend()
1401 val = isp116x_read_reg32(isp116x, HCCONTROL); in isp116x_bus_suspend()
1405 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_bus_suspend()
1412 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_bus_suspend()
1413 isp116x_write_reg32(isp116x, HCCONTROL, val); in isp116x_bus_suspend()
1414 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_bus_suspend()
1419 isp116x_write_reg32(isp116x, HCCONTROL, in isp116x_bus_suspend()
1427 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_bus_suspend()
1436 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_bus_resume() local
1440 spin_lock_irq(&isp116x->lock); in isp116x_bus_resume()
1442 val = isp116x_read_reg32(isp116x, HCCONTROL); in isp116x_bus_resume()
1447 isp116x_write_reg32(isp116x, HCCONTROL, val); in isp116x_bus_resume()
1452 spin_unlock_irq(&isp116x->lock); in isp116x_bus_resume()
1457 spin_unlock_irq(&isp116x->lock); in isp116x_bus_resume()
1463 if ((isp116x->rhdesca & RH_A_NDP) == 2) in isp116x_bus_resume()
1469 val = isp116x->rhdesca & RH_A_NDP; in isp116x_bus_resume()
1472 isp116x_read_reg32(isp116x, val ? HCRHPORT2 : HCRHPORT1); in isp116x_bus_resume()
1477 isp116x_write_reg32(isp116x, RH_PS_POCI, val in isp116x_bus_resume()
1480 spin_unlock_irq(&isp116x->lock); in isp116x_bus_resume()
1486 spin_lock_irq(&isp116x->lock); in isp116x_bus_resume()
1487 val = isp116x_read_reg32(isp116x, HCCONTROL); in isp116x_bus_resume()
1488 isp116x_write_reg32(isp116x, HCCONTROL, in isp116x_bus_resume()
1490 spin_unlock_irq(&isp116x->lock); in isp116x_bus_resume()
1506 .hcd_priv_size = sizeof(struct isp116x),
1532 struct isp116x *isp116x; in isp116x_remove() local
1537 isp116x = hcd_to_isp116x(hcd); in isp116x_remove()
1538 remove_debug_file(isp116x); in isp116x_remove()
1541 iounmap(isp116x->data_reg); in isp116x_remove()
1545 iounmap(isp116x->addr_reg); in isp116x_remove()
1557 struct isp116x *isp116x; in isp116x_probe() local
1612 isp116x = hcd_to_isp116x(hcd); in isp116x_probe()
1613 isp116x->data_reg = data_reg; in isp116x_probe()
1614 isp116x->addr_reg = addr_reg; in isp116x_probe()
1615 spin_lock_init(&isp116x->lock); in isp116x_probe()
1616 INIT_LIST_HEAD(&isp116x->async); in isp116x_probe()
1617 isp116x->board = dev_get_platdata(&pdev->dev); in isp116x_probe()
1619 if (!isp116x->board) { in isp116x_probe()
1624 if (isp116x_check_platform_delay(isp116x)) { in isp116x_probe()
1638 create_debug_file(isp116x); in isp116x_probe()