Lines Matching refs:hcd
38 typedef void (packet_enqueue)(struct usb_hcd *hcd, struct isp1760_qh *qh,
41 static inline struct isp1760_hcd *hcd_to_priv(struct usb_hcd *hcd) in hcd_to_priv() argument
43 return *(struct isp1760_hcd **)hcd->hcd_priv; in hcd_to_priv()
336 static void alloc_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd) in alloc_mem() argument
338 struct isp1760_hcd *priv = hcd_to_priv(hcd); in alloc_mem()
356 static void free_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd) in free_mem() argument
358 struct isp1760_hcd *priv = hcd_to_priv(hcd); in free_mem()
373 dev_err(hcd->self.controller, "%s: Invalid pointer: %08x\n", in free_mem()
379 static int handshake(struct usb_hcd *hcd, u32 reg, in handshake() argument
385 result = reg_read32(hcd->regs, reg); in handshake()
398 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()
409 return handshake(hcd, HC_USBCMD, CMD_RESET, 0, 250 * 1000); in ehci_reset()
435 static int priv_init(struct usb_hcd *hcd) in priv_init() argument
437 struct isp1760_hcd *priv = hcd_to_priv(hcd); in priv_init()
453 hcc_params = reg_read32(hcd->regs, HC_HCCPARAMS); in priv_init()
463 static int isp1760_hc_setup(struct usb_hcd *hcd) in isp1760_hc_setup() argument
465 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_hc_setup()
469 reg_write32(hcd->regs, HC_SCRATCH_REG, 0xdeadbabe); in isp1760_hc_setup()
471 scratch = reg_read32(hcd->regs, HC_CHIP_ID_REG); in isp1760_hc_setup()
472 scratch = reg_read32(hcd->regs, HC_SCRATCH_REG); in isp1760_hc_setup()
474 dev_err(hcd->self.controller, "Scratch test failed.\n"); in isp1760_hc_setup()
486 reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, 0); in isp1760_hc_setup()
487 reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); in isp1760_hc_setup()
488 reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); in isp1760_hc_setup()
489 reg_write32(hcd->regs, HC_ISO_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); in isp1760_hc_setup()
491 result = ehci_reset(hcd); in isp1760_hc_setup()
498 hwmode = reg_read32(hcd->regs, HC_HW_MODE_CTRL) & ~ALL_ATX_RESET; in isp1760_hc_setup()
499 reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode | ALL_ATX_RESET); in isp1760_hc_setup()
501 reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode); in isp1760_hc_setup()
503 reg_write32(hcd->regs, HC_INTERRUPT_ENABLE, INTERRUPT_ENABLE_MASK); in isp1760_hc_setup()
505 priv->hcs_params = reg_read32(hcd->regs, HC_HCSPARAMS); in isp1760_hc_setup()
507 return priv_init(hcd); in isp1760_hc_setup()
669 static void isp1760_urb_done(struct usb_hcd *hcd, struct urb *urb) in isp1760_urb_done() argument
673 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_urb_done()
689 usb_hcd_unlink_urb_from_ep(hcd, urb); in isp1760_urb_done()
691 usb_hcd_giveback_urb(hcd, urb, urb->status); in isp1760_urb_done()
719 static void start_bus_transfer(struct usb_hcd *hcd, u32 ptd_offset, int slot, in start_bus_transfer() argument
724 struct isp1760_hcd *priv = hcd_to_priv(hcd); in start_bus_transfer()
735 priv->atl_done_map |= reg_read32(hcd->regs, in start_bus_transfer()
739 priv->int_done_map |= reg_read32(hcd->regs, in start_bus_transfer()
749 ptd_write(hcd->regs, ptd_offset, slot, ptd); in start_bus_transfer()
752 skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); in start_bus_transfer()
754 reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map); in start_bus_transfer()
756 skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG); in start_bus_transfer()
758 reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map); in start_bus_transfer()
768 static void collect_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh, in collect_qtds() argument
788 mem_reads8(hcd->regs, qtd->payload_addr, in collect_qtds()
810 free_mem(hcd, qtd); in collect_qtds()
831 static void enqueue_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh) in enqueue_qtds() argument
833 struct isp1760_hcd *priv = hcd_to_priv(hcd); in enqueue_qtds()
871 alloc_mem(hcd, qtd); in enqueue_qtds()
878 mem_writes8(hcd->regs, qtd->payload_addr, in enqueue_qtds()
898 start_bus_transfer(hcd, ptd_offset, free_slot, in enqueue_qtds()
910 static void schedule_ptds(struct usb_hcd *hcd) in schedule_ptds() argument
919 if (!hcd) { in schedule_ptds()
924 priv = hcd_to_priv(hcd); in schedule_ptds()
932 collect_qtds(hcd, qh, &urb_list); in schedule_ptds()
940 isp1760_urb_done(hcd, urb_listitem->urb); in schedule_ptds()
971 enqueue_qtds(hcd, qh); in schedule_ptds()
979 static int check_int_transfer(struct usb_hcd *hcd, struct ptd *ptd, in check_int_transfer() argument
998 dev_dbg(hcd->self.controller, "%s: underrun " in check_int_transfer()
1004 dev_dbg(hcd->self.controller, "%s: transaction " in check_int_transfer()
1011 dev_dbg(hcd->self.controller, "%s: babble " in check_int_transfer()
1026 static int check_atl_transfer(struct usb_hcd *hcd, struct ptd *ptd, in check_atl_transfer() argument
1052 dev_dbg(hcd->self.controller, "PID error; reloading ptd\n"); in check_atl_transfer()
1068 static void handle_done_ptds(struct usb_hcd *hcd) in handle_done_ptds() argument
1070 struct isp1760_hcd *priv = hcd_to_priv(hcd); in handle_done_ptds()
1081 skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG); in handle_done_ptds()
1083 skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); in handle_done_ptds()
1101 ptd_read(hcd->regs, INT_PTD_OFFSET, slot, &ptd); in handle_done_ptds()
1102 state = check_int_transfer(hcd, &ptd, in handle_done_ptds()
1116 ptd_read(hcd->regs, ATL_PTD_OFFSET, slot, &ptd); in handle_done_ptds()
1117 state = check_atl_transfer(hcd, &ptd, in handle_done_ptds()
1187 dev_err(hcd->self.controller, in handle_done_ptds()
1197 start_bus_transfer(hcd, ptd_offset, slot, slots, qtd, in handle_done_ptds()
1203 schedule_ptds(hcd); in handle_done_ptds()
1206 static irqreturn_t isp1760_irq(struct usb_hcd *hcd) in isp1760_irq() argument
1208 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_irq()
1214 if (!(hcd->state & HC_STATE_RUNNING)) in isp1760_irq()
1217 imask = reg_read32(hcd->regs, HC_INTERRUPT_REG); in isp1760_irq()
1220 reg_write32(hcd->regs, HC_INTERRUPT_REG, imask); /* Clear */ in isp1760_irq()
1222 priv->int_done_map |= reg_read32(hcd->regs, HC_INT_PTD_DONEMAP_REG); in isp1760_irq()
1223 priv->atl_done_map |= reg_read32(hcd->regs, HC_ATL_PTD_DONEMAP_REG); in isp1760_irq()
1225 handle_done_ptds(hcd); in isp1760_irq()
1266 struct usb_hcd *hcd = errata2_timer_hcd; 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 errata2_timer_hcd = hcd; in isp1760_run()
1343 chipid = reg_read32(hcd->regs, HC_CHIP_ID_REG); in isp1760_run()
1344 dev_info(hcd->self.controller, "USB ISP %04x HW rev. %d started\n", in isp1760_run()
1350 reg_write32(hcd->regs, HC_ATL_PTD_LASTPTD_REG, 0x80000000); in isp1760_run()
1351 reg_write32(hcd->regs, HC_INT_PTD_LASTPTD_REG, 0x80000000); in isp1760_run()
1352 reg_write32(hcd->regs, HC_ISO_PTD_LASTPTD_REG, 0x00000001); in isp1760_run()
1353 reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, 0xffffffff); in isp1760_run()
1354 reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, 0xffffffff); in isp1760_run()
1355 reg_write32(hcd->regs, HC_ISO_PTD_SKIPMAP_REG, 0xffffffff); in isp1760_run()
1356 reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, in isp1760_run()
1392 static void packetize_urb(struct usb_hcd *hcd, in packetize_urb() argument
1406 dev_err(hcd->self.controller, in packetize_urb()
1493 static int isp1760_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, in isp1760_urb_enqueue() argument
1496 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_urb_enqueue()
1518 dev_err(hcd->self.controller, "%s: isochronous USB packets " in isp1760_urb_enqueue()
1523 dev_err(hcd->self.controller, "%s: unknown pipe type\n", in isp1760_urb_enqueue()
1531 packetize_urb(hcd, urb, &new_qtds, mem_flags); in isp1760_urb_enqueue()
1538 if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) { in isp1760_urb_enqueue()
1543 retval = usb_hcd_link_urb_to_ep(hcd, urb); in isp1760_urb_enqueue()
1564 usb_hcd_unlink_urb_from_ep(hcd, urb); in isp1760_urb_enqueue()
1573 schedule_ptds(hcd); in isp1760_urb_enqueue()
1580 static void kill_transfer(struct usb_hcd *hcd, struct urb *urb, in kill_transfer() argument
1583 struct isp1760_hcd *priv = hcd_to_priv(hcd); in kill_transfer()
1591 skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); in kill_transfer()
1593 reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map); in kill_transfer()
1597 skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG); in kill_transfer()
1599 reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map); in kill_transfer()
1611 static void dequeue_urb_from_qtd(struct usb_hcd *hcd, struct isp1760_qh *qh, in dequeue_urb_from_qtd() argument
1630 kill_transfer(hcd, urb, qh); in dequeue_urb_from_qtd()
1642 static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, in isp1760_urb_dequeue() argument
1645 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_urb_dequeue()
1652 retval = usb_hcd_check_unlink_urb(hcd, urb, status); in isp1760_urb_dequeue()
1664 dequeue_urb_from_qtd(hcd, qh, qtd); in isp1760_urb_dequeue()
1670 schedule_ptds(hcd); in isp1760_urb_dequeue()
1677 static void isp1760_endpoint_disable(struct usb_hcd *hcd, in isp1760_endpoint_disable() argument
1680 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_endpoint_disable()
1703 schedule_ptds(hcd); in isp1760_endpoint_disable()
1709 static int isp1760_hub_status_data(struct usb_hcd *hcd, char *buf) in isp1760_hub_status_data() argument
1711 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_hub_status_data()
1718 if (!HC_IS_RUNNING(hcd->state)) in isp1760_hub_status_data()
1726 temp = reg_read32(hcd->regs, HC_PORTSC1); in isp1760_hub_status_data()
1731 reg_write32(hcd->regs, HC_PORTSC1, temp); in isp1760_hub_status_data()
1788 static int check_reset_complete(struct usb_hcd *hcd, int index, in check_reset_complete() argument
1797 dev_info(hcd->self.controller, in check_reset_complete()
1803 reg_write32(hcd->regs, HC_PORTSC1, port_status); in check_reset_complete()
1806 dev_info(hcd->self.controller, "port %d high speed\n", in check_reset_complete()
1812 static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, in isp1760_hub_control() argument
1815 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()
2016 temp = reg_read32(hcd->regs, HC_PORTSC1); in isp1760_hub_control()
2023 reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_PE); in isp1760_hub_control()
2031 reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_SUSPEND); in isp1760_hub_control()
2035 reg_write32(hcd->regs, HC_PORTSC1, in isp1760_hub_control()
2059 reg_write32(hcd->regs, HC_PORTSC1, temp); in isp1760_hub_control()
2064 reg_read32(hcd->regs, HC_USBCMD); in isp1760_hub_control()
2076 static int isp1760_get_frame(struct usb_hcd *hcd) in isp1760_get_frame() argument
2078 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_get_frame()
2081 fr = reg_read32(hcd->regs, HC_FRINDEX); in isp1760_get_frame()
2085 static void isp1760_stop(struct usb_hcd *hcd) in isp1760_stop() argument
2087 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_stop()
2092 isp1760_hub_control(hcd, ClearPortFeature, USB_PORT_FEAT_POWER, 1, in isp1760_stop()
2097 ehci_reset(hcd); in isp1760_stop()
2099 temp = reg_read32(hcd->regs, HC_HW_MODE_CTRL); in isp1760_stop()
2100 reg_write32(hcd->regs, HC_HW_MODE_CTRL, temp &= ~HW_GLOBAL_INTR_EN); in isp1760_stop()
2103 reg_write32(hcd->regs, HC_CONFIGFLAG, 0); in isp1760_stop()
2106 static void isp1760_shutdown(struct usb_hcd *hcd) in isp1760_shutdown() argument
2110 isp1760_stop(hcd); in isp1760_shutdown()
2111 temp = reg_read32(hcd->regs, HC_HW_MODE_CTRL); in isp1760_shutdown()
2112 reg_write32(hcd->regs, HC_HW_MODE_CTRL, temp &= ~HW_GLOBAL_INTR_EN); in isp1760_shutdown()
2114 command = reg_read32(hcd->regs, HC_USBCMD); in isp1760_shutdown()
2116 reg_write32(hcd->regs, HC_USBCMD, command); in isp1760_shutdown()
2119 static void isp1760_clear_tt_buffer_complete(struct usb_hcd *hcd, in isp1760_clear_tt_buffer_complete() argument
2122 struct isp1760_hcd *priv = hcd_to_priv(hcd); in isp1760_clear_tt_buffer_complete()
2131 schedule_ptds(hcd); in isp1760_clear_tt_buffer_complete()
2193 struct usb_hcd *hcd; in isp1760_hcd_register() local
2196 hcd = usb_create_hcd(&isp1760_hc_driver, dev, dev_name(dev)); in isp1760_hcd_register()
2197 if (!hcd) in isp1760_hcd_register()
2200 *(struct isp1760_hcd **)hcd->hcd_priv = priv; in isp1760_hcd_register()
2202 priv->hcd = hcd; in isp1760_hcd_register()
2206 hcd->irq = irq; in isp1760_hcd_register()
2207 hcd->regs = regs; in isp1760_hcd_register()
2208 hcd->rsrc_start = mem->start; in isp1760_hcd_register()
2209 hcd->rsrc_len = resource_size(mem); in isp1760_hcd_register()
2212 hcd->cant_recv_wakeups = 1; in isp1760_hcd_register()
2214 ret = usb_add_hcd(hcd, irq, irqflags); in isp1760_hcd_register()
2218 device_wakeup_enable(hcd->self.controller); in isp1760_hcd_register()
2223 usb_put_hcd(hcd); in isp1760_hcd_register()
2229 if (!priv->hcd) in isp1760_hcd_unregister()
2232 usb_remove_hcd(priv->hcd); in isp1760_hcd_unregister()
2233 usb_put_hcd(priv->hcd); in isp1760_hcd_unregister()