diff options
author | Geoff Levand <geoffrey.levand@am.sony.com> | 2007-06-05 23:04:35 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-07-12 19:34:30 -0400 |
commit | 7a4eb7fd50d4df99fc1f623e6d90680d9fca3d82 (patch) | |
tree | 6f5332d581e600a72a03e761128bd892c2097d48 | |
parent | 59c2afa072506aae10ef93126aab651142e0c908 (diff) |
USB: PS3: USB system-bus rework
USB HCD glue updates to reflect the new PS3 unifed device support.
- Fixed remove() routine.
- Added shutdown() routine.
- Added request_mem_region() call.
- Fixed MODULE_ALIAS().
- Made a proper fix for the hack done to support muti-platform in commit
48fda45120a819ca40cadc50144b55bff1c4c78d.
Signed-off-by: Geoff Levand <geoffrey.levand@am.sony.com>
Cc: Paul Mackerras <paulus@samba.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/usb/host/ehci-hcd.c | 22 | ||||
-rw-r--r-- | drivers/usb/host/ehci-ps3.c | 86 | ||||
-rw-r--r-- | drivers/usb/host/ohci-hcd.c | 20 | ||||
-rw-r--r-- | drivers/usb/host/ohci-ps3.c | 87 |
4 files changed, 162 insertions, 53 deletions
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index a205a53c61ff..c4e15ed1405a 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
@@ -41,10 +41,6 @@ | |||
41 | #include <asm/irq.h> | 41 | #include <asm/irq.h> |
42 | #include <asm/system.h> | 42 | #include <asm/system.h> |
43 | #include <asm/unaligned.h> | 43 | #include <asm/unaligned.h> |
44 | #ifdef CONFIG_PPC_PS3 | ||
45 | #include <asm/firmware.h> | ||
46 | #endif | ||
47 | |||
48 | 44 | ||
49 | /*-------------------------------------------------------------------------*/ | 45 | /*-------------------------------------------------------------------------*/ |
50 | 46 | ||
@@ -1012,7 +1008,7 @@ MODULE_LICENSE ("GPL"); | |||
1012 | 1008 | ||
1013 | #ifdef CONFIG_PPC_PS3 | 1009 | #ifdef CONFIG_PPC_PS3 |
1014 | #include "ehci-ps3.c" | 1010 | #include "ehci-ps3.c" |
1015 | #define PS3_SYSTEM_BUS_DRIVER ps3_ehci_sb_driver | 1011 | #define PS3_SYSTEM_BUS_DRIVER ps3_ehci_driver |
1016 | #endif | 1012 | #endif |
1017 | 1013 | ||
1018 | #ifdef CONFIG_440EPX | 1014 | #ifdef CONFIG_440EPX |
@@ -1051,18 +1047,15 @@ static int __init ehci_hcd_init(void) | |||
1051 | #endif | 1047 | #endif |
1052 | 1048 | ||
1053 | #ifdef PS3_SYSTEM_BUS_DRIVER | 1049 | #ifdef PS3_SYSTEM_BUS_DRIVER |
1054 | if (firmware_has_feature(FW_FEATURE_PS3_LV1)) { | 1050 | retval = ps3_ehci_driver_register(&PS3_SYSTEM_BUS_DRIVER); |
1055 | retval = ps3_system_bus_driver_register( | 1051 | if (retval < 0) { |
1056 | &PS3_SYSTEM_BUS_DRIVER); | ||
1057 | if (retval < 0) { | ||
1058 | #ifdef PLATFORM_DRIVER | 1052 | #ifdef PLATFORM_DRIVER |
1059 | platform_driver_unregister(&PLATFORM_DRIVER); | 1053 | platform_driver_unregister(&PLATFORM_DRIVER); |
1060 | #endif | 1054 | #endif |
1061 | #ifdef PCI_DRIVER | 1055 | #ifdef PCI_DRIVER |
1062 | pci_unregister_driver(&PCI_DRIVER); | 1056 | pci_unregister_driver(&PCI_DRIVER); |
1063 | #endif | 1057 | #endif |
1064 | return retval; | 1058 | return retval; |
1065 | } | ||
1066 | } | 1059 | } |
1067 | #endif | 1060 | #endif |
1068 | 1061 | ||
@@ -1079,8 +1072,7 @@ static void __exit ehci_hcd_cleanup(void) | |||
1079 | pci_unregister_driver(&PCI_DRIVER); | 1072 | pci_unregister_driver(&PCI_DRIVER); |
1080 | #endif | 1073 | #endif |
1081 | #ifdef PS3_SYSTEM_BUS_DRIVER | 1074 | #ifdef PS3_SYSTEM_BUS_DRIVER |
1082 | if (firmware_has_feature(FW_FEATURE_PS3_LV1)) | 1075 | ps3_ehci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER); |
1083 | ps3_system_bus_driver_unregister(&PS3_SYSTEM_BUS_DRIVER); | ||
1084 | #endif | 1076 | #endif |
1085 | } | 1077 | } |
1086 | module_exit(ehci_hcd_cleanup); | 1078 | module_exit(ehci_hcd_cleanup); |
diff --git a/drivers/usb/host/ehci-ps3.c b/drivers/usb/host/ehci-ps3.c index 37b83ba09969..829fe649a981 100644 --- a/drivers/usb/host/ehci-ps3.c +++ b/drivers/usb/host/ehci-ps3.c | |||
@@ -18,6 +18,7 @@ | |||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 | */ | 19 | */ |
20 | 20 | ||
21 | #include <asm/firmware.h> | ||
21 | #include <asm/ps3.h> | 22 | #include <asm/ps3.h> |
22 | 23 | ||
23 | static int ps3_ehci_hc_reset(struct usb_hcd *hcd) | 24 | static int ps3_ehci_hc_reset(struct usb_hcd *hcd) |
@@ -73,7 +74,7 @@ static const struct hc_driver ps3_ehci_hc_driver = { | |||
73 | #endif | 74 | #endif |
74 | }; | 75 | }; |
75 | 76 | ||
76 | static int ps3_ehci_sb_probe(struct ps3_system_bus_device *dev) | 77 | static int ps3_ehci_probe(struct ps3_system_bus_device *dev) |
77 | { | 78 | { |
78 | int result; | 79 | int result; |
79 | struct usb_hcd *hcd; | 80 | struct usb_hcd *hcd; |
@@ -85,13 +86,30 @@ static int ps3_ehci_sb_probe(struct ps3_system_bus_device *dev) | |||
85 | goto fail_start; | 86 | goto fail_start; |
86 | } | 87 | } |
87 | 88 | ||
89 | result = ps3_open_hv_device(dev); | ||
90 | |||
91 | if (result) { | ||
92 | dev_dbg(&dev->core, "%s:%d: ps3_open_hv_device failed\n", | ||
93 | __func__, __LINE__); | ||
94 | goto fail_open; | ||
95 | } | ||
96 | |||
97 | result = ps3_dma_region_create(dev->d_region); | ||
98 | |||
99 | if (result) { | ||
100 | dev_dbg(&dev->core, "%s:%d: ps3_dma_region_create failed: " | ||
101 | "(%d)\n", __func__, __LINE__, result); | ||
102 | BUG_ON("check region type"); | ||
103 | goto fail_dma_region; | ||
104 | } | ||
105 | |||
88 | result = ps3_mmio_region_create(dev->m_region); | 106 | result = ps3_mmio_region_create(dev->m_region); |
89 | 107 | ||
90 | if (result) { | 108 | if (result) { |
91 | dev_dbg(&dev->core, "%s:%d: ps3_map_mmio_region failed\n", | 109 | dev_dbg(&dev->core, "%s:%d: ps3_map_mmio_region failed\n", |
92 | __func__, __LINE__); | 110 | __func__, __LINE__); |
93 | result = -EPERM; | 111 | result = -EPERM; |
94 | goto fail_mmio; | 112 | goto fail_mmio_region; |
95 | } | 113 | } |
96 | 114 | ||
97 | dev_dbg(&dev->core, "%s:%d: mmio mapped_addr %lxh\n", __func__, | 115 | dev_dbg(&dev->core, "%s:%d: mmio mapped_addr %lxh\n", __func__, |
@@ -120,6 +138,11 @@ static int ps3_ehci_sb_probe(struct ps3_system_bus_device *dev) | |||
120 | 138 | ||
121 | hcd->rsrc_start = dev->m_region->lpar_addr; | 139 | hcd->rsrc_start = dev->m_region->lpar_addr; |
122 | hcd->rsrc_len = dev->m_region->len; | 140 | hcd->rsrc_len = dev->m_region->len; |
141 | |||
142 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) | ||
143 | dev_dbg(&dev->core, "%s:%d: request_mem_region failed\n", | ||
144 | __func__, __LINE__); | ||
145 | |||
123 | hcd->regs = ioremap(dev->m_region->lpar_addr, dev->m_region->len); | 146 | hcd->regs = ioremap(dev->m_region->lpar_addr, dev->m_region->len); |
124 | 147 | ||
125 | if (!hcd->regs) { | 148 | if (!hcd->regs) { |
@@ -153,34 +176,73 @@ static int ps3_ehci_sb_probe(struct ps3_system_bus_device *dev) | |||
153 | fail_add_hcd: | 176 | fail_add_hcd: |
154 | iounmap(hcd->regs); | 177 | iounmap(hcd->regs); |
155 | fail_ioremap: | 178 | fail_ioremap: |
179 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
156 | usb_put_hcd(hcd); | 180 | usb_put_hcd(hcd); |
157 | fail_create_hcd: | 181 | fail_create_hcd: |
158 | ps3_io_irq_destroy(virq); | 182 | ps3_io_irq_destroy(virq); |
159 | fail_irq: | 183 | fail_irq: |
160 | ps3_free_mmio_region(dev->m_region); | 184 | ps3_free_mmio_region(dev->m_region); |
161 | fail_mmio: | 185 | fail_mmio_region: |
186 | ps3_dma_region_free(dev->d_region); | ||
187 | fail_dma_region: | ||
188 | ps3_close_hv_device(dev); | ||
189 | fail_open: | ||
162 | fail_start: | 190 | fail_start: |
163 | return result; | 191 | return result; |
164 | } | 192 | } |
165 | 193 | ||
166 | static int ps3_ehci_sb_remove(struct ps3_system_bus_device *dev) | 194 | static int ps3_ehci_remove(struct ps3_system_bus_device *dev) |
167 | { | 195 | { |
196 | unsigned int tmp; | ||
168 | struct usb_hcd *hcd = | 197 | struct usb_hcd *hcd = |
169 | (struct usb_hcd *)ps3_system_bus_get_driver_data(dev); | 198 | (struct usb_hcd *)ps3_system_bus_get_driver_data(dev); |
170 | 199 | ||
171 | usb_put_hcd(hcd); | 200 | BUG_ON(!hcd); |
201 | |||
202 | dev_dbg(&dev->core, "%s:%d: regs %p\n", __func__, __LINE__, hcd->regs); | ||
203 | dev_dbg(&dev->core, "%s:%d: irq %u\n", __func__, __LINE__, hcd->irq); | ||
204 | |||
205 | tmp = hcd->irq; | ||
206 | |||
207 | usb_remove_hcd(hcd); | ||
208 | |||
172 | ps3_system_bus_set_driver_data(dev, NULL); | 209 | ps3_system_bus_set_driver_data(dev, NULL); |
173 | 210 | ||
211 | BUG_ON(!hcd->regs); | ||
212 | iounmap(hcd->regs); | ||
213 | |||
214 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
215 | usb_put_hcd(hcd); | ||
216 | |||
217 | ps3_io_irq_destroy(tmp); | ||
218 | ps3_free_mmio_region(dev->m_region); | ||
219 | |||
220 | ps3_dma_region_free(dev->d_region); | ||
221 | ps3_close_hv_device(dev); | ||
222 | |||
174 | return 0; | 223 | return 0; |
175 | } | 224 | } |
176 | 225 | ||
177 | MODULE_ALIAS("ps3-ehci"); | 226 | static int ps3_ehci_driver_register(struct ps3_system_bus_driver *drv) |
227 | { | ||
228 | return firmware_has_feature(FW_FEATURE_PS3_LV1) | ||
229 | ? ps3_system_bus_driver_register(drv) | ||
230 | : 0; | ||
231 | } | ||
232 | |||
233 | static void ps3_ehci_driver_unregister(struct ps3_system_bus_driver *drv) | ||
234 | { | ||
235 | if (firmware_has_feature(FW_FEATURE_PS3_LV1)) | ||
236 | ps3_system_bus_driver_unregister(drv); | ||
237 | } | ||
238 | |||
239 | MODULE_ALIAS(PS3_MODULE_ALIAS_EHCI); | ||
178 | 240 | ||
179 | static struct ps3_system_bus_driver ps3_ehci_sb_driver = { | 241 | static struct ps3_system_bus_driver ps3_ehci_driver = { |
242 | .core.name = "ps3-ehci-driver", | ||
243 | .core.owner = THIS_MODULE, | ||
180 | .match_id = PS3_MATCH_ID_EHCI, | 244 | .match_id = PS3_MATCH_ID_EHCI, |
181 | .core = { | 245 | .probe = ps3_ehci_probe, |
182 | .name = "ps3-ehci-driver", | 246 | .remove = ps3_ehci_remove, |
183 | }, | 247 | .shutdown = ps3_ehci_remove, |
184 | .probe = ps3_ehci_sb_probe, | ||
185 | .remove = ps3_ehci_sb_remove, | ||
186 | }; | 248 | }; |
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 44717fab7435..2038125b7f8c 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
@@ -42,9 +42,6 @@ | |||
42 | #include <asm/system.h> | 42 | #include <asm/system.h> |
43 | #include <asm/unaligned.h> | 43 | #include <asm/unaligned.h> |
44 | #include <asm/byteorder.h> | 44 | #include <asm/byteorder.h> |
45 | #ifdef CONFIG_PPC_PS3 | ||
46 | #include <asm/firmware.h> | ||
47 | #endif | ||
48 | 45 | ||
49 | #include "../core/hcd.h" | 46 | #include "../core/hcd.h" |
50 | 47 | ||
@@ -927,7 +924,7 @@ MODULE_LICENSE ("GPL"); | |||
927 | 924 | ||
928 | #ifdef CONFIG_PPC_PS3 | 925 | #ifdef CONFIG_PPC_PS3 |
929 | #include "ohci-ps3.c" | 926 | #include "ohci-ps3.c" |
930 | #define PS3_SYSTEM_BUS_DRIVER ps3_ohci_sb_driver | 927 | #define PS3_SYSTEM_BUS_DRIVER ps3_ohci_driver |
931 | #endif | 928 | #endif |
932 | 929 | ||
933 | #if !defined(PCI_DRIVER) && \ | 930 | #if !defined(PCI_DRIVER) && \ |
@@ -950,12 +947,9 @@ static int __init ohci_hcd_mod_init(void) | |||
950 | sizeof (struct ed), sizeof (struct td)); | 947 | sizeof (struct ed), sizeof (struct td)); |
951 | 948 | ||
952 | #ifdef PS3_SYSTEM_BUS_DRIVER | 949 | #ifdef PS3_SYSTEM_BUS_DRIVER |
953 | if (firmware_has_feature(FW_FEATURE_PS3_LV1)) { | 950 | retval = ps3_ohci_driver_register(&PS3_SYSTEM_BUS_DRIVER); |
954 | retval = ps3_system_bus_driver_register( | 951 | if (retval < 0) |
955 | &PS3_SYSTEM_BUS_DRIVER); | 952 | goto error_ps3; |
956 | if (retval < 0) | ||
957 | goto error_ps3; | ||
958 | } | ||
959 | #endif | 953 | #endif |
960 | 954 | ||
961 | #ifdef PLATFORM_DRIVER | 955 | #ifdef PLATFORM_DRIVER |
@@ -1001,8 +995,7 @@ static int __init ohci_hcd_mod_init(void) | |||
1001 | error_platform: | 995 | error_platform: |
1002 | #endif | 996 | #endif |
1003 | #ifdef PS3_SYSTEM_BUS_DRIVER | 997 | #ifdef PS3_SYSTEM_BUS_DRIVER |
1004 | if (firmware_has_feature(FW_FEATURE_PS3_LV1)) | 998 | ps3_ohci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER); |
1005 | ps3_system_bus_driver_unregister(&PS3_SYSTEM_BUS_DRIVER); | ||
1006 | error_ps3: | 999 | error_ps3: |
1007 | #endif | 1000 | #endif |
1008 | return retval; | 1001 | return retval; |
@@ -1024,8 +1017,7 @@ static void __exit ohci_hcd_mod_exit(void) | |||
1024 | platform_driver_unregister(&PLATFORM_DRIVER); | 1017 | platform_driver_unregister(&PLATFORM_DRIVER); |
1025 | #endif | 1018 | #endif |
1026 | #ifdef PS3_SYSTEM_BUS_DRIVER | 1019 | #ifdef PS3_SYSTEM_BUS_DRIVER |
1027 | if (firmware_has_feature(FW_FEATURE_PS3_LV1)) | 1020 | ps3_ohci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER); |
1028 | ps3_system_bus_driver_unregister(&PS3_SYSTEM_BUS_DRIVER); | ||
1029 | #endif | 1021 | #endif |
1030 | } | 1022 | } |
1031 | module_exit(ohci_hcd_mod_exit); | 1023 | module_exit(ohci_hcd_mod_exit); |
diff --git a/drivers/usb/host/ohci-ps3.c b/drivers/usb/host/ohci-ps3.c index d7cf07288b0b..01a0caeaa6bc 100644 --- a/drivers/usb/host/ohci-ps3.c +++ b/drivers/usb/host/ohci-ps3.c | |||
@@ -18,6 +18,7 @@ | |||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 | */ | 19 | */ |
20 | 20 | ||
21 | #include <asm/firmware.h> | ||
21 | #include <asm/ps3.h> | 22 | #include <asm/ps3.h> |
22 | 23 | ||
23 | static int ps3_ohci_hc_reset(struct usb_hcd *hcd) | 24 | static int ps3_ohci_hc_reset(struct usb_hcd *hcd) |
@@ -75,7 +76,7 @@ static const struct hc_driver ps3_ohci_hc_driver = { | |||
75 | #endif | 76 | #endif |
76 | }; | 77 | }; |
77 | 78 | ||
78 | static int ps3_ohci_sb_probe(struct ps3_system_bus_device *dev) | 79 | static int ps3_ohci_probe(struct ps3_system_bus_device *dev) |
79 | { | 80 | { |
80 | int result; | 81 | int result; |
81 | struct usb_hcd *hcd; | 82 | struct usb_hcd *hcd; |
@@ -87,13 +88,31 @@ static int ps3_ohci_sb_probe(struct ps3_system_bus_device *dev) | |||
87 | goto fail_start; | 88 | goto fail_start; |
88 | } | 89 | } |
89 | 90 | ||
91 | result = ps3_open_hv_device(dev); | ||
92 | |||
93 | if (result) { | ||
94 | dev_dbg(&dev->core, "%s:%d: ps3_open_hv_device failed: %s\n", | ||
95 | __func__, __LINE__, ps3_result(result)); | ||
96 | result = -EPERM; | ||
97 | goto fail_open; | ||
98 | } | ||
99 | |||
100 | result = ps3_dma_region_create(dev->d_region); | ||
101 | |||
102 | if (result) { | ||
103 | dev_dbg(&dev->core, "%s:%d: ps3_dma_region_create failed: " | ||
104 | "(%d)\n", __func__, __LINE__, result); | ||
105 | BUG_ON("check region type"); | ||
106 | goto fail_dma_region; | ||
107 | } | ||
108 | |||
90 | result = ps3_mmio_region_create(dev->m_region); | 109 | result = ps3_mmio_region_create(dev->m_region); |
91 | 110 | ||
92 | if (result) { | 111 | if (result) { |
93 | dev_dbg(&dev->core, "%s:%d: ps3_map_mmio_region failed\n", | 112 | dev_dbg(&dev->core, "%s:%d: ps3_map_mmio_region failed\n", |
94 | __func__, __LINE__); | 113 | __func__, __LINE__); |
95 | result = -EPERM; | 114 | result = -EPERM; |
96 | goto fail_mmio; | 115 | goto fail_mmio_region; |
97 | } | 116 | } |
98 | 117 | ||
99 | dev_dbg(&dev->core, "%s:%d: mmio mapped_addr %lxh\n", __func__, | 118 | dev_dbg(&dev->core, "%s:%d: mmio mapped_addr %lxh\n", __func__, |
@@ -122,6 +141,11 @@ static int ps3_ohci_sb_probe(struct ps3_system_bus_device *dev) | |||
122 | 141 | ||
123 | hcd->rsrc_start = dev->m_region->lpar_addr; | 142 | hcd->rsrc_start = dev->m_region->lpar_addr; |
124 | hcd->rsrc_len = dev->m_region->len; | 143 | hcd->rsrc_len = dev->m_region->len; |
144 | |||
145 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) | ||
146 | dev_dbg(&dev->core, "%s:%d: request_mem_region failed\n", | ||
147 | __func__, __LINE__); | ||
148 | |||
125 | hcd->regs = ioremap(dev->m_region->lpar_addr, dev->m_region->len); | 149 | hcd->regs = ioremap(dev->m_region->lpar_addr, dev->m_region->len); |
126 | 150 | ||
127 | if (!hcd->regs) { | 151 | if (!hcd->regs) { |
@@ -155,34 +179,73 @@ static int ps3_ohci_sb_probe(struct ps3_system_bus_device *dev) | |||
155 | fail_add_hcd: | 179 | fail_add_hcd: |
156 | iounmap(hcd->regs); | 180 | iounmap(hcd->regs); |
157 | fail_ioremap: | 181 | fail_ioremap: |
182 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
158 | usb_put_hcd(hcd); | 183 | usb_put_hcd(hcd); |
159 | fail_create_hcd: | 184 | fail_create_hcd: |
160 | ps3_io_irq_destroy(virq); | 185 | ps3_io_irq_destroy(virq); |
161 | fail_irq: | 186 | fail_irq: |
162 | ps3_free_mmio_region(dev->m_region); | 187 | ps3_free_mmio_region(dev->m_region); |
163 | fail_mmio: | 188 | fail_mmio_region: |
189 | ps3_dma_region_free(dev->d_region); | ||
190 | fail_dma_region: | ||
191 | ps3_close_hv_device(dev); | ||
192 | fail_open: | ||
164 | fail_start: | 193 | fail_start: |
165 | return result; | 194 | return result; |
166 | } | 195 | } |
167 | 196 | ||
168 | static int ps3_ohci_sb_remove (struct ps3_system_bus_device *dev) | 197 | static int ps3_ohci_remove (struct ps3_system_bus_device *dev) |
169 | { | 198 | { |
199 | unsigned int tmp; | ||
170 | struct usb_hcd *hcd = | 200 | struct usb_hcd *hcd = |
171 | (struct usb_hcd *)ps3_system_bus_get_driver_data(dev); | 201 | (struct usb_hcd *)ps3_system_bus_get_driver_data(dev); |
172 | 202 | ||
173 | usb_put_hcd(hcd); | 203 | BUG_ON(!hcd); |
204 | |||
205 | dev_dbg(&dev->core, "%s:%d: regs %p\n", __func__, __LINE__, hcd->regs); | ||
206 | dev_dbg(&dev->core, "%s:%d: irq %u\n", __func__, __LINE__, hcd->irq); | ||
207 | |||
208 | tmp = hcd->irq; | ||
209 | |||
210 | usb_remove_hcd(hcd); | ||
211 | |||
174 | ps3_system_bus_set_driver_data(dev, NULL); | 212 | ps3_system_bus_set_driver_data(dev, NULL); |
175 | 213 | ||
214 | BUG_ON(!hcd->regs); | ||
215 | iounmap(hcd->regs); | ||
216 | |||
217 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
218 | usb_put_hcd(hcd); | ||
219 | |||
220 | ps3_io_irq_destroy(tmp); | ||
221 | ps3_free_mmio_region(dev->m_region); | ||
222 | |||
223 | ps3_dma_region_free(dev->d_region); | ||
224 | ps3_close_hv_device(dev); | ||
225 | |||
176 | return 0; | 226 | return 0; |
177 | } | 227 | } |
178 | 228 | ||
179 | MODULE_ALIAS("ps3-ohci"); | 229 | static int ps3_ohci_driver_register(struct ps3_system_bus_driver *drv) |
230 | { | ||
231 | return firmware_has_feature(FW_FEATURE_PS3_LV1) | ||
232 | ? ps3_system_bus_driver_register(drv) | ||
233 | : 0; | ||
234 | } | ||
235 | |||
236 | static void ps3_ohci_driver_unregister(struct ps3_system_bus_driver *drv) | ||
237 | { | ||
238 | if (firmware_has_feature(FW_FEATURE_PS3_LV1)) | ||
239 | ps3_system_bus_driver_unregister(drv); | ||
240 | } | ||
241 | |||
242 | MODULE_ALIAS(PS3_MODULE_ALIAS_OHCI); | ||
180 | 243 | ||
181 | static struct ps3_system_bus_driver ps3_ohci_sb_driver = { | 244 | static struct ps3_system_bus_driver ps3_ohci_driver = { |
245 | .core.name = "ps3-ohci-driver", | ||
246 | .core.owner = THIS_MODULE, | ||
182 | .match_id = PS3_MATCH_ID_OHCI, | 247 | .match_id = PS3_MATCH_ID_OHCI, |
183 | .core = { | 248 | .probe = ps3_ohci_probe, |
184 | .name = "ps3-ohci-driver", | 249 | .remove = ps3_ohci_remove, |
185 | }, | 250 | .shutdown = ps3_ohci_remove, |
186 | .probe = ps3_ohci_sb_probe, | ||
187 | .remove = ps3_ohci_sb_remove, | ||
188 | }; | 251 | }; |