diff options
Diffstat (limited to 'drivers/usb/host/isp1760-hcd.c')
-rw-r--r-- | drivers/usb/host/isp1760-hcd.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c index b899f1a59c26..cd07ea3f0c63 100644 --- a/drivers/usb/host/isp1760-hcd.c +++ b/drivers/usb/host/isp1760-hcd.c | |||
@@ -644,7 +644,7 @@ static void transform_add_int(struct isp1760_hcd *priv, struct isp1760_qh *qh, | |||
644 | 644 | ||
645 | if (urb->dev->speed != USB_SPEED_HIGH) { | 645 | if (urb->dev->speed != USB_SPEED_HIGH) { |
646 | /* split */ | 646 | /* split */ |
647 | ptd->dw5 = __constant_cpu_to_le32(0x1c); | 647 | ptd->dw5 = cpu_to_le32(0x1c); |
648 | 648 | ||
649 | if (qh->period >= 32) | 649 | if (qh->period >= 32) |
650 | period = qh->period / 2; | 650 | period = qh->period / 2; |
@@ -819,6 +819,13 @@ static void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh, | |||
819 | u32 atl_regs, payload; | 819 | u32 atl_regs, payload; |
820 | u32 buffstatus; | 820 | u32 buffstatus; |
821 | 821 | ||
822 | /* | ||
823 | * When this function is called from the interrupt handler to enqueue | ||
824 | * a follow-up packet, the SKIP register gets written and read back | ||
825 | * almost immediately. With ISP1761, this register requires a delay of | ||
826 | * 195ns between a write and subsequent read (see section 15.1.1.3). | ||
827 | */ | ||
828 | ndelay(195); | ||
822 | skip_map = isp1760_readl(hcd->regs + HC_ATL_PTD_SKIPMAP_REG); | 829 | skip_map = isp1760_readl(hcd->regs + HC_ATL_PTD_SKIPMAP_REG); |
823 | 830 | ||
824 | BUG_ON(!skip_map); | 831 | BUG_ON(!skip_map); |
@@ -853,6 +860,13 @@ static void enqueue_an_INT_packet(struct usb_hcd *hcd, struct isp1760_qh *qh, | |||
853 | u32 int_regs, payload; | 860 | u32 int_regs, payload; |
854 | u32 buffstatus; | 861 | u32 buffstatus; |
855 | 862 | ||
863 | /* | ||
864 | * When this function is called from the interrupt handler to enqueue | ||
865 | * a follow-up packet, the SKIP register gets written and read back | ||
866 | * almost immediately. With ISP1761, this register requires a delay of | ||
867 | * 195ns between a write and subsequent read (see section 15.1.1.3). | ||
868 | */ | ||
869 | ndelay(195); | ||
856 | skip_map = isp1760_readl(hcd->regs + HC_INT_PTD_SKIPMAP_REG); | 870 | skip_map = isp1760_readl(hcd->regs + HC_INT_PTD_SKIPMAP_REG); |
857 | 871 | ||
858 | BUG_ON(!skip_map); | 872 | BUG_ON(!skip_map); |
@@ -1054,7 +1068,7 @@ static void do_atl_int(struct usb_hcd *usb_hcd) | |||
1054 | priv_write_copy(priv, (u32 *)&ptd, usb_hcd->regs + | 1068 | priv_write_copy(priv, (u32 *)&ptd, usb_hcd->regs + |
1055 | atl_regs, sizeof(ptd)); | 1069 | atl_regs, sizeof(ptd)); |
1056 | 1070 | ||
1057 | ptd.dw0 |= __constant_cpu_to_le32(PTD_VALID); | 1071 | ptd.dw0 |= cpu_to_le32(PTD_VALID); |
1058 | priv_write_copy(priv, (u32 *)&ptd, usb_hcd->regs + | 1072 | priv_write_copy(priv, (u32 *)&ptd, usb_hcd->regs + |
1059 | atl_regs, sizeof(ptd)); | 1073 | atl_regs, sizeof(ptd)); |
1060 | 1074 | ||
@@ -2235,9 +2249,10 @@ void deinit_kmem_cache(void) | |||
2235 | kmem_cache_destroy(qh_cachep); | 2249 | kmem_cache_destroy(qh_cachep); |
2236 | } | 2250 | } |
2237 | 2251 | ||
2238 | struct usb_hcd *isp1760_register(u64 res_start, u64 res_len, int irq, | 2252 | struct usb_hcd *isp1760_register(phys_addr_t res_start, resource_size_t res_len, |
2239 | u64 irqflags, struct device *dev, const char *busname, | 2253 | int irq, unsigned long irqflags, |
2240 | unsigned int devflags) | 2254 | struct device *dev, const char *busname, |
2255 | unsigned int devflags) | ||
2241 | { | 2256 | { |
2242 | struct usb_hcd *hcd; | 2257 | struct usb_hcd *hcd; |
2243 | struct isp1760_hcd *priv; | 2258 | struct isp1760_hcd *priv; |