Lines Matching defs:isp116x

42   include/linux/usb-isp116x.h for more info. Some broken
67 #include <linux/usb/isp116x.h>
75 #include "isp116x.h"
83 static const char hcd_name[] = "isp116x-hcd";
90 static void write_ptddata_to_fifo(struct isp116x *isp116x, void *buf, int len)
106 isp116x_raw_write_data16(isp116x, w);
109 isp116x_write_data16(isp116x, (u16) * dp);
114 isp116x_raw_write_data16(isp116x, cpu_to_le16(*dp2++));
118 isp116x_write_data16(isp116x, 0xff & *((u8 *) dp2));
121 isp116x_raw_write_data16(isp116x, 0);
127 static void read_ptddata_from_fifo(struct isp116x *isp116x, void *buf, int len)
141 w = isp116x_raw_read_data16(isp116x);
147 *dp = 0xff & isp116x_read_data16(isp116x);
152 *dp2++ = le16_to_cpu(isp116x_raw_read_data16(isp116x));
156 *(u8 *) dp2 = 0xff & isp116x_read_data16(isp116x);
159 isp116x_raw_read_data16(isp116x);
166 static void pack_fifo(struct isp116x *isp116x)
170 int buflen = isp116x->atl_last_dir == PTD_DIR_IN
171 ? isp116x->atl_bufshrt : isp116x->atl_buflen;
173 isp116x_write_reg16(isp116x, HCuPINT, HCuPINT_AIIEOT);
174 isp116x_write_reg16(isp116x, HCXFERCTR, buflen);
175 isp116x_write_addr(isp116x, HCATLPORT | ISP116x_WRITE_OFFSET);
176 for (ep = isp116x->atl_active; ep; ep = ep->active) {
180 isp116x_write_data16(isp116x, ptd->count);
181 isp116x_write_data16(isp116x, ptd->mps);
182 isp116x_write_data16(isp116x, ptd->len);
183 isp116x_write_data16(isp116x, ptd->faddr);
186 if (ep->active || (isp116x->atl_last_dir != PTD_DIR_IN)) {
187 write_ptddata_to_fifo(isp116x, ep->data, ep->length);
198 static void unpack_fifo(struct isp116x *isp116x)
202 int buflen = isp116x->atl_last_dir == PTD_DIR_IN
203 ? isp116x->atl_buflen : isp116x->atl_bufshrt;
205 isp116x_write_reg16(isp116x, HCuPINT, HCuPINT_AIIEOT);
206 isp116x_write_reg16(isp116x, HCXFERCTR, buflen);
207 isp116x_write_addr(isp116x, HCATLPORT);
208 for (ep = isp116x->atl_active; ep; ep = ep->active) {
210 ptd->count = isp116x_read_data16(isp116x);
211 ptd->mps = isp116x_read_data16(isp116x);
212 ptd->len = isp116x_read_data16(isp116x);
213 ptd->faddr = isp116x_read_data16(isp116x);
216 if (ep->active || (isp116x->atl_last_dir == PTD_DIR_IN)) {
217 read_ptddata_from_fifo(isp116x, ep->data, ep->length);
231 static void preproc_atl_queue(struct isp116x *isp116x)
238 for (ep = isp116x->atl_active; ep; ep = ep->active) {
283 isp116x->atl_last_dir = dir;
285 isp116x->atl_bufshrt = sizeof(struct ptd) + isp116x->atl_buflen;
286 isp116x->atl_buflen = isp116x->atl_bufshrt + ALIGN(len, 4);
294 static void finish_request(struct isp116x *isp116x, struct isp116x_ep *ep,
296 __releases(isp116x->lock) __acquires(isp116x->lock)
307 usb_hcd_unlink_urb_from_ep(isp116x_to_hcd(isp116x), urb);
308 spin_unlock(&isp116x->lock);
309 usb_hcd_giveback_urb(isp116x_to_hcd(isp116x), urb, status);
310 spin_lock(&isp116x->lock);
326 struct isp116x_ep **prev = &isp116x->periodic[i];
332 isp116x->load[i] -= ep->load;
335 isp116x_to_hcd(isp116x)->self.bandwidth_allocated -=
339 if (!--isp116x->periodic_count) {
340 isp116x->irqenb &= ~HCuPINT_SOF;
341 isp116x->irqenb |= HCuPINT_ATL;
348 static void postproc_atl_queue(struct isp116x *isp116x)
358 for (ep = isp116x->atl_active; ep; ep = ep->active) {
412 /* Take into account idiosyncracies of the isp116x chip
472 finish_request(isp116x, ep, urb, status);
480 static void start_atl_transfers(struct isp116x *isp116x)
487 if (atomic_read(&isp116x->atl_finishing))
490 if (!HC_IS_RUNNING(isp116x_to_hcd(isp116x)->state))
494 if (isp116x_read_reg16(isp116x, HCBUFSTAT) & HCBUFSTAT_ATL_FULL)
497 isp116x->atl_active = NULL;
498 isp116x->atl_buflen = isp116x->atl_bufshrt = 0;
501 if (isp116x->periodic_count) {
502 isp116x->fmindex = index =
503 (isp116x->fmindex + 1) & (PERIODIC_SIZE - 1);
504 load = isp116x->load[index];
508 isp116x->atl_active = last_ep =
509 isp116x->periodic[index];
517 list_for_each_entry(ep, &isp116x->async, schedule) {
560 isp116x->atl_active = ep;
565 if ((&isp116x->async)->next != (&isp116x->async)->prev)
566 list_move(&isp116x->async, (&isp116x->async)->next);
568 if (isp116x->atl_active) {
569 preproc_atl_queue(isp116x);
570 pack_fifo(isp116x);
577 static void finish_atl_transfers(struct isp116x *isp116x)
579 if (!isp116x->atl_active)
582 if (!(isp116x_read_reg16(isp116x, HCBUFSTAT) & HCBUFSTAT_ATL_DONE))
585 atomic_inc(&isp116x->atl_finishing);
586 unpack_fifo(isp116x);
587 postproc_atl_queue(isp116x);
588 atomic_dec(&isp116x->atl_finishing);
593 struct isp116x *isp116x = hcd_to_isp116x(hcd);
597 spin_lock(&isp116x->lock);
598 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
599 irqstat = isp116x_read_reg16(isp116x, HCuPINT);
600 isp116x_write_reg16(isp116x, HCuPINT, irqstat);
604 finish_atl_transfers(isp116x);
608 u32 intstat = isp116x_read_reg32(isp116x, HCINTSTAT);
609 isp116x_write_reg32(isp116x, HCINTSTAT, intstat);
634 start_atl_transfers(isp116x);
637 isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb);
639 spin_unlock(&isp116x->lock);
652 static int balance(struct isp116x *isp116x, u16 period, u16 load)
659 if (branch < 0 || isp116x->load[branch] > isp116x->load[i]) {
663 if ((isp116x->load[j] + load)
675 /* NB! ALL the code above this point runs with isp116x->lock
685 struct isp116x *isp116x = hcd_to_isp116x(hcd);
711 spin_lock_irqsave(&isp116x->lock, flags);
772 list_add_tail(&ep->schedule, &isp116x->async);
783 ep->branch = ret = balance(isp116x, ep->period, ep->load);
788 urb->start_frame = (isp116x->fmindex & (PERIODIC_SIZE - 1))
796 struct isp116x_ep **prev = &isp116x->periodic[i];
809 isp116x->load[i] += ep->load;
814 if (!isp116x->periodic_count++) {
815 isp116x->irqenb &= ~HCuPINT_ATL;
816 isp116x->irqenb |= HCuPINT_SOF;
817 isp116x_write_reg16(isp116x, HCuPINTENB,
818 isp116x->irqenb);
823 start_atl_transfers(isp116x);
829 spin_unlock_irqrestore(&isp116x->lock, flags);
839 struct isp116x *isp116x = hcd_to_isp116x(hcd);
845 spin_lock_irqsave(&isp116x->lock, flags);
857 for (ep_act = isp116x->atl_active; ep_act;
867 finish_request(isp116x, ep, urb, status);
869 spin_unlock_irqrestore(&isp116x->lock, flags);
894 struct isp116x *isp116x = hcd_to_isp116x(hcd);
898 spin_lock_irqsave(&isp116x->lock, flags);
899 fmnum = isp116x_read_reg32(isp116x, HCFMNUM);
900 spin_unlock_irqrestore(&isp116x->lock, flags);
909 struct isp116x *isp116x = hcd_to_isp116x(hcd);
921 ports = isp116x->rhdesca & RH_A_NDP;
922 spin_lock_irqsave(&isp116x->lock, flags);
923 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS);
924 if (isp116x->rhstatus & (RH_HS_LPSC | RH_HS_OCIC))
930 u32 status = isp116x_read_reg32(isp116x, i ? HCRHPORT2 : HCRHPORT1);
938 spin_unlock_irqrestore(&isp116x->lock, flags);
942 static void isp116x_hub_descriptor(struct isp116x *isp116x,
945 u32 reg = isp116x->rhdesca;
969 static inline void root_port_reset(struct isp116x *isp116x, unsigned port)
979 spin_lock_irqsave(&isp116x->lock, flags);
982 tmp = isp116x_read_reg32(isp116x, port ?
990 spin_unlock_irqrestore(&isp116x->lock, flags);
994 isp116x_write_reg32(isp116x, port ? HCRHPORT2 :
996 spin_unlock_irqrestore(&isp116x->lock, flags);
1006 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1009 int ports = isp116x->rhdesca & RH_A_NDP;
1018 spin_lock_irqsave(&isp116x->lock, flags);
1019 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_OCIC);
1020 spin_unlock_irqrestore(&isp116x->lock, flags);
1042 isp116x_hub_descriptor(isp116x,
1053 spin_lock_irqsave(&isp116x->lock, flags);
1054 tmp = isp116x_read_reg32(isp116x, (--wIndex) ? HCRHPORT2 : HCRHPORT1);
1055 spin_unlock_irqrestore(&isp116x->lock, flags);
1101 spin_lock_irqsave(&isp116x->lock, flags);
1102 isp116x_write_reg32(isp116x, wIndex
1104 spin_unlock_irqrestore(&isp116x->lock, flags);
1114 spin_lock_irqsave(&isp116x->lock, flags);
1115 isp116x_write_reg32(isp116x, wIndex
1117 spin_unlock_irqrestore(&isp116x->lock, flags);
1121 spin_lock_irqsave(&isp116x->lock, flags);
1122 isp116x_write_reg32(isp116x, wIndex
1124 spin_unlock_irqrestore(&isp116x->lock, flags);
1128 root_port_reset(isp116x, wIndex);
1172 struct isp116x *isp116x = s->private;
1175 isp116x_to_hcd(isp116x)->product_desc, hcd_name,
1178 if (HC_IS_SUSPENDED(isp116x_to_hcd(isp116x)->state)) {
1182 if (!HC_IS_RUNNING(isp116x_to_hcd(isp116x)->state)) {
1187 spin_lock_irq(&isp116x->lock);
1188 dump_irq(s, "hc_irq_enable", isp116x_read_reg16(isp116x, HCuPINTENB));
1189 dump_irq(s, "hc_irq_status", isp116x_read_reg16(isp116x, HCuPINT));
1190 dump_int(s, "hc_int_enable", isp116x_read_reg32(isp116x, HCINTENB));
1191 dump_int(s, "hc_int_status", isp116x_read_reg32(isp116x, HCINTSTAT));
1192 isp116x_show_regs_seq(isp116x, s);
1193 spin_unlock_irq(&isp116x->lock);
1200 static void create_debug_file(struct isp116x *isp116x)
1202 debugfs_create_file(hcd_name, S_IRUGO, usb_debug_root, isp116x,
1206 static void remove_debug_file(struct isp116x *isp116x)
1213 static inline void create_debug_file(struct isp116x *isp116x) { }
1214 static inline void remove_debug_file(struct isp116x *isp116x) { }
1223 static int isp116x_sw_reset(struct isp116x *isp116x)
1229 spin_lock_irqsave(&isp116x->lock, flags);
1230 isp116x_write_reg16(isp116x, HCSWRES, HCSWRES_MAGIC);
1231 isp116x_write_reg32(isp116x, HCCMDSTAT, HCCMDSTAT_HCR);
1235 if (!(isp116x_read_reg32(isp116x, HCCMDSTAT) & HCCMDSTAT_HCR))
1242 spin_unlock_irqrestore(&isp116x->lock, flags);
1248 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1253 ret = isp116x_sw_reset(isp116x);
1260 spin_lock_irq(&isp116x->lock);
1261 clkrdy = isp116x_read_reg16(isp116x, HCuPINT) & HCuPINT_CLKRDY;
1262 spin_unlock_irq(&isp116x->lock);
1278 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1282 spin_lock_irqsave(&isp116x->lock, flags);
1283 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
1287 val = isp116x_read_reg32(isp116x, HCRHDESCA);
1289 isp116x_write_reg32(isp116x, HCRHDESCA, val);
1290 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_LPS);
1291 spin_unlock_irqrestore(&isp116x->lock, flags);
1293 isp116x_sw_reset(isp116x);
1301 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1302 struct isp116x_platform_data *board = isp116x->board;
1306 spin_lock_irqsave(&isp116x->lock, flags);
1309 isp116x_write_reg16(isp116x, HCuPINT, 0xff);
1310 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
1312 val = isp116x_read_reg16(isp116x, HCCHIPID);
1315 spin_unlock_irqrestore(&isp116x->lock, flags);
1322 isp116x_write_reg16(isp116x, HCITLBUFLEN, ISP116x_ITL_BUFSIZE);
1323 isp116x_write_reg16(isp116x, HCATLBUFLEN, ISP116x_ATL_BUFSIZE);
1338 isp116x_write_reg16(isp116x, HCHWCFG, val);
1348 isp116x_write_reg32(isp116x, HCRHDESCA, val);
1349 isp116x->rhdesca = isp116x_read_reg32(isp116x, HCRHDESCA);
1352 isp116x_write_reg32(isp116x, HCRHDESCB, val);
1353 isp116x->rhdescb = isp116x_read_reg32(isp116x, HCRHDESCB);
1361 isp116x_write_reg32(isp116x, HCRHSTATUS, val);
1362 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS);
1364 isp116x_write_reg32(isp116x, HCFMINTVL, 0x27782edf);
1369 isp116x->intenb = HCINT_MIE | HCINT_RHSC | HCINT_UE;
1371 isp116x->intenb |= HCINT_RD;
1372 isp116x->irqenb = HCuPINT_ATL | HCuPINT_OPR; /* | HCuPINT_SUSP; */
1373 isp116x_write_reg32(isp116x, HCINTENB, isp116x->intenb);
1374 isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb);
1380 isp116x_write_reg32(isp116x, HCCONTROL, val);
1383 isp116x_write_reg32(isp116x, HCRHPORT1, RH_PS_CCS);
1384 isp116x_write_reg32(isp116x, HCRHPORT2, RH_PS_CCS);
1386 isp116x_show_regs_log(isp116x);
1387 spin_unlock_irqrestore(&isp116x->lock, flags);
1395 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1400 spin_lock_irqsave(&isp116x->lock, flags);
1401 val = isp116x_read_reg32(isp116x, HCCONTROL);
1405 spin_unlock_irqrestore(&isp116x->lock, flags);
1412 spin_lock_irqsave(&isp116x->lock, flags);
1413 isp116x_write_reg32(isp116x, HCCONTROL, val);
1414 spin_unlock_irqrestore(&isp116x->lock, flags);
1419 isp116x_write_reg32(isp116x, HCCONTROL,
1427 spin_unlock_irqrestore(&isp116x->lock, flags);
1436 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1440 spin_lock_irq(&isp116x->lock);
1442 val = isp116x_read_reg32(isp116x, HCCONTROL);
1447 isp116x_write_reg32(isp116x, HCCONTROL, val);
1452 spin_unlock_irq(&isp116x->lock);
1457 spin_unlock_irq(&isp116x->lock);
1463 if ((isp116x->rhdesca & RH_A_NDP) == 2)
1469 val = isp116x->rhdesca & RH_A_NDP;
1472 isp116x_read_reg32(isp116x, val ? HCRHPORT2 : HCRHPORT1);
1477 isp116x_write_reg32(isp116x, RH_PS_POCI, val
1480 spin_unlock_irq(&isp116x->lock);
1486 spin_lock_irq(&isp116x->lock);
1487 val = isp116x_read_reg32(isp116x, HCCONTROL);
1488 isp116x_write_reg32(isp116x, HCCONTROL,
1490 spin_unlock_irq(&isp116x->lock);
1506 .hcd_priv_size = sizeof(struct isp116x),
1532 struct isp116x *isp116x;
1537 isp116x = hcd_to_isp116x(hcd);
1538 remove_debug_file(isp116x);
1541 iounmap(isp116x->data_reg);
1545 iounmap(isp116x->addr_reg);
1556 struct isp116x *isp116x;
1611 isp116x = hcd_to_isp116x(hcd);
1612 isp116x->data_reg = data_reg;
1613 isp116x->addr_reg = addr_reg;
1614 spin_lock_init(&isp116x->lock);
1615 INIT_LIST_HEAD(&isp116x->async);
1616 isp116x->board = dev_get_platdata(&pdev->dev);
1618 if (!isp116x->board) {
1623 if (isp116x_check_platform_delay(isp116x)) {
1626 ERR("See comments in drivers/usb/host/isp116x-hcd.c\n");
1637 create_debug_file(isp116x);
1683 MODULE_ALIAS("platform:isp116x-hcd");