Lines Matching refs:isp116x
89 static void write_ptddata_to_fifo(struct isp116x *isp116x, void *buf, int len) in write_ptddata_to_fifo() argument
105 isp116x_raw_write_data16(isp116x, w); in write_ptddata_to_fifo()
108 isp116x_write_data16(isp116x, (u16) * dp); in write_ptddata_to_fifo()
113 isp116x_raw_write_data16(isp116x, cpu_to_le16(*dp2++)); in write_ptddata_to_fifo()
117 isp116x_write_data16(isp116x, 0xff & *((u8 *) dp2)); in write_ptddata_to_fifo()
120 isp116x_raw_write_data16(isp116x, 0); in write_ptddata_to_fifo()
126 static void read_ptddata_from_fifo(struct isp116x *isp116x, void *buf, int len) in read_ptddata_from_fifo() argument
140 w = isp116x_raw_read_data16(isp116x); in read_ptddata_from_fifo()
146 *dp = 0xff & isp116x_read_data16(isp116x); in read_ptddata_from_fifo()
151 *dp2++ = le16_to_cpu(isp116x_raw_read_data16(isp116x)); in read_ptddata_from_fifo()
155 *(u8 *) dp2 = 0xff & isp116x_read_data16(isp116x); in read_ptddata_from_fifo()
158 isp116x_raw_read_data16(isp116x); in read_ptddata_from_fifo()
165 static void pack_fifo(struct isp116x *isp116x) in pack_fifo() argument
169 int buflen = isp116x->atl_last_dir == PTD_DIR_IN in pack_fifo()
170 ? isp116x->atl_bufshrt : isp116x->atl_buflen; in pack_fifo()
172 isp116x_write_reg16(isp116x, HCuPINT, HCuPINT_AIIEOT); in pack_fifo()
173 isp116x_write_reg16(isp116x, HCXFERCTR, buflen); in pack_fifo()
174 isp116x_write_addr(isp116x, HCATLPORT | ISP116x_WRITE_OFFSET); in pack_fifo()
175 for (ep = isp116x->atl_active; ep; ep = ep->active) { in pack_fifo()
179 isp116x_write_data16(isp116x, ptd->count); in pack_fifo()
180 isp116x_write_data16(isp116x, ptd->mps); in pack_fifo()
181 isp116x_write_data16(isp116x, ptd->len); in pack_fifo()
182 isp116x_write_data16(isp116x, ptd->faddr); in pack_fifo()
185 if (ep->active || (isp116x->atl_last_dir != PTD_DIR_IN)) { in pack_fifo()
186 write_ptddata_to_fifo(isp116x, ep->data, ep->length); in pack_fifo()
197 static void unpack_fifo(struct isp116x *isp116x) in unpack_fifo() argument
201 int buflen = isp116x->atl_last_dir == PTD_DIR_IN in unpack_fifo()
202 ? isp116x->atl_buflen : isp116x->atl_bufshrt; in unpack_fifo()
204 isp116x_write_reg16(isp116x, HCuPINT, HCuPINT_AIIEOT); in unpack_fifo()
205 isp116x_write_reg16(isp116x, HCXFERCTR, buflen); in unpack_fifo()
206 isp116x_write_addr(isp116x, HCATLPORT); in unpack_fifo()
207 for (ep = isp116x->atl_active; ep; ep = ep->active) { in unpack_fifo()
209 ptd->count = isp116x_read_data16(isp116x); in unpack_fifo()
210 ptd->mps = isp116x_read_data16(isp116x); in unpack_fifo()
211 ptd->len = isp116x_read_data16(isp116x); in unpack_fifo()
212 ptd->faddr = isp116x_read_data16(isp116x); in unpack_fifo()
215 if (ep->active || (isp116x->atl_last_dir == PTD_DIR_IN)) { in unpack_fifo()
216 read_ptddata_from_fifo(isp116x, ep->data, ep->length); in unpack_fifo()
230 static void preproc_atl_queue(struct isp116x *isp116x) in preproc_atl_queue() argument
237 for (ep = isp116x->atl_active; ep; ep = ep->active) { in preproc_atl_queue()
282 isp116x->atl_last_dir = dir; in preproc_atl_queue()
284 isp116x->atl_bufshrt = sizeof(struct ptd) + isp116x->atl_buflen; in preproc_atl_queue()
285 isp116x->atl_buflen = isp116x->atl_bufshrt + ALIGN(len, 4); in preproc_atl_queue()
293 static void finish_request(struct isp116x *isp116x, struct isp116x_ep *ep, in finish_request() argument
295 __releases(isp116x->lock) __acquires(isp116x->lock) in finish_request()
306 usb_hcd_unlink_urb_from_ep(isp116x_to_hcd(isp116x), urb); in finish_request()
307 spin_unlock(&isp116x->lock); in finish_request()
308 usb_hcd_giveback_urb(isp116x_to_hcd(isp116x), urb, status); in finish_request()
309 spin_lock(&isp116x->lock); in finish_request()
325 struct isp116x_ep **prev = &isp116x->periodic[i]; in finish_request()
331 isp116x->load[i] -= ep->load; in finish_request()
334 isp116x_to_hcd(isp116x)->self.bandwidth_allocated -= in finish_request()
338 if (!--isp116x->periodic_count) { in finish_request()
339 isp116x->irqenb &= ~HCuPINT_SOF; in finish_request()
340 isp116x->irqenb |= HCuPINT_ATL; in finish_request()
347 static void postproc_atl_queue(struct isp116x *isp116x) in postproc_atl_queue() argument
357 for (ep = isp116x->atl_active; ep; ep = ep->active) { in postproc_atl_queue()
471 finish_request(isp116x, ep, urb, status); in postproc_atl_queue()
479 static void start_atl_transfers(struct isp116x *isp116x) in start_atl_transfers() argument
486 if (atomic_read(&isp116x->atl_finishing)) in start_atl_transfers()
489 if (!HC_IS_RUNNING(isp116x_to_hcd(isp116x)->state)) in start_atl_transfers()
493 if (isp116x_read_reg16(isp116x, HCBUFSTAT) & HCBUFSTAT_ATL_FULL) in start_atl_transfers()
496 isp116x->atl_active = NULL; in start_atl_transfers()
497 isp116x->atl_buflen = isp116x->atl_bufshrt = 0; in start_atl_transfers()
500 if (isp116x->periodic_count) { in start_atl_transfers()
501 isp116x->fmindex = index = in start_atl_transfers()
502 (isp116x->fmindex + 1) & (PERIODIC_SIZE - 1); in start_atl_transfers()
503 load = isp116x->load[index]; in start_atl_transfers()
507 isp116x->atl_active = last_ep = in start_atl_transfers()
508 isp116x->periodic[index]; in start_atl_transfers()
516 list_for_each_entry(ep, &isp116x->async, schedule) { in start_atl_transfers()
559 isp116x->atl_active = ep; in start_atl_transfers()
564 if ((&isp116x->async)->next != (&isp116x->async)->prev) in start_atl_transfers()
565 list_move(&isp116x->async, (&isp116x->async)->next); in start_atl_transfers()
567 if (isp116x->atl_active) { in start_atl_transfers()
568 preproc_atl_queue(isp116x); in start_atl_transfers()
569 pack_fifo(isp116x); in start_atl_transfers()
576 static void finish_atl_transfers(struct isp116x *isp116x) in finish_atl_transfers() argument
578 if (!isp116x->atl_active) in finish_atl_transfers()
581 if (!(isp116x_read_reg16(isp116x, HCBUFSTAT) & HCBUFSTAT_ATL_DONE)) in finish_atl_transfers()
584 atomic_inc(&isp116x->atl_finishing); in finish_atl_transfers()
585 unpack_fifo(isp116x); in finish_atl_transfers()
586 postproc_atl_queue(isp116x); in finish_atl_transfers()
587 atomic_dec(&isp116x->atl_finishing); in finish_atl_transfers()
592 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_irq() local
596 spin_lock(&isp116x->lock); in isp116x_irq()
597 isp116x_write_reg16(isp116x, HCuPINTENB, 0); in isp116x_irq()
598 irqstat = isp116x_read_reg16(isp116x, HCuPINT); in isp116x_irq()
599 isp116x_write_reg16(isp116x, HCuPINT, irqstat); in isp116x_irq()
603 finish_atl_transfers(isp116x); in isp116x_irq()
607 u32 intstat = isp116x_read_reg32(isp116x, HCINTSTAT); in isp116x_irq()
608 isp116x_write_reg32(isp116x, HCINTSTAT, intstat); in isp116x_irq()
633 start_atl_transfers(isp116x); in isp116x_irq()
636 isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb); in isp116x_irq()
638 spin_unlock(&isp116x->lock); in isp116x_irq()
651 static int balance(struct isp116x *isp116x, u16 period, u16 load) in balance() argument
658 if (branch < 0 || isp116x->load[branch] > isp116x->load[i]) { in balance()
662 if ((isp116x->load[j] + load) in balance()
684 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_urb_enqueue() local
710 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()
1041 isp116x_hub_descriptor(isp116x, in isp116x_hub_control()
1052 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_hub_control()
1053 tmp = isp116x_read_reg32(isp116x, (--wIndex) ? HCRHPORT2 : HCRHPORT1); in isp116x_hub_control()
1054 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_hub_control()
1100 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_hub_control()
1101 isp116x_write_reg32(isp116x, wIndex in isp116x_hub_control()
1103 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_hub_control()
1113 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_hub_control()
1114 isp116x_write_reg32(isp116x, wIndex in isp116x_hub_control()
1116 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_hub_control()
1120 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_hub_control()
1121 isp116x_write_reg32(isp116x, wIndex in isp116x_hub_control()
1123 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_hub_control()
1127 root_port_reset(isp116x, wIndex); in isp116x_hub_control()
1171 struct isp116x *isp116x = s->private; in isp116x_show_dbg() local
1174 isp116x_to_hcd(isp116x)->product_desc, hcd_name, in isp116x_show_dbg()
1177 if (HC_IS_SUSPENDED(isp116x_to_hcd(isp116x)->state)) { in isp116x_show_dbg()
1181 if (!HC_IS_RUNNING(isp116x_to_hcd(isp116x)->state)) { in isp116x_show_dbg()
1186 spin_lock_irq(&isp116x->lock); in isp116x_show_dbg()
1187 dump_irq(s, "hc_irq_enable", isp116x_read_reg16(isp116x, HCuPINTENB)); in isp116x_show_dbg()
1188 dump_irq(s, "hc_irq_status", isp116x_read_reg16(isp116x, HCuPINT)); in isp116x_show_dbg()
1189 dump_int(s, "hc_int_enable", isp116x_read_reg32(isp116x, HCINTENB)); in isp116x_show_dbg()
1190 dump_int(s, "hc_int_status", isp116x_read_reg32(isp116x, HCINTSTAT)); in isp116x_show_dbg()
1191 isp116x_show_regs_seq(isp116x, s); in isp116x_show_dbg()
1192 spin_unlock_irq(&isp116x->lock); in isp116x_show_dbg()
1210 static int create_debug_file(struct isp116x *isp116x) in create_debug_file() argument
1212 isp116x->dentry = debugfs_create_file(hcd_name, in create_debug_file()
1213 S_IRUGO, NULL, isp116x, in create_debug_file()
1215 if (!isp116x->dentry) in create_debug_file()
1220 static void remove_debug_file(struct isp116x *isp116x) in remove_debug_file() argument
1222 debugfs_remove(isp116x->dentry); in remove_debug_file()
1237 static int isp116x_sw_reset(struct isp116x *isp116x) in isp116x_sw_reset() argument
1243 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_sw_reset()
1244 isp116x_write_reg16(isp116x, HCSWRES, HCSWRES_MAGIC); in isp116x_sw_reset()
1245 isp116x_write_reg32(isp116x, HCCMDSTAT, HCCMDSTAT_HCR); in isp116x_sw_reset()
1249 if (!(isp116x_read_reg32(isp116x, HCCMDSTAT) & HCCMDSTAT_HCR)) in isp116x_sw_reset()
1256 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_sw_reset()
1262 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_reset() local
1267 ret = isp116x_sw_reset(isp116x); in isp116x_reset()
1274 spin_lock_irq(&isp116x->lock); in isp116x_reset()
1275 clkrdy = isp116x_read_reg16(isp116x, HCuPINT) & HCuPINT_CLKRDY; in isp116x_reset()
1276 spin_unlock_irq(&isp116x->lock); in isp116x_reset()
1292 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_stop() local
1296 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_stop()
1297 isp116x_write_reg16(isp116x, HCuPINTENB, 0); in isp116x_stop()
1301 val = isp116x_read_reg32(isp116x, HCRHDESCA); in isp116x_stop()
1303 isp116x_write_reg32(isp116x, HCRHDESCA, val); in isp116x_stop()
1304 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_LPS); in isp116x_stop()
1305 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_stop()
1307 isp116x_sw_reset(isp116x); in isp116x_stop()
1315 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_start() local
1316 struct isp116x_platform_data *board = isp116x->board; in isp116x_start()
1320 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_start()
1323 isp116x_write_reg16(isp116x, HCuPINT, 0xff); in isp116x_start()
1324 isp116x_write_reg16(isp116x, HCuPINTENB, 0); in isp116x_start()
1326 val = isp116x_read_reg16(isp116x, HCCHIPID); in isp116x_start()
1329 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_start()
1336 isp116x_write_reg16(isp116x, HCITLBUFLEN, ISP116x_ITL_BUFSIZE); in isp116x_start()
1337 isp116x_write_reg16(isp116x, HCATLBUFLEN, ISP116x_ATL_BUFSIZE); in isp116x_start()
1352 isp116x_write_reg16(isp116x, HCHWCFG, val); in isp116x_start()
1362 isp116x_write_reg32(isp116x, HCRHDESCA, val); in isp116x_start()
1363 isp116x->rhdesca = isp116x_read_reg32(isp116x, HCRHDESCA); in isp116x_start()
1366 isp116x_write_reg32(isp116x, HCRHDESCB, val); in isp116x_start()
1367 isp116x->rhdescb = isp116x_read_reg32(isp116x, HCRHDESCB); in isp116x_start()
1375 isp116x_write_reg32(isp116x, HCRHSTATUS, val); in isp116x_start()
1376 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS); in isp116x_start()
1378 isp116x_write_reg32(isp116x, HCFMINTVL, 0x27782edf); in isp116x_start()
1383 isp116x->intenb = HCINT_MIE | HCINT_RHSC | HCINT_UE; in isp116x_start()
1385 isp116x->intenb |= HCINT_RD; in isp116x_start()
1386 isp116x->irqenb = HCuPINT_ATL | HCuPINT_OPR; /* | HCuPINT_SUSP; */ in isp116x_start()
1387 isp116x_write_reg32(isp116x, HCINTENB, isp116x->intenb); in isp116x_start()
1388 isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb); in isp116x_start()
1394 isp116x_write_reg32(isp116x, HCCONTROL, val); in isp116x_start()
1397 isp116x_write_reg32(isp116x, HCRHPORT1, RH_PS_CCS); in isp116x_start()
1398 isp116x_write_reg32(isp116x, HCRHPORT2, RH_PS_CCS); in isp116x_start()
1400 isp116x_show_regs_log(isp116x); in isp116x_start()
1401 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_start()
1409 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_bus_suspend() local
1414 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_bus_suspend()
1415 val = isp116x_read_reg32(isp116x, HCCONTROL); in isp116x_bus_suspend()
1419 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_bus_suspend()
1426 spin_lock_irqsave(&isp116x->lock, flags); in isp116x_bus_suspend()
1427 isp116x_write_reg32(isp116x, HCCONTROL, val); in isp116x_bus_suspend()
1428 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_bus_suspend()
1433 isp116x_write_reg32(isp116x, HCCONTROL, in isp116x_bus_suspend()
1439 spin_unlock_irqrestore(&isp116x->lock, flags); in isp116x_bus_suspend()
1448 struct isp116x *isp116x = hcd_to_isp116x(hcd); in isp116x_bus_resume() local
1452 spin_lock_irq(&isp116x->lock); in isp116x_bus_resume()
1454 val = isp116x_read_reg32(isp116x, HCCONTROL); in isp116x_bus_resume()
1459 isp116x_write_reg32(isp116x, HCCONTROL, val); in isp116x_bus_resume()
1463 spin_unlock_irq(&isp116x->lock); in isp116x_bus_resume()
1468 spin_unlock_irq(&isp116x->lock); in isp116x_bus_resume()
1474 if ((isp116x->rhdesca & RH_A_NDP) == 2) in isp116x_bus_resume()
1480 val = isp116x->rhdesca & RH_A_NDP; in isp116x_bus_resume()
1483 isp116x_read_reg32(isp116x, val ? HCRHPORT2 : HCRHPORT1); in isp116x_bus_resume()
1488 isp116x_write_reg32(isp116x, RH_PS_POCI, val in isp116x_bus_resume()
1491 spin_unlock_irq(&isp116x->lock); in isp116x_bus_resume()
1497 spin_lock_irq(&isp116x->lock); in isp116x_bus_resume()
1498 val = isp116x_read_reg32(isp116x, HCCONTROL); in isp116x_bus_resume()
1499 isp116x_write_reg32(isp116x, HCCONTROL, in isp116x_bus_resume()
1501 spin_unlock_irq(&isp116x->lock); in isp116x_bus_resume()
1517 .hcd_priv_size = sizeof(struct isp116x),
1543 struct isp116x *isp116x; in isp116x_remove() local
1548 isp116x = hcd_to_isp116x(hcd); in isp116x_remove()
1549 remove_debug_file(isp116x); in isp116x_remove()
1552 iounmap(isp116x->data_reg); in isp116x_remove()
1555 iounmap(isp116x->addr_reg); in isp116x_remove()
1566 struct isp116x *isp116x; in isp116x_probe() local
1627 isp116x = hcd_to_isp116x(hcd); in isp116x_probe()
1628 isp116x->data_reg = data_reg; in isp116x_probe()
1629 isp116x->addr_reg = addr_reg; in isp116x_probe()
1630 spin_lock_init(&isp116x->lock); in isp116x_probe()
1631 INIT_LIST_HEAD(&isp116x->async); in isp116x_probe()
1632 isp116x->board = dev_get_platdata(&pdev->dev); in isp116x_probe()
1634 if (!isp116x->board) { in isp116x_probe()
1639 if (isp116x_check_platform_delay(isp116x)) { in isp116x_probe()
1653 ret = create_debug_file(isp116x); in isp116x_probe()