diff options
author | David Brownell <david-b@pacbell.net> | 2005-08-31 14:54:09 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2005-09-12 15:23:46 -0400 |
commit | 155faf5e1e36ca3a6127bdfb5c624d58e520c411 (patch) | |
tree | c104a512de13e81d3c3c2d59b3d86e441e0de83e /drivers/usb | |
parent | fdd13b36c4a501d8787a27e54635fbd943f2685d (diff) |
[PATCH] USB: OHCI, pxa27x OHCI port power tweaks
Now that it's in use on other boards, a bug in the original code needs fixing.
There is no need for the PXA27x OHCI to set usb power during init, since
the hub driver in usbcore handles that. Those platform-specific power
control functions are also incorrect, and should therefore be removed.
Add a check to clear the OTG pin hold bit until such times OTG is
properly implemented.
Signed-Off-By: Richard Purdie <rpurdie@rpsys.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/host/ohci-pxa27x.c | 45 |
1 files changed, 7 insertions, 38 deletions
diff --git a/drivers/usb/host/ohci-pxa27x.c b/drivers/usb/host/ohci-pxa27x.c index 5dd20dbe852d..2fdb262d4726 100644 --- a/drivers/usb/host/ohci-pxa27x.c +++ b/drivers/usb/host/ohci-pxa27x.c | |||
@@ -75,33 +75,6 @@ static int pxa27x_ohci_select_pmm( int mode ) | |||
75 | return 0; | 75 | return 0; |
76 | } | 76 | } |
77 | 77 | ||
78 | /* | ||
79 | If you select PMM_PERPORT_MODE, you should set the port power | ||
80 | */ | ||
81 | static int pxa27x_ohci_set_port_power( int port ) | ||
82 | { | ||
83 | if ( (pxa27x_ohci_pmm_state==PMM_PERPORT_MODE) | ||
84 | && (port>0) && (port<PXA_UHC_MAX_PORTNUM) ) { | ||
85 | UHCRHPS(port) |= 0x100; | ||
86 | return 0; | ||
87 | } | ||
88 | return -1; | ||
89 | } | ||
90 | |||
91 | /* | ||
92 | If you select PMM_PERPORT_MODE, you should set the port power | ||
93 | */ | ||
94 | static int pxa27x_ohci_clear_port_power( int port ) | ||
95 | { | ||
96 | if ( (pxa27x_ohci_pmm_state==PMM_PERPORT_MODE) | ||
97 | && (port>0) && (port<PXA_UHC_MAX_PORTNUM) ) { | ||
98 | UHCRHPS(port) |= 0x200; | ||
99 | return 0; | ||
100 | } | ||
101 | |||
102 | return -1; | ||
103 | } | ||
104 | |||
105 | extern int usb_disabled(void); | 78 | extern int usb_disabled(void); |
106 | 79 | ||
107 | /*-------------------------------------------------------------------------*/ | 80 | /*-------------------------------------------------------------------------*/ |
@@ -130,11 +103,17 @@ static void pxa27x_start_hc(struct platform_device *dev) | |||
130 | Polarity Low to active low. Supply power to USB ports. */ | 103 | Polarity Low to active low. Supply power to USB ports. */ |
131 | UHCHR = (UHCHR | UHCHR_PCPL | UHCHR_PSPL) & | 104 | UHCHR = (UHCHR | UHCHR_PCPL | UHCHR_PSPL) & |
132 | ~(UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSEP3 | UHCHR_SSE); | 105 | ~(UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSEP3 | UHCHR_SSE); |
106 | |||
107 | pxa27x_ohci_pmm_state = PMM_PERPORT_MODE; | ||
133 | } | 108 | } |
134 | 109 | ||
135 | UHCHR &= ~UHCHR_SSE; | 110 | UHCHR &= ~UHCHR_SSE; |
136 | 111 | ||
137 | UHCHIE = (UHCHIE_UPRIE | UHCHIE_RWIE); | 112 | UHCHIE = (UHCHIE_UPRIE | UHCHIE_RWIE); |
113 | |||
114 | /* Clear any OTG Pin Hold */ | ||
115 | if (PSSR & PSSR_OTGPH) | ||
116 | PSSR |= PSSR_OTGPH; | ||
138 | } | 117 | } |
139 | 118 | ||
140 | static void pxa27x_stop_hc(struct platform_device *dev) | 119 | static void pxa27x_stop_hc(struct platform_device *dev) |
@@ -198,17 +177,7 @@ int usb_hcd_pxa27x_probe (const struct hc_driver *driver, | |||
198 | pxa27x_start_hc(dev); | 177 | pxa27x_start_hc(dev); |
199 | 178 | ||
200 | /* Select Power Management Mode */ | 179 | /* Select Power Management Mode */ |
201 | pxa27x_ohci_select_pmm( PMM_PERPORT_MODE ); | 180 | pxa27x_ohci_select_pmm(pxa27x_ohci_pmm_state); |
202 | |||
203 | /* If choosing PMM_PERPORT_MODE, we should set the port power before we use it. */ | ||
204 | if (pxa27x_ohci_set_port_power(1) < 0) | ||
205 | printk(KERN_ERR "Setting port 1 power failed.\n"); | ||
206 | |||
207 | if (pxa27x_ohci_clear_port_power(2) < 0) | ||
208 | printk(KERN_ERR "Setting port 2 power failed.\n"); | ||
209 | |||
210 | if (pxa27x_ohci_clear_port_power(3) < 0) | ||
211 | printk(KERN_ERR "Setting port 3 power failed.\n"); | ||
212 | 181 | ||
213 | ohci_hcd_init(hcd_to_ohci(hcd)); | 182 | ohci_hcd_init(hcd_to_ohci(hcd)); |
214 | 183 | ||