diff options
author | Jan Andersson <jan@gaisler.com> | 2011-05-03 14:11:57 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-05-03 14:43:21 -0400 |
commit | c430131a02d677aa708f56342c1565edfdacb3c0 (patch) | |
tree | 15e9930a2512e4b05b7cfd4684f36dd26b0b990f /drivers/usb | |
parent | 2ce2c3ac8852cfc8f74f4b7b9a2c4cdff007f96a (diff) |
USB: EHCI: Support controllers with big endian capability regs
The two first HC capability registers (CAPLENGTH and HCIVERSION)
are defined as one 8-bit and one 16-bit register. Most HC
implementations have selected to treat these registers as part
of a 32-bit register, giving the same layout for both big and
small endian systems.
This patch adds a new quirk, big_endian_capbase, to support
controllers with big endian register interfaces that treat
HCIVERSION and CAPLENGTH as individual registers.
Signed-off-by: Jan Andersson <jan@gaisler.com>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb')
26 files changed, 41 insertions, 28 deletions
diff --git a/drivers/usb/early/ehci-dbgp.c b/drivers/usb/early/ehci-dbgp.c index a6a350f5827b..1fc8f1249806 100644 --- a/drivers/usb/early/ehci-dbgp.c +++ b/drivers/usb/early/ehci-dbgp.c | |||
@@ -102,6 +102,9 @@ static struct kgdb_io kgdbdbgp_io_ops; | |||
102 | #define dbgp_kgdb_mode (0) | 102 | #define dbgp_kgdb_mode (0) |
103 | #endif | 103 | #endif |
104 | 104 | ||
105 | /* Local version of HC_LENGTH macro as ehci struct is not available here */ | ||
106 | #define EARLY_HC_LENGTH(p) (0x00ff & (p)) /* bits 7 : 0 */ | ||
107 | |||
105 | /* | 108 | /* |
106 | * USB Packet IDs (PIDs) | 109 | * USB Packet IDs (PIDs) |
107 | */ | 110 | */ |
@@ -892,7 +895,7 @@ int __init early_dbgp_init(char *s) | |||
892 | dbgp_printk("ehci_bar: %p\n", ehci_bar); | 895 | dbgp_printk("ehci_bar: %p\n", ehci_bar); |
893 | 896 | ||
894 | ehci_caps = ehci_bar; | 897 | ehci_caps = ehci_bar; |
895 | ehci_regs = ehci_bar + HC_LENGTH(readl(&ehci_caps->hc_capbase)); | 898 | ehci_regs = ehci_bar + EARLY_HC_LENGTH(readl(&ehci_caps->hc_capbase)); |
896 | ehci_debug = ehci_bar + offset; | 899 | ehci_debug = ehci_bar + offset; |
897 | ehci_dev.bus = bus; | 900 | ehci_dev.bus = bus; |
898 | ehci_dev.slot = slot; | 901 | ehci_dev.slot = slot; |
diff --git a/drivers/usb/host/ehci-ath79.c b/drivers/usb/host/ehci-ath79.c index 7ea23b50f5d8..98cc8a13169c 100644 --- a/drivers/usb/host/ehci-ath79.c +++ b/drivers/usb/host/ehci-ath79.c | |||
@@ -44,6 +44,7 @@ static int ehci_ath79_init(struct usb_hcd *hcd) | |||
44 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 44 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
45 | struct platform_device *pdev = to_platform_device(hcd->self.controller); | 45 | struct platform_device *pdev = to_platform_device(hcd->self.controller); |
46 | const struct platform_device_id *id; | 46 | const struct platform_device_id *id; |
47 | int hclength; | ||
47 | int ret; | 48 | int ret; |
48 | 49 | ||
49 | id = platform_get_device_id(pdev); | 50 | id = platform_get_device_id(pdev); |
@@ -52,21 +53,20 @@ static int ehci_ath79_init(struct usb_hcd *hcd) | |||
52 | return -EINVAL; | 53 | return -EINVAL; |
53 | } | 54 | } |
54 | 55 | ||
56 | hclength = HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); | ||
55 | switch (id->driver_data) { | 57 | switch (id->driver_data) { |
56 | case EHCI_ATH79_IP_V1: | 58 | case EHCI_ATH79_IP_V1: |
57 | ehci->has_synopsys_hc_bug = 1; | 59 | ehci->has_synopsys_hc_bug = 1; |
58 | 60 | ||
59 | ehci->caps = hcd->regs; | 61 | ehci->caps = hcd->regs; |
60 | ehci->regs = hcd->regs + | 62 | ehci->regs = hcd->regs + hclength; |
61 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | ||
62 | break; | 63 | break; |
63 | 64 | ||
64 | case EHCI_ATH79_IP_V2: | 65 | case EHCI_ATH79_IP_V2: |
65 | hcd->has_tt = 1; | 66 | hcd->has_tt = 1; |
66 | 67 | ||
67 | ehci->caps = hcd->regs + 0x100; | 68 | ehci->caps = hcd->regs + 0x100; |
68 | ehci->regs = hcd->regs + 0x100 + | 69 | ehci->regs = hcd->regs + 0x100 + hclength; |
69 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | ||
70 | break; | 70 | break; |
71 | 71 | ||
72 | default: | 72 | default: |
diff --git a/drivers/usb/host/ehci-atmel.c b/drivers/usb/host/ehci-atmel.c index b2ed55cb811d..a5a3ef1f0096 100644 --- a/drivers/usb/host/ehci-atmel.c +++ b/drivers/usb/host/ehci-atmel.c | |||
@@ -56,7 +56,7 @@ static int ehci_atmel_setup(struct usb_hcd *hcd) | |||
56 | /* registers start at offset 0x0 */ | 56 | /* registers start at offset 0x0 */ |
57 | ehci->caps = hcd->regs; | 57 | ehci->caps = hcd->regs; |
58 | ehci->regs = hcd->regs + | 58 | ehci->regs = hcd->regs + |
59 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 59 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
60 | dbg_hcs_params(ehci, "reset"); | 60 | dbg_hcs_params(ehci, "reset"); |
61 | dbg_hcc_params(ehci, "reset"); | 61 | dbg_hcc_params(ehci, "reset"); |
62 | 62 | ||
diff --git a/drivers/usb/host/ehci-au1xxx.c b/drivers/usb/host/ehci-au1xxx.c index a869e3c103d3..40b002869ac2 100644 --- a/drivers/usb/host/ehci-au1xxx.c +++ b/drivers/usb/host/ehci-au1xxx.c | |||
@@ -175,7 +175,8 @@ static int ehci_hcd_au1xxx_drv_probe(struct platform_device *pdev) | |||
175 | 175 | ||
176 | ehci = hcd_to_ehci(hcd); | 176 | ehci = hcd_to_ehci(hcd); |
177 | ehci->caps = hcd->regs; | 177 | ehci->caps = hcd->regs; |
178 | ehci->regs = hcd->regs + HC_LENGTH(readl(&ehci->caps->hc_capbase)); | 178 | ehci->regs = hcd->regs + |
179 | HC_LENGTH(ehci, readl(&ehci->caps->hc_capbase)); | ||
179 | /* cache this readonly data; minimize chip reads */ | 180 | /* cache this readonly data; minimize chip reads */ |
180 | ehci->hcs_params = readl(&ehci->caps->hcs_params); | 181 | ehci->hcs_params = readl(&ehci->caps->hcs_params); |
181 | 182 | ||
diff --git a/drivers/usb/host/ehci-cns3xxx.c b/drivers/usb/host/ehci-cns3xxx.c index 708a05b5d258..d41745c6f0c4 100644 --- a/drivers/usb/host/ehci-cns3xxx.c +++ b/drivers/usb/host/ehci-cns3xxx.c | |||
@@ -34,7 +34,7 @@ static int cns3xxx_ehci_init(struct usb_hcd *hcd) | |||
34 | 34 | ||
35 | ehci->caps = hcd->regs; | 35 | ehci->caps = hcd->regs; |
36 | ehci->regs = hcd->regs | 36 | ehci->regs = hcd->regs |
37 | + HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 37 | + HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
38 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | 38 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); |
39 | 39 | ||
40 | hcd->has_tt = 0; | 40 | hcd->has_tt = 0; |
diff --git a/drivers/usb/host/ehci-dbg.c b/drivers/usb/host/ehci-dbg.c index 693c29b30521..40a844c1dbb4 100644 --- a/drivers/usb/host/ehci-dbg.c +++ b/drivers/usb/host/ehci-dbg.c | |||
@@ -726,7 +726,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf) | |||
726 | } | 726 | } |
727 | 727 | ||
728 | /* Capability Registers */ | 728 | /* Capability Registers */ |
729 | i = HC_VERSION(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 729 | i = HC_VERSION(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
730 | temp = scnprintf (next, size, | 730 | temp = scnprintf (next, size, |
731 | "bus %s, device %s\n" | 731 | "bus %s, device %s\n" |
732 | "%s\n" | 732 | "%s\n" |
diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index 623732a312dd..f380bf97e5af 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c | |||
@@ -324,7 +324,7 @@ static int ehci_fsl_setup(struct usb_hcd *hcd) | |||
324 | /* EHCI registers start at offset 0x100 */ | 324 | /* EHCI registers start at offset 0x100 */ |
325 | ehci->caps = hcd->regs + 0x100; | 325 | ehci->caps = hcd->regs + 0x100; |
326 | ehci->regs = hcd->regs + 0x100 + | 326 | ehci->regs = hcd->regs + 0x100 + |
327 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 327 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
328 | dbg_hcs_params(ehci, "reset"); | 328 | dbg_hcs_params(ehci, "reset"); |
329 | dbg_hcc_params(ehci, "reset"); | 329 | dbg_hcc_params(ehci, "reset"); |
330 | 330 | ||
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 83b7d5f02a15..8164ffafd10a 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
@@ -739,7 +739,7 @@ static int ehci_run (struct usb_hcd *hcd) | |||
739 | up_write(&ehci_cf_port_reset_rwsem); | 739 | up_write(&ehci_cf_port_reset_rwsem); |
740 | ehci->last_periodic_enable = ktime_get_real(); | 740 | ehci->last_periodic_enable = ktime_get_real(); |
741 | 741 | ||
742 | temp = HC_VERSION(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 742 | temp = HC_VERSION(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
743 | ehci_info (ehci, | 743 | ehci_info (ehci, |
744 | "USB %x.%x started, EHCI %x.%02x%s\n", | 744 | "USB %x.%x started, EHCI %x.%02x%s\n", |
745 | ((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f), | 745 | ((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f), |
diff --git a/drivers/usb/host/ehci-ixp4xx.c b/drivers/usb/host/ehci-ixp4xx.c index 89b7c70c6ed6..50e600d26e28 100644 --- a/drivers/usb/host/ehci-ixp4xx.c +++ b/drivers/usb/host/ehci-ixp4xx.c | |||
@@ -23,7 +23,7 @@ static int ixp4xx_ehci_init(struct usb_hcd *hcd) | |||
23 | 23 | ||
24 | ehci->caps = hcd->regs + 0x100; | 24 | ehci->caps = hcd->regs + 0x100; |
25 | ehci->regs = hcd->regs + 0x100 | 25 | ehci->regs = hcd->regs + 0x100 |
26 | + HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 26 | + HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
27 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | 27 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); |
28 | 28 | ||
29 | hcd->has_tt = 1; | 29 | hcd->has_tt = 1; |
diff --git a/drivers/usb/host/ehci-msm.c b/drivers/usb/host/ehci-msm.c index 9ce1b0bc186d..b5a0bf649c95 100644 --- a/drivers/usb/host/ehci-msm.c +++ b/drivers/usb/host/ehci-msm.c | |||
@@ -41,7 +41,7 @@ static int ehci_msm_reset(struct usb_hcd *hcd) | |||
41 | 41 | ||
42 | ehci->caps = USB_CAPLENGTH; | 42 | ehci->caps = USB_CAPLENGTH; |
43 | ehci->regs = USB_CAPLENGTH + | 43 | ehci->regs = USB_CAPLENGTH + |
44 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 44 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
45 | dbg_hcs_params(ehci, "reset"); | 45 | dbg_hcs_params(ehci, "reset"); |
46 | dbg_hcc_params(ehci, "reset"); | 46 | dbg_hcc_params(ehci, "reset"); |
47 | 47 | ||
diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c index 25c8c10bb689..0c058be35a38 100644 --- a/drivers/usb/host/ehci-mxc.c +++ b/drivers/usb/host/ehci-mxc.c | |||
@@ -208,7 +208,7 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev) | |||
208 | /* EHCI registers start at offset 0x100 */ | 208 | /* EHCI registers start at offset 0x100 */ |
209 | ehci->caps = hcd->regs + 0x100; | 209 | ehci->caps = hcd->regs + 0x100; |
210 | ehci->regs = hcd->regs + 0x100 + | 210 | ehci->regs = hcd->regs + 0x100 + |
211 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 211 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
212 | 212 | ||
213 | /* set up the PORTSCx register */ | 213 | /* set up the PORTSCx register */ |
214 | ehci_writel(ehci, pdata->portsc, &ehci->regs->port_status[0]); | 214 | ehci_writel(ehci, pdata->portsc, &ehci->regs->port_status[0]); |
diff --git a/drivers/usb/host/ehci-octeon.c b/drivers/usb/host/ehci-octeon.c index a31a031178a8..ff55757ba7d8 100644 --- a/drivers/usb/host/ehci-octeon.c +++ b/drivers/usb/host/ehci-octeon.c | |||
@@ -151,7 +151,7 @@ static int ehci_octeon_drv_probe(struct platform_device *pdev) | |||
151 | 151 | ||
152 | ehci->caps = hcd->regs; | 152 | ehci->caps = hcd->regs; |
153 | ehci->regs = hcd->regs + | 153 | ehci->regs = hcd->regs + |
154 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 154 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
155 | /* cache this readonly data; minimize chip reads */ | 155 | /* cache this readonly data; minimize chip reads */ |
156 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | 156 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); |
157 | 157 | ||
diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c index 7e41a95c5ceb..3c482dc99ece 100644 --- a/drivers/usb/host/ehci-omap.c +++ b/drivers/usb/host/ehci-omap.c | |||
@@ -188,7 +188,7 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev) | |||
188 | /* we know this is the memory we want, no need to ioremap again */ | 188 | /* we know this is the memory we want, no need to ioremap again */ |
189 | omap_ehci->caps = hcd->regs; | 189 | omap_ehci->caps = hcd->regs; |
190 | omap_ehci->regs = hcd->regs | 190 | omap_ehci->regs = hcd->regs |
191 | + HC_LENGTH(readl(&omap_ehci->caps->hc_capbase)); | 191 | + HC_LENGTH(ehci, readl(&omap_ehci->caps->hc_capbase)); |
192 | 192 | ||
193 | dbg_hcs_params(omap_ehci, "reset"); | 193 | dbg_hcs_params(omap_ehci, "reset"); |
194 | dbg_hcc_params(omap_ehci, "reset"); | 194 | dbg_hcc_params(omap_ehci, "reset"); |
diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c index 281e094e1c18..395bdb0248d5 100644 --- a/drivers/usb/host/ehci-orion.c +++ b/drivers/usb/host/ehci-orion.c | |||
@@ -251,7 +251,7 @@ static int __devinit ehci_orion_drv_probe(struct platform_device *pdev) | |||
251 | ehci = hcd_to_ehci(hcd); | 251 | ehci = hcd_to_ehci(hcd); |
252 | ehci->caps = hcd->regs + 0x100; | 252 | ehci->caps = hcd->regs + 0x100; |
253 | ehci->regs = hcd->regs + 0x100 + | 253 | ehci->regs = hcd->regs + 0x100 + |
254 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 254 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
255 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | 255 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); |
256 | hcd->has_tt = 1; | 256 | hcd->has_tt = 1; |
257 | ehci->sbrn = 0x20; | 257 | ehci->sbrn = 0x20; |
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index d5eaea7caf89..660b80a75cac 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c | |||
@@ -70,7 +70,7 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | |||
70 | 70 | ||
71 | ehci->caps = hcd->regs; | 71 | ehci->caps = hcd->regs; |
72 | ehci->regs = hcd->regs + | 72 | ehci->regs = hcd->regs + |
73 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 73 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
74 | 74 | ||
75 | dbg_hcs_params(ehci, "reset"); | 75 | dbg_hcs_params(ehci, "reset"); |
76 | dbg_hcc_params(ehci, "reset"); | 76 | dbg_hcc_params(ehci, "reset"); |
diff --git a/drivers/usb/host/ehci-pmcmsp.c b/drivers/usb/host/ehci-pmcmsp.c index a2168642175b..cd69099cda19 100644 --- a/drivers/usb/host/ehci-pmcmsp.c +++ b/drivers/usb/host/ehci-pmcmsp.c | |||
@@ -83,7 +83,7 @@ static int ehci_msp_setup(struct usb_hcd *hcd) | |||
83 | 83 | ||
84 | ehci->caps = hcd->regs; | 84 | ehci->caps = hcd->regs; |
85 | ehci->regs = hcd->regs + | 85 | ehci->regs = hcd->regs + |
86 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 86 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
87 | dbg_hcs_params(ehci, "reset"); | 87 | dbg_hcs_params(ehci, "reset"); |
88 | dbg_hcc_params(ehci, "reset"); | 88 | dbg_hcc_params(ehci, "reset"); |
89 | 89 | ||
diff --git a/drivers/usb/host/ehci-ppc-of.c b/drivers/usb/host/ehci-ppc-of.c index 1f09f253697e..8552db6c29c9 100644 --- a/drivers/usb/host/ehci-ppc-of.c +++ b/drivers/usb/host/ehci-ppc-of.c | |||
@@ -179,7 +179,7 @@ static int __devinit ehci_hcd_ppc_of_probe(struct platform_device *op) | |||
179 | 179 | ||
180 | ehci->caps = hcd->regs; | 180 | ehci->caps = hcd->regs; |
181 | ehci->regs = hcd->regs + | 181 | ehci->regs = hcd->regs + |
182 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 182 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
183 | 183 | ||
184 | /* cache this readonly data; minimize chip reads */ | 184 | /* cache this readonly data; minimize chip reads */ |
185 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | 185 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); |
diff --git a/drivers/usb/host/ehci-ps3.c b/drivers/usb/host/ehci-ps3.c index 1dee33b9139e..64626a777d61 100644 --- a/drivers/usb/host/ehci-ps3.c +++ b/drivers/usb/host/ehci-ps3.c | |||
@@ -29,7 +29,7 @@ static int ps3_ehci_hc_reset(struct usb_hcd *hcd) | |||
29 | ehci->big_endian_mmio = 1; | 29 | ehci->big_endian_mmio = 1; |
30 | 30 | ||
31 | ehci->caps = hcd->regs; | 31 | ehci->caps = hcd->regs; |
32 | ehci->regs = hcd->regs + HC_LENGTH(ehci_readl(ehci, | 32 | ehci->regs = hcd->regs + HC_LENGTH(ehci, ehci_readl(ehci, |
33 | &ehci->caps->hc_capbase)); | 33 | &ehci->caps->hc_capbase)); |
34 | 34 | ||
35 | dbg_hcs_params(ehci, "reset"); | 35 | dbg_hcs_params(ehci, "reset"); |
diff --git a/drivers/usb/host/ehci-s5p.c b/drivers/usb/host/ehci-s5p.c index 0c18f280bf4c..321a03301ad2 100644 --- a/drivers/usb/host/ehci-s5p.c +++ b/drivers/usb/host/ehci-s5p.c | |||
@@ -126,7 +126,8 @@ static int s5p_ehci_probe(struct platform_device *pdev) | |||
126 | 126 | ||
127 | ehci = hcd_to_ehci(hcd); | 127 | ehci = hcd_to_ehci(hcd); |
128 | ehci->caps = hcd->regs; | 128 | ehci->caps = hcd->regs; |
129 | ehci->regs = hcd->regs + HC_LENGTH(readl(&ehci->caps->hc_capbase)); | 129 | ehci->regs = hcd->regs + |
130 | HC_LENGTH(ehci, readl(&ehci->caps->hc_capbase)); | ||
130 | 131 | ||
131 | dbg_hcs_params(ehci, "reset"); | 132 | dbg_hcs_params(ehci, "reset"); |
132 | dbg_hcc_params(ehci, "reset"); | 133 | dbg_hcc_params(ehci, "reset"); |
diff --git a/drivers/usb/host/ehci-sh.c b/drivers/usb/host/ehci-sh.c index 595f70f42b52..86a95bb80a61 100644 --- a/drivers/usb/host/ehci-sh.c +++ b/drivers/usb/host/ehci-sh.c | |||
@@ -23,7 +23,7 @@ static int ehci_sh_reset(struct usb_hcd *hcd) | |||
23 | int ret; | 23 | int ret; |
24 | 24 | ||
25 | ehci->caps = hcd->regs; | 25 | ehci->caps = hcd->regs; |
26 | ehci->regs = hcd->regs + HC_LENGTH(ehci_readl(ehci, | 26 | ehci->regs = hcd->regs + HC_LENGTH(ehci, ehci_readl(ehci, |
27 | &ehci->caps->hc_capbase)); | 27 | &ehci->caps->hc_capbase)); |
28 | 28 | ||
29 | dbg_hcs_params(ehci, "reset"); | 29 | dbg_hcs_params(ehci, "reset"); |
diff --git a/drivers/usb/host/ehci-spear.c b/drivers/usb/host/ehci-spear.c index 75c00873443d..dbf1e4ef3c17 100644 --- a/drivers/usb/host/ehci-spear.c +++ b/drivers/usb/host/ehci-spear.c | |||
@@ -38,7 +38,7 @@ static int ehci_spear_setup(struct usb_hcd *hcd) | |||
38 | 38 | ||
39 | /* registers start at offset 0x0 */ | 39 | /* registers start at offset 0x0 */ |
40 | ehci->caps = hcd->regs; | 40 | ehci->caps = hcd->regs; |
41 | ehci->regs = hcd->regs + HC_LENGTH(ehci_readl(ehci, | 41 | ehci->regs = hcd->regs + HC_LENGTH(ehci, ehci_readl(ehci, |
42 | &ehci->caps->hc_capbase)); | 42 | &ehci->caps->hc_capbase)); |
43 | /* cache this readonly data; minimize chip reads */ | 43 | /* cache this readonly data; minimize chip reads */ |
44 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | 44 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); |
diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c index 7359bcbe4176..02b2bfd49a10 100644 --- a/drivers/usb/host/ehci-tegra.c +++ b/drivers/usb/host/ehci-tegra.c | |||
@@ -400,7 +400,7 @@ static int tegra_ehci_setup(struct usb_hcd *hcd) | |||
400 | /* EHCI registers start at offset 0x100 */ | 400 | /* EHCI registers start at offset 0x100 */ |
401 | ehci->caps = hcd->regs + 0x100; | 401 | ehci->caps = hcd->regs + 0x100; |
402 | ehci->regs = hcd->regs + 0x100 + | 402 | ehci->regs = hcd->regs + 0x100 + |
403 | HC_LENGTH(readl(&ehci->caps->hc_capbase)); | 403 | HC_LENGTH(ehci, readl(&ehci->caps->hc_capbase)); |
404 | 404 | ||
405 | dbg_hcs_params(ehci, "reset"); | 405 | dbg_hcs_params(ehci, "reset"); |
406 | dbg_hcc_params(ehci, "reset"); | 406 | dbg_hcc_params(ehci, "reset"); |
diff --git a/drivers/usb/host/ehci-vt8500.c b/drivers/usb/host/ehci-vt8500.c index 20168062035a..47d749631bc7 100644 --- a/drivers/usb/host/ehci-vt8500.c +++ b/drivers/usb/host/ehci-vt8500.c | |||
@@ -121,7 +121,8 @@ static int vt8500_ehci_drv_probe(struct platform_device *pdev) | |||
121 | 121 | ||
122 | ehci = hcd_to_ehci(hcd); | 122 | ehci = hcd_to_ehci(hcd); |
123 | ehci->caps = hcd->regs; | 123 | ehci->caps = hcd->regs; |
124 | ehci->regs = hcd->regs + HC_LENGTH(readl(&ehci->caps->hc_capbase)); | 124 | ehci->regs = hcd->regs + |
125 | HC_LENGTH(ehci, readl(&ehci->caps->hc_capbase)); | ||
125 | 126 | ||
126 | dbg_hcs_params(ehci, "reset"); | 127 | dbg_hcs_params(ehci, "reset"); |
127 | dbg_hcc_params(ehci, "reset"); | 128 | dbg_hcc_params(ehci, "reset"); |
diff --git a/drivers/usb/host/ehci-w90x900.c b/drivers/usb/host/ehci-w90x900.c index 6bc35809a5c6..52a027aaa370 100644 --- a/drivers/usb/host/ehci-w90x900.c +++ b/drivers/usb/host/ehci-w90x900.c | |||
@@ -57,7 +57,7 @@ static int __devinit usb_w90x900_probe(const struct hc_driver *driver, | |||
57 | ehci = hcd_to_ehci(hcd); | 57 | ehci = hcd_to_ehci(hcd); |
58 | ehci->caps = hcd->regs; | 58 | ehci->caps = hcd->regs; |
59 | ehci->regs = hcd->regs + | 59 | ehci->regs = hcd->regs + |
60 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 60 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
61 | 61 | ||
62 | /* enable PHY 0,1,the regs only apply to w90p910 | 62 | /* enable PHY 0,1,the regs only apply to w90p910 |
63 | * 0xA4,0xA8 were offsets of PHY0 and PHY1 controller of | 63 | * 0xA4,0xA8 were offsets of PHY0 and PHY1 controller of |
diff --git a/drivers/usb/host/ehci-xilinx-of.c b/drivers/usb/host/ehci-xilinx-of.c index effc58d7af8b..a64d6d66d760 100644 --- a/drivers/usb/host/ehci-xilinx-of.c +++ b/drivers/usb/host/ehci-xilinx-of.c | |||
@@ -220,7 +220,7 @@ static int __devinit ehci_hcd_xilinx_of_probe(struct platform_device *op) | |||
220 | */ | 220 | */ |
221 | ehci->caps = hcd->regs + 0x100; | 221 | ehci->caps = hcd->regs + 0x100; |
222 | ehci->regs = hcd->regs + 0x100 + | 222 | ehci->regs = hcd->regs + 0x100 + |
223 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 223 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
224 | 224 | ||
225 | /* cache this readonly data; minimize chip reads */ | 225 | /* cache this readonly data; minimize chip reads */ |
226 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | 226 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); |
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index e9ba8e252489..d0792f591590 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h | |||
@@ -128,6 +128,7 @@ struct ehci_hcd { /* one per controller */ | |||
128 | unsigned has_fsl_port_bug:1; /* FreeScale */ | 128 | unsigned has_fsl_port_bug:1; /* FreeScale */ |
129 | unsigned big_endian_mmio:1; | 129 | unsigned big_endian_mmio:1; |
130 | unsigned big_endian_desc:1; | 130 | unsigned big_endian_desc:1; |
131 | unsigned big_endian_capbase:1; | ||
131 | unsigned has_amcc_usb23:1; | 132 | unsigned has_amcc_usb23:1; |
132 | unsigned need_io_watchdog:1; | 133 | unsigned need_io_watchdog:1; |
133 | unsigned broken_periodic:1; | 134 | unsigned broken_periodic:1; |
@@ -605,12 +606,18 @@ ehci_port_speed(struct ehci_hcd *ehci, unsigned int portsc) | |||
605 | * This attempts to support either format at compile time without a | 606 | * This attempts to support either format at compile time without a |
606 | * runtime penalty, or both formats with the additional overhead | 607 | * runtime penalty, or both formats with the additional overhead |
607 | * of checking a flag bit. | 608 | * of checking a flag bit. |
609 | * | ||
610 | * ehci_big_endian_capbase is a special quirk for controllers that | ||
611 | * implement the HC capability registers as separate registers and not | ||
612 | * as fields of a 32-bit register. | ||
608 | */ | 613 | */ |
609 | 614 | ||
610 | #ifdef CONFIG_USB_EHCI_BIG_ENDIAN_MMIO | 615 | #ifdef CONFIG_USB_EHCI_BIG_ENDIAN_MMIO |
611 | #define ehci_big_endian_mmio(e) ((e)->big_endian_mmio) | 616 | #define ehci_big_endian_mmio(e) ((e)->big_endian_mmio) |
617 | #define ehci_big_endian_capbase(e) ((e)->big_endian_capbase) | ||
612 | #else | 618 | #else |
613 | #define ehci_big_endian_mmio(e) 0 | 619 | #define ehci_big_endian_mmio(e) 0 |
620 | #define ehci_big_endian_capbase(e) 0 | ||
614 | #endif | 621 | #endif |
615 | 622 | ||
616 | /* | 623 | /* |