Lines Matching refs:hcd

37 typedef void (packet_enqueue)(struct usb_hcd *hcd, struct isp1760_qh *qh,
40 static inline struct isp1760_hcd *hcd_to_priv(struct usb_hcd *hcd) in hcd_to_priv() argument
42 return *(struct isp1760_hcd **)hcd->hcd_priv; in hcd_to_priv()
335 static void alloc_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd) in alloc_mem() argument
337 struct isp1760_hcd *priv = hcd_to_priv(hcd); in alloc_mem()
355 static void free_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd) in free_mem() argument
357 struct isp1760_hcd *priv = hcd_to_priv(hcd); in free_mem()
372 dev_err(hcd->self.controller, "%s: Invalid pointer: %08x\n", in free_mem()
378 static int handshake(struct usb_hcd *hcd, u32 reg, in handshake() argument
384 result = reg_read32(hcd->regs, reg); in handshake()
397 static int ehci_reset(struct usb_hcd *hcd) in ehci_reset() argument
400 struct isp1760_hcd *priv = hcd_to_priv(hcd); in ehci_reset()
402 u32 command = reg_read32(hcd->regs, HC_USBCMD); in ehci_reset()
405 reg_write32(hcd->regs, HC_USBCMD, command); in ehci_reset()
406 hcd->state = HC_STATE_HALT; in ehci_reset()
408 retval = handshake(hcd, HC_USBCMD, in ehci_reset()
436 static int priv_init(struct usb_hcd *hcd) in priv_init() argument
438 struct isp1760_hcd *priv = hcd_to_priv(hcd); in priv_init()
454 hcc_params = reg_read32(hcd->regs, HC_HCCPARAMS); in priv_init()
464 static int isp1760_hc_setup(struct usb_hcd *hcd) in isp1760_hc_setup() argument
466 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_hc_setup()
470 reg_write32(hcd->regs, HC_SCRATCH_REG, 0xdeadbabe); in isp1760_hc_setup()
472 scratch = reg_read32(hcd->regs, HC_CHIP_ID_REG); in isp1760_hc_setup()
473 scratch = reg_read32(hcd->regs, HC_SCRATCH_REG); in isp1760_hc_setup()
475 dev_err(hcd->self.controller, "Scratch test failed.\n"); in isp1760_hc_setup()
487 reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, 0); in isp1760_hc_setup()
488 reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); in isp1760_hc_setup()
489 reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); in isp1760_hc_setup()
490 reg_write32(hcd->regs, HC_ISO_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); in isp1760_hc_setup()
492 result = ehci_reset(hcd); in isp1760_hc_setup()
499 hwmode = reg_read32(hcd->regs, HC_HW_MODE_CTRL) & ~ALL_ATX_RESET; in isp1760_hc_setup()
500 reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode | ALL_ATX_RESET); in isp1760_hc_setup()
502 reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode); in isp1760_hc_setup()
504 reg_write32(hcd->regs, HC_INTERRUPT_ENABLE, INTERRUPT_ENABLE_MASK); in isp1760_hc_setup()
506 priv->hcs_params = reg_read32(hcd->regs, HC_HCSPARAMS); in isp1760_hc_setup()
508 return priv_init(hcd); in isp1760_hc_setup()
670 static void isp1760_urb_done(struct usb_hcd *hcd, struct urb *urb) in isp1760_urb_done() argument
674 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_urb_done()
690 usb_hcd_unlink_urb_from_ep(hcd, urb); in isp1760_urb_done()
692 usb_hcd_giveback_urb(hcd, urb, urb->status); in isp1760_urb_done()
720 static void start_bus_transfer(struct usb_hcd *hcd, u32 ptd_offset, int slot, in start_bus_transfer() argument
725 struct isp1760_hcd *priv = hcd_to_priv(hcd); in start_bus_transfer()
736 priv->atl_done_map |= reg_read32(hcd->regs, in start_bus_transfer()
740 priv->int_done_map |= reg_read32(hcd->regs, in start_bus_transfer()
750 ptd_write(hcd->regs, ptd_offset, slot, ptd); in start_bus_transfer()
753 skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); in start_bus_transfer()
755 reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map); in start_bus_transfer()
757 skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG); in start_bus_transfer()
759 reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map); in start_bus_transfer()
769 static void collect_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh, in collect_qtds() argument
789 mem_reads8(hcd->regs, qtd->payload_addr, in collect_qtds()
811 free_mem(hcd, qtd); in collect_qtds()
832 static void enqueue_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh) in enqueue_qtds() argument
834 struct isp1760_hcd *priv = hcd_to_priv(hcd); in enqueue_qtds()
872 alloc_mem(hcd, qtd); in enqueue_qtds()
879 mem_writes8(hcd->regs, qtd->payload_addr, in enqueue_qtds()
899 start_bus_transfer(hcd, ptd_offset, free_slot, in enqueue_qtds()
911 static void schedule_ptds(struct usb_hcd *hcd) in schedule_ptds() argument
920 if (!hcd) { in schedule_ptds()
925 priv = hcd_to_priv(hcd); in schedule_ptds()
933 collect_qtds(hcd, qh, &urb_list); in schedule_ptds()
941 isp1760_urb_done(hcd, urb_listitem->urb); in schedule_ptds()
972 enqueue_qtds(hcd, qh); in schedule_ptds()
980 static int check_int_transfer(struct usb_hcd *hcd, struct ptd *ptd, in check_int_transfer() argument
999 dev_dbg(hcd->self.controller, "%s: underrun " in check_int_transfer()
1005 dev_dbg(hcd->self.controller, "%s: transaction " in check_int_transfer()
1012 dev_dbg(hcd->self.controller, "%s: babble " in check_int_transfer()
1027 static int check_atl_transfer(struct usb_hcd *hcd, struct ptd *ptd, in check_atl_transfer() argument
1053 dev_dbg(hcd->self.controller, "PID error; reloading ptd\n"); in check_atl_transfer()
1069 static void handle_done_ptds(struct usb_hcd *hcd) in handle_done_ptds() argument
1071 struct isp1760_hcd *priv = hcd_to_priv(hcd); in handle_done_ptds()
1082 skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG); in handle_done_ptds()
1084 skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); in handle_done_ptds()
1102 ptd_read(hcd->regs, INT_PTD_OFFSET, slot, &ptd); in handle_done_ptds()
1103 state = check_int_transfer(hcd, &ptd, in handle_done_ptds()
1117 ptd_read(hcd->regs, ATL_PTD_OFFSET, slot, &ptd); in handle_done_ptds()
1118 state = check_atl_transfer(hcd, &ptd, in handle_done_ptds()
1188 dev_err(hcd->self.controller, in handle_done_ptds()
1198 start_bus_transfer(hcd, ptd_offset, slot, slots, qtd, in handle_done_ptds()
1204 schedule_ptds(hcd); in handle_done_ptds()
1207 static irqreturn_t isp1760_irq(struct usb_hcd *hcd) in isp1760_irq() argument
1209 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_irq()
1215 if (!(hcd->state & HC_STATE_RUNNING)) in isp1760_irq()
1218 imask = reg_read32(hcd->regs, HC_INTERRUPT_REG); in isp1760_irq()
1221 reg_write32(hcd->regs, HC_INTERRUPT_REG, imask); /* Clear */ in isp1760_irq()
1223 priv->int_done_map |= reg_read32(hcd->regs, HC_INT_PTD_DONEMAP_REG); in isp1760_irq()
1224 priv->atl_done_map |= reg_read32(hcd->regs, HC_ATL_PTD_DONEMAP_REG); in isp1760_irq()
1226 handle_done_ptds(hcd); in isp1760_irq()
1266 struct usb_hcd *hcd = (struct usb_hcd *) data; in errata2_function() local
1267 struct isp1760_hcd *priv = hcd_to_priv(hcd); in errata2_function()
1278 ptd_read(hcd->regs, ATL_PTD_OFFSET, slot, &ptd); in errata2_function()
1285 handle_done_ptds(hcd); in errata2_function()
1293 static int isp1760_run(struct usb_hcd *hcd) in isp1760_run() argument
1300 hcd->uses_new_polling = 1; in isp1760_run()
1302 hcd->state = HC_STATE_RUNNING; in isp1760_run()
1305 reg_write32(hcd->regs, HC_ATL_IRQ_MASK_AND_REG, 0); in isp1760_run()
1306 reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, 0xffffffff); in isp1760_run()
1307 reg_write32(hcd->regs, HC_INT_IRQ_MASK_AND_REG, 0); in isp1760_run()
1308 reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, 0xffffffff); in isp1760_run()
1309 reg_write32(hcd->regs, HC_ISO_IRQ_MASK_AND_REG, 0); in isp1760_run()
1310 reg_write32(hcd->regs, HC_ISO_IRQ_MASK_OR_REG, 0xffffffff); in isp1760_run()
1313 temp = reg_read32(hcd->regs, HC_HW_MODE_CTRL); in isp1760_run()
1314 reg_write32(hcd->regs, HC_HW_MODE_CTRL, temp | HW_GLOBAL_INTR_EN); in isp1760_run()
1316 command = reg_read32(hcd->regs, HC_USBCMD); in isp1760_run()
1319 reg_write32(hcd->regs, HC_USBCMD, command); in isp1760_run()
1321 retval = handshake(hcd, HC_USBCMD, CMD_RUN, CMD_RUN, 250 * 1000); in isp1760_run()
1331 reg_write32(hcd->regs, HC_CONFIGFLAG, FLAG_CF); in isp1760_run()
1333 retval = handshake(hcd, HC_CONFIGFLAG, FLAG_CF, FLAG_CF, 250 * 1000); in isp1760_run()
1338 setup_timer(&errata2_timer, errata2_function, (unsigned long)hcd); in isp1760_run()
1342 chipid = reg_read32(hcd->regs, HC_CHIP_ID_REG); in isp1760_run()
1343 dev_info(hcd->self.controller, "USB ISP %04x HW rev. %d started\n", in isp1760_run()
1349 reg_write32(hcd->regs, HC_ATL_PTD_LASTPTD_REG, 0x80000000); in isp1760_run()
1350 reg_write32(hcd->regs, HC_INT_PTD_LASTPTD_REG, 0x80000000); in isp1760_run()
1351 reg_write32(hcd->regs, HC_ISO_PTD_LASTPTD_REG, 0x00000001); in isp1760_run()
1352 reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, 0xffffffff); in isp1760_run()
1353 reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, 0xffffffff); in isp1760_run()
1354 reg_write32(hcd->regs, HC_ISO_PTD_SKIPMAP_REG, 0xffffffff); in isp1760_run()
1355 reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, in isp1760_run()
1391 static void packetize_urb(struct usb_hcd *hcd, in packetize_urb() argument
1405 dev_err(hcd->self.controller, in packetize_urb()
1492 static int isp1760_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, in isp1760_urb_enqueue() argument
1495 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_urb_enqueue()
1517 dev_err(hcd->self.controller, "%s: isochronous USB packets " in isp1760_urb_enqueue()
1522 dev_err(hcd->self.controller, "%s: unknown pipe type\n", in isp1760_urb_enqueue()
1530 packetize_urb(hcd, urb, &new_qtds, mem_flags); in isp1760_urb_enqueue()
1537 if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) { in isp1760_urb_enqueue()
1542 retval = usb_hcd_link_urb_to_ep(hcd, urb); in isp1760_urb_enqueue()
1563 usb_hcd_unlink_urb_from_ep(hcd, urb); in isp1760_urb_enqueue()
1572 schedule_ptds(hcd); in isp1760_urb_enqueue()
1579 static void kill_transfer(struct usb_hcd *hcd, struct urb *urb, in kill_transfer() argument
1582 struct isp1760_hcd *priv = hcd_to_priv(hcd); in kill_transfer()
1590 skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); in kill_transfer()
1592 reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map); in kill_transfer()
1596 skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG); in kill_transfer()
1598 reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map); in kill_transfer()
1610 static void dequeue_urb_from_qtd(struct usb_hcd *hcd, struct isp1760_qh *qh, in dequeue_urb_from_qtd() argument
1629 kill_transfer(hcd, urb, qh); in dequeue_urb_from_qtd()
1641 static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, in isp1760_urb_dequeue() argument
1644 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_urb_dequeue()
1651 retval = usb_hcd_check_unlink_urb(hcd, urb, status); in isp1760_urb_dequeue()
1663 dequeue_urb_from_qtd(hcd, qh, qtd); in isp1760_urb_dequeue()
1669 schedule_ptds(hcd); in isp1760_urb_dequeue()
1676 static void isp1760_endpoint_disable(struct usb_hcd *hcd, in isp1760_endpoint_disable() argument
1679 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_endpoint_disable()
1702 schedule_ptds(hcd); in isp1760_endpoint_disable()
1708 static int isp1760_hub_status_data(struct usb_hcd *hcd, char *buf) in isp1760_hub_status_data() argument
1710 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_hub_status_data()
1717 if (!HC_IS_RUNNING(hcd->state)) in isp1760_hub_status_data()
1725 temp = reg_read32(hcd->regs, HC_PORTSC1); in isp1760_hub_status_data()
1730 reg_write32(hcd->regs, HC_PORTSC1, temp); in isp1760_hub_status_data()
1787 static int check_reset_complete(struct usb_hcd *hcd, int index, in check_reset_complete() argument
1796 dev_info(hcd->self.controller, in check_reset_complete()
1802 reg_write32(hcd->regs, HC_PORTSC1, port_status); in check_reset_complete()
1805 dev_info(hcd->self.controller, "port %d high speed\n", in check_reset_complete()
1811 static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, in isp1760_hub_control() argument
1814 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_hub_control()
1844 temp = reg_read32(hcd->regs, HC_PORTSC1); in isp1760_hub_control()
1855 reg_write32(hcd->regs, HC_PORTSC1, temp & ~PORT_PE); in isp1760_hub_control()
1869 reg_write32(hcd->regs, HC_PORTSC1, in isp1760_hub_control()
1880 reg_write32(hcd->regs, HC_PORTSC1, in isp1760_hub_control()
1884 reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_CSC); in isp1760_hub_control()
1895 reg_read32(hcd->regs, HC_USBCMD); in isp1760_hub_control()
1910 temp = reg_read32(hcd->regs, HC_PORTSC1); in isp1760_hub_control()
1919 dev_err(hcd->self.controller, "Port resume should be skipped.\n"); in isp1760_hub_control()
1927 mod_timer(&hcd->rh_timer, priv->reset_done); in isp1760_hub_control()
1937 temp = reg_read32(hcd->regs, HC_PORTSC1); in isp1760_hub_control()
1938 reg_write32(hcd->regs, HC_PORTSC1, in isp1760_hub_control()
1940 retval = handshake(hcd, HC_PORTSC1, in isp1760_hub_control()
1943 dev_err(hcd->self.controller, in isp1760_hub_control()
1960 reg_write32(hcd->regs, HC_PORTSC1, temp & ~PORT_RESET); in isp1760_hub_control()
1964 retval = handshake(hcd, HC_PORTSC1, in isp1760_hub_control()
1967 dev_err(hcd->self.controller, "port %d reset error %d\n", in isp1760_hub_control()
1973 temp = check_reset_complete(hcd, wIndex, in isp1760_hub_control()
1974 reg_read32(hcd->regs, HC_PORTSC1)); in isp1760_hub_control()
1983 dev_err(hcd->self.controller, "PORT_OWNER is set\n"); in isp1760_hub_control()
2017 temp = reg_read32(hcd->regs, HC_PORTSC1); in isp1760_hub_control()
2024 reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_PE); in isp1760_hub_control()
2032 reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_SUSPEND); in isp1760_hub_control()
2036 reg_write32(hcd->regs, HC_PORTSC1, in isp1760_hub_control()
2060 reg_write32(hcd->regs, HC_PORTSC1, temp); in isp1760_hub_control()
2065 reg_read32(hcd->regs, HC_USBCMD); in isp1760_hub_control()
2077 static int isp1760_get_frame(struct usb_hcd *hcd) in isp1760_get_frame() argument
2079 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_get_frame()
2082 fr = reg_read32(hcd->regs, HC_FRINDEX); in isp1760_get_frame()
2086 static void isp1760_stop(struct usb_hcd *hcd) in isp1760_stop() argument
2088 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_stop()
2093 isp1760_hub_control(hcd, ClearPortFeature, USB_PORT_FEAT_POWER, 1, in isp1760_stop()
2098 ehci_reset(hcd); in isp1760_stop()
2100 temp = reg_read32(hcd->regs, HC_HW_MODE_CTRL); in isp1760_stop()
2101 reg_write32(hcd->regs, HC_HW_MODE_CTRL, temp &= ~HW_GLOBAL_INTR_EN); in isp1760_stop()
2104 reg_write32(hcd->regs, HC_CONFIGFLAG, 0); in isp1760_stop()
2107 static void isp1760_shutdown(struct usb_hcd *hcd) in isp1760_shutdown() argument
2111 isp1760_stop(hcd); in isp1760_shutdown()
2112 temp = reg_read32(hcd->regs, HC_HW_MODE_CTRL); in isp1760_shutdown()
2113 reg_write32(hcd->regs, HC_HW_MODE_CTRL, temp &= ~HW_GLOBAL_INTR_EN); in isp1760_shutdown()
2115 command = reg_read32(hcd->regs, HC_USBCMD); in isp1760_shutdown()
2117 reg_write32(hcd->regs, HC_USBCMD, command); in isp1760_shutdown()
2120 static void isp1760_clear_tt_buffer_complete(struct usb_hcd *hcd, in isp1760_clear_tt_buffer_complete() argument
2123 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_clear_tt_buffer_complete()
2132 schedule_ptds(hcd); in isp1760_clear_tt_buffer_complete()
2194 struct usb_hcd *hcd; in isp1760_hcd_register() local
2197 hcd = usb_create_hcd(&isp1760_hc_driver, dev, dev_name(dev)); in isp1760_hcd_register()
2198 if (!hcd) in isp1760_hcd_register()
2201 *(struct isp1760_hcd **)hcd->hcd_priv = priv; in isp1760_hcd_register()
2203 priv->hcd = hcd; in isp1760_hcd_register()
2207 hcd->irq = irq; in isp1760_hcd_register()
2208 hcd->regs = regs; in isp1760_hcd_register()
2209 hcd->rsrc_start = mem->start; in isp1760_hcd_register()
2210 hcd->rsrc_len = resource_size(mem); in isp1760_hcd_register()
2213 hcd->cant_recv_wakeups = 1; in isp1760_hcd_register()
2215 ret = usb_add_hcd(hcd, irq, irqflags); in isp1760_hcd_register()
2219 device_wakeup_enable(hcd->self.controller); in isp1760_hcd_register()
2224 usb_put_hcd(hcd); in isp1760_hcd_register()
2230 if (!priv->hcd) in isp1760_hcd_unregister()
2233 usb_remove_hcd(priv->hcd); in isp1760_hcd_unregister()
2234 usb_put_hcd(priv->hcd); in isp1760_hcd_unregister()