diff options
Diffstat (limited to 'drivers')
235 files changed, 9156 insertions, 5471 deletions
diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig index 4e4c8a4a5fd3..a796407123c7 100644 --- a/drivers/block/Kconfig +++ b/drivers/block/Kconfig | |||
@@ -354,7 +354,7 @@ config BLK_DEV_SX8 | |||
354 | Use devices /dev/sx8/$N and /dev/sx8/$Np$M. | 354 | Use devices /dev/sx8/$N and /dev/sx8/$Np$M. |
355 | 355 | ||
356 | config BLK_DEV_UB | 356 | config BLK_DEV_UB |
357 | tristate "Low Performance USB Block driver" | 357 | tristate "Low Performance USB Block driver (deprecated)" |
358 | depends on USB | 358 | depends on USB |
359 | help | 359 | help |
360 | This driver supports certain USB attached storage devices | 360 | This driver supports certain USB attached storage devices |
diff --git a/drivers/block/ub.c b/drivers/block/ub.c index 7333b9e44411..fcec0225ac76 100644 --- a/drivers/block/ub.c +++ b/drivers/block/ub.c | |||
@@ -119,43 +119,6 @@ | |||
119 | 119 | ||
120 | /* | 120 | /* |
121 | */ | 121 | */ |
122 | |||
123 | /* command block wrapper */ | ||
124 | struct bulk_cb_wrap { | ||
125 | __le32 Signature; /* contains 'USBC' */ | ||
126 | u32 Tag; /* unique per command id */ | ||
127 | __le32 DataTransferLength; /* size of data */ | ||
128 | u8 Flags; /* direction in bit 0 */ | ||
129 | u8 Lun; /* LUN */ | ||
130 | u8 Length; /* of of the CDB */ | ||
131 | u8 CDB[UB_MAX_CDB_SIZE]; /* max command */ | ||
132 | }; | ||
133 | |||
134 | #define US_BULK_CB_WRAP_LEN 31 | ||
135 | #define US_BULK_CB_SIGN 0x43425355 /*spells out USBC */ | ||
136 | #define US_BULK_FLAG_IN 1 | ||
137 | #define US_BULK_FLAG_OUT 0 | ||
138 | |||
139 | /* command status wrapper */ | ||
140 | struct bulk_cs_wrap { | ||
141 | __le32 Signature; /* should = 'USBS' */ | ||
142 | u32 Tag; /* same as original command */ | ||
143 | __le32 Residue; /* amount not transferred */ | ||
144 | u8 Status; /* see below */ | ||
145 | }; | ||
146 | |||
147 | #define US_BULK_CS_WRAP_LEN 13 | ||
148 | #define US_BULK_CS_SIGN 0x53425355 /* spells out 'USBS' */ | ||
149 | #define US_BULK_STAT_OK 0 | ||
150 | #define US_BULK_STAT_FAIL 1 | ||
151 | #define US_BULK_STAT_PHASE 2 | ||
152 | |||
153 | /* bulk-only class specific requests */ | ||
154 | #define US_BULK_RESET_REQUEST 0xff | ||
155 | #define US_BULK_GET_MAX_LUN 0xfe | ||
156 | |||
157 | /* | ||
158 | */ | ||
159 | struct ub_dev; | 122 | struct ub_dev; |
160 | 123 | ||
161 | #define UB_MAX_REQ_SG 9 /* cdrecord requires 32KB and maybe a header */ | 124 | #define UB_MAX_REQ_SG 9 /* cdrecord requires 32KB and maybe a header */ |
@@ -2477,6 +2440,8 @@ static int __init ub_init(void) | |||
2477 | int rc; | 2440 | int rc; |
2478 | int i; | 2441 | int i; |
2479 | 2442 | ||
2443 | pr_info("'Low Performance USB Block' driver is deprecated. " | ||
2444 | "Please switch to usb-storage\n"); | ||
2480 | for (i = 0; i < UB_QLOCK_NUM; i++) | 2445 | for (i = 0; i < UB_QLOCK_NUM; i++) |
2481 | spin_lock_init(&ub_qlockv[i]); | 2446 | spin_lock_init(&ub_qlockv[i]); |
2482 | 2447 | ||
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index 233576127934..4bad899fb38f 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig | |||
@@ -398,6 +398,27 @@ config USB_NET_KALMIA | |||
398 | To compile this driver as a module, choose M here: the | 398 | To compile this driver as a module, choose M here: the |
399 | module will be called kalmia. | 399 | module will be called kalmia. |
400 | 400 | ||
401 | config USB_NET_QMI_WWAN | ||
402 | tristate "QMI WWAN driver for Qualcomm MSM based 3G and LTE modems" | ||
403 | depends on USB_USBNET | ||
404 | help | ||
405 | Support WWAN LTE/3G devices based on Qualcomm Mobile Data Modem | ||
406 | (MDM) chipsets. Examples of such devices are | ||
407 | * Huawei E392/E398 | ||
408 | |||
409 | This driver will only drive the ethernet part of the chips. | ||
410 | The devices require additional configuration to be usable. | ||
411 | Multiple management interfaces with linux drivers are | ||
412 | available: | ||
413 | |||
414 | * option: AT commands on /dev/ttyUSBx | ||
415 | * cdc-wdm: Qualcomm MSM Interface (QMI) protocol on /dev/cdc-wdmx | ||
416 | |||
417 | A modem manager with support for QMI is recommended. | ||
418 | |||
419 | To compile this driver as a module, choose M here: the | ||
420 | module will be called qmi_wwan. | ||
421 | |||
401 | config USB_HSO | 422 | config USB_HSO |
402 | tristate "Option USB High Speed Mobile Devices" | 423 | tristate "Option USB High Speed Mobile Devices" |
403 | depends on USB && RFKILL | 424 | depends on USB && RFKILL |
@@ -461,4 +482,5 @@ config USB_VL600 | |||
461 | 482 | ||
462 | http://ubuntuforums.org/showpost.php?p=10589647&postcount=17 | 483 | http://ubuntuforums.org/showpost.php?p=10589647&postcount=17 |
463 | 484 | ||
485 | |||
464 | endmenu | 486 | endmenu |
diff --git a/drivers/net/usb/Makefile b/drivers/net/usb/Makefile index c203fa21f6b1..a2e2d72c52a0 100644 --- a/drivers/net/usb/Makefile +++ b/drivers/net/usb/Makefile | |||
@@ -29,4 +29,5 @@ obj-$(CONFIG_USB_SIERRA_NET) += sierra_net.o | |||
29 | obj-$(CONFIG_USB_NET_CX82310_ETH) += cx82310_eth.o | 29 | obj-$(CONFIG_USB_NET_CX82310_ETH) += cx82310_eth.o |
30 | obj-$(CONFIG_USB_NET_CDC_NCM) += cdc_ncm.o | 30 | obj-$(CONFIG_USB_NET_CDC_NCM) += cdc_ncm.o |
31 | obj-$(CONFIG_USB_VL600) += lg-vl600.o | 31 | obj-$(CONFIG_USB_VL600) += lg-vl600.o |
32 | obj-$(CONFIG_USB_NET_QMI_WWAN) += qmi_wwan.o | ||
32 | 33 | ||
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c new file mode 100644 index 000000000000..aac68f5195c0 --- /dev/null +++ b/drivers/net/usb/qmi_wwan.c | |||
@@ -0,0 +1,478 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2012 Bjørn Mork <bjorn@mork.no> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License | ||
6 | * version 2 as published by the Free Software Foundation. | ||
7 | */ | ||
8 | |||
9 | #include <linux/module.h> | ||
10 | #include <linux/netdevice.h> | ||
11 | #include <linux/ethtool.h> | ||
12 | #include <linux/mii.h> | ||
13 | #include <linux/usb.h> | ||
14 | #include <linux/usb/cdc.h> | ||
15 | #include <linux/usb/usbnet.h> | ||
16 | #include <linux/usb/cdc-wdm.h> | ||
17 | |||
18 | /* The name of the CDC Device Management driver */ | ||
19 | #define DM_DRIVER "cdc_wdm" | ||
20 | |||
21 | /* | ||
22 | * This driver supports wwan (3G/LTE/?) devices using a vendor | ||
23 | * specific management protocol called Qualcomm MSM Interface (QMI) - | ||
24 | * in addition to the more common AT commands over serial interface | ||
25 | * management | ||
26 | * | ||
27 | * QMI is wrapped in CDC, using CDC encapsulated commands on the | ||
28 | * control ("master") interface of a two-interface CDC Union | ||
29 | * resembling standard CDC ECM. The devices do not use the control | ||
30 | * interface for any other CDC messages. Most likely because the | ||
31 | * management protocol is used in place of the standard CDC | ||
32 | * notifications NOTIFY_NETWORK_CONNECTION and NOTIFY_SPEED_CHANGE | ||
33 | * | ||
34 | * Handling a protocol like QMI is out of the scope for any driver. | ||
35 | * It can be exported as a character device using the cdc-wdm driver, | ||
36 | * which will enable userspace applications ("modem managers") to | ||
37 | * handle it. This may be required to use the network interface | ||
38 | * provided by the driver. | ||
39 | * | ||
40 | * These devices may alternatively/additionally be configured using AT | ||
41 | * commands on any of the serial interfaces driven by the option driver | ||
42 | * | ||
43 | * This driver binds only to the data ("slave") interface to enable | ||
44 | * the cdc-wdm driver to bind to the control interface. It still | ||
45 | * parses the CDC functional descriptors on the control interface to | ||
46 | * a) verify that this is indeed a handled interface (CDC Union | ||
47 | * header lists it as slave) | ||
48 | * b) get MAC address and other ethernet config from the CDC Ethernet | ||
49 | * header | ||
50 | * c) enable user bind requests against the control interface, which | ||
51 | * is the common way to bind to CDC Ethernet Control Model type | ||
52 | * interfaces | ||
53 | * d) provide a hint to the user about which interface is the | ||
54 | * corresponding management interface | ||
55 | */ | ||
56 | |||
57 | static int qmi_wwan_bind(struct usbnet *dev, struct usb_interface *intf) | ||
58 | { | ||
59 | int status = -1; | ||
60 | struct usb_interface *control = NULL; | ||
61 | u8 *buf = intf->cur_altsetting->extra; | ||
62 | int len = intf->cur_altsetting->extralen; | ||
63 | struct usb_interface_descriptor *desc = &intf->cur_altsetting->desc; | ||
64 | struct usb_cdc_union_desc *cdc_union = NULL; | ||
65 | struct usb_cdc_ether_desc *cdc_ether = NULL; | ||
66 | u32 required = 1 << USB_CDC_HEADER_TYPE | 1 << USB_CDC_UNION_TYPE; | ||
67 | u32 found = 0; | ||
68 | atomic_t *pmcount = (void *)&dev->data[1]; | ||
69 | |||
70 | atomic_set(pmcount, 0); | ||
71 | |||
72 | /* | ||
73 | * assume a data interface has no additional descriptors and | ||
74 | * that the control and data interface are numbered | ||
75 | * consecutively - this holds for the Huawei device at least | ||
76 | */ | ||
77 | if (len == 0 && desc->bInterfaceNumber > 0) { | ||
78 | control = usb_ifnum_to_if(dev->udev, desc->bInterfaceNumber - 1); | ||
79 | if (!control) | ||
80 | goto err; | ||
81 | |||
82 | buf = control->cur_altsetting->extra; | ||
83 | len = control->cur_altsetting->extralen; | ||
84 | dev_dbg(&intf->dev, "guessing \"control\" => %s, \"data\" => this\n", | ||
85 | dev_name(&control->dev)); | ||
86 | } | ||
87 | |||
88 | while (len > 3) { | ||
89 | struct usb_descriptor_header *h = (void *)buf; | ||
90 | |||
91 | /* ignore any misplaced descriptors */ | ||
92 | if (h->bDescriptorType != USB_DT_CS_INTERFACE) | ||
93 | goto next_desc; | ||
94 | |||
95 | /* buf[2] is CDC descriptor subtype */ | ||
96 | switch (buf[2]) { | ||
97 | case USB_CDC_HEADER_TYPE: | ||
98 | if (found & 1 << USB_CDC_HEADER_TYPE) { | ||
99 | dev_dbg(&intf->dev, "extra CDC header\n"); | ||
100 | goto err; | ||
101 | } | ||
102 | if (h->bLength != sizeof(struct usb_cdc_header_desc)) { | ||
103 | dev_dbg(&intf->dev, "CDC header len %u\n", h->bLength); | ||
104 | goto err; | ||
105 | } | ||
106 | break; | ||
107 | case USB_CDC_UNION_TYPE: | ||
108 | if (found & 1 << USB_CDC_UNION_TYPE) { | ||
109 | dev_dbg(&intf->dev, "extra CDC union\n"); | ||
110 | goto err; | ||
111 | } | ||
112 | if (h->bLength != sizeof(struct usb_cdc_union_desc)) { | ||
113 | dev_dbg(&intf->dev, "CDC union len %u\n", h->bLength); | ||
114 | goto err; | ||
115 | } | ||
116 | cdc_union = (struct usb_cdc_union_desc *)buf; | ||
117 | break; | ||
118 | case USB_CDC_ETHERNET_TYPE: | ||
119 | if (found & 1 << USB_CDC_ETHERNET_TYPE) { | ||
120 | dev_dbg(&intf->dev, "extra CDC ether\n"); | ||
121 | goto err; | ||
122 | } | ||
123 | if (h->bLength != sizeof(struct usb_cdc_ether_desc)) { | ||
124 | dev_dbg(&intf->dev, "CDC ether len %u\n", h->bLength); | ||
125 | goto err; | ||
126 | } | ||
127 | cdc_ether = (struct usb_cdc_ether_desc *)buf; | ||
128 | break; | ||
129 | } | ||
130 | |||
131 | /* | ||
132 | * Remember which CDC functional descriptors we've seen. Works | ||
133 | * for all types we care about, of which USB_CDC_ETHERNET_TYPE | ||
134 | * (0x0f) is the highest numbered | ||
135 | */ | ||
136 | if (buf[2] < 32) | ||
137 | found |= 1 << buf[2]; | ||
138 | |||
139 | next_desc: | ||
140 | len -= h->bLength; | ||
141 | buf += h->bLength; | ||
142 | } | ||
143 | |||
144 | /* did we find all the required ones? */ | ||
145 | if ((found & required) != required) { | ||
146 | dev_err(&intf->dev, "CDC functional descriptors missing\n"); | ||
147 | goto err; | ||
148 | } | ||
149 | |||
150 | /* give the user a helpful hint if trying to bind to the wrong interface */ | ||
151 | if (cdc_union && desc->bInterfaceNumber == cdc_union->bMasterInterface0) { | ||
152 | dev_err(&intf->dev, "leaving \"control\" interface for " DM_DRIVER " - try binding to %s instead!\n", | ||
153 | dev_name(&usb_ifnum_to_if(dev->udev, cdc_union->bSlaveInterface0)->dev)); | ||
154 | goto err; | ||
155 | } | ||
156 | |||
157 | /* errors aren't fatal - we can live with the dynamic address */ | ||
158 | if (cdc_ether) { | ||
159 | dev->hard_mtu = le16_to_cpu(cdc_ether->wMaxSegmentSize); | ||
160 | usbnet_get_ethernet_addr(dev, cdc_ether->iMACAddress); | ||
161 | } | ||
162 | |||
163 | /* success! point the user to the management interface */ | ||
164 | if (control) | ||
165 | dev_info(&intf->dev, "Use \"" DM_DRIVER "\" for QMI interface %s\n", | ||
166 | dev_name(&control->dev)); | ||
167 | |||
168 | /* XXX: add a sysfs symlink somewhere to help management applications find it? */ | ||
169 | |||
170 | /* collect bulk endpoints now that we know intf == "data" interface */ | ||
171 | status = usbnet_get_endpoints(dev, intf); | ||
172 | |||
173 | err: | ||
174 | return status; | ||
175 | } | ||
176 | |||
177 | /* using a counter to merge subdriver requests with our own into a combined state */ | ||
178 | static int qmi_wwan_manage_power(struct usbnet *dev, int on) | ||
179 | { | ||
180 | atomic_t *pmcount = (void *)&dev->data[1]; | ||
181 | int rv = 0; | ||
182 | |||
183 | dev_dbg(&dev->intf->dev, "%s() pmcount=%d, on=%d\n", __func__, atomic_read(pmcount), on); | ||
184 | |||
185 | if ((on && atomic_add_return(1, pmcount) == 1) || (!on && atomic_dec_and_test(pmcount))) { | ||
186 | /* need autopm_get/put here to ensure the usbcore sees the new value */ | ||
187 | rv = usb_autopm_get_interface(dev->intf); | ||
188 | if (rv < 0) | ||
189 | goto err; | ||
190 | dev->intf->needs_remote_wakeup = on; | ||
191 | usb_autopm_put_interface(dev->intf); | ||
192 | } | ||
193 | err: | ||
194 | return rv; | ||
195 | } | ||
196 | |||
197 | static int qmi_wwan_cdc_wdm_manage_power(struct usb_interface *intf, int on) | ||
198 | { | ||
199 | struct usbnet *dev = usb_get_intfdata(intf); | ||
200 | return qmi_wwan_manage_power(dev, on); | ||
201 | } | ||
202 | |||
203 | /* Some devices combine the "control" and "data" functions into a | ||
204 | * single interface with all three endpoints: interrupt + bulk in and | ||
205 | * out | ||
206 | * | ||
207 | * Setting up cdc-wdm as a subdriver owning the interrupt endpoint | ||
208 | * will let it provide userspace access to the encapsulated QMI | ||
209 | * protocol without interfering with the usbnet operations. | ||
210 | */ | ||
211 | static int qmi_wwan_bind_shared(struct usbnet *dev, struct usb_interface *intf) | ||
212 | { | ||
213 | int rv; | ||
214 | struct usb_driver *subdriver = NULL; | ||
215 | atomic_t *pmcount = (void *)&dev->data[1]; | ||
216 | |||
217 | /* ZTE makes devices where the interface descriptors and endpoint | ||
218 | * configurations of two or more interfaces are identical, even | ||
219 | * though the functions are completely different. If set, then | ||
220 | * driver_info->data is a bitmap of acceptable interface numbers | ||
221 | * allowing us to bind to one such interface without binding to | ||
222 | * all of them | ||
223 | */ | ||
224 | if (dev->driver_info->data && | ||
225 | !test_bit(intf->cur_altsetting->desc.bInterfaceNumber, &dev->driver_info->data)) { | ||
226 | dev_info(&intf->dev, "not on our whitelist - ignored"); | ||
227 | rv = -ENODEV; | ||
228 | goto err; | ||
229 | } | ||
230 | |||
231 | atomic_set(pmcount, 0); | ||
232 | |||
233 | /* collect all three endpoints */ | ||
234 | rv = usbnet_get_endpoints(dev, intf); | ||
235 | if (rv < 0) | ||
236 | goto err; | ||
237 | |||
238 | /* require interrupt endpoint for subdriver */ | ||
239 | if (!dev->status) { | ||
240 | rv = -EINVAL; | ||
241 | goto err; | ||
242 | } | ||
243 | |||
244 | subdriver = usb_cdc_wdm_register(intf, &dev->status->desc, 512, &qmi_wwan_cdc_wdm_manage_power); | ||
245 | if (IS_ERR(subdriver)) { | ||
246 | rv = PTR_ERR(subdriver); | ||
247 | goto err; | ||
248 | } | ||
249 | |||
250 | /* can't let usbnet use the interrupt endpoint */ | ||
251 | dev->status = NULL; | ||
252 | |||
253 | /* save subdriver struct for suspend/resume wrappers */ | ||
254 | dev->data[0] = (unsigned long)subdriver; | ||
255 | |||
256 | err: | ||
257 | return rv; | ||
258 | } | ||
259 | |||
260 | /* Gobi devices uses identical class/protocol codes for all interfaces regardless | ||
261 | * of function. Some of these are CDC ACM like and have the exact same endpoints | ||
262 | * we are looking for. This leaves two possible strategies for identifying the | ||
263 | * correct interface: | ||
264 | * a) hardcoding interface number, or | ||
265 | * b) use the fact that the wwan interface is the only one lacking additional | ||
266 | * (CDC functional) descriptors | ||
267 | * | ||
268 | * Let's see if we can get away with the generic b) solution. | ||
269 | */ | ||
270 | static int qmi_wwan_bind_gobi(struct usbnet *dev, struct usb_interface *intf) | ||
271 | { | ||
272 | int rv = -EINVAL; | ||
273 | |||
274 | /* ignore any interface with additional descriptors */ | ||
275 | if (intf->cur_altsetting->extralen) | ||
276 | goto err; | ||
277 | |||
278 | rv = qmi_wwan_bind_shared(dev, intf); | ||
279 | err: | ||
280 | return rv; | ||
281 | } | ||
282 | |||
283 | static void qmi_wwan_unbind_shared(struct usbnet *dev, struct usb_interface *intf) | ||
284 | { | ||
285 | struct usb_driver *subdriver = (void *)dev->data[0]; | ||
286 | |||
287 | if (subdriver && subdriver->disconnect) | ||
288 | subdriver->disconnect(intf); | ||
289 | |||
290 | dev->data[0] = (unsigned long)NULL; | ||
291 | } | ||
292 | |||
293 | /* suspend/resume wrappers calling both usbnet and the cdc-wdm | ||
294 | * subdriver if present. | ||
295 | * | ||
296 | * NOTE: cdc-wdm also supports pre/post_reset, but we cannot provide | ||
297 | * wrappers for those without adding usbnet reset support first. | ||
298 | */ | ||
299 | static int qmi_wwan_suspend(struct usb_interface *intf, pm_message_t message) | ||
300 | { | ||
301 | struct usbnet *dev = usb_get_intfdata(intf); | ||
302 | struct usb_driver *subdriver = (void *)dev->data[0]; | ||
303 | int ret; | ||
304 | |||
305 | ret = usbnet_suspend(intf, message); | ||
306 | if (ret < 0) | ||
307 | goto err; | ||
308 | |||
309 | if (subdriver && subdriver->suspend) | ||
310 | ret = subdriver->suspend(intf, message); | ||
311 | if (ret < 0) | ||
312 | usbnet_resume(intf); | ||
313 | err: | ||
314 | return ret; | ||
315 | } | ||
316 | |||
317 | static int qmi_wwan_resume(struct usb_interface *intf) | ||
318 | { | ||
319 | struct usbnet *dev = usb_get_intfdata(intf); | ||
320 | struct usb_driver *subdriver = (void *)dev->data[0]; | ||
321 | int ret = 0; | ||
322 | |||
323 | if (subdriver && subdriver->resume) | ||
324 | ret = subdriver->resume(intf); | ||
325 | if (ret < 0) | ||
326 | goto err; | ||
327 | ret = usbnet_resume(intf); | ||
328 | if (ret < 0 && subdriver && subdriver->resume && subdriver->suspend) | ||
329 | subdriver->suspend(intf, PMSG_SUSPEND); | ||
330 | err: | ||
331 | return ret; | ||
332 | } | ||
333 | |||
334 | |||
335 | static const struct driver_info qmi_wwan_info = { | ||
336 | .description = "QMI speaking wwan device", | ||
337 | .flags = FLAG_WWAN, | ||
338 | .bind = qmi_wwan_bind, | ||
339 | .manage_power = qmi_wwan_manage_power, | ||
340 | }; | ||
341 | |||
342 | static const struct driver_info qmi_wwan_shared = { | ||
343 | .description = "QMI speaking wwan device with combined interface", | ||
344 | .flags = FLAG_WWAN, | ||
345 | .bind = qmi_wwan_bind_shared, | ||
346 | .unbind = qmi_wwan_unbind_shared, | ||
347 | .manage_power = qmi_wwan_manage_power, | ||
348 | }; | ||
349 | |||
350 | static const struct driver_info qmi_wwan_gobi = { | ||
351 | .description = "Qualcomm Gobi wwan/QMI device", | ||
352 | .flags = FLAG_WWAN, | ||
353 | .bind = qmi_wwan_bind_gobi, | ||
354 | .unbind = qmi_wwan_unbind_shared, | ||
355 | .manage_power = qmi_wwan_manage_power, | ||
356 | }; | ||
357 | |||
358 | /* ZTE suck at making USB descriptors */ | ||
359 | static const struct driver_info qmi_wwan_force_int4 = { | ||
360 | .description = "Qualcomm Gobi wwan/QMI device", | ||
361 | .flags = FLAG_WWAN, | ||
362 | .bind = qmi_wwan_bind_gobi, | ||
363 | .unbind = qmi_wwan_unbind_shared, | ||
364 | .manage_power = qmi_wwan_manage_power, | ||
365 | .data = BIT(4), /* interface whitelist bitmap */ | ||
366 | }; | ||
367 | |||
368 | |||
369 | #define HUAWEI_VENDOR_ID 0x12D1 | ||
370 | #define QMI_GOBI_DEVICE(vend, prod) \ | ||
371 | USB_DEVICE(vend, prod), \ | ||
372 | .driver_info = (unsigned long)&qmi_wwan_gobi | ||
373 | |||
374 | static const struct usb_device_id products[] = { | ||
375 | { /* Huawei E392, E398 and possibly others sharing both device id and more... */ | ||
376 | .match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_INFO, | ||
377 | .idVendor = HUAWEI_VENDOR_ID, | ||
378 | .bInterfaceClass = USB_CLASS_VENDOR_SPEC, | ||
379 | .bInterfaceSubClass = 1, | ||
380 | .bInterfaceProtocol = 8, /* NOTE: This is the *slave* interface of the CDC Union! */ | ||
381 | .driver_info = (unsigned long)&qmi_wwan_info, | ||
382 | }, | ||
383 | { /* Huawei E392, E398 and possibly others in "Windows mode" | ||
384 | * using a combined control and data interface without any CDC | ||
385 | * functional descriptors | ||
386 | */ | ||
387 | .match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_INFO, | ||
388 | .idVendor = HUAWEI_VENDOR_ID, | ||
389 | .bInterfaceClass = USB_CLASS_VENDOR_SPEC, | ||
390 | .bInterfaceSubClass = 1, | ||
391 | .bInterfaceProtocol = 17, | ||
392 | .driver_info = (unsigned long)&qmi_wwan_shared, | ||
393 | }, | ||
394 | { /* Pantech UML290 */ | ||
395 | .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, | ||
396 | .idVendor = 0x106c, | ||
397 | .idProduct = 0x3718, | ||
398 | .bInterfaceClass = 0xff, | ||
399 | .bInterfaceSubClass = 0xf0, | ||
400 | .bInterfaceProtocol = 0xff, | ||
401 | .driver_info = (unsigned long)&qmi_wwan_shared, | ||
402 | }, | ||
403 | { /* ZTE MF820D */ | ||
404 | .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, | ||
405 | .idVendor = 0x19d2, | ||
406 | .idProduct = 0x0167, | ||
407 | .bInterfaceClass = 0xff, | ||
408 | .bInterfaceSubClass = 0xff, | ||
409 | .bInterfaceProtocol = 0xff, | ||
410 | .driver_info = (unsigned long)&qmi_wwan_force_int4, | ||
411 | }, | ||
412 | {QMI_GOBI_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ | ||
413 | {QMI_GOBI_DEVICE(0x03f0, 0x1f1d)}, /* HP un2400 Gobi Modem Device */ | ||
414 | {QMI_GOBI_DEVICE(0x03f0, 0x371d)}, /* HP un2430 Mobile Broadband Module */ | ||
415 | {QMI_GOBI_DEVICE(0x04da, 0x250d)}, /* Panasonic Gobi Modem device */ | ||
416 | {QMI_GOBI_DEVICE(0x413c, 0x8172)}, /* Dell Gobi Modem device */ | ||
417 | {QMI_GOBI_DEVICE(0x1410, 0xa001)}, /* Novatel Gobi Modem device */ | ||
418 | {QMI_GOBI_DEVICE(0x0b05, 0x1776)}, /* Asus Gobi Modem device */ | ||
419 | {QMI_GOBI_DEVICE(0x19d2, 0xfff3)}, /* ONDA Gobi Modem device */ | ||
420 | {QMI_GOBI_DEVICE(0x05c6, 0x9001)}, /* Generic Gobi Modem device */ | ||
421 | {QMI_GOBI_DEVICE(0x05c6, 0x9002)}, /* Generic Gobi Modem device */ | ||
422 | {QMI_GOBI_DEVICE(0x05c6, 0x9202)}, /* Generic Gobi Modem device */ | ||
423 | {QMI_GOBI_DEVICE(0x05c6, 0x9203)}, /* Generic Gobi Modem device */ | ||
424 | {QMI_GOBI_DEVICE(0x05c6, 0x9222)}, /* Generic Gobi Modem device */ | ||
425 | {QMI_GOBI_DEVICE(0x05c6, 0x9009)}, /* Generic Gobi Modem device */ | ||
426 | {QMI_GOBI_DEVICE(0x413c, 0x8186)}, /* Dell Gobi 2000 Modem device (N0218, VU936) */ | ||
427 | {QMI_GOBI_DEVICE(0x05c6, 0x920b)}, /* Generic Gobi 2000 Modem device */ | ||
428 | {QMI_GOBI_DEVICE(0x05c6, 0x9225)}, /* Sony Gobi 2000 Modem device (N0279, VU730) */ | ||
429 | {QMI_GOBI_DEVICE(0x05c6, 0x9245)}, /* Samsung Gobi 2000 Modem device (VL176) */ | ||
430 | {QMI_GOBI_DEVICE(0x03f0, 0x251d)}, /* HP Gobi 2000 Modem device (VP412) */ | ||
431 | {QMI_GOBI_DEVICE(0x05c6, 0x9215)}, /* Acer Gobi 2000 Modem device (VP413) */ | ||
432 | {QMI_GOBI_DEVICE(0x05c6, 0x9265)}, /* Asus Gobi 2000 Modem device (VR305) */ | ||
433 | {QMI_GOBI_DEVICE(0x05c6, 0x9235)}, /* Top Global Gobi 2000 Modem device (VR306) */ | ||
434 | {QMI_GOBI_DEVICE(0x05c6, 0x9275)}, /* iRex Technologies Gobi 2000 Modem device (VR307) */ | ||
435 | {QMI_GOBI_DEVICE(0x1199, 0x9001)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ | ||
436 | {QMI_GOBI_DEVICE(0x1199, 0x9002)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ | ||
437 | {QMI_GOBI_DEVICE(0x1199, 0x9003)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ | ||
438 | {QMI_GOBI_DEVICE(0x1199, 0x9004)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ | ||
439 | {QMI_GOBI_DEVICE(0x1199, 0x9005)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ | ||
440 | {QMI_GOBI_DEVICE(0x1199, 0x9006)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ | ||
441 | {QMI_GOBI_DEVICE(0x1199, 0x9007)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ | ||
442 | {QMI_GOBI_DEVICE(0x1199, 0x9008)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ | ||
443 | {QMI_GOBI_DEVICE(0x1199, 0x9009)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ | ||
444 | {QMI_GOBI_DEVICE(0x1199, 0x900a)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ | ||
445 | {QMI_GOBI_DEVICE(0x1199, 0x9011)}, /* Sierra Wireless Gobi 2000 Modem device (MC8305) */ | ||
446 | {QMI_GOBI_DEVICE(0x16d8, 0x8002)}, /* CMDTech Gobi 2000 Modem device (VU922) */ | ||
447 | {QMI_GOBI_DEVICE(0x05c6, 0x9205)}, /* Gobi 2000 Modem device */ | ||
448 | {QMI_GOBI_DEVICE(0x1199, 0x9013)}, /* Sierra Wireless Gobi 3000 Modem device (MC8355) */ | ||
449 | { } /* END */ | ||
450 | }; | ||
451 | MODULE_DEVICE_TABLE(usb, products); | ||
452 | |||
453 | static struct usb_driver qmi_wwan_driver = { | ||
454 | .name = "qmi_wwan", | ||
455 | .id_table = products, | ||
456 | .probe = usbnet_probe, | ||
457 | .disconnect = usbnet_disconnect, | ||
458 | .suspend = qmi_wwan_suspend, | ||
459 | .resume = qmi_wwan_resume, | ||
460 | .reset_resume = qmi_wwan_resume, | ||
461 | .supports_autosuspend = 1, | ||
462 | }; | ||
463 | |||
464 | static int __init qmi_wwan_init(void) | ||
465 | { | ||
466 | return usb_register(&qmi_wwan_driver); | ||
467 | } | ||
468 | module_init(qmi_wwan_init); | ||
469 | |||
470 | static void __exit qmi_wwan_exit(void) | ||
471 | { | ||
472 | usb_deregister(&qmi_wwan_driver); | ||
473 | } | ||
474 | module_exit(qmi_wwan_exit); | ||
475 | |||
476 | MODULE_AUTHOR("Bjørn Mork <bjorn@mork.no>"); | ||
477 | MODULE_DESCRIPTION("Qualcomm MSM Interface (QMI) WWAN driver"); | ||
478 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/power/isp1704_charger.c b/drivers/power/isp1704_charger.c index b806667b59ae..1289a5f790a1 100644 --- a/drivers/power/isp1704_charger.c +++ b/drivers/power/isp1704_charger.c | |||
@@ -56,7 +56,7 @@ static u16 isp170x_id[] = { | |||
56 | struct isp1704_charger { | 56 | struct isp1704_charger { |
57 | struct device *dev; | 57 | struct device *dev; |
58 | struct power_supply psy; | 58 | struct power_supply psy; |
59 | struct otg_transceiver *otg; | 59 | struct usb_phy *phy; |
60 | struct notifier_block nb; | 60 | struct notifier_block nb; |
61 | struct work_struct work; | 61 | struct work_struct work; |
62 | 62 | ||
@@ -71,6 +71,16 @@ struct isp1704_charger { | |||
71 | unsigned max_power; | 71 | unsigned max_power; |
72 | }; | 72 | }; |
73 | 73 | ||
74 | static inline int isp1704_read(struct isp1704_charger *isp, u32 reg) | ||
75 | { | ||
76 | return usb_phy_io_read(isp->phy, reg); | ||
77 | } | ||
78 | |||
79 | static inline int isp1704_write(struct isp1704_charger *isp, u32 val, u32 reg) | ||
80 | { | ||
81 | return usb_phy_io_write(isp->phy, val, reg); | ||
82 | } | ||
83 | |||
74 | /* | 84 | /* |
75 | * Disable/enable the power from the isp1704 if a function for it | 85 | * Disable/enable the power from the isp1704 if a function for it |
76 | * has been provided with platform data. | 86 | * has been provided with platform data. |
@@ -97,31 +107,31 @@ static inline int isp1704_charger_type(struct isp1704_charger *isp) | |||
97 | u8 otg_ctrl; | 107 | u8 otg_ctrl; |
98 | int type = POWER_SUPPLY_TYPE_USB_DCP; | 108 | int type = POWER_SUPPLY_TYPE_USB_DCP; |
99 | 109 | ||
100 | func_ctrl = otg_io_read(isp->otg, ULPI_FUNC_CTRL); | 110 | func_ctrl = isp1704_read(isp, ULPI_FUNC_CTRL); |
101 | otg_ctrl = otg_io_read(isp->otg, ULPI_OTG_CTRL); | 111 | otg_ctrl = isp1704_read(isp, ULPI_OTG_CTRL); |
102 | 112 | ||
103 | /* disable pulldowns */ | 113 | /* disable pulldowns */ |
104 | reg = ULPI_OTG_CTRL_DM_PULLDOWN | ULPI_OTG_CTRL_DP_PULLDOWN; | 114 | reg = ULPI_OTG_CTRL_DM_PULLDOWN | ULPI_OTG_CTRL_DP_PULLDOWN; |
105 | otg_io_write(isp->otg, ULPI_CLR(ULPI_OTG_CTRL), reg); | 115 | isp1704_write(isp, ULPI_CLR(ULPI_OTG_CTRL), reg); |
106 | 116 | ||
107 | /* full speed */ | 117 | /* full speed */ |
108 | otg_io_write(isp->otg, ULPI_CLR(ULPI_FUNC_CTRL), | 118 | isp1704_write(isp, ULPI_CLR(ULPI_FUNC_CTRL), |
109 | ULPI_FUNC_CTRL_XCVRSEL_MASK); | 119 | ULPI_FUNC_CTRL_XCVRSEL_MASK); |
110 | otg_io_write(isp->otg, ULPI_SET(ULPI_FUNC_CTRL), | 120 | isp1704_write(isp, ULPI_SET(ULPI_FUNC_CTRL), |
111 | ULPI_FUNC_CTRL_FULL_SPEED); | 121 | ULPI_FUNC_CTRL_FULL_SPEED); |
112 | 122 | ||
113 | /* Enable strong pull-up on DP (1.5K) and reset */ | 123 | /* Enable strong pull-up on DP (1.5K) and reset */ |
114 | reg = ULPI_FUNC_CTRL_TERMSELECT | ULPI_FUNC_CTRL_RESET; | 124 | reg = ULPI_FUNC_CTRL_TERMSELECT | ULPI_FUNC_CTRL_RESET; |
115 | otg_io_write(isp->otg, ULPI_SET(ULPI_FUNC_CTRL), reg); | 125 | isp1704_write(isp, ULPI_SET(ULPI_FUNC_CTRL), reg); |
116 | usleep_range(1000, 2000); | 126 | usleep_range(1000, 2000); |
117 | 127 | ||
118 | reg = otg_io_read(isp->otg, ULPI_DEBUG); | 128 | reg = isp1704_read(isp, ULPI_DEBUG); |
119 | if ((reg & 3) != 3) | 129 | if ((reg & 3) != 3) |
120 | type = POWER_SUPPLY_TYPE_USB_CDP; | 130 | type = POWER_SUPPLY_TYPE_USB_CDP; |
121 | 131 | ||
122 | /* recover original state */ | 132 | /* recover original state */ |
123 | otg_io_write(isp->otg, ULPI_FUNC_CTRL, func_ctrl); | 133 | isp1704_write(isp, ULPI_FUNC_CTRL, func_ctrl); |
124 | otg_io_write(isp->otg, ULPI_OTG_CTRL, otg_ctrl); | 134 | isp1704_write(isp, ULPI_OTG_CTRL, otg_ctrl); |
125 | 135 | ||
126 | return type; | 136 | return type; |
127 | } | 137 | } |
@@ -136,28 +146,28 @@ static inline int isp1704_charger_verify(struct isp1704_charger *isp) | |||
136 | u8 r; | 146 | u8 r; |
137 | 147 | ||
138 | /* Reset the transceiver */ | 148 | /* Reset the transceiver */ |
139 | r = otg_io_read(isp->otg, ULPI_FUNC_CTRL); | 149 | r = isp1704_read(isp, ULPI_FUNC_CTRL); |
140 | r |= ULPI_FUNC_CTRL_RESET; | 150 | r |= ULPI_FUNC_CTRL_RESET; |
141 | otg_io_write(isp->otg, ULPI_FUNC_CTRL, r); | 151 | isp1704_write(isp, ULPI_FUNC_CTRL, r); |
142 | usleep_range(1000, 2000); | 152 | usleep_range(1000, 2000); |
143 | 153 | ||
144 | /* Set normal mode */ | 154 | /* Set normal mode */ |
145 | r &= ~(ULPI_FUNC_CTRL_RESET | ULPI_FUNC_CTRL_OPMODE_MASK); | 155 | r &= ~(ULPI_FUNC_CTRL_RESET | ULPI_FUNC_CTRL_OPMODE_MASK); |
146 | otg_io_write(isp->otg, ULPI_FUNC_CTRL, r); | 156 | isp1704_write(isp, ULPI_FUNC_CTRL, r); |
147 | 157 | ||
148 | /* Clear the DP and DM pull-down bits */ | 158 | /* Clear the DP and DM pull-down bits */ |
149 | r = ULPI_OTG_CTRL_DP_PULLDOWN | ULPI_OTG_CTRL_DM_PULLDOWN; | 159 | r = ULPI_OTG_CTRL_DP_PULLDOWN | ULPI_OTG_CTRL_DM_PULLDOWN; |
150 | otg_io_write(isp->otg, ULPI_CLR(ULPI_OTG_CTRL), r); | 160 | isp1704_write(isp, ULPI_CLR(ULPI_OTG_CTRL), r); |
151 | 161 | ||
152 | /* Enable strong pull-up on DP (1.5K) and reset */ | 162 | /* Enable strong pull-up on DP (1.5K) and reset */ |
153 | r = ULPI_FUNC_CTRL_TERMSELECT | ULPI_FUNC_CTRL_RESET; | 163 | r = ULPI_FUNC_CTRL_TERMSELECT | ULPI_FUNC_CTRL_RESET; |
154 | otg_io_write(isp->otg, ULPI_SET(ULPI_FUNC_CTRL), r); | 164 | isp1704_write(isp, ULPI_SET(ULPI_FUNC_CTRL), r); |
155 | usleep_range(1000, 2000); | 165 | usleep_range(1000, 2000); |
156 | 166 | ||
157 | /* Read the line state */ | 167 | /* Read the line state */ |
158 | if (!otg_io_read(isp->otg, ULPI_DEBUG)) { | 168 | if (!isp1704_read(isp, ULPI_DEBUG)) { |
159 | /* Disable strong pull-up on DP (1.5K) */ | 169 | /* Disable strong pull-up on DP (1.5K) */ |
160 | otg_io_write(isp->otg, ULPI_CLR(ULPI_FUNC_CTRL), | 170 | isp1704_write(isp, ULPI_CLR(ULPI_FUNC_CTRL), |
161 | ULPI_FUNC_CTRL_TERMSELECT); | 171 | ULPI_FUNC_CTRL_TERMSELECT); |
162 | return 1; | 172 | return 1; |
163 | } | 173 | } |
@@ -165,23 +175,23 @@ static inline int isp1704_charger_verify(struct isp1704_charger *isp) | |||
165 | /* Is it a charger or PS/2 connection */ | 175 | /* Is it a charger or PS/2 connection */ |
166 | 176 | ||
167 | /* Enable weak pull-up resistor on DP */ | 177 | /* Enable weak pull-up resistor on DP */ |
168 | otg_io_write(isp->otg, ULPI_SET(ISP1704_PWR_CTRL), | 178 | isp1704_write(isp, ULPI_SET(ISP1704_PWR_CTRL), |
169 | ISP1704_PWR_CTRL_DP_WKPU_EN); | 179 | ISP1704_PWR_CTRL_DP_WKPU_EN); |
170 | 180 | ||
171 | /* Disable strong pull-up on DP (1.5K) */ | 181 | /* Disable strong pull-up on DP (1.5K) */ |
172 | otg_io_write(isp->otg, ULPI_CLR(ULPI_FUNC_CTRL), | 182 | isp1704_write(isp, ULPI_CLR(ULPI_FUNC_CTRL), |
173 | ULPI_FUNC_CTRL_TERMSELECT); | 183 | ULPI_FUNC_CTRL_TERMSELECT); |
174 | 184 | ||
175 | /* Enable weak pull-down resistor on DM */ | 185 | /* Enable weak pull-down resistor on DM */ |
176 | otg_io_write(isp->otg, ULPI_SET(ULPI_OTG_CTRL), | 186 | isp1704_write(isp, ULPI_SET(ULPI_OTG_CTRL), |
177 | ULPI_OTG_CTRL_DM_PULLDOWN); | 187 | ULPI_OTG_CTRL_DM_PULLDOWN); |
178 | 188 | ||
179 | /* It's a charger if the line states are clear */ | 189 | /* It's a charger if the line states are clear */ |
180 | if (!(otg_io_read(isp->otg, ULPI_DEBUG))) | 190 | if (!(isp1704_read(isp, ULPI_DEBUG))) |
181 | ret = 1; | 191 | ret = 1; |
182 | 192 | ||
183 | /* Disable weak pull-up resistor on DP */ | 193 | /* Disable weak pull-up resistor on DP */ |
184 | otg_io_write(isp->otg, ULPI_CLR(ISP1704_PWR_CTRL), | 194 | isp1704_write(isp, ULPI_CLR(ISP1704_PWR_CTRL), |
185 | ISP1704_PWR_CTRL_DP_WKPU_EN); | 195 | ISP1704_PWR_CTRL_DP_WKPU_EN); |
186 | 196 | ||
187 | return ret; | 197 | return ret; |
@@ -193,14 +203,14 @@ static inline int isp1704_charger_detect(struct isp1704_charger *isp) | |||
193 | u8 pwr_ctrl; | 203 | u8 pwr_ctrl; |
194 | int ret = 0; | 204 | int ret = 0; |
195 | 205 | ||
196 | pwr_ctrl = otg_io_read(isp->otg, ISP1704_PWR_CTRL); | 206 | pwr_ctrl = isp1704_read(isp, ISP1704_PWR_CTRL); |
197 | 207 | ||
198 | /* set SW control bit in PWR_CTRL register */ | 208 | /* set SW control bit in PWR_CTRL register */ |
199 | otg_io_write(isp->otg, ISP1704_PWR_CTRL, | 209 | isp1704_write(isp, ISP1704_PWR_CTRL, |
200 | ISP1704_PWR_CTRL_SWCTRL); | 210 | ISP1704_PWR_CTRL_SWCTRL); |
201 | 211 | ||
202 | /* enable manual charger detection */ | 212 | /* enable manual charger detection */ |
203 | otg_io_write(isp->otg, ULPI_SET(ISP1704_PWR_CTRL), | 213 | isp1704_write(isp, ULPI_SET(ISP1704_PWR_CTRL), |
204 | ISP1704_PWR_CTRL_SWCTRL | 214 | ISP1704_PWR_CTRL_SWCTRL |
205 | | ISP1704_PWR_CTRL_DPVSRC_EN); | 215 | | ISP1704_PWR_CTRL_DPVSRC_EN); |
206 | usleep_range(1000, 2000); | 216 | usleep_range(1000, 2000); |
@@ -208,7 +218,7 @@ static inline int isp1704_charger_detect(struct isp1704_charger *isp) | |||
208 | timeout = jiffies + msecs_to_jiffies(300); | 218 | timeout = jiffies + msecs_to_jiffies(300); |
209 | do { | 219 | do { |
210 | /* Check if there is a charger */ | 220 | /* Check if there is a charger */ |
211 | if (otg_io_read(isp->otg, ISP1704_PWR_CTRL) | 221 | if (isp1704_read(isp, ISP1704_PWR_CTRL) |
212 | & ISP1704_PWR_CTRL_VDAT_DET) { | 222 | & ISP1704_PWR_CTRL_VDAT_DET) { |
213 | ret = isp1704_charger_verify(isp); | 223 | ret = isp1704_charger_verify(isp); |
214 | break; | 224 | break; |
@@ -216,7 +226,7 @@ static inline int isp1704_charger_detect(struct isp1704_charger *isp) | |||
216 | } while (!time_after(jiffies, timeout) && isp->online); | 226 | } while (!time_after(jiffies, timeout) && isp->online); |
217 | 227 | ||
218 | /* recover original state */ | 228 | /* recover original state */ |
219 | otg_io_write(isp->otg, ISP1704_PWR_CTRL, pwr_ctrl); | 229 | isp1704_write(isp, ISP1704_PWR_CTRL, pwr_ctrl); |
220 | 230 | ||
221 | return ret; | 231 | return ret; |
222 | } | 232 | } |
@@ -264,8 +274,8 @@ static void isp1704_charger_work(struct work_struct *data) | |||
264 | case POWER_SUPPLY_TYPE_USB: | 274 | case POWER_SUPPLY_TYPE_USB: |
265 | default: | 275 | default: |
266 | /* enable data pullups */ | 276 | /* enable data pullups */ |
267 | if (isp->otg->gadget) | 277 | if (isp->phy->otg->gadget) |
268 | usb_gadget_connect(isp->otg->gadget); | 278 | usb_gadget_connect(isp->phy->otg->gadget); |
269 | } | 279 | } |
270 | break; | 280 | break; |
271 | case USB_EVENT_NONE: | 281 | case USB_EVENT_NONE: |
@@ -283,8 +293,8 @@ static void isp1704_charger_work(struct work_struct *data) | |||
283 | * chargers. The pullups may be enabled elsewhere, so this can | 293 | * chargers. The pullups may be enabled elsewhere, so this can |
284 | * not be the final solution. | 294 | * not be the final solution. |
285 | */ | 295 | */ |
286 | if (isp->otg->gadget) | 296 | if (isp->phy->otg->gadget) |
287 | usb_gadget_disconnect(isp->otg->gadget); | 297 | usb_gadget_disconnect(isp->phy->otg->gadget); |
288 | 298 | ||
289 | isp1704_charger_set_power(isp, 0); | 299 | isp1704_charger_set_power(isp, 0); |
290 | break; | 300 | break; |
@@ -364,11 +374,11 @@ static inline int isp1704_test_ulpi(struct isp1704_charger *isp) | |||
364 | int ret = -ENODEV; | 374 | int ret = -ENODEV; |
365 | 375 | ||
366 | /* Test ULPI interface */ | 376 | /* Test ULPI interface */ |
367 | ret = otg_io_write(isp->otg, ULPI_SCRATCH, 0xaa); | 377 | ret = isp1704_write(isp, ULPI_SCRATCH, 0xaa); |
368 | if (ret < 0) | 378 | if (ret < 0) |
369 | return ret; | 379 | return ret; |
370 | 380 | ||
371 | ret = otg_io_read(isp->otg, ULPI_SCRATCH); | 381 | ret = isp1704_read(isp, ULPI_SCRATCH); |
372 | if (ret < 0) | 382 | if (ret < 0) |
373 | return ret; | 383 | return ret; |
374 | 384 | ||
@@ -376,13 +386,13 @@ static inline int isp1704_test_ulpi(struct isp1704_charger *isp) | |||
376 | return -ENODEV; | 386 | return -ENODEV; |
377 | 387 | ||
378 | /* Verify the product and vendor id matches */ | 388 | /* Verify the product and vendor id matches */ |
379 | vendor = otg_io_read(isp->otg, ULPI_VENDOR_ID_LOW); | 389 | vendor = isp1704_read(isp, ULPI_VENDOR_ID_LOW); |
380 | vendor |= otg_io_read(isp->otg, ULPI_VENDOR_ID_HIGH) << 8; | 390 | vendor |= isp1704_read(isp, ULPI_VENDOR_ID_HIGH) << 8; |
381 | if (vendor != NXP_VENDOR_ID) | 391 | if (vendor != NXP_VENDOR_ID) |
382 | return -ENODEV; | 392 | return -ENODEV; |
383 | 393 | ||
384 | product = otg_io_read(isp->otg, ULPI_PRODUCT_ID_LOW); | 394 | product = isp1704_read(isp, ULPI_PRODUCT_ID_LOW); |
385 | product |= otg_io_read(isp->otg, ULPI_PRODUCT_ID_HIGH) << 8; | 395 | product |= isp1704_read(isp, ULPI_PRODUCT_ID_HIGH) << 8; |
386 | 396 | ||
387 | for (i = 0; i < ARRAY_SIZE(isp170x_id); i++) { | 397 | for (i = 0; i < ARRAY_SIZE(isp170x_id); i++) { |
388 | if (product == isp170x_id[i]) { | 398 | if (product == isp170x_id[i]) { |
@@ -405,8 +415,8 @@ static int __devinit isp1704_charger_probe(struct platform_device *pdev) | |||
405 | if (!isp) | 415 | if (!isp) |
406 | return -ENOMEM; | 416 | return -ENOMEM; |
407 | 417 | ||
408 | isp->otg = otg_get_transceiver(); | 418 | isp->phy = usb_get_transceiver(); |
409 | if (!isp->otg) | 419 | if (!isp->phy) |
410 | goto fail0; | 420 | goto fail0; |
411 | 421 | ||
412 | isp->dev = &pdev->dev; | 422 | isp->dev = &pdev->dev; |
@@ -429,14 +439,14 @@ static int __devinit isp1704_charger_probe(struct platform_device *pdev) | |||
429 | goto fail1; | 439 | goto fail1; |
430 | 440 | ||
431 | /* | 441 | /* |
432 | * REVISIT: using work in order to allow the otg notifications to be | 442 | * REVISIT: using work in order to allow the usb notifications to be |
433 | * made atomically in the future. | 443 | * made atomically in the future. |
434 | */ | 444 | */ |
435 | INIT_WORK(&isp->work, isp1704_charger_work); | 445 | INIT_WORK(&isp->work, isp1704_charger_work); |
436 | 446 | ||
437 | isp->nb.notifier_call = isp1704_notifier_call; | 447 | isp->nb.notifier_call = isp1704_notifier_call; |
438 | 448 | ||
439 | ret = otg_register_notifier(isp->otg, &isp->nb); | 449 | ret = usb_register_notifier(isp->phy, &isp->nb); |
440 | if (ret) | 450 | if (ret) |
441 | goto fail2; | 451 | goto fail2; |
442 | 452 | ||
@@ -449,13 +459,13 @@ static int __devinit isp1704_charger_probe(struct platform_device *pdev) | |||
449 | * enumerated. The charger driver should be always loaded before any | 459 | * enumerated. The charger driver should be always loaded before any |
450 | * gadget is loaded. | 460 | * gadget is loaded. |
451 | */ | 461 | */ |
452 | if (isp->otg->gadget) | 462 | if (isp->phy->otg->gadget) |
453 | usb_gadget_disconnect(isp->otg->gadget); | 463 | usb_gadget_disconnect(isp->phy->otg->gadget); |
454 | 464 | ||
455 | /* Detect charger if VBUS is valid (the cable was already plugged). */ | 465 | /* Detect charger if VBUS is valid (the cable was already plugged). */ |
456 | ret = otg_io_read(isp->otg, ULPI_USB_INT_STS); | 466 | ret = isp1704_read(isp, ULPI_USB_INT_STS); |
457 | isp1704_charger_set_power(isp, 0); | 467 | isp1704_charger_set_power(isp, 0); |
458 | if ((ret & ULPI_INT_VBUS_VALID) && !isp->otg->default_a) { | 468 | if ((ret & ULPI_INT_VBUS_VALID) && !isp->phy->otg->default_a) { |
459 | isp->event = USB_EVENT_VBUS; | 469 | isp->event = USB_EVENT_VBUS; |
460 | schedule_work(&isp->work); | 470 | schedule_work(&isp->work); |
461 | } | 471 | } |
@@ -464,7 +474,7 @@ static int __devinit isp1704_charger_probe(struct platform_device *pdev) | |||
464 | fail2: | 474 | fail2: |
465 | power_supply_unregister(&isp->psy); | 475 | power_supply_unregister(&isp->psy); |
466 | fail1: | 476 | fail1: |
467 | otg_put_transceiver(isp->otg); | 477 | usb_put_transceiver(isp->phy); |
468 | fail0: | 478 | fail0: |
469 | kfree(isp); | 479 | kfree(isp); |
470 | 480 | ||
@@ -477,9 +487,9 @@ static int __devexit isp1704_charger_remove(struct platform_device *pdev) | |||
477 | { | 487 | { |
478 | struct isp1704_charger *isp = platform_get_drvdata(pdev); | 488 | struct isp1704_charger *isp = platform_get_drvdata(pdev); |
479 | 489 | ||
480 | otg_unregister_notifier(isp->otg, &isp->nb); | 490 | usb_unregister_notifier(isp->phy, &isp->nb); |
481 | power_supply_unregister(&isp->psy); | 491 | power_supply_unregister(&isp->psy); |
482 | otg_put_transceiver(isp->otg); | 492 | usb_put_transceiver(isp->phy); |
483 | isp1704_charger_set_power(isp, 0); | 493 | isp1704_charger_set_power(isp, 0); |
484 | kfree(isp); | 494 | kfree(isp); |
485 | 495 | ||
diff --git a/drivers/power/pda_power.c b/drivers/power/pda_power.c index fd49689738af..214468f4444a 100644 --- a/drivers/power/pda_power.c +++ b/drivers/power/pda_power.c | |||
@@ -40,7 +40,7 @@ static struct timer_list polling_timer; | |||
40 | static int polling; | 40 | static int polling; |
41 | 41 | ||
42 | #ifdef CONFIG_USB_OTG_UTILS | 42 | #ifdef CONFIG_USB_OTG_UTILS |
43 | static struct otg_transceiver *transceiver; | 43 | static struct usb_phy *transceiver; |
44 | static struct notifier_block otg_nb; | 44 | static struct notifier_block otg_nb; |
45 | #endif | 45 | #endif |
46 | 46 | ||
@@ -321,7 +321,7 @@ static int pda_power_probe(struct platform_device *pdev) | |||
321 | } | 321 | } |
322 | 322 | ||
323 | #ifdef CONFIG_USB_OTG_UTILS | 323 | #ifdef CONFIG_USB_OTG_UTILS |
324 | transceiver = otg_get_transceiver(); | 324 | transceiver = usb_get_transceiver(); |
325 | if (transceiver && !pdata->is_usb_online) { | 325 | if (transceiver && !pdata->is_usb_online) { |
326 | pdata->is_usb_online = otg_is_usb_online; | 326 | pdata->is_usb_online = otg_is_usb_online; |
327 | } | 327 | } |
@@ -375,7 +375,7 @@ static int pda_power_probe(struct platform_device *pdev) | |||
375 | #ifdef CONFIG_USB_OTG_UTILS | 375 | #ifdef CONFIG_USB_OTG_UTILS |
376 | if (transceiver && pdata->use_otg_notifier) { | 376 | if (transceiver && pdata->use_otg_notifier) { |
377 | otg_nb.notifier_call = otg_handle_notification; | 377 | otg_nb.notifier_call = otg_handle_notification; |
378 | ret = otg_register_notifier(transceiver, &otg_nb); | 378 | ret = usb_register_notifier(transceiver, &otg_nb); |
379 | if (ret) { | 379 | if (ret) { |
380 | dev_err(dev, "failure to register otg notifier\n"); | 380 | dev_err(dev, "failure to register otg notifier\n"); |
381 | goto otg_reg_notifier_failed; | 381 | goto otg_reg_notifier_failed; |
@@ -409,7 +409,7 @@ usb_supply_failed: | |||
409 | free_irq(ac_irq->start, &pda_psy_ac); | 409 | free_irq(ac_irq->start, &pda_psy_ac); |
410 | #ifdef CONFIG_USB_OTG_UTILS | 410 | #ifdef CONFIG_USB_OTG_UTILS |
411 | if (transceiver) | 411 | if (transceiver) |
412 | otg_put_transceiver(transceiver); | 412 | usb_put_transceiver(transceiver); |
413 | #endif | 413 | #endif |
414 | ac_irq_failed: | 414 | ac_irq_failed: |
415 | if (pdata->is_ac_online) | 415 | if (pdata->is_ac_online) |
@@ -444,7 +444,7 @@ static int pda_power_remove(struct platform_device *pdev) | |||
444 | power_supply_unregister(&pda_psy_ac); | 444 | power_supply_unregister(&pda_psy_ac); |
445 | #ifdef CONFIG_USB_OTG_UTILS | 445 | #ifdef CONFIG_USB_OTG_UTILS |
446 | if (transceiver) | 446 | if (transceiver) |
447 | otg_put_transceiver(transceiver); | 447 | usb_put_transceiver(transceiver); |
448 | #endif | 448 | #endif |
449 | if (ac_draw) { | 449 | if (ac_draw) { |
450 | regulator_put(ac_draw); | 450 | regulator_put(ac_draw); |
diff --git a/drivers/power/twl4030_charger.c b/drivers/power/twl4030_charger.c index 54b9198fa576..fdad850c77d3 100644 --- a/drivers/power/twl4030_charger.c +++ b/drivers/power/twl4030_charger.c | |||
@@ -69,8 +69,8 @@ struct twl4030_bci { | |||
69 | struct device *dev; | 69 | struct device *dev; |
70 | struct power_supply ac; | 70 | struct power_supply ac; |
71 | struct power_supply usb; | 71 | struct power_supply usb; |
72 | struct otg_transceiver *transceiver; | 72 | struct usb_phy *transceiver; |
73 | struct notifier_block otg_nb; | 73 | struct notifier_block usb_nb; |
74 | struct work_struct work; | 74 | struct work_struct work; |
75 | int irq_chg; | 75 | int irq_chg; |
76 | int irq_bci; | 76 | int irq_bci; |
@@ -279,7 +279,7 @@ static void twl4030_bci_usb_work(struct work_struct *data) | |||
279 | static int twl4030_bci_usb_ncb(struct notifier_block *nb, unsigned long val, | 279 | static int twl4030_bci_usb_ncb(struct notifier_block *nb, unsigned long val, |
280 | void *priv) | 280 | void *priv) |
281 | { | 281 | { |
282 | struct twl4030_bci *bci = container_of(nb, struct twl4030_bci, otg_nb); | 282 | struct twl4030_bci *bci = container_of(nb, struct twl4030_bci, usb_nb); |
283 | 283 | ||
284 | dev_dbg(bci->dev, "OTG notify %lu\n", val); | 284 | dev_dbg(bci->dev, "OTG notify %lu\n", val); |
285 | 285 | ||
@@ -479,10 +479,10 @@ static int __init twl4030_bci_probe(struct platform_device *pdev) | |||
479 | 479 | ||
480 | INIT_WORK(&bci->work, twl4030_bci_usb_work); | 480 | INIT_WORK(&bci->work, twl4030_bci_usb_work); |
481 | 481 | ||
482 | bci->transceiver = otg_get_transceiver(); | 482 | bci->transceiver = usb_get_transceiver(); |
483 | if (bci->transceiver != NULL) { | 483 | if (bci->transceiver != NULL) { |
484 | bci->otg_nb.notifier_call = twl4030_bci_usb_ncb; | 484 | bci->usb_nb.notifier_call = twl4030_bci_usb_ncb; |
485 | otg_register_notifier(bci->transceiver, &bci->otg_nb); | 485 | usb_register_notifier(bci->transceiver, &bci->usb_nb); |
486 | } | 486 | } |
487 | 487 | ||
488 | /* Enable interrupts now. */ | 488 | /* Enable interrupts now. */ |
@@ -508,8 +508,8 @@ static int __init twl4030_bci_probe(struct platform_device *pdev) | |||
508 | 508 | ||
509 | fail_unmask_interrupts: | 509 | fail_unmask_interrupts: |
510 | if (bci->transceiver != NULL) { | 510 | if (bci->transceiver != NULL) { |
511 | otg_unregister_notifier(bci->transceiver, &bci->otg_nb); | 511 | usb_unregister_notifier(bci->transceiver, &bci->usb_nb); |
512 | otg_put_transceiver(bci->transceiver); | 512 | usb_put_transceiver(bci->transceiver); |
513 | } | 513 | } |
514 | free_irq(bci->irq_bci, bci); | 514 | free_irq(bci->irq_bci, bci); |
515 | fail_bci_irq: | 515 | fail_bci_irq: |
@@ -539,8 +539,8 @@ static int __exit twl4030_bci_remove(struct platform_device *pdev) | |||
539 | TWL4030_INTERRUPTS_BCIIMR2A); | 539 | TWL4030_INTERRUPTS_BCIIMR2A); |
540 | 540 | ||
541 | if (bci->transceiver != NULL) { | 541 | if (bci->transceiver != NULL) { |
542 | otg_unregister_notifier(bci->transceiver, &bci->otg_nb); | 542 | usb_unregister_notifier(bci->transceiver, &bci->usb_nb); |
543 | otg_put_transceiver(bci->transceiver); | 543 | usb_put_transceiver(bci->transceiver); |
544 | } | 544 | } |
545 | free_irq(bci->irq_bci, bci); | 545 | free_irq(bci->irq_bci, bci); |
546 | free_irq(bci->irq_chg, bci); | 546 | free_irq(bci->irq_chg, bci); |
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 29c4c0480976..01b03744f1f9 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c | |||
@@ -1295,6 +1295,7 @@ EXPORT_SYMBOL(int_to_scsilun); | |||
1295 | * LUNs even if it's older than SCSI-3. | 1295 | * LUNs even if it's older than SCSI-3. |
1296 | * If BLIST_NOREPORTLUN is set, return 1 always. | 1296 | * If BLIST_NOREPORTLUN is set, return 1 always. |
1297 | * If BLIST_NOLUN is set, return 0 always. | 1297 | * If BLIST_NOLUN is set, return 0 always. |
1298 | * If starget->no_report_luns is set, return 1 always. | ||
1298 | * | 1299 | * |
1299 | * Return: | 1300 | * Return: |
1300 | * 0: scan completed (or no memory, so further scanning is futile) | 1301 | * 0: scan completed (or no memory, so further scanning is futile) |
@@ -1321,6 +1322,7 @@ static int scsi_report_lun_scan(struct scsi_target *starget, int bflags, | |||
1321 | * Only support SCSI-3 and up devices if BLIST_NOREPORTLUN is not set. | 1322 | * Only support SCSI-3 and up devices if BLIST_NOREPORTLUN is not set. |
1322 | * Also allow SCSI-2 if BLIST_REPORTLUN2 is set and host adapter does | 1323 | * Also allow SCSI-2 if BLIST_REPORTLUN2 is set and host adapter does |
1323 | * support more than 8 LUNs. | 1324 | * support more than 8 LUNs. |
1325 | * Don't attempt if the target doesn't support REPORT LUNS. | ||
1324 | */ | 1326 | */ |
1325 | if (bflags & BLIST_NOREPORTLUN) | 1327 | if (bflags & BLIST_NOREPORTLUN) |
1326 | return 1; | 1328 | return 1; |
@@ -1332,6 +1334,8 @@ static int scsi_report_lun_scan(struct scsi_target *starget, int bflags, | |||
1332 | return 1; | 1334 | return 1; |
1333 | if (bflags & BLIST_NOLUN) | 1335 | if (bflags & BLIST_NOLUN) |
1334 | return 0; | 1336 | return 0; |
1337 | if (starget->no_report_luns) | ||
1338 | return 1; | ||
1335 | 1339 | ||
1336 | if (!(sdev = scsi_device_lookup_by_target(starget, 0))) { | 1340 | if (!(sdev = scsi_device_lookup_by_target(starget, 0))) { |
1337 | sdev = scsi_alloc_sdev(starget, 0, NULL); | 1341 | sdev = scsi_alloc_sdev(starget, 0, NULL); |
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index c691fb50e6cb..d173b90b25e9 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -2349,7 +2349,7 @@ static int sd_try_extended_inquiry(struct scsi_device *sdp) | |||
2349 | * some USB ones crash on receiving them, and the pages | 2349 | * some USB ones crash on receiving them, and the pages |
2350 | * we currently ask for are for SPC-3 and beyond | 2350 | * we currently ask for are for SPC-3 and beyond |
2351 | */ | 2351 | */ |
2352 | if (sdp->scsi_level > SCSI_SPC_2) | 2352 | if (sdp->scsi_level > SCSI_SPC_2 && !sdp->skip_vpd_pages) |
2353 | return 1; | 2353 | return 1; |
2354 | return 0; | 2354 | return 0; |
2355 | } | 2355 | } |
diff --git a/drivers/staging/keucr/transport.h b/drivers/staging/keucr/transport.h index 4ae57d0145b2..2a11a98375d7 100644 --- a/drivers/staging/keucr/transport.h +++ b/drivers/staging/keucr/transport.h | |||
@@ -3,43 +3,6 @@ | |||
3 | 3 | ||
4 | #include <linux/blkdev.h> | 4 | #include <linux/blkdev.h> |
5 | 5 | ||
6 | /* Bulk only data structures */ | ||
7 | |||
8 | /* command block wrapper */ | ||
9 | struct bulk_cb_wrap { | ||
10 | __le32 Signature; /* contains 'USBC' */ | ||
11 | __u32 Tag; /* unique per command id */ | ||
12 | __le32 DataTransferLength; /* size of data */ | ||
13 | __u8 Flags; /* direction in bit 0 */ | ||
14 | __u8 Lun; /* LUN normally 0 */ | ||
15 | __u8 Length; /* of of the CDB */ | ||
16 | __u8 CDB[16]; /* max command */ | ||
17 | }; | ||
18 | |||
19 | #define US_BULK_CB_WRAP_LEN 31 | ||
20 | #define US_BULK_CB_SIGN 0x43425355 /*spells out USBC */ | ||
21 | #define US_BULK_FLAG_IN 1 | ||
22 | #define US_BULK_FLAG_OUT 0 | ||
23 | |||
24 | /* command status wrapper */ | ||
25 | struct bulk_cs_wrap { | ||
26 | __le32 Signature; /* should = 'USBS' */ | ||
27 | __u32 Tag; /* same as original command */ | ||
28 | __le32 Residue; /* amount not transferred */ | ||
29 | __u8 Status; /* see below */ | ||
30 | __u8 Filler[18]; | ||
31 | }; | ||
32 | |||
33 | #define US_BULK_CS_WRAP_LEN 13 | ||
34 | #define US_BULK_CS_SIGN 0x53425355 /* spells out 'USBS' */ | ||
35 | #define US_BULK_STAT_OK 0 | ||
36 | #define US_BULK_STAT_FAIL 1 | ||
37 | #define US_BULK_STAT_PHASE 2 | ||
38 | |||
39 | /* bulk-only class specific requests */ | ||
40 | #define US_BULK_RESET_REQUEST 0xff | ||
41 | #define US_BULK_GET_MAX_LUN 0xfe | ||
42 | |||
43 | /* usb_stor_bulk_transfer_xxx() return codes, in order of severity */ | 6 | /* usb_stor_bulk_transfer_xxx() return codes, in order of severity */ |
44 | #define USB_STOR_XFER_GOOD 0 /* good transfer */ | 7 | #define USB_STOR_XFER_GOOD 0 /* good transfer */ |
45 | #define USB_STOR_XFER_SHORT 1 /* transferred less than expected */ | 8 | #define USB_STOR_XFER_SHORT 1 /* transferred less than expected */ |
diff --git a/drivers/staging/quatech_usb2/quatech_usb2.c b/drivers/staging/quatech_usb2/quatech_usb2.c index 897a3a99c794..bb977e00cc86 100644 --- a/drivers/staging/quatech_usb2/quatech_usb2.c +++ b/drivers/staging/quatech_usb2/quatech_usb2.c | |||
@@ -135,7 +135,6 @@ static struct usb_driver quausb2_usb_driver = { | |||
135 | .probe = usb_serial_probe, | 135 | .probe = usb_serial_probe, |
136 | .disconnect = usb_serial_disconnect, | 136 | .disconnect = usb_serial_disconnect, |
137 | .id_table = quausb2_id_table, | 137 | .id_table = quausb2_id_table, |
138 | .no_dynamic_id = 1, | ||
139 | }; | 138 | }; |
140 | 139 | ||
141 | /** | 140 | /** |
@@ -1942,7 +1941,6 @@ static struct usb_serial_driver quatech2_device = { | |||
1942 | .name = "quatech_usb2", | 1941 | .name = "quatech_usb2", |
1943 | }, | 1942 | }, |
1944 | .description = DRIVER_DESC, | 1943 | .description = DRIVER_DESC, |
1945 | .usb_driver = &quausb2_usb_driver, | ||
1946 | .id_table = quausb2_id_table, | 1944 | .id_table = quausb2_id_table, |
1947 | .num_ports = 8, | 1945 | .num_ports = 8, |
1948 | .open = qt2_open, | 1946 | .open = qt2_open, |
@@ -1964,41 +1962,11 @@ static struct usb_serial_driver quatech2_device = { | |||
1964 | .write_bulk_callback = qt2_write_bulk_callback, | 1962 | .write_bulk_callback = qt2_write_bulk_callback, |
1965 | }; | 1963 | }; |
1966 | 1964 | ||
1967 | static int __init quausb2_usb_init(void) | 1965 | static struct usb_serial_driver * const serial_drivers[] = { |
1968 | { | 1966 | &quatech2_device, NULL |
1969 | int retval; | 1967 | }; |
1970 | |||
1971 | dbg("%s\n", __func__); | ||
1972 | |||
1973 | /* register with usb-serial */ | ||
1974 | retval = usb_serial_register(&quatech2_device); | ||
1975 | |||
1976 | if (retval) | ||
1977 | goto failed_usb_serial_register; | ||
1978 | |||
1979 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
1980 | DRIVER_DESC "\n"); | ||
1981 | |||
1982 | /* register with usb */ | ||
1983 | |||
1984 | retval = usb_register(&quausb2_usb_driver); | ||
1985 | if (retval == 0) | ||
1986 | return 0; | ||
1987 | |||
1988 | /* if we're here, usb_register() failed */ | ||
1989 | usb_serial_deregister(&quatech2_device); | ||
1990 | failed_usb_serial_register: | ||
1991 | return retval; | ||
1992 | } | ||
1993 | |||
1994 | static void __exit quausb2_usb_exit(void) | ||
1995 | { | ||
1996 | usb_deregister(&quausb2_usb_driver); | ||
1997 | usb_serial_deregister(&quatech2_device); | ||
1998 | } | ||
1999 | 1968 | ||
2000 | module_init(quausb2_usb_init); | 1969 | module_usb_serial_driver(quausb2_usb_driver, serial_drivers); |
2001 | module_exit(quausb2_usb_exit); | ||
2002 | 1970 | ||
2003 | MODULE_AUTHOR(DRIVER_AUTHOR); | 1971 | MODULE_AUTHOR(DRIVER_AUTHOR); |
2004 | MODULE_DESCRIPTION(DRIVER_DESC); | 1972 | MODULE_DESCRIPTION(DRIVER_DESC); |
diff --git a/drivers/staging/serqt_usb2/serqt_usb2.c b/drivers/staging/serqt_usb2/serqt_usb2.c index 1c5780f1571b..ae1d815e2a53 100644 --- a/drivers/staging/serqt_usb2/serqt_usb2.c +++ b/drivers/staging/serqt_usb2/serqt_usb2.c | |||
@@ -200,7 +200,6 @@ static struct usb_driver serqt_usb_driver = { | |||
200 | .probe = usb_serial_probe, | 200 | .probe = usb_serial_probe, |
201 | .disconnect = usb_serial_disconnect, | 201 | .disconnect = usb_serial_disconnect, |
202 | .id_table = serqt_id_table, | 202 | .id_table = serqt_id_table, |
203 | .no_dynamic_id = 1, | ||
204 | }; | 203 | }; |
205 | 204 | ||
206 | static int port_paranoia_check(struct usb_serial_port *port, | 205 | static int port_paranoia_check(struct usb_serial_port *port, |
@@ -1590,7 +1589,6 @@ static struct usb_serial_driver quatech_device = { | |||
1590 | .name = "serqt", | 1589 | .name = "serqt", |
1591 | }, | 1590 | }, |
1592 | .description = DRIVER_DESC, | 1591 | .description = DRIVER_DESC, |
1593 | .usb_driver = &serqt_usb_driver, | ||
1594 | .id_table = serqt_id_table, | 1592 | .id_table = serqt_id_table, |
1595 | .num_ports = 8, | 1593 | .num_ports = 8, |
1596 | .open = qt_open, | 1594 | .open = qt_open, |
@@ -1610,41 +1608,11 @@ static struct usb_serial_driver quatech_device = { | |||
1610 | .release = qt_release, | 1608 | .release = qt_release, |
1611 | }; | 1609 | }; |
1612 | 1610 | ||
1613 | static int __init serqt_usb_init(void) | 1611 | static struct usb_serial_driver * const serial_drivers[] = { |
1614 | { | 1612 | &quatech_device, NULL |
1615 | int retval; | 1613 | }; |
1616 | |||
1617 | dbg("%s\n", __func__); | ||
1618 | |||
1619 | /* register with usb-serial */ | ||
1620 | retval = usb_serial_register(&quatech_device); | ||
1621 | |||
1622 | if (retval) | ||
1623 | goto failed_usb_serial_register; | ||
1624 | |||
1625 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
1626 | DRIVER_DESC "\n"); | ||
1627 | |||
1628 | /* register with usb */ | ||
1629 | |||
1630 | retval = usb_register(&serqt_usb_driver); | ||
1631 | if (retval == 0) | ||
1632 | return 0; | ||
1633 | |||
1634 | /* if we're here, usb_register() failed */ | ||
1635 | usb_serial_deregister(&quatech_device); | ||
1636 | failed_usb_serial_register: | ||
1637 | return retval; | ||
1638 | } | ||
1639 | |||
1640 | static void __exit serqt_usb_exit(void) | ||
1641 | { | ||
1642 | usb_deregister(&serqt_usb_driver); | ||
1643 | usb_serial_deregister(&quatech_device); | ||
1644 | } | ||
1645 | 1614 | ||
1646 | module_init(serqt_usb_init); | 1615 | module_usb_serial_driver(serqt_usb_driver, serial_drivers); |
1647 | module_exit(serqt_usb_exit); | ||
1648 | 1616 | ||
1649 | MODULE_AUTHOR(DRIVER_AUTHOR); | 1617 | MODULE_AUTHOR(DRIVER_AUTHOR); |
1650 | MODULE_DESCRIPTION(DRIVER_DESC); | 1618 | MODULE_DESCRIPTION(DRIVER_DESC); |
diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig index 75823a1abeb6..e4405e088589 100644 --- a/drivers/usb/Kconfig +++ b/drivers/usb/Kconfig | |||
@@ -10,27 +10,6 @@ menuconfig USB_SUPPORT | |||
10 | This option adds core support for Universal Serial Bus (USB). | 10 | This option adds core support for Universal Serial Bus (USB). |
11 | You will also need drivers from the following menu to make use of it. | 11 | You will also need drivers from the following menu to make use of it. |
12 | 12 | ||
13 | if USB_SUPPORT | ||
14 | |||
15 | config USB_COMMON | ||
16 | tristate | ||
17 | default y | ||
18 | depends on USB || USB_GADGET | ||
19 | |||
20 | # Host-side USB depends on having a host controller | ||
21 | # NOTE: dummy_hcd is always an option, but it's ignored here ... | ||
22 | # NOTE: SL-811 option should be board-specific ... | ||
23 | config USB_ARCH_HAS_HCD | ||
24 | boolean | ||
25 | default y if USB_ARCH_HAS_OHCI | ||
26 | default y if USB_ARCH_HAS_EHCI | ||
27 | default y if USB_ARCH_HAS_XHCI | ||
28 | default y if PCMCIA && !M32R # sl811_cs | ||
29 | default y if ARM # SL-811 | ||
30 | default y if BLACKFIN # SL-811 | ||
31 | default y if SUPERH # r8a66597-hcd | ||
32 | default PCI | ||
33 | |||
34 | # many non-PCI SOC chips embed OHCI | 13 | # many non-PCI SOC chips embed OHCI |
35 | config USB_ARCH_HAS_OHCI | 14 | config USB_ARCH_HAS_OHCI |
36 | boolean | 15 | boolean |
@@ -76,6 +55,7 @@ config USB_ARCH_HAS_EHCI | |||
76 | default y if MICROBLAZE | 55 | default y if MICROBLAZE |
77 | default y if SPARC_LEON | 56 | default y if SPARC_LEON |
78 | default y if ARCH_MMP | 57 | default y if ARCH_MMP |
58 | default y if MACH_LOONGSON1 | ||
79 | default PCI | 59 | default PCI |
80 | 60 | ||
81 | # some non-PCI HCDs implement xHCI | 61 | # some non-PCI HCDs implement xHCI |
@@ -83,6 +63,27 @@ config USB_ARCH_HAS_XHCI | |||
83 | boolean | 63 | boolean |
84 | default PCI | 64 | default PCI |
85 | 65 | ||
66 | if USB_SUPPORT | ||
67 | |||
68 | config USB_COMMON | ||
69 | tristate | ||
70 | default y | ||
71 | depends on USB || USB_GADGET | ||
72 | |||
73 | # Host-side USB depends on having a host controller | ||
74 | # NOTE: dummy_hcd is always an option, but it's ignored here ... | ||
75 | # NOTE: SL-811 option should be board-specific ... | ||
76 | config USB_ARCH_HAS_HCD | ||
77 | boolean | ||
78 | default y if USB_ARCH_HAS_OHCI | ||
79 | default y if USB_ARCH_HAS_EHCI | ||
80 | default y if USB_ARCH_HAS_XHCI | ||
81 | default y if PCMCIA && !M32R # sl811_cs | ||
82 | default y if ARM # SL-811 | ||
83 | default y if BLACKFIN # SL-811 | ||
84 | default y if SUPERH # r8a66597-hcd | ||
85 | default PCI | ||
86 | |||
86 | # ARM SA1111 chips have a non-PCI based "OHCI-compatible" USB host interface. | 87 | # ARM SA1111 chips have a non-PCI based "OHCI-compatible" USB host interface. |
87 | config USB | 88 | config USB |
88 | tristate "Support for Host-side USB" | 89 | tristate "Support for Host-side USB" |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 6bb8472155c6..b32ccb461019 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #include <linux/serial.h> | 39 | #include <linux/serial.h> |
40 | #include <linux/tty_driver.h> | 40 | #include <linux/tty_driver.h> |
41 | #include <linux/tty_flip.h> | 41 | #include <linux/tty_flip.h> |
42 | #include <linux/serial.h> | ||
42 | #include <linux/module.h> | 43 | #include <linux/module.h> |
43 | #include <linux/mutex.h> | 44 | #include <linux/mutex.h> |
44 | #include <linux/uaccess.h> | 45 | #include <linux/uaccess.h> |
@@ -768,10 +769,37 @@ static int acm_tty_tiocmset(struct tty_struct *tty, | |||
768 | return acm_set_control(acm, acm->ctrlout = newctrl); | 769 | return acm_set_control(acm, acm->ctrlout = newctrl); |
769 | } | 770 | } |
770 | 771 | ||
772 | static int get_serial_info(struct acm *acm, struct serial_struct __user *info) | ||
773 | { | ||
774 | struct serial_struct tmp; | ||
775 | |||
776 | if (!info) | ||
777 | return -EINVAL; | ||
778 | |||
779 | memset(&tmp, 0, sizeof(tmp)); | ||
780 | tmp.flags = ASYNC_LOW_LATENCY; | ||
781 | tmp.xmit_fifo_size = acm->writesize; | ||
782 | tmp.baud_base = le32_to_cpu(acm->line.dwDTERate); | ||
783 | |||
784 | if (copy_to_user(info, &tmp, sizeof(tmp))) | ||
785 | return -EFAULT; | ||
786 | else | ||
787 | return 0; | ||
788 | } | ||
789 | |||
771 | static int acm_tty_ioctl(struct tty_struct *tty, | 790 | static int acm_tty_ioctl(struct tty_struct *tty, |
772 | unsigned int cmd, unsigned long arg) | 791 | unsigned int cmd, unsigned long arg) |
773 | { | 792 | { |
774 | return -ENOIOCTLCMD; | 793 | struct acm *acm = tty->driver_data; |
794 | int rv = -ENOIOCTLCMD; | ||
795 | |||
796 | switch (cmd) { | ||
797 | case TIOCGSERIAL: /* gets serial port data */ | ||
798 | rv = get_serial_info(acm, (struct serial_struct __user *) arg); | ||
799 | break; | ||
800 | } | ||
801 | |||
802 | return rv; | ||
775 | } | 803 | } |
776 | 804 | ||
777 | static const __u32 acm_tty_speed[] = { | 805 | static const __u32 acm_tty_speed[] = { |
diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index d2b3cffca3f7..c6f6560d436c 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/usb/cdc.h> | 23 | #include <linux/usb/cdc.h> |
24 | #include <asm/byteorder.h> | 24 | #include <asm/byteorder.h> |
25 | #include <asm/unaligned.h> | 25 | #include <asm/unaligned.h> |
26 | #include <linux/usb/cdc-wdm.h> | ||
26 | 27 | ||
27 | /* | 28 | /* |
28 | * Version Information | 29 | * Version Information |
@@ -31,6 +32,8 @@ | |||
31 | #define DRIVER_AUTHOR "Oliver Neukum" | 32 | #define DRIVER_AUTHOR "Oliver Neukum" |
32 | #define DRIVER_DESC "USB Abstract Control Model driver for USB WCM Device Management" | 33 | #define DRIVER_DESC "USB Abstract Control Model driver for USB WCM Device Management" |
33 | 34 | ||
35 | #define HUAWEI_VENDOR_ID 0x12D1 | ||
36 | |||
34 | static const struct usb_device_id wdm_ids[] = { | 37 | static const struct usb_device_id wdm_ids[] = { |
35 | { | 38 | { |
36 | .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS | | 39 | .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS | |
@@ -38,6 +41,20 @@ static const struct usb_device_id wdm_ids[] = { | |||
38 | .bInterfaceClass = USB_CLASS_COMM, | 41 | .bInterfaceClass = USB_CLASS_COMM, |
39 | .bInterfaceSubClass = USB_CDC_SUBCLASS_DMM | 42 | .bInterfaceSubClass = USB_CDC_SUBCLASS_DMM |
40 | }, | 43 | }, |
44 | { | ||
45 | /* | ||
46 | * Huawei E392, E398 and possibly other Qualcomm based modems | ||
47 | * embed the Qualcomm QMI protocol inside CDC on CDC ECM like | ||
48 | * control interfaces. Userspace access to this is required | ||
49 | * to configure the accompanying data interface | ||
50 | */ | ||
51 | .match_flags = USB_DEVICE_ID_MATCH_VENDOR | | ||
52 | USB_DEVICE_ID_MATCH_INT_INFO, | ||
53 | .idVendor = HUAWEI_VENDOR_ID, | ||
54 | .bInterfaceClass = USB_CLASS_VENDOR_SPEC, | ||
55 | .bInterfaceSubClass = 1, | ||
56 | .bInterfaceProtocol = 9, /* NOTE: CDC ECM control interface! */ | ||
57 | }, | ||
41 | { } | 58 | { } |
42 | }; | 59 | }; |
43 | 60 | ||
@@ -54,6 +71,7 @@ MODULE_DEVICE_TABLE (usb, wdm_ids); | |||
54 | #define WDM_POLL_RUNNING 6 | 71 | #define WDM_POLL_RUNNING 6 |
55 | #define WDM_RESPONDING 7 | 72 | #define WDM_RESPONDING 7 |
56 | #define WDM_SUSPENDING 8 | 73 | #define WDM_SUSPENDING 8 |
74 | #define WDM_RESETTING 9 | ||
57 | 75 | ||
58 | #define WDM_MAX 16 | 76 | #define WDM_MAX 16 |
59 | 77 | ||
@@ -61,6 +79,8 @@ MODULE_DEVICE_TABLE (usb, wdm_ids); | |||
61 | #define WDM_DEFAULT_BUFSIZE 256 | 79 | #define WDM_DEFAULT_BUFSIZE 256 |
62 | 80 | ||
63 | static DEFINE_MUTEX(wdm_mutex); | 81 | static DEFINE_MUTEX(wdm_mutex); |
82 | static DEFINE_SPINLOCK(wdm_device_list_lock); | ||
83 | static LIST_HEAD(wdm_device_list); | ||
64 | 84 | ||
65 | /* --- method tables --- */ | 85 | /* --- method tables --- */ |
66 | 86 | ||
@@ -82,7 +102,6 @@ struct wdm_device { | |||
82 | u16 bufsize; | 102 | u16 bufsize; |
83 | u16 wMaxCommand; | 103 | u16 wMaxCommand; |
84 | u16 wMaxPacketSize; | 104 | u16 wMaxPacketSize; |
85 | u16 bMaxPacketSize0; | ||
86 | __le16 inum; | 105 | __le16 inum; |
87 | int reslength; | 106 | int reslength; |
88 | int length; | 107 | int length; |
@@ -96,10 +115,40 @@ struct wdm_device { | |||
96 | struct work_struct rxwork; | 115 | struct work_struct rxwork; |
97 | int werr; | 116 | int werr; |
98 | int rerr; | 117 | int rerr; |
118 | |||
119 | struct list_head device_list; | ||
120 | int (*manage_power)(struct usb_interface *, int); | ||
99 | }; | 121 | }; |
100 | 122 | ||
101 | static struct usb_driver wdm_driver; | 123 | static struct usb_driver wdm_driver; |
102 | 124 | ||
125 | /* return intfdata if we own the interface, else look up intf in the list */ | ||
126 | static struct wdm_device *wdm_find_device(struct usb_interface *intf) | ||
127 | { | ||
128 | struct wdm_device *desc = NULL; | ||
129 | |||
130 | spin_lock(&wdm_device_list_lock); | ||
131 | list_for_each_entry(desc, &wdm_device_list, device_list) | ||
132 | if (desc->intf == intf) | ||
133 | break; | ||
134 | spin_unlock(&wdm_device_list_lock); | ||
135 | |||
136 | return desc; | ||
137 | } | ||
138 | |||
139 | static struct wdm_device *wdm_find_device_by_minor(int minor) | ||
140 | { | ||
141 | struct wdm_device *desc = NULL; | ||
142 | |||
143 | spin_lock(&wdm_device_list_lock); | ||
144 | list_for_each_entry(desc, &wdm_device_list, device_list) | ||
145 | if (desc->intf->minor == minor) | ||
146 | break; | ||
147 | spin_unlock(&wdm_device_list_lock); | ||
148 | |||
149 | return desc; | ||
150 | } | ||
151 | |||
103 | /* --- callbacks --- */ | 152 | /* --- callbacks --- */ |
104 | static void wdm_out_callback(struct urb *urb) | 153 | static void wdm_out_callback(struct urb *urb) |
105 | { | 154 | { |
@@ -162,11 +211,9 @@ static void wdm_int_callback(struct urb *urb) | |||
162 | int rv = 0; | 211 | int rv = 0; |
163 | int status = urb->status; | 212 | int status = urb->status; |
164 | struct wdm_device *desc; | 213 | struct wdm_device *desc; |
165 | struct usb_ctrlrequest *req; | ||
166 | struct usb_cdc_notification *dr; | 214 | struct usb_cdc_notification *dr; |
167 | 215 | ||
168 | desc = urb->context; | 216 | desc = urb->context; |
169 | req = desc->irq; | ||
170 | dr = (struct usb_cdc_notification *)desc->sbuf; | 217 | dr = (struct usb_cdc_notification *)desc->sbuf; |
171 | 218 | ||
172 | if (status) { | 219 | if (status) { |
@@ -213,24 +260,6 @@ static void wdm_int_callback(struct urb *urb) | |||
213 | goto exit; | 260 | goto exit; |
214 | } | 261 | } |
215 | 262 | ||
216 | req->bRequestType = (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE); | ||
217 | req->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE; | ||
218 | req->wValue = 0; | ||
219 | req->wIndex = desc->inum; | ||
220 | req->wLength = cpu_to_le16(desc->wMaxCommand); | ||
221 | |||
222 | usb_fill_control_urb( | ||
223 | desc->response, | ||
224 | interface_to_usbdev(desc->intf), | ||
225 | /* using common endpoint 0 */ | ||
226 | usb_rcvctrlpipe(interface_to_usbdev(desc->intf), 0), | ||
227 | (unsigned char *)req, | ||
228 | desc->inbuf, | ||
229 | desc->wMaxCommand, | ||
230 | wdm_in_callback, | ||
231 | desc | ||
232 | ); | ||
233 | desc->response->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | ||
234 | spin_lock(&desc->iuspin); | 263 | spin_lock(&desc->iuspin); |
235 | clear_bit(WDM_READ, &desc->flags); | 264 | clear_bit(WDM_READ, &desc->flags); |
236 | set_bit(WDM_RESPONDING, &desc->flags); | 265 | set_bit(WDM_RESPONDING, &desc->flags); |
@@ -279,14 +308,11 @@ static void free_urbs(struct wdm_device *desc) | |||
279 | 308 | ||
280 | static void cleanup(struct wdm_device *desc) | 309 | static void cleanup(struct wdm_device *desc) |
281 | { | 310 | { |
282 | usb_free_coherent(interface_to_usbdev(desc->intf), | 311 | spin_lock(&wdm_device_list_lock); |
283 | desc->wMaxPacketSize, | 312 | list_del(&desc->device_list); |
284 | desc->sbuf, | 313 | spin_unlock(&wdm_device_list_lock); |
285 | desc->validity->transfer_dma); | 314 | kfree(desc->sbuf); |
286 | usb_free_coherent(interface_to_usbdev(desc->intf), | 315 | kfree(desc->inbuf); |
287 | desc->bMaxPacketSize0, | ||
288 | desc->inbuf, | ||
289 | desc->response->transfer_dma); | ||
290 | kfree(desc->orq); | 316 | kfree(desc->orq); |
291 | kfree(desc->irq); | 317 | kfree(desc->irq); |
292 | kfree(desc->ubuf); | 318 | kfree(desc->ubuf); |
@@ -351,6 +377,10 @@ static ssize_t wdm_write | |||
351 | else | 377 | else |
352 | if (test_bit(WDM_IN_USE, &desc->flags)) | 378 | if (test_bit(WDM_IN_USE, &desc->flags)) |
353 | r = -EAGAIN; | 379 | r = -EAGAIN; |
380 | |||
381 | if (test_bit(WDM_RESETTING, &desc->flags)) | ||
382 | r = -EIO; | ||
383 | |||
354 | if (r < 0) { | 384 | if (r < 0) { |
355 | kfree(buf); | 385 | kfree(buf); |
356 | goto out; | 386 | goto out; |
@@ -397,7 +427,7 @@ outnl: | |||
397 | static ssize_t wdm_read | 427 | static ssize_t wdm_read |
398 | (struct file *file, char __user *buffer, size_t count, loff_t *ppos) | 428 | (struct file *file, char __user *buffer, size_t count, loff_t *ppos) |
399 | { | 429 | { |
400 | int rv, cntr = 0; | 430 | int rv, cntr; |
401 | int i = 0; | 431 | int i = 0; |
402 | struct wdm_device *desc = file->private_data; | 432 | struct wdm_device *desc = file->private_data; |
403 | 433 | ||
@@ -406,7 +436,8 @@ static ssize_t wdm_read | |||
406 | if (rv < 0) | 436 | if (rv < 0) |
407 | return -ERESTARTSYS; | 437 | return -ERESTARTSYS; |
408 | 438 | ||
409 | if (desc->length == 0) { | 439 | cntr = ACCESS_ONCE(desc->length); |
440 | if (cntr == 0) { | ||
410 | desc->read = 0; | 441 | desc->read = 0; |
411 | retry: | 442 | retry: |
412 | if (test_bit(WDM_DISCONNECTING, &desc->flags)) { | 443 | if (test_bit(WDM_DISCONNECTING, &desc->flags)) { |
@@ -430,6 +461,10 @@ retry: | |||
430 | rv = -ENODEV; | 461 | rv = -ENODEV; |
431 | goto err; | 462 | goto err; |
432 | } | 463 | } |
464 | if (test_bit(WDM_RESETTING, &desc->flags)) { | ||
465 | rv = -EIO; | ||
466 | goto err; | ||
467 | } | ||
433 | usb_mark_last_busy(interface_to_usbdev(desc->intf)); | 468 | usb_mark_last_busy(interface_to_usbdev(desc->intf)); |
434 | if (rv < 0) { | 469 | if (rv < 0) { |
435 | rv = -ERESTARTSYS; | 470 | rv = -ERESTARTSYS; |
@@ -456,26 +491,30 @@ retry: | |||
456 | spin_unlock_irq(&desc->iuspin); | 491 | spin_unlock_irq(&desc->iuspin); |
457 | goto retry; | 492 | goto retry; |
458 | } | 493 | } |
459 | clear_bit(WDM_READ, &desc->flags); | 494 | cntr = desc->length; |
460 | spin_unlock_irq(&desc->iuspin); | 495 | spin_unlock_irq(&desc->iuspin); |
461 | } | 496 | } |
462 | 497 | ||
463 | cntr = count > desc->length ? desc->length : count; | 498 | if (cntr > count) |
499 | cntr = count; | ||
464 | rv = copy_to_user(buffer, desc->ubuf, cntr); | 500 | rv = copy_to_user(buffer, desc->ubuf, cntr); |
465 | if (rv > 0) { | 501 | if (rv > 0) { |
466 | rv = -EFAULT; | 502 | rv = -EFAULT; |
467 | goto err; | 503 | goto err; |
468 | } | 504 | } |
469 | 505 | ||
506 | spin_lock_irq(&desc->iuspin); | ||
507 | |||
470 | for (i = 0; i < desc->length - cntr; i++) | 508 | for (i = 0; i < desc->length - cntr; i++) |
471 | desc->ubuf[i] = desc->ubuf[i + cntr]; | 509 | desc->ubuf[i] = desc->ubuf[i + cntr]; |
472 | 510 | ||
473 | spin_lock_irq(&desc->iuspin); | ||
474 | desc->length -= cntr; | 511 | desc->length -= cntr; |
475 | spin_unlock_irq(&desc->iuspin); | ||
476 | /* in case we had outstanding data */ | 512 | /* in case we had outstanding data */ |
477 | if (!desc->length) | 513 | if (!desc->length) |
478 | clear_bit(WDM_READ, &desc->flags); | 514 | clear_bit(WDM_READ, &desc->flags); |
515 | |||
516 | spin_unlock_irq(&desc->iuspin); | ||
517 | |||
479 | rv = cntr; | 518 | rv = cntr; |
480 | 519 | ||
481 | err: | 520 | err: |
@@ -529,11 +568,11 @@ static int wdm_open(struct inode *inode, struct file *file) | |||
529 | struct wdm_device *desc; | 568 | struct wdm_device *desc; |
530 | 569 | ||
531 | mutex_lock(&wdm_mutex); | 570 | mutex_lock(&wdm_mutex); |
532 | intf = usb_find_interface(&wdm_driver, minor); | 571 | desc = wdm_find_device_by_minor(minor); |
533 | if (!intf) | 572 | if (!desc) |
534 | goto out; | 573 | goto out; |
535 | 574 | ||
536 | desc = usb_get_intfdata(intf); | 575 | intf = desc->intf; |
537 | if (test_bit(WDM_DISCONNECTING, &desc->flags)) | 576 | if (test_bit(WDM_DISCONNECTING, &desc->flags)) |
538 | goto out; | 577 | goto out; |
539 | file->private_data = desc; | 578 | file->private_data = desc; |
@@ -543,7 +582,6 @@ static int wdm_open(struct inode *inode, struct file *file) | |||
543 | dev_err(&desc->intf->dev, "Error autopm - %d\n", rv); | 582 | dev_err(&desc->intf->dev, "Error autopm - %d\n", rv); |
544 | goto out; | 583 | goto out; |
545 | } | 584 | } |
546 | intf->needs_remote_wakeup = 1; | ||
547 | 585 | ||
548 | /* using write lock to protect desc->count */ | 586 | /* using write lock to protect desc->count */ |
549 | mutex_lock(&desc->wlock); | 587 | mutex_lock(&desc->wlock); |
@@ -560,6 +598,8 @@ static int wdm_open(struct inode *inode, struct file *file) | |||
560 | rv = 0; | 598 | rv = 0; |
561 | } | 599 | } |
562 | mutex_unlock(&desc->wlock); | 600 | mutex_unlock(&desc->wlock); |
601 | if (desc->count == 1) | ||
602 | desc->manage_power(intf, 1); | ||
563 | usb_autopm_put_interface(desc->intf); | 603 | usb_autopm_put_interface(desc->intf); |
564 | out: | 604 | out: |
565 | mutex_unlock(&wdm_mutex); | 605 | mutex_unlock(&wdm_mutex); |
@@ -581,7 +621,7 @@ static int wdm_release(struct inode *inode, struct file *file) | |||
581 | dev_dbg(&desc->intf->dev, "wdm_release: cleanup"); | 621 | dev_dbg(&desc->intf->dev, "wdm_release: cleanup"); |
582 | kill_urbs(desc); | 622 | kill_urbs(desc); |
583 | if (!test_bit(WDM_DISCONNECTING, &desc->flags)) | 623 | if (!test_bit(WDM_DISCONNECTING, &desc->flags)) |
584 | desc->intf->needs_remote_wakeup = 0; | 624 | desc->manage_power(desc->intf, 0); |
585 | } | 625 | } |
586 | mutex_unlock(&wdm_mutex); | 626 | mutex_unlock(&wdm_mutex); |
587 | return 0; | 627 | return 0; |
@@ -628,71 +668,31 @@ static void wdm_rxwork(struct work_struct *work) | |||
628 | 668 | ||
629 | /* --- hotplug --- */ | 669 | /* --- hotplug --- */ |
630 | 670 | ||
631 | static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id) | 671 | static int wdm_create(struct usb_interface *intf, struct usb_endpoint_descriptor *ep, |
672 | u16 bufsize, int (*manage_power)(struct usb_interface *, int)) | ||
632 | { | 673 | { |
633 | int rv = -EINVAL; | 674 | int rv = -ENOMEM; |
634 | struct usb_device *udev = interface_to_usbdev(intf); | ||
635 | struct wdm_device *desc; | 675 | struct wdm_device *desc; |
636 | struct usb_host_interface *iface; | ||
637 | struct usb_endpoint_descriptor *ep; | ||
638 | struct usb_cdc_dmm_desc *dmhd; | ||
639 | u8 *buffer = intf->altsetting->extra; | ||
640 | int buflen = intf->altsetting->extralen; | ||
641 | u16 maxcom = WDM_DEFAULT_BUFSIZE; | ||
642 | |||
643 | if (!buffer) | ||
644 | goto out; | ||
645 | 676 | ||
646 | while (buflen > 2) { | ||
647 | if (buffer [1] != USB_DT_CS_INTERFACE) { | ||
648 | dev_err(&intf->dev, "skipping garbage\n"); | ||
649 | goto next_desc; | ||
650 | } | ||
651 | |||
652 | switch (buffer [2]) { | ||
653 | case USB_CDC_HEADER_TYPE: | ||
654 | break; | ||
655 | case USB_CDC_DMM_TYPE: | ||
656 | dmhd = (struct usb_cdc_dmm_desc *)buffer; | ||
657 | maxcom = le16_to_cpu(dmhd->wMaxCommand); | ||
658 | dev_dbg(&intf->dev, | ||
659 | "Finding maximum buffer length: %d", maxcom); | ||
660 | break; | ||
661 | default: | ||
662 | dev_err(&intf->dev, | ||
663 | "Ignoring extra header, type %d, length %d\n", | ||
664 | buffer[2], buffer[0]); | ||
665 | break; | ||
666 | } | ||
667 | next_desc: | ||
668 | buflen -= buffer[0]; | ||
669 | buffer += buffer[0]; | ||
670 | } | ||
671 | |||
672 | rv = -ENOMEM; | ||
673 | desc = kzalloc(sizeof(struct wdm_device), GFP_KERNEL); | 677 | desc = kzalloc(sizeof(struct wdm_device), GFP_KERNEL); |
674 | if (!desc) | 678 | if (!desc) |
675 | goto out; | 679 | goto out; |
680 | INIT_LIST_HEAD(&desc->device_list); | ||
676 | mutex_init(&desc->rlock); | 681 | mutex_init(&desc->rlock); |
677 | mutex_init(&desc->wlock); | 682 | mutex_init(&desc->wlock); |
678 | spin_lock_init(&desc->iuspin); | 683 | spin_lock_init(&desc->iuspin); |
679 | init_waitqueue_head(&desc->wait); | 684 | init_waitqueue_head(&desc->wait); |
680 | desc->wMaxCommand = maxcom; | 685 | desc->wMaxCommand = bufsize; |
681 | /* this will be expanded and needed in hardware endianness */ | 686 | /* this will be expanded and needed in hardware endianness */ |
682 | desc->inum = cpu_to_le16((u16)intf->cur_altsetting->desc.bInterfaceNumber); | 687 | desc->inum = cpu_to_le16((u16)intf->cur_altsetting->desc.bInterfaceNumber); |
683 | desc->intf = intf; | 688 | desc->intf = intf; |
684 | INIT_WORK(&desc->rxwork, wdm_rxwork); | 689 | INIT_WORK(&desc->rxwork, wdm_rxwork); |
685 | 690 | ||
686 | rv = -EINVAL; | 691 | rv = -EINVAL; |
687 | iface = intf->cur_altsetting; | 692 | if (!usb_endpoint_is_int_in(ep)) |
688 | if (iface->desc.bNumEndpoints != 1) | ||
689 | goto err; | ||
690 | ep = &iface->endpoint[0].desc; | ||
691 | if (!ep || !usb_endpoint_is_int_in(ep)) | ||
692 | goto err; | 693 | goto err; |
693 | 694 | ||
694 | desc->wMaxPacketSize = usb_endpoint_maxp(ep); | 695 | desc->wMaxPacketSize = usb_endpoint_maxp(ep); |
695 | desc->bMaxPacketSize0 = udev->descriptor.bMaxPacketSize0; | ||
696 | 696 | ||
697 | desc->orq = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL); | 697 | desc->orq = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL); |
698 | if (!desc->orq) | 698 | if (!desc->orq) |
@@ -717,19 +717,13 @@ next_desc: | |||
717 | if (!desc->ubuf) | 717 | if (!desc->ubuf) |
718 | goto err; | 718 | goto err; |
719 | 719 | ||
720 | desc->sbuf = usb_alloc_coherent(interface_to_usbdev(intf), | 720 | desc->sbuf = kmalloc(desc->wMaxPacketSize, GFP_KERNEL); |
721 | desc->wMaxPacketSize, | ||
722 | GFP_KERNEL, | ||
723 | &desc->validity->transfer_dma); | ||
724 | if (!desc->sbuf) | 721 | if (!desc->sbuf) |
725 | goto err; | 722 | goto err; |
726 | 723 | ||
727 | desc->inbuf = usb_alloc_coherent(interface_to_usbdev(intf), | 724 | desc->inbuf = kmalloc(desc->wMaxCommand, GFP_KERNEL); |
728 | desc->wMaxCommand, | ||
729 | GFP_KERNEL, | ||
730 | &desc->response->transfer_dma); | ||
731 | if (!desc->inbuf) | 725 | if (!desc->inbuf) |
732 | goto err2; | 726 | goto err; |
733 | 727 | ||
734 | usb_fill_int_urb( | 728 | usb_fill_int_urb( |
735 | desc->validity, | 729 | desc->validity, |
@@ -741,45 +735,149 @@ next_desc: | |||
741 | desc, | 735 | desc, |
742 | ep->bInterval | 736 | ep->bInterval |
743 | ); | 737 | ); |
744 | desc->validity->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | ||
745 | 738 | ||
746 | usb_set_intfdata(intf, desc); | 739 | desc->irq->bRequestType = (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE); |
740 | desc->irq->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE; | ||
741 | desc->irq->wValue = 0; | ||
742 | desc->irq->wIndex = desc->inum; | ||
743 | desc->irq->wLength = cpu_to_le16(desc->wMaxCommand); | ||
744 | |||
745 | usb_fill_control_urb( | ||
746 | desc->response, | ||
747 | interface_to_usbdev(intf), | ||
748 | /* using common endpoint 0 */ | ||
749 | usb_rcvctrlpipe(interface_to_usbdev(desc->intf), 0), | ||
750 | (unsigned char *)desc->irq, | ||
751 | desc->inbuf, | ||
752 | desc->wMaxCommand, | ||
753 | wdm_in_callback, | ||
754 | desc | ||
755 | ); | ||
756 | |||
757 | desc->manage_power = manage_power; | ||
758 | |||
759 | spin_lock(&wdm_device_list_lock); | ||
760 | list_add(&desc->device_list, &wdm_device_list); | ||
761 | spin_unlock(&wdm_device_list_lock); | ||
762 | |||
747 | rv = usb_register_dev(intf, &wdm_class); | 763 | rv = usb_register_dev(intf, &wdm_class); |
748 | if (rv < 0) | 764 | if (rv < 0) |
749 | goto err3; | 765 | goto err; |
750 | else | 766 | else |
751 | dev_info(&intf->dev, "cdc-wdm%d: USB WDM device\n", | 767 | dev_info(&intf->dev, "%s: USB WDM device\n", dev_name(intf->usb_dev)); |
752 | intf->minor - WDM_MINOR_BASE); | ||
753 | out: | 768 | out: |
754 | return rv; | 769 | return rv; |
755 | err3: | ||
756 | usb_set_intfdata(intf, NULL); | ||
757 | usb_free_coherent(interface_to_usbdev(desc->intf), | ||
758 | desc->bMaxPacketSize0, | ||
759 | desc->inbuf, | ||
760 | desc->response->transfer_dma); | ||
761 | err2: | ||
762 | usb_free_coherent(interface_to_usbdev(desc->intf), | ||
763 | desc->wMaxPacketSize, | ||
764 | desc->sbuf, | ||
765 | desc->validity->transfer_dma); | ||
766 | err: | 770 | err: |
767 | free_urbs(desc); | 771 | cleanup(desc); |
768 | kfree(desc->ubuf); | 772 | return rv; |
769 | kfree(desc->orq); | 773 | } |
770 | kfree(desc->irq); | 774 | |
771 | kfree(desc); | 775 | static int wdm_manage_power(struct usb_interface *intf, int on) |
776 | { | ||
777 | /* need autopm_get/put here to ensure the usbcore sees the new value */ | ||
778 | int rv = usb_autopm_get_interface(intf); | ||
779 | if (rv < 0) | ||
780 | goto err; | ||
781 | |||
782 | intf->needs_remote_wakeup = on; | ||
783 | usb_autopm_put_interface(intf); | ||
784 | err: | ||
785 | return rv; | ||
786 | } | ||
787 | |||
788 | static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id) | ||
789 | { | ||
790 | int rv = -EINVAL; | ||
791 | struct usb_host_interface *iface; | ||
792 | struct usb_endpoint_descriptor *ep; | ||
793 | struct usb_cdc_dmm_desc *dmhd; | ||
794 | u8 *buffer = intf->altsetting->extra; | ||
795 | int buflen = intf->altsetting->extralen; | ||
796 | u16 maxcom = WDM_DEFAULT_BUFSIZE; | ||
797 | |||
798 | if (!buffer) | ||
799 | goto err; | ||
800 | while (buflen > 2) { | ||
801 | if (buffer[1] != USB_DT_CS_INTERFACE) { | ||
802 | dev_err(&intf->dev, "skipping garbage\n"); | ||
803 | goto next_desc; | ||
804 | } | ||
805 | |||
806 | switch (buffer[2]) { | ||
807 | case USB_CDC_HEADER_TYPE: | ||
808 | break; | ||
809 | case USB_CDC_DMM_TYPE: | ||
810 | dmhd = (struct usb_cdc_dmm_desc *)buffer; | ||
811 | maxcom = le16_to_cpu(dmhd->wMaxCommand); | ||
812 | dev_dbg(&intf->dev, | ||
813 | "Finding maximum buffer length: %d", maxcom); | ||
814 | break; | ||
815 | default: | ||
816 | dev_err(&intf->dev, | ||
817 | "Ignoring extra header, type %d, length %d\n", | ||
818 | buffer[2], buffer[0]); | ||
819 | break; | ||
820 | } | ||
821 | next_desc: | ||
822 | buflen -= buffer[0]; | ||
823 | buffer += buffer[0]; | ||
824 | } | ||
825 | |||
826 | iface = intf->cur_altsetting; | ||
827 | if (iface->desc.bNumEndpoints != 1) | ||
828 | goto err; | ||
829 | ep = &iface->endpoint[0].desc; | ||
830 | |||
831 | rv = wdm_create(intf, ep, maxcom, &wdm_manage_power); | ||
832 | |||
833 | err: | ||
772 | return rv; | 834 | return rv; |
773 | } | 835 | } |
774 | 836 | ||
837 | /** | ||
838 | * usb_cdc_wdm_register - register a WDM subdriver | ||
839 | * @intf: usb interface the subdriver will associate with | ||
840 | * @ep: interrupt endpoint to monitor for notifications | ||
841 | * @bufsize: maximum message size to support for read/write | ||
842 | * | ||
843 | * Create WDM usb class character device and associate it with intf | ||
844 | * without binding, allowing another driver to manage the interface. | ||
845 | * | ||
846 | * The subdriver will manage the given interrupt endpoint exclusively | ||
847 | * and will issue control requests referring to the given intf. It | ||
848 | * will otherwise avoid interferring, and in particular not do | ||
849 | * usb_set_intfdata/usb_get_intfdata on intf. | ||
850 | * | ||
851 | * The return value is a pointer to the subdriver's struct usb_driver. | ||
852 | * The registering driver is responsible for calling this subdriver's | ||
853 | * disconnect, suspend, resume, pre_reset and post_reset methods from | ||
854 | * its own. | ||
855 | */ | ||
856 | struct usb_driver *usb_cdc_wdm_register(struct usb_interface *intf, | ||
857 | struct usb_endpoint_descriptor *ep, | ||
858 | int bufsize, | ||
859 | int (*manage_power)(struct usb_interface *, int)) | ||
860 | { | ||
861 | int rv = -EINVAL; | ||
862 | |||
863 | rv = wdm_create(intf, ep, bufsize, manage_power); | ||
864 | if (rv < 0) | ||
865 | goto err; | ||
866 | |||
867 | return &wdm_driver; | ||
868 | err: | ||
869 | return ERR_PTR(rv); | ||
870 | } | ||
871 | EXPORT_SYMBOL(usb_cdc_wdm_register); | ||
872 | |||
775 | static void wdm_disconnect(struct usb_interface *intf) | 873 | static void wdm_disconnect(struct usb_interface *intf) |
776 | { | 874 | { |
777 | struct wdm_device *desc; | 875 | struct wdm_device *desc; |
778 | unsigned long flags; | 876 | unsigned long flags; |
779 | 877 | ||
780 | usb_deregister_dev(intf, &wdm_class); | 878 | usb_deregister_dev(intf, &wdm_class); |
879 | desc = wdm_find_device(intf); | ||
781 | mutex_lock(&wdm_mutex); | 880 | mutex_lock(&wdm_mutex); |
782 | desc = usb_get_intfdata(intf); | ||
783 | 881 | ||
784 | /* the spinlock makes sure no new urbs are generated in the callbacks */ | 882 | /* the spinlock makes sure no new urbs are generated in the callbacks */ |
785 | spin_lock_irqsave(&desc->iuspin, flags); | 883 | spin_lock_irqsave(&desc->iuspin, flags); |
@@ -803,7 +901,7 @@ static void wdm_disconnect(struct usb_interface *intf) | |||
803 | #ifdef CONFIG_PM | 901 | #ifdef CONFIG_PM |
804 | static int wdm_suspend(struct usb_interface *intf, pm_message_t message) | 902 | static int wdm_suspend(struct usb_interface *intf, pm_message_t message) |
805 | { | 903 | { |
806 | struct wdm_device *desc = usb_get_intfdata(intf); | 904 | struct wdm_device *desc = wdm_find_device(intf); |
807 | int rv = 0; | 905 | int rv = 0; |
808 | 906 | ||
809 | dev_dbg(&desc->intf->dev, "wdm%d_suspend\n", intf->minor); | 907 | dev_dbg(&desc->intf->dev, "wdm%d_suspend\n", intf->minor); |
@@ -853,7 +951,7 @@ static int recover_from_urb_loss(struct wdm_device *desc) | |||
853 | #ifdef CONFIG_PM | 951 | #ifdef CONFIG_PM |
854 | static int wdm_resume(struct usb_interface *intf) | 952 | static int wdm_resume(struct usb_interface *intf) |
855 | { | 953 | { |
856 | struct wdm_device *desc = usb_get_intfdata(intf); | 954 | struct wdm_device *desc = wdm_find_device(intf); |
857 | int rv; | 955 | int rv; |
858 | 956 | ||
859 | dev_dbg(&desc->intf->dev, "wdm%d_resume\n", intf->minor); | 957 | dev_dbg(&desc->intf->dev, "wdm%d_resume\n", intf->minor); |
@@ -867,11 +965,7 @@ static int wdm_resume(struct usb_interface *intf) | |||
867 | 965 | ||
868 | static int wdm_pre_reset(struct usb_interface *intf) | 966 | static int wdm_pre_reset(struct usb_interface *intf) |
869 | { | 967 | { |
870 | struct wdm_device *desc = usb_get_intfdata(intf); | 968 | struct wdm_device *desc = wdm_find_device(intf); |
871 | |||
872 | mutex_lock(&desc->rlock); | ||
873 | mutex_lock(&desc->wlock); | ||
874 | kill_urbs(desc); | ||
875 | 969 | ||
876 | /* | 970 | /* |
877 | * we notify everybody using poll of | 971 | * we notify everybody using poll of |
@@ -880,17 +974,25 @@ static int wdm_pre_reset(struct usb_interface *intf) | |||
880 | * message from the device is lost | 974 | * message from the device is lost |
881 | */ | 975 | */ |
882 | spin_lock_irq(&desc->iuspin); | 976 | spin_lock_irq(&desc->iuspin); |
977 | set_bit(WDM_RESETTING, &desc->flags); /* inform read/write */ | ||
978 | set_bit(WDM_READ, &desc->flags); /* unblock read */ | ||
979 | clear_bit(WDM_IN_USE, &desc->flags); /* unblock write */ | ||
883 | desc->rerr = -EINTR; | 980 | desc->rerr = -EINTR; |
884 | spin_unlock_irq(&desc->iuspin); | 981 | spin_unlock_irq(&desc->iuspin); |
885 | wake_up_all(&desc->wait); | 982 | wake_up_all(&desc->wait); |
983 | mutex_lock(&desc->rlock); | ||
984 | mutex_lock(&desc->wlock); | ||
985 | kill_urbs(desc); | ||
986 | cancel_work_sync(&desc->rxwork); | ||
886 | return 0; | 987 | return 0; |
887 | } | 988 | } |
888 | 989 | ||
889 | static int wdm_post_reset(struct usb_interface *intf) | 990 | static int wdm_post_reset(struct usb_interface *intf) |
890 | { | 991 | { |
891 | struct wdm_device *desc = usb_get_intfdata(intf); | 992 | struct wdm_device *desc = wdm_find_device(intf); |
892 | int rv; | 993 | int rv; |
893 | 994 | ||
995 | clear_bit(WDM_RESETTING, &desc->flags); | ||
894 | rv = recover_from_urb_loss(desc); | 996 | rv = recover_from_urb_loss(desc); |
895 | mutex_unlock(&desc->wlock); | 997 | mutex_unlock(&desc->wlock); |
896 | mutex_unlock(&desc->rlock); | 998 | mutex_unlock(&desc->rlock); |
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index 4fee024ecc9b..f8e2d6d52e5c 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c | |||
@@ -934,13 +934,8 @@ void usb_rebind_intf(struct usb_interface *intf) | |||
934 | int rc; | 934 | int rc; |
935 | 935 | ||
936 | /* Delayed unbind of an existing driver */ | 936 | /* Delayed unbind of an existing driver */ |
937 | if (intf->dev.driver) { | 937 | if (intf->dev.driver) |
938 | struct usb_driver *driver = | 938 | usb_forced_unbind_intf(intf); |
939 | to_usb_driver(intf->dev.driver); | ||
940 | |||
941 | dev_dbg(&intf->dev, "forced unbind\n"); | ||
942 | usb_driver_release_interface(driver, intf); | ||
943 | } | ||
944 | 939 | ||
945 | /* Try to rebind the interface */ | 940 | /* Try to rebind the interface */ |
946 | if (!intf->dev.power.is_prepared) { | 941 | if (!intf->dev.power.is_prepared) { |
@@ -953,15 +948,13 @@ void usb_rebind_intf(struct usb_interface *intf) | |||
953 | 948 | ||
954 | #ifdef CONFIG_PM | 949 | #ifdef CONFIG_PM |
955 | 950 | ||
956 | #define DO_UNBIND 0 | 951 | /* Unbind drivers for @udev's interfaces that don't support suspend/resume |
957 | #define DO_REBIND 1 | 952 | * There is no check for reset_resume here because it can be determined |
958 | 953 | * only during resume whether reset_resume is needed. | |
959 | /* Unbind drivers for @udev's interfaces that don't support suspend/resume, | ||
960 | * or rebind interfaces that have been unbound, according to @action. | ||
961 | * | 954 | * |
962 | * The caller must hold @udev's device lock. | 955 | * The caller must hold @udev's device lock. |
963 | */ | 956 | */ |
964 | static void do_unbind_rebind(struct usb_device *udev, int action) | 957 | static void unbind_no_pm_drivers_interfaces(struct usb_device *udev) |
965 | { | 958 | { |
966 | struct usb_host_config *config; | 959 | struct usb_host_config *config; |
967 | int i; | 960 | int i; |
@@ -972,23 +965,53 @@ static void do_unbind_rebind(struct usb_device *udev, int action) | |||
972 | if (config) { | 965 | if (config) { |
973 | for (i = 0; i < config->desc.bNumInterfaces; ++i) { | 966 | for (i = 0; i < config->desc.bNumInterfaces; ++i) { |
974 | intf = config->interface[i]; | 967 | intf = config->interface[i]; |
975 | switch (action) { | 968 | |
976 | case DO_UNBIND: | 969 | if (intf->dev.driver) { |
977 | if (intf->dev.driver) { | 970 | drv = to_usb_driver(intf->dev.driver); |
978 | drv = to_usb_driver(intf->dev.driver); | 971 | if (!drv->suspend || !drv->resume) |
979 | if (!drv->suspend || !drv->resume) | 972 | usb_forced_unbind_intf(intf); |
980 | usb_forced_unbind_intf(intf); | ||
981 | } | ||
982 | break; | ||
983 | case DO_REBIND: | ||
984 | if (intf->needs_binding) | ||
985 | usb_rebind_intf(intf); | ||
986 | break; | ||
987 | } | 973 | } |
988 | } | 974 | } |
989 | } | 975 | } |
990 | } | 976 | } |
991 | 977 | ||
978 | /* Unbind drivers for @udev's interfaces that failed to support reset-resume. | ||
979 | * These interfaces have the needs_binding flag set by usb_resume_interface(). | ||
980 | * | ||
981 | * The caller must hold @udev's device lock. | ||
982 | */ | ||
983 | static void unbind_no_reset_resume_drivers_interfaces(struct usb_device *udev) | ||
984 | { | ||
985 | struct usb_host_config *config; | ||
986 | int i; | ||
987 | struct usb_interface *intf; | ||
988 | |||
989 | config = udev->actconfig; | ||
990 | if (config) { | ||
991 | for (i = 0; i < config->desc.bNumInterfaces; ++i) { | ||
992 | intf = config->interface[i]; | ||
993 | if (intf->dev.driver && intf->needs_binding) | ||
994 | usb_forced_unbind_intf(intf); | ||
995 | } | ||
996 | } | ||
997 | } | ||
998 | |||
999 | static void do_rebind_interfaces(struct usb_device *udev) | ||
1000 | { | ||
1001 | struct usb_host_config *config; | ||
1002 | int i; | ||
1003 | struct usb_interface *intf; | ||
1004 | |||
1005 | config = udev->actconfig; | ||
1006 | if (config) { | ||
1007 | for (i = 0; i < config->desc.bNumInterfaces; ++i) { | ||
1008 | intf = config->interface[i]; | ||
1009 | if (intf->needs_binding) | ||
1010 | usb_rebind_intf(intf); | ||
1011 | } | ||
1012 | } | ||
1013 | } | ||
1014 | |||
992 | static int usb_suspend_device(struct usb_device *udev, pm_message_t msg) | 1015 | static int usb_suspend_device(struct usb_device *udev, pm_message_t msg) |
993 | { | 1016 | { |
994 | struct usb_device_driver *udriver; | 1017 | struct usb_device_driver *udriver; |
@@ -1278,35 +1301,48 @@ int usb_suspend(struct device *dev, pm_message_t msg) | |||
1278 | { | 1301 | { |
1279 | struct usb_device *udev = to_usb_device(dev); | 1302 | struct usb_device *udev = to_usb_device(dev); |
1280 | 1303 | ||
1281 | do_unbind_rebind(udev, DO_UNBIND); | 1304 | unbind_no_pm_drivers_interfaces(udev); |
1305 | |||
1306 | /* From now on we are sure all drivers support suspend/resume | ||
1307 | * but not necessarily reset_resume() | ||
1308 | * so we may still need to unbind and rebind upon resume | ||
1309 | */ | ||
1282 | choose_wakeup(udev, msg); | 1310 | choose_wakeup(udev, msg); |
1283 | return usb_suspend_both(udev, msg); | 1311 | return usb_suspend_both(udev, msg); |
1284 | } | 1312 | } |
1285 | 1313 | ||
1286 | /* The device lock is held by the PM core */ | 1314 | /* The device lock is held by the PM core */ |
1315 | int usb_resume_complete(struct device *dev) | ||
1316 | { | ||
1317 | struct usb_device *udev = to_usb_device(dev); | ||
1318 | |||
1319 | /* For PM complete calls, all we do is rebind interfaces | ||
1320 | * whose needs_binding flag is set | ||
1321 | */ | ||
1322 | if (udev->state != USB_STATE_NOTATTACHED) | ||
1323 | do_rebind_interfaces(udev); | ||
1324 | return 0; | ||
1325 | } | ||
1326 | |||
1327 | /* The device lock is held by the PM core */ | ||
1287 | int usb_resume(struct device *dev, pm_message_t msg) | 1328 | int usb_resume(struct device *dev, pm_message_t msg) |
1288 | { | 1329 | { |
1289 | struct usb_device *udev = to_usb_device(dev); | 1330 | struct usb_device *udev = to_usb_device(dev); |
1290 | int status; | 1331 | int status; |
1291 | 1332 | ||
1292 | /* For PM complete calls, all we do is rebind interfaces */ | 1333 | /* For all calls, take the device back to full power and |
1293 | if (msg.event == PM_EVENT_ON) { | ||
1294 | if (udev->state != USB_STATE_NOTATTACHED) | ||
1295 | do_unbind_rebind(udev, DO_REBIND); | ||
1296 | status = 0; | ||
1297 | |||
1298 | /* For all other calls, take the device back to full power and | ||
1299 | * tell the PM core in case it was autosuspended previously. | 1334 | * tell the PM core in case it was autosuspended previously. |
1300 | * Unbind the interfaces that will need rebinding later. | 1335 | * Unbind the interfaces that will need rebinding later, |
1336 | * because they fail to support reset_resume. | ||
1337 | * (This can't be done in usb_resume_interface() | ||
1338 | * above because it doesn't own the right set of locks.) | ||
1301 | */ | 1339 | */ |
1302 | } else { | 1340 | status = usb_resume_both(udev, msg); |
1303 | status = usb_resume_both(udev, msg); | 1341 | if (status == 0) { |
1304 | if (status == 0) { | 1342 | pm_runtime_disable(dev); |
1305 | pm_runtime_disable(dev); | 1343 | pm_runtime_set_active(dev); |
1306 | pm_runtime_set_active(dev); | 1344 | pm_runtime_enable(dev); |
1307 | pm_runtime_enable(dev); | 1345 | unbind_no_reset_resume_drivers_interfaces(udev); |
1308 | do_unbind_rebind(udev, DO_REBIND); | ||
1309 | } | ||
1310 | } | 1346 | } |
1311 | 1347 | ||
1312 | /* Avoid PM error messages for devices disconnected while suspended | 1348 | /* Avoid PM error messages for devices disconnected while suspended |
diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c index 81e2c0d9c17d..622b4a48e732 100644 --- a/drivers/usb/core/hcd-pci.c +++ b/drivers/usb/core/hcd-pci.c | |||
@@ -380,6 +380,7 @@ static int check_root_hub_suspended(struct device *dev) | |||
380 | return 0; | 380 | return 0; |
381 | } | 381 | } |
382 | 382 | ||
383 | #if defined(CONFIG_PM_SLEEP) || defined(CONFIG_PM_RUNTIME) | ||
383 | static int suspend_common(struct device *dev, bool do_wakeup) | 384 | static int suspend_common(struct device *dev, bool do_wakeup) |
384 | { | 385 | { |
385 | struct pci_dev *pci_dev = to_pci_dev(dev); | 386 | struct pci_dev *pci_dev = to_pci_dev(dev); |
@@ -471,6 +472,7 @@ static int resume_common(struct device *dev, int event) | |||
471 | } | 472 | } |
472 | return retval; | 473 | return retval; |
473 | } | 474 | } |
475 | #endif /* SLEEP || RUNTIME */ | ||
474 | 476 | ||
475 | #ifdef CONFIG_PM_SLEEP | 477 | #ifdef CONFIG_PM_SLEEP |
476 | 478 | ||
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index e1282328fc27..9d7fc9a39933 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
@@ -2352,7 +2352,7 @@ static int usb_hcd_request_irqs(struct usb_hcd *hcd, | |||
2352 | "io mem" : "io base", | 2352 | "io mem" : "io base", |
2353 | (unsigned long long)hcd->rsrc_start); | 2353 | (unsigned long long)hcd->rsrc_start); |
2354 | } else { | 2354 | } else { |
2355 | hcd->irq = -1; | 2355 | hcd->irq = 0; |
2356 | if (hcd->rsrc_start) | 2356 | if (hcd->rsrc_start) |
2357 | dev_info(hcd->self.controller, "%s 0x%08llx\n", | 2357 | dev_info(hcd->self.controller, "%s 0x%08llx\n", |
2358 | (hcd->driver->flags & HCD_MEMORY) ? | 2358 | (hcd->driver->flags & HCD_MEMORY) ? |
@@ -2508,7 +2508,7 @@ err_register_root_hub: | |||
2508 | clear_bit(HCD_FLAG_POLL_RH, &hcd->flags); | 2508 | clear_bit(HCD_FLAG_POLL_RH, &hcd->flags); |
2509 | del_timer_sync(&hcd->rh_timer); | 2509 | del_timer_sync(&hcd->rh_timer); |
2510 | err_hcd_driver_start: | 2510 | err_hcd_driver_start: |
2511 | if (usb_hcd_is_primary_hcd(hcd) && hcd->irq >= 0) | 2511 | if (usb_hcd_is_primary_hcd(hcd) && hcd->irq > 0) |
2512 | free_irq(irqnum, hcd); | 2512 | free_irq(irqnum, hcd); |
2513 | err_request_irq: | 2513 | err_request_irq: |
2514 | err_hcd_driver_setup: | 2514 | err_hcd_driver_setup: |
@@ -2573,7 +2573,7 @@ void usb_remove_hcd(struct usb_hcd *hcd) | |||
2573 | del_timer_sync(&hcd->rh_timer); | 2573 | del_timer_sync(&hcd->rh_timer); |
2574 | 2574 | ||
2575 | if (usb_hcd_is_primary_hcd(hcd)) { | 2575 | if (usb_hcd_is_primary_hcd(hcd)) { |
2576 | if (hcd->irq >= 0) | 2576 | if (hcd->irq > 0) |
2577 | free_irq(hcd->irq, hcd); | 2577 | free_irq(hcd->irq, hcd); |
2578 | } | 2578 | } |
2579 | 2579 | ||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 265c2f675d04..28664eb7f555 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -62,6 +62,8 @@ struct usb_hub { | |||
62 | resumed */ | 62 | resumed */ |
63 | unsigned long removed_bits[1]; /* ports with a "removed" | 63 | unsigned long removed_bits[1]; /* ports with a "removed" |
64 | device present */ | 64 | device present */ |
65 | unsigned long wakeup_bits[1]; /* ports that have signaled | ||
66 | remote wakeup */ | ||
65 | #if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */ | 67 | #if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */ |
66 | #error event_bits[] is too short! | 68 | #error event_bits[] is too short! |
67 | #endif | 69 | #endif |
@@ -411,6 +413,29 @@ void usb_kick_khubd(struct usb_device *hdev) | |||
411 | kick_khubd(hub); | 413 | kick_khubd(hub); |
412 | } | 414 | } |
413 | 415 | ||
416 | /* | ||
417 | * Let the USB core know that a USB 3.0 device has sent a Function Wake Device | ||
418 | * Notification, which indicates it had initiated remote wakeup. | ||
419 | * | ||
420 | * USB 3.0 hubs do not report the port link state change from U3 to U0 when the | ||
421 | * device initiates resume, so the USB core will not receive notice of the | ||
422 | * resume through the normal hub interrupt URB. | ||
423 | */ | ||
424 | void usb_wakeup_notification(struct usb_device *hdev, | ||
425 | unsigned int portnum) | ||
426 | { | ||
427 | struct usb_hub *hub; | ||
428 | |||
429 | if (!hdev) | ||
430 | return; | ||
431 | |||
432 | hub = hdev_to_hub(hdev); | ||
433 | if (hub) { | ||
434 | set_bit(portnum, hub->wakeup_bits); | ||
435 | kick_khubd(hub); | ||
436 | } | ||
437 | } | ||
438 | EXPORT_SYMBOL_GPL(usb_wakeup_notification); | ||
414 | 439 | ||
415 | /* completion function, fires on port status changes and various faults */ | 440 | /* completion function, fires on port status changes and various faults */ |
416 | static void hub_irq(struct urb *urb) | 441 | static void hub_irq(struct urb *urb) |
@@ -823,12 +848,6 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) | |||
823 | clear_port_feature(hub->hdev, port1, | 848 | clear_port_feature(hub->hdev, port1, |
824 | USB_PORT_FEAT_C_ENABLE); | 849 | USB_PORT_FEAT_C_ENABLE); |
825 | } | 850 | } |
826 | if (portchange & USB_PORT_STAT_C_LINK_STATE) { | ||
827 | need_debounce_delay = true; | ||
828 | clear_port_feature(hub->hdev, port1, | ||
829 | USB_PORT_FEAT_C_PORT_LINK_STATE); | ||
830 | } | ||
831 | |||
832 | if ((portchange & USB_PORT_STAT_C_BH_RESET) && | 851 | if ((portchange & USB_PORT_STAT_C_BH_RESET) && |
833 | hub_is_superspeed(hub->hdev)) { | 852 | hub_is_superspeed(hub->hdev)) { |
834 | need_debounce_delay = true; | 853 | need_debounce_delay = true; |
@@ -850,12 +869,19 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) | |||
850 | set_bit(port1, hub->change_bits); | 869 | set_bit(port1, hub->change_bits); |
851 | 870 | ||
852 | } else if (portstatus & USB_PORT_STAT_ENABLE) { | 871 | } else if (portstatus & USB_PORT_STAT_ENABLE) { |
872 | bool port_resumed = (portstatus & | ||
873 | USB_PORT_STAT_LINK_STATE) == | ||
874 | USB_SS_PORT_LS_U0; | ||
853 | /* The power session apparently survived the resume. | 875 | /* The power session apparently survived the resume. |
854 | * If there was an overcurrent or suspend change | 876 | * If there was an overcurrent or suspend change |
855 | * (i.e., remote wakeup request), have khubd | 877 | * (i.e., remote wakeup request), have khubd |
856 | * take care of it. | 878 | * take care of it. Look at the port link state |
879 | * for USB 3.0 hubs, since they don't have a suspend | ||
880 | * change bit, and they don't set the port link change | ||
881 | * bit on device-initiated resume. | ||
857 | */ | 882 | */ |
858 | if (portchange) | 883 | if (portchange || (hub_is_superspeed(hub->hdev) && |
884 | port_resumed)) | ||
859 | set_bit(port1, hub->change_bits); | 885 | set_bit(port1, hub->change_bits); |
860 | 886 | ||
861 | } else if (udev->persist_enabled) { | 887 | } else if (udev->persist_enabled) { |
@@ -1021,8 +1047,10 @@ static int hub_configure(struct usb_hub *hub, | |||
1021 | dev_info (hub_dev, "%d port%s detected\n", hdev->maxchild, | 1047 | dev_info (hub_dev, "%d port%s detected\n", hdev->maxchild, |
1022 | (hdev->maxchild == 1) ? "" : "s"); | 1048 | (hdev->maxchild == 1) ? "" : "s"); |
1023 | 1049 | ||
1050 | hdev->children = kzalloc(hdev->maxchild * | ||
1051 | sizeof(struct usb_device *), GFP_KERNEL); | ||
1024 | hub->port_owners = kzalloc(hdev->maxchild * sizeof(void *), GFP_KERNEL); | 1052 | hub->port_owners = kzalloc(hdev->maxchild * sizeof(void *), GFP_KERNEL); |
1025 | if (!hub->port_owners) { | 1053 | if (!hdev->children || !hub->port_owners) { |
1026 | ret = -ENOMEM; | 1054 | ret = -ENOMEM; |
1027 | goto fail; | 1055 | goto fail; |
1028 | } | 1056 | } |
@@ -1253,7 +1281,8 @@ static unsigned highspeed_hubs; | |||
1253 | 1281 | ||
1254 | static void hub_disconnect(struct usb_interface *intf) | 1282 | static void hub_disconnect(struct usb_interface *intf) |
1255 | { | 1283 | { |
1256 | struct usb_hub *hub = usb_get_intfdata (intf); | 1284 | struct usb_hub *hub = usb_get_intfdata(intf); |
1285 | struct usb_device *hdev = interface_to_usbdev(intf); | ||
1257 | 1286 | ||
1258 | /* Take the hub off the event list and don't let it be added again */ | 1287 | /* Take the hub off the event list and don't let it be added again */ |
1259 | spin_lock_irq(&hub_event_lock); | 1288 | spin_lock_irq(&hub_event_lock); |
@@ -1275,6 +1304,7 @@ static void hub_disconnect(struct usb_interface *intf) | |||
1275 | highspeed_hubs--; | 1304 | highspeed_hubs--; |
1276 | 1305 | ||
1277 | usb_free_urb(hub->urb); | 1306 | usb_free_urb(hub->urb); |
1307 | kfree(hdev->children); | ||
1278 | kfree(hub->port_owners); | 1308 | kfree(hub->port_owners); |
1279 | kfree(hub->descriptor); | 1309 | kfree(hub->descriptor); |
1280 | kfree(hub->status); | 1310 | kfree(hub->status); |
@@ -1293,14 +1323,8 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
1293 | desc = intf->cur_altsetting; | 1323 | desc = intf->cur_altsetting; |
1294 | hdev = interface_to_usbdev(intf); | 1324 | hdev = interface_to_usbdev(intf); |
1295 | 1325 | ||
1296 | /* Hubs have proper suspend/resume support. USB 3.0 device suspend is | 1326 | /* Hubs have proper suspend/resume support. */ |
1297 | * different from USB 2.0/1.1 device suspend, and unfortunately we | 1327 | usb_enable_autosuspend(hdev); |
1298 | * don't support it yet. So leave autosuspend disabled for USB 3.0 | ||
1299 | * external hubs for now. Enable autosuspend for USB 3.0 roothubs, | ||
1300 | * since that isn't a "real" hub. | ||
1301 | */ | ||
1302 | if (!hub_is_superspeed(hdev) || !hdev->parent) | ||
1303 | usb_enable_autosuspend(hdev); | ||
1304 | 1328 | ||
1305 | if (hdev->level == MAX_TOPO_LEVEL) { | 1329 | if (hdev->level == MAX_TOPO_LEVEL) { |
1306 | dev_err(&intf->dev, | 1330 | dev_err(&intf->dev, |
@@ -1656,7 +1680,7 @@ void usb_disconnect(struct usb_device **pdev) | |||
1656 | usb_lock_device(udev); | 1680 | usb_lock_device(udev); |
1657 | 1681 | ||
1658 | /* Free up all the children before we remove this device */ | 1682 | /* Free up all the children before we remove this device */ |
1659 | for (i = 0; i < USB_MAXCHILDREN; i++) { | 1683 | for (i = 0; i < udev->maxchild; i++) { |
1660 | if (udev->children[i]) | 1684 | if (udev->children[i]) |
1661 | usb_disconnect(&udev->children[i]); | 1685 | usb_disconnect(&udev->children[i]); |
1662 | } | 1686 | } |
@@ -1842,6 +1866,37 @@ fail: | |||
1842 | return err; | 1866 | return err; |
1843 | } | 1867 | } |
1844 | 1868 | ||
1869 | static void set_usb_port_removable(struct usb_device *udev) | ||
1870 | { | ||
1871 | struct usb_device *hdev = udev->parent; | ||
1872 | struct usb_hub *hub; | ||
1873 | u8 port = udev->portnum; | ||
1874 | u16 wHubCharacteristics; | ||
1875 | bool removable = true; | ||
1876 | |||
1877 | if (!hdev) | ||
1878 | return; | ||
1879 | |||
1880 | hub = hdev_to_hub(udev->parent); | ||
1881 | |||
1882 | wHubCharacteristics = le16_to_cpu(hub->descriptor->wHubCharacteristics); | ||
1883 | |||
1884 | if (!(wHubCharacteristics & HUB_CHAR_COMPOUND)) | ||
1885 | return; | ||
1886 | |||
1887 | if (hub_is_superspeed(hdev)) { | ||
1888 | if (hub->descriptor->u.ss.DeviceRemovable & (1 << port)) | ||
1889 | removable = false; | ||
1890 | } else { | ||
1891 | if (hub->descriptor->u.hs.DeviceRemovable[port / 8] & (1 << (port % 8))) | ||
1892 | removable = false; | ||
1893 | } | ||
1894 | |||
1895 | if (removable) | ||
1896 | udev->removable = USB_DEVICE_REMOVABLE; | ||
1897 | else | ||
1898 | udev->removable = USB_DEVICE_FIXED; | ||
1899 | } | ||
1845 | 1900 | ||
1846 | /** | 1901 | /** |
1847 | * usb_new_device - perform initial device setup (usbcore-internal) | 1902 | * usb_new_device - perform initial device setup (usbcore-internal) |
@@ -1900,6 +1955,15 @@ int usb_new_device(struct usb_device *udev) | |||
1900 | announce_device(udev); | 1955 | announce_device(udev); |
1901 | 1956 | ||
1902 | device_enable_async_suspend(&udev->dev); | 1957 | device_enable_async_suspend(&udev->dev); |
1958 | |||
1959 | /* | ||
1960 | * check whether the hub marks this port as non-removable. Do it | ||
1961 | * now so that platform-specific data can override it in | ||
1962 | * device_add() | ||
1963 | */ | ||
1964 | if (udev->parent) | ||
1965 | set_usb_port_removable(udev); | ||
1966 | |||
1903 | /* Register the device. The device driver is responsible | 1967 | /* Register the device. The device driver is responsible |
1904 | * for configuring the device and invoking the add-device | 1968 | * for configuring the device and invoking the add-device |
1905 | * notifier chain (used by usbfs and possibly others). | 1969 | * notifier chain (used by usbfs and possibly others). |
@@ -2385,11 +2449,27 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) | |||
2385 | * we don't explicitly enable it here. | 2449 | * we don't explicitly enable it here. |
2386 | */ | 2450 | */ |
2387 | if (udev->do_remote_wakeup) { | 2451 | if (udev->do_remote_wakeup) { |
2388 | status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | 2452 | if (!hub_is_superspeed(hub->hdev)) { |
2389 | USB_REQ_SET_FEATURE, USB_RECIP_DEVICE, | 2453 | status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), |
2390 | USB_DEVICE_REMOTE_WAKEUP, 0, | 2454 | USB_REQ_SET_FEATURE, USB_RECIP_DEVICE, |
2391 | NULL, 0, | 2455 | USB_DEVICE_REMOTE_WAKEUP, 0, |
2392 | USB_CTRL_SET_TIMEOUT); | 2456 | NULL, 0, |
2457 | USB_CTRL_SET_TIMEOUT); | ||
2458 | } else { | ||
2459 | /* Assume there's only one function on the USB 3.0 | ||
2460 | * device and enable remote wake for the first | ||
2461 | * interface. FIXME if the interface association | ||
2462 | * descriptor shows there's more than one function. | ||
2463 | */ | ||
2464 | status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | ||
2465 | USB_REQ_SET_FEATURE, | ||
2466 | USB_RECIP_INTERFACE, | ||
2467 | USB_INTRF_FUNC_SUSPEND, | ||
2468 | USB_INTRF_FUNC_SUSPEND_RW | | ||
2469 | USB_INTRF_FUNC_SUSPEND_LP, | ||
2470 | NULL, 0, | ||
2471 | USB_CTRL_SET_TIMEOUT); | ||
2472 | } | ||
2393 | if (status) { | 2473 | if (status) { |
2394 | dev_dbg(&udev->dev, "won't remote wakeup, status %d\n", | 2474 | dev_dbg(&udev->dev, "won't remote wakeup, status %d\n", |
2395 | status); | 2475 | status); |
@@ -2679,6 +2759,7 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) | |||
2679 | struct usb_hub *hub = usb_get_intfdata (intf); | 2759 | struct usb_hub *hub = usb_get_intfdata (intf); |
2680 | struct usb_device *hdev = hub->hdev; | 2760 | struct usb_device *hdev = hub->hdev; |
2681 | unsigned port1; | 2761 | unsigned port1; |
2762 | int status; | ||
2682 | 2763 | ||
2683 | /* Warn if children aren't already suspended */ | 2764 | /* Warn if children aren't already suspended */ |
2684 | for (port1 = 1; port1 <= hdev->maxchild; port1++) { | 2765 | for (port1 = 1; port1 <= hdev->maxchild; port1++) { |
@@ -2691,6 +2772,17 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) | |||
2691 | return -EBUSY; | 2772 | return -EBUSY; |
2692 | } | 2773 | } |
2693 | } | 2774 | } |
2775 | if (hub_is_superspeed(hdev) && hdev->do_remote_wakeup) { | ||
2776 | /* Enable hub to send remote wakeup for all ports. */ | ||
2777 | for (port1 = 1; port1 <= hdev->maxchild; port1++) { | ||
2778 | status = set_port_feature(hdev, | ||
2779 | port1 | | ||
2780 | USB_PORT_FEAT_REMOTE_WAKE_CONNECT | | ||
2781 | USB_PORT_FEAT_REMOTE_WAKE_DISCONNECT | | ||
2782 | USB_PORT_FEAT_REMOTE_WAKE_OVER_CURRENT, | ||
2783 | USB_PORT_FEAT_REMOTE_WAKE_MASK); | ||
2784 | } | ||
2785 | } | ||
2694 | 2786 | ||
2695 | dev_dbg(&intf->dev, "%s\n", __func__); | 2787 | dev_dbg(&intf->dev, "%s\n", __func__); |
2696 | 2788 | ||
@@ -3424,6 +3516,46 @@ done: | |||
3424 | hcd->driver->relinquish_port(hcd, port1); | 3516 | hcd->driver->relinquish_port(hcd, port1); |
3425 | } | 3517 | } |
3426 | 3518 | ||
3519 | /* Returns 1 if there was a remote wakeup and a connect status change. */ | ||
3520 | static int hub_handle_remote_wakeup(struct usb_hub *hub, unsigned int port, | ||
3521 | u16 portstatus, u16 portchange) | ||
3522 | { | ||
3523 | struct usb_device *hdev; | ||
3524 | struct usb_device *udev; | ||
3525 | int connect_change = 0; | ||
3526 | int ret; | ||
3527 | |||
3528 | hdev = hub->hdev; | ||
3529 | udev = hdev->children[port-1]; | ||
3530 | if (!hub_is_superspeed(hdev)) { | ||
3531 | if (!(portchange & USB_PORT_STAT_C_SUSPEND)) | ||
3532 | return 0; | ||
3533 | clear_port_feature(hdev, port, USB_PORT_FEAT_C_SUSPEND); | ||
3534 | } else { | ||
3535 | if (!udev || udev->state != USB_STATE_SUSPENDED || | ||
3536 | (portstatus & USB_PORT_STAT_LINK_STATE) != | ||
3537 | USB_SS_PORT_LS_U0) | ||
3538 | return 0; | ||
3539 | } | ||
3540 | |||
3541 | if (udev) { | ||
3542 | /* TRSMRCY = 10 msec */ | ||
3543 | msleep(10); | ||
3544 | |||
3545 | usb_lock_device(udev); | ||
3546 | ret = usb_remote_wakeup(udev); | ||
3547 | usb_unlock_device(udev); | ||
3548 | if (ret < 0) | ||
3549 | connect_change = 1; | ||
3550 | } else { | ||
3551 | ret = -ENODEV; | ||
3552 | hub_port_disable(hub, port, 1); | ||
3553 | } | ||
3554 | dev_dbg(hub->intfdev, "resume on port %d, status %d\n", | ||
3555 | port, ret); | ||
3556 | return connect_change; | ||
3557 | } | ||
3558 | |||
3427 | static void hub_events(void) | 3559 | static void hub_events(void) |
3428 | { | 3560 | { |
3429 | struct list_head *tmp; | 3561 | struct list_head *tmp; |
@@ -3436,7 +3568,7 @@ static void hub_events(void) | |||
3436 | u16 portstatus; | 3568 | u16 portstatus; |
3437 | u16 portchange; | 3569 | u16 portchange; |
3438 | int i, ret; | 3570 | int i, ret; |
3439 | int connect_change; | 3571 | int connect_change, wakeup_change; |
3440 | 3572 | ||
3441 | /* | 3573 | /* |
3442 | * We restart the list every time to avoid a deadlock with | 3574 | * We restart the list every time to avoid a deadlock with |
@@ -3515,8 +3647,9 @@ static void hub_events(void) | |||
3515 | if (test_bit(i, hub->busy_bits)) | 3647 | if (test_bit(i, hub->busy_bits)) |
3516 | continue; | 3648 | continue; |
3517 | connect_change = test_bit(i, hub->change_bits); | 3649 | connect_change = test_bit(i, hub->change_bits); |
3650 | wakeup_change = test_and_clear_bit(i, hub->wakeup_bits); | ||
3518 | if (!test_and_clear_bit(i, hub->event_bits) && | 3651 | if (!test_and_clear_bit(i, hub->event_bits) && |
3519 | !connect_change) | 3652 | !connect_change && !wakeup_change) |
3520 | continue; | 3653 | continue; |
3521 | 3654 | ||
3522 | ret = hub_port_status(hub, i, | 3655 | ret = hub_port_status(hub, i, |
@@ -3557,31 +3690,10 @@ static void hub_events(void) | |||
3557 | } | 3690 | } |
3558 | } | 3691 | } |
3559 | 3692 | ||
3560 | if (portchange & USB_PORT_STAT_C_SUSPEND) { | 3693 | if (hub_handle_remote_wakeup(hub, i, |
3561 | struct usb_device *udev; | 3694 | portstatus, portchange)) |
3695 | connect_change = 1; | ||
3562 | 3696 | ||
3563 | clear_port_feature(hdev, i, | ||
3564 | USB_PORT_FEAT_C_SUSPEND); | ||
3565 | udev = hdev->children[i-1]; | ||
3566 | if (udev) { | ||
3567 | /* TRSMRCY = 10 msec */ | ||
3568 | msleep(10); | ||
3569 | |||
3570 | usb_lock_device(udev); | ||
3571 | ret = usb_remote_wakeup(hdev-> | ||
3572 | children[i-1]); | ||
3573 | usb_unlock_device(udev); | ||
3574 | if (ret < 0) | ||
3575 | connect_change = 1; | ||
3576 | } else { | ||
3577 | ret = -ENODEV; | ||
3578 | hub_port_disable(hub, i, 1); | ||
3579 | } | ||
3580 | dev_dbg (hub_dev, | ||
3581 | "resume on port %d, status %d\n", | ||
3582 | i, ret); | ||
3583 | } | ||
3584 | |||
3585 | if (portchange & USB_PORT_STAT_C_OVERCURRENT) { | 3697 | if (portchange & USB_PORT_STAT_C_OVERCURRENT) { |
3586 | u16 status = 0; | 3698 | u16 status = 0; |
3587 | u16 unused; | 3699 | u16 unused; |
diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c index 9e491ca2e5c4..566d9f94f735 100644 --- a/drivers/usb/core/sysfs.c +++ b/drivers/usb/core/sysfs.c | |||
@@ -230,6 +230,28 @@ show_urbnum(struct device *dev, struct device_attribute *attr, char *buf) | |||
230 | } | 230 | } |
231 | static DEVICE_ATTR(urbnum, S_IRUGO, show_urbnum, NULL); | 231 | static DEVICE_ATTR(urbnum, S_IRUGO, show_urbnum, NULL); |
232 | 232 | ||
233 | static ssize_t | ||
234 | show_removable(struct device *dev, struct device_attribute *attr, char *buf) | ||
235 | { | ||
236 | struct usb_device *udev; | ||
237 | char *state; | ||
238 | |||
239 | udev = to_usb_device(dev); | ||
240 | |||
241 | switch (udev->removable) { | ||
242 | case USB_DEVICE_REMOVABLE: | ||
243 | state = "removable"; | ||
244 | break; | ||
245 | case USB_DEVICE_FIXED: | ||
246 | state = "fixed"; | ||
247 | break; | ||
248 | default: | ||
249 | state = "unknown"; | ||
250 | } | ||
251 | |||
252 | return sprintf(buf, "%s\n", state); | ||
253 | } | ||
254 | static DEVICE_ATTR(removable, S_IRUGO, show_removable, NULL); | ||
233 | 255 | ||
234 | #ifdef CONFIG_PM | 256 | #ifdef CONFIG_PM |
235 | 257 | ||
@@ -626,6 +648,7 @@ static struct attribute *dev_attrs[] = { | |||
626 | &dev_attr_avoid_reset_quirk.attr, | 648 | &dev_attr_avoid_reset_quirk.attr, |
627 | &dev_attr_authorized.attr, | 649 | &dev_attr_authorized.attr, |
628 | &dev_attr_remove.attr, | 650 | &dev_attr_remove.attr, |
651 | &dev_attr_removable.attr, | ||
629 | NULL, | 652 | NULL, |
630 | }; | 653 | }; |
631 | static struct attribute_group dev_attr_grp = { | 654 | static struct attribute_group dev_attr_grp = { |
diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c index 909625b91eb3..7239a73c1b8c 100644 --- a/drivers/usb/core/urb.c +++ b/drivers/usb/core/urb.c | |||
@@ -403,20 +403,17 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags) | |||
403 | * cause problems in HCDs if they get it wrong. | 403 | * cause problems in HCDs if they get it wrong. |
404 | */ | 404 | */ |
405 | { | 405 | { |
406 | unsigned int orig_flags = urb->transfer_flags; | ||
407 | unsigned int allowed; | 406 | unsigned int allowed; |
408 | static int pipetypes[4] = { | 407 | static int pipetypes[4] = { |
409 | PIPE_CONTROL, PIPE_ISOCHRONOUS, PIPE_BULK, PIPE_INTERRUPT | 408 | PIPE_CONTROL, PIPE_ISOCHRONOUS, PIPE_BULK, PIPE_INTERRUPT |
410 | }; | 409 | }; |
411 | 410 | ||
412 | /* Check that the pipe's type matches the endpoint's type */ | 411 | /* Check that the pipe's type matches the endpoint's type */ |
413 | if (usb_pipetype(urb->pipe) != pipetypes[xfertype]) { | 412 | if (usb_pipetype(urb->pipe) != pipetypes[xfertype]) |
414 | dev_err(&dev->dev, "BOGUS urb xfer, pipe %x != type %x\n", | 413 | dev_WARN(&dev->dev, "BOGUS urb xfer, pipe %x != type %x\n", |
415 | usb_pipetype(urb->pipe), pipetypes[xfertype]); | 414 | usb_pipetype(urb->pipe), pipetypes[xfertype]); |
416 | return -EPIPE; /* The most suitable error code :-) */ | ||
417 | } | ||
418 | 415 | ||
419 | /* enforce simple/standard policy */ | 416 | /* Check against a simple/standard policy */ |
420 | allowed = (URB_NO_TRANSFER_DMA_MAP | URB_NO_INTERRUPT | URB_DIR_MASK | | 417 | allowed = (URB_NO_TRANSFER_DMA_MAP | URB_NO_INTERRUPT | URB_DIR_MASK | |
421 | URB_FREE_BUFFER); | 418 | URB_FREE_BUFFER); |
422 | switch (xfertype) { | 419 | switch (xfertype) { |
@@ -435,14 +432,12 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags) | |||
435 | allowed |= URB_ISO_ASAP; | 432 | allowed |= URB_ISO_ASAP; |
436 | break; | 433 | break; |
437 | } | 434 | } |
438 | urb->transfer_flags &= allowed; | 435 | allowed &= urb->transfer_flags; |
439 | 436 | ||
440 | /* fail if submitter gave bogus flags */ | 437 | /* warn if submitter gave bogus flags */ |
441 | if (urb->transfer_flags != orig_flags) { | 438 | if (allowed != urb->transfer_flags) |
442 | dev_err(&dev->dev, "BOGUS urb flags, %x --> %x\n", | 439 | dev_WARN(&dev->dev, "BOGUS urb flags, %x --> %x\n", |
443 | orig_flags, urb->transfer_flags); | 440 | urb->transfer_flags, allowed); |
444 | return -EINVAL; | ||
445 | } | ||
446 | } | 441 | } |
447 | #endif | 442 | #endif |
448 | /* | 443 | /* |
@@ -532,10 +527,13 @@ EXPORT_SYMBOL_GPL(usb_submit_urb); | |||
532 | * a driver's I/O routines to insure that all URB-related activity has | 527 | * a driver's I/O routines to insure that all URB-related activity has |
533 | * completed before it returns. | 528 | * completed before it returns. |
534 | * | 529 | * |
535 | * This request is always asynchronous. Success is indicated by | 530 | * This request is asynchronous, however the HCD might call the ->complete() |
536 | * returning -EINPROGRESS, at which time the URB will probably not yet | 531 | * callback during unlink. Therefore when drivers call usb_unlink_urb(), they |
537 | * have been given back to the device driver. When it is eventually | 532 | * must not hold any locks that may be taken by the completion function. |
538 | * called, the completion function will see @urb->status == -ECONNRESET. | 533 | * Success is indicated by returning -EINPROGRESS, at which time the URB will |
534 | * probably not yet have been given back to the device driver. When it is | ||
535 | * eventually called, the completion function will see @urb->status == | ||
536 | * -ECONNRESET. | ||
539 | * Failure is indicated by usb_unlink_urb() returning any other value. | 537 | * Failure is indicated by usb_unlink_urb() returning any other value. |
540 | * Unlinking will fail when @urb is not currently "linked" (i.e., it was | 538 | * Unlinking will fail when @urb is not currently "linked" (i.e., it was |
541 | * never submitted, or it was unlinked before, or the hardware is already | 539 | * never submitted, or it was unlinked before, or the hardware is already |
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 8ca9f994a280..c74ba7bbc748 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c | |||
@@ -274,7 +274,7 @@ static int usb_dev_prepare(struct device *dev) | |||
274 | static void usb_dev_complete(struct device *dev) | 274 | static void usb_dev_complete(struct device *dev) |
275 | { | 275 | { |
276 | /* Currently used only for rebinding interfaces */ | 276 | /* Currently used only for rebinding interfaces */ |
277 | usb_resume(dev, PMSG_ON); /* FIXME: change to PMSG_COMPLETE */ | 277 | usb_resume_complete(dev); |
278 | } | 278 | } |
279 | 279 | ||
280 | static int usb_dev_suspend(struct device *dev) | 280 | static int usb_dev_suspend(struct device *dev) |
diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h index 45e8479c377d..71648dcbe438 100644 --- a/drivers/usb/core/usb.h +++ b/drivers/usb/core/usb.h | |||
@@ -56,6 +56,7 @@ extern void usb_major_cleanup(void); | |||
56 | 56 | ||
57 | extern int usb_suspend(struct device *dev, pm_message_t msg); | 57 | extern int usb_suspend(struct device *dev, pm_message_t msg); |
58 | extern int usb_resume(struct device *dev, pm_message_t msg); | 58 | extern int usb_resume(struct device *dev, pm_message_t msg); |
59 | extern int usb_resume_complete(struct device *dev); | ||
59 | 60 | ||
60 | extern int usb_port_suspend(struct usb_device *dev, pm_message_t msg); | 61 | extern int usb_port_suspend(struct usb_device *dev, pm_message_t msg); |
61 | extern int usb_port_resume(struct usb_device *dev, pm_message_t msg); | 62 | extern int usb_port_resume(struct usb_device *dev, pm_message_t msg); |
diff --git a/drivers/usb/dwc3/Makefile b/drivers/usb/dwc3/Makefile index 900ae74357f1..d441fe4c180b 100644 --- a/drivers/usb/dwc3/Makefile +++ b/drivers/usb/dwc3/Makefile | |||
@@ -28,6 +28,19 @@ endif | |||
28 | 28 | ||
29 | obj-$(CONFIG_USB_DWC3) += dwc3-omap.o | 29 | obj-$(CONFIG_USB_DWC3) += dwc3-omap.o |
30 | 30 | ||
31 | ## | ||
32 | # REVISIT Samsung Exynos platform needs the clk API which isn't | ||
33 | # defined on all architectures. If we allow dwc3-exynos.c compile | ||
34 | # always we will fail the linking phase on those architectures | ||
35 | # which don't provide clk api implementation and that's unnaceptable. | ||
36 | # | ||
37 | # When Samsung's platform start supporting pm_runtime, this check | ||
38 | # for HAVE_CLK should be removed. | ||
39 | ## | ||
40 | ifneq ($(CONFIG_HAVE_CLK),) | ||
41 | obj-$(CONFIG_USB_DWC3) += dwc3-exynos.o | ||
42 | endif | ||
43 | |||
31 | ifneq ($(CONFIG_PCI),) | 44 | ifneq ($(CONFIG_PCI),) |
32 | obj-$(CONFIG_USB_DWC3) += dwc3-pci.o | 45 | obj-$(CONFIG_USB_DWC3) += dwc3-pci.o |
33 | endif | 46 | endif |
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 7c9df630dbe4..7bd815a507e8 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
@@ -48,10 +48,10 @@ | |||
48 | #include <linux/list.h> | 48 | #include <linux/list.h> |
49 | #include <linux/delay.h> | 49 | #include <linux/delay.h> |
50 | #include <linux/dma-mapping.h> | 50 | #include <linux/dma-mapping.h> |
51 | #include <linux/of.h> | ||
51 | 52 | ||
52 | #include <linux/usb/ch9.h> | 53 | #include <linux/usb/ch9.h> |
53 | #include <linux/usb/gadget.h> | 54 | #include <linux/usb/gadget.h> |
54 | #include <linux/module.h> | ||
55 | 55 | ||
56 | #include "core.h" | 56 | #include "core.h" |
57 | #include "gadget.h" | 57 | #include "gadget.h" |
@@ -86,7 +86,7 @@ again: | |||
86 | id = -ENOMEM; | 86 | id = -ENOMEM; |
87 | } | 87 | } |
88 | 88 | ||
89 | return 0; | 89 | return id; |
90 | } | 90 | } |
91 | EXPORT_SYMBOL_GPL(dwc3_get_device_id); | 91 | EXPORT_SYMBOL_GPL(dwc3_get_device_id); |
92 | 92 | ||
@@ -167,11 +167,11 @@ static void dwc3_free_one_event_buffer(struct dwc3 *dwc, | |||
167 | } | 167 | } |
168 | 168 | ||
169 | /** | 169 | /** |
170 | * dwc3_alloc_one_event_buffer - Allocated one event buffer structure | 170 | * dwc3_alloc_one_event_buffer - Allocates one event buffer structure |
171 | * @dwc: Pointer to our controller context structure | 171 | * @dwc: Pointer to our controller context structure |
172 | * @length: size of the event buffer | 172 | * @length: size of the event buffer |
173 | * | 173 | * |
174 | * Returns a pointer to the allocated event buffer structure on succes | 174 | * Returns a pointer to the allocated event buffer structure on success |
175 | * otherwise ERR_PTR(errno). | 175 | * otherwise ERR_PTR(errno). |
176 | */ | 176 | */ |
177 | static struct dwc3_event_buffer *__devinit | 177 | static struct dwc3_event_buffer *__devinit |
@@ -215,10 +215,10 @@ static void dwc3_free_event_buffers(struct dwc3 *dwc) | |||
215 | 215 | ||
216 | /** | 216 | /** |
217 | * dwc3_alloc_event_buffers - Allocates @num event buffers of size @length | 217 | * dwc3_alloc_event_buffers - Allocates @num event buffers of size @length |
218 | * @dwc: Pointer to out controller context structure | 218 | * @dwc: pointer to our controller context structure |
219 | * @length: size of event buffer | 219 | * @length: size of event buffer |
220 | * | 220 | * |
221 | * Returns 0 on success otherwise negative errno. In error the case, dwc | 221 | * Returns 0 on success otherwise negative errno. In the error case, dwc |
222 | * may contain some buffers allocated but not all which were requested. | 222 | * may contain some buffers allocated but not all which were requested. |
223 | */ | 223 | */ |
224 | static int __devinit dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned length) | 224 | static int __devinit dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned length) |
@@ -251,7 +251,7 @@ static int __devinit dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned length) | |||
251 | 251 | ||
252 | /** | 252 | /** |
253 | * dwc3_event_buffers_setup - setup our allocated event buffers | 253 | * dwc3_event_buffers_setup - setup our allocated event buffers |
254 | * @dwc: Pointer to out controller context structure | 254 | * @dwc: pointer to our controller context structure |
255 | * | 255 | * |
256 | * Returns 0 on success otherwise negative errno. | 256 | * Returns 0 on success otherwise negative errno. |
257 | */ | 257 | */ |
@@ -350,7 +350,7 @@ static int __devinit dwc3_core_init(struct dwc3 *dwc) | |||
350 | dwc3_cache_hwparams(dwc); | 350 | dwc3_cache_hwparams(dwc); |
351 | 351 | ||
352 | reg = dwc3_readl(dwc->regs, DWC3_GCTL); | 352 | reg = dwc3_readl(dwc->regs, DWC3_GCTL); |
353 | reg &= ~DWC3_GCTL_SCALEDOWN(3); | 353 | reg &= ~DWC3_GCTL_SCALEDOWN_MASK; |
354 | reg &= ~DWC3_GCTL_DISSCRAMBLE; | 354 | reg &= ~DWC3_GCTL_DISSCRAMBLE; |
355 | 355 | ||
356 | switch (DWC3_GHWPARAMS1_EN_PWROPT(dwc->hwparams.hwparams1)) { | 356 | switch (DWC3_GHWPARAMS1_EN_PWROPT(dwc->hwparams.hwparams1)) { |
@@ -363,9 +363,9 @@ static int __devinit dwc3_core_init(struct dwc3 *dwc) | |||
363 | 363 | ||
364 | /* | 364 | /* |
365 | * WORKAROUND: DWC3 revisions <1.90a have a bug | 365 | * WORKAROUND: DWC3 revisions <1.90a have a bug |
366 | * when The device fails to connect at SuperSpeed | 366 | * where the device can fail to connect at SuperSpeed |
367 | * and falls back to high-speed mode which causes | 367 | * and falls back to high-speed mode which causes |
368 | * the device to enter in a Connect/Disconnect loop | 368 | * the device to enter a Connect/Disconnect loop |
369 | */ | 369 | */ |
370 | if (dwc->revision < DWC3_REVISION_190A) | 370 | if (dwc->revision < DWC3_REVISION_190A) |
371 | reg |= DWC3_GCTL_U2RSTECN; | 371 | reg |= DWC3_GCTL_U2RSTECN; |
@@ -404,8 +404,10 @@ static void dwc3_core_exit(struct dwc3 *dwc) | |||
404 | 404 | ||
405 | static int __devinit dwc3_probe(struct platform_device *pdev) | 405 | static int __devinit dwc3_probe(struct platform_device *pdev) |
406 | { | 406 | { |
407 | struct device_node *node = pdev->dev.of_node; | ||
407 | struct resource *res; | 408 | struct resource *res; |
408 | struct dwc3 *dwc; | 409 | struct dwc3 *dwc; |
410 | struct device *dev = &pdev->dev; | ||
409 | 411 | ||
410 | int ret = -ENOMEM; | 412 | int ret = -ENOMEM; |
411 | int irq; | 413 | int irq; |
@@ -415,39 +417,39 @@ static int __devinit dwc3_probe(struct platform_device *pdev) | |||
415 | 417 | ||
416 | u8 mode; | 418 | u8 mode; |
417 | 419 | ||
418 | mem = kzalloc(sizeof(*dwc) + DWC3_ALIGN_MASK, GFP_KERNEL); | 420 | mem = devm_kzalloc(dev, sizeof(*dwc) + DWC3_ALIGN_MASK, GFP_KERNEL); |
419 | if (!mem) { | 421 | if (!mem) { |
420 | dev_err(&pdev->dev, "not enough memory\n"); | 422 | dev_err(dev, "not enough memory\n"); |
421 | goto err0; | 423 | return -ENOMEM; |
422 | } | 424 | } |
423 | dwc = PTR_ALIGN(mem, DWC3_ALIGN_MASK + 1); | 425 | dwc = PTR_ALIGN(mem, DWC3_ALIGN_MASK + 1); |
424 | dwc->mem = mem; | 426 | dwc->mem = mem; |
425 | 427 | ||
426 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 428 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
427 | if (!res) { | 429 | if (!res) { |
428 | dev_err(&pdev->dev, "missing resource\n"); | 430 | dev_err(dev, "missing resource\n"); |
429 | goto err1; | 431 | return -ENODEV; |
430 | } | 432 | } |
431 | 433 | ||
432 | dwc->res = res; | 434 | dwc->res = res; |
433 | 435 | ||
434 | res = request_mem_region(res->start, resource_size(res), | 436 | res = devm_request_mem_region(dev, res->start, resource_size(res), |
435 | dev_name(&pdev->dev)); | 437 | dev_name(dev)); |
436 | if (!res) { | 438 | if (!res) { |
437 | dev_err(&pdev->dev, "can't request mem region\n"); | 439 | dev_err(dev, "can't request mem region\n"); |
438 | goto err1; | 440 | return -ENOMEM; |
439 | } | 441 | } |
440 | 442 | ||
441 | regs = ioremap(res->start, resource_size(res)); | 443 | regs = devm_ioremap(dev, res->start, resource_size(res)); |
442 | if (!regs) { | 444 | if (!regs) { |
443 | dev_err(&pdev->dev, "ioremap failed\n"); | 445 | dev_err(dev, "ioremap failed\n"); |
444 | goto err2; | 446 | return -ENOMEM; |
445 | } | 447 | } |
446 | 448 | ||
447 | irq = platform_get_irq(pdev, 0); | 449 | irq = platform_get_irq(pdev, 0); |
448 | if (irq < 0) { | 450 | if (irq < 0) { |
449 | dev_err(&pdev->dev, "missing IRQ\n"); | 451 | dev_err(dev, "missing IRQ\n"); |
450 | goto err3; | 452 | return -ENODEV; |
451 | } | 453 | } |
452 | 454 | ||
453 | spin_lock_init(&dwc->lock); | 455 | spin_lock_init(&dwc->lock); |
@@ -455,7 +457,7 @@ static int __devinit dwc3_probe(struct platform_device *pdev) | |||
455 | 457 | ||
456 | dwc->regs = regs; | 458 | dwc->regs = regs; |
457 | dwc->regs_size = resource_size(res); | 459 | dwc->regs_size = resource_size(res); |
458 | dwc->dev = &pdev->dev; | 460 | dwc->dev = dev; |
459 | dwc->irq = irq; | 461 | dwc->irq = irq; |
460 | 462 | ||
461 | if (!strncmp("super", maximum_speed, 5)) | 463 | if (!strncmp("super", maximum_speed, 5)) |
@@ -469,14 +471,17 @@ static int __devinit dwc3_probe(struct platform_device *pdev) | |||
469 | else | 471 | else |
470 | dwc->maximum_speed = DWC3_DCFG_SUPERSPEED; | 472 | dwc->maximum_speed = DWC3_DCFG_SUPERSPEED; |
471 | 473 | ||
472 | pm_runtime_enable(&pdev->dev); | 474 | if (of_get_property(node, "tx-fifo-resize", NULL)) |
473 | pm_runtime_get_sync(&pdev->dev); | 475 | dwc->needs_fifo_resize = true; |
474 | pm_runtime_forbid(&pdev->dev); | 476 | |
477 | pm_runtime_enable(dev); | ||
478 | pm_runtime_get_sync(dev); | ||
479 | pm_runtime_forbid(dev); | ||
475 | 480 | ||
476 | ret = dwc3_core_init(dwc); | 481 | ret = dwc3_core_init(dwc); |
477 | if (ret) { | 482 | if (ret) { |
478 | dev_err(&pdev->dev, "failed to initialize core\n"); | 483 | dev_err(dev, "failed to initialize core\n"); |
479 | goto err3; | 484 | return ret; |
480 | } | 485 | } |
481 | 486 | ||
482 | mode = DWC3_MODE(dwc->hwparams.hwparams0); | 487 | mode = DWC3_MODE(dwc->hwparams.hwparams0); |
@@ -486,49 +491,49 @@ static int __devinit dwc3_probe(struct platform_device *pdev) | |||
486 | dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_DEVICE); | 491 | dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_DEVICE); |
487 | ret = dwc3_gadget_init(dwc); | 492 | ret = dwc3_gadget_init(dwc); |
488 | if (ret) { | 493 | if (ret) { |
489 | dev_err(&pdev->dev, "failed to initialize gadget\n"); | 494 | dev_err(dev, "failed to initialize gadget\n"); |
490 | goto err4; | 495 | goto err1; |
491 | } | 496 | } |
492 | break; | 497 | break; |
493 | case DWC3_MODE_HOST: | 498 | case DWC3_MODE_HOST: |
494 | dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_HOST); | 499 | dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_HOST); |
495 | ret = dwc3_host_init(dwc); | 500 | ret = dwc3_host_init(dwc); |
496 | if (ret) { | 501 | if (ret) { |
497 | dev_err(&pdev->dev, "failed to initialize host\n"); | 502 | dev_err(dev, "failed to initialize host\n"); |
498 | goto err4; | 503 | goto err1; |
499 | } | 504 | } |
500 | break; | 505 | break; |
501 | case DWC3_MODE_DRD: | 506 | case DWC3_MODE_DRD: |
502 | dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG); | 507 | dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG); |
503 | ret = dwc3_host_init(dwc); | 508 | ret = dwc3_host_init(dwc); |
504 | if (ret) { | 509 | if (ret) { |
505 | dev_err(&pdev->dev, "failed to initialize host\n"); | 510 | dev_err(dev, "failed to initialize host\n"); |
506 | goto err4; | 511 | goto err1; |
507 | } | 512 | } |
508 | 513 | ||
509 | ret = dwc3_gadget_init(dwc); | 514 | ret = dwc3_gadget_init(dwc); |
510 | if (ret) { | 515 | if (ret) { |
511 | dev_err(&pdev->dev, "failed to initialize gadget\n"); | 516 | dev_err(dev, "failed to initialize gadget\n"); |
512 | goto err4; | 517 | goto err1; |
513 | } | 518 | } |
514 | break; | 519 | break; |
515 | default: | 520 | default: |
516 | dev_err(&pdev->dev, "Unsupported mode of operation %d\n", mode); | 521 | dev_err(dev, "Unsupported mode of operation %d\n", mode); |
517 | goto err4; | 522 | goto err1; |
518 | } | 523 | } |
519 | dwc->mode = mode; | 524 | dwc->mode = mode; |
520 | 525 | ||
521 | ret = dwc3_debugfs_init(dwc); | 526 | ret = dwc3_debugfs_init(dwc); |
522 | if (ret) { | 527 | if (ret) { |
523 | dev_err(&pdev->dev, "failed to initialize debugfs\n"); | 528 | dev_err(dev, "failed to initialize debugfs\n"); |
524 | goto err5; | 529 | goto err2; |
525 | } | 530 | } |
526 | 531 | ||
527 | pm_runtime_allow(&pdev->dev); | 532 | pm_runtime_allow(dev); |
528 | 533 | ||
529 | return 0; | 534 | return 0; |
530 | 535 | ||
531 | err5: | 536 | err2: |
532 | switch (mode) { | 537 | switch (mode) { |
533 | case DWC3_MODE_DEVICE: | 538 | case DWC3_MODE_DEVICE: |
534 | dwc3_gadget_exit(dwc); | 539 | dwc3_gadget_exit(dwc); |
@@ -545,19 +550,9 @@ err5: | |||
545 | break; | 550 | break; |
546 | } | 551 | } |
547 | 552 | ||
548 | err4: | ||
549 | dwc3_core_exit(dwc); | ||
550 | |||
551 | err3: | ||
552 | iounmap(regs); | ||
553 | |||
554 | err2: | ||
555 | release_mem_region(res->start, resource_size(res)); | ||
556 | |||
557 | err1: | 553 | err1: |
558 | kfree(dwc->mem); | 554 | dwc3_core_exit(dwc); |
559 | 555 | ||
560 | err0: | ||
561 | return ret; | 556 | return ret; |
562 | } | 557 | } |
563 | 558 | ||
@@ -590,9 +585,6 @@ static int __devexit dwc3_remove(struct platform_device *pdev) | |||
590 | } | 585 | } |
591 | 586 | ||
592 | dwc3_core_exit(dwc); | 587 | dwc3_core_exit(dwc); |
593 | release_mem_region(res->start, resource_size(res)); | ||
594 | iounmap(dwc->regs); | ||
595 | kfree(dwc->mem); | ||
596 | 588 | ||
597 | return 0; | 589 | return 0; |
598 | } | 590 | } |
@@ -605,19 +597,9 @@ static struct platform_driver dwc3_driver = { | |||
605 | }, | 597 | }, |
606 | }; | 598 | }; |
607 | 599 | ||
600 | module_platform_driver(dwc3_driver); | ||
601 | |||
608 | MODULE_ALIAS("platform:dwc3"); | 602 | MODULE_ALIAS("platform:dwc3"); |
609 | MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>"); | 603 | MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>"); |
610 | MODULE_LICENSE("Dual BSD/GPL"); | 604 | MODULE_LICENSE("Dual BSD/GPL"); |
611 | MODULE_DESCRIPTION("DesignWare USB3 DRD Controller Driver"); | 605 | MODULE_DESCRIPTION("DesignWare USB3 DRD Controller Driver"); |
612 | |||
613 | static int __devinit dwc3_init(void) | ||
614 | { | ||
615 | return platform_driver_register(&dwc3_driver); | ||
616 | } | ||
617 | module_init(dwc3_init); | ||
618 | |||
619 | static void __exit dwc3_exit(void) | ||
620 | { | ||
621 | platform_driver_unregister(&dwc3_driver); | ||
622 | } | ||
623 | module_exit(dwc3_exit); | ||
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 9e57f8e9bf17..6c7945b4cad3 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h | |||
@@ -145,22 +145,23 @@ | |||
145 | /* Bit fields */ | 145 | /* Bit fields */ |
146 | 146 | ||
147 | /* Global Configuration Register */ | 147 | /* Global Configuration Register */ |
148 | #define DWC3_GCTL_PWRDNSCALE(n) (n << 19) | 148 | #define DWC3_GCTL_PWRDNSCALE(n) ((n) << 19) |
149 | #define DWC3_GCTL_U2RSTECN (1 << 16) | 149 | #define DWC3_GCTL_U2RSTECN (1 << 16) |
150 | #define DWC3_GCTL_RAMCLKSEL(x) ((x & DWC3_GCTL_CLK_MASK) << 6) | 150 | #define DWC3_GCTL_RAMCLKSEL(x) (((x) & DWC3_GCTL_CLK_MASK) << 6) |
151 | #define DWC3_GCTL_CLK_BUS (0) | 151 | #define DWC3_GCTL_CLK_BUS (0) |
152 | #define DWC3_GCTL_CLK_PIPE (1) | 152 | #define DWC3_GCTL_CLK_PIPE (1) |
153 | #define DWC3_GCTL_CLK_PIPEHALF (2) | 153 | #define DWC3_GCTL_CLK_PIPEHALF (2) |
154 | #define DWC3_GCTL_CLK_MASK (3) | 154 | #define DWC3_GCTL_CLK_MASK (3) |
155 | 155 | ||
156 | #define DWC3_GCTL_PRTCAP(n) (((n) & (3 << 12)) >> 12) | 156 | #define DWC3_GCTL_PRTCAP(n) (((n) & (3 << 12)) >> 12) |
157 | #define DWC3_GCTL_PRTCAPDIR(n) (n << 12) | 157 | #define DWC3_GCTL_PRTCAPDIR(n) ((n) << 12) |
158 | #define DWC3_GCTL_PRTCAP_HOST 1 | 158 | #define DWC3_GCTL_PRTCAP_HOST 1 |
159 | #define DWC3_GCTL_PRTCAP_DEVICE 2 | 159 | #define DWC3_GCTL_PRTCAP_DEVICE 2 |
160 | #define DWC3_GCTL_PRTCAP_OTG 3 | 160 | #define DWC3_GCTL_PRTCAP_OTG 3 |
161 | 161 | ||
162 | #define DWC3_GCTL_CORESOFTRESET (1 << 11) | 162 | #define DWC3_GCTL_CORESOFTRESET (1 << 11) |
163 | #define DWC3_GCTL_SCALEDOWN(n) (n << 4) | 163 | #define DWC3_GCTL_SCALEDOWN(n) ((n) << 4) |
164 | #define DWC3_GCTL_SCALEDOWN_MASK DWC3_GCTL_SCALEDOWN(3) | ||
164 | #define DWC3_GCTL_DISSCRAMBLE (1 << 3) | 165 | #define DWC3_GCTL_DISSCRAMBLE (1 << 3) |
165 | #define DWC3_GCTL_DSBLCLKGTNG (1 << 0) | 166 | #define DWC3_GCTL_DSBLCLKGTNG (1 << 0) |
166 | 167 | ||
@@ -172,8 +173,12 @@ | |||
172 | #define DWC3_GUSB3PIPECTL_PHYSOFTRST (1 << 31) | 173 | #define DWC3_GUSB3PIPECTL_PHYSOFTRST (1 << 31) |
173 | #define DWC3_GUSB3PIPECTL_SUSPHY (1 << 17) | 174 | #define DWC3_GUSB3PIPECTL_SUSPHY (1 << 17) |
174 | 175 | ||
176 | /* Global TX Fifo Size Register */ | ||
177 | #define DWC3_GTXFIFOSIZ_TXFDEF(n) ((n) & 0xffff) | ||
178 | #define DWC3_GTXFIFOSIZ_TXFSTADDR(n) ((n) & 0xffff0000) | ||
179 | |||
175 | /* Global HWPARAMS1 Register */ | 180 | /* Global HWPARAMS1 Register */ |
176 | #define DWC3_GHWPARAMS1_EN_PWROPT(n) ((n & (3 << 24)) >> 24) | 181 | #define DWC3_GHWPARAMS1_EN_PWROPT(n) (((n) & (3 << 24)) >> 24) |
177 | #define DWC3_GHWPARAMS1_EN_PWROPT_NO 0 | 182 | #define DWC3_GHWPARAMS1_EN_PWROPT_NO 0 |
178 | #define DWC3_GHWPARAMS1_EN_PWROPT_CLK 1 | 183 | #define DWC3_GHWPARAMS1_EN_PWROPT_CLK 1 |
179 | 184 | ||
@@ -198,6 +203,15 @@ | |||
198 | 203 | ||
199 | #define DWC3_DCTL_APPL1RES (1 << 23) | 204 | #define DWC3_DCTL_APPL1RES (1 << 23) |
200 | 205 | ||
206 | #define DWC3_DCTL_TRGTULST_MASK (0x0f << 17) | ||
207 | #define DWC3_DCTL_TRGTULST(n) ((n) << 17) | ||
208 | |||
209 | #define DWC3_DCTL_TRGTULST_U2 (DWC3_DCTL_TRGTULST(2)) | ||
210 | #define DWC3_DCTL_TRGTULST_U3 (DWC3_DCTL_TRGTULST(3)) | ||
211 | #define DWC3_DCTL_TRGTULST_SS_DIS (DWC3_DCTL_TRGTULST(4)) | ||
212 | #define DWC3_DCTL_TRGTULST_RX_DET (DWC3_DCTL_TRGTULST(5)) | ||
213 | #define DWC3_DCTL_TRGTULST_SS_INACT (DWC3_DCTL_TRGTULST(6)) | ||
214 | |||
201 | #define DWC3_DCTL_INITU2ENA (1 << 12) | 215 | #define DWC3_DCTL_INITU2ENA (1 << 12) |
202 | #define DWC3_DCTL_ACCEPTU2ENA (1 << 11) | 216 | #define DWC3_DCTL_ACCEPTU2ENA (1 << 11) |
203 | #define DWC3_DCTL_INITU1ENA (1 << 10) | 217 | #define DWC3_DCTL_INITU1ENA (1 << 10) |
@@ -260,10 +274,10 @@ | |||
260 | 274 | ||
261 | /* Device Endpoint Command Register */ | 275 | /* Device Endpoint Command Register */ |
262 | #define DWC3_DEPCMD_PARAM_SHIFT 16 | 276 | #define DWC3_DEPCMD_PARAM_SHIFT 16 |
263 | #define DWC3_DEPCMD_PARAM(x) (x << DWC3_DEPCMD_PARAM_SHIFT) | 277 | #define DWC3_DEPCMD_PARAM(x) ((x) << DWC3_DEPCMD_PARAM_SHIFT) |
264 | #define DWC3_DEPCMD_GET_RSC_IDX(x) ((x >> DWC3_DEPCMD_PARAM_SHIFT) & 0x7f) | 278 | #define DWC3_DEPCMD_GET_RSC_IDX(x) (((x) >> DWC3_DEPCMD_PARAM_SHIFT) & 0x7f) |
265 | #define DWC3_DEPCMD_STATUS_MASK (0x0f << 12) | 279 | #define DWC3_DEPCMD_STATUS_MASK (0x0f << 12) |
266 | #define DWC3_DEPCMD_STATUS(x) ((x & DWC3_DEPCMD_STATUS_MASK) >> 12) | 280 | #define DWC3_DEPCMD_STATUS(x) (((x) & DWC3_DEPCMD_STATUS_MASK) >> 12) |
267 | #define DWC3_DEPCMD_HIPRI_FORCERM (1 << 11) | 281 | #define DWC3_DEPCMD_HIPRI_FORCERM (1 << 11) |
268 | #define DWC3_DEPCMD_CMDACT (1 << 10) | 282 | #define DWC3_DEPCMD_CMDACT (1 << 10) |
269 | #define DWC3_DEPCMD_CMDIOC (1 << 8) | 283 | #define DWC3_DEPCMD_CMDIOC (1 << 8) |
@@ -288,7 +302,7 @@ | |||
288 | 302 | ||
289 | /* Structures */ | 303 | /* Structures */ |
290 | 304 | ||
291 | struct dwc3_trb_hw; | 305 | struct dwc3_trb; |
292 | 306 | ||
293 | /** | 307 | /** |
294 | * struct dwc3_event_buffer - Software event buffer representation | 308 | * struct dwc3_event_buffer - Software event buffer representation |
@@ -343,7 +357,7 @@ struct dwc3_ep { | |||
343 | struct list_head request_list; | 357 | struct list_head request_list; |
344 | struct list_head req_queued; | 358 | struct list_head req_queued; |
345 | 359 | ||
346 | struct dwc3_trb_hw *trb_pool; | 360 | struct dwc3_trb *trb_pool; |
347 | dma_addr_t trb_pool_dma; | 361 | dma_addr_t trb_pool_dma; |
348 | u32 free_slot; | 362 | u32 free_slot; |
349 | u32 busy_slot; | 363 | u32 busy_slot; |
@@ -418,102 +432,49 @@ enum dwc3_device_state { | |||
418 | DWC3_CONFIGURED_STATE, | 432 | DWC3_CONFIGURED_STATE, |
419 | }; | 433 | }; |
420 | 434 | ||
421 | /** | 435 | /* TRB Length, PCM and Status */ |
422 | * struct dwc3_trb - transfer request block | 436 | #define DWC3_TRB_SIZE_MASK (0x00ffffff) |
423 | * @bpl: lower 32bit of the buffer | 437 | #define DWC3_TRB_SIZE_LENGTH(n) ((n) & DWC3_TRB_SIZE_MASK) |
424 | * @bph: higher 32bit of the buffer | 438 | #define DWC3_TRB_SIZE_PCM1(n) (((n) & 0x03) << 24) |
425 | * @length: buffer size (up to 16mb - 1) | 439 | #define DWC3_TRB_SIZE_TRBSTS(n) (((n) & (0x0f << 28) >> 28)) |
426 | * @pcm1: packet count m1 | 440 | |
427 | * @trbsts: trb status | 441 | #define DWC3_TRBSTS_OK 0 |
428 | * 0 = ok | 442 | #define DWC3_TRBSTS_MISSED_ISOC 1 |
429 | * 1 = missed isoc | 443 | #define DWC3_TRBSTS_SETUP_PENDING 2 |
430 | * 2 = setup pending | 444 | |
431 | * @hwo: hardware owner of descriptor | 445 | /* TRB Control */ |
432 | * @lst: last trb | 446 | #define DWC3_TRB_CTRL_HWO (1 << 0) |
433 | * @chn: chain buffers | 447 | #define DWC3_TRB_CTRL_LST (1 << 1) |
434 | * @csp: continue on short packets (only supported on isoc eps) | 448 | #define DWC3_TRB_CTRL_CHN (1 << 2) |
435 | * @trbctl: trb control | 449 | #define DWC3_TRB_CTRL_CSP (1 << 3) |
436 | * 1 = normal | 450 | #define DWC3_TRB_CTRL_TRBCTL(n) (((n) & 0x3f) << 4) |
437 | * 2 = control-setup | 451 | #define DWC3_TRB_CTRL_ISP_IMI (1 << 10) |
438 | * 3 = control-status-2 | 452 | #define DWC3_TRB_CTRL_IOC (1 << 11) |
439 | * 4 = control-status-3 | 453 | #define DWC3_TRB_CTRL_SID_SOFN(n) (((n) & 0xffff) << 14) |
440 | * 5 = control-data (first trb of data stage) | 454 | |
441 | * 6 = isochronous-first (first trb of service interval) | 455 | #define DWC3_TRBCTL_NORMAL DWC3_TRB_CTRL_TRBCTL(1) |
442 | * 7 = isochronous | 456 | #define DWC3_TRBCTL_CONTROL_SETUP DWC3_TRB_CTRL_TRBCTL(2) |
443 | * 8 = link trb | 457 | #define DWC3_TRBCTL_CONTROL_STATUS2 DWC3_TRB_CTRL_TRBCTL(3) |
444 | * others = reserved | 458 | #define DWC3_TRBCTL_CONTROL_STATUS3 DWC3_TRB_CTRL_TRBCTL(4) |
445 | * @isp_imi: interrupt on short packet / interrupt on missed isoc | 459 | #define DWC3_TRBCTL_CONTROL_DATA DWC3_TRB_CTRL_TRBCTL(5) |
446 | * @ioc: interrupt on complete | 460 | #define DWC3_TRBCTL_ISOCHRONOUS_FIRST DWC3_TRB_CTRL_TRBCTL(6) |
447 | * @sid_sofn: Stream ID / SOF Number | 461 | #define DWC3_TRBCTL_ISOCHRONOUS DWC3_TRB_CTRL_TRBCTL(7) |
448 | */ | 462 | #define DWC3_TRBCTL_LINK_TRB DWC3_TRB_CTRL_TRBCTL(8) |
449 | struct dwc3_trb { | ||
450 | u64 bplh; | ||
451 | |||
452 | union { | ||
453 | struct { | ||
454 | u32 length:24; | ||
455 | u32 pcm1:2; | ||
456 | u32 reserved27_26:2; | ||
457 | u32 trbsts:4; | ||
458 | #define DWC3_TRB_STS_OKAY 0 | ||
459 | #define DWC3_TRB_STS_MISSED_ISOC 1 | ||
460 | #define DWC3_TRB_STS_SETUP_PENDING 2 | ||
461 | }; | ||
462 | u32 len_pcm; | ||
463 | }; | ||
464 | |||
465 | union { | ||
466 | struct { | ||
467 | u32 hwo:1; | ||
468 | u32 lst:1; | ||
469 | u32 chn:1; | ||
470 | u32 csp:1; | ||
471 | u32 trbctl:6; | ||
472 | u32 isp_imi:1; | ||
473 | u32 ioc:1; | ||
474 | u32 reserved13_12:2; | ||
475 | u32 sid_sofn:16; | ||
476 | u32 reserved31_30:2; | ||
477 | }; | ||
478 | u32 control; | ||
479 | }; | ||
480 | } __packed; | ||
481 | 463 | ||
482 | /** | 464 | /** |
483 | * struct dwc3_trb_hw - transfer request block (hw format) | 465 | * struct dwc3_trb - transfer request block (hw format) |
484 | * @bpl: DW0-3 | 466 | * @bpl: DW0-3 |
485 | * @bph: DW4-7 | 467 | * @bph: DW4-7 |
486 | * @size: DW8-B | 468 | * @size: DW8-B |
487 | * @trl: DWC-F | 469 | * @trl: DWC-F |
488 | */ | 470 | */ |
489 | struct dwc3_trb_hw { | 471 | struct dwc3_trb { |
490 | __le32 bpl; | 472 | u32 bpl; |
491 | __le32 bph; | 473 | u32 bph; |
492 | __le32 size; | 474 | u32 size; |
493 | __le32 ctrl; | 475 | u32 ctrl; |
494 | } __packed; | 476 | } __packed; |
495 | 477 | ||
496 | static inline void dwc3_trb_to_hw(struct dwc3_trb *nat, struct dwc3_trb_hw *hw) | ||
497 | { | ||
498 | hw->bpl = cpu_to_le32(lower_32_bits(nat->bplh)); | ||
499 | hw->bph = cpu_to_le32(upper_32_bits(nat->bplh)); | ||
500 | hw->size = cpu_to_le32p(&nat->len_pcm); | ||
501 | /* HWO is written last */ | ||
502 | hw->ctrl = cpu_to_le32p(&nat->control); | ||
503 | } | ||
504 | |||
505 | static inline void dwc3_trb_to_nat(struct dwc3_trb_hw *hw, struct dwc3_trb *nat) | ||
506 | { | ||
507 | u64 bplh; | ||
508 | |||
509 | bplh = le32_to_cpup(&hw->bpl); | ||
510 | bplh |= (u64) le32_to_cpup(&hw->bph) << 32; | ||
511 | nat->bplh = bplh; | ||
512 | |||
513 | nat->len_pcm = le32_to_cpup(&hw->size); | ||
514 | nat->control = le32_to_cpup(&hw->ctrl); | ||
515 | } | ||
516 | |||
517 | /** | 478 | /** |
518 | * dwc3_hwparams - copy of HWPARAMS registers | 479 | * dwc3_hwparams - copy of HWPARAMS registers |
519 | * @hwparams0 - GHWPARAMS0 | 480 | * @hwparams0 - GHWPARAMS0 |
@@ -546,8 +507,13 @@ struct dwc3_hwparams { | |||
546 | #define DWC3_MODE_DRD 2 | 507 | #define DWC3_MODE_DRD 2 |
547 | #define DWC3_MODE_HUB 3 | 508 | #define DWC3_MODE_HUB 3 |
548 | 509 | ||
510 | #define DWC3_MDWIDTH(n) (((n) & 0xff00) >> 8) | ||
511 | |||
549 | /* HWPARAMS1 */ | 512 | /* HWPARAMS1 */ |
550 | #define DWC3_NUM_INT(n) (((n) & (0x3f << 15)) >> 15) | 513 | #define DWC3_NUM_INT(n) (((n) & (0x3f << 15)) >> 15) |
514 | |||
515 | /* HWPARAMS7 */ | ||
516 | #define DWC3_RAM1_DEPTH(n) ((n) & 0xffff) | ||
551 | 517 | ||
552 | struct dwc3_request { | 518 | struct dwc3_request { |
553 | struct usb_request request; | 519 | struct usb_request request; |
@@ -555,7 +521,7 @@ struct dwc3_request { | |||
555 | struct dwc3_ep *dep; | 521 | struct dwc3_ep *dep; |
556 | 522 | ||
557 | u8 epnum; | 523 | u8 epnum; |
558 | struct dwc3_trb_hw *trb; | 524 | struct dwc3_trb *trb; |
559 | dma_addr_t trb_dma; | 525 | dma_addr_t trb_dma; |
560 | 526 | ||
561 | unsigned direction:1; | 527 | unsigned direction:1; |
@@ -572,7 +538,6 @@ struct dwc3_request { | |||
572 | * @ctrl_req_addr: dma address of ctrl_req | 538 | * @ctrl_req_addr: dma address of ctrl_req |
573 | * @ep0_trb: dma address of ep0_trb | 539 | * @ep0_trb: dma address of ep0_trb |
574 | * @ep0_usb_req: dummy req used while handling STD USB requests | 540 | * @ep0_usb_req: dummy req used while handling STD USB requests |
575 | * @setup_buf_addr: dma address of setup_buf | ||
576 | * @ep0_bounce_addr: dma address of ep0_bounce | 541 | * @ep0_bounce_addr: dma address of ep0_bounce |
577 | * @lock: for synchronizing | 542 | * @lock: for synchronizing |
578 | * @dev: pointer to our struct device | 543 | * @dev: pointer to our struct device |
@@ -594,6 +559,8 @@ struct dwc3_request { | |||
594 | * @ep0_expect_in: true when we expect a DATA IN transfer | 559 | * @ep0_expect_in: true when we expect a DATA IN transfer |
595 | * @start_config_issued: true when StartConfig command has been issued | 560 | * @start_config_issued: true when StartConfig command has been issued |
596 | * @setup_packet_pending: true when there's a Setup Packet in FIFO. Workaround | 561 | * @setup_packet_pending: true when there's a Setup Packet in FIFO. Workaround |
562 | * @needs_fifo_resize: not all users might want fifo resizing, flag it | ||
563 | * @resize_fifos: tells us it's ok to reconfigure our TxFIFO sizes. | ||
597 | * @ep0_next_event: hold the next expected event | 564 | * @ep0_next_event: hold the next expected event |
598 | * @ep0state: state of endpoint zero | 565 | * @ep0state: state of endpoint zero |
599 | * @link_state: link state | 566 | * @link_state: link state |
@@ -604,12 +571,11 @@ struct dwc3_request { | |||
604 | */ | 571 | */ |
605 | struct dwc3 { | 572 | struct dwc3 { |
606 | struct usb_ctrlrequest *ctrl_req; | 573 | struct usb_ctrlrequest *ctrl_req; |
607 | struct dwc3_trb_hw *ep0_trb; | 574 | struct dwc3_trb *ep0_trb; |
608 | void *ep0_bounce; | 575 | void *ep0_bounce; |
609 | u8 *setup_buf; | 576 | u8 *setup_buf; |
610 | dma_addr_t ctrl_req_addr; | 577 | dma_addr_t ctrl_req_addr; |
611 | dma_addr_t ep0_trb_addr; | 578 | dma_addr_t ep0_trb_addr; |
612 | dma_addr_t setup_buf_addr; | ||
613 | dma_addr_t ep0_bounce_addr; | 579 | dma_addr_t ep0_bounce_addr; |
614 | struct dwc3_request ep0_usb_req; | 580 | struct dwc3_request ep0_usb_req; |
615 | /* device lock */ | 581 | /* device lock */ |
@@ -651,6 +617,8 @@ struct dwc3 { | |||
651 | unsigned start_config_issued:1; | 617 | unsigned start_config_issued:1; |
652 | unsigned setup_packet_pending:1; | 618 | unsigned setup_packet_pending:1; |
653 | unsigned delayed_status:1; | 619 | unsigned delayed_status:1; |
620 | unsigned needs_fifo_resize:1; | ||
621 | unsigned resize_fifos:1; | ||
654 | 622 | ||
655 | enum dwc3_ep0_next ep0_next_event; | 623 | enum dwc3_ep0_next ep0_next_event; |
656 | enum dwc3_ep0_state ep0state; | 624 | enum dwc3_ep0_state ep0state; |
@@ -662,23 +630,13 @@ struct dwc3 { | |||
662 | 630 | ||
663 | struct dwc3_hwparams hwparams; | 631 | struct dwc3_hwparams hwparams; |
664 | struct dentry *root; | 632 | struct dentry *root; |
633 | |||
634 | u8 test_mode; | ||
635 | u8 test_mode_nr; | ||
665 | }; | 636 | }; |
666 | 637 | ||
667 | /* -------------------------------------------------------------------------- */ | 638 | /* -------------------------------------------------------------------------- */ |
668 | 639 | ||
669 | #define DWC3_TRBSTS_OK 0 | ||
670 | #define DWC3_TRBSTS_MISSED_ISOC 1 | ||
671 | #define DWC3_TRBSTS_SETUP_PENDING 2 | ||
672 | |||
673 | #define DWC3_TRBCTL_NORMAL 1 | ||
674 | #define DWC3_TRBCTL_CONTROL_SETUP 2 | ||
675 | #define DWC3_TRBCTL_CONTROL_STATUS2 3 | ||
676 | #define DWC3_TRBCTL_CONTROL_STATUS3 4 | ||
677 | #define DWC3_TRBCTL_CONTROL_DATA 5 | ||
678 | #define DWC3_TRBCTL_ISOCHRONOUS_FIRST 6 | ||
679 | #define DWC3_TRBCTL_ISOCHRONOUS 7 | ||
680 | #define DWC3_TRBCTL_LINK_TRB 8 | ||
681 | |||
682 | /* -------------------------------------------------------------------------- */ | 640 | /* -------------------------------------------------------------------------- */ |
683 | 641 | ||
684 | struct dwc3_event_type { | 642 | struct dwc3_event_type { |
@@ -719,9 +677,14 @@ struct dwc3_event_depevt { | |||
719 | u32 endpoint_event:4; | 677 | u32 endpoint_event:4; |
720 | u32 reserved11_10:2; | 678 | u32 reserved11_10:2; |
721 | u32 status:4; | 679 | u32 status:4; |
722 | #define DEPEVT_STATUS_BUSERR (1 << 0) | 680 | |
723 | #define DEPEVT_STATUS_SHORT (1 << 1) | 681 | /* Within XferNotReady */ |
724 | #define DEPEVT_STATUS_IOC (1 << 2) | 682 | #define DEPEVT_STATUS_TRANSFER_ACTIVE (1 << 3) |
683 | |||
684 | /* Within XferComplete */ | ||
685 | #define DEPEVT_STATUS_BUSERR (1 << 0) | ||
686 | #define DEPEVT_STATUS_SHORT (1 << 1) | ||
687 | #define DEPEVT_STATUS_IOC (1 << 2) | ||
725 | #define DEPEVT_STATUS_LST (1 << 3) | 688 | #define DEPEVT_STATUS_LST (1 << 3) |
726 | 689 | ||
727 | /* Stream event only */ | 690 | /* Stream event only */ |
@@ -807,6 +770,7 @@ union dwc3_event { | |||
807 | 770 | ||
808 | /* prototypes */ | 771 | /* prototypes */ |
809 | void dwc3_set_mode(struct dwc3 *dwc, u32 mode); | 772 | void dwc3_set_mode(struct dwc3 *dwc, u32 mode); |
773 | int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc); | ||
810 | 774 | ||
811 | int dwc3_host_init(struct dwc3 *dwc); | 775 | int dwc3_host_init(struct dwc3 *dwc); |
812 | void dwc3_host_exit(struct dwc3 *dwc); | 776 | void dwc3_host_exit(struct dwc3 *dwc); |
diff --git a/drivers/usb/dwc3/debugfs.c b/drivers/usb/dwc3/debugfs.c index 433c97c15fc5..d4a30f118724 100644 --- a/drivers/usb/dwc3/debugfs.c +++ b/drivers/usb/dwc3/debugfs.c | |||
@@ -46,6 +46,8 @@ | |||
46 | #include <linux/delay.h> | 46 | #include <linux/delay.h> |
47 | #include <linux/uaccess.h> | 47 | #include <linux/uaccess.h> |
48 | 48 | ||
49 | #include <linux/usb/ch9.h> | ||
50 | |||
49 | #include "core.h" | 51 | #include "core.h" |
50 | #include "gadget.h" | 52 | #include "gadget.h" |
51 | #include "io.h" | 53 | #include "io.h" |
@@ -464,6 +466,192 @@ static const struct file_operations dwc3_mode_fops = { | |||
464 | .release = single_release, | 466 | .release = single_release, |
465 | }; | 467 | }; |
466 | 468 | ||
469 | static int dwc3_testmode_show(struct seq_file *s, void *unused) | ||
470 | { | ||
471 | struct dwc3 *dwc = s->private; | ||
472 | unsigned long flags; | ||
473 | u32 reg; | ||
474 | |||
475 | spin_lock_irqsave(&dwc->lock, flags); | ||
476 | reg = dwc3_readl(dwc->regs, DWC3_DCTL); | ||
477 | reg &= DWC3_DCTL_TSTCTRL_MASK; | ||
478 | reg >>= 1; | ||
479 | spin_unlock_irqrestore(&dwc->lock, flags); | ||
480 | |||
481 | switch (reg) { | ||
482 | case 0: | ||
483 | seq_printf(s, "no test\n"); | ||
484 | break; | ||
485 | case TEST_J: | ||
486 | seq_printf(s, "test_j\n"); | ||
487 | break; | ||
488 | case TEST_K: | ||
489 | seq_printf(s, "test_k\n"); | ||
490 | break; | ||
491 | case TEST_SE0_NAK: | ||
492 | seq_printf(s, "test_se0_nak\n"); | ||
493 | break; | ||
494 | case TEST_PACKET: | ||
495 | seq_printf(s, "test_packet\n"); | ||
496 | break; | ||
497 | case TEST_FORCE_EN: | ||
498 | seq_printf(s, "test_force_enable\n"); | ||
499 | break; | ||
500 | default: | ||
501 | seq_printf(s, "UNKNOWN %d\n", reg); | ||
502 | } | ||
503 | |||
504 | return 0; | ||
505 | } | ||
506 | |||
507 | static int dwc3_testmode_open(struct inode *inode, struct file *file) | ||
508 | { | ||
509 | return single_open(file, dwc3_testmode_show, inode->i_private); | ||
510 | } | ||
511 | |||
512 | static ssize_t dwc3_testmode_write(struct file *file, | ||
513 | const char __user *ubuf, size_t count, loff_t *ppos) | ||
514 | { | ||
515 | struct seq_file *s = file->private_data; | ||
516 | struct dwc3 *dwc = s->private; | ||
517 | unsigned long flags; | ||
518 | u32 testmode = 0; | ||
519 | char buf[32]; | ||
520 | |||
521 | if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count))) | ||
522 | return -EFAULT; | ||
523 | |||
524 | if (!strncmp(buf, "test_j", 6)) | ||
525 | testmode = TEST_J; | ||
526 | else if (!strncmp(buf, "test_k", 6)) | ||
527 | testmode = TEST_K; | ||
528 | else if (!strncmp(buf, "test_se0_nak", 12)) | ||
529 | testmode = TEST_SE0_NAK; | ||
530 | else if (!strncmp(buf, "test_packet", 11)) | ||
531 | testmode = TEST_PACKET; | ||
532 | else if (!strncmp(buf, "test_force_enable", 17)) | ||
533 | testmode = TEST_FORCE_EN; | ||
534 | else | ||
535 | testmode = 0; | ||
536 | |||
537 | spin_lock_irqsave(&dwc->lock, flags); | ||
538 | dwc3_gadget_set_test_mode(dwc, testmode); | ||
539 | spin_unlock_irqrestore(&dwc->lock, flags); | ||
540 | |||
541 | return count; | ||
542 | } | ||
543 | |||
544 | static const struct file_operations dwc3_testmode_fops = { | ||
545 | .open = dwc3_testmode_open, | ||
546 | .write = dwc3_testmode_write, | ||
547 | .read = seq_read, | ||
548 | .llseek = seq_lseek, | ||
549 | .release = single_release, | ||
550 | }; | ||
551 | |||
552 | static int dwc3_link_state_show(struct seq_file *s, void *unused) | ||
553 | { | ||
554 | struct dwc3 *dwc = s->private; | ||
555 | unsigned long flags; | ||
556 | enum dwc3_link_state state; | ||
557 | u32 reg; | ||
558 | |||
559 | spin_lock_irqsave(&dwc->lock, flags); | ||
560 | reg = dwc3_readl(dwc->regs, DWC3_DSTS); | ||
561 | state = DWC3_DSTS_USBLNKST(reg); | ||
562 | spin_unlock_irqrestore(&dwc->lock, flags); | ||
563 | |||
564 | switch (state) { | ||
565 | case DWC3_LINK_STATE_U0: | ||
566 | seq_printf(s, "U0\n"); | ||
567 | break; | ||
568 | case DWC3_LINK_STATE_U1: | ||
569 | seq_printf(s, "U1\n"); | ||
570 | break; | ||
571 | case DWC3_LINK_STATE_U2: | ||
572 | seq_printf(s, "U2\n"); | ||
573 | break; | ||
574 | case DWC3_LINK_STATE_U3: | ||
575 | seq_printf(s, "U3\n"); | ||
576 | break; | ||
577 | case DWC3_LINK_STATE_SS_DIS: | ||
578 | seq_printf(s, "SS.Disabled\n"); | ||
579 | break; | ||
580 | case DWC3_LINK_STATE_RX_DET: | ||
581 | seq_printf(s, "Rx.Detect\n"); | ||
582 | break; | ||
583 | case DWC3_LINK_STATE_SS_INACT: | ||
584 | seq_printf(s, "SS.Inactive\n"); | ||
585 | break; | ||
586 | case DWC3_LINK_STATE_POLL: | ||
587 | seq_printf(s, "Poll\n"); | ||
588 | break; | ||
589 | case DWC3_LINK_STATE_RECOV: | ||
590 | seq_printf(s, "Recovery\n"); | ||
591 | break; | ||
592 | case DWC3_LINK_STATE_HRESET: | ||
593 | seq_printf(s, "HRESET\n"); | ||
594 | break; | ||
595 | case DWC3_LINK_STATE_CMPLY: | ||
596 | seq_printf(s, "Compliance\n"); | ||
597 | break; | ||
598 | case DWC3_LINK_STATE_LPBK: | ||
599 | seq_printf(s, "Loopback\n"); | ||
600 | break; | ||
601 | default: | ||
602 | seq_printf(s, "UNKNOWN %d\n", reg); | ||
603 | } | ||
604 | |||
605 | return 0; | ||
606 | } | ||
607 | |||
608 | static int dwc3_link_state_open(struct inode *inode, struct file *file) | ||
609 | { | ||
610 | return single_open(file, dwc3_link_state_show, inode->i_private); | ||
611 | } | ||
612 | |||
613 | static ssize_t dwc3_link_state_write(struct file *file, | ||
614 | const char __user *ubuf, size_t count, loff_t *ppos) | ||
615 | { | ||
616 | struct seq_file *s = file->private_data; | ||
617 | struct dwc3 *dwc = s->private; | ||
618 | unsigned long flags; | ||
619 | enum dwc3_link_state state = 0; | ||
620 | char buf[32]; | ||
621 | |||
622 | if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count))) | ||
623 | return -EFAULT; | ||
624 | |||
625 | if (!strncmp(buf, "SS.Disabled", 11)) | ||
626 | state = DWC3_LINK_STATE_SS_DIS; | ||
627 | else if (!strncmp(buf, "Rx.Detect", 9)) | ||
628 | state = DWC3_LINK_STATE_RX_DET; | ||
629 | else if (!strncmp(buf, "SS.Inactive", 11)) | ||
630 | state = DWC3_LINK_STATE_SS_INACT; | ||
631 | else if (!strncmp(buf, "Recovery", 8)) | ||
632 | state = DWC3_LINK_STATE_RECOV; | ||
633 | else if (!strncmp(buf, "Compliance", 10)) | ||
634 | state = DWC3_LINK_STATE_CMPLY; | ||
635 | else if (!strncmp(buf, "Loopback", 8)) | ||
636 | state = DWC3_LINK_STATE_LPBK; | ||
637 | else | ||
638 | return -EINVAL; | ||
639 | |||
640 | spin_lock_irqsave(&dwc->lock, flags); | ||
641 | dwc3_gadget_set_link_state(dwc, state); | ||
642 | spin_unlock_irqrestore(&dwc->lock, flags); | ||
643 | |||
644 | return count; | ||
645 | } | ||
646 | |||
647 | static const struct file_operations dwc3_link_state_fops = { | ||
648 | .open = dwc3_link_state_open, | ||
649 | .write = dwc3_link_state_write, | ||
650 | .read = seq_read, | ||
651 | .llseek = seq_lseek, | ||
652 | .release = single_release, | ||
653 | }; | ||
654 | |||
467 | int __devinit dwc3_debugfs_init(struct dwc3 *dwc) | 655 | int __devinit dwc3_debugfs_init(struct dwc3 *dwc) |
468 | { | 656 | { |
469 | struct dentry *root; | 657 | struct dentry *root; |
@@ -471,8 +659,8 @@ int __devinit dwc3_debugfs_init(struct dwc3 *dwc) | |||
471 | int ret; | 659 | int ret; |
472 | 660 | ||
473 | root = debugfs_create_dir(dev_name(dwc->dev), NULL); | 661 | root = debugfs_create_dir(dev_name(dwc->dev), NULL); |
474 | if (IS_ERR(root)) { | 662 | if (!root) { |
475 | ret = PTR_ERR(root); | 663 | ret = -ENOMEM; |
476 | goto err0; | 664 | goto err0; |
477 | } | 665 | } |
478 | 666 | ||
@@ -480,15 +668,29 @@ int __devinit dwc3_debugfs_init(struct dwc3 *dwc) | |||
480 | 668 | ||
481 | file = debugfs_create_file("regdump", S_IRUGO, root, dwc, | 669 | file = debugfs_create_file("regdump", S_IRUGO, root, dwc, |
482 | &dwc3_regdump_fops); | 670 | &dwc3_regdump_fops); |
483 | if (IS_ERR(file)) { | 671 | if (!file) { |
484 | ret = PTR_ERR(file); | 672 | ret = -ENOMEM; |
485 | goto err1; | 673 | goto err1; |
486 | } | 674 | } |
487 | 675 | ||
488 | file = debugfs_create_file("mode", S_IRUGO | S_IWUSR, root, | 676 | file = debugfs_create_file("mode", S_IRUGO | S_IWUSR, root, |
489 | dwc, &dwc3_mode_fops); | 677 | dwc, &dwc3_mode_fops); |
490 | if (IS_ERR(file)) { | 678 | if (!file) { |
491 | ret = PTR_ERR(file); | 679 | ret = -ENOMEM; |
680 | goto err1; | ||
681 | } | ||
682 | |||
683 | file = debugfs_create_file("testmode", S_IRUGO | S_IWUSR, root, | ||
684 | dwc, &dwc3_testmode_fops); | ||
685 | if (!file) { | ||
686 | ret = -ENOMEM; | ||
687 | goto err1; | ||
688 | } | ||
689 | |||
690 | file = debugfs_create_file("link_state", S_IRUGO | S_IWUSR, root, | ||
691 | dwc, &dwc3_link_state_fops); | ||
692 | if (!file) { | ||
693 | ret = -ENOMEM; | ||
492 | goto err1; | 694 | goto err1; |
493 | } | 695 | } |
494 | 696 | ||
diff --git a/drivers/usb/dwc3/dwc3-exynos.c b/drivers/usb/dwc3/dwc3-exynos.c new file mode 100644 index 000000000000..d19030198086 --- /dev/null +++ b/drivers/usb/dwc3/dwc3-exynos.c | |||
@@ -0,0 +1,151 @@ | |||
1 | /** | ||
2 | * dwc3-exynos.c - Samsung EXYNOS DWC3 Specific Glue layer | ||
3 | * | ||
4 | * Copyright (c) 2012 Samsung Electronics Co., Ltd. | ||
5 | * http://www.samsung.com | ||
6 | * | ||
7 | * Author: Anton Tikhomirov <av.tikhomirov@samsung.com> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | */ | ||
14 | |||
15 | #include <linux/module.h> | ||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/slab.h> | ||
18 | #include <linux/platform_device.h> | ||
19 | #include <linux/platform_data/dwc3-exynos.h> | ||
20 | #include <linux/dma-mapping.h> | ||
21 | #include <linux/module.h> | ||
22 | #include <linux/clk.h> | ||
23 | |||
24 | #include "core.h" | ||
25 | |||
26 | struct dwc3_exynos { | ||
27 | struct platform_device *dwc3; | ||
28 | struct device *dev; | ||
29 | |||
30 | struct clk *clk; | ||
31 | }; | ||
32 | |||
33 | static int __devinit dwc3_exynos_probe(struct platform_device *pdev) | ||
34 | { | ||
35 | struct dwc3_exynos_data *pdata = pdev->dev.platform_data; | ||
36 | struct platform_device *dwc3; | ||
37 | struct dwc3_exynos *exynos; | ||
38 | struct clk *clk; | ||
39 | |||
40 | int devid; | ||
41 | int ret = -ENOMEM; | ||
42 | |||
43 | exynos = kzalloc(sizeof(*exynos), GFP_KERNEL); | ||
44 | if (!exynos) { | ||
45 | dev_err(&pdev->dev, "not enough memory\n"); | ||
46 | goto err0; | ||
47 | } | ||
48 | |||
49 | platform_set_drvdata(pdev, exynos); | ||
50 | |||
51 | devid = dwc3_get_device_id(); | ||
52 | if (devid < 0) | ||
53 | goto err1; | ||
54 | |||
55 | dwc3 = platform_device_alloc("dwc3", devid); | ||
56 | if (!dwc3) { | ||
57 | dev_err(&pdev->dev, "couldn't allocate dwc3 device\n"); | ||
58 | goto err2; | ||
59 | } | ||
60 | |||
61 | clk = clk_get(&pdev->dev, "usbdrd30"); | ||
62 | if (IS_ERR(clk)) { | ||
63 | dev_err(&pdev->dev, "couldn't get clock\n"); | ||
64 | ret = -EINVAL; | ||
65 | goto err3; | ||
66 | } | ||
67 | |||
68 | dma_set_coherent_mask(&dwc3->dev, pdev->dev.coherent_dma_mask); | ||
69 | |||
70 | dwc3->dev.parent = &pdev->dev; | ||
71 | dwc3->dev.dma_mask = pdev->dev.dma_mask; | ||
72 | dwc3->dev.dma_parms = pdev->dev.dma_parms; | ||
73 | exynos->dwc3 = dwc3; | ||
74 | exynos->dev = &pdev->dev; | ||
75 | exynos->clk = clk; | ||
76 | |||
77 | clk_enable(exynos->clk); | ||
78 | |||
79 | /* PHY initialization */ | ||
80 | if (!pdata) { | ||
81 | dev_dbg(&pdev->dev, "missing platform data\n"); | ||
82 | } else { | ||
83 | if (pdata->phy_init) | ||
84 | pdata->phy_init(pdev, pdata->phy_type); | ||
85 | } | ||
86 | |||
87 | ret = platform_device_add_resources(dwc3, pdev->resource, | ||
88 | pdev->num_resources); | ||
89 | if (ret) { | ||
90 | dev_err(&pdev->dev, "couldn't add resources to dwc3 device\n"); | ||
91 | goto err4; | ||
92 | } | ||
93 | |||
94 | ret = platform_device_add(dwc3); | ||
95 | if (ret) { | ||
96 | dev_err(&pdev->dev, "failed to register dwc3 device\n"); | ||
97 | goto err4; | ||
98 | } | ||
99 | |||
100 | return 0; | ||
101 | |||
102 | err4: | ||
103 | if (pdata && pdata->phy_exit) | ||
104 | pdata->phy_exit(pdev, pdata->phy_type); | ||
105 | |||
106 | clk_disable(clk); | ||
107 | clk_put(clk); | ||
108 | err3: | ||
109 | platform_device_put(dwc3); | ||
110 | err2: | ||
111 | dwc3_put_device_id(devid); | ||
112 | err1: | ||
113 | kfree(exynos); | ||
114 | err0: | ||
115 | return ret; | ||
116 | } | ||
117 | |||
118 | static int __devexit dwc3_exynos_remove(struct platform_device *pdev) | ||
119 | { | ||
120 | struct dwc3_exynos *exynos = platform_get_drvdata(pdev); | ||
121 | struct dwc3_exynos_data *pdata = pdev->dev.platform_data; | ||
122 | |||
123 | platform_device_unregister(exynos->dwc3); | ||
124 | |||
125 | dwc3_put_device_id(exynos->dwc3->id); | ||
126 | |||
127 | if (pdata && pdata->phy_exit) | ||
128 | pdata->phy_exit(pdev, pdata->phy_type); | ||
129 | |||
130 | clk_disable(exynos->clk); | ||
131 | clk_put(exynos->clk); | ||
132 | |||
133 | kfree(exynos); | ||
134 | |||
135 | return 0; | ||
136 | } | ||
137 | |||
138 | static struct platform_driver dwc3_exynos_driver = { | ||
139 | .probe = dwc3_exynos_probe, | ||
140 | .remove = __devexit_p(dwc3_exynos_remove), | ||
141 | .driver = { | ||
142 | .name = "exynos-dwc3", | ||
143 | }, | ||
144 | }; | ||
145 | |||
146 | module_platform_driver(dwc3_exynos_driver); | ||
147 | |||
148 | MODULE_ALIAS("platform:exynos-dwc3"); | ||
149 | MODULE_AUTHOR("Anton Tikhomirov <av.tikhomirov@samsung.com>"); | ||
150 | MODULE_LICENSE("GPL"); | ||
151 | MODULE_DESCRIPTION("DesignWare USB3 EXYNOS Glue Layer"); | ||
diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c index 3274ac8f1200..d7d9c0ec9515 100644 --- a/drivers/usb/dwc3/dwc3-omap.c +++ b/drivers/usb/dwc3/dwc3-omap.c | |||
@@ -46,7 +46,7 @@ | |||
46 | #include <linux/dma-mapping.h> | 46 | #include <linux/dma-mapping.h> |
47 | #include <linux/ioport.h> | 47 | #include <linux/ioport.h> |
48 | #include <linux/io.h> | 48 | #include <linux/io.h> |
49 | #include <linux/module.h> | 49 | #include <linux/of.h> |
50 | 50 | ||
51 | #include "core.h" | 51 | #include "core.h" |
52 | #include "io.h" | 52 | #include "io.h" |
@@ -197,91 +197,99 @@ static irqreturn_t dwc3_omap_interrupt(int irq, void *_omap) | |||
197 | static int __devinit dwc3_omap_probe(struct platform_device *pdev) | 197 | static int __devinit dwc3_omap_probe(struct platform_device *pdev) |
198 | { | 198 | { |
199 | struct dwc3_omap_data *pdata = pdev->dev.platform_data; | 199 | struct dwc3_omap_data *pdata = pdev->dev.platform_data; |
200 | struct device_node *node = pdev->dev.of_node; | ||
201 | |||
200 | struct platform_device *dwc3; | 202 | struct platform_device *dwc3; |
201 | struct dwc3_omap *omap; | 203 | struct dwc3_omap *omap; |
202 | struct resource *res; | 204 | struct resource *res; |
205 | struct device *dev = &pdev->dev; | ||
203 | 206 | ||
204 | int devid; | 207 | int devid; |
208 | int size; | ||
205 | int ret = -ENOMEM; | 209 | int ret = -ENOMEM; |
206 | int irq; | 210 | int irq; |
207 | 211 | ||
212 | const u32 *utmi_mode; | ||
208 | u32 reg; | 213 | u32 reg; |
209 | 214 | ||
210 | void __iomem *base; | 215 | void __iomem *base; |
211 | void *context; | 216 | void *context; |
212 | 217 | ||
213 | omap = kzalloc(sizeof(*omap), GFP_KERNEL); | 218 | omap = devm_kzalloc(dev, sizeof(*omap), GFP_KERNEL); |
214 | if (!omap) { | 219 | if (!omap) { |
215 | dev_err(&pdev->dev, "not enough memory\n"); | 220 | dev_err(dev, "not enough memory\n"); |
216 | goto err0; | 221 | return -ENOMEM; |
217 | } | 222 | } |
218 | 223 | ||
219 | platform_set_drvdata(pdev, omap); | 224 | platform_set_drvdata(pdev, omap); |
220 | 225 | ||
221 | irq = platform_get_irq(pdev, 1); | 226 | irq = platform_get_irq(pdev, 1); |
222 | if (irq < 0) { | 227 | if (irq < 0) { |
223 | dev_err(&pdev->dev, "missing IRQ resource\n"); | 228 | dev_err(dev, "missing IRQ resource\n"); |
224 | ret = -EINVAL; | 229 | return -EINVAL; |
225 | goto err1; | ||
226 | } | 230 | } |
227 | 231 | ||
228 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1); | 232 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1); |
229 | if (!res) { | 233 | if (!res) { |
230 | dev_err(&pdev->dev, "missing memory base resource\n"); | 234 | dev_err(dev, "missing memory base resource\n"); |
231 | ret = -EINVAL; | 235 | return -EINVAL; |
232 | goto err1; | ||
233 | } | 236 | } |
234 | 237 | ||
235 | base = ioremap_nocache(res->start, resource_size(res)); | 238 | base = devm_ioremap_nocache(dev, res->start, resource_size(res)); |
236 | if (!base) { | 239 | if (!base) { |
237 | dev_err(&pdev->dev, "ioremap failed\n"); | 240 | dev_err(dev, "ioremap failed\n"); |
238 | goto err1; | 241 | return -ENOMEM; |
239 | } | 242 | } |
240 | 243 | ||
241 | devid = dwc3_get_device_id(); | 244 | devid = dwc3_get_device_id(); |
242 | if (devid < 0) | 245 | if (devid < 0) |
243 | goto err2; | 246 | return -ENODEV; |
244 | 247 | ||
245 | dwc3 = platform_device_alloc("dwc3", devid); | 248 | dwc3 = platform_device_alloc("dwc3", devid); |
246 | if (!dwc3) { | 249 | if (!dwc3) { |
247 | dev_err(&pdev->dev, "couldn't allocate dwc3 device\n"); | 250 | dev_err(dev, "couldn't allocate dwc3 device\n"); |
248 | goto err3; | 251 | goto err1; |
249 | } | 252 | } |
250 | 253 | ||
251 | context = kzalloc(resource_size(res), GFP_KERNEL); | 254 | context = devm_kzalloc(dev, resource_size(res), GFP_KERNEL); |
252 | if (!context) { | 255 | if (!context) { |
253 | dev_err(&pdev->dev, "couldn't allocate dwc3 context memory\n"); | 256 | dev_err(dev, "couldn't allocate dwc3 context memory\n"); |
254 | goto err4; | 257 | goto err2; |
255 | } | 258 | } |
256 | 259 | ||
257 | spin_lock_init(&omap->lock); | 260 | spin_lock_init(&omap->lock); |
258 | dma_set_coherent_mask(&dwc3->dev, pdev->dev.coherent_dma_mask); | 261 | dma_set_coherent_mask(&dwc3->dev, dev->coherent_dma_mask); |
259 | 262 | ||
260 | dwc3->dev.parent = &pdev->dev; | 263 | dwc3->dev.parent = dev; |
261 | dwc3->dev.dma_mask = pdev->dev.dma_mask; | 264 | dwc3->dev.dma_mask = dev->dma_mask; |
262 | dwc3->dev.dma_parms = pdev->dev.dma_parms; | 265 | dwc3->dev.dma_parms = dev->dma_parms; |
263 | omap->resource_size = resource_size(res); | 266 | omap->resource_size = resource_size(res); |
264 | omap->context = context; | 267 | omap->context = context; |
265 | omap->dev = &pdev->dev; | 268 | omap->dev = dev; |
266 | omap->irq = irq; | 269 | omap->irq = irq; |
267 | omap->base = base; | 270 | omap->base = base; |
268 | omap->dwc3 = dwc3; | 271 | omap->dwc3 = dwc3; |
269 | 272 | ||
270 | reg = dwc3_readl(omap->base, USBOTGSS_UTMI_OTG_STATUS); | 273 | reg = dwc3_readl(omap->base, USBOTGSS_UTMI_OTG_STATUS); |
271 | 274 | ||
272 | if (!pdata) { | 275 | utmi_mode = of_get_property(node, "utmi-mode", &size); |
273 | dev_dbg(&pdev->dev, "missing platform data\n"); | 276 | if (utmi_mode && size == sizeof(*utmi_mode)) { |
277 | reg |= *utmi_mode; | ||
274 | } else { | 278 | } else { |
275 | switch (pdata->utmi_mode) { | 279 | if (!pdata) { |
276 | case DWC3_OMAP_UTMI_MODE_SW: | 280 | dev_dbg(dev, "missing platform data\n"); |
277 | reg |= USBOTGSS_UTMI_OTG_STATUS_SW_MODE; | 281 | } else { |
278 | break; | 282 | switch (pdata->utmi_mode) { |
279 | case DWC3_OMAP_UTMI_MODE_HW: | 283 | case DWC3_OMAP_UTMI_MODE_SW: |
280 | reg &= ~USBOTGSS_UTMI_OTG_STATUS_SW_MODE; | 284 | reg |= USBOTGSS_UTMI_OTG_STATUS_SW_MODE; |
281 | break; | 285 | break; |
282 | default: | 286 | case DWC3_OMAP_UTMI_MODE_HW: |
283 | dev_dbg(&pdev->dev, "UNKNOWN utmi mode %d\n", | 287 | reg &= ~USBOTGSS_UTMI_OTG_STATUS_SW_MODE; |
284 | pdata->utmi_mode); | 288 | break; |
289 | default: | ||
290 | dev_dbg(dev, "UNKNOWN utmi mode %d\n", | ||
291 | pdata->utmi_mode); | ||
292 | } | ||
285 | } | 293 | } |
286 | } | 294 | } |
287 | 295 | ||
@@ -300,12 +308,12 @@ static int __devinit dwc3_omap_probe(struct platform_device *pdev) | |||
300 | 308 | ||
301 | dwc3_writel(omap->base, USBOTGSS_SYSCONFIG, reg); | 309 | dwc3_writel(omap->base, USBOTGSS_SYSCONFIG, reg); |
302 | 310 | ||
303 | ret = request_irq(omap->irq, dwc3_omap_interrupt, 0, | 311 | ret = devm_request_irq(dev, omap->irq, dwc3_omap_interrupt, 0, |
304 | "dwc3-omap", omap); | 312 | "dwc3-omap", omap); |
305 | if (ret) { | 313 | if (ret) { |
306 | dev_err(&pdev->dev, "failed to request IRQ #%d --> %d\n", | 314 | dev_err(dev, "failed to request IRQ #%d --> %d\n", |
307 | omap->irq, ret); | 315 | omap->irq, ret); |
308 | goto err5; | 316 | goto err2; |
309 | } | 317 | } |
310 | 318 | ||
311 | /* enable all IRQs */ | 319 | /* enable all IRQs */ |
@@ -327,37 +335,24 @@ static int __devinit dwc3_omap_probe(struct platform_device *pdev) | |||
327 | ret = platform_device_add_resources(dwc3, pdev->resource, | 335 | ret = platform_device_add_resources(dwc3, pdev->resource, |
328 | pdev->num_resources); | 336 | pdev->num_resources); |
329 | if (ret) { | 337 | if (ret) { |
330 | dev_err(&pdev->dev, "couldn't add resources to dwc3 device\n"); | 338 | dev_err(dev, "couldn't add resources to dwc3 device\n"); |
331 | goto err6; | 339 | goto err2; |
332 | } | 340 | } |
333 | 341 | ||
334 | ret = platform_device_add(dwc3); | 342 | ret = platform_device_add(dwc3); |
335 | if (ret) { | 343 | if (ret) { |
336 | dev_err(&pdev->dev, "failed to register dwc3 device\n"); | 344 | dev_err(dev, "failed to register dwc3 device\n"); |
337 | goto err6; | 345 | goto err2; |
338 | } | 346 | } |
339 | 347 | ||
340 | return 0; | 348 | return 0; |
341 | 349 | ||
342 | err6: | ||
343 | free_irq(omap->irq, omap); | ||
344 | |||
345 | err5: | ||
346 | kfree(omap->context); | ||
347 | |||
348 | err4: | ||
349 | platform_device_put(dwc3); | ||
350 | |||
351 | err3: | ||
352 | dwc3_put_device_id(devid); | ||
353 | |||
354 | err2: | 350 | err2: |
355 | iounmap(base); | 351 | platform_device_put(dwc3); |
356 | 352 | ||
357 | err1: | 353 | err1: |
358 | kfree(omap); | 354 | dwc3_put_device_id(devid); |
359 | 355 | ||
360 | err0: | ||
361 | return ret; | 356 | return ret; |
362 | } | 357 | } |
363 | 358 | ||
@@ -368,11 +363,6 @@ static int __devexit dwc3_omap_remove(struct platform_device *pdev) | |||
368 | platform_device_unregister(omap->dwc3); | 363 | platform_device_unregister(omap->dwc3); |
369 | 364 | ||
370 | dwc3_put_device_id(omap->dwc3->id); | 365 | dwc3_put_device_id(omap->dwc3->id); |
371 | free_irq(omap->irq, omap); | ||
372 | iounmap(omap->base); | ||
373 | |||
374 | kfree(omap->context); | ||
375 | kfree(omap); | ||
376 | 366 | ||
377 | return 0; | 367 | return 0; |
378 | } | 368 | } |
diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c index c68e4270457a..a9ca9adba391 100644 --- a/drivers/usb/dwc3/dwc3-pci.c +++ b/drivers/usb/dwc3/dwc3-pci.c | |||
@@ -61,32 +61,36 @@ static int __devinit dwc3_pci_probe(struct pci_dev *pci, | |||
61 | struct dwc3_pci *glue; | 61 | struct dwc3_pci *glue; |
62 | int ret = -ENOMEM; | 62 | int ret = -ENOMEM; |
63 | int devid; | 63 | int devid; |
64 | struct device *dev = &pci->dev; | ||
64 | 65 | ||
65 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); | 66 | glue = devm_kzalloc(dev, sizeof(*glue), GFP_KERNEL); |
66 | if (!glue) { | 67 | if (!glue) { |
67 | dev_err(&pci->dev, "not enough memory\n"); | 68 | dev_err(dev, "not enough memory\n"); |
68 | goto err0; | 69 | return -ENOMEM; |
69 | } | 70 | } |
70 | 71 | ||
71 | glue->dev = &pci->dev; | 72 | glue->dev = dev; |
72 | 73 | ||
73 | ret = pci_enable_device(pci); | 74 | ret = pci_enable_device(pci); |
74 | if (ret) { | 75 | if (ret) { |
75 | dev_err(&pci->dev, "failed to enable pci device\n"); | 76 | dev_err(dev, "failed to enable pci device\n"); |
76 | goto err1; | 77 | return -ENODEV; |
77 | } | 78 | } |
78 | 79 | ||
79 | pci_set_power_state(pci, PCI_D0); | 80 | pci_set_power_state(pci, PCI_D0); |
80 | pci_set_master(pci); | 81 | pci_set_master(pci); |
81 | 82 | ||
82 | devid = dwc3_get_device_id(); | 83 | devid = dwc3_get_device_id(); |
83 | if (devid < 0) | 84 | if (devid < 0) { |
84 | goto err2; | 85 | ret = -ENOMEM; |
86 | goto err1; | ||
87 | } | ||
85 | 88 | ||
86 | dwc3 = platform_device_alloc("dwc3", devid); | 89 | dwc3 = platform_device_alloc("dwc3", devid); |
87 | if (!dwc3) { | 90 | if (!dwc3) { |
88 | dev_err(&pci->dev, "couldn't allocate dwc3 device\n"); | 91 | dev_err(dev, "couldn't allocate dwc3 device\n"); |
89 | goto err3; | 92 | ret = -ENOMEM; |
93 | goto err1; | ||
90 | } | 94 | } |
91 | 95 | ||
92 | memset(res, 0x00, sizeof(struct resource) * ARRAY_SIZE(res)); | 96 | memset(res, 0x00, sizeof(struct resource) * ARRAY_SIZE(res)); |
@@ -102,41 +106,37 @@ static int __devinit dwc3_pci_probe(struct pci_dev *pci, | |||
102 | 106 | ||
103 | ret = platform_device_add_resources(dwc3, res, ARRAY_SIZE(res)); | 107 | ret = platform_device_add_resources(dwc3, res, ARRAY_SIZE(res)); |
104 | if (ret) { | 108 | if (ret) { |
105 | dev_err(&pci->dev, "couldn't add resources to dwc3 device\n"); | 109 | dev_err(dev, "couldn't add resources to dwc3 device\n"); |
106 | goto err4; | 110 | goto err2; |
107 | } | 111 | } |
108 | 112 | ||
109 | pci_set_drvdata(pci, glue); | 113 | pci_set_drvdata(pci, glue); |
110 | 114 | ||
111 | dma_set_coherent_mask(&dwc3->dev, pci->dev.coherent_dma_mask); | 115 | dma_set_coherent_mask(&dwc3->dev, dev->coherent_dma_mask); |
112 | 116 | ||
113 | dwc3->dev.dma_mask = pci->dev.dma_mask; | 117 | dwc3->dev.dma_mask = dev->dma_mask; |
114 | dwc3->dev.dma_parms = pci->dev.dma_parms; | 118 | dwc3->dev.dma_parms = dev->dma_parms; |
115 | dwc3->dev.parent = &pci->dev; | 119 | dwc3->dev.parent = dev; |
116 | glue->dwc3 = dwc3; | 120 | glue->dwc3 = dwc3; |
117 | 121 | ||
118 | ret = platform_device_add(dwc3); | 122 | ret = platform_device_add(dwc3); |
119 | if (ret) { | 123 | if (ret) { |
120 | dev_err(&pci->dev, "failed to register dwc3 device\n"); | 124 | dev_err(dev, "failed to register dwc3 device\n"); |
121 | goto err4; | 125 | goto err3; |
122 | } | 126 | } |
123 | 127 | ||
124 | return 0; | 128 | return 0; |
125 | 129 | ||
126 | err4: | 130 | err3: |
127 | pci_set_drvdata(pci, NULL); | 131 | pci_set_drvdata(pci, NULL); |
128 | platform_device_put(dwc3); | 132 | platform_device_put(dwc3); |
129 | 133 | ||
130 | err3: | ||
131 | dwc3_put_device_id(devid); | ||
132 | |||
133 | err2: | 134 | err2: |
134 | pci_disable_device(pci); | 135 | dwc3_put_device_id(devid); |
135 | 136 | ||
136 | err1: | 137 | err1: |
137 | kfree(glue); | 138 | pci_disable_device(pci); |
138 | 139 | ||
139 | err0: | ||
140 | return ret; | 140 | return ret; |
141 | } | 141 | } |
142 | 142 | ||
@@ -148,7 +148,6 @@ static void __devexit dwc3_pci_remove(struct pci_dev *pci) | |||
148 | platform_device_unregister(glue->dwc3); | 148 | platform_device_unregister(glue->dwc3); |
149 | pci_set_drvdata(pci, NULL); | 149 | pci_set_drvdata(pci, NULL); |
150 | pci_disable_device(pci); | 150 | pci_disable_device(pci); |
151 | kfree(glue); | ||
152 | } | 151 | } |
153 | 152 | ||
154 | static DEFINE_PCI_DEVICE_TABLE(dwc3_pci_id_table) = { | 153 | static DEFINE_PCI_DEVICE_TABLE(dwc3_pci_id_table) = { |
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index c8df1dd967ef..25910e251c04 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c | |||
@@ -76,8 +76,7 @@ static int dwc3_ep0_start_trans(struct dwc3 *dwc, u8 epnum, dma_addr_t buf_dma, | |||
76 | u32 len, u32 type) | 76 | u32 len, u32 type) |
77 | { | 77 | { |
78 | struct dwc3_gadget_ep_cmd_params params; | 78 | struct dwc3_gadget_ep_cmd_params params; |
79 | struct dwc3_trb_hw *trb_hw; | 79 | struct dwc3_trb *trb; |
80 | struct dwc3_trb trb; | ||
81 | struct dwc3_ep *dep; | 80 | struct dwc3_ep *dep; |
82 | 81 | ||
83 | int ret; | 82 | int ret; |
@@ -88,19 +87,17 @@ static int dwc3_ep0_start_trans(struct dwc3 *dwc, u8 epnum, dma_addr_t buf_dma, | |||
88 | return 0; | 87 | return 0; |
89 | } | 88 | } |
90 | 89 | ||
91 | trb_hw = dwc->ep0_trb; | 90 | trb = dwc->ep0_trb; |
92 | memset(&trb, 0, sizeof(trb)); | ||
93 | 91 | ||
94 | trb.trbctl = type; | 92 | trb->bpl = lower_32_bits(buf_dma); |
95 | trb.bplh = buf_dma; | 93 | trb->bph = upper_32_bits(buf_dma); |
96 | trb.length = len; | 94 | trb->size = len; |
95 | trb->ctrl = type; | ||
97 | 96 | ||
98 | trb.hwo = 1; | 97 | trb->ctrl |= (DWC3_TRB_CTRL_HWO |
99 | trb.lst = 1; | 98 | | DWC3_TRB_CTRL_LST |
100 | trb.ioc = 1; | 99 | | DWC3_TRB_CTRL_IOC |
101 | trb.isp_imi = 1; | 100 | | DWC3_TRB_CTRL_ISP_IMI); |
102 | |||
103 | dwc3_trb_to_hw(&trb, trb_hw); | ||
104 | 101 | ||
105 | memset(¶ms, 0, sizeof(params)); | 102 | memset(¶ms, 0, sizeof(params)); |
106 | params.param0 = upper_32_bits(dwc->ep0_trb_addr); | 103 | params.param0 = upper_32_bits(dwc->ep0_trb_addr); |
@@ -302,7 +299,7 @@ static int dwc3_ep0_handle_status(struct dwc3 *dwc, | |||
302 | dep = dwc->eps[0]; | 299 | dep = dwc->eps[0]; |
303 | dwc->ep0_usb_req.dep = dep; | 300 | dwc->ep0_usb_req.dep = dep; |
304 | dwc->ep0_usb_req.request.length = sizeof(*response_pkt); | 301 | dwc->ep0_usb_req.request.length = sizeof(*response_pkt); |
305 | dwc->ep0_usb_req.request.dma = dwc->setup_buf_addr; | 302 | dwc->ep0_usb_req.request.buf = dwc->setup_buf; |
306 | dwc->ep0_usb_req.request.complete = dwc3_ep0_status_cmpl; | 303 | dwc->ep0_usb_req.request.complete = dwc3_ep0_status_cmpl; |
307 | 304 | ||
308 | return __dwc3_gadget_ep0_queue(dep, &dwc->ep0_usb_req); | 305 | return __dwc3_gadget_ep0_queue(dep, &dwc->ep0_usb_req); |
@@ -315,9 +312,7 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc, | |||
315 | u32 recip; | 312 | u32 recip; |
316 | u32 wValue; | 313 | u32 wValue; |
317 | u32 wIndex; | 314 | u32 wIndex; |
318 | u32 reg; | ||
319 | int ret; | 315 | int ret; |
320 | u32 mode; | ||
321 | 316 | ||
322 | wValue = le16_to_cpu(ctrl->wValue); | 317 | wValue = le16_to_cpu(ctrl->wValue); |
323 | wIndex = le16_to_cpu(ctrl->wIndex); | 318 | wIndex = le16_to_cpu(ctrl->wIndex); |
@@ -356,25 +351,8 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc, | |||
356 | if (!set) | 351 | if (!set) |
357 | return -EINVAL; | 352 | return -EINVAL; |
358 | 353 | ||
359 | mode = wIndex >> 8; | 354 | dwc->test_mode_nr = wIndex >> 8; |
360 | reg = dwc3_readl(dwc->regs, DWC3_DCTL); | 355 | dwc->test_mode = true; |
361 | reg &= ~DWC3_DCTL_TSTCTRL_MASK; | ||
362 | |||
363 | switch (mode) { | ||
364 | case TEST_J: | ||
365 | case TEST_K: | ||
366 | case TEST_SE0_NAK: | ||
367 | case TEST_PACKET: | ||
368 | case TEST_FORCE_EN: | ||
369 | reg |= mode << 1; | ||
370 | break; | ||
371 | default: | ||
372 | return -EINVAL; | ||
373 | } | ||
374 | dwc3_writel(dwc->regs, DWC3_DCTL, reg); | ||
375 | break; | ||
376 | default: | ||
377 | return -EINVAL; | ||
378 | } | 356 | } |
379 | break; | 357 | break; |
380 | 358 | ||
@@ -396,7 +374,7 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc, | |||
396 | case USB_RECIP_ENDPOINT: | 374 | case USB_RECIP_ENDPOINT: |
397 | switch (wValue) { | 375 | switch (wValue) { |
398 | case USB_ENDPOINT_HALT: | 376 | case USB_ENDPOINT_HALT: |
399 | dep = dwc3_wIndex_to_dep(dwc, wIndex); | 377 | dep = dwc3_wIndex_to_dep(dwc, wIndex); |
400 | if (!dep) | 378 | if (!dep) |
401 | return -EINVAL; | 379 | return -EINVAL; |
402 | ret = __dwc3_gadget_ep_set_halt(dep, set); | 380 | ret = __dwc3_gadget_ep_set_halt(dep, set); |
@@ -470,8 +448,11 @@ static int dwc3_ep0_set_config(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) | |||
470 | case DWC3_ADDRESS_STATE: | 448 | case DWC3_ADDRESS_STATE: |
471 | ret = dwc3_ep0_delegate_req(dwc, ctrl); | 449 | ret = dwc3_ep0_delegate_req(dwc, ctrl); |
472 | /* if the cfg matches and the cfg is non zero */ | 450 | /* if the cfg matches and the cfg is non zero */ |
473 | if (!ret && cfg) | 451 | if (cfg && (!ret || (ret == USB_GADGET_DELAYED_STATUS))) { |
474 | dwc->dev_state = DWC3_CONFIGURED_STATE; | 452 | dwc->dev_state = DWC3_CONFIGURED_STATE; |
453 | dwc->resize_fifos = true; | ||
454 | dev_dbg(dwc->dev, "resize fifos flag SET\n"); | ||
455 | } | ||
475 | break; | 456 | break; |
476 | 457 | ||
477 | case DWC3_CONFIGURED_STATE: | 458 | case DWC3_CONFIGURED_STATE: |
@@ -560,9 +541,10 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc, | |||
560 | { | 541 | { |
561 | struct dwc3_request *r = NULL; | 542 | struct dwc3_request *r = NULL; |
562 | struct usb_request *ur; | 543 | struct usb_request *ur; |
563 | struct dwc3_trb trb; | 544 | struct dwc3_trb *trb; |
564 | struct dwc3_ep *ep0; | 545 | struct dwc3_ep *ep0; |
565 | u32 transferred; | 546 | u32 transferred; |
547 | u32 length; | ||
566 | u8 epnum; | 548 | u8 epnum; |
567 | 549 | ||
568 | epnum = event->endpoint_number; | 550 | epnum = event->endpoint_number; |
@@ -573,16 +555,16 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc, | |||
573 | r = next_request(&ep0->request_list); | 555 | r = next_request(&ep0->request_list); |
574 | ur = &r->request; | 556 | ur = &r->request; |
575 | 557 | ||
576 | dwc3_trb_to_nat(dwc->ep0_trb, &trb); | 558 | trb = dwc->ep0_trb; |
559 | length = trb->size & DWC3_TRB_SIZE_MASK; | ||
577 | 560 | ||
578 | if (dwc->ep0_bounced) { | 561 | if (dwc->ep0_bounced) { |
579 | |||
580 | transferred = min_t(u32, ur->length, | 562 | transferred = min_t(u32, ur->length, |
581 | ep0->endpoint.maxpacket - trb.length); | 563 | ep0->endpoint.maxpacket - length); |
582 | memcpy(ur->buf, dwc->ep0_bounce, transferred); | 564 | memcpy(ur->buf, dwc->ep0_bounce, transferred); |
583 | dwc->ep0_bounced = false; | 565 | dwc->ep0_bounced = false; |
584 | } else { | 566 | } else { |
585 | transferred = ur->length - trb.length; | 567 | transferred = ur->length - length; |
586 | ur->actual += transferred; | 568 | ur->actual += transferred; |
587 | } | 569 | } |
588 | 570 | ||
@@ -614,6 +596,17 @@ static void dwc3_ep0_complete_req(struct dwc3 *dwc, | |||
614 | dwc3_gadget_giveback(dep, r, 0); | 596 | dwc3_gadget_giveback(dep, r, 0); |
615 | } | 597 | } |
616 | 598 | ||
599 | if (dwc->test_mode) { | ||
600 | int ret; | ||
601 | |||
602 | ret = dwc3_gadget_set_test_mode(dwc, dwc->test_mode_nr); | ||
603 | if (ret < 0) { | ||
604 | dev_dbg(dwc->dev, "Invalid Test #%d\n", | ||
605 | dwc->test_mode_nr); | ||
606 | dwc3_ep0_stall_and_restart(dwc); | ||
607 | } | ||
608 | } | ||
609 | |||
617 | dwc->ep0state = EP0_SETUP_PHASE; | 610 | dwc->ep0state = EP0_SETUP_PHASE; |
618 | dwc3_ep0_out_start(dwc); | 611 | dwc3_ep0_out_start(dwc); |
619 | } | 612 | } |
@@ -624,6 +617,7 @@ static void dwc3_ep0_xfer_complete(struct dwc3 *dwc, | |||
624 | struct dwc3_ep *dep = dwc->eps[event->endpoint_number]; | 617 | struct dwc3_ep *dep = dwc->eps[event->endpoint_number]; |
625 | 618 | ||
626 | dep->flags &= ~DWC3_EP_BUSY; | 619 | dep->flags &= ~DWC3_EP_BUSY; |
620 | dep->res_trans_idx = 0; | ||
627 | dwc->setup_packet_pending = false; | 621 | dwc->setup_packet_pending = false; |
628 | 622 | ||
629 | switch (dwc->ep0state) { | 623 | switch (dwc->ep0state) { |
@@ -679,7 +673,12 @@ static void dwc3_ep0_do_control_data(struct dwc3 *dwc, | |||
679 | DWC3_TRBCTL_CONTROL_DATA); | 673 | DWC3_TRBCTL_CONTROL_DATA); |
680 | } else if ((req->request.length % dep->endpoint.maxpacket) | 674 | } else if ((req->request.length % dep->endpoint.maxpacket) |
681 | && (event->endpoint_number == 0)) { | 675 | && (event->endpoint_number == 0)) { |
682 | dwc3_map_buffer_to_dma(req); | 676 | ret = usb_gadget_map_request(&dwc->gadget, &req->request, |
677 | event->endpoint_number); | ||
678 | if (ret) { | ||
679 | dev_dbg(dwc->dev, "failed to map request\n"); | ||
680 | return; | ||
681 | } | ||
683 | 682 | ||
684 | WARN_ON(req->request.length > dep->endpoint.maxpacket); | 683 | WARN_ON(req->request.length > dep->endpoint.maxpacket); |
685 | 684 | ||
@@ -694,7 +693,12 @@ static void dwc3_ep0_do_control_data(struct dwc3 *dwc, | |||
694 | dwc->ep0_bounce_addr, dep->endpoint.maxpacket, | 693 | dwc->ep0_bounce_addr, dep->endpoint.maxpacket, |
695 | DWC3_TRBCTL_CONTROL_DATA); | 694 | DWC3_TRBCTL_CONTROL_DATA); |
696 | } else { | 695 | } else { |
697 | dwc3_map_buffer_to_dma(req); | 696 | ret = usb_gadget_map_request(&dwc->gadget, &req->request, |
697 | event->endpoint_number); | ||
698 | if (ret) { | ||
699 | dev_dbg(dwc->dev, "failed to map request\n"); | ||
700 | return; | ||
701 | } | ||
698 | 702 | ||
699 | ret = dwc3_ep0_start_trans(dwc, event->endpoint_number, | 703 | ret = dwc3_ep0_start_trans(dwc, event->endpoint_number, |
700 | req->request.dma, req->request.length, | 704 | req->request.dma, req->request.length, |
@@ -720,6 +724,12 @@ static void dwc3_ep0_do_control_status(struct dwc3 *dwc, u32 epnum) | |||
720 | { | 724 | { |
721 | struct dwc3_ep *dep = dwc->eps[epnum]; | 725 | struct dwc3_ep *dep = dwc->eps[epnum]; |
722 | 726 | ||
727 | if (dwc->resize_fifos) { | ||
728 | dev_dbg(dwc->dev, "starting to resize fifos\n"); | ||
729 | dwc3_gadget_resize_tx_fifos(dwc); | ||
730 | dwc->resize_fifos = 0; | ||
731 | } | ||
732 | |||
723 | WARN_ON(dwc3_ep0_start_control_status(dep)); | 733 | WARN_ON(dwc3_ep0_start_control_status(dep)); |
724 | } | 734 | } |
725 | 735 | ||
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 064b6e2cd411..5255fe975ea1 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
@@ -54,68 +54,162 @@ | |||
54 | #include "gadget.h" | 54 | #include "gadget.h" |
55 | #include "io.h" | 55 | #include "io.h" |
56 | 56 | ||
57 | #define DMA_ADDR_INVALID (~(dma_addr_t)0) | 57 | /** |
58 | 58 | * dwc3_gadget_set_test_mode - Enables USB2 Test Modes | |
59 | void dwc3_map_buffer_to_dma(struct dwc3_request *req) | 59 | * @dwc: pointer to our context structure |
60 | * @mode: the mode to set (J, K SE0 NAK, Force Enable) | ||
61 | * | ||
62 | * Caller should take care of locking. This function will | ||
63 | * return 0 on success or -EINVAL if wrong Test Selector | ||
64 | * is passed | ||
65 | */ | ||
66 | int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode) | ||
60 | { | 67 | { |
61 | struct dwc3 *dwc = req->dep->dwc; | 68 | u32 reg; |
62 | 69 | ||
63 | if (req->request.length == 0) { | 70 | reg = dwc3_readl(dwc->regs, DWC3_DCTL); |
64 | /* req->request.dma = dwc->setup_buf_addr; */ | 71 | reg &= ~DWC3_DCTL_TSTCTRL_MASK; |
65 | return; | 72 | |
73 | switch (mode) { | ||
74 | case TEST_J: | ||
75 | case TEST_K: | ||
76 | case TEST_SE0_NAK: | ||
77 | case TEST_PACKET: | ||
78 | case TEST_FORCE_EN: | ||
79 | reg |= mode << 1; | ||
80 | break; | ||
81 | default: | ||
82 | return -EINVAL; | ||
66 | } | 83 | } |
67 | 84 | ||
68 | if (req->request.num_sgs) { | 85 | dwc3_writel(dwc->regs, DWC3_DCTL, reg); |
69 | int mapped; | ||
70 | 86 | ||
71 | mapped = dma_map_sg(dwc->dev, req->request.sg, | 87 | return 0; |
72 | req->request.num_sgs, | 88 | } |
73 | req->direction ? DMA_TO_DEVICE | ||
74 | : DMA_FROM_DEVICE); | ||
75 | if (mapped < 0) { | ||
76 | dev_err(dwc->dev, "failed to map SGs\n"); | ||
77 | return; | ||
78 | } | ||
79 | 89 | ||
80 | req->request.num_mapped_sgs = mapped; | 90 | /** |
81 | return; | 91 | * dwc3_gadget_set_link_state - Sets USB Link to a particular State |
82 | } | 92 | * @dwc: pointer to our context structure |
93 | * @state: the state to put link into | ||
94 | * | ||
95 | * Caller should take care of locking. This function will | ||
96 | * return 0 on success or -ETIMEDOUT. | ||
97 | */ | ||
98 | int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state) | ||
99 | { | ||
100 | int retries = 10000; | ||
101 | u32 reg; | ||
102 | |||
103 | reg = dwc3_readl(dwc->regs, DWC3_DCTL); | ||
104 | reg &= ~DWC3_DCTL_ULSTCHNGREQ_MASK; | ||
83 | 105 | ||
84 | if (req->request.dma == DMA_ADDR_INVALID) { | 106 | /* set requested state */ |
85 | req->request.dma = dma_map_single(dwc->dev, req->request.buf, | 107 | reg |= DWC3_DCTL_ULSTCHNGREQ(state); |
86 | req->request.length, req->direction | 108 | dwc3_writel(dwc->regs, DWC3_DCTL, reg); |
87 | ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | 109 | |
88 | req->mapped = true; | 110 | /* wait for a change in DSTS */ |
111 | while (--retries) { | ||
112 | reg = dwc3_readl(dwc->regs, DWC3_DSTS); | ||
113 | |||
114 | if (DWC3_DSTS_USBLNKST(reg) == state) | ||
115 | return 0; | ||
116 | |||
117 | udelay(5); | ||
89 | } | 118 | } |
119 | |||
120 | dev_vdbg(dwc->dev, "link state change request timed out\n"); | ||
121 | |||
122 | return -ETIMEDOUT; | ||
90 | } | 123 | } |
91 | 124 | ||
92 | void dwc3_unmap_buffer_from_dma(struct dwc3_request *req) | 125 | /** |
126 | * dwc3_gadget_resize_tx_fifos - reallocate fifo spaces for current use-case | ||
127 | * @dwc: pointer to our context structure | ||
128 | * | ||
129 | * This function will a best effort FIFO allocation in order | ||
130 | * to improve FIFO usage and throughput, while still allowing | ||
131 | * us to enable as many endpoints as possible. | ||
132 | * | ||
133 | * Keep in mind that this operation will be highly dependent | ||
134 | * on the configured size for RAM1 - which contains TxFifo -, | ||
135 | * the amount of endpoints enabled on coreConsultant tool, and | ||
136 | * the width of the Master Bus. | ||
137 | * | ||
138 | * In the ideal world, we would always be able to satisfy the | ||
139 | * following equation: | ||
140 | * | ||
141 | * ((512 + 2 * MDWIDTH-Bytes) + (Number of IN Endpoints - 1) * \ | ||
142 | * (3 * (1024 + MDWIDTH-Bytes) + MDWIDTH-Bytes)) / MDWIDTH-Bytes | ||
143 | * | ||
144 | * Unfortunately, due to many variables that's not always the case. | ||
145 | */ | ||
146 | int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc) | ||
93 | { | 147 | { |
94 | struct dwc3 *dwc = req->dep->dwc; | 148 | int last_fifo_depth = 0; |
149 | int ram1_depth; | ||
150 | int fifo_size; | ||
151 | int mdwidth; | ||
152 | int num; | ||
95 | 153 | ||
96 | if (req->request.length == 0) { | 154 | if (!dwc->needs_fifo_resize) |
97 | req->request.dma = DMA_ADDR_INVALID; | 155 | return 0; |
98 | return; | ||
99 | } | ||
100 | 156 | ||
101 | if (req->request.num_mapped_sgs) { | 157 | ram1_depth = DWC3_RAM1_DEPTH(dwc->hwparams.hwparams7); |
102 | req->request.dma = DMA_ADDR_INVALID; | 158 | mdwidth = DWC3_MDWIDTH(dwc->hwparams.hwparams0); |
103 | dma_unmap_sg(dwc->dev, req->request.sg, | ||
104 | req->request.num_mapped_sgs, | ||
105 | req->direction ? DMA_TO_DEVICE | ||
106 | : DMA_FROM_DEVICE); | ||
107 | 159 | ||
108 | req->request.num_mapped_sgs = 0; | 160 | /* MDWIDTH is represented in bits, we need it in bytes */ |
109 | return; | 161 | mdwidth >>= 3; |
110 | } | 162 | |
163 | /* | ||
164 | * FIXME For now we will only allocate 1 wMaxPacketSize space | ||
165 | * for each enabled endpoint, later patches will come to | ||
166 | * improve this algorithm so that we better use the internal | ||
167 | * FIFO space | ||
168 | */ | ||
169 | for (num = 0; num < DWC3_ENDPOINTS_NUM; num++) { | ||
170 | struct dwc3_ep *dep = dwc->eps[num]; | ||
171 | int fifo_number = dep->number >> 1; | ||
172 | int mult = 1; | ||
173 | int tmp; | ||
174 | |||
175 | if (!(dep->number & 1)) | ||
176 | continue; | ||
177 | |||
178 | if (!(dep->flags & DWC3_EP_ENABLED)) | ||
179 | continue; | ||
180 | |||
181 | if (usb_endpoint_xfer_bulk(dep->desc) | ||
182 | || usb_endpoint_xfer_isoc(dep->desc)) | ||
183 | mult = 3; | ||
184 | |||
185 | /* | ||
186 | * REVISIT: the following assumes we will always have enough | ||
187 | * space available on the FIFO RAM for all possible use cases. | ||
188 | * Make sure that's true somehow and change FIFO allocation | ||
189 | * accordingly. | ||
190 | * | ||
191 | * If we have Bulk or Isochronous endpoints, we want | ||
192 | * them to be able to be very, very fast. So we're giving | ||
193 | * those endpoints a fifo_size which is enough for 3 full | ||
194 | * packets | ||
195 | */ | ||
196 | tmp = mult * (dep->endpoint.maxpacket + mdwidth); | ||
197 | tmp += mdwidth; | ||
198 | |||
199 | fifo_size = DIV_ROUND_UP(tmp, mdwidth); | ||
200 | |||
201 | fifo_size |= (last_fifo_depth << 16); | ||
202 | |||
203 | dev_vdbg(dwc->dev, "%s: Fifo Addr %04x Size %d\n", | ||
204 | dep->name, last_fifo_depth, fifo_size & 0xffff); | ||
205 | |||
206 | dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(fifo_number), | ||
207 | fifo_size); | ||
111 | 208 | ||
112 | if (req->mapped) { | 209 | last_fifo_depth += (fifo_size & 0xffff); |
113 | dma_unmap_single(dwc->dev, req->request.dma, | ||
114 | req->request.length, req->direction | ||
115 | ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | ||
116 | req->mapped = 0; | ||
117 | req->request.dma = DMA_ADDR_INVALID; | ||
118 | } | 210 | } |
211 | |||
212 | return 0; | ||
119 | } | 213 | } |
120 | 214 | ||
121 | void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req, | 215 | void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req, |
@@ -144,14 +238,15 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req, | |||
144 | if (req->request.status == -EINPROGRESS) | 238 | if (req->request.status == -EINPROGRESS) |
145 | req->request.status = status; | 239 | req->request.status = status; |
146 | 240 | ||
147 | dwc3_unmap_buffer_from_dma(req); | 241 | usb_gadget_unmap_request(&dwc->gadget, &req->request, |
242 | req->direction); | ||
148 | 243 | ||
149 | dev_dbg(dwc->dev, "request %p from %s completed %d/%d ===> %d\n", | 244 | dev_dbg(dwc->dev, "request %p from %s completed %d/%d ===> %d\n", |
150 | req, dep->name, req->request.actual, | 245 | req, dep->name, req->request.actual, |
151 | req->request.length, status); | 246 | req->request.length, status); |
152 | 247 | ||
153 | spin_unlock(&dwc->lock); | 248 | spin_unlock(&dwc->lock); |
154 | req->request.complete(&req->dep->endpoint, &req->request); | 249 | req->request.complete(&dep->endpoint, &req->request); |
155 | spin_lock(&dwc->lock); | 250 | spin_lock(&dwc->lock); |
156 | } | 251 | } |
157 | 252 | ||
@@ -219,7 +314,7 @@ int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, | |||
219 | } | 314 | } |
220 | 315 | ||
221 | static dma_addr_t dwc3_trb_dma_offset(struct dwc3_ep *dep, | 316 | static dma_addr_t dwc3_trb_dma_offset(struct dwc3_ep *dep, |
222 | struct dwc3_trb_hw *trb) | 317 | struct dwc3_trb *trb) |
223 | { | 318 | { |
224 | u32 offset = (char *) trb - (char *) dep->trb_pool; | 319 | u32 offset = (char *) trb - (char *) dep->trb_pool; |
225 | 320 | ||
@@ -368,9 +463,8 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, | |||
368 | return ret; | 463 | return ret; |
369 | 464 | ||
370 | if (!(dep->flags & DWC3_EP_ENABLED)) { | 465 | if (!(dep->flags & DWC3_EP_ENABLED)) { |
371 | struct dwc3_trb_hw *trb_st_hw; | 466 | struct dwc3_trb *trb_st_hw; |
372 | struct dwc3_trb_hw *trb_link_hw; | 467 | struct dwc3_trb *trb_link; |
373 | struct dwc3_trb trb_link; | ||
374 | 468 | ||
375 | ret = dwc3_gadget_set_xfer_resource(dwc, dep); | 469 | ret = dwc3_gadget_set_xfer_resource(dwc, dep); |
376 | if (ret) | 470 | if (ret) |
@@ -390,15 +484,15 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, | |||
390 | 484 | ||
391 | memset(&trb_link, 0, sizeof(trb_link)); | 485 | memset(&trb_link, 0, sizeof(trb_link)); |
392 | 486 | ||
393 | /* Link TRB for ISOC. The HWO but is never reset */ | 487 | /* Link TRB for ISOC. The HWO bit is never reset */ |
394 | trb_st_hw = &dep->trb_pool[0]; | 488 | trb_st_hw = &dep->trb_pool[0]; |
395 | 489 | ||
396 | trb_link.bplh = dwc3_trb_dma_offset(dep, trb_st_hw); | 490 | trb_link = &dep->trb_pool[DWC3_TRB_NUM - 1]; |
397 | trb_link.trbctl = DWC3_TRBCTL_LINK_TRB; | ||
398 | trb_link.hwo = true; | ||
399 | 491 | ||
400 | trb_link_hw = &dep->trb_pool[DWC3_TRB_NUM - 1]; | 492 | trb_link->bpl = lower_32_bits(dwc3_trb_dma_offset(dep, trb_st_hw)); |
401 | dwc3_trb_to_hw(&trb_link, trb_link_hw); | 493 | trb_link->bph = upper_32_bits(dwc3_trb_dma_offset(dep, trb_st_hw)); |
494 | trb_link->ctrl |= DWC3_TRBCTL_LINK_TRB; | ||
495 | trb_link->ctrl |= DWC3_TRB_CTRL_HWO; | ||
402 | } | 496 | } |
403 | 497 | ||
404 | return 0; | 498 | return 0; |
@@ -440,6 +534,7 @@ static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep) | |||
440 | 534 | ||
441 | dep->stream_capable = false; | 535 | dep->stream_capable = false; |
442 | dep->desc = NULL; | 536 | dep->desc = NULL; |
537 | dep->endpoint.desc = NULL; | ||
443 | dep->comp_desc = NULL; | 538 | dep->comp_desc = NULL; |
444 | dep->type = 0; | 539 | dep->type = 0; |
445 | dep->flags = 0; | 540 | dep->flags = 0; |
@@ -485,16 +580,16 @@ static int dwc3_gadget_ep_enable(struct usb_ep *ep, | |||
485 | 580 | ||
486 | switch (usb_endpoint_type(desc)) { | 581 | switch (usb_endpoint_type(desc)) { |
487 | case USB_ENDPOINT_XFER_CONTROL: | 582 | case USB_ENDPOINT_XFER_CONTROL: |
488 | strncat(dep->name, "-control", sizeof(dep->name)); | 583 | strlcat(dep->name, "-control", sizeof(dep->name)); |
489 | break; | 584 | break; |
490 | case USB_ENDPOINT_XFER_ISOC: | 585 | case USB_ENDPOINT_XFER_ISOC: |
491 | strncat(dep->name, "-isoc", sizeof(dep->name)); | 586 | strlcat(dep->name, "-isoc", sizeof(dep->name)); |
492 | break; | 587 | break; |
493 | case USB_ENDPOINT_XFER_BULK: | 588 | case USB_ENDPOINT_XFER_BULK: |
494 | strncat(dep->name, "-bulk", sizeof(dep->name)); | 589 | strlcat(dep->name, "-bulk", sizeof(dep->name)); |
495 | break; | 590 | break; |
496 | case USB_ENDPOINT_XFER_INT: | 591 | case USB_ENDPOINT_XFER_INT: |
497 | strncat(dep->name, "-int", sizeof(dep->name)); | 592 | strlcat(dep->name, "-int", sizeof(dep->name)); |
498 | break; | 593 | break; |
499 | default: | 594 | default: |
500 | dev_err(dwc->dev, "invalid endpoint transfer type\n"); | 595 | dev_err(dwc->dev, "invalid endpoint transfer type\n"); |
@@ -562,7 +657,6 @@ static struct usb_request *dwc3_gadget_ep_alloc_request(struct usb_ep *ep, | |||
562 | 657 | ||
563 | req->epnum = dep->number; | 658 | req->epnum = dep->number; |
564 | req->dep = dep; | 659 | req->dep = dep; |
565 | req->request.dma = DMA_ADDR_INVALID; | ||
566 | 660 | ||
567 | return &req->request; | 661 | return &req->request; |
568 | } | 662 | } |
@@ -585,8 +679,7 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, | |||
585 | unsigned length, unsigned last, unsigned chain) | 679 | unsigned length, unsigned last, unsigned chain) |
586 | { | 680 | { |
587 | struct dwc3 *dwc = dep->dwc; | 681 | struct dwc3 *dwc = dep->dwc; |
588 | struct dwc3_trb_hw *trb_hw; | 682 | struct dwc3_trb *trb; |
589 | struct dwc3_trb trb; | ||
590 | 683 | ||
591 | unsigned int cur_slot; | 684 | unsigned int cur_slot; |
592 | 685 | ||
@@ -595,7 +688,7 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, | |||
595 | length, last ? " last" : "", | 688 | length, last ? " last" : "", |
596 | chain ? " chain" : ""); | 689 | chain ? " chain" : ""); |
597 | 690 | ||
598 | trb_hw = &dep->trb_pool[dep->free_slot & DWC3_TRB_MASK]; | 691 | trb = &dep->trb_pool[dep->free_slot & DWC3_TRB_MASK]; |
599 | cur_slot = dep->free_slot; | 692 | cur_slot = dep->free_slot; |
600 | dep->free_slot++; | 693 | dep->free_slot++; |
601 | 694 | ||
@@ -604,40 +697,32 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, | |||
604 | usb_endpoint_xfer_isoc(dep->desc)) | 697 | usb_endpoint_xfer_isoc(dep->desc)) |
605 | return; | 698 | return; |
606 | 699 | ||
607 | memset(&trb, 0, sizeof(trb)); | ||
608 | if (!req->trb) { | 700 | if (!req->trb) { |
609 | dwc3_gadget_move_request_queued(req); | 701 | dwc3_gadget_move_request_queued(req); |
610 | req->trb = trb_hw; | 702 | req->trb = trb; |
611 | req->trb_dma = dwc3_trb_dma_offset(dep, trb_hw); | 703 | req->trb_dma = dwc3_trb_dma_offset(dep, trb); |
612 | } | 704 | } |
613 | 705 | ||
614 | if (usb_endpoint_xfer_isoc(dep->desc)) { | 706 | trb->size = DWC3_TRB_SIZE_LENGTH(length); |
615 | trb.isp_imi = true; | 707 | trb->bpl = lower_32_bits(dma); |
616 | trb.csp = true; | 708 | trb->bph = upper_32_bits(dma); |
617 | } else { | ||
618 | trb.chn = chain; | ||
619 | trb.lst = last; | ||
620 | } | ||
621 | |||
622 | if (usb_endpoint_xfer_bulk(dep->desc) && dep->stream_capable) | ||
623 | trb.sid_sofn = req->request.stream_id; | ||
624 | 709 | ||
625 | switch (usb_endpoint_type(dep->desc)) { | 710 | switch (usb_endpoint_type(dep->desc)) { |
626 | case USB_ENDPOINT_XFER_CONTROL: | 711 | case USB_ENDPOINT_XFER_CONTROL: |
627 | trb.trbctl = DWC3_TRBCTL_CONTROL_SETUP; | 712 | trb->ctrl = DWC3_TRBCTL_CONTROL_SETUP; |
628 | break; | 713 | break; |
629 | 714 | ||
630 | case USB_ENDPOINT_XFER_ISOC: | 715 | case USB_ENDPOINT_XFER_ISOC: |
631 | trb.trbctl = DWC3_TRBCTL_ISOCHRONOUS_FIRST; | 716 | trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS_FIRST; |
632 | 717 | ||
633 | /* IOC every DWC3_TRB_NUM / 4 so we can refill */ | 718 | /* IOC every DWC3_TRB_NUM / 4 so we can refill */ |
634 | if (!(cur_slot % (DWC3_TRB_NUM / 4))) | 719 | if (!(cur_slot % (DWC3_TRB_NUM / 4))) |
635 | trb.ioc = last; | 720 | trb->ctrl |= DWC3_TRB_CTRL_IOC; |
636 | break; | 721 | break; |
637 | 722 | ||
638 | case USB_ENDPOINT_XFER_BULK: | 723 | case USB_ENDPOINT_XFER_BULK: |
639 | case USB_ENDPOINT_XFER_INT: | 724 | case USB_ENDPOINT_XFER_INT: |
640 | trb.trbctl = DWC3_TRBCTL_NORMAL; | 725 | trb->ctrl = DWC3_TRBCTL_NORMAL; |
641 | break; | 726 | break; |
642 | default: | 727 | default: |
643 | /* | 728 | /* |
@@ -647,11 +732,21 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, | |||
647 | BUG(); | 732 | BUG(); |
648 | } | 733 | } |
649 | 734 | ||
650 | trb.length = length; | 735 | if (usb_endpoint_xfer_isoc(dep->desc)) { |
651 | trb.bplh = dma; | 736 | trb->ctrl |= DWC3_TRB_CTRL_ISP_IMI; |
652 | trb.hwo = true; | 737 | trb->ctrl |= DWC3_TRB_CTRL_CSP; |
738 | } else { | ||
739 | if (chain) | ||
740 | trb->ctrl |= DWC3_TRB_CTRL_CHN; | ||
741 | |||
742 | if (last) | ||
743 | trb->ctrl |= DWC3_TRB_CTRL_LST; | ||
744 | } | ||
653 | 745 | ||
654 | dwc3_trb_to_hw(&trb, trb_hw); | 746 | if (usb_endpoint_xfer_bulk(dep->desc) && dep->stream_capable) |
747 | trb->ctrl |= DWC3_TRB_CTRL_SID_SOFN(req->request.stream_id); | ||
748 | |||
749 | trb->ctrl |= DWC3_TRB_CTRL_HWO; | ||
655 | } | 750 | } |
656 | 751 | ||
657 | /* | 752 | /* |
@@ -659,14 +754,15 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, | |||
659 | * @dep: endpoint for which requests are being prepared | 754 | * @dep: endpoint for which requests are being prepared |
660 | * @starting: true if the endpoint is idle and no requests are queued. | 755 | * @starting: true if the endpoint is idle and no requests are queued. |
661 | * | 756 | * |
662 | * The functions goes through the requests list and setups TRBs for the | 757 | * The function goes through the requests list and sets up TRBs for the |
663 | * transfers. The functions returns once there are not more TRBs available or | 758 | * transfers. The function returns once there are no more TRBs available or |
664 | * it run out of requests. | 759 | * it runs out of requests. |
665 | */ | 760 | */ |
666 | static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting) | 761 | static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting) |
667 | { | 762 | { |
668 | struct dwc3_request *req, *n; | 763 | struct dwc3_request *req, *n; |
669 | u32 trbs_left; | 764 | u32 trbs_left; |
765 | u32 max; | ||
670 | unsigned int last_one = 0; | 766 | unsigned int last_one = 0; |
671 | 767 | ||
672 | BUILD_BUG_ON_NOT_POWER_OF_2(DWC3_TRB_NUM); | 768 | BUILD_BUG_ON_NOT_POWER_OF_2(DWC3_TRB_NUM); |
@@ -674,9 +770,16 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting) | |||
674 | /* the first request must not be queued */ | 770 | /* the first request must not be queued */ |
675 | trbs_left = (dep->busy_slot - dep->free_slot) & DWC3_TRB_MASK; | 771 | trbs_left = (dep->busy_slot - dep->free_slot) & DWC3_TRB_MASK; |
676 | 772 | ||
773 | /* Can't wrap around on a non-isoc EP since there's no link TRB */ | ||
774 | if (!usb_endpoint_xfer_isoc(dep->desc)) { | ||
775 | max = DWC3_TRB_NUM - (dep->free_slot & DWC3_TRB_MASK); | ||
776 | if (trbs_left > max) | ||
777 | trbs_left = max; | ||
778 | } | ||
779 | |||
677 | /* | 780 | /* |
678 | * if busy & slot are equal than it is either full or empty. If we are | 781 | * If busy & slot are equal than it is either full or empty. If we are |
679 | * starting to proceed requests then we are empty. Otherwise we ar | 782 | * starting to process requests then we are empty. Otherwise we are |
680 | * full and don't do anything | 783 | * full and don't do anything |
681 | */ | 784 | */ |
682 | if (!trbs_left) { | 785 | if (!trbs_left) { |
@@ -687,7 +790,7 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting) | |||
687 | * In case we start from scratch, we queue the ISOC requests | 790 | * In case we start from scratch, we queue the ISOC requests |
688 | * starting from slot 1. This is done because we use ring | 791 | * starting from slot 1. This is done because we use ring |
689 | * buffer and have no LST bit to stop us. Instead, we place | 792 | * buffer and have no LST bit to stop us. Instead, we place |
690 | * IOC bit TRB_NUM/4. We try to avoid to having an interrupt | 793 | * IOC bit every TRB_NUM/4. We try to avoid having an interrupt |
691 | * after the first request so we start at slot 1 and have | 794 | * after the first request so we start at slot 1 and have |
692 | * 7 requests proceed before we hit the first IOC. | 795 | * 7 requests proceed before we hit the first IOC. |
693 | * Other transfer types don't use the ring buffer and are | 796 | * Other transfer types don't use the ring buffer and are |
@@ -723,8 +826,8 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting) | |||
723 | length = sg_dma_len(s); | 826 | length = sg_dma_len(s); |
724 | dma = sg_dma_address(s); | 827 | dma = sg_dma_address(s); |
725 | 828 | ||
726 | if (i == (request->num_mapped_sgs - 1) | 829 | if (i == (request->num_mapped_sgs - 1) || |
727 | || sg_is_last(s)) { | 830 | sg_is_last(s)) { |
728 | last_one = true; | 831 | last_one = true; |
729 | chain = false; | 832 | chain = false; |
730 | } | 833 | } |
@@ -792,8 +895,7 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep, u16 cmd_param, | |||
792 | dwc3_prepare_trbs(dep, start_new); | 895 | dwc3_prepare_trbs(dep, start_new); |
793 | 896 | ||
794 | /* | 897 | /* |
795 | * req points to the first request where HWO changed | 898 | * req points to the first request where HWO changed from 0 to 1 |
796 | * from 0 to 1 | ||
797 | */ | 899 | */ |
798 | req = next_request(&dep->req_queued); | 900 | req = next_request(&dep->req_queued); |
799 | } | 901 | } |
@@ -819,9 +921,10 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep, u16 cmd_param, | |||
819 | /* | 921 | /* |
820 | * FIXME we need to iterate over the list of requests | 922 | * FIXME we need to iterate over the list of requests |
821 | * here and stop, unmap, free and del each of the linked | 923 | * here and stop, unmap, free and del each of the linked |
822 | * requests instead of we do now. | 924 | * requests instead of what we do now. |
823 | */ | 925 | */ |
824 | dwc3_unmap_buffer_from_dma(req); | 926 | usb_gadget_unmap_request(&dwc->gadget, &req->request, |
927 | req->direction); | ||
825 | list_del(&req->list); | 928 | list_del(&req->list); |
826 | return ret; | 929 | return ret; |
827 | } | 930 | } |
@@ -837,6 +940,9 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep, u16 cmd_param, | |||
837 | 940 | ||
838 | static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) | 941 | static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) |
839 | { | 942 | { |
943 | struct dwc3 *dwc = dep->dwc; | ||
944 | int ret; | ||
945 | |||
840 | req->request.actual = 0; | 946 | req->request.actual = 0; |
841 | req->request.status = -EINPROGRESS; | 947 | req->request.status = -EINPROGRESS; |
842 | req->direction = dep->direction; | 948 | req->direction = dep->direction; |
@@ -852,9 +958,13 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) | |||
852 | * particular token from the Host side. | 958 | * particular token from the Host side. |
853 | * | 959 | * |
854 | * This will also avoid Host cancelling URBs due to too | 960 | * This will also avoid Host cancelling URBs due to too |
855 | * many NACKs. | 961 | * many NAKs. |
856 | */ | 962 | */ |
857 | dwc3_map_buffer_to_dma(req); | 963 | ret = usb_gadget_map_request(&dwc->gadget, &req->request, |
964 | dep->direction); | ||
965 | if (ret) | ||
966 | return ret; | ||
967 | |||
858 | list_add_tail(&req->list, &dep->request_list); | 968 | list_add_tail(&req->list, &dep->request_list); |
859 | 969 | ||
860 | /* | 970 | /* |
@@ -874,11 +984,11 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) | |||
874 | int start_trans; | 984 | int start_trans; |
875 | 985 | ||
876 | start_trans = 1; | 986 | start_trans = 1; |
877 | if (usb_endpoint_xfer_isoc(dep->endpoint.desc) && | 987 | if (usb_endpoint_xfer_isoc(dep->desc) && |
878 | dep->flags & DWC3_EP_BUSY) | 988 | (dep->flags & DWC3_EP_BUSY)) |
879 | start_trans = 0; | 989 | start_trans = 0; |
880 | 990 | ||
881 | ret = __dwc3_gadget_kick_transfer(dep, 0, start_trans); | 991 | ret = __dwc3_gadget_kick_transfer(dep, 0, start_trans); |
882 | if (ret && ret != -EBUSY) { | 992 | if (ret && ret != -EBUSY) { |
883 | struct dwc3 *dwc = dep->dwc; | 993 | struct dwc3 *dwc = dep->dwc; |
884 | 994 | ||
@@ -1031,8 +1141,12 @@ out: | |||
1031 | static int dwc3_gadget_ep_set_wedge(struct usb_ep *ep) | 1141 | static int dwc3_gadget_ep_set_wedge(struct usb_ep *ep) |
1032 | { | 1142 | { |
1033 | struct dwc3_ep *dep = to_dwc3_ep(ep); | 1143 | struct dwc3_ep *dep = to_dwc3_ep(ep); |
1144 | struct dwc3 *dwc = dep->dwc; | ||
1145 | unsigned long flags; | ||
1034 | 1146 | ||
1147 | spin_lock_irqsave(&dwc->lock, flags); | ||
1035 | dep->flags |= DWC3_EP_WEDGE; | 1148 | dep->flags |= DWC3_EP_WEDGE; |
1149 | spin_unlock_irqrestore(&dwc->lock, flags); | ||
1036 | 1150 | ||
1037 | return dwc3_gadget_ep_set_halt(ep, 1); | 1151 | return dwc3_gadget_ep_set_halt(ep, 1); |
1038 | } | 1152 | } |
@@ -1122,26 +1236,20 @@ static int dwc3_gadget_wakeup(struct usb_gadget *g) | |||
1122 | goto out; | 1236 | goto out; |
1123 | } | 1237 | } |
1124 | 1238 | ||
1125 | reg = dwc3_readl(dwc->regs, DWC3_DCTL); | 1239 | ret = dwc3_gadget_set_link_state(dwc, DWC3_LINK_STATE_RECOV); |
1126 | 1240 | if (ret < 0) { | |
1127 | /* | 1241 | dev_err(dwc->dev, "failed to put link in Recovery\n"); |
1128 | * Switch link state to Recovery. In HS/FS/LS this means | 1242 | goto out; |
1129 | * RemoteWakeup Request | 1243 | } |
1130 | */ | ||
1131 | reg |= DWC3_DCTL_ULSTCHNG_RECOVERY; | ||
1132 | dwc3_writel(dwc->regs, DWC3_DCTL, reg); | ||
1133 | |||
1134 | /* wait for at least 2000us */ | ||
1135 | usleep_range(2000, 2500); | ||
1136 | 1244 | ||
1137 | /* write zeroes to Link Change Request */ | 1245 | /* write zeroes to Link Change Request */ |
1138 | reg &= ~DWC3_DCTL_ULSTCHNGREQ_MASK; | 1246 | reg &= ~DWC3_DCTL_ULSTCHNGREQ_MASK; |
1139 | dwc3_writel(dwc->regs, DWC3_DCTL, reg); | 1247 | dwc3_writel(dwc->regs, DWC3_DCTL, reg); |
1140 | 1248 | ||
1141 | /* pool until Link State change to ON */ | 1249 | /* poll until Link State changes to ON */ |
1142 | timeout = jiffies + msecs_to_jiffies(100); | 1250 | timeout = jiffies + msecs_to_jiffies(100); |
1143 | 1251 | ||
1144 | while (!(time_after(jiffies, timeout))) { | 1252 | while (!time_after(jiffies, timeout)) { |
1145 | reg = dwc3_readl(dwc->regs, DWC3_DSTS); | 1253 | reg = dwc3_readl(dwc->regs, DWC3_DSTS); |
1146 | 1254 | ||
1147 | /* in HS, means ON */ | 1255 | /* in HS, means ON */ |
@@ -1164,8 +1272,11 @@ static int dwc3_gadget_set_selfpowered(struct usb_gadget *g, | |||
1164 | int is_selfpowered) | 1272 | int is_selfpowered) |
1165 | { | 1273 | { |
1166 | struct dwc3 *dwc = gadget_to_dwc(g); | 1274 | struct dwc3 *dwc = gadget_to_dwc(g); |
1275 | unsigned long flags; | ||
1167 | 1276 | ||
1277 | spin_lock_irqsave(&dwc->lock, flags); | ||
1168 | dwc->is_selfpowered = !!is_selfpowered; | 1278 | dwc->is_selfpowered = !!is_selfpowered; |
1279 | spin_unlock_irqrestore(&dwc->lock, flags); | ||
1169 | 1280 | ||
1170 | return 0; | 1281 | return 0; |
1171 | } | 1282 | } |
@@ -1176,10 +1287,13 @@ static void dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on) | |||
1176 | u32 timeout = 500; | 1287 | u32 timeout = 500; |
1177 | 1288 | ||
1178 | reg = dwc3_readl(dwc->regs, DWC3_DCTL); | 1289 | reg = dwc3_readl(dwc->regs, DWC3_DCTL); |
1179 | if (is_on) | 1290 | if (is_on) { |
1180 | reg |= DWC3_DCTL_RUN_STOP; | 1291 | reg &= ~DWC3_DCTL_TRGTULST_MASK; |
1181 | else | 1292 | reg |= (DWC3_DCTL_RUN_STOP |
1293 | | DWC3_DCTL_TRGTULST_RX_DET); | ||
1294 | } else { | ||
1182 | reg &= ~DWC3_DCTL_RUN_STOP; | 1295 | reg &= ~DWC3_DCTL_RUN_STOP; |
1296 | } | ||
1183 | 1297 | ||
1184 | dwc3_writel(dwc->regs, DWC3_DCTL, reg); | 1298 | dwc3_writel(dwc->regs, DWC3_DCTL, reg); |
1185 | 1299 | ||
@@ -1386,7 +1500,7 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep, | |||
1386 | const struct dwc3_event_depevt *event, int status) | 1500 | const struct dwc3_event_depevt *event, int status) |
1387 | { | 1501 | { |
1388 | struct dwc3_request *req; | 1502 | struct dwc3_request *req; |
1389 | struct dwc3_trb trb; | 1503 | struct dwc3_trb *trb; |
1390 | unsigned int count; | 1504 | unsigned int count; |
1391 | unsigned int s_pkt = 0; | 1505 | unsigned int s_pkt = 0; |
1392 | 1506 | ||
@@ -1397,20 +1511,20 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep, | |||
1397 | return 1; | 1511 | return 1; |
1398 | } | 1512 | } |
1399 | 1513 | ||
1400 | dwc3_trb_to_nat(req->trb, &trb); | 1514 | trb = req->trb; |
1401 | 1515 | ||
1402 | if (trb.hwo && status != -ESHUTDOWN) | 1516 | if ((trb->ctrl & DWC3_TRB_CTRL_HWO) && status != -ESHUTDOWN) |
1403 | /* | 1517 | /* |
1404 | * We continue despite the error. There is not much we | 1518 | * We continue despite the error. There is not much we |
1405 | * can do. If we don't clean in up we loop for ever. If | 1519 | * can do. If we don't clean it up we loop forever. If |
1406 | * we skip the TRB than it gets overwritten reused after | 1520 | * we skip the TRB then it gets overwritten after a |
1407 | * a while since we use them in a ring buffer. a BUG() | 1521 | * while since we use them in a ring buffer. A BUG() |
1408 | * would help. Lets hope that if this occures, someone | 1522 | * would help. Lets hope that if this occurs, someone |
1409 | * fixes the root cause instead of looking away :) | 1523 | * fixes the root cause instead of looking away :) |
1410 | */ | 1524 | */ |
1411 | dev_err(dwc->dev, "%s's TRB (%p) still owned by HW\n", | 1525 | dev_err(dwc->dev, "%s's TRB (%p) still owned by HW\n", |
1412 | dep->name, req->trb); | 1526 | dep->name, req->trb); |
1413 | count = trb.length; | 1527 | count = trb->size & DWC3_TRB_SIZE_MASK; |
1414 | 1528 | ||
1415 | if (dep->direction) { | 1529 | if (dep->direction) { |
1416 | if (count) { | 1530 | if (count) { |
@@ -1434,13 +1548,16 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep, | |||
1434 | dwc3_gadget_giveback(dep, req, status); | 1548 | dwc3_gadget_giveback(dep, req, status); |
1435 | if (s_pkt) | 1549 | if (s_pkt) |
1436 | break; | 1550 | break; |
1437 | if ((event->status & DEPEVT_STATUS_LST) && trb.lst) | 1551 | if ((event->status & DEPEVT_STATUS_LST) && |
1552 | (trb->ctrl & DWC3_TRB_CTRL_LST)) | ||
1438 | break; | 1553 | break; |
1439 | if ((event->status & DEPEVT_STATUS_IOC) && trb.ioc) | 1554 | if ((event->status & DEPEVT_STATUS_IOC) && |
1555 | (trb->ctrl & DWC3_TRB_CTRL_IOC)) | ||
1440 | break; | 1556 | break; |
1441 | } while (1); | 1557 | } while (1); |
1442 | 1558 | ||
1443 | if ((event->status & DEPEVT_STATUS_IOC) && trb.ioc) | 1559 | if ((event->status & DEPEVT_STATUS_IOC) && |
1560 | (trb->ctrl & DWC3_TRB_CTRL_IOC)) | ||
1444 | return 0; | 1561 | return 0; |
1445 | return 1; | 1562 | return 1; |
1446 | } | 1563 | } |
@@ -1455,11 +1572,9 @@ static void dwc3_endpoint_transfer_complete(struct dwc3 *dwc, | |||
1455 | if (event->status & DEPEVT_STATUS_BUSERR) | 1572 | if (event->status & DEPEVT_STATUS_BUSERR) |
1456 | status = -ECONNRESET; | 1573 | status = -ECONNRESET; |
1457 | 1574 | ||
1458 | clean_busy = dwc3_cleanup_done_reqs(dwc, dep, event, status); | 1575 | clean_busy = dwc3_cleanup_done_reqs(dwc, dep, event, status); |
1459 | if (clean_busy) { | 1576 | if (clean_busy) |
1460 | dep->flags &= ~DWC3_EP_BUSY; | 1577 | dep->flags &= ~DWC3_EP_BUSY; |
1461 | dep->res_trans_idx = 0; | ||
1462 | } | ||
1463 | 1578 | ||
1464 | /* | 1579 | /* |
1465 | * WORKAROUND: This is the 2nd half of U1/U2 -> U0 workaround. | 1580 | * WORKAROUND: This is the 2nd half of U1/U2 -> U0 workaround. |
@@ -1490,7 +1605,7 @@ static void dwc3_endpoint_transfer_complete(struct dwc3 *dwc, | |||
1490 | static void dwc3_gadget_start_isoc(struct dwc3 *dwc, | 1605 | static void dwc3_gadget_start_isoc(struct dwc3 *dwc, |
1491 | struct dwc3_ep *dep, const struct dwc3_event_depevt *event) | 1606 | struct dwc3_ep *dep, const struct dwc3_event_depevt *event) |
1492 | { | 1607 | { |
1493 | u32 uf; | 1608 | u32 uf, mask; |
1494 | 1609 | ||
1495 | if (list_empty(&dep->request_list)) { | 1610 | if (list_empty(&dep->request_list)) { |
1496 | dev_vdbg(dwc->dev, "ISOC ep %s run out for requests.\n", | 1611 | dev_vdbg(dwc->dev, "ISOC ep %s run out for requests.\n", |
@@ -1498,16 +1613,10 @@ static void dwc3_gadget_start_isoc(struct dwc3 *dwc, | |||
1498 | return; | 1613 | return; |
1499 | } | 1614 | } |
1500 | 1615 | ||
1501 | if (event->parameters) { | 1616 | mask = ~(dep->interval - 1); |
1502 | u32 mask; | 1617 | uf = event->parameters & mask; |
1503 | 1618 | /* 4 micro frames in the future */ | |
1504 | mask = ~(dep->interval - 1); | 1619 | uf += dep->interval * 4; |
1505 | uf = event->parameters & mask; | ||
1506 | /* 4 micro frames in the future */ | ||
1507 | uf += dep->interval * 4; | ||
1508 | } else { | ||
1509 | uf = 0; | ||
1510 | } | ||
1511 | 1620 | ||
1512 | __dwc3_gadget_kick_transfer(dep, uf, 1); | 1621 | __dwc3_gadget_kick_transfer(dep, uf, 1); |
1513 | } | 1622 | } |
@@ -1519,8 +1628,8 @@ static void dwc3_process_ep_cmd_complete(struct dwc3_ep *dep, | |||
1519 | struct dwc3_event_depevt mod_ev = *event; | 1628 | struct dwc3_event_depevt mod_ev = *event; |
1520 | 1629 | ||
1521 | /* | 1630 | /* |
1522 | * We were asked to remove one requests. It is possible that this | 1631 | * We were asked to remove one request. It is possible that this |
1523 | * request and a few other were started together and have the same | 1632 | * request and a few others were started together and have the same |
1524 | * transfer index. Since we stopped the complete endpoint we don't | 1633 | * transfer index. Since we stopped the complete endpoint we don't |
1525 | * know how many requests were already completed (and not yet) | 1634 | * know how many requests were already completed (and not yet) |
1526 | * reported and how could be done (later). We purge them all until | 1635 | * reported and how could be done (later). We purge them all until |
@@ -1529,7 +1638,7 @@ static void dwc3_process_ep_cmd_complete(struct dwc3_ep *dep, | |||
1529 | mod_ev.status = DEPEVT_STATUS_LST; | 1638 | mod_ev.status = DEPEVT_STATUS_LST; |
1530 | dwc3_cleanup_done_reqs(dwc, dep, &mod_ev, -ESHUTDOWN); | 1639 | dwc3_cleanup_done_reqs(dwc, dep, &mod_ev, -ESHUTDOWN); |
1531 | dep->flags &= ~DWC3_EP_BUSY; | 1640 | dep->flags &= ~DWC3_EP_BUSY; |
1532 | /* pending requets are ignored and are queued on XferNotReady */ | 1641 | /* pending requests are ignored and are queued on XferNotReady */ |
1533 | } | 1642 | } |
1534 | 1643 | ||
1535 | static void dwc3_ep_cmd_compl(struct dwc3_ep *dep, | 1644 | static void dwc3_ep_cmd_compl(struct dwc3_ep *dep, |
@@ -1570,6 +1679,8 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc, | |||
1570 | 1679 | ||
1571 | switch (event->endpoint_event) { | 1680 | switch (event->endpoint_event) { |
1572 | case DWC3_DEPEVT_XFERCOMPLETE: | 1681 | case DWC3_DEPEVT_XFERCOMPLETE: |
1682 | dep->res_trans_idx = 0; | ||
1683 | |||
1573 | if (usb_endpoint_xfer_isoc(dep->desc)) { | 1684 | if (usb_endpoint_xfer_isoc(dep->desc)) { |
1574 | dev_dbg(dwc->dev, "%s is an Isochronous endpoint\n", | 1685 | dev_dbg(dwc->dev, "%s is an Isochronous endpoint\n", |
1575 | dep->name); | 1686 | dep->name); |
@@ -1594,7 +1705,8 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc, | |||
1594 | int ret; | 1705 | int ret; |
1595 | 1706 | ||
1596 | dev_vdbg(dwc->dev, "%s: reason %s\n", | 1707 | dev_vdbg(dwc->dev, "%s: reason %s\n", |
1597 | dep->name, event->status | 1708 | dep->name, event->status & |
1709 | DEPEVT_STATUS_TRANSFER_ACTIVE | ||
1598 | ? "Transfer Active" | 1710 | ? "Transfer Active" |
1599 | : "Transfer Not Active"); | 1711 | : "Transfer Not Active"); |
1600 | 1712 | ||
@@ -1805,6 +1917,7 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc) | |||
1805 | reg = dwc3_readl(dwc->regs, DWC3_DCTL); | 1917 | reg = dwc3_readl(dwc->regs, DWC3_DCTL); |
1806 | reg &= ~DWC3_DCTL_TSTCTRL_MASK; | 1918 | reg &= ~DWC3_DCTL_TSTCTRL_MASK; |
1807 | dwc3_writel(dwc->regs, DWC3_DCTL, reg); | 1919 | dwc3_writel(dwc->regs, DWC3_DCTL, reg); |
1920 | dwc->test_mode = false; | ||
1808 | 1921 | ||
1809 | dwc3_stop_active_transfers(dwc); | 1922 | dwc3_stop_active_transfers(dwc); |
1810 | dwc3_clear_stall_all_ep(dwc); | 1923 | dwc3_clear_stall_all_ep(dwc); |
@@ -2082,7 +2195,8 @@ static irqreturn_t dwc3_process_event_buf(struct dwc3 *dwc, u32 buf) | |||
2082 | while (left > 0) { | 2195 | while (left > 0) { |
2083 | union dwc3_event event; | 2196 | union dwc3_event event; |
2084 | 2197 | ||
2085 | memcpy(&event.raw, (evt->buf + evt->lpos), sizeof(event.raw)); | 2198 | event.raw = *(u32 *) (evt->buf + evt->lpos); |
2199 | |||
2086 | dwc3_process_event_entry(dwc, &event); | 2200 | dwc3_process_event_entry(dwc, &event); |
2087 | /* | 2201 | /* |
2088 | * XXX we wrap around correctly to the next entry as almost all | 2202 | * XXX we wrap around correctly to the next entry as almost all |
@@ -2123,7 +2237,7 @@ static irqreturn_t dwc3_interrupt(int irq, void *_dwc) | |||
2123 | 2237 | ||
2124 | /** | 2238 | /** |
2125 | * dwc3_gadget_init - Initializes gadget related registers | 2239 | * dwc3_gadget_init - Initializes gadget related registers |
2126 | * @dwc: Pointer to out controller context structure | 2240 | * @dwc: pointer to our controller context structure |
2127 | * | 2241 | * |
2128 | * Returns 0 on success otherwise negative errno. | 2242 | * Returns 0 on success otherwise negative errno. |
2129 | */ | 2243 | */ |
@@ -2149,9 +2263,8 @@ int __devinit dwc3_gadget_init(struct dwc3 *dwc) | |||
2149 | goto err1; | 2263 | goto err1; |
2150 | } | 2264 | } |
2151 | 2265 | ||
2152 | dwc->setup_buf = dma_alloc_coherent(dwc->dev, | 2266 | dwc->setup_buf = kzalloc(sizeof(*dwc->setup_buf) * 2, |
2153 | sizeof(*dwc->setup_buf) * 2, | 2267 | GFP_KERNEL); |
2154 | &dwc->setup_buf_addr, GFP_KERNEL); | ||
2155 | if (!dwc->setup_buf) { | 2268 | if (!dwc->setup_buf) { |
2156 | dev_err(dwc->dev, "failed to allocate setup buffer\n"); | 2269 | dev_err(dwc->dev, "failed to allocate setup buffer\n"); |
2157 | ret = -ENOMEM; | 2270 | ret = -ENOMEM; |
@@ -2242,8 +2355,7 @@ err4: | |||
2242 | dwc->ep0_bounce_addr); | 2355 | dwc->ep0_bounce_addr); |
2243 | 2356 | ||
2244 | err3: | 2357 | err3: |
2245 | dma_free_coherent(dwc->dev, sizeof(*dwc->setup_buf) * 2, | 2358 | kfree(dwc->setup_buf); |
2246 | dwc->setup_buf, dwc->setup_buf_addr); | ||
2247 | 2359 | ||
2248 | err2: | 2360 | err2: |
2249 | dma_free_coherent(dwc->dev, sizeof(*dwc->ep0_trb), | 2361 | dma_free_coherent(dwc->dev, sizeof(*dwc->ep0_trb), |
@@ -2272,8 +2384,7 @@ void dwc3_gadget_exit(struct dwc3 *dwc) | |||
2272 | dma_free_coherent(dwc->dev, 512, dwc->ep0_bounce, | 2384 | dma_free_coherent(dwc->dev, 512, dwc->ep0_bounce, |
2273 | dwc->ep0_bounce_addr); | 2385 | dwc->ep0_bounce_addr); |
2274 | 2386 | ||
2275 | dma_free_coherent(dwc->dev, sizeof(*dwc->setup_buf) * 2, | 2387 | kfree(dwc->setup_buf); |
2276 | dwc->setup_buf, dwc->setup_buf_addr); | ||
2277 | 2388 | ||
2278 | dma_free_coherent(dwc->dev, sizeof(*dwc->ep0_trb), | 2389 | dma_free_coherent(dwc->dev, sizeof(*dwc->ep0_trb), |
2279 | dwc->ep0_trb, dwc->ep0_trb_addr); | 2390 | dwc->ep0_trb, dwc->ep0_trb_addr); |
diff --git a/drivers/usb/dwc3/gadget.h b/drivers/usb/dwc3/gadget.h index d97f467d41cc..a8600084348c 100644 --- a/drivers/usb/dwc3/gadget.h +++ b/drivers/usb/dwc3/gadget.h | |||
@@ -100,6 +100,9 @@ static inline void dwc3_gadget_move_request_queued(struct dwc3_request *req) | |||
100 | void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req, | 100 | void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req, |
101 | int status); | 101 | int status); |
102 | 102 | ||
103 | int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode); | ||
104 | int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state); | ||
105 | |||
103 | void dwc3_ep0_interrupt(struct dwc3 *dwc, | 106 | void dwc3_ep0_interrupt(struct dwc3 *dwc, |
104 | const struct dwc3_event_depevt *event); | 107 | const struct dwc3_event_depevt *event); |
105 | void dwc3_ep0_out_start(struct dwc3 *dwc); | 108 | void dwc3_ep0_out_start(struct dwc3 *dwc); |
@@ -108,8 +111,6 @@ int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request, | |||
108 | int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value); | 111 | int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value); |
109 | int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, | 112 | int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, |
110 | unsigned cmd, struct dwc3_gadget_ep_cmd_params *params); | 113 | unsigned cmd, struct dwc3_gadget_ep_cmd_params *params); |
111 | void dwc3_map_buffer_to_dma(struct dwc3_request *req); | ||
112 | void dwc3_unmap_buffer_from_dma(struct dwc3_request *req); | ||
113 | 114 | ||
114 | /** | 115 | /** |
115 | * dwc3_gadget_ep_get_transfer_index - Gets transfer index from HW | 116 | * dwc3_gadget_ep_get_transfer_index - Gets transfer index from HW |
diff --git a/drivers/usb/dwc3/host.c b/drivers/usb/dwc3/host.c index 7cfe211b6c37..b108d18fd40d 100644 --- a/drivers/usb/dwc3/host.c +++ b/drivers/usb/dwc3/host.c | |||
@@ -53,7 +53,7 @@ int dwc3_host_init(struct dwc3 *dwc) | |||
53 | struct platform_device *xhci; | 53 | struct platform_device *xhci; |
54 | int ret; | 54 | int ret; |
55 | 55 | ||
56 | xhci = platform_device_alloc("xhci", -1); | 56 | xhci = platform_device_alloc("xhci-hcd", -1); |
57 | if (!xhci) { | 57 | if (!xhci) { |
58 | dev_err(dwc->dev, "couldn't allocate xHCI device\n"); | 58 | dev_err(dwc->dev, "couldn't allocate xHCI device\n"); |
59 | ret = -ENOMEM; | 59 | ret = -ENOMEM; |
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 7ecb68a67411..c14a3972953a 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig | |||
@@ -599,16 +599,29 @@ config USB_AUDIO | |||
599 | depends on SND | 599 | depends on SND |
600 | select SND_PCM | 600 | select SND_PCM |
601 | help | 601 | help |
602 | Gadget Audio is compatible with USB Audio Class specification 1.0. | 602 | This Gadget Audio driver is compatible with USB Audio Class |
603 | It will include at least one AudioControl interface, zero or more | 603 | specification 2.0. It implements 1 AudioControl interface, |
604 | AudioStream interface and zero or more MIDIStream interface. | 604 | 1 AudioStreaming Interface each for USB-OUT and USB-IN. |
605 | 605 | Number of channels, sample rate and sample size can be | |
606 | Gadget Audio will use on-board ALSA (CONFIG_SND) audio card to | 606 | specified as module parameters. |
607 | playback or capture audio stream. | 607 | This driver doesn't expect any real Audio codec to be present |
608 | on the device - the audio streams are simply sinked to and | ||
609 | sourced from a virtual ALSA sound card created. The user-space | ||
610 | application may choose to do whatever it wants with the data | ||
611 | received from the USB Host and choose to provide whatever it | ||
612 | wants as audio data to the USB Host. | ||
608 | 613 | ||
609 | Say "y" to link the driver statically, or "m" to build a | 614 | Say "y" to link the driver statically, or "m" to build a |
610 | dynamically linked module called "g_audio". | 615 | dynamically linked module called "g_audio". |
611 | 616 | ||
617 | config GADGET_UAC1 | ||
618 | bool "UAC 1.0 (Legacy)" | ||
619 | depends on USB_AUDIO | ||
620 | help | ||
621 | If you instead want older UAC Spec-1.0 driver that also has audio | ||
622 | paths hardwired to the Audio codec chip on-board and doesn't work | ||
623 | without one. | ||
624 | |||
612 | config USB_ETH | 625 | config USB_ETH |
613 | tristate "Ethernet Gadget (with CDC Ethernet support)" | 626 | tristate "Ethernet Gadget (with CDC Ethernet support)" |
614 | depends on NET | 627 | depends on NET |
@@ -685,7 +698,7 @@ config USB_G_NCM | |||
685 | help | 698 | help |
686 | This driver implements USB CDC NCM subclass standard. NCM is | 699 | This driver implements USB CDC NCM subclass standard. NCM is |
687 | an advanced protocol for Ethernet encapsulation, allows grouping | 700 | an advanced protocol for Ethernet encapsulation, allows grouping |
688 | of several ethernet frames into one USB transfer and diffferent | 701 | of several ethernet frames into one USB transfer and different |
689 | alignment possibilities. | 702 | alignment possibilities. |
690 | 703 | ||
691 | Say "y" to link the driver statically, or "m" to build a | 704 | Say "y" to link the driver statically, or "m" to build a |
diff --git a/drivers/usb/gadget/amd5536udc.c b/drivers/usb/gadget/amd5536udc.c index c16ff55a74e8..2204a4c68d85 100644 --- a/drivers/usb/gadget/amd5536udc.c +++ b/drivers/usb/gadget/amd5536udc.c | |||
@@ -29,7 +29,7 @@ | |||
29 | 29 | ||
30 | /* Driver strings */ | 30 | /* Driver strings */ |
31 | #define UDC_MOD_DESCRIPTION "AMD 5536 UDC - USB Device Controller" | 31 | #define UDC_MOD_DESCRIPTION "AMD 5536 UDC - USB Device Controller" |
32 | #define UDC_DRIVER_VERSION_STRING "01.00.0206 - $Revision: #3 $" | 32 | #define UDC_DRIVER_VERSION_STRING "01.00.0206" |
33 | 33 | ||
34 | /* system */ | 34 | /* system */ |
35 | #include <linux/module.h> | 35 | #include <linux/module.h> |
@@ -140,7 +140,7 @@ static DECLARE_TASKLET(disconnect_tasklet, udc_tasklet_disconnect, | |||
140 | 140 | ||
141 | /* endpoint names used for print */ | 141 | /* endpoint names used for print */ |
142 | static const char ep0_string[] = "ep0in"; | 142 | static const char ep0_string[] = "ep0in"; |
143 | static const char *ep_string[] = { | 143 | static const char *const ep_string[] = { |
144 | ep0_string, | 144 | ep0_string, |
145 | "ep1in-int", "ep2in-bulk", "ep3in-bulk", "ep4in-bulk", "ep5in-bulk", | 145 | "ep1in-int", "ep2in-bulk", "ep3in-bulk", "ep4in-bulk", "ep5in-bulk", |
146 | "ep6in-bulk", "ep7in-bulk", "ep8in-bulk", "ep9in-bulk", "ep10in-bulk", | 146 | "ep6in-bulk", "ep7in-bulk", "ep8in-bulk", "ep9in-bulk", "ep10in-bulk", |
@@ -204,9 +204,8 @@ static void print_regs(struct udc *dev) | |||
204 | DBG(dev, "DMA mode = BF (buffer fill mode)\n"); | 204 | DBG(dev, "DMA mode = BF (buffer fill mode)\n"); |
205 | dev_info(&dev->pdev->dev, "DMA mode (%s)\n", "BF"); | 205 | dev_info(&dev->pdev->dev, "DMA mode (%s)\n", "BF"); |
206 | } | 206 | } |
207 | if (!use_dma) { | 207 | if (!use_dma) |
208 | dev_info(&dev->pdev->dev, "FIFO mode\n"); | 208 | dev_info(&dev->pdev->dev, "FIFO mode\n"); |
209 | } | ||
210 | DBG(dev, "-------------------------------------------------------\n"); | 209 | DBG(dev, "-------------------------------------------------------\n"); |
211 | } | 210 | } |
212 | 211 | ||
@@ -445,6 +444,7 @@ static void ep_init(struct udc_regs __iomem *regs, struct udc_ep *ep) | |||
445 | 444 | ||
446 | VDBG(ep->dev, "ep-%d reset\n", ep->num); | 445 | VDBG(ep->dev, "ep-%d reset\n", ep->num); |
447 | ep->desc = NULL; | 446 | ep->desc = NULL; |
447 | ep->ep.desc = NULL; | ||
448 | ep->ep.ops = &udc_ep_ops; | 448 | ep->ep.ops = &udc_ep_ops; |
449 | INIT_LIST_HEAD(&ep->queue); | 449 | INIT_LIST_HEAD(&ep->queue); |
450 | 450 | ||
@@ -569,9 +569,8 @@ udc_free_request(struct usb_ep *usbep, struct usb_request *usbreq) | |||
569 | VDBG(ep->dev, "req->td_data=%p\n", req->td_data); | 569 | VDBG(ep->dev, "req->td_data=%p\n", req->td_data); |
570 | 570 | ||
571 | /* free dma chain if created */ | 571 | /* free dma chain if created */ |
572 | if (req->chain_len > 1) { | 572 | if (req->chain_len > 1) |
573 | udc_free_dma_chain(ep->dev, req); | 573 | udc_free_dma_chain(ep->dev, req); |
574 | } | ||
575 | 574 | ||
576 | pci_pool_free(ep->dev->data_requests, req->td_data, | 575 | pci_pool_free(ep->dev->data_requests, req->td_data, |
577 | req->td_phys); | 576 | req->td_phys); |
@@ -639,9 +638,8 @@ udc_txfifo_write(struct udc_ep *ep, struct usb_request *req) | |||
639 | bytes = remaining; | 638 | bytes = remaining; |
640 | 639 | ||
641 | /* dwords first */ | 640 | /* dwords first */ |
642 | for (i = 0; i < bytes / UDC_DWORD_BYTES; i++) { | 641 | for (i = 0; i < bytes / UDC_DWORD_BYTES; i++) |
643 | writel(*(buf + i), ep->txfifo); | 642 | writel(*(buf + i), ep->txfifo); |
644 | } | ||
645 | 643 | ||
646 | /* remaining bytes must be written by byte access */ | 644 | /* remaining bytes must be written by byte access */ |
647 | for (j = 0; j < bytes % UDC_DWORD_BYTES; j++) { | 645 | for (j = 0; j < bytes % UDC_DWORD_BYTES; j++) { |
@@ -660,9 +658,8 @@ static int udc_rxfifo_read_dwords(struct udc *dev, u32 *buf, int dwords) | |||
660 | 658 | ||
661 | VDBG(dev, "udc_read_dwords(): %d dwords\n", dwords); | 659 | VDBG(dev, "udc_read_dwords(): %d dwords\n", dwords); |
662 | 660 | ||
663 | for (i = 0; i < dwords; i++) { | 661 | for (i = 0; i < dwords; i++) |
664 | *(buf + i) = readl(dev->rxfifo); | 662 | *(buf + i) = readl(dev->rxfifo); |
665 | } | ||
666 | return 0; | 663 | return 0; |
667 | } | 664 | } |
668 | 665 | ||
@@ -675,9 +672,8 @@ static int udc_rxfifo_read_bytes(struct udc *dev, u8 *buf, int bytes) | |||
675 | VDBG(dev, "udc_read_bytes(): %d bytes\n", bytes); | 672 | VDBG(dev, "udc_read_bytes(): %d bytes\n", bytes); |
676 | 673 | ||
677 | /* dwords first */ | 674 | /* dwords first */ |
678 | for (i = 0; i < bytes / UDC_DWORD_BYTES; i++) { | 675 | for (i = 0; i < bytes / UDC_DWORD_BYTES; i++) |
679 | *((u32 *)(buf + (i<<2))) = readl(dev->rxfifo); | 676 | *((u32 *)(buf + (i<<2))) = readl(dev->rxfifo); |
680 | } | ||
681 | 677 | ||
682 | /* remaining bytes must be read by byte access */ | 678 | /* remaining bytes must be read by byte access */ |
683 | if (bytes % UDC_DWORD_BYTES) { | 679 | if (bytes % UDC_DWORD_BYTES) { |
@@ -831,20 +827,8 @@ __acquires(ep->dev->lock) | |||
831 | 827 | ||
832 | dev = ep->dev; | 828 | dev = ep->dev; |
833 | /* unmap DMA */ | 829 | /* unmap DMA */ |
834 | if (req->dma_mapping) { | 830 | if (ep->dma) |
835 | if (ep->in) | 831 | usb_gadget_unmap_request(&dev->gadget, &req->req, ep->in); |
836 | pci_unmap_single(dev->pdev, | ||
837 | req->req.dma, | ||
838 | req->req.length, | ||
839 | PCI_DMA_TODEVICE); | ||
840 | else | ||
841 | pci_unmap_single(dev->pdev, | ||
842 | req->req.dma, | ||
843 | req->req.length, | ||
844 | PCI_DMA_FROMDEVICE); | ||
845 | req->dma_mapping = 0; | ||
846 | req->req.dma = DMA_DONT_USE; | ||
847 | } | ||
848 | 832 | ||
849 | halted = ep->halted; | 833 | halted = ep->halted; |
850 | ep->halted = 1; | 834 | ep->halted = 1; |
@@ -897,9 +881,8 @@ static struct udc_data_dma *udc_get_last_dma_desc(struct udc_request *req) | |||
897 | struct udc_data_dma *td; | 881 | struct udc_data_dma *td; |
898 | 882 | ||
899 | td = req->td_data; | 883 | td = req->td_data; |
900 | while (td && !(td->status & AMD_BIT(UDC_DMA_IN_STS_L))) { | 884 | while (td && !(td->status & AMD_BIT(UDC_DMA_IN_STS_L))) |
901 | td = phys_to_virt(td->next); | 885 | td = phys_to_virt(td->next); |
902 | } | ||
903 | 886 | ||
904 | return td; | 887 | return td; |
905 | 888 | ||
@@ -949,21 +932,18 @@ static int udc_create_dma_chain( | |||
949 | dma_addr = DMA_DONT_USE; | 932 | dma_addr = DMA_DONT_USE; |
950 | 933 | ||
951 | /* unset L bit in first desc for OUT */ | 934 | /* unset L bit in first desc for OUT */ |
952 | if (!ep->in) { | 935 | if (!ep->in) |
953 | req->td_data->status &= AMD_CLEAR_BIT(UDC_DMA_IN_STS_L); | 936 | req->td_data->status &= AMD_CLEAR_BIT(UDC_DMA_IN_STS_L); |
954 | } | ||
955 | 937 | ||
956 | /* alloc only new desc's if not already available */ | 938 | /* alloc only new desc's if not already available */ |
957 | len = req->req.length / ep->ep.maxpacket; | 939 | len = req->req.length / ep->ep.maxpacket; |
958 | if (req->req.length % ep->ep.maxpacket) { | 940 | if (req->req.length % ep->ep.maxpacket) |
959 | len++; | 941 | len++; |
960 | } | ||
961 | 942 | ||
962 | if (len > req->chain_len) { | 943 | if (len > req->chain_len) { |
963 | /* shorter chain already allocated before */ | 944 | /* shorter chain already allocated before */ |
964 | if (req->chain_len > 1) { | 945 | if (req->chain_len > 1) |
965 | udc_free_dma_chain(ep->dev, req); | 946 | udc_free_dma_chain(ep->dev, req); |
966 | } | ||
967 | req->chain_len = len; | 947 | req->chain_len = len; |
968 | create_new_chain = 1; | 948 | create_new_chain = 1; |
969 | } | 949 | } |
@@ -1006,11 +986,12 @@ static int udc_create_dma_chain( | |||
1006 | 986 | ||
1007 | /* link td and assign tx bytes */ | 987 | /* link td and assign tx bytes */ |
1008 | if (i == buf_len) { | 988 | if (i == buf_len) { |
1009 | if (create_new_chain) { | 989 | if (create_new_chain) |
1010 | req->td_data->next = dma_addr; | 990 | req->td_data->next = dma_addr; |
1011 | } else { | 991 | /* |
1012 | /* req->td_data->next = virt_to_phys(td); */ | 992 | else |
1013 | } | 993 | req->td_data->next = virt_to_phys(td); |
994 | */ | ||
1014 | /* write tx bytes */ | 995 | /* write tx bytes */ |
1015 | if (ep->in) { | 996 | if (ep->in) { |
1016 | /* first desc */ | 997 | /* first desc */ |
@@ -1024,11 +1005,12 @@ static int udc_create_dma_chain( | |||
1024 | UDC_DMA_IN_STS_TXBYTES); | 1005 | UDC_DMA_IN_STS_TXBYTES); |
1025 | } | 1006 | } |
1026 | } else { | 1007 | } else { |
1027 | if (create_new_chain) { | 1008 | if (create_new_chain) |
1028 | last->next = dma_addr; | 1009 | last->next = dma_addr; |
1029 | } else { | 1010 | /* |
1030 | /* last->next = virt_to_phys(td); */ | 1011 | else |
1031 | } | 1012 | last->next = virt_to_phys(td); |
1013 | */ | ||
1032 | if (ep->in) { | 1014 | if (ep->in) { |
1033 | /* write tx bytes */ | 1015 | /* write tx bytes */ |
1034 | td->status = AMD_ADDBITS(td->status, | 1016 | td->status = AMD_ADDBITS(td->status, |
@@ -1095,20 +1077,11 @@ udc_queue(struct usb_ep *usbep, struct usb_request *usbreq, gfp_t gfp) | |||
1095 | return -ESHUTDOWN; | 1077 | return -ESHUTDOWN; |
1096 | 1078 | ||
1097 | /* map dma (usually done before) */ | 1079 | /* map dma (usually done before) */ |
1098 | if (ep->dma && usbreq->length != 0 | 1080 | if (ep->dma) { |
1099 | && (usbreq->dma == DMA_DONT_USE || usbreq->dma == 0)) { | ||
1100 | VDBG(dev, "DMA map req %p\n", req); | 1081 | VDBG(dev, "DMA map req %p\n", req); |
1101 | if (ep->in) | 1082 | retval = usb_gadget_map_request(&udc->gadget, usbreq, ep->in); |
1102 | usbreq->dma = pci_map_single(dev->pdev, | 1083 | if (retval) |
1103 | usbreq->buf, | 1084 | return retval; |
1104 | usbreq->length, | ||
1105 | PCI_DMA_TODEVICE); | ||
1106 | else | ||
1107 | usbreq->dma = pci_map_single(dev->pdev, | ||
1108 | usbreq->buf, | ||
1109 | usbreq->length, | ||
1110 | PCI_DMA_FROMDEVICE); | ||
1111 | req->dma_mapping = 1; | ||
1112 | } | 1085 | } |
1113 | 1086 | ||
1114 | VDBG(dev, "%s queue req %p, len %d req->td_data=%p buf %p\n", | 1087 | VDBG(dev, "%s queue req %p, len %d req->td_data=%p buf %p\n", |
@@ -1479,11 +1452,10 @@ static int startup_registers(struct udc *dev) | |||
1479 | 1452 | ||
1480 | /* program speed */ | 1453 | /* program speed */ |
1481 | tmp = readl(&dev->regs->cfg); | 1454 | tmp = readl(&dev->regs->cfg); |
1482 | if (use_fullspeed) { | 1455 | if (use_fullspeed) |
1483 | tmp = AMD_ADDBITS(tmp, UDC_DEVCFG_SPD_FS, UDC_DEVCFG_SPD); | 1456 | tmp = AMD_ADDBITS(tmp, UDC_DEVCFG_SPD_FS, UDC_DEVCFG_SPD); |
1484 | } else { | 1457 | else |
1485 | tmp = AMD_ADDBITS(tmp, UDC_DEVCFG_SPD_HS, UDC_DEVCFG_SPD); | 1458 | tmp = AMD_ADDBITS(tmp, UDC_DEVCFG_SPD_HS, UDC_DEVCFG_SPD); |
1486 | } | ||
1487 | writel(tmp, &dev->regs->cfg); | 1459 | writel(tmp, &dev->regs->cfg); |
1488 | 1460 | ||
1489 | return 0; | 1461 | return 0; |
@@ -1504,9 +1476,8 @@ static void udc_basic_init(struct udc *dev) | |||
1504 | mod_timer(&udc_timer, jiffies - 1); | 1476 | mod_timer(&udc_timer, jiffies - 1); |
1505 | } | 1477 | } |
1506 | /* stop poll stall timer */ | 1478 | /* stop poll stall timer */ |
1507 | if (timer_pending(&udc_pollstall_timer)) { | 1479 | if (timer_pending(&udc_pollstall_timer)) |
1508 | mod_timer(&udc_pollstall_timer, jiffies - 1); | 1480 | mod_timer(&udc_pollstall_timer, jiffies - 1); |
1509 | } | ||
1510 | /* disable DMA */ | 1481 | /* disable DMA */ |
1511 | tmp = readl(&dev->regs->ctl); | 1482 | tmp = readl(&dev->regs->ctl); |
1512 | tmp &= AMD_UNMASK_BIT(UDC_DEVCTL_RDE); | 1483 | tmp &= AMD_UNMASK_BIT(UDC_DEVCTL_RDE); |
@@ -1540,11 +1511,10 @@ static void udc_setup_endpoints(struct udc *dev) | |||
1540 | /* read enum speed */ | 1511 | /* read enum speed */ |
1541 | tmp = readl(&dev->regs->sts); | 1512 | tmp = readl(&dev->regs->sts); |
1542 | tmp = AMD_GETBITS(tmp, UDC_DEVSTS_ENUM_SPEED); | 1513 | tmp = AMD_GETBITS(tmp, UDC_DEVSTS_ENUM_SPEED); |
1543 | if (tmp == UDC_DEVSTS_ENUM_SPEED_HIGH) { | 1514 | if (tmp == UDC_DEVSTS_ENUM_SPEED_HIGH) |
1544 | dev->gadget.speed = USB_SPEED_HIGH; | 1515 | dev->gadget.speed = USB_SPEED_HIGH; |
1545 | } else if (tmp == UDC_DEVSTS_ENUM_SPEED_FULL) { | 1516 | else if (tmp == UDC_DEVSTS_ENUM_SPEED_FULL) |
1546 | dev->gadget.speed = USB_SPEED_FULL; | 1517 | dev->gadget.speed = USB_SPEED_FULL; |
1547 | } | ||
1548 | 1518 | ||
1549 | /* set basic ep parameters */ | 1519 | /* set basic ep parameters */ |
1550 | for (tmp = 0; tmp < UDC_EP_NUM; tmp++) { | 1520 | for (tmp = 0; tmp < UDC_EP_NUM; tmp++) { |
@@ -1570,9 +1540,8 @@ static void udc_setup_endpoints(struct udc *dev) | |||
1570 | * disabling ep interrupts when ENUM interrupt occurs but ep is | 1540 | * disabling ep interrupts when ENUM interrupt occurs but ep is |
1571 | * not enabled by gadget driver | 1541 | * not enabled by gadget driver |
1572 | */ | 1542 | */ |
1573 | if (!ep->desc) { | 1543 | if (!ep->desc) |
1574 | ep_init(dev->regs, ep); | 1544 | ep_init(dev->regs, ep); |
1575 | } | ||
1576 | 1545 | ||
1577 | if (use_dma) { | 1546 | if (use_dma) { |
1578 | /* | 1547 | /* |
@@ -1670,9 +1639,8 @@ static void udc_tasklet_disconnect(unsigned long par) | |||
1670 | spin_lock(&dev->lock); | 1639 | spin_lock(&dev->lock); |
1671 | 1640 | ||
1672 | /* empty queues */ | 1641 | /* empty queues */ |
1673 | for (tmp = 0; tmp < UDC_EP_NUM; tmp++) { | 1642 | for (tmp = 0; tmp < UDC_EP_NUM; tmp++) |
1674 | empty_req_queue(&dev->ep[tmp]); | 1643 | empty_req_queue(&dev->ep[tmp]); |
1675 | } | ||
1676 | 1644 | ||
1677 | } | 1645 | } |
1678 | 1646 | ||
@@ -1746,9 +1714,8 @@ static void udc_timer_function(unsigned long v) | |||
1746 | * open the fifo | 1714 | * open the fifo |
1747 | */ | 1715 | */ |
1748 | udc_timer.expires = jiffies + HZ/UDC_RDE_TIMER_DIV; | 1716 | udc_timer.expires = jiffies + HZ/UDC_RDE_TIMER_DIV; |
1749 | if (!stop_timer) { | 1717 | if (!stop_timer) |
1750 | add_timer(&udc_timer); | 1718 | add_timer(&udc_timer); |
1751 | } | ||
1752 | } else { | 1719 | } else { |
1753 | /* | 1720 | /* |
1754 | * fifo contains data now, setup timer for opening | 1721 | * fifo contains data now, setup timer for opening |
@@ -1760,9 +1727,8 @@ static void udc_timer_function(unsigned long v) | |||
1760 | set_rde++; | 1727 | set_rde++; |
1761 | /* debug: lhadmot_timer_start = 221070 */ | 1728 | /* debug: lhadmot_timer_start = 221070 */ |
1762 | udc_timer.expires = jiffies + HZ*UDC_RDE_TIMER_SECONDS; | 1729 | udc_timer.expires = jiffies + HZ*UDC_RDE_TIMER_SECONDS; |
1763 | if (!stop_timer) { | 1730 | if (!stop_timer) |
1764 | add_timer(&udc_timer); | 1731 | add_timer(&udc_timer); |
1765 | } | ||
1766 | } | 1732 | } |
1767 | 1733 | ||
1768 | } else | 1734 | } else |
@@ -1907,19 +1873,17 @@ static void activate_control_endpoints(struct udc *dev) | |||
1907 | mod_timer(&udc_timer, jiffies - 1); | 1873 | mod_timer(&udc_timer, jiffies - 1); |
1908 | } | 1874 | } |
1909 | /* stop pollstall timer */ | 1875 | /* stop pollstall timer */ |
1910 | if (timer_pending(&udc_pollstall_timer)) { | 1876 | if (timer_pending(&udc_pollstall_timer)) |
1911 | mod_timer(&udc_pollstall_timer, jiffies - 1); | 1877 | mod_timer(&udc_pollstall_timer, jiffies - 1); |
1912 | } | ||
1913 | /* enable DMA */ | 1878 | /* enable DMA */ |
1914 | tmp = readl(&dev->regs->ctl); | 1879 | tmp = readl(&dev->regs->ctl); |
1915 | tmp |= AMD_BIT(UDC_DEVCTL_MODE) | 1880 | tmp |= AMD_BIT(UDC_DEVCTL_MODE) |
1916 | | AMD_BIT(UDC_DEVCTL_RDE) | 1881 | | AMD_BIT(UDC_DEVCTL_RDE) |
1917 | | AMD_BIT(UDC_DEVCTL_TDE); | 1882 | | AMD_BIT(UDC_DEVCTL_TDE); |
1918 | if (use_dma_bufferfill_mode) { | 1883 | if (use_dma_bufferfill_mode) |
1919 | tmp |= AMD_BIT(UDC_DEVCTL_BF); | 1884 | tmp |= AMD_BIT(UDC_DEVCTL_BF); |
1920 | } else if (use_dma_ppb_du) { | 1885 | else if (use_dma_ppb_du) |
1921 | tmp |= AMD_BIT(UDC_DEVCTL_DU); | 1886 | tmp |= AMD_BIT(UDC_DEVCTL_DU); |
1922 | } | ||
1923 | writel(tmp, &dev->regs->ctl); | 1887 | writel(tmp, &dev->regs->ctl); |
1924 | } | 1888 | } |
1925 | 1889 | ||
@@ -2104,9 +2068,8 @@ static void udc_ep0_set_rde(struct udc *dev) | |||
2104 | udc_timer.expires = | 2068 | udc_timer.expires = |
2105 | jiffies + HZ/UDC_RDE_TIMER_DIV; | 2069 | jiffies + HZ/UDC_RDE_TIMER_DIV; |
2106 | set_rde = 1; | 2070 | set_rde = 1; |
2107 | if (!stop_timer) { | 2071 | if (!stop_timer) |
2108 | add_timer(&udc_timer); | 2072 | add_timer(&udc_timer); |
2109 | } | ||
2110 | } | 2073 | } |
2111 | } | 2074 | } |
2112 | } | 2075 | } |
@@ -2131,7 +2094,7 @@ static irqreturn_t udc_data_out_isr(struct udc *dev, int ep_ix) | |||
2131 | if (use_dma) { | 2094 | if (use_dma) { |
2132 | /* BNA event ? */ | 2095 | /* BNA event ? */ |
2133 | if (tmp & AMD_BIT(UDC_EPSTS_BNA)) { | 2096 | if (tmp & AMD_BIT(UDC_EPSTS_BNA)) { |
2134 | DBG(dev, "BNA ep%dout occurred - DESPTR = %x \n", | 2097 | DBG(dev, "BNA ep%dout occurred - DESPTR = %x\n", |
2135 | ep->num, readl(&ep->regs->desptr)); | 2098 | ep->num, readl(&ep->regs->desptr)); |
2136 | /* clear BNA */ | 2099 | /* clear BNA */ |
2137 | writel(tmp | AMD_BIT(UDC_EPSTS_BNA), &ep->regs->sts); | 2100 | writel(tmp | AMD_BIT(UDC_EPSTS_BNA), &ep->regs->sts); |
@@ -2294,9 +2257,8 @@ static irqreturn_t udc_data_out_isr(struct udc *dev, int ep_ix) | |||
2294 | jiffies | 2257 | jiffies |
2295 | + HZ*UDC_RDE_TIMER_SECONDS; | 2258 | + HZ*UDC_RDE_TIMER_SECONDS; |
2296 | set_rde = 1; | 2259 | set_rde = 1; |
2297 | if (!stop_timer) { | 2260 | if (!stop_timer) |
2298 | add_timer(&udc_timer); | 2261 | add_timer(&udc_timer); |
2299 | } | ||
2300 | } | 2262 | } |
2301 | if (ep->num != UDC_EP0OUT_IX) | 2263 | if (ep->num != UDC_EP0OUT_IX) |
2302 | dev->data_ep_queued = 0; | 2264 | dev->data_ep_queued = 0; |
@@ -2318,9 +2280,8 @@ static irqreturn_t udc_data_out_isr(struct udc *dev, int ep_ix) | |||
2318 | /* check pending CNAKS */ | 2280 | /* check pending CNAKS */ |
2319 | if (cnak_pending) { | 2281 | if (cnak_pending) { |
2320 | /* CNAk processing when rxfifo empty only */ | 2282 | /* CNAk processing when rxfifo empty only */ |
2321 | if (readl(&dev->regs->sts) & AMD_BIT(UDC_DEVSTS_RXFIFO_EMPTY)) { | 2283 | if (readl(&dev->regs->sts) & AMD_BIT(UDC_DEVSTS_RXFIFO_EMPTY)) |
2322 | udc_process_cnak_queue(dev); | 2284 | udc_process_cnak_queue(dev); |
2323 | } | ||
2324 | } | 2285 | } |
2325 | 2286 | ||
2326 | /* clear OUT bits in ep status */ | 2287 | /* clear OUT bits in ep status */ |
@@ -2348,7 +2309,7 @@ static irqreturn_t udc_data_in_isr(struct udc *dev, int ep_ix) | |||
2348 | /* BNA ? */ | 2309 | /* BNA ? */ |
2349 | if (epsts & AMD_BIT(UDC_EPSTS_BNA)) { | 2310 | if (epsts & AMD_BIT(UDC_EPSTS_BNA)) { |
2350 | dev_err(&dev->pdev->dev, | 2311 | dev_err(&dev->pdev->dev, |
2351 | "BNA ep%din occurred - DESPTR = %08lx \n", | 2312 | "BNA ep%din occurred - DESPTR = %08lx\n", |
2352 | ep->num, | 2313 | ep->num, |
2353 | (unsigned long) readl(&ep->regs->desptr)); | 2314 | (unsigned long) readl(&ep->regs->desptr)); |
2354 | 2315 | ||
@@ -2361,7 +2322,7 @@ static irqreturn_t udc_data_in_isr(struct udc *dev, int ep_ix) | |||
2361 | /* HE event ? */ | 2322 | /* HE event ? */ |
2362 | if (epsts & AMD_BIT(UDC_EPSTS_HE)) { | 2323 | if (epsts & AMD_BIT(UDC_EPSTS_HE)) { |
2363 | dev_err(&dev->pdev->dev, | 2324 | dev_err(&dev->pdev->dev, |
2364 | "HE ep%dn occurred - DESPTR = %08lx \n", | 2325 | "HE ep%dn occurred - DESPTR = %08lx\n", |
2365 | ep->num, (unsigned long) readl(&ep->regs->desptr)); | 2326 | ep->num, (unsigned long) readl(&ep->regs->desptr)); |
2366 | 2327 | ||
2367 | /* clear HE */ | 2328 | /* clear HE */ |
@@ -2427,9 +2388,9 @@ static irqreturn_t udc_data_in_isr(struct udc *dev, int ep_ix) | |||
2427 | /* write fifo */ | 2388 | /* write fifo */ |
2428 | udc_txfifo_write(ep, &req->req); | 2389 | udc_txfifo_write(ep, &req->req); |
2429 | len = req->req.length - req->req.actual; | 2390 | len = req->req.length - req->req.actual; |
2430 | if (len > ep->ep.maxpacket) | 2391 | if (len > ep->ep.maxpacket) |
2431 | len = ep->ep.maxpacket; | 2392 | len = ep->ep.maxpacket; |
2432 | req->req.actual += len; | 2393 | req->req.actual += len; |
2433 | if (req->req.actual == req->req.length | 2394 | if (req->req.actual == req->req.length |
2434 | || (len != ep->ep.maxpacket)) { | 2395 | || (len != ep->ep.maxpacket)) { |
2435 | /* complete req */ | 2396 | /* complete req */ |
@@ -2581,9 +2542,8 @@ __acquires(dev->lock) | |||
2581 | if (!timer_pending(&udc_timer)) { | 2542 | if (!timer_pending(&udc_timer)) { |
2582 | udc_timer.expires = jiffies + | 2543 | udc_timer.expires = jiffies + |
2583 | HZ/UDC_RDE_TIMER_DIV; | 2544 | HZ/UDC_RDE_TIMER_DIV; |
2584 | if (!stop_timer) { | 2545 | if (!stop_timer) |
2585 | add_timer(&udc_timer); | 2546 | add_timer(&udc_timer); |
2586 | } | ||
2587 | } | 2547 | } |
2588 | } | 2548 | } |
2589 | 2549 | ||
@@ -2697,9 +2657,8 @@ __acquires(dev->lock) | |||
2697 | /* check pending CNAKS */ | 2657 | /* check pending CNAKS */ |
2698 | if (cnak_pending) { | 2658 | if (cnak_pending) { |
2699 | /* CNAk processing when rxfifo empty only */ | 2659 | /* CNAk processing when rxfifo empty only */ |
2700 | if (readl(&dev->regs->sts) & AMD_BIT(UDC_DEVSTS_RXFIFO_EMPTY)) { | 2660 | if (readl(&dev->regs->sts) & AMD_BIT(UDC_DEVSTS_RXFIFO_EMPTY)) |
2701 | udc_process_cnak_queue(dev); | 2661 | udc_process_cnak_queue(dev); |
2702 | } | ||
2703 | } | 2662 | } |
2704 | 2663 | ||
2705 | finished: | 2664 | finished: |
@@ -2723,7 +2682,7 @@ static irqreturn_t udc_control_in_isr(struct udc *dev) | |||
2723 | tmp = readl(&dev->ep[UDC_EP0IN_IX].regs->sts); | 2682 | tmp = readl(&dev->ep[UDC_EP0IN_IX].regs->sts); |
2724 | /* DMA completion */ | 2683 | /* DMA completion */ |
2725 | if (tmp & AMD_BIT(UDC_EPSTS_TDC)) { | 2684 | if (tmp & AMD_BIT(UDC_EPSTS_TDC)) { |
2726 | VDBG(dev, "isr: TDC clear \n"); | 2685 | VDBG(dev, "isr: TDC clear\n"); |
2727 | ret_val = IRQ_HANDLED; | 2686 | ret_val = IRQ_HANDLED; |
2728 | 2687 | ||
2729 | /* clear TDC bit */ | 2688 | /* clear TDC bit */ |
@@ -3426,7 +3385,7 @@ static int udc_remote_wakeup(struct udc *dev) | |||
3426 | } | 3385 | } |
3427 | 3386 | ||
3428 | /* PCI device parameters */ | 3387 | /* PCI device parameters */ |
3429 | static const struct pci_device_id pci_id[] = { | 3388 | static DEFINE_PCI_DEVICE_TABLE(pci_id) = { |
3430 | { | 3389 | { |
3431 | PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x2096), | 3390 | PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x2096), |
3432 | .class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe, | 3391 | .class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe, |
diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index 143a7256b598..15a8cdb2ded5 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c | |||
@@ -29,7 +29,6 @@ | |||
29 | #include <linux/clk.h> | 29 | #include <linux/clk.h> |
30 | #include <linux/usb/ch9.h> | 30 | #include <linux/usb/ch9.h> |
31 | #include <linux/usb/gadget.h> | 31 | #include <linux/usb/gadget.h> |
32 | #include <linux/prefetch.h> | ||
33 | 32 | ||
34 | #include <asm/byteorder.h> | 33 | #include <asm/byteorder.h> |
35 | #include <mach/hardware.h> | 34 | #include <mach/hardware.h> |
@@ -558,6 +557,7 @@ static int at91_ep_disable (struct usb_ep * _ep) | |||
558 | 557 | ||
559 | /* restore the endpoint's pristine config */ | 558 | /* restore the endpoint's pristine config */ |
560 | ep->desc = NULL; | 559 | ep->desc = NULL; |
560 | ep->ep.desc = NULL; | ||
561 | ep->ep.maxpacket = ep->maxpacket; | 561 | ep->ep.maxpacket = ep->maxpacket; |
562 | 562 | ||
563 | /* reset fifos and endpoint */ | 563 | /* reset fifos and endpoint */ |
diff --git a/drivers/usb/gadget/atmel_usba_udc.c b/drivers/usb/gadget/atmel_usba_udc.c index e2fb6d583bd9..5e10f651ad63 100644 --- a/drivers/usb/gadget/atmel_usba_udc.c +++ b/drivers/usb/gadget/atmel_usba_udc.c | |||
@@ -659,6 +659,7 @@ static int usba_ep_disable(struct usb_ep *_ep) | |||
659 | return -EINVAL; | 659 | return -EINVAL; |
660 | } | 660 | } |
661 | ep->desc = NULL; | 661 | ep->desc = NULL; |
662 | ep->ep.desc = NULL; | ||
662 | 663 | ||
663 | list_splice_init(&ep->queue, &req_list); | 664 | list_splice_init(&ep->queue, &req_list); |
664 | if (ep->can_dma) { | 665 | if (ep->can_dma) { |
diff --git a/drivers/usb/gadget/audio.c b/drivers/usb/gadget/audio.c index 9d89ae4765a9..98899244860e 100644 --- a/drivers/usb/gadget/audio.c +++ b/drivers/usb/gadget/audio.c | |||
@@ -14,10 +14,8 @@ | |||
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/utsname.h> | 15 | #include <linux/utsname.h> |
16 | 16 | ||
17 | #include "u_audio.h" | ||
18 | |||
19 | #define DRIVER_DESC "Linux USB Audio Gadget" | 17 | #define DRIVER_DESC "Linux USB Audio Gadget" |
20 | #define DRIVER_VERSION "Dec 18, 2008" | 18 | #define DRIVER_VERSION "Feb 2, 2012" |
21 | 19 | ||
22 | /*-------------------------------------------------------------------------*/ | 20 | /*-------------------------------------------------------------------------*/ |
23 | 21 | ||
@@ -33,8 +31,36 @@ | |||
33 | #include "config.c" | 31 | #include "config.c" |
34 | #include "epautoconf.c" | 32 | #include "epautoconf.c" |
35 | 33 | ||
36 | #include "u_audio.c" | 34 | /* string IDs are assigned dynamically */ |
37 | #include "f_audio.c" | 35 | |
36 | #define STRING_MANUFACTURER_IDX 0 | ||
37 | #define STRING_PRODUCT_IDX 1 | ||
38 | |||
39 | static char manufacturer[50]; | ||
40 | |||
41 | static struct usb_string strings_dev[] = { | ||
42 | [STRING_MANUFACTURER_IDX].s = manufacturer, | ||
43 | [STRING_PRODUCT_IDX].s = DRIVER_DESC, | ||
44 | { } /* end of list */ | ||
45 | }; | ||
46 | |||
47 | static struct usb_gadget_strings stringtab_dev = { | ||
48 | .language = 0x0409, /* en-us */ | ||
49 | .strings = strings_dev, | ||
50 | }; | ||
51 | |||
52 | static struct usb_gadget_strings *audio_strings[] = { | ||
53 | &stringtab_dev, | ||
54 | NULL, | ||
55 | }; | ||
56 | |||
57 | #ifdef CONFIG_GADGET_UAC1 | ||
58 | #include "u_uac1.h" | ||
59 | #include "u_uac1.c" | ||
60 | #include "f_uac1.c" | ||
61 | #else | ||
62 | #include "f_uac2.c" | ||
63 | #endif | ||
38 | 64 | ||
39 | /*-------------------------------------------------------------------------*/ | 65 | /*-------------------------------------------------------------------------*/ |
40 | 66 | ||
@@ -54,9 +80,15 @@ static struct usb_device_descriptor device_desc = { | |||
54 | 80 | ||
55 | .bcdUSB = __constant_cpu_to_le16(0x200), | 81 | .bcdUSB = __constant_cpu_to_le16(0x200), |
56 | 82 | ||
83 | #ifdef CONFIG_GADGET_UAC1 | ||
57 | .bDeviceClass = USB_CLASS_PER_INTERFACE, | 84 | .bDeviceClass = USB_CLASS_PER_INTERFACE, |
58 | .bDeviceSubClass = 0, | 85 | .bDeviceSubClass = 0, |
59 | .bDeviceProtocol = 0, | 86 | .bDeviceProtocol = 0, |
87 | #else | ||
88 | .bDeviceClass = USB_CLASS_MISC, | ||
89 | .bDeviceSubClass = 0x02, | ||
90 | .bDeviceProtocol = 0x01, | ||
91 | #endif | ||
60 | /* .bMaxPacketSize0 = f(hardware) */ | 92 | /* .bMaxPacketSize0 = f(hardware) */ |
61 | 93 | ||
62 | /* Vendor and product id defaults change according to what configs | 94 | /* Vendor and product id defaults change according to what configs |
@@ -108,6 +140,9 @@ static struct usb_configuration audio_config_driver = { | |||
108 | .bConfigurationValue = 1, | 140 | .bConfigurationValue = 1, |
109 | /* .iConfiguration = DYNAMIC */ | 141 | /* .iConfiguration = DYNAMIC */ |
110 | .bmAttributes = USB_CONFIG_ATT_SELFPOWER, | 142 | .bmAttributes = USB_CONFIG_ATT_SELFPOWER, |
143 | #ifndef CONFIG_GADGET_UAC1 | ||
144 | .unbind = uac2_unbind_config, | ||
145 | #endif | ||
111 | }; | 146 | }; |
112 | 147 | ||
113 | /*-------------------------------------------------------------------------*/ | 148 | /*-------------------------------------------------------------------------*/ |
@@ -157,7 +192,9 @@ fail: | |||
157 | 192 | ||
158 | static int __exit audio_unbind(struct usb_composite_dev *cdev) | 193 | static int __exit audio_unbind(struct usb_composite_dev *cdev) |
159 | { | 194 | { |
195 | #ifdef CONFIG_GADGET_UAC1 | ||
160 | gaudio_cleanup(); | 196 | gaudio_cleanup(); |
197 | #endif | ||
161 | return 0; | 198 | return 0; |
162 | } | 199 | } |
163 | 200 | ||
diff --git a/drivers/usb/gadget/ci13xxx_msm.c b/drivers/usb/gadget/ci13xxx_msm.c index 1fc612914c52..d07e44c05e9b 100644 --- a/drivers/usb/gadget/ci13xxx_msm.c +++ b/drivers/usb/gadget/ci13xxx_msm.c | |||
@@ -37,10 +37,10 @@ static void ci13xxx_msm_notify_event(struct ci13xxx *udc, unsigned event) | |||
37 | * Put the transceiver in non-driving mode. Otherwise host | 37 | * Put the transceiver in non-driving mode. Otherwise host |
38 | * may not detect soft-disconnection. | 38 | * may not detect soft-disconnection. |
39 | */ | 39 | */ |
40 | val = otg_io_read(udc->transceiver, ULPI_FUNC_CTRL); | 40 | val = usb_phy_io_read(udc->transceiver, ULPI_FUNC_CTRL); |
41 | val &= ~ULPI_FUNC_CTRL_OPMODE_MASK; | 41 | val &= ~ULPI_FUNC_CTRL_OPMODE_MASK; |
42 | val |= ULPI_FUNC_CTRL_OPMODE_NONDRIVING; | 42 | val |= ULPI_FUNC_CTRL_OPMODE_NONDRIVING; |
43 | otg_io_write(udc->transceiver, val, ULPI_FUNC_CTRL); | 43 | usb_phy_io_write(udc->transceiver, val, ULPI_FUNC_CTRL); |
44 | break; | 44 | break; |
45 | default: | 45 | default: |
46 | dev_dbg(dev, "unknown ci13xxx_udc event\n"); | 46 | dev_dbg(dev, "unknown ci13xxx_udc event\n"); |
diff --git a/drivers/usb/gadget/ci13xxx_udc.c b/drivers/usb/gadget/ci13xxx_udc.c index 27e313718422..243ef1adf969 100644 --- a/drivers/usb/gadget/ci13xxx_udc.c +++ b/drivers/usb/gadget/ci13xxx_udc.c | |||
@@ -2181,6 +2181,7 @@ static int ep_disable(struct usb_ep *ep) | |||
2181 | } while (mEp->dir != direction); | 2181 | } while (mEp->dir != direction); |
2182 | 2182 | ||
2183 | mEp->desc = NULL; | 2183 | mEp->desc = NULL; |
2184 | mEp->ep.desc = NULL; | ||
2184 | 2185 | ||
2185 | spin_unlock_irqrestore(mEp->lock, flags); | 2186 | spin_unlock_irqrestore(mEp->lock, flags); |
2186 | return retval; | 2187 | return retval; |
@@ -2537,7 +2538,7 @@ static int ci13xxx_vbus_draw(struct usb_gadget *_gadget, unsigned mA) | |||
2537 | struct ci13xxx *udc = container_of(_gadget, struct ci13xxx, gadget); | 2538 | struct ci13xxx *udc = container_of(_gadget, struct ci13xxx, gadget); |
2538 | 2539 | ||
2539 | if (udc->transceiver) | 2540 | if (udc->transceiver) |
2540 | return otg_set_power(udc->transceiver, mA); | 2541 | return usb_phy_set_power(udc->transceiver, mA); |
2541 | return -ENOTSUPP; | 2542 | return -ENOTSUPP; |
2542 | } | 2543 | } |
2543 | 2544 | ||
@@ -2900,7 +2901,7 @@ static int udc_probe(struct ci13xxx_udc_driver *driver, struct device *dev, | |||
2900 | if (retval < 0) | 2901 | if (retval < 0) |
2901 | goto free_udc; | 2902 | goto free_udc; |
2902 | 2903 | ||
2903 | udc->transceiver = otg_get_transceiver(); | 2904 | udc->transceiver = usb_get_transceiver(); |
2904 | 2905 | ||
2905 | if (udc->udc_driver->flags & CI13XXX_REQUIRE_TRANSCEIVER) { | 2906 | if (udc->udc_driver->flags & CI13XXX_REQUIRE_TRANSCEIVER) { |
2906 | if (udc->transceiver == NULL) { | 2907 | if (udc->transceiver == NULL) { |
@@ -2928,7 +2929,8 @@ static int udc_probe(struct ci13xxx_udc_driver *driver, struct device *dev, | |||
2928 | goto unreg_device; | 2929 | goto unreg_device; |
2929 | 2930 | ||
2930 | if (udc->transceiver) { | 2931 | if (udc->transceiver) { |
2931 | retval = otg_set_peripheral(udc->transceiver, &udc->gadget); | 2932 | retval = otg_set_peripheral(udc->transceiver->otg, |
2933 | &udc->gadget); | ||
2932 | if (retval) | 2934 | if (retval) |
2933 | goto remove_dbg; | 2935 | goto remove_dbg; |
2934 | } | 2936 | } |
@@ -2945,8 +2947,8 @@ static int udc_probe(struct ci13xxx_udc_driver *driver, struct device *dev, | |||
2945 | 2947 | ||
2946 | remove_trans: | 2948 | remove_trans: |
2947 | if (udc->transceiver) { | 2949 | if (udc->transceiver) { |
2948 | otg_set_peripheral(udc->transceiver, &udc->gadget); | 2950 | otg_set_peripheral(udc->transceiver->otg, &udc->gadget); |
2949 | otg_put_transceiver(udc->transceiver); | 2951 | usb_put_transceiver(udc->transceiver); |
2950 | } | 2952 | } |
2951 | 2953 | ||
2952 | err("error = %i", retval); | 2954 | err("error = %i", retval); |
@@ -2958,7 +2960,7 @@ unreg_device: | |||
2958 | device_unregister(&udc->gadget.dev); | 2960 | device_unregister(&udc->gadget.dev); |
2959 | put_transceiver: | 2961 | put_transceiver: |
2960 | if (udc->transceiver) | 2962 | if (udc->transceiver) |
2961 | otg_put_transceiver(udc->transceiver); | 2963 | usb_put_transceiver(udc->transceiver); |
2962 | free_udc: | 2964 | free_udc: |
2963 | kfree(udc); | 2965 | kfree(udc); |
2964 | _udc = NULL; | 2966 | _udc = NULL; |
@@ -2981,8 +2983,8 @@ static void udc_remove(void) | |||
2981 | usb_del_gadget_udc(&udc->gadget); | 2983 | usb_del_gadget_udc(&udc->gadget); |
2982 | 2984 | ||
2983 | if (udc->transceiver) { | 2985 | if (udc->transceiver) { |
2984 | otg_set_peripheral(udc->transceiver, &udc->gadget); | 2986 | otg_set_peripheral(udc->transceiver->otg, &udc->gadget); |
2985 | otg_put_transceiver(udc->transceiver); | 2987 | usb_put_transceiver(udc->transceiver); |
2986 | } | 2988 | } |
2987 | #ifdef CONFIG_USB_GADGET_DEBUG_FILES | 2989 | #ifdef CONFIG_USB_GADGET_DEBUG_FILES |
2988 | dbg_remove_files(&udc->gadget.dev); | 2990 | dbg_remove_files(&udc->gadget.dev); |
diff --git a/drivers/usb/gadget/ci13xxx_udc.h b/drivers/usb/gadget/ci13xxx_udc.h index f4871e1fac59..0d31af56c989 100644 --- a/drivers/usb/gadget/ci13xxx_udc.h +++ b/drivers/usb/gadget/ci13xxx_udc.h | |||
@@ -136,7 +136,7 @@ struct ci13xxx { | |||
136 | struct usb_gadget_driver *driver; /* 3rd party gadget driver */ | 136 | struct usb_gadget_driver *driver; /* 3rd party gadget driver */ |
137 | struct ci13xxx_udc_driver *udc_driver; /* device controller driver */ | 137 | struct ci13xxx_udc_driver *udc_driver; /* device controller driver */ |
138 | int vbus_active; /* is VBUS active */ | 138 | int vbus_active; /* is VBUS active */ |
139 | struct otg_transceiver *transceiver; /* Transceiver struct */ | 139 | struct usb_phy *transceiver; /* Transceiver struct */ |
140 | }; | 140 | }; |
141 | 141 | ||
142 | /****************************************************************************** | 142 | /****************************************************************************** |
diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c index db815c2da7ed..e1cd56c5e2a8 100644 --- a/drivers/usb/gadget/dummy_hcd.c +++ b/drivers/usb/gadget/dummy_hcd.c | |||
@@ -39,27 +39,27 @@ | |||
39 | #include <linux/usb.h> | 39 | #include <linux/usb.h> |
40 | #include <linux/usb/gadget.h> | 40 | #include <linux/usb/gadget.h> |
41 | #include <linux/usb/hcd.h> | 41 | #include <linux/usb/hcd.h> |
42 | #include <linux/scatterlist.h> | ||
42 | 43 | ||
43 | #include <asm/byteorder.h> | 44 | #include <asm/byteorder.h> |
44 | #include <asm/io.h> | 45 | #include <linux/io.h> |
45 | #include <asm/irq.h> | 46 | #include <asm/irq.h> |
46 | #include <asm/system.h> | 47 | #include <asm/system.h> |
47 | #include <asm/unaligned.h> | 48 | #include <asm/unaligned.h> |
48 | 49 | ||
49 | |||
50 | #define DRIVER_DESC "USB Host+Gadget Emulator" | 50 | #define DRIVER_DESC "USB Host+Gadget Emulator" |
51 | #define DRIVER_VERSION "02 May 2005" | 51 | #define DRIVER_VERSION "02 May 2005" |
52 | 52 | ||
53 | #define POWER_BUDGET 500 /* in mA; use 8 for low-power port testing */ | 53 | #define POWER_BUDGET 500 /* in mA; use 8 for low-power port testing */ |
54 | 54 | ||
55 | static const char driver_name [] = "dummy_hcd"; | 55 | static const char driver_name[] = "dummy_hcd"; |
56 | static const char driver_desc [] = "USB Host+Gadget Emulator"; | 56 | static const char driver_desc[] = "USB Host+Gadget Emulator"; |
57 | 57 | ||
58 | static const char gadget_name [] = "dummy_udc"; | 58 | static const char gadget_name[] = "dummy_udc"; |
59 | 59 | ||
60 | MODULE_DESCRIPTION (DRIVER_DESC); | 60 | MODULE_DESCRIPTION(DRIVER_DESC); |
61 | MODULE_AUTHOR ("David Brownell"); | 61 | MODULE_AUTHOR("David Brownell"); |
62 | MODULE_LICENSE ("GPL"); | 62 | MODULE_LICENSE("GPL"); |
63 | 63 | ||
64 | struct dummy_hcd_module_parameters { | 64 | struct dummy_hcd_module_parameters { |
65 | bool is_super_speed; | 65 | bool is_super_speed; |
@@ -83,10 +83,11 @@ struct dummy_ep { | |||
83 | struct usb_gadget *gadget; | 83 | struct usb_gadget *gadget; |
84 | const struct usb_endpoint_descriptor *desc; | 84 | const struct usb_endpoint_descriptor *desc; |
85 | struct usb_ep ep; | 85 | struct usb_ep ep; |
86 | unsigned halted : 1; | 86 | unsigned halted:1; |
87 | unsigned wedged : 1; | 87 | unsigned wedged:1; |
88 | unsigned already_seen : 1; | 88 | unsigned already_seen:1; |
89 | unsigned setup_stage : 1; | 89 | unsigned setup_stage:1; |
90 | unsigned stream_en:1; | ||
90 | }; | 91 | }; |
91 | 92 | ||
92 | struct dummy_request { | 93 | struct dummy_request { |
@@ -94,15 +95,15 @@ struct dummy_request { | |||
94 | struct usb_request req; | 95 | struct usb_request req; |
95 | }; | 96 | }; |
96 | 97 | ||
97 | static inline struct dummy_ep *usb_ep_to_dummy_ep (struct usb_ep *_ep) | 98 | static inline struct dummy_ep *usb_ep_to_dummy_ep(struct usb_ep *_ep) |
98 | { | 99 | { |
99 | return container_of (_ep, struct dummy_ep, ep); | 100 | return container_of(_ep, struct dummy_ep, ep); |
100 | } | 101 | } |
101 | 102 | ||
102 | static inline struct dummy_request *usb_request_to_dummy_request | 103 | static inline struct dummy_request *usb_request_to_dummy_request |
103 | (struct usb_request *_req) | 104 | (struct usb_request *_req) |
104 | { | 105 | { |
105 | return container_of (_req, struct dummy_request, req); | 106 | return container_of(_req, struct dummy_request, req); |
106 | } | 107 | } |
107 | 108 | ||
108 | /*-------------------------------------------------------------------------*/ | 109 | /*-------------------------------------------------------------------------*/ |
@@ -121,9 +122,9 @@ static inline struct dummy_request *usb_request_to_dummy_request | |||
121 | * configurations, illegal or unsupported packet lengths, and so on. | 122 | * configurations, illegal or unsupported packet lengths, and so on. |
122 | */ | 123 | */ |
123 | 124 | ||
124 | static const char ep0name [] = "ep0"; | 125 | static const char ep0name[] = "ep0"; |
125 | 126 | ||
126 | static const char *const ep_name [] = { | 127 | static const char *const ep_name[] = { |
127 | ep0name, /* everyone has ep0 */ | 128 | ep0name, /* everyone has ep0 */ |
128 | 129 | ||
129 | /* act like a net2280: high speed, six configurable endpoints */ | 130 | /* act like a net2280: high speed, six configurable endpoints */ |
@@ -147,6 +148,8 @@ static const char *const ep_name [] = { | |||
147 | struct urbp { | 148 | struct urbp { |
148 | struct urb *urb; | 149 | struct urb *urb; |
149 | struct list_head urbp_list; | 150 | struct list_head urbp_list; |
151 | struct sg_mapping_iter miter; | ||
152 | u32 miter_started; | ||
150 | }; | 153 | }; |
151 | 154 | ||
152 | 155 | ||
@@ -166,6 +169,8 @@ struct dummy_hcd { | |||
166 | 169 | ||
167 | struct usb_device *udev; | 170 | struct usb_device *udev; |
168 | struct list_head urbp_list; | 171 | struct list_head urbp_list; |
172 | u32 stream_en_ep; | ||
173 | u8 num_stream[30 / 2]; | ||
169 | 174 | ||
170 | unsigned active:1; | 175 | unsigned active:1; |
171 | unsigned old_active:1; | 176 | unsigned old_active:1; |
@@ -178,12 +183,12 @@ struct dummy { | |||
178 | /* | 183 | /* |
179 | * SLAVE/GADGET side support | 184 | * SLAVE/GADGET side support |
180 | */ | 185 | */ |
181 | struct dummy_ep ep [DUMMY_ENDPOINTS]; | 186 | struct dummy_ep ep[DUMMY_ENDPOINTS]; |
182 | int address; | 187 | int address; |
183 | struct usb_gadget gadget; | 188 | struct usb_gadget gadget; |
184 | struct usb_gadget_driver *driver; | 189 | struct usb_gadget_driver *driver; |
185 | struct dummy_request fifo_req; | 190 | struct dummy_request fifo_req; |
186 | u8 fifo_buf [FIFO_SIZE]; | 191 | u8 fifo_buf[FIFO_SIZE]; |
187 | u16 devstatus; | 192 | u16 devstatus; |
188 | unsigned udc_suspended:1; | 193 | unsigned udc_suspended:1; |
189 | unsigned pullup:1; | 194 | unsigned pullup:1; |
@@ -210,14 +215,14 @@ static inline struct device *dummy_dev(struct dummy_hcd *dum) | |||
210 | return dummy_hcd_to_hcd(dum)->self.controller; | 215 | return dummy_hcd_to_hcd(dum)->self.controller; |
211 | } | 216 | } |
212 | 217 | ||
213 | static inline struct device *udc_dev (struct dummy *dum) | 218 | static inline struct device *udc_dev(struct dummy *dum) |
214 | { | 219 | { |
215 | return dum->gadget.dev.parent; | 220 | return dum->gadget.dev.parent; |
216 | } | 221 | } |
217 | 222 | ||
218 | static inline struct dummy *ep_to_dummy (struct dummy_ep *ep) | 223 | static inline struct dummy *ep_to_dummy(struct dummy_ep *ep) |
219 | { | 224 | { |
220 | return container_of (ep->gadget, struct dummy, gadget); | 225 | return container_of(ep->gadget, struct dummy, gadget); |
221 | } | 226 | } |
222 | 227 | ||
223 | static inline struct dummy_hcd *gadget_to_dummy_hcd(struct usb_gadget *gadget) | 228 | static inline struct dummy_hcd *gadget_to_dummy_hcd(struct usb_gadget *gadget) |
@@ -229,9 +234,9 @@ static inline struct dummy_hcd *gadget_to_dummy_hcd(struct usb_gadget *gadget) | |||
229 | return dum->hs_hcd; | 234 | return dum->hs_hcd; |
230 | } | 235 | } |
231 | 236 | ||
232 | static inline struct dummy *gadget_dev_to_dummy (struct device *dev) | 237 | static inline struct dummy *gadget_dev_to_dummy(struct device *dev) |
233 | { | 238 | { |
234 | return container_of (dev, struct dummy, gadget.dev); | 239 | return container_of(dev, struct dummy, gadget.dev); |
235 | } | 240 | } |
236 | 241 | ||
237 | static struct dummy the_controller; | 242 | static struct dummy the_controller; |
@@ -241,24 +246,23 @@ static struct dummy the_controller; | |||
241 | /* SLAVE/GADGET SIDE UTILITY ROUTINES */ | 246 | /* SLAVE/GADGET SIDE UTILITY ROUTINES */ |
242 | 247 | ||
243 | /* called with spinlock held */ | 248 | /* called with spinlock held */ |
244 | static void nuke (struct dummy *dum, struct dummy_ep *ep) | 249 | static void nuke(struct dummy *dum, struct dummy_ep *ep) |
245 | { | 250 | { |
246 | while (!list_empty (&ep->queue)) { | 251 | while (!list_empty(&ep->queue)) { |
247 | struct dummy_request *req; | 252 | struct dummy_request *req; |
248 | 253 | ||
249 | req = list_entry (ep->queue.next, struct dummy_request, queue); | 254 | req = list_entry(ep->queue.next, struct dummy_request, queue); |
250 | list_del_init (&req->queue); | 255 | list_del_init(&req->queue); |
251 | req->req.status = -ESHUTDOWN; | 256 | req->req.status = -ESHUTDOWN; |
252 | 257 | ||
253 | spin_unlock (&dum->lock); | 258 | spin_unlock(&dum->lock); |
254 | req->req.complete (&ep->ep, &req->req); | 259 | req->req.complete(&ep->ep, &req->req); |
255 | spin_lock (&dum->lock); | 260 | spin_lock(&dum->lock); |
256 | } | 261 | } |
257 | } | 262 | } |
258 | 263 | ||
259 | /* caller must hold lock */ | 264 | /* caller must hold lock */ |
260 | static void | 265 | static void stop_activity(struct dummy *dum) |
261 | stop_activity (struct dummy *dum) | ||
262 | { | 266 | { |
263 | struct dummy_ep *ep; | 267 | struct dummy_ep *ep; |
264 | 268 | ||
@@ -268,8 +272,8 @@ stop_activity (struct dummy *dum) | |||
268 | /* The timer is left running so that outstanding URBs can fail */ | 272 | /* The timer is left running so that outstanding URBs can fail */ |
269 | 273 | ||
270 | /* nuke any pending requests first, so driver i/o is quiesced */ | 274 | /* nuke any pending requests first, so driver i/o is quiesced */ |
271 | list_for_each_entry (ep, &dum->gadget.ep_list, ep.ep_list) | 275 | list_for_each_entry(ep, &dum->gadget.ep_list, ep.ep_list) |
272 | nuke (dum, ep); | 276 | nuke(dum, ep); |
273 | 277 | ||
274 | /* driver now does any non-usb quiescing necessary */ | 278 | /* driver now does any non-usb quiescing necessary */ |
275 | } | 279 | } |
@@ -404,8 +408,8 @@ static void set_link_state(struct dummy_hcd *dum_hcd) | |||
404 | #define is_enabled(dum) \ | 408 | #define is_enabled(dum) \ |
405 | (dum->port_status & USB_PORT_STAT_ENABLE) | 409 | (dum->port_status & USB_PORT_STAT_ENABLE) |
406 | 410 | ||
407 | static int | 411 | static int dummy_enable(struct usb_ep *_ep, |
408 | dummy_enable (struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | 412 | const struct usb_endpoint_descriptor *desc) |
409 | { | 413 | { |
410 | struct dummy *dum; | 414 | struct dummy *dum; |
411 | struct dummy_hcd *dum_hcd; | 415 | struct dummy_hcd *dum_hcd; |
@@ -413,11 +417,11 @@ dummy_enable (struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | |||
413 | unsigned max; | 417 | unsigned max; |
414 | int retval; | 418 | int retval; |
415 | 419 | ||
416 | ep = usb_ep_to_dummy_ep (_ep); | 420 | ep = usb_ep_to_dummy_ep(_ep); |
417 | if (!_ep || !desc || ep->desc || _ep->name == ep0name | 421 | if (!_ep || !desc || ep->desc || _ep->name == ep0name |
418 | || desc->bDescriptorType != USB_DT_ENDPOINT) | 422 | || desc->bDescriptorType != USB_DT_ENDPOINT) |
419 | return -EINVAL; | 423 | return -EINVAL; |
420 | dum = ep_to_dummy (ep); | 424 | dum = ep_to_dummy(ep); |
421 | if (!dum->driver) | 425 | if (!dum->driver) |
422 | return -ESHUTDOWN; | 426 | return -ESHUTDOWN; |
423 | 427 | ||
@@ -441,10 +445,10 @@ dummy_enable (struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | |||
441 | * especially for "ep9out" style fixed function ones.) | 445 | * especially for "ep9out" style fixed function ones.) |
442 | */ | 446 | */ |
443 | retval = -EINVAL; | 447 | retval = -EINVAL; |
444 | switch (desc->bmAttributes & 0x03) { | 448 | switch (usb_endpoint_type(desc)) { |
445 | case USB_ENDPOINT_XFER_BULK: | 449 | case USB_ENDPOINT_XFER_BULK: |
446 | if (strstr (ep->ep.name, "-iso") | 450 | if (strstr(ep->ep.name, "-iso") |
447 | || strstr (ep->ep.name, "-int")) { | 451 | || strstr(ep->ep.name, "-int")) { |
448 | goto done; | 452 | goto done; |
449 | } | 453 | } |
450 | switch (dum->gadget.speed) { | 454 | switch (dum->gadget.speed) { |
@@ -466,7 +470,7 @@ dummy_enable (struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | |||
466 | } | 470 | } |
467 | break; | 471 | break; |
468 | case USB_ENDPOINT_XFER_INT: | 472 | case USB_ENDPOINT_XFER_INT: |
469 | if (strstr (ep->ep.name, "-iso")) /* bulk is ok */ | 473 | if (strstr(ep->ep.name, "-iso")) /* bulk is ok */ |
470 | goto done; | 474 | goto done; |
471 | /* real hardware might not handle all packet sizes */ | 475 | /* real hardware might not handle all packet sizes */ |
472 | switch (dum->gadget.speed) { | 476 | switch (dum->gadget.speed) { |
@@ -486,8 +490,8 @@ dummy_enable (struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | |||
486 | } | 490 | } |
487 | break; | 491 | break; |
488 | case USB_ENDPOINT_XFER_ISOC: | 492 | case USB_ENDPOINT_XFER_ISOC: |
489 | if (strstr (ep->ep.name, "-bulk") | 493 | if (strstr(ep->ep.name, "-bulk") |
490 | || strstr (ep->ep.name, "-int")) | 494 | || strstr(ep->ep.name, "-int")) |
491 | goto done; | 495 | goto done; |
492 | /* real hardware might not handle all packet sizes */ | 496 | /* real hardware might not handle all packet sizes */ |
493 | switch (dum->gadget.speed) { | 497 | switch (dum->gadget.speed) { |
@@ -510,14 +514,22 @@ dummy_enable (struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | |||
510 | } | 514 | } |
511 | 515 | ||
512 | _ep->maxpacket = max; | 516 | _ep->maxpacket = max; |
517 | if (usb_ss_max_streams(_ep->comp_desc)) { | ||
518 | if (!usb_endpoint_xfer_bulk(desc)) { | ||
519 | dev_err(udc_dev(dum), "Can't enable stream support on " | ||
520 | "non-bulk ep %s\n", _ep->name); | ||
521 | return -EINVAL; | ||
522 | } | ||
523 | ep->stream_en = 1; | ||
524 | } | ||
513 | ep->desc = desc; | 525 | ep->desc = desc; |
514 | 526 | ||
515 | dev_dbg (udc_dev(dum), "enabled %s (ep%d%s-%s) maxpacket %d\n", | 527 | dev_dbg(udc_dev(dum), "enabled %s (ep%d%s-%s) maxpacket %d stream %s\n", |
516 | _ep->name, | 528 | _ep->name, |
517 | desc->bEndpointAddress & 0x0f, | 529 | desc->bEndpointAddress & 0x0f, |
518 | (desc->bEndpointAddress & USB_DIR_IN) ? "in" : "out", | 530 | (desc->bEndpointAddress & USB_DIR_IN) ? "in" : "out", |
519 | ({ char *val; | 531 | ({ char *val; |
520 | switch (desc->bmAttributes & 0x03) { | 532 | switch (usb_endpoint_type(desc)) { |
521 | case USB_ENDPOINT_XFER_BULK: | 533 | case USB_ENDPOINT_XFER_BULK: |
522 | val = "bulk"; | 534 | val = "bulk"; |
523 | break; | 535 | break; |
@@ -531,7 +543,7 @@ dummy_enable (struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | |||
531 | val = "ctrl"; | 543 | val = "ctrl"; |
532 | break; | 544 | break; |
533 | }; val; }), | 545 | }; val; }), |
534 | max); | 546 | max, ep->stream_en ? "enabled" : "disabled"); |
535 | 547 | ||
536 | /* at this point real hardware should be NAKing transfers | 548 | /* at this point real hardware should be NAKing transfers |
537 | * to that endpoint, until a buffer is queued to it. | 549 | * to that endpoint, until a buffer is queued to it. |
@@ -542,67 +554,67 @@ done: | |||
542 | return retval; | 554 | return retval; |
543 | } | 555 | } |
544 | 556 | ||
545 | static int dummy_disable (struct usb_ep *_ep) | 557 | static int dummy_disable(struct usb_ep *_ep) |
546 | { | 558 | { |
547 | struct dummy_ep *ep; | 559 | struct dummy_ep *ep; |
548 | struct dummy *dum; | 560 | struct dummy *dum; |
549 | unsigned long flags; | 561 | unsigned long flags; |
550 | int retval; | 562 | int retval; |
551 | 563 | ||
552 | ep = usb_ep_to_dummy_ep (_ep); | 564 | ep = usb_ep_to_dummy_ep(_ep); |
553 | if (!_ep || !ep->desc || _ep->name == ep0name) | 565 | if (!_ep || !ep->desc || _ep->name == ep0name) |
554 | return -EINVAL; | 566 | return -EINVAL; |
555 | dum = ep_to_dummy (ep); | 567 | dum = ep_to_dummy(ep); |
556 | 568 | ||
557 | spin_lock_irqsave (&dum->lock, flags); | 569 | spin_lock_irqsave(&dum->lock, flags); |
558 | ep->desc = NULL; | 570 | ep->desc = NULL; |
571 | ep->stream_en = 0; | ||
559 | retval = 0; | 572 | retval = 0; |
560 | nuke (dum, ep); | 573 | nuke(dum, ep); |
561 | spin_unlock_irqrestore (&dum->lock, flags); | 574 | spin_unlock_irqrestore(&dum->lock, flags); |
562 | 575 | ||
563 | dev_dbg (udc_dev(dum), "disabled %s\n", _ep->name); | 576 | dev_dbg(udc_dev(dum), "disabled %s\n", _ep->name); |
564 | return retval; | 577 | return retval; |
565 | } | 578 | } |
566 | 579 | ||
567 | static struct usb_request * | 580 | static struct usb_request *dummy_alloc_request(struct usb_ep *_ep, |
568 | dummy_alloc_request (struct usb_ep *_ep, gfp_t mem_flags) | 581 | gfp_t mem_flags) |
569 | { | 582 | { |
570 | struct dummy_ep *ep; | 583 | struct dummy_ep *ep; |
571 | struct dummy_request *req; | 584 | struct dummy_request *req; |
572 | 585 | ||
573 | if (!_ep) | 586 | if (!_ep) |
574 | return NULL; | 587 | return NULL; |
575 | ep = usb_ep_to_dummy_ep (_ep); | 588 | ep = usb_ep_to_dummy_ep(_ep); |
576 | 589 | ||
577 | req = kzalloc(sizeof(*req), mem_flags); | 590 | req = kzalloc(sizeof(*req), mem_flags); |
578 | if (!req) | 591 | if (!req) |
579 | return NULL; | 592 | return NULL; |
580 | INIT_LIST_HEAD (&req->queue); | 593 | INIT_LIST_HEAD(&req->queue); |
581 | return &req->req; | 594 | return &req->req; |
582 | } | 595 | } |
583 | 596 | ||
584 | static void | 597 | static void dummy_free_request(struct usb_ep *_ep, struct usb_request *_req) |
585 | dummy_free_request (struct usb_ep *_ep, struct usb_request *_req) | ||
586 | { | 598 | { |
587 | struct dummy_ep *ep; | 599 | struct dummy_ep *ep; |
588 | struct dummy_request *req; | 600 | struct dummy_request *req; |
589 | 601 | ||
590 | ep = usb_ep_to_dummy_ep (_ep); | 602 | if (!_ep || !_req) |
591 | if (!ep || !_req || (!ep->desc && _ep->name != ep0name)) | 603 | return; |
604 | ep = usb_ep_to_dummy_ep(_ep); | ||
605 | if (!ep->desc && _ep->name != ep0name) | ||
592 | return; | 606 | return; |
593 | 607 | ||
594 | req = usb_request_to_dummy_request (_req); | 608 | req = usb_request_to_dummy_request(_req); |
595 | WARN_ON (!list_empty (&req->queue)); | 609 | WARN_ON(!list_empty(&req->queue)); |
596 | kfree (req); | 610 | kfree(req); |
597 | } | 611 | } |
598 | 612 | ||
599 | static void | 613 | static void fifo_complete(struct usb_ep *ep, struct usb_request *req) |
600 | fifo_complete (struct usb_ep *ep, struct usb_request *req) | ||
601 | { | 614 | { |
602 | } | 615 | } |
603 | 616 | ||
604 | static int | 617 | static int dummy_queue(struct usb_ep *_ep, struct usb_request *_req, |
605 | dummy_queue (struct usb_ep *_ep, struct usb_request *_req, | ||
606 | gfp_t mem_flags) | 618 | gfp_t mem_flags) |
607 | { | 619 | { |
608 | struct dummy_ep *ep; | 620 | struct dummy_ep *ep; |
@@ -611,49 +623,48 @@ dummy_queue (struct usb_ep *_ep, struct usb_request *_req, | |||
611 | struct dummy_hcd *dum_hcd; | 623 | struct dummy_hcd *dum_hcd; |
612 | unsigned long flags; | 624 | unsigned long flags; |
613 | 625 | ||
614 | req = usb_request_to_dummy_request (_req); | 626 | req = usb_request_to_dummy_request(_req); |
615 | if (!_req || !list_empty (&req->queue) || !_req->complete) | 627 | if (!_req || !list_empty(&req->queue) || !_req->complete) |
616 | return -EINVAL; | 628 | return -EINVAL; |
617 | 629 | ||
618 | ep = usb_ep_to_dummy_ep (_ep); | 630 | ep = usb_ep_to_dummy_ep(_ep); |
619 | if (!_ep || (!ep->desc && _ep->name != ep0name)) | 631 | if (!_ep || (!ep->desc && _ep->name != ep0name)) |
620 | return -EINVAL; | 632 | return -EINVAL; |
621 | 633 | ||
622 | dum = ep_to_dummy (ep); | 634 | dum = ep_to_dummy(ep); |
623 | dum_hcd = gadget_to_dummy_hcd(&dum->gadget); | 635 | dum_hcd = gadget_to_dummy_hcd(&dum->gadget); |
624 | if (!dum->driver || !is_enabled(dum_hcd)) | 636 | if (!dum->driver || !is_enabled(dum_hcd)) |
625 | return -ESHUTDOWN; | 637 | return -ESHUTDOWN; |
626 | 638 | ||
627 | #if 0 | 639 | #if 0 |
628 | dev_dbg (udc_dev(dum), "ep %p queue req %p to %s, len %d buf %p\n", | 640 | dev_dbg(udc_dev(dum), "ep %p queue req %p to %s, len %d buf %p\n", |
629 | ep, _req, _ep->name, _req->length, _req->buf); | 641 | ep, _req, _ep->name, _req->length, _req->buf); |
630 | #endif | 642 | #endif |
631 | |||
632 | _req->status = -EINPROGRESS; | 643 | _req->status = -EINPROGRESS; |
633 | _req->actual = 0; | 644 | _req->actual = 0; |
634 | spin_lock_irqsave (&dum->lock, flags); | 645 | spin_lock_irqsave(&dum->lock, flags); |
635 | 646 | ||
636 | /* implement an emulated single-request FIFO */ | 647 | /* implement an emulated single-request FIFO */ |
637 | if (ep->desc && (ep->desc->bEndpointAddress & USB_DIR_IN) && | 648 | if (ep->desc && (ep->desc->bEndpointAddress & USB_DIR_IN) && |
638 | list_empty (&dum->fifo_req.queue) && | 649 | list_empty(&dum->fifo_req.queue) && |
639 | list_empty (&ep->queue) && | 650 | list_empty(&ep->queue) && |
640 | _req->length <= FIFO_SIZE) { | 651 | _req->length <= FIFO_SIZE) { |
641 | req = &dum->fifo_req; | 652 | req = &dum->fifo_req; |
642 | req->req = *_req; | 653 | req->req = *_req; |
643 | req->req.buf = dum->fifo_buf; | 654 | req->req.buf = dum->fifo_buf; |
644 | memcpy (dum->fifo_buf, _req->buf, _req->length); | 655 | memcpy(dum->fifo_buf, _req->buf, _req->length); |
645 | req->req.context = dum; | 656 | req->req.context = dum; |
646 | req->req.complete = fifo_complete; | 657 | req->req.complete = fifo_complete; |
647 | 658 | ||
648 | list_add_tail(&req->queue, &ep->queue); | 659 | list_add_tail(&req->queue, &ep->queue); |
649 | spin_unlock (&dum->lock); | 660 | spin_unlock(&dum->lock); |
650 | _req->actual = _req->length; | 661 | _req->actual = _req->length; |
651 | _req->status = 0; | 662 | _req->status = 0; |
652 | _req->complete (_ep, _req); | 663 | _req->complete(_ep, _req); |
653 | spin_lock (&dum->lock); | 664 | spin_lock(&dum->lock); |
654 | } else | 665 | } else |
655 | list_add_tail(&req->queue, &ep->queue); | 666 | list_add_tail(&req->queue, &ep->queue); |
656 | spin_unlock_irqrestore (&dum->lock, flags); | 667 | spin_unlock_irqrestore(&dum->lock, flags); |
657 | 668 | ||
658 | /* real hardware would likely enable transfers here, in case | 669 | /* real hardware would likely enable transfers here, in case |
659 | * it'd been left NAKing. | 670 | * it'd been left NAKing. |
@@ -661,7 +672,7 @@ dummy_queue (struct usb_ep *_ep, struct usb_request *_req, | |||
661 | return 0; | 672 | return 0; |
662 | } | 673 | } |
663 | 674 | ||
664 | static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req) | 675 | static int dummy_dequeue(struct usb_ep *_ep, struct usb_request *_req) |
665 | { | 676 | { |
666 | struct dummy_ep *ep; | 677 | struct dummy_ep *ep; |
667 | struct dummy *dum; | 678 | struct dummy *dum; |
@@ -671,31 +682,31 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req) | |||
671 | 682 | ||
672 | if (!_ep || !_req) | 683 | if (!_ep || !_req) |
673 | return retval; | 684 | return retval; |
674 | ep = usb_ep_to_dummy_ep (_ep); | 685 | ep = usb_ep_to_dummy_ep(_ep); |
675 | dum = ep_to_dummy (ep); | 686 | dum = ep_to_dummy(ep); |
676 | 687 | ||
677 | if (!dum->driver) | 688 | if (!dum->driver) |
678 | return -ESHUTDOWN; | 689 | return -ESHUTDOWN; |
679 | 690 | ||
680 | local_irq_save (flags); | 691 | local_irq_save(flags); |
681 | spin_lock (&dum->lock); | 692 | spin_lock(&dum->lock); |
682 | list_for_each_entry (req, &ep->queue, queue) { | 693 | list_for_each_entry(req, &ep->queue, queue) { |
683 | if (&req->req == _req) { | 694 | if (&req->req == _req) { |
684 | list_del_init (&req->queue); | 695 | list_del_init(&req->queue); |
685 | _req->status = -ECONNRESET; | 696 | _req->status = -ECONNRESET; |
686 | retval = 0; | 697 | retval = 0; |
687 | break; | 698 | break; |
688 | } | 699 | } |
689 | } | 700 | } |
690 | spin_unlock (&dum->lock); | 701 | spin_unlock(&dum->lock); |
691 | 702 | ||
692 | if (retval == 0) { | 703 | if (retval == 0) { |
693 | dev_dbg (udc_dev(dum), | 704 | dev_dbg(udc_dev(dum), |
694 | "dequeued req %p from %s, len %d buf %p\n", | 705 | "dequeued req %p from %s, len %d buf %p\n", |
695 | req, _ep->name, _req->length, _req->buf); | 706 | req, _ep->name, _req->length, _req->buf); |
696 | _req->complete (_ep, _req); | 707 | _req->complete(_ep, _req); |
697 | } | 708 | } |
698 | local_irq_restore (flags); | 709 | local_irq_restore(flags); |
699 | return retval; | 710 | return retval; |
700 | } | 711 | } |
701 | 712 | ||
@@ -707,14 +718,14 @@ dummy_set_halt_and_wedge(struct usb_ep *_ep, int value, int wedged) | |||
707 | 718 | ||
708 | if (!_ep) | 719 | if (!_ep) |
709 | return -EINVAL; | 720 | return -EINVAL; |
710 | ep = usb_ep_to_dummy_ep (_ep); | 721 | ep = usb_ep_to_dummy_ep(_ep); |
711 | dum = ep_to_dummy (ep); | 722 | dum = ep_to_dummy(ep); |
712 | if (!dum->driver) | 723 | if (!dum->driver) |
713 | return -ESHUTDOWN; | 724 | return -ESHUTDOWN; |
714 | if (!value) | 725 | if (!value) |
715 | ep->halted = ep->wedged = 0; | 726 | ep->halted = ep->wedged = 0; |
716 | else if (ep->desc && (ep->desc->bEndpointAddress & USB_DIR_IN) && | 727 | else if (ep->desc && (ep->desc->bEndpointAddress & USB_DIR_IN) && |
717 | !list_empty (&ep->queue)) | 728 | !list_empty(&ep->queue)) |
718 | return -EAGAIN; | 729 | return -EAGAIN; |
719 | else { | 730 | else { |
720 | ep->halted = 1; | 731 | ep->halted = 1; |
@@ -755,15 +766,15 @@ static const struct usb_ep_ops dummy_ep_ops = { | |||
755 | /*-------------------------------------------------------------------------*/ | 766 | /*-------------------------------------------------------------------------*/ |
756 | 767 | ||
757 | /* there are both host and device side versions of this call ... */ | 768 | /* there are both host and device side versions of this call ... */ |
758 | static int dummy_g_get_frame (struct usb_gadget *_gadget) | 769 | static int dummy_g_get_frame(struct usb_gadget *_gadget) |
759 | { | 770 | { |
760 | struct timeval tv; | 771 | struct timeval tv; |
761 | 772 | ||
762 | do_gettimeofday (&tv); | 773 | do_gettimeofday(&tv); |
763 | return tv.tv_usec / 1000; | 774 | return tv.tv_usec / 1000; |
764 | } | 775 | } |
765 | 776 | ||
766 | static int dummy_wakeup (struct usb_gadget *_gadget) | 777 | static int dummy_wakeup(struct usb_gadget *_gadget) |
767 | { | 778 | { |
768 | struct dummy_hcd *dum_hcd; | 779 | struct dummy_hcd *dum_hcd; |
769 | 780 | ||
@@ -786,11 +797,11 @@ static int dummy_wakeup (struct usb_gadget *_gadget) | |||
786 | return 0; | 797 | return 0; |
787 | } | 798 | } |
788 | 799 | ||
789 | static int dummy_set_selfpowered (struct usb_gadget *_gadget, int value) | 800 | static int dummy_set_selfpowered(struct usb_gadget *_gadget, int value) |
790 | { | 801 | { |
791 | struct dummy *dum; | 802 | struct dummy *dum; |
792 | 803 | ||
793 | dum = (gadget_to_dummy_hcd(_gadget))->dum; | 804 | dum = gadget_to_dummy_hcd(_gadget)->dum; |
794 | if (value) | 805 | if (value) |
795 | dum->devstatus |= (1 << USB_DEVICE_SELF_POWERED); | 806 | dum->devstatus |= (1 << USB_DEVICE_SELF_POWERED); |
796 | else | 807 | else |
@@ -798,22 +809,15 @@ static int dummy_set_selfpowered (struct usb_gadget *_gadget, int value) | |||
798 | return 0; | 809 | return 0; |
799 | } | 810 | } |
800 | 811 | ||
801 | static void dummy_udc_udpate_ep0(struct dummy *dum) | 812 | static void dummy_udc_update_ep0(struct dummy *dum) |
802 | { | 813 | { |
803 | u32 i; | 814 | if (dum->gadget.speed == USB_SPEED_SUPER) |
804 | |||
805 | if (dum->gadget.speed == USB_SPEED_SUPER) { | ||
806 | for (i = 0; i < DUMMY_ENDPOINTS; i++) | ||
807 | dum->ep[i].ep.max_streams = 0x10; | ||
808 | dum->ep[0].ep.maxpacket = 9; | 815 | dum->ep[0].ep.maxpacket = 9; |
809 | } else { | 816 | else |
810 | for (i = 0; i < DUMMY_ENDPOINTS; i++) | ||
811 | dum->ep[i].ep.max_streams = 0; | ||
812 | dum->ep[0].ep.maxpacket = 64; | 817 | dum->ep[0].ep.maxpacket = 64; |
813 | } | ||
814 | } | 818 | } |
815 | 819 | ||
816 | static int dummy_pullup (struct usb_gadget *_gadget, int value) | 820 | static int dummy_pullup(struct usb_gadget *_gadget, int value) |
817 | { | 821 | { |
818 | struct dummy_hcd *dum_hcd; | 822 | struct dummy_hcd *dum_hcd; |
819 | struct dummy *dum; | 823 | struct dummy *dum; |
@@ -829,7 +833,7 @@ static int dummy_pullup (struct usb_gadget *_gadget, int value) | |||
829 | dum->driver->max_speed); | 833 | dum->driver->max_speed); |
830 | else | 834 | else |
831 | dum->gadget.speed = USB_SPEED_FULL; | 835 | dum->gadget.speed = USB_SPEED_FULL; |
832 | dummy_udc_udpate_ep0(dum); | 836 | dummy_udc_update_ep0(dum); |
833 | 837 | ||
834 | if (dum->gadget.speed < dum->driver->max_speed) | 838 | if (dum->gadget.speed < dum->driver->max_speed) |
835 | dev_dbg(udc_dev(dum), "This device can perform faster" | 839 | dev_dbg(udc_dev(dum), "This device can perform faster" |
@@ -838,10 +842,10 @@ static int dummy_pullup (struct usb_gadget *_gadget, int value) | |||
838 | } | 842 | } |
839 | dum_hcd = gadget_to_dummy_hcd(_gadget); | 843 | dum_hcd = gadget_to_dummy_hcd(_gadget); |
840 | 844 | ||
841 | spin_lock_irqsave (&dum->lock, flags); | 845 | spin_lock_irqsave(&dum->lock, flags); |
842 | dum->pullup = (value != 0); | 846 | dum->pullup = (value != 0); |
843 | set_link_state(dum_hcd); | 847 | set_link_state(dum_hcd); |
844 | spin_unlock_irqrestore (&dum->lock, flags); | 848 | spin_unlock_irqrestore(&dum->lock, flags); |
845 | 849 | ||
846 | usb_hcd_poll_rh_status(dummy_hcd_to_hcd(dum_hcd)); | 850 | usb_hcd_poll_rh_status(dummy_hcd_to_hcd(dum_hcd)); |
847 | return 0; | 851 | return 0; |
@@ -864,16 +868,16 @@ static const struct usb_gadget_ops dummy_ops = { | |||
864 | /*-------------------------------------------------------------------------*/ | 868 | /*-------------------------------------------------------------------------*/ |
865 | 869 | ||
866 | /* "function" sysfs attribute */ | 870 | /* "function" sysfs attribute */ |
867 | static ssize_t | 871 | static ssize_t show_function(struct device *dev, struct device_attribute *attr, |
868 | show_function (struct device *dev, struct device_attribute *attr, char *buf) | 872 | char *buf) |
869 | { | 873 | { |
870 | struct dummy *dum = gadget_dev_to_dummy (dev); | 874 | struct dummy *dum = gadget_dev_to_dummy(dev); |
871 | 875 | ||
872 | if (!dum->driver || !dum->driver->function) | 876 | if (!dum->driver || !dum->driver->function) |
873 | return 0; | 877 | return 0; |
874 | return scnprintf (buf, PAGE_SIZE, "%s\n", dum->driver->function); | 878 | return scnprintf(buf, PAGE_SIZE, "%s\n", dum->driver->function); |
875 | } | 879 | } |
876 | static DEVICE_ATTR (function, S_IRUGO, show_function, NULL); | 880 | static DEVICE_ATTR(function, S_IRUGO, show_function, NULL); |
877 | 881 | ||
878 | /*-------------------------------------------------------------------------*/ | 882 | /*-------------------------------------------------------------------------*/ |
879 | 883 | ||
@@ -908,7 +912,7 @@ static int dummy_udc_start(struct usb_gadget *g, | |||
908 | dum->devstatus = 0; | 912 | dum->devstatus = 0; |
909 | 913 | ||
910 | dum->driver = driver; | 914 | dum->driver = driver; |
911 | dev_dbg (udc_dev(dum), "binding gadget driver '%s'\n", | 915 | dev_dbg(udc_dev(dum), "binding gadget driver '%s'\n", |
912 | driver->driver.name); | 916 | driver->driver.name); |
913 | return 0; | 917 | return 0; |
914 | } | 918 | } |
@@ -919,7 +923,7 @@ static int dummy_udc_stop(struct usb_gadget *g, | |||
919 | struct dummy_hcd *dum_hcd = gadget_to_dummy_hcd(g); | 923 | struct dummy_hcd *dum_hcd = gadget_to_dummy_hcd(g); |
920 | struct dummy *dum = dum_hcd->dum; | 924 | struct dummy *dum = dum_hcd->dum; |
921 | 925 | ||
922 | dev_dbg (udc_dev(dum), "unregister gadget driver '%s'\n", | 926 | dev_dbg(udc_dev(dum), "unregister gadget driver '%s'\n", |
923 | driver->driver.name); | 927 | driver->driver.name); |
924 | 928 | ||
925 | dum->driver = NULL; | 929 | dum->driver = NULL; |
@@ -932,8 +936,7 @@ static int dummy_udc_stop(struct usb_gadget *g, | |||
932 | 936 | ||
933 | /* The gadget structure is stored inside the hcd structure and will be | 937 | /* The gadget structure is stored inside the hcd structure and will be |
934 | * released along with it. */ | 938 | * released along with it. */ |
935 | static void | 939 | static void dummy_gadget_release(struct device *dev) |
936 | dummy_gadget_release (struct device *dev) | ||
937 | { | 940 | { |
938 | return; | 941 | return; |
939 | } | 942 | } |
@@ -954,6 +957,7 @@ static void init_dummy_udc_hw(struct dummy *dum) | |||
954 | ep->halted = ep->wedged = ep->already_seen = | 957 | ep->halted = ep->wedged = ep->already_seen = |
955 | ep->setup_stage = 0; | 958 | ep->setup_stage = 0; |
956 | ep->ep.maxpacket = ~0; | 959 | ep->ep.maxpacket = ~0; |
960 | ep->ep.max_streams = 16; | ||
957 | ep->last_io = jiffies; | 961 | ep->last_io = jiffies; |
958 | ep->gadget = &dum->gadget; | 962 | ep->gadget = &dum->gadget; |
959 | ep->desc = NULL; | 963 | ep->desc = NULL; |
@@ -969,7 +973,7 @@ static void init_dummy_udc_hw(struct dummy *dum) | |||
969 | #endif | 973 | #endif |
970 | } | 974 | } |
971 | 975 | ||
972 | static int dummy_udc_probe (struct platform_device *pdev) | 976 | static int dummy_udc_probe(struct platform_device *pdev) |
973 | { | 977 | { |
974 | struct dummy *dum = &the_controller; | 978 | struct dummy *dum = &the_controller; |
975 | int rc; | 979 | int rc; |
@@ -981,7 +985,7 @@ static int dummy_udc_probe (struct platform_device *pdev) | |||
981 | dev_set_name(&dum->gadget.dev, "gadget"); | 985 | dev_set_name(&dum->gadget.dev, "gadget"); |
982 | dum->gadget.dev.parent = &pdev->dev; | 986 | dum->gadget.dev.parent = &pdev->dev; |
983 | dum->gadget.dev.release = dummy_gadget_release; | 987 | dum->gadget.dev.release = dummy_gadget_release; |
984 | rc = device_register (&dum->gadget.dev); | 988 | rc = device_register(&dum->gadget.dev); |
985 | if (rc < 0) { | 989 | if (rc < 0) { |
986 | put_device(&dum->gadget.dev); | 990 | put_device(&dum->gadget.dev); |
987 | return rc; | 991 | return rc; |
@@ -993,7 +997,7 @@ static int dummy_udc_probe (struct platform_device *pdev) | |||
993 | if (rc < 0) | 997 | if (rc < 0) |
994 | goto err_udc; | 998 | goto err_udc; |
995 | 999 | ||
996 | rc = device_create_file (&dum->gadget.dev, &dev_attr_function); | 1000 | rc = device_create_file(&dum->gadget.dev, &dev_attr_function); |
997 | if (rc < 0) | 1001 | if (rc < 0) |
998 | goto err_dev; | 1002 | goto err_dev; |
999 | platform_set_drvdata(pdev, dum); | 1003 | platform_set_drvdata(pdev, dum); |
@@ -1006,14 +1010,14 @@ err_udc: | |||
1006 | return rc; | 1010 | return rc; |
1007 | } | 1011 | } |
1008 | 1012 | ||
1009 | static int dummy_udc_remove (struct platform_device *pdev) | 1013 | static int dummy_udc_remove(struct platform_device *pdev) |
1010 | { | 1014 | { |
1011 | struct dummy *dum = platform_get_drvdata (pdev); | 1015 | struct dummy *dum = platform_get_drvdata(pdev); |
1012 | 1016 | ||
1013 | usb_del_gadget_udc(&dum->gadget); | 1017 | usb_del_gadget_udc(&dum->gadget); |
1014 | platform_set_drvdata (pdev, NULL); | 1018 | platform_set_drvdata(pdev, NULL); |
1015 | device_remove_file (&dum->gadget.dev, &dev_attr_function); | 1019 | device_remove_file(&dum->gadget.dev, &dev_attr_function); |
1016 | device_unregister (&dum->gadget.dev); | 1020 | device_unregister(&dum->gadget.dev); |
1017 | return 0; | 1021 | return 0; |
1018 | } | 1022 | } |
1019 | 1023 | ||
@@ -1061,6 +1065,16 @@ static struct platform_driver dummy_udc_driver = { | |||
1061 | 1065 | ||
1062 | /*-------------------------------------------------------------------------*/ | 1066 | /*-------------------------------------------------------------------------*/ |
1063 | 1067 | ||
1068 | static unsigned int dummy_get_ep_idx(const struct usb_endpoint_descriptor *desc) | ||
1069 | { | ||
1070 | unsigned int index; | ||
1071 | |||
1072 | index = usb_endpoint_num(desc) << 1; | ||
1073 | if (usb_endpoint_dir_in(desc)) | ||
1074 | index |= 1; | ||
1075 | return index; | ||
1076 | } | ||
1077 | |||
1064 | /* MASTER/HOST SIDE DRIVER | 1078 | /* MASTER/HOST SIDE DRIVER |
1065 | * | 1079 | * |
1066 | * this uses the hcd framework to hook up to host side drivers. | 1080 | * this uses the hcd framework to hook up to host side drivers. |
@@ -1073,7 +1087,82 @@ static struct platform_driver dummy_udc_driver = { | |||
1073 | * usb 2.0 rules. | 1087 | * usb 2.0 rules. |
1074 | */ | 1088 | */ |
1075 | 1089 | ||
1076 | static int dummy_urb_enqueue ( | 1090 | static int dummy_ep_stream_en(struct dummy_hcd *dum_hcd, struct urb *urb) |
1091 | { | ||
1092 | const struct usb_endpoint_descriptor *desc = &urb->ep->desc; | ||
1093 | u32 index; | ||
1094 | |||
1095 | if (!usb_endpoint_xfer_bulk(desc)) | ||
1096 | return 0; | ||
1097 | |||
1098 | index = dummy_get_ep_idx(desc); | ||
1099 | return (1 << index) & dum_hcd->stream_en_ep; | ||
1100 | } | ||
1101 | |||
1102 | /* | ||
1103 | * The max stream number is saved as a nibble so for the 30 possible endpoints | ||
1104 | * we only 15 bytes of memory. Therefore we are limited to max 16 streams (0 | ||
1105 | * means we use only 1 stream). The maximum according to the spec is 16bit so | ||
1106 | * if the 16 stream limit is about to go, the array size should be incremented | ||
1107 | * to 30 elements of type u16. | ||
1108 | */ | ||
1109 | static int get_max_streams_for_pipe(struct dummy_hcd *dum_hcd, | ||
1110 | unsigned int pipe) | ||
1111 | { | ||
1112 | int max_streams; | ||
1113 | |||
1114 | max_streams = dum_hcd->num_stream[usb_pipeendpoint(pipe)]; | ||
1115 | if (usb_pipeout(pipe)) | ||
1116 | max_streams >>= 4; | ||
1117 | else | ||
1118 | max_streams &= 0xf; | ||
1119 | max_streams++; | ||
1120 | return max_streams; | ||
1121 | } | ||
1122 | |||
1123 | static void set_max_streams_for_pipe(struct dummy_hcd *dum_hcd, | ||
1124 | unsigned int pipe, unsigned int streams) | ||
1125 | { | ||
1126 | int max_streams; | ||
1127 | |||
1128 | streams--; | ||
1129 | max_streams = dum_hcd->num_stream[usb_pipeendpoint(pipe)]; | ||
1130 | if (usb_pipeout(pipe)) { | ||
1131 | streams <<= 4; | ||
1132 | max_streams &= 0xf; | ||
1133 | } else { | ||
1134 | max_streams &= 0xf0; | ||
1135 | } | ||
1136 | max_streams |= streams; | ||
1137 | dum_hcd->num_stream[usb_pipeendpoint(pipe)] = max_streams; | ||
1138 | } | ||
1139 | |||
1140 | static int dummy_validate_stream(struct dummy_hcd *dum_hcd, struct urb *urb) | ||
1141 | { | ||
1142 | unsigned int max_streams; | ||
1143 | int enabled; | ||
1144 | |||
1145 | enabled = dummy_ep_stream_en(dum_hcd, urb); | ||
1146 | if (!urb->stream_id) { | ||
1147 | if (enabled) | ||
1148 | return -EINVAL; | ||
1149 | return 0; | ||
1150 | } | ||
1151 | if (!enabled) | ||
1152 | return -EINVAL; | ||
1153 | |||
1154 | max_streams = get_max_streams_for_pipe(dum_hcd, | ||
1155 | usb_pipeendpoint(urb->pipe)); | ||
1156 | if (urb->stream_id > max_streams) { | ||
1157 | dev_err(dummy_dev(dum_hcd), "Stream id %d is out of range.\n", | ||
1158 | urb->stream_id); | ||
1159 | BUG(); | ||
1160 | return -EINVAL; | ||
1161 | } | ||
1162 | return 0; | ||
1163 | } | ||
1164 | |||
1165 | static int dummy_urb_enqueue( | ||
1077 | struct usb_hcd *hcd, | 1166 | struct usb_hcd *hcd, |
1078 | struct urb *urb, | 1167 | struct urb *urb, |
1079 | gfp_t mem_flags | 1168 | gfp_t mem_flags |
@@ -1083,16 +1172,21 @@ static int dummy_urb_enqueue ( | |||
1083 | unsigned long flags; | 1172 | unsigned long flags; |
1084 | int rc; | 1173 | int rc; |
1085 | 1174 | ||
1086 | if (!urb->transfer_buffer && urb->transfer_buffer_length) | 1175 | urbp = kmalloc(sizeof *urbp, mem_flags); |
1087 | return -EINVAL; | ||
1088 | |||
1089 | urbp = kmalloc (sizeof *urbp, mem_flags); | ||
1090 | if (!urbp) | 1176 | if (!urbp) |
1091 | return -ENOMEM; | 1177 | return -ENOMEM; |
1092 | urbp->urb = urb; | 1178 | urbp->urb = urb; |
1179 | urbp->miter_started = 0; | ||
1093 | 1180 | ||
1094 | dum_hcd = hcd_to_dummy_hcd(hcd); | 1181 | dum_hcd = hcd_to_dummy_hcd(hcd); |
1095 | spin_lock_irqsave(&dum_hcd->dum->lock, flags); | 1182 | spin_lock_irqsave(&dum_hcd->dum->lock, flags); |
1183 | |||
1184 | rc = dummy_validate_stream(dum_hcd, urb); | ||
1185 | if (rc) { | ||
1186 | kfree(urbp); | ||
1187 | goto done; | ||
1188 | } | ||
1189 | |||
1096 | rc = usb_hcd_link_urb_to_ep(hcd, urb); | 1190 | rc = usb_hcd_link_urb_to_ep(hcd, urb); |
1097 | if (rc) { | 1191 | if (rc) { |
1098 | kfree(urbp); | 1192 | kfree(urbp); |
@@ -1107,7 +1201,7 @@ static int dummy_urb_enqueue ( | |||
1107 | 1201 | ||
1108 | list_add_tail(&urbp->urbp_list, &dum_hcd->urbp_list); | 1202 | list_add_tail(&urbp->urbp_list, &dum_hcd->urbp_list); |
1109 | urb->hcpriv = urbp; | 1203 | urb->hcpriv = urbp; |
1110 | if (usb_pipetype (urb->pipe) == PIPE_CONTROL) | 1204 | if (usb_pipetype(urb->pipe) == PIPE_CONTROL) |
1111 | urb->error_count = 1; /* mark as a new urb */ | 1205 | urb->error_count = 1; /* mark as a new urb */ |
1112 | 1206 | ||
1113 | /* kick the scheduler, it'll do the rest */ | 1207 | /* kick the scheduler, it'll do the rest */ |
@@ -1139,20 +1233,91 @@ static int dummy_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) | |||
1139 | return rc; | 1233 | return rc; |
1140 | } | 1234 | } |
1141 | 1235 | ||
1236 | static int dummy_perform_transfer(struct urb *urb, struct dummy_request *req, | ||
1237 | u32 len) | ||
1238 | { | ||
1239 | void *ubuf, *rbuf; | ||
1240 | struct urbp *urbp = urb->hcpriv; | ||
1241 | int to_host; | ||
1242 | struct sg_mapping_iter *miter = &urbp->miter; | ||
1243 | u32 trans = 0; | ||
1244 | u32 this_sg; | ||
1245 | bool next_sg; | ||
1246 | |||
1247 | to_host = usb_pipein(urb->pipe); | ||
1248 | rbuf = req->req.buf + req->req.actual; | ||
1249 | |||
1250 | if (!urb->num_sgs) { | ||
1251 | ubuf = urb->transfer_buffer + urb->actual_length; | ||
1252 | if (to_host) | ||
1253 | memcpy(ubuf, rbuf, len); | ||
1254 | else | ||
1255 | memcpy(rbuf, ubuf, len); | ||
1256 | return len; | ||
1257 | } | ||
1258 | |||
1259 | if (!urbp->miter_started) { | ||
1260 | u32 flags = SG_MITER_ATOMIC; | ||
1261 | |||
1262 | if (to_host) | ||
1263 | flags |= SG_MITER_TO_SG; | ||
1264 | else | ||
1265 | flags |= SG_MITER_FROM_SG; | ||
1266 | |||
1267 | sg_miter_start(miter, urb->sg, urb->num_sgs, flags); | ||
1268 | urbp->miter_started = 1; | ||
1269 | } | ||
1270 | next_sg = sg_miter_next(miter); | ||
1271 | if (next_sg == false) { | ||
1272 | WARN_ON_ONCE(1); | ||
1273 | return -EINVAL; | ||
1274 | } | ||
1275 | do { | ||
1276 | ubuf = miter->addr; | ||
1277 | this_sg = min_t(u32, len, miter->length); | ||
1278 | miter->consumed = this_sg; | ||
1279 | trans += this_sg; | ||
1280 | |||
1281 | if (to_host) | ||
1282 | memcpy(ubuf, rbuf, this_sg); | ||
1283 | else | ||
1284 | memcpy(rbuf, ubuf, this_sg); | ||
1285 | len -= this_sg; | ||
1286 | |||
1287 | if (!len) | ||
1288 | break; | ||
1289 | next_sg = sg_miter_next(miter); | ||
1290 | if (next_sg == false) { | ||
1291 | WARN_ON_ONCE(1); | ||
1292 | return -EINVAL; | ||
1293 | } | ||
1294 | |||
1295 | rbuf += this_sg; | ||
1296 | } while (1); | ||
1297 | |||
1298 | sg_miter_stop(miter); | ||
1299 | return trans; | ||
1300 | } | ||
1301 | |||
1142 | /* transfer up to a frame's worth; caller must own lock */ | 1302 | /* transfer up to a frame's worth; caller must own lock */ |
1143 | static int | 1303 | static int transfer(struct dummy_hcd *dum_hcd, struct urb *urb, |
1144 | transfer(struct dummy *dum, struct urb *urb, struct dummy_ep *ep, int limit, | 1304 | struct dummy_ep *ep, int limit, int *status) |
1145 | int *status) | ||
1146 | { | 1305 | { |
1306 | struct dummy *dum = dum_hcd->dum; | ||
1147 | struct dummy_request *req; | 1307 | struct dummy_request *req; |
1148 | 1308 | ||
1149 | top: | 1309 | top: |
1150 | /* if there's no request queued, the device is NAKing; return */ | 1310 | /* if there's no request queued, the device is NAKing; return */ |
1151 | list_for_each_entry (req, &ep->queue, queue) { | 1311 | list_for_each_entry(req, &ep->queue, queue) { |
1152 | unsigned host_len, dev_len, len; | 1312 | unsigned host_len, dev_len, len; |
1153 | int is_short, to_host; | 1313 | int is_short, to_host; |
1154 | int rescan = 0; | 1314 | int rescan = 0; |
1155 | 1315 | ||
1316 | if (dummy_ep_stream_en(dum_hcd, urb)) { | ||
1317 | if ((urb->stream_id != req->req.stream_id)) | ||
1318 | continue; | ||
1319 | } | ||
1320 | |||
1156 | /* 1..N packets of ep->ep.maxpacket each ... the last one | 1321 | /* 1..N packets of ep->ep.maxpacket each ... the last one |
1157 | * may be short (including zero length). | 1322 | * may be short (including zero length). |
1158 | * | 1323 | * |
@@ -1162,20 +1327,18 @@ top: | |||
1162 | */ | 1327 | */ |
1163 | host_len = urb->transfer_buffer_length - urb->actual_length; | 1328 | host_len = urb->transfer_buffer_length - urb->actual_length; |
1164 | dev_len = req->req.length - req->req.actual; | 1329 | dev_len = req->req.length - req->req.actual; |
1165 | len = min (host_len, dev_len); | 1330 | len = min(host_len, dev_len); |
1166 | 1331 | ||
1167 | /* FIXME update emulated data toggle too */ | 1332 | /* FIXME update emulated data toggle too */ |
1168 | 1333 | ||
1169 | to_host = usb_pipein (urb->pipe); | 1334 | to_host = usb_pipein(urb->pipe); |
1170 | if (unlikely (len == 0)) | 1335 | if (unlikely(len == 0)) |
1171 | is_short = 1; | 1336 | is_short = 1; |
1172 | else { | 1337 | else { |
1173 | char *ubuf, *rbuf; | ||
1174 | |||
1175 | /* not enough bandwidth left? */ | 1338 | /* not enough bandwidth left? */ |
1176 | if (limit < ep->ep.maxpacket && limit < len) | 1339 | if (limit < ep->ep.maxpacket && limit < len) |
1177 | break; | 1340 | break; |
1178 | len = min (len, (unsigned) limit); | 1341 | len = min_t(unsigned, len, limit); |
1179 | if (len == 0) | 1342 | if (len == 0) |
1180 | break; | 1343 | break; |
1181 | 1344 | ||
@@ -1186,18 +1349,16 @@ top: | |||
1186 | } | 1349 | } |
1187 | is_short = (len % ep->ep.maxpacket) != 0; | 1350 | is_short = (len % ep->ep.maxpacket) != 0; |
1188 | 1351 | ||
1189 | /* else transfer packet(s) */ | 1352 | len = dummy_perform_transfer(urb, req, len); |
1190 | ubuf = urb->transfer_buffer + urb->actual_length; | ||
1191 | rbuf = req->req.buf + req->req.actual; | ||
1192 | if (to_host) | ||
1193 | memcpy (ubuf, rbuf, len); | ||
1194 | else | ||
1195 | memcpy (rbuf, ubuf, len); | ||
1196 | ep->last_io = jiffies; | ||
1197 | 1353 | ||
1198 | limit -= len; | 1354 | ep->last_io = jiffies; |
1199 | urb->actual_length += len; | 1355 | if ((int)len < 0) { |
1200 | req->req.actual += len; | 1356 | req->req.status = len; |
1357 | } else { | ||
1358 | limit -= len; | ||
1359 | urb->actual_length += len; | ||
1360 | req->req.actual += len; | ||
1361 | } | ||
1201 | } | 1362 | } |
1202 | 1363 | ||
1203 | /* short packets terminate, maybe with overflow/underflow. | 1364 | /* short packets terminate, maybe with overflow/underflow. |
@@ -1238,11 +1399,11 @@ top: | |||
1238 | 1399 | ||
1239 | /* device side completion --> continuable */ | 1400 | /* device side completion --> continuable */ |
1240 | if (req->req.status != -EINPROGRESS) { | 1401 | if (req->req.status != -EINPROGRESS) { |
1241 | list_del_init (&req->queue); | 1402 | list_del_init(&req->queue); |
1242 | 1403 | ||
1243 | spin_unlock (&dum->lock); | 1404 | spin_unlock(&dum->lock); |
1244 | req->req.complete (&ep->ep, &req->req); | 1405 | req->req.complete(&ep->ep, &req->req); |
1245 | spin_lock (&dum->lock); | 1406 | spin_lock(&dum->lock); |
1246 | 1407 | ||
1247 | /* requests might have been unlinked... */ | 1408 | /* requests might have been unlinked... */ |
1248 | rescan = 1; | 1409 | rescan = 1; |
@@ -1259,7 +1420,7 @@ top: | |||
1259 | return limit; | 1420 | return limit; |
1260 | } | 1421 | } |
1261 | 1422 | ||
1262 | static int periodic_bytes (struct dummy *dum, struct dummy_ep *ep) | 1423 | static int periodic_bytes(struct dummy *dum, struct dummy_ep *ep) |
1263 | { | 1424 | { |
1264 | int limit = ep->ep.maxpacket; | 1425 | int limit = ep->ep.maxpacket; |
1265 | 1426 | ||
@@ -1273,7 +1434,7 @@ static int periodic_bytes (struct dummy *dum, struct dummy_ep *ep) | |||
1273 | limit += limit * tmp; | 1434 | limit += limit * tmp; |
1274 | } | 1435 | } |
1275 | if (dum->gadget.speed == USB_SPEED_SUPER) { | 1436 | if (dum->gadget.speed == USB_SPEED_SUPER) { |
1276 | switch (ep->desc->bmAttributes & 0x03) { | 1437 | switch (usb_endpoint_type(ep->desc)) { |
1277 | case USB_ENDPOINT_XFER_ISOC: | 1438 | case USB_ENDPOINT_XFER_ISOC: |
1278 | /* Sec. 4.4.8.2 USB3.0 Spec */ | 1439 | /* Sec. 4.4.8.2 USB3.0 Spec */ |
1279 | limit = 3 * 16 * 1024 * 8; | 1440 | limit = 3 * 16 * 1024 * 8; |
@@ -1295,7 +1456,7 @@ static int periodic_bytes (struct dummy *dum, struct dummy_ep *ep) | |||
1295 | USB_PORT_STAT_SUSPEND)) \ | 1456 | USB_PORT_STAT_SUSPEND)) \ |
1296 | == (USB_PORT_STAT_CONNECTION | USB_PORT_STAT_ENABLE)) | 1457 | == (USB_PORT_STAT_CONNECTION | USB_PORT_STAT_ENABLE)) |
1297 | 1458 | ||
1298 | static struct dummy_ep *find_endpoint (struct dummy *dum, u8 address) | 1459 | static struct dummy_ep *find_endpoint(struct dummy *dum, u8 address) |
1299 | { | 1460 | { |
1300 | int i; | 1461 | int i; |
1301 | 1462 | ||
@@ -1303,9 +1464,9 @@ static struct dummy_ep *find_endpoint (struct dummy *dum, u8 address) | |||
1303 | dum->ss_hcd : dum->hs_hcd))) | 1464 | dum->ss_hcd : dum->hs_hcd))) |
1304 | return NULL; | 1465 | return NULL; |
1305 | if ((address & ~USB_DIR_IN) == 0) | 1466 | if ((address & ~USB_DIR_IN) == 0) |
1306 | return &dum->ep [0]; | 1467 | return &dum->ep[0]; |
1307 | for (i = 1; i < DUMMY_ENDPOINTS; i++) { | 1468 | for (i = 1; i < DUMMY_ENDPOINTS; i++) { |
1308 | struct dummy_ep *ep = &dum->ep [i]; | 1469 | struct dummy_ep *ep = &dum->ep[i]; |
1309 | 1470 | ||
1310 | if (!ep->desc) | 1471 | if (!ep->desc) |
1311 | continue; | 1472 | continue; |
@@ -1535,19 +1696,19 @@ static void dummy_timer(unsigned long _dum_hcd) | |||
1535 | /* FIXME if HZ != 1000 this will probably misbehave ... */ | 1696 | /* FIXME if HZ != 1000 this will probably misbehave ... */ |
1536 | 1697 | ||
1537 | /* look at each urb queued by the host side driver */ | 1698 | /* look at each urb queued by the host side driver */ |
1538 | spin_lock_irqsave (&dum->lock, flags); | 1699 | spin_lock_irqsave(&dum->lock, flags); |
1539 | 1700 | ||
1540 | if (!dum_hcd->udev) { | 1701 | if (!dum_hcd->udev) { |
1541 | dev_err(dummy_dev(dum_hcd), | 1702 | dev_err(dummy_dev(dum_hcd), |
1542 | "timer fired with no URBs pending?\n"); | 1703 | "timer fired with no URBs pending?\n"); |
1543 | spin_unlock_irqrestore (&dum->lock, flags); | 1704 | spin_unlock_irqrestore(&dum->lock, flags); |
1544 | return; | 1705 | return; |
1545 | } | 1706 | } |
1546 | 1707 | ||
1547 | for (i = 0; i < DUMMY_ENDPOINTS; i++) { | 1708 | for (i = 0; i < DUMMY_ENDPOINTS; i++) { |
1548 | if (!ep_name [i]) | 1709 | if (!ep_name[i]) |
1549 | break; | 1710 | break; |
1550 | dum->ep [i].already_seen = 0; | 1711 | dum->ep[i].already_seen = 0; |
1551 | } | 1712 | } |
1552 | 1713 | ||
1553 | restart: | 1714 | restart: |
@@ -1564,7 +1725,7 @@ restart: | |||
1564 | goto return_urb; | 1725 | goto return_urb; |
1565 | else if (dum_hcd->rh_state != DUMMY_RH_RUNNING) | 1726 | else if (dum_hcd->rh_state != DUMMY_RH_RUNNING) |
1566 | continue; | 1727 | continue; |
1567 | type = usb_pipetype (urb->pipe); | 1728 | type = usb_pipetype(urb->pipe); |
1568 | 1729 | ||
1569 | /* used up this frame's non-periodic bandwidth? | 1730 | /* used up this frame's non-periodic bandwidth? |
1570 | * FIXME there's infinite bandwidth for control and | 1731 | * FIXME there's infinite bandwidth for control and |
@@ -1575,7 +1736,7 @@ restart: | |||
1575 | 1736 | ||
1576 | /* find the gadget's ep for this request (if configured) */ | 1737 | /* find the gadget's ep for this request (if configured) */ |
1577 | address = usb_pipeendpoint (urb->pipe); | 1738 | address = usb_pipeendpoint (urb->pipe); |
1578 | if (usb_pipein (urb->pipe)) | 1739 | if (usb_pipein(urb->pipe)) |
1579 | address |= USB_DIR_IN; | 1740 | address |= USB_DIR_IN; |
1580 | ep = find_endpoint(dum, address); | 1741 | ep = find_endpoint(dum, address); |
1581 | if (!ep) { | 1742 | if (!ep) { |
@@ -1590,7 +1751,7 @@ restart: | |||
1590 | if (ep->already_seen) | 1751 | if (ep->already_seen) |
1591 | continue; | 1752 | continue; |
1592 | ep->already_seen = 1; | 1753 | ep->already_seen = 1; |
1593 | if (ep == &dum->ep [0] && urb->error_count) { | 1754 | if (ep == &dum->ep[0] && urb->error_count) { |
1594 | ep->setup_stage = 1; /* a new urb */ | 1755 | ep->setup_stage = 1; /* a new urb */ |
1595 | urb->error_count = 0; | 1756 | urb->error_count = 0; |
1596 | } | 1757 | } |
@@ -1604,21 +1765,21 @@ restart: | |||
1604 | /* FIXME make sure both ends agree on maxpacket */ | 1765 | /* FIXME make sure both ends agree on maxpacket */ |
1605 | 1766 | ||
1606 | /* handle control requests */ | 1767 | /* handle control requests */ |
1607 | if (ep == &dum->ep [0] && ep->setup_stage) { | 1768 | if (ep == &dum->ep[0] && ep->setup_stage) { |
1608 | struct usb_ctrlrequest setup; | 1769 | struct usb_ctrlrequest setup; |
1609 | int value = 1; | 1770 | int value = 1; |
1610 | 1771 | ||
1611 | setup = *(struct usb_ctrlrequest*) urb->setup_packet; | 1772 | setup = *(struct usb_ctrlrequest *) urb->setup_packet; |
1612 | /* paranoia, in case of stale queued data */ | 1773 | /* paranoia, in case of stale queued data */ |
1613 | list_for_each_entry (req, &ep->queue, queue) { | 1774 | list_for_each_entry(req, &ep->queue, queue) { |
1614 | list_del_init (&req->queue); | 1775 | list_del_init(&req->queue); |
1615 | req->req.status = -EOVERFLOW; | 1776 | req->req.status = -EOVERFLOW; |
1616 | dev_dbg (udc_dev(dum), "stale req = %p\n", | 1777 | dev_dbg(udc_dev(dum), "stale req = %p\n", |
1617 | req); | 1778 | req); |
1618 | 1779 | ||
1619 | spin_unlock (&dum->lock); | 1780 | spin_unlock(&dum->lock); |
1620 | req->req.complete (&ep->ep, &req->req); | 1781 | req->req.complete(&ep->ep, &req->req); |
1621 | spin_lock (&dum->lock); | 1782 | spin_lock(&dum->lock); |
1622 | ep->already_seen = 0; | 1783 | ep->already_seen = 0; |
1623 | goto restart; | 1784 | goto restart; |
1624 | } | 1785 | } |
@@ -1638,10 +1799,10 @@ restart: | |||
1638 | * until setup() returns; no reentrancy issues etc. | 1799 | * until setup() returns; no reentrancy issues etc. |
1639 | */ | 1800 | */ |
1640 | if (value > 0) { | 1801 | if (value > 0) { |
1641 | spin_unlock (&dum->lock); | 1802 | spin_unlock(&dum->lock); |
1642 | value = dum->driver->setup (&dum->gadget, | 1803 | value = dum->driver->setup(&dum->gadget, |
1643 | &setup); | 1804 | &setup); |
1644 | spin_lock (&dum->lock); | 1805 | spin_lock(&dum->lock); |
1645 | 1806 | ||
1646 | if (value >= 0) { | 1807 | if (value >= 0) { |
1647 | /* no delays (max 64KB data stage) */ | 1808 | /* no delays (max 64KB data stage) */ |
@@ -1653,7 +1814,7 @@ restart: | |||
1653 | 1814 | ||
1654 | if (value < 0) { | 1815 | if (value < 0) { |
1655 | if (value != -EOPNOTSUPP) | 1816 | if (value != -EOPNOTSUPP) |
1656 | dev_dbg (udc_dev(dum), | 1817 | dev_dbg(udc_dev(dum), |
1657 | "setup --> %d\n", | 1818 | "setup --> %d\n", |
1658 | value); | 1819 | value); |
1659 | status = -EPIPE; | 1820 | status = -EPIPE; |
@@ -1665,14 +1826,14 @@ restart: | |||
1665 | 1826 | ||
1666 | /* non-control requests */ | 1827 | /* non-control requests */ |
1667 | limit = total; | 1828 | limit = total; |
1668 | switch (usb_pipetype (urb->pipe)) { | 1829 | switch (usb_pipetype(urb->pipe)) { |
1669 | case PIPE_ISOCHRONOUS: | 1830 | case PIPE_ISOCHRONOUS: |
1670 | /* FIXME is it urb->interval since the last xfer? | 1831 | /* FIXME is it urb->interval since the last xfer? |
1671 | * use urb->iso_frame_desc[i]. | 1832 | * use urb->iso_frame_desc[i]. |
1672 | * complete whether or not ep has requests queued. | 1833 | * complete whether or not ep has requests queued. |
1673 | * report random errors, to debug drivers. | 1834 | * report random errors, to debug drivers. |
1674 | */ | 1835 | */ |
1675 | limit = max (limit, periodic_bytes (dum, ep)); | 1836 | limit = max(limit, periodic_bytes(dum, ep)); |
1676 | status = -ENOSYS; | 1837 | status = -ENOSYS; |
1677 | break; | 1838 | break; |
1678 | 1839 | ||
@@ -1680,14 +1841,13 @@ restart: | |||
1680 | /* FIXME is it urb->interval since the last xfer? | 1841 | /* FIXME is it urb->interval since the last xfer? |
1681 | * this almost certainly polls too fast. | 1842 | * this almost certainly polls too fast. |
1682 | */ | 1843 | */ |
1683 | limit = max (limit, periodic_bytes (dum, ep)); | 1844 | limit = max(limit, periodic_bytes(dum, ep)); |
1684 | /* FALLTHROUGH */ | 1845 | /* FALLTHROUGH */ |
1685 | 1846 | ||
1686 | // case PIPE_BULK: case PIPE_CONTROL: | ||
1687 | default: | 1847 | default: |
1688 | treat_control_like_bulk: | 1848 | treat_control_like_bulk: |
1689 | ep->last_io = jiffies; | 1849 | ep->last_io = jiffies; |
1690 | total = transfer(dum, urb, ep, limit, &status); | 1850 | total = transfer(dum_hcd, urb, ep, limit, &status); |
1691 | break; | 1851 | break; |
1692 | } | 1852 | } |
1693 | 1853 | ||
@@ -1696,15 +1856,15 @@ restart: | |||
1696 | continue; | 1856 | continue; |
1697 | 1857 | ||
1698 | return_urb: | 1858 | return_urb: |
1699 | list_del (&urbp->urbp_list); | 1859 | list_del(&urbp->urbp_list); |
1700 | kfree (urbp); | 1860 | kfree(urbp); |
1701 | if (ep) | 1861 | if (ep) |
1702 | ep->already_seen = ep->setup_stage = 0; | 1862 | ep->already_seen = ep->setup_stage = 0; |
1703 | 1863 | ||
1704 | usb_hcd_unlink_urb_from_ep(dummy_hcd_to_hcd(dum_hcd), urb); | 1864 | usb_hcd_unlink_urb_from_ep(dummy_hcd_to_hcd(dum_hcd), urb); |
1705 | spin_unlock (&dum->lock); | 1865 | spin_unlock(&dum->lock); |
1706 | usb_hcd_giveback_urb(dummy_hcd_to_hcd(dum_hcd), urb, status); | 1866 | usb_hcd_giveback_urb(dummy_hcd_to_hcd(dum_hcd), urb, status); |
1707 | spin_lock (&dum->lock); | 1867 | spin_lock(&dum->lock); |
1708 | 1868 | ||
1709 | goto restart; | 1869 | goto restart; |
1710 | } | 1870 | } |
@@ -1717,7 +1877,7 @@ return_urb: | |||
1717 | mod_timer(&dum_hcd->timer, jiffies + msecs_to_jiffies(1)); | 1877 | mod_timer(&dum_hcd->timer, jiffies + msecs_to_jiffies(1)); |
1718 | } | 1878 | } |
1719 | 1879 | ||
1720 | spin_unlock_irqrestore (&dum->lock, flags); | 1880 | spin_unlock_irqrestore(&dum->lock, flags); |
1721 | } | 1881 | } |
1722 | 1882 | ||
1723 | /*-------------------------------------------------------------------------*/ | 1883 | /*-------------------------------------------------------------------------*/ |
@@ -1729,7 +1889,7 @@ return_urb: | |||
1729 | | USB_PORT_STAT_C_OVERCURRENT \ | 1889 | | USB_PORT_STAT_C_OVERCURRENT \ |
1730 | | USB_PORT_STAT_C_RESET) << 16) | 1890 | | USB_PORT_STAT_C_RESET) << 16) |
1731 | 1891 | ||
1732 | static int dummy_hub_status (struct usb_hcd *hcd, char *buf) | 1892 | static int dummy_hub_status(struct usb_hcd *hcd, char *buf) |
1733 | { | 1893 | { |
1734 | struct dummy_hcd *dum_hcd; | 1894 | struct dummy_hcd *dum_hcd; |
1735 | unsigned long flags; | 1895 | unsigned long flags; |
@@ -1753,7 +1913,7 @@ static int dummy_hub_status (struct usb_hcd *hcd, char *buf) | |||
1753 | dum_hcd->port_status); | 1913 | dum_hcd->port_status); |
1754 | retval = 1; | 1914 | retval = 1; |
1755 | if (dum_hcd->rh_state == DUMMY_RH_SUSPENDED) | 1915 | if (dum_hcd->rh_state == DUMMY_RH_SUSPENDED) |
1756 | usb_hcd_resume_root_hub (hcd); | 1916 | usb_hcd_resume_root_hub(hcd); |
1757 | } | 1917 | } |
1758 | done: | 1918 | done: |
1759 | spin_unlock_irqrestore(&dum_hcd->dum->lock, flags); | 1919 | spin_unlock_irqrestore(&dum_hcd->dum->lock, flags); |
@@ -1772,10 +1932,9 @@ ss_hub_descriptor(struct usb_hub_descriptor *desc) | |||
1772 | desc->u.ss.DeviceRemovable = 0xffff; | 1932 | desc->u.ss.DeviceRemovable = 0xffff; |
1773 | } | 1933 | } |
1774 | 1934 | ||
1775 | static inline void | 1935 | static inline void hub_descriptor(struct usb_hub_descriptor *desc) |
1776 | hub_descriptor (struct usb_hub_descriptor *desc) | ||
1777 | { | 1936 | { |
1778 | memset (desc, 0, sizeof *desc); | 1937 | memset(desc, 0, sizeof *desc); |
1779 | desc->bDescriptorType = 0x29; | 1938 | desc->bDescriptorType = 0x29; |
1780 | desc->bDescLength = 9; | 1939 | desc->bDescLength = 9; |
1781 | desc->wHubCharacteristics = cpu_to_le16(0x0001); | 1940 | desc->wHubCharacteristics = cpu_to_le16(0x0001); |
@@ -1784,7 +1943,7 @@ hub_descriptor (struct usb_hub_descriptor *desc) | |||
1784 | desc->u.hs.DeviceRemovable[1] = 0xff; | 1943 | desc->u.hs.DeviceRemovable[1] = 0xff; |
1785 | } | 1944 | } |
1786 | 1945 | ||
1787 | static int dummy_hub_control ( | 1946 | static int dummy_hub_control( |
1788 | struct usb_hcd *hcd, | 1947 | struct usb_hcd *hcd, |
1789 | u16 typeReq, | 1948 | u16 typeReq, |
1790 | u16 wValue, | 1949 | u16 wValue, |
@@ -1852,7 +2011,7 @@ static int dummy_hub_control ( | |||
1852 | hub_descriptor((struct usb_hub_descriptor *) buf); | 2011 | hub_descriptor((struct usb_hub_descriptor *) buf); |
1853 | break; | 2012 | break; |
1854 | case GetHubStatus: | 2013 | case GetHubStatus: |
1855 | *(__le32 *) buf = cpu_to_le32 (0); | 2014 | *(__le32 *) buf = cpu_to_le32(0); |
1856 | break; | 2015 | break; |
1857 | case GetPortStatus: | 2016 | case GetPortStatus: |
1858 | if (wIndex != 1) | 2017 | if (wIndex != 1) |
@@ -1894,8 +2053,8 @@ static int dummy_hub_control ( | |||
1894 | } | 2053 | } |
1895 | } | 2054 | } |
1896 | set_link_state(dum_hcd); | 2055 | set_link_state(dum_hcd); |
1897 | ((__le16 *) buf)[0] = cpu_to_le16 (dum_hcd->port_status); | 2056 | ((__le16 *) buf)[0] = cpu_to_le16(dum_hcd->port_status); |
1898 | ((__le16 *) buf)[1] = cpu_to_le16 (dum_hcd->port_status >> 16); | 2057 | ((__le16 *) buf)[1] = cpu_to_le16(dum_hcd->port_status >> 16); |
1899 | break; | 2058 | break; |
1900 | case SetHubFeature: | 2059 | case SetHubFeature: |
1901 | retval = -EPIPE; | 2060 | retval = -EPIPE; |
@@ -2029,15 +2188,15 @@ error: | |||
2029 | spin_unlock_irqrestore(&dum_hcd->dum->lock, flags); | 2188 | spin_unlock_irqrestore(&dum_hcd->dum->lock, flags); |
2030 | 2189 | ||
2031 | if ((dum_hcd->port_status & PORT_C_MASK) != 0) | 2190 | if ((dum_hcd->port_status & PORT_C_MASK) != 0) |
2032 | usb_hcd_poll_rh_status (hcd); | 2191 | usb_hcd_poll_rh_status(hcd); |
2033 | return retval; | 2192 | return retval; |
2034 | } | 2193 | } |
2035 | 2194 | ||
2036 | static int dummy_bus_suspend (struct usb_hcd *hcd) | 2195 | static int dummy_bus_suspend(struct usb_hcd *hcd) |
2037 | { | 2196 | { |
2038 | struct dummy_hcd *dum_hcd = hcd_to_dummy_hcd(hcd); | 2197 | struct dummy_hcd *dum_hcd = hcd_to_dummy_hcd(hcd); |
2039 | 2198 | ||
2040 | dev_dbg (&hcd->self.root_hub->dev, "%s\n", __func__); | 2199 | dev_dbg(&hcd->self.root_hub->dev, "%s\n", __func__); |
2041 | 2200 | ||
2042 | spin_lock_irq(&dum_hcd->dum->lock); | 2201 | spin_lock_irq(&dum_hcd->dum->lock); |
2043 | dum_hcd->rh_state = DUMMY_RH_SUSPENDED; | 2202 | dum_hcd->rh_state = DUMMY_RH_SUSPENDED; |
@@ -2047,12 +2206,12 @@ static int dummy_bus_suspend (struct usb_hcd *hcd) | |||
2047 | return 0; | 2206 | return 0; |
2048 | } | 2207 | } |
2049 | 2208 | ||
2050 | static int dummy_bus_resume (struct usb_hcd *hcd) | 2209 | static int dummy_bus_resume(struct usb_hcd *hcd) |
2051 | { | 2210 | { |
2052 | struct dummy_hcd *dum_hcd = hcd_to_dummy_hcd(hcd); | 2211 | struct dummy_hcd *dum_hcd = hcd_to_dummy_hcd(hcd); |
2053 | int rc = 0; | 2212 | int rc = 0; |
2054 | 2213 | ||
2055 | dev_dbg (&hcd->self.root_hub->dev, "%s\n", __func__); | 2214 | dev_dbg(&hcd->self.root_hub->dev, "%s\n", __func__); |
2056 | 2215 | ||
2057 | spin_lock_irq(&dum_hcd->dum->lock); | 2216 | spin_lock_irq(&dum_hcd->dum->lock); |
2058 | if (!HCD_HW_ACCESSIBLE(hcd)) { | 2217 | if (!HCD_HW_ACCESSIBLE(hcd)) { |
@@ -2070,55 +2229,54 @@ static int dummy_bus_resume (struct usb_hcd *hcd) | |||
2070 | 2229 | ||
2071 | /*-------------------------------------------------------------------------*/ | 2230 | /*-------------------------------------------------------------------------*/ |
2072 | 2231 | ||
2073 | static inline ssize_t | 2232 | static inline ssize_t show_urb(char *buf, size_t size, struct urb *urb) |
2074 | show_urb (char *buf, size_t size, struct urb *urb) | ||
2075 | { | 2233 | { |
2076 | int ep = usb_pipeendpoint (urb->pipe); | 2234 | int ep = usb_pipeendpoint(urb->pipe); |
2077 | 2235 | ||
2078 | return snprintf (buf, size, | 2236 | return snprintf(buf, size, |
2079 | "urb/%p %s ep%d%s%s len %d/%d\n", | 2237 | "urb/%p %s ep%d%s%s len %d/%d\n", |
2080 | urb, | 2238 | urb, |
2081 | ({ char *s; | 2239 | ({ char *s; |
2082 | switch (urb->dev->speed) { | 2240 | switch (urb->dev->speed) { |
2083 | case USB_SPEED_LOW: | 2241 | case USB_SPEED_LOW: |
2084 | s = "ls"; | 2242 | s = "ls"; |
2085 | break; | 2243 | break; |
2086 | case USB_SPEED_FULL: | 2244 | case USB_SPEED_FULL: |
2087 | s = "fs"; | 2245 | s = "fs"; |
2088 | break; | 2246 | break; |
2089 | case USB_SPEED_HIGH: | 2247 | case USB_SPEED_HIGH: |
2090 | s = "hs"; | 2248 | s = "hs"; |
2091 | break; | 2249 | break; |
2092 | case USB_SPEED_SUPER: | 2250 | case USB_SPEED_SUPER: |
2093 | s = "ss"; | 2251 | s = "ss"; |
2094 | break; | 2252 | break; |
2095 | default: | 2253 | default: |
2096 | s = "?"; | 2254 | s = "?"; |
2097 | break; | 2255 | break; |
2098 | }; s; }), | 2256 | }; s; }), |
2099 | ep, ep ? (usb_pipein (urb->pipe) ? "in" : "out") : "", | 2257 | ep, ep ? (usb_pipein(urb->pipe) ? "in" : "out") : "", |
2100 | ({ char *s; \ | 2258 | ({ char *s; \ |
2101 | switch (usb_pipetype (urb->pipe)) { \ | 2259 | switch (usb_pipetype(urb->pipe)) { \ |
2102 | case PIPE_CONTROL: \ | 2260 | case PIPE_CONTROL: \ |
2103 | s = ""; \ | 2261 | s = ""; \ |
2104 | break; \ | 2262 | break; \ |
2105 | case PIPE_BULK: \ | 2263 | case PIPE_BULK: \ |
2106 | s = "-bulk"; \ | 2264 | s = "-bulk"; \ |
2107 | break; \ | 2265 | break; \ |
2108 | case PIPE_INTERRUPT: \ | 2266 | case PIPE_INTERRUPT: \ |
2109 | s = "-int"; \ | 2267 | s = "-int"; \ |
2110 | break; \ | 2268 | break; \ |
2111 | default: \ | 2269 | default: \ |
2112 | s = "-iso"; \ | 2270 | s = "-iso"; \ |
2113 | break; \ | 2271 | break; \ |
2114 | }; s;}), | 2272 | }; s; }), |
2115 | urb->actual_length, urb->transfer_buffer_length); | 2273 | urb->actual_length, urb->transfer_buffer_length); |
2116 | } | 2274 | } |
2117 | 2275 | ||
2118 | static ssize_t | 2276 | static ssize_t show_urbs(struct device *dev, struct device_attribute *attr, |
2119 | show_urbs (struct device *dev, struct device_attribute *attr, char *buf) | 2277 | char *buf) |
2120 | { | 2278 | { |
2121 | struct usb_hcd *hcd = dev_get_drvdata (dev); | 2279 | struct usb_hcd *hcd = dev_get_drvdata(dev); |
2122 | struct dummy_hcd *dum_hcd = hcd_to_dummy_hcd(hcd); | 2280 | struct dummy_hcd *dum_hcd = hcd_to_dummy_hcd(hcd); |
2123 | struct urbp *urbp; | 2281 | struct urbp *urbp; |
2124 | size_t size = 0; | 2282 | size_t size = 0; |
@@ -2128,7 +2286,7 @@ show_urbs (struct device *dev, struct device_attribute *attr, char *buf) | |||
2128 | list_for_each_entry(urbp, &dum_hcd->urbp_list, urbp_list) { | 2286 | list_for_each_entry(urbp, &dum_hcd->urbp_list, urbp_list) { |
2129 | size_t temp; | 2287 | size_t temp; |
2130 | 2288 | ||
2131 | temp = show_urb (buf, PAGE_SIZE - size, urbp->urb); | 2289 | temp = show_urb(buf, PAGE_SIZE - size, urbp->urb); |
2132 | buf += temp; | 2290 | buf += temp; |
2133 | size += temp; | 2291 | size += temp; |
2134 | } | 2292 | } |
@@ -2136,7 +2294,7 @@ show_urbs (struct device *dev, struct device_attribute *attr, char *buf) | |||
2136 | 2294 | ||
2137 | return size; | 2295 | return size; |
2138 | } | 2296 | } |
2139 | static DEVICE_ATTR (urbs, S_IRUGO, show_urbs, NULL); | 2297 | static DEVICE_ATTR(urbs, S_IRUGO, show_urbs, NULL); |
2140 | 2298 | ||
2141 | static int dummy_start_ss(struct dummy_hcd *dum_hcd) | 2299 | static int dummy_start_ss(struct dummy_hcd *dum_hcd) |
2142 | { | 2300 | { |
@@ -2144,6 +2302,7 @@ static int dummy_start_ss(struct dummy_hcd *dum_hcd) | |||
2144 | dum_hcd->timer.function = dummy_timer; | 2302 | dum_hcd->timer.function = dummy_timer; |
2145 | dum_hcd->timer.data = (unsigned long)dum_hcd; | 2303 | dum_hcd->timer.data = (unsigned long)dum_hcd; |
2146 | dum_hcd->rh_state = DUMMY_RH_RUNNING; | 2304 | dum_hcd->rh_state = DUMMY_RH_RUNNING; |
2305 | dum_hcd->stream_en_ep = 0; | ||
2147 | INIT_LIST_HEAD(&dum_hcd->urbp_list); | 2306 | INIT_LIST_HEAD(&dum_hcd->urbp_list); |
2148 | dummy_hcd_to_hcd(dum_hcd)->power_budget = POWER_BUDGET; | 2307 | dummy_hcd_to_hcd(dum_hcd)->power_budget = POWER_BUDGET; |
2149 | dummy_hcd_to_hcd(dum_hcd)->state = HC_STATE_RUNNING; | 2308 | dummy_hcd_to_hcd(dum_hcd)->state = HC_STATE_RUNNING; |
@@ -2189,11 +2348,11 @@ static int dummy_start(struct usb_hcd *hcd) | |||
2189 | return device_create_file(dummy_dev(dum_hcd), &dev_attr_urbs); | 2348 | return device_create_file(dummy_dev(dum_hcd), &dev_attr_urbs); |
2190 | } | 2349 | } |
2191 | 2350 | ||
2192 | static void dummy_stop (struct usb_hcd *hcd) | 2351 | static void dummy_stop(struct usb_hcd *hcd) |
2193 | { | 2352 | { |
2194 | struct dummy *dum; | 2353 | struct dummy *dum; |
2195 | 2354 | ||
2196 | dum = (hcd_to_dummy_hcd(hcd))->dum; | 2355 | dum = hcd_to_dummy_hcd(hcd)->dum; |
2197 | device_remove_file(dummy_dev(hcd_to_dummy_hcd(hcd)), &dev_attr_urbs); | 2356 | device_remove_file(dummy_dev(hcd_to_dummy_hcd(hcd)), &dev_attr_urbs); |
2198 | usb_gadget_unregister_driver(dum->driver); | 2357 | usb_gadget_unregister_driver(dum->driver); |
2199 | dev_info(dummy_dev(hcd_to_dummy_hcd(hcd)), "stopped\n"); | 2358 | dev_info(dummy_dev(hcd_to_dummy_hcd(hcd)), "stopped\n"); |
@@ -2201,13 +2360,14 @@ static void dummy_stop (struct usb_hcd *hcd) | |||
2201 | 2360 | ||
2202 | /*-------------------------------------------------------------------------*/ | 2361 | /*-------------------------------------------------------------------------*/ |
2203 | 2362 | ||
2204 | static int dummy_h_get_frame (struct usb_hcd *hcd) | 2363 | static int dummy_h_get_frame(struct usb_hcd *hcd) |
2205 | { | 2364 | { |
2206 | return dummy_g_get_frame (NULL); | 2365 | return dummy_g_get_frame(NULL); |
2207 | } | 2366 | } |
2208 | 2367 | ||
2209 | static int dummy_setup(struct usb_hcd *hcd) | 2368 | static int dummy_setup(struct usb_hcd *hcd) |
2210 | { | 2369 | { |
2370 | hcd->self.sg_tablesize = ~0; | ||
2211 | if (usb_hcd_is_primary_hcd(hcd)) { | 2371 | if (usb_hcd_is_primary_hcd(hcd)) { |
2212 | the_controller.hs_hcd = hcd_to_dummy_hcd(hcd); | 2372 | the_controller.hs_hcd = hcd_to_dummy_hcd(hcd); |
2213 | the_controller.hs_hcd->dum = &the_controller; | 2373 | the_controller.hs_hcd->dum = &the_controller; |
@@ -2228,27 +2388,82 @@ static int dummy_setup(struct usb_hcd *hcd) | |||
2228 | } | 2388 | } |
2229 | 2389 | ||
2230 | /* Change a group of bulk endpoints to support multiple stream IDs */ | 2390 | /* Change a group of bulk endpoints to support multiple stream IDs */ |
2231 | int dummy_alloc_streams(struct usb_hcd *hcd, struct usb_device *udev, | 2391 | static int dummy_alloc_streams(struct usb_hcd *hcd, struct usb_device *udev, |
2232 | struct usb_host_endpoint **eps, unsigned int num_eps, | 2392 | struct usb_host_endpoint **eps, unsigned int num_eps, |
2233 | unsigned int num_streams, gfp_t mem_flags) | 2393 | unsigned int num_streams, gfp_t mem_flags) |
2234 | { | 2394 | { |
2235 | if (hcd->speed != HCD_USB3) | 2395 | struct dummy_hcd *dum_hcd = hcd_to_dummy_hcd(hcd); |
2236 | dev_dbg(dummy_dev(hcd_to_dummy_hcd(hcd)), | 2396 | unsigned long flags; |
2237 | "%s() - ERROR! Not supported for USB2.0 roothub\n", | 2397 | int max_stream; |
2238 | __func__); | 2398 | int ret_streams = num_streams; |
2239 | return 0; | 2399 | unsigned int index; |
2400 | unsigned int i; | ||
2401 | |||
2402 | if (!num_eps) | ||
2403 | return -EINVAL; | ||
2404 | |||
2405 | spin_lock_irqsave(&dum_hcd->dum->lock, flags); | ||
2406 | for (i = 0; i < num_eps; i++) { | ||
2407 | index = dummy_get_ep_idx(&eps[i]->desc); | ||
2408 | if ((1 << index) & dum_hcd->stream_en_ep) { | ||
2409 | ret_streams = -EINVAL; | ||
2410 | goto out; | ||
2411 | } | ||
2412 | max_stream = usb_ss_max_streams(&eps[i]->ss_ep_comp); | ||
2413 | if (!max_stream) { | ||
2414 | ret_streams = -EINVAL; | ||
2415 | goto out; | ||
2416 | } | ||
2417 | if (max_stream < ret_streams) { | ||
2418 | dev_dbg(dummy_dev(dum_hcd), "Ep 0x%x only supports %u " | ||
2419 | "stream IDs.\n", | ||
2420 | eps[i]->desc.bEndpointAddress, | ||
2421 | max_stream); | ||
2422 | ret_streams = max_stream; | ||
2423 | } | ||
2424 | } | ||
2425 | |||
2426 | for (i = 0; i < num_eps; i++) { | ||
2427 | index = dummy_get_ep_idx(&eps[i]->desc); | ||
2428 | dum_hcd->stream_en_ep |= 1 << index; | ||
2429 | set_max_streams_for_pipe(dum_hcd, | ||
2430 | usb_endpoint_num(&eps[i]->desc), ret_streams); | ||
2431 | } | ||
2432 | out: | ||
2433 | spin_unlock_irqrestore(&dum_hcd->dum->lock, flags); | ||
2434 | return ret_streams; | ||
2240 | } | 2435 | } |
2241 | 2436 | ||
2242 | /* Reverts a group of bulk endpoints back to not using stream IDs. */ | 2437 | /* Reverts a group of bulk endpoints back to not using stream IDs. */ |
2243 | int dummy_free_streams(struct usb_hcd *hcd, struct usb_device *udev, | 2438 | static int dummy_free_streams(struct usb_hcd *hcd, struct usb_device *udev, |
2244 | struct usb_host_endpoint **eps, unsigned int num_eps, | 2439 | struct usb_host_endpoint **eps, unsigned int num_eps, |
2245 | gfp_t mem_flags) | 2440 | gfp_t mem_flags) |
2246 | { | 2441 | { |
2247 | if (hcd->speed != HCD_USB3) | 2442 | struct dummy_hcd *dum_hcd = hcd_to_dummy_hcd(hcd); |
2248 | dev_dbg(dummy_dev(hcd_to_dummy_hcd(hcd)), | 2443 | unsigned long flags; |
2249 | "%s() - ERROR! Not supported for USB2.0 roothub\n", | 2444 | int ret; |
2250 | __func__); | 2445 | unsigned int index; |
2251 | return 0; | 2446 | unsigned int i; |
2447 | |||
2448 | spin_lock_irqsave(&dum_hcd->dum->lock, flags); | ||
2449 | for (i = 0; i < num_eps; i++) { | ||
2450 | index = dummy_get_ep_idx(&eps[i]->desc); | ||
2451 | if (!((1 << index) & dum_hcd->stream_en_ep)) { | ||
2452 | ret = -EINVAL; | ||
2453 | goto out; | ||
2454 | } | ||
2455 | } | ||
2456 | |||
2457 | for (i = 0; i < num_eps; i++) { | ||
2458 | index = dummy_get_ep_idx(&eps[i]->desc); | ||
2459 | dum_hcd->stream_en_ep &= ~(1 << index); | ||
2460 | set_max_streams_for_pipe(dum_hcd, | ||
2461 | usb_endpoint_num(&eps[i]->desc), 0); | ||
2462 | } | ||
2463 | ret = 0; | ||
2464 | out: | ||
2465 | spin_unlock_irqrestore(&dum_hcd->dum->lock, flags); | ||
2466 | return ret; | ||
2252 | } | 2467 | } |
2253 | 2468 | ||
2254 | static struct hc_driver dummy_hcd = { | 2469 | static struct hc_driver dummy_hcd = { |
@@ -2262,13 +2477,13 @@ static struct hc_driver dummy_hcd = { | |||
2262 | .start = dummy_start, | 2477 | .start = dummy_start, |
2263 | .stop = dummy_stop, | 2478 | .stop = dummy_stop, |
2264 | 2479 | ||
2265 | .urb_enqueue = dummy_urb_enqueue, | 2480 | .urb_enqueue = dummy_urb_enqueue, |
2266 | .urb_dequeue = dummy_urb_dequeue, | 2481 | .urb_dequeue = dummy_urb_dequeue, |
2267 | 2482 | ||
2268 | .get_frame_number = dummy_h_get_frame, | 2483 | .get_frame_number = dummy_h_get_frame, |
2269 | 2484 | ||
2270 | .hub_status_data = dummy_hub_status, | 2485 | .hub_status_data = dummy_hub_status, |
2271 | .hub_control = dummy_hub_control, | 2486 | .hub_control = dummy_hub_control, |
2272 | .bus_suspend = dummy_bus_suspend, | 2487 | .bus_suspend = dummy_bus_suspend, |
2273 | .bus_resume = dummy_bus_resume, | 2488 | .bus_resume = dummy_bus_resume, |
2274 | 2489 | ||
@@ -2323,7 +2538,7 @@ static int dummy_hcd_remove(struct platform_device *pdev) | |||
2323 | { | 2538 | { |
2324 | struct dummy *dum; | 2539 | struct dummy *dum; |
2325 | 2540 | ||
2326 | dum = (hcd_to_dummy_hcd(platform_get_drvdata(pdev)))->dum; | 2541 | dum = hcd_to_dummy_hcd(platform_get_drvdata(pdev))->dum; |
2327 | 2542 | ||
2328 | if (dum->ss_hcd) { | 2543 | if (dum->ss_hcd) { |
2329 | usb_remove_hcd(dummy_hcd_to_hcd(dum->ss_hcd)); | 2544 | usb_remove_hcd(dummy_hcd_to_hcd(dum->ss_hcd)); |
@@ -2339,15 +2554,15 @@ static int dummy_hcd_remove(struct platform_device *pdev) | |||
2339 | return 0; | 2554 | return 0; |
2340 | } | 2555 | } |
2341 | 2556 | ||
2342 | static int dummy_hcd_suspend (struct platform_device *pdev, pm_message_t state) | 2557 | static int dummy_hcd_suspend(struct platform_device *pdev, pm_message_t state) |
2343 | { | 2558 | { |
2344 | struct usb_hcd *hcd; | 2559 | struct usb_hcd *hcd; |
2345 | struct dummy_hcd *dum_hcd; | 2560 | struct dummy_hcd *dum_hcd; |
2346 | int rc = 0; | 2561 | int rc = 0; |
2347 | 2562 | ||
2348 | dev_dbg (&pdev->dev, "%s\n", __func__); | 2563 | dev_dbg(&pdev->dev, "%s\n", __func__); |
2349 | 2564 | ||
2350 | hcd = platform_get_drvdata (pdev); | 2565 | hcd = platform_get_drvdata(pdev); |
2351 | dum_hcd = hcd_to_dummy_hcd(hcd); | 2566 | dum_hcd = hcd_to_dummy_hcd(hcd); |
2352 | if (dum_hcd->rh_state == DUMMY_RH_RUNNING) { | 2567 | if (dum_hcd->rh_state == DUMMY_RH_RUNNING) { |
2353 | dev_warn(&pdev->dev, "Root hub isn't suspended!\n"); | 2568 | dev_warn(&pdev->dev, "Root hub isn't suspended!\n"); |
@@ -2357,15 +2572,15 @@ static int dummy_hcd_suspend (struct platform_device *pdev, pm_message_t state) | |||
2357 | return rc; | 2572 | return rc; |
2358 | } | 2573 | } |
2359 | 2574 | ||
2360 | static int dummy_hcd_resume (struct platform_device *pdev) | 2575 | static int dummy_hcd_resume(struct platform_device *pdev) |
2361 | { | 2576 | { |
2362 | struct usb_hcd *hcd; | 2577 | struct usb_hcd *hcd; |
2363 | 2578 | ||
2364 | dev_dbg (&pdev->dev, "%s\n", __func__); | 2579 | dev_dbg(&pdev->dev, "%s\n", __func__); |
2365 | 2580 | ||
2366 | hcd = platform_get_drvdata (pdev); | 2581 | hcd = platform_get_drvdata(pdev); |
2367 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | 2582 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); |
2368 | usb_hcd_poll_rh_status (hcd); | 2583 | usb_hcd_poll_rh_status(hcd); |
2369 | return 0; | 2584 | return 0; |
2370 | } | 2585 | } |
2371 | 2586 | ||
@@ -2385,11 +2600,11 @@ static struct platform_driver dummy_hcd_driver = { | |||
2385 | static struct platform_device *the_udc_pdev; | 2600 | static struct platform_device *the_udc_pdev; |
2386 | static struct platform_device *the_hcd_pdev; | 2601 | static struct platform_device *the_hcd_pdev; |
2387 | 2602 | ||
2388 | static int __init init (void) | 2603 | static int __init init(void) |
2389 | { | 2604 | { |
2390 | int retval = -ENOMEM; | 2605 | int retval = -ENOMEM; |
2391 | 2606 | ||
2392 | if (usb_disabled ()) | 2607 | if (usb_disabled()) |
2393 | return -ENODEV; | 2608 | return -ENODEV; |
2394 | 2609 | ||
2395 | if (!mod_data.is_high_speed && mod_data.is_super_speed) | 2610 | if (!mod_data.is_high_speed && mod_data.is_super_speed) |
@@ -2448,13 +2663,13 @@ err_alloc_udc: | |||
2448 | platform_device_put(the_hcd_pdev); | 2663 | platform_device_put(the_hcd_pdev); |
2449 | return retval; | 2664 | return retval; |
2450 | } | 2665 | } |
2451 | module_init (init); | 2666 | module_init(init); |
2452 | 2667 | ||
2453 | static void __exit cleanup (void) | 2668 | static void __exit cleanup(void) |
2454 | { | 2669 | { |
2455 | platform_device_unregister(the_udc_pdev); | 2670 | platform_device_unregister(the_udc_pdev); |
2456 | platform_device_unregister(the_hcd_pdev); | 2671 | platform_device_unregister(the_hcd_pdev); |
2457 | platform_driver_unregister(&dummy_udc_driver); | 2672 | platform_driver_unregister(&dummy_udc_driver); |
2458 | platform_driver_unregister(&dummy_hcd_driver); | 2673 | platform_driver_unregister(&dummy_hcd_driver); |
2459 | } | 2674 | } |
2460 | module_exit (cleanup); | 2675 | module_exit(cleanup); |
diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c index e0e6375ef5dd..51f3d42f5a64 100644 --- a/drivers/usb/gadget/epautoconf.c +++ b/drivers/usb/gadget/epautoconf.c | |||
@@ -275,24 +275,24 @@ struct usb_ep *usb_ep_autoconfig_ss( | |||
275 | /* ep-e, ep-f are PIO with only 64 byte fifos */ | 275 | /* ep-e, ep-f are PIO with only 64 byte fifos */ |
276 | ep = find_ep (gadget, "ep-e"); | 276 | ep = find_ep (gadget, "ep-e"); |
277 | if (ep && ep_matches(gadget, ep, desc, ep_comp)) | 277 | if (ep && ep_matches(gadget, ep, desc, ep_comp)) |
278 | return ep; | 278 | goto found_ep; |
279 | ep = find_ep (gadget, "ep-f"); | 279 | ep = find_ep (gadget, "ep-f"); |
280 | if (ep && ep_matches(gadget, ep, desc, ep_comp)) | 280 | if (ep && ep_matches(gadget, ep, desc, ep_comp)) |
281 | return ep; | 281 | goto found_ep; |
282 | 282 | ||
283 | } else if (gadget_is_goku (gadget)) { | 283 | } else if (gadget_is_goku (gadget)) { |
284 | if (USB_ENDPOINT_XFER_INT == type) { | 284 | if (USB_ENDPOINT_XFER_INT == type) { |
285 | /* single buffering is enough */ | 285 | /* single buffering is enough */ |
286 | ep = find_ep(gadget, "ep3-bulk"); | 286 | ep = find_ep(gadget, "ep3-bulk"); |
287 | if (ep && ep_matches(gadget, ep, desc, ep_comp)) | 287 | if (ep && ep_matches(gadget, ep, desc, ep_comp)) |
288 | return ep; | 288 | goto found_ep; |
289 | } else if (USB_ENDPOINT_XFER_BULK == type | 289 | } else if (USB_ENDPOINT_XFER_BULK == type |
290 | && (USB_DIR_IN & desc->bEndpointAddress)) { | 290 | && (USB_DIR_IN & desc->bEndpointAddress)) { |
291 | /* DMA may be available */ | 291 | /* DMA may be available */ |
292 | ep = find_ep(gadget, "ep2-bulk"); | 292 | ep = find_ep(gadget, "ep2-bulk"); |
293 | if (ep && ep_matches(gadget, ep, desc, | 293 | if (ep && ep_matches(gadget, ep, desc, |
294 | ep_comp)) | 294 | ep_comp)) |
295 | return ep; | 295 | goto found_ep; |
296 | } | 296 | } |
297 | 297 | ||
298 | #ifdef CONFIG_BLACKFIN | 298 | #ifdef CONFIG_BLACKFIN |
@@ -311,18 +311,22 @@ struct usb_ep *usb_ep_autoconfig_ss( | |||
311 | } else | 311 | } else |
312 | ep = NULL; | 312 | ep = NULL; |
313 | if (ep && ep_matches(gadget, ep, desc, ep_comp)) | 313 | if (ep && ep_matches(gadget, ep, desc, ep_comp)) |
314 | return ep; | 314 | goto found_ep; |
315 | #endif | 315 | #endif |
316 | } | 316 | } |
317 | 317 | ||
318 | /* Second, look at endpoints until an unclaimed one looks usable */ | 318 | /* Second, look at endpoints until an unclaimed one looks usable */ |
319 | list_for_each_entry (ep, &gadget->ep_list, ep_list) { | 319 | list_for_each_entry (ep, &gadget->ep_list, ep_list) { |
320 | if (ep_matches(gadget, ep, desc, ep_comp)) | 320 | if (ep_matches(gadget, ep, desc, ep_comp)) |
321 | return ep; | 321 | goto found_ep; |
322 | } | 322 | } |
323 | 323 | ||
324 | /* Fail */ | 324 | /* Fail */ |
325 | return NULL; | 325 | return NULL; |
326 | found_ep: | ||
327 | ep->desc = NULL; | ||
328 | ep->comp_desc = NULL; | ||
329 | return ep; | ||
326 | } | 330 | } |
327 | 331 | ||
328 | /** | 332 | /** |
diff --git a/drivers/usb/gadget/f_acm.c b/drivers/usb/gadget/f_acm.c index 3f8849339ade..d672250a61fa 100644 --- a/drivers/usb/gadget/f_acm.c +++ b/drivers/usb/gadget/f_acm.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * Copyright (C) 2008 by David Brownell | 5 | * Copyright (C) 2008 by David Brownell |
6 | * Copyright (C) 2008 by Nokia Corporation | 6 | * Copyright (C) 2008 by Nokia Corporation |
7 | * Copyright (C) 2009 by Samsung Electronics | 7 | * Copyright (C) 2009 by Samsung Electronics |
8 | * Author: Michal Nazarewicz (m.nazarewicz@samsung.com) | 8 | * Author: Michal Nazarewicz (mina86@mina86.com) |
9 | * | 9 | * |
10 | * This software is distributed under the terms of the GNU General | 10 | * This software is distributed under the terms of the GNU General |
11 | * Public License ("GPL") as published by the Free Software Foundation, | 11 | * Public License ("GPL") as published by the Free Software Foundation, |
@@ -237,6 +237,42 @@ static struct usb_descriptor_header *acm_hs_function[] = { | |||
237 | NULL, | 237 | NULL, |
238 | }; | 238 | }; |
239 | 239 | ||
240 | static struct usb_endpoint_descriptor acm_ss_in_desc = { | ||
241 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
242 | .bDescriptorType = USB_DT_ENDPOINT, | ||
243 | .bmAttributes = USB_ENDPOINT_XFER_BULK, | ||
244 | .wMaxPacketSize = cpu_to_le16(1024), | ||
245 | }; | ||
246 | |||
247 | static struct usb_endpoint_descriptor acm_ss_out_desc = { | ||
248 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
249 | .bDescriptorType = USB_DT_ENDPOINT, | ||
250 | .bmAttributes = USB_ENDPOINT_XFER_BULK, | ||
251 | .wMaxPacketSize = cpu_to_le16(1024), | ||
252 | }; | ||
253 | |||
254 | static struct usb_ss_ep_comp_descriptor acm_ss_bulk_comp_desc = { | ||
255 | .bLength = sizeof acm_ss_bulk_comp_desc, | ||
256 | .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, | ||
257 | }; | ||
258 | |||
259 | static struct usb_descriptor_header *acm_ss_function[] = { | ||
260 | (struct usb_descriptor_header *) &acm_iad_descriptor, | ||
261 | (struct usb_descriptor_header *) &acm_control_interface_desc, | ||
262 | (struct usb_descriptor_header *) &acm_header_desc, | ||
263 | (struct usb_descriptor_header *) &acm_call_mgmt_descriptor, | ||
264 | (struct usb_descriptor_header *) &acm_descriptor, | ||
265 | (struct usb_descriptor_header *) &acm_union_desc, | ||
266 | (struct usb_descriptor_header *) &acm_hs_notify_desc, | ||
267 | (struct usb_descriptor_header *) &acm_ss_bulk_comp_desc, | ||
268 | (struct usb_descriptor_header *) &acm_data_interface_desc, | ||
269 | (struct usb_descriptor_header *) &acm_ss_in_desc, | ||
270 | (struct usb_descriptor_header *) &acm_ss_bulk_comp_desc, | ||
271 | (struct usb_descriptor_header *) &acm_ss_out_desc, | ||
272 | (struct usb_descriptor_header *) &acm_ss_bulk_comp_desc, | ||
273 | NULL, | ||
274 | }; | ||
275 | |||
240 | /* string descriptors: */ | 276 | /* string descriptors: */ |
241 | 277 | ||
242 | #define ACM_CTRL_IDX 0 | 278 | #define ACM_CTRL_IDX 0 |
@@ -643,9 +679,21 @@ acm_bind(struct usb_configuration *c, struct usb_function *f) | |||
643 | /* copy descriptors */ | 679 | /* copy descriptors */ |
644 | f->hs_descriptors = usb_copy_descriptors(acm_hs_function); | 680 | f->hs_descriptors = usb_copy_descriptors(acm_hs_function); |
645 | } | 681 | } |
682 | if (gadget_is_superspeed(c->cdev->gadget)) { | ||
683 | acm_ss_in_desc.bEndpointAddress = | ||
684 | acm_fs_in_desc.bEndpointAddress; | ||
685 | acm_ss_out_desc.bEndpointAddress = | ||
686 | acm_fs_out_desc.bEndpointAddress; | ||
687 | |||
688 | /* copy descriptors, and track endpoint copies */ | ||
689 | f->ss_descriptors = usb_copy_descriptors(acm_ss_function); | ||
690 | if (!f->ss_descriptors) | ||
691 | goto fail; | ||
692 | } | ||
646 | 693 | ||
647 | DBG(cdev, "acm ttyGS%d: %s speed IN/%s OUT/%s NOTIFY/%s\n", | 694 | DBG(cdev, "acm ttyGS%d: %s speed IN/%s OUT/%s NOTIFY/%s\n", |
648 | acm->port_num, | 695 | acm->port_num, |
696 | gadget_is_superspeed(c->cdev->gadget) ? "super" : | ||
649 | gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full", | 697 | gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full", |
650 | acm->port.in->name, acm->port.out->name, | 698 | acm->port.in->name, acm->port.out->name, |
651 | acm->notify->name); | 699 | acm->notify->name); |
@@ -675,6 +723,8 @@ acm_unbind(struct usb_configuration *c, struct usb_function *f) | |||
675 | 723 | ||
676 | if (gadget_is_dualspeed(c->cdev->gadget)) | 724 | if (gadget_is_dualspeed(c->cdev->gadget)) |
677 | usb_free_descriptors(f->hs_descriptors); | 725 | usb_free_descriptors(f->hs_descriptors); |
726 | if (gadget_is_superspeed(c->cdev->gadget)) | ||
727 | usb_free_descriptors(f->ss_descriptors); | ||
678 | usb_free_descriptors(f->descriptors); | 728 | usb_free_descriptors(f->descriptors); |
679 | gs_free_req(acm->notify, acm->notify_req); | 729 | gs_free_req(acm->notify, acm->notify_req); |
680 | kfree(acm); | 730 | kfree(acm); |
diff --git a/drivers/usb/gadget/f_ecm.c b/drivers/usb/gadget/f_ecm.c index 11c07cb7d337..30b908f2a53d 100644 --- a/drivers/usb/gadget/f_ecm.c +++ b/drivers/usb/gadget/f_ecm.c | |||
@@ -97,6 +97,20 @@ static inline unsigned ecm_bitrate(struct usb_gadget *g) | |||
97 | 97 | ||
98 | /* interface descriptor: */ | 98 | /* interface descriptor: */ |
99 | 99 | ||
100 | static struct usb_interface_assoc_descriptor | ||
101 | ecm_iad_descriptor = { | ||
102 | .bLength = sizeof ecm_iad_descriptor, | ||
103 | .bDescriptorType = USB_DT_INTERFACE_ASSOCIATION, | ||
104 | |||
105 | /* .bFirstInterface = DYNAMIC, */ | ||
106 | .bInterfaceCount = 2, /* control + data */ | ||
107 | .bFunctionClass = USB_CLASS_COMM, | ||
108 | .bFunctionSubClass = USB_CDC_SUBCLASS_ETHERNET, | ||
109 | .bFunctionProtocol = USB_CDC_PROTO_NONE, | ||
110 | /* .iFunction = DYNAMIC */ | ||
111 | }; | ||
112 | |||
113 | |||
100 | static struct usb_interface_descriptor ecm_control_intf = { | 114 | static struct usb_interface_descriptor ecm_control_intf = { |
101 | .bLength = sizeof ecm_control_intf, | 115 | .bLength = sizeof ecm_control_intf, |
102 | .bDescriptorType = USB_DT_INTERFACE, | 116 | .bDescriptorType = USB_DT_INTERFACE, |
@@ -199,6 +213,7 @@ static struct usb_endpoint_descriptor fs_ecm_out_desc = { | |||
199 | 213 | ||
200 | static struct usb_descriptor_header *ecm_fs_function[] = { | 214 | static struct usb_descriptor_header *ecm_fs_function[] = { |
201 | /* CDC ECM control descriptors */ | 215 | /* CDC ECM control descriptors */ |
216 | (struct usb_descriptor_header *) &ecm_iad_descriptor, | ||
202 | (struct usb_descriptor_header *) &ecm_control_intf, | 217 | (struct usb_descriptor_header *) &ecm_control_intf, |
203 | (struct usb_descriptor_header *) &ecm_header_desc, | 218 | (struct usb_descriptor_header *) &ecm_header_desc, |
204 | (struct usb_descriptor_header *) &ecm_union_desc, | 219 | (struct usb_descriptor_header *) &ecm_union_desc, |
@@ -247,6 +262,7 @@ static struct usb_endpoint_descriptor hs_ecm_out_desc = { | |||
247 | 262 | ||
248 | static struct usb_descriptor_header *ecm_hs_function[] = { | 263 | static struct usb_descriptor_header *ecm_hs_function[] = { |
249 | /* CDC ECM control descriptors */ | 264 | /* CDC ECM control descriptors */ |
265 | (struct usb_descriptor_header *) &ecm_iad_descriptor, | ||
250 | (struct usb_descriptor_header *) &ecm_control_intf, | 266 | (struct usb_descriptor_header *) &ecm_control_intf, |
251 | (struct usb_descriptor_header *) &ecm_header_desc, | 267 | (struct usb_descriptor_header *) &ecm_header_desc, |
252 | (struct usb_descriptor_header *) &ecm_union_desc, | 268 | (struct usb_descriptor_header *) &ecm_union_desc, |
@@ -339,6 +355,7 @@ static struct usb_string ecm_string_defs[] = { | |||
339 | [0].s = "CDC Ethernet Control Model (ECM)", | 355 | [0].s = "CDC Ethernet Control Model (ECM)", |
340 | [1].s = NULL /* DYNAMIC */, | 356 | [1].s = NULL /* DYNAMIC */, |
341 | [2].s = "CDC Ethernet Data", | 357 | [2].s = "CDC Ethernet Data", |
358 | [3].s = "CDC ECM", | ||
342 | { } /* end of list */ | 359 | { } /* end of list */ |
343 | }; | 360 | }; |
344 | 361 | ||
@@ -674,6 +691,7 @@ ecm_bind(struct usb_configuration *c, struct usb_function *f) | |||
674 | if (status < 0) | 691 | if (status < 0) |
675 | goto fail; | 692 | goto fail; |
676 | ecm->ctrl_id = status; | 693 | ecm->ctrl_id = status; |
694 | ecm_iad_descriptor.bFirstInterface = status; | ||
677 | 695 | ||
678 | ecm_control_intf.bInterfaceNumber = status; | 696 | ecm_control_intf.bInterfaceNumber = status; |
679 | ecm_union_desc.bMasterInterface0 = status; | 697 | ecm_union_desc.bMasterInterface0 = status; |
@@ -864,6 +882,13 @@ ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]) | |||
864 | return status; | 882 | return status; |
865 | ecm_string_defs[1].id = status; | 883 | ecm_string_defs[1].id = status; |
866 | ecm_desc.iMACAddress = status; | 884 | ecm_desc.iMACAddress = status; |
885 | |||
886 | /* IAD label */ | ||
887 | status = usb_string_id(c->cdev); | ||
888 | if (status < 0) | ||
889 | return status; | ||
890 | ecm_string_defs[3].id = status; | ||
891 | ecm_iad_descriptor.iFunction = status; | ||
867 | } | 892 | } |
868 | 893 | ||
869 | /* allocate and initialize one new instance */ | 894 | /* allocate and initialize one new instance */ |
diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c index f63dc6c150d2..7f445ec723bc 100644 --- a/drivers/usb/gadget/f_fs.c +++ b/drivers/usb/gadget/f_fs.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * f_fs.c -- user mode file system API for USB composite function controllers | 2 | * f_fs.c -- user mode file system API for USB composite function controllers |
3 | * | 3 | * |
4 | * Copyright (C) 2010 Samsung Electronics | 4 | * Copyright (C) 2010 Samsung Electronics |
5 | * Author: Michal Nazarewicz <m.nazarewicz@samsung.com> | 5 | * Author: Michal Nazarewicz <mina86@mina86.com> |
6 | * | 6 | * |
7 | * Based on inode.c (GadgetFS) which was: | 7 | * Based on inode.c (GadgetFS) which was: |
8 | * Copyright (C) 2003-2004 David Brownell | 8 | * Copyright (C) 2003-2004 David Brownell |
@@ -1258,9 +1258,7 @@ static void ffs_data_put(struct ffs_data *ffs) | |||
1258 | if (unlikely(atomic_dec_and_test(&ffs->ref))) { | 1258 | if (unlikely(atomic_dec_and_test(&ffs->ref))) { |
1259 | pr_info("%s(): freeing\n", __func__); | 1259 | pr_info("%s(): freeing\n", __func__); |
1260 | ffs_data_clear(ffs); | 1260 | ffs_data_clear(ffs); |
1261 | BUG_ON(mutex_is_locked(&ffs->mutex) || | 1261 | BUG_ON(waitqueue_active(&ffs->ev.waitq) || |
1262 | spin_is_locked(&ffs->ev.waitq.lock) || | ||
1263 | waitqueue_active(&ffs->ev.waitq) || | ||
1264 | waitqueue_active(&ffs->ep0req_completion.wait)); | 1262 | waitqueue_active(&ffs->ep0req_completion.wait)); |
1265 | kfree(ffs); | 1263 | kfree(ffs); |
1266 | } | 1264 | } |
diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c index ee8ceec01560..a371e966425f 100644 --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 2003-2008 Alan Stern | 4 | * Copyright (C) 2003-2008 Alan Stern |
5 | * Copyright (C) 2009 Samsung Electronics | 5 | * Copyright (C) 2009 Samsung Electronics |
6 | * Author: Michal Nazarewicz <m.nazarewicz@samsung.com> | 6 | * Author: Michal Nazarewicz <mina86@mina86.com> |
7 | * All rights reserved. | 7 | * All rights reserved. |
8 | * | 8 | * |
9 | * Redistribution and use in source and binary forms, with or without | 9 | * Redistribution and use in source and binary forms, with or without |
@@ -304,7 +304,6 @@ | |||
304 | 304 | ||
305 | static const char fsg_string_interface[] = "Mass Storage"; | 305 | static const char fsg_string_interface[] = "Mass Storage"; |
306 | 306 | ||
307 | #define FSG_NO_INTR_EP 1 | ||
308 | #define FSG_NO_DEVICE_STRINGS 1 | 307 | #define FSG_NO_DEVICE_STRINGS 1 |
309 | #define FSG_NO_OTG 1 | 308 | #define FSG_NO_OTG 1 |
310 | #define FSG_NO_INTR_EP 1 | 309 | #define FSG_NO_INTR_EP 1 |
@@ -620,7 +619,7 @@ static int fsg_setup(struct usb_function *f, | |||
620 | 619 | ||
621 | switch (ctrl->bRequest) { | 620 | switch (ctrl->bRequest) { |
622 | 621 | ||
623 | case USB_BULK_RESET_REQUEST: | 622 | case US_BULK_RESET_REQUEST: |
624 | if (ctrl->bRequestType != | 623 | if (ctrl->bRequestType != |
625 | (USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE)) | 624 | (USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE)) |
626 | break; | 625 | break; |
@@ -636,7 +635,7 @@ static int fsg_setup(struct usb_function *f, | |||
636 | raise_exception(fsg->common, FSG_STATE_RESET); | 635 | raise_exception(fsg->common, FSG_STATE_RESET); |
637 | return DELAYED_STATUS; | 636 | return DELAYED_STATUS; |
638 | 637 | ||
639 | case USB_BULK_GET_MAX_LUN_REQUEST: | 638 | case US_BULK_GET_MAX_LUN: |
640 | if (ctrl->bRequestType != | 639 | if (ctrl->bRequestType != |
641 | (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE)) | 640 | (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE)) |
642 | break; | 641 | break; |
@@ -1742,7 +1741,7 @@ static int send_status(struct fsg_common *common) | |||
1742 | struct fsg_buffhd *bh; | 1741 | struct fsg_buffhd *bh; |
1743 | struct bulk_cs_wrap *csw; | 1742 | struct bulk_cs_wrap *csw; |
1744 | int rc; | 1743 | int rc; |
1745 | u8 status = USB_STATUS_PASS; | 1744 | u8 status = US_BULK_STAT_OK; |
1746 | u32 sd, sdinfo = 0; | 1745 | u32 sd, sdinfo = 0; |
1747 | 1746 | ||
1748 | /* Wait for the next buffer to become available */ | 1747 | /* Wait for the next buffer to become available */ |
@@ -1763,11 +1762,11 @@ static int send_status(struct fsg_common *common) | |||
1763 | 1762 | ||
1764 | if (common->phase_error) { | 1763 | if (common->phase_error) { |
1765 | DBG(common, "sending phase-error status\n"); | 1764 | DBG(common, "sending phase-error status\n"); |
1766 | status = USB_STATUS_PHASE_ERROR; | 1765 | status = US_BULK_STAT_PHASE; |
1767 | sd = SS_INVALID_COMMAND; | 1766 | sd = SS_INVALID_COMMAND; |
1768 | } else if (sd != SS_NO_SENSE) { | 1767 | } else if (sd != SS_NO_SENSE) { |
1769 | DBG(common, "sending command-failure status\n"); | 1768 | DBG(common, "sending command-failure status\n"); |
1770 | status = USB_STATUS_FAIL; | 1769 | status = US_BULK_STAT_FAIL; |
1771 | VDBG(common, " sense data: SK x%02x, ASC x%02x, ASCQ x%02x;" | 1770 | VDBG(common, " sense data: SK x%02x, ASC x%02x, ASCQ x%02x;" |
1772 | " info x%x\n", | 1771 | " info x%x\n", |
1773 | SK(sd), ASC(sd), ASCQ(sd), sdinfo); | 1772 | SK(sd), ASC(sd), ASCQ(sd), sdinfo); |
@@ -1776,12 +1775,12 @@ static int send_status(struct fsg_common *common) | |||
1776 | /* Store and send the Bulk-only CSW */ | 1775 | /* Store and send the Bulk-only CSW */ |
1777 | csw = (void *)bh->buf; | 1776 | csw = (void *)bh->buf; |
1778 | 1777 | ||
1779 | csw->Signature = cpu_to_le32(USB_BULK_CS_SIG); | 1778 | csw->Signature = cpu_to_le32(US_BULK_CS_SIGN); |
1780 | csw->Tag = common->tag; | 1779 | csw->Tag = common->tag; |
1781 | csw->Residue = cpu_to_le32(common->residue); | 1780 | csw->Residue = cpu_to_le32(common->residue); |
1782 | csw->Status = status; | 1781 | csw->Status = status; |
1783 | 1782 | ||
1784 | bh->inreq->length = USB_BULK_CS_WRAP_LEN; | 1783 | bh->inreq->length = US_BULK_CS_WRAP_LEN; |
1785 | bh->inreq->zero = 0; | 1784 | bh->inreq->zero = 0; |
1786 | if (!start_in_transfer(common, bh)) | 1785 | if (!start_in_transfer(common, bh)) |
1787 | /* Don't know what to do if common->fsg is NULL */ | 1786 | /* Don't know what to do if common->fsg is NULL */ |
@@ -2221,7 +2220,7 @@ unknown_cmnd: | |||
2221 | static int received_cbw(struct fsg_dev *fsg, struct fsg_buffhd *bh) | 2220 | static int received_cbw(struct fsg_dev *fsg, struct fsg_buffhd *bh) |
2222 | { | 2221 | { |
2223 | struct usb_request *req = bh->outreq; | 2222 | struct usb_request *req = bh->outreq; |
2224 | struct fsg_bulk_cb_wrap *cbw = req->buf; | 2223 | struct bulk_cb_wrap *cbw = req->buf; |
2225 | struct fsg_common *common = fsg->common; | 2224 | struct fsg_common *common = fsg->common; |
2226 | 2225 | ||
2227 | /* Was this a real packet? Should it be ignored? */ | 2226 | /* Was this a real packet? Should it be ignored? */ |
@@ -2229,9 +2228,9 @@ static int received_cbw(struct fsg_dev *fsg, struct fsg_buffhd *bh) | |||
2229 | return -EINVAL; | 2228 | return -EINVAL; |
2230 | 2229 | ||
2231 | /* Is the CBW valid? */ | 2230 | /* Is the CBW valid? */ |
2232 | if (req->actual != USB_BULK_CB_WRAP_LEN || | 2231 | if (req->actual != US_BULK_CB_WRAP_LEN || |
2233 | cbw->Signature != cpu_to_le32( | 2232 | cbw->Signature != cpu_to_le32( |
2234 | USB_BULK_CB_SIG)) { | 2233 | US_BULK_CB_SIGN)) { |
2235 | DBG(fsg, "invalid CBW: len %u sig 0x%x\n", | 2234 | DBG(fsg, "invalid CBW: len %u sig 0x%x\n", |
2236 | req->actual, | 2235 | req->actual, |
2237 | le32_to_cpu(cbw->Signature)); | 2236 | le32_to_cpu(cbw->Signature)); |
@@ -2253,7 +2252,7 @@ static int received_cbw(struct fsg_dev *fsg, struct fsg_buffhd *bh) | |||
2253 | } | 2252 | } |
2254 | 2253 | ||
2255 | /* Is the CBW meaningful? */ | 2254 | /* Is the CBW meaningful? */ |
2256 | if (cbw->Lun >= FSG_MAX_LUNS || cbw->Flags & ~USB_BULK_IN_FLAG || | 2255 | if (cbw->Lun >= FSG_MAX_LUNS || cbw->Flags & ~US_BULK_FLAG_IN || |
2257 | cbw->Length <= 0 || cbw->Length > MAX_COMMAND_SIZE) { | 2256 | cbw->Length <= 0 || cbw->Length > MAX_COMMAND_SIZE) { |
2258 | DBG(fsg, "non-meaningful CBW: lun = %u, flags = 0x%x, " | 2257 | DBG(fsg, "non-meaningful CBW: lun = %u, flags = 0x%x, " |
2259 | "cmdlen %u\n", | 2258 | "cmdlen %u\n", |
@@ -2273,7 +2272,7 @@ static int received_cbw(struct fsg_dev *fsg, struct fsg_buffhd *bh) | |||
2273 | /* Save the command for later */ | 2272 | /* Save the command for later */ |
2274 | common->cmnd_size = cbw->Length; | 2273 | common->cmnd_size = cbw->Length; |
2275 | memcpy(common->cmnd, cbw->CDB, common->cmnd_size); | 2274 | memcpy(common->cmnd, cbw->CDB, common->cmnd_size); |
2276 | if (cbw->Flags & USB_BULK_IN_FLAG) | 2275 | if (cbw->Flags & US_BULK_FLAG_IN) |
2277 | common->data_dir = DATA_DIR_TO_HOST; | 2276 | common->data_dir = DATA_DIR_TO_HOST; |
2278 | else | 2277 | else |
2279 | common->data_dir = DATA_DIR_FROM_HOST; | 2278 | common->data_dir = DATA_DIR_FROM_HOST; |
@@ -2303,7 +2302,7 @@ static int get_next_command(struct fsg_common *common) | |||
2303 | } | 2302 | } |
2304 | 2303 | ||
2305 | /* Queue a request to read a Bulk-only CBW */ | 2304 | /* Queue a request to read a Bulk-only CBW */ |
2306 | set_bulk_out_req_length(common, bh, USB_BULK_CB_WRAP_LEN); | 2305 | set_bulk_out_req_length(common, bh, US_BULK_CB_WRAP_LEN); |
2307 | if (!start_out_transfer(common, bh)) | 2306 | if (!start_out_transfer(common, bh)) |
2308 | /* Don't know what to do if common->fsg is NULL */ | 2307 | /* Don't know what to do if common->fsg is NULL */ |
2309 | return -EIO; | 2308 | return -EIO; |
diff --git a/drivers/usb/gadget/f_midi.c b/drivers/usb/gadget/f_midi.c index 3797b3d6c622..2f7e8f2930cc 100644 --- a/drivers/usb/gadget/f_midi.c +++ b/drivers/usb/gadget/f_midi.c | |||
@@ -780,7 +780,7 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) | |||
780 | midi->out_ep->driver_data = cdev; /* claim */ | 780 | midi->out_ep->driver_data = cdev; /* claim */ |
781 | 781 | ||
782 | /* allocate temporary function list */ | 782 | /* allocate temporary function list */ |
783 | midi_function = kcalloc((MAX_PORTS * 4) + 9, sizeof(midi_function), | 783 | midi_function = kcalloc((MAX_PORTS * 4) + 9, sizeof(*midi_function), |
784 | GFP_KERNEL); | 784 | GFP_KERNEL); |
785 | if (!midi_function) { | 785 | if (!midi_function) { |
786 | status = -ENOMEM; | 786 | status = -ENOMEM; |
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c index 704d1d94f72a..7b1cf18df5e3 100644 --- a/drivers/usb/gadget/f_rndis.c +++ b/drivers/usb/gadget/f_rndis.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * Copyright (C) 2003-2004 Robert Schwebel, Benedikt Spranger | 5 | * Copyright (C) 2003-2004 Robert Schwebel, Benedikt Spranger |
6 | * Copyright (C) 2008 Nokia Corporation | 6 | * Copyright (C) 2008 Nokia Corporation |
7 | * Copyright (C) 2009 Samsung Electronics | 7 | * Copyright (C) 2009 Samsung Electronics |
8 | * Author: Michal Nazarewicz (m.nazarewicz@samsung.com) | 8 | * Author: Michal Nazarewicz (mina86@mina86.com) |
9 | * | 9 | * |
10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License as published by | 11 | * it under the terms of the GNU General Public License as published by |
diff --git a/drivers/usb/gadget/f_serial.c b/drivers/usb/gadget/f_serial.c index cf33a8d0fd5d..07197d63d9b1 100644 --- a/drivers/usb/gadget/f_serial.c +++ b/drivers/usb/gadget/f_serial.c | |||
@@ -99,6 +99,34 @@ static struct usb_descriptor_header *gser_hs_function[] __initdata = { | |||
99 | NULL, | 99 | NULL, |
100 | }; | 100 | }; |
101 | 101 | ||
102 | static struct usb_endpoint_descriptor gser_ss_in_desc __initdata = { | ||
103 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
104 | .bDescriptorType = USB_DT_ENDPOINT, | ||
105 | .bmAttributes = USB_ENDPOINT_XFER_BULK, | ||
106 | .wMaxPacketSize = cpu_to_le16(1024), | ||
107 | }; | ||
108 | |||
109 | static struct usb_endpoint_descriptor gser_ss_out_desc __initdata = { | ||
110 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
111 | .bDescriptorType = USB_DT_ENDPOINT, | ||
112 | .bmAttributes = USB_ENDPOINT_XFER_BULK, | ||
113 | .wMaxPacketSize = cpu_to_le16(1024), | ||
114 | }; | ||
115 | |||
116 | static struct usb_ss_ep_comp_descriptor gser_ss_bulk_comp_desc __initdata = { | ||
117 | .bLength = sizeof gser_ss_bulk_comp_desc, | ||
118 | .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, | ||
119 | }; | ||
120 | |||
121 | static struct usb_descriptor_header *gser_ss_function[] __initdata = { | ||
122 | (struct usb_descriptor_header *) &gser_interface_desc, | ||
123 | (struct usb_descriptor_header *) &gser_ss_in_desc, | ||
124 | (struct usb_descriptor_header *) &gser_ss_bulk_comp_desc, | ||
125 | (struct usb_descriptor_header *) &gser_ss_out_desc, | ||
126 | (struct usb_descriptor_header *) &gser_ss_bulk_comp_desc, | ||
127 | NULL, | ||
128 | }; | ||
129 | |||
102 | /* string descriptors: */ | 130 | /* string descriptors: */ |
103 | 131 | ||
104 | static struct usb_string gser_string_defs[] = { | 132 | static struct usb_string gser_string_defs[] = { |
@@ -201,9 +229,21 @@ gser_bind(struct usb_configuration *c, struct usb_function *f) | |||
201 | /* copy descriptors, and track endpoint copies */ | 229 | /* copy descriptors, and track endpoint copies */ |
202 | f->hs_descriptors = usb_copy_descriptors(gser_hs_function); | 230 | f->hs_descriptors = usb_copy_descriptors(gser_hs_function); |
203 | } | 231 | } |
232 | if (gadget_is_superspeed(c->cdev->gadget)) { | ||
233 | gser_ss_in_desc.bEndpointAddress = | ||
234 | gser_fs_in_desc.bEndpointAddress; | ||
235 | gser_ss_out_desc.bEndpointAddress = | ||
236 | gser_fs_out_desc.bEndpointAddress; | ||
237 | |||
238 | /* copy descriptors, and track endpoint copies */ | ||
239 | f->ss_descriptors = usb_copy_descriptors(gser_ss_function); | ||
240 | if (!f->ss_descriptors) | ||
241 | goto fail; | ||
242 | } | ||
204 | 243 | ||
205 | DBG(cdev, "generic ttyGS%d: %s speed IN/%s OUT/%s\n", | 244 | DBG(cdev, "generic ttyGS%d: %s speed IN/%s OUT/%s\n", |
206 | gser->port_num, | 245 | gser->port_num, |
246 | gadget_is_superspeed(c->cdev->gadget) ? "super" : | ||
207 | gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full", | 247 | gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full", |
208 | gser->port.in->name, gser->port.out->name); | 248 | gser->port.in->name, gser->port.out->name); |
209 | return 0; | 249 | return 0; |
@@ -225,6 +265,8 @@ gser_unbind(struct usb_configuration *c, struct usb_function *f) | |||
225 | { | 265 | { |
226 | if (gadget_is_dualspeed(c->cdev->gadget)) | 266 | if (gadget_is_dualspeed(c->cdev->gadget)) |
227 | usb_free_descriptors(f->hs_descriptors); | 267 | usb_free_descriptors(f->hs_descriptors); |
268 | if (gadget_is_superspeed(c->cdev->gadget)) | ||
269 | usb_free_descriptors(f->ss_descriptors); | ||
228 | usb_free_descriptors(f->descriptors); | 270 | usb_free_descriptors(f->descriptors); |
229 | kfree(func_to_gser(f)); | 271 | kfree(func_to_gser(f)); |
230 | } | 272 | } |
diff --git a/drivers/usb/gadget/f_subset.c b/drivers/usb/gadget/f_subset.c index c1540648125a..21ab474aca07 100644 --- a/drivers/usb/gadget/f_subset.c +++ b/drivers/usb/gadget/f_subset.c | |||
@@ -74,7 +74,7 @@ static inline struct f_gether *func_to_geth(struct usb_function *f) | |||
74 | 74 | ||
75 | /* interface descriptor: */ | 75 | /* interface descriptor: */ |
76 | 76 | ||
77 | static struct usb_interface_descriptor subset_data_intf __initdata = { | 77 | static struct usb_interface_descriptor subset_data_intf = { |
78 | .bLength = sizeof subset_data_intf, | 78 | .bLength = sizeof subset_data_intf, |
79 | .bDescriptorType = USB_DT_INTERFACE, | 79 | .bDescriptorType = USB_DT_INTERFACE, |
80 | 80 | ||
@@ -87,7 +87,7 @@ static struct usb_interface_descriptor subset_data_intf __initdata = { | |||
87 | /* .iInterface = DYNAMIC */ | 87 | /* .iInterface = DYNAMIC */ |
88 | }; | 88 | }; |
89 | 89 | ||
90 | static struct usb_cdc_header_desc mdlm_header_desc __initdata = { | 90 | static struct usb_cdc_header_desc mdlm_header_desc = { |
91 | .bLength = sizeof mdlm_header_desc, | 91 | .bLength = sizeof mdlm_header_desc, |
92 | .bDescriptorType = USB_DT_CS_INTERFACE, | 92 | .bDescriptorType = USB_DT_CS_INTERFACE, |
93 | .bDescriptorSubType = USB_CDC_HEADER_TYPE, | 93 | .bDescriptorSubType = USB_CDC_HEADER_TYPE, |
@@ -95,7 +95,7 @@ static struct usb_cdc_header_desc mdlm_header_desc __initdata = { | |||
95 | .bcdCDC = cpu_to_le16(0x0110), | 95 | .bcdCDC = cpu_to_le16(0x0110), |
96 | }; | 96 | }; |
97 | 97 | ||
98 | static struct usb_cdc_mdlm_desc mdlm_desc __initdata = { | 98 | static struct usb_cdc_mdlm_desc mdlm_desc = { |
99 | .bLength = sizeof mdlm_desc, | 99 | .bLength = sizeof mdlm_desc, |
100 | .bDescriptorType = USB_DT_CS_INTERFACE, | 100 | .bDescriptorType = USB_DT_CS_INTERFACE, |
101 | .bDescriptorSubType = USB_CDC_MDLM_TYPE, | 101 | .bDescriptorSubType = USB_CDC_MDLM_TYPE, |
@@ -111,7 +111,7 @@ static struct usb_cdc_mdlm_desc mdlm_desc __initdata = { | |||
111 | * can't really use its struct. All we do here is say that we're using | 111 | * can't really use its struct. All we do here is say that we're using |
112 | * the submode of "SAFE" which directly matches the CDC Subset. | 112 | * the submode of "SAFE" which directly matches the CDC Subset. |
113 | */ | 113 | */ |
114 | static u8 mdlm_detail_desc[] __initdata = { | 114 | static u8 mdlm_detail_desc[] = { |
115 | 6, | 115 | 6, |
116 | USB_DT_CS_INTERFACE, | 116 | USB_DT_CS_INTERFACE, |
117 | USB_CDC_MDLM_DETAIL_TYPE, | 117 | USB_CDC_MDLM_DETAIL_TYPE, |
@@ -121,7 +121,7 @@ static u8 mdlm_detail_desc[] __initdata = { | |||
121 | 0, /* network data capabilities ("raw" encapsulation) */ | 121 | 0, /* network data capabilities ("raw" encapsulation) */ |
122 | }; | 122 | }; |
123 | 123 | ||
124 | static struct usb_cdc_ether_desc ether_desc __initdata = { | 124 | static struct usb_cdc_ether_desc ether_desc = { |
125 | .bLength = sizeof ether_desc, | 125 | .bLength = sizeof ether_desc, |
126 | .bDescriptorType = USB_DT_CS_INTERFACE, | 126 | .bDescriptorType = USB_DT_CS_INTERFACE, |
127 | .bDescriptorSubType = USB_CDC_ETHERNET_TYPE, | 127 | .bDescriptorSubType = USB_CDC_ETHERNET_TYPE, |
@@ -136,7 +136,7 @@ static struct usb_cdc_ether_desc ether_desc __initdata = { | |||
136 | 136 | ||
137 | /* full speed support: */ | 137 | /* full speed support: */ |
138 | 138 | ||
139 | static struct usb_endpoint_descriptor fs_subset_in_desc __initdata = { | 139 | static struct usb_endpoint_descriptor fs_subset_in_desc = { |
140 | .bLength = USB_DT_ENDPOINT_SIZE, | 140 | .bLength = USB_DT_ENDPOINT_SIZE, |
141 | .bDescriptorType = USB_DT_ENDPOINT, | 141 | .bDescriptorType = USB_DT_ENDPOINT, |
142 | 142 | ||
@@ -144,7 +144,7 @@ static struct usb_endpoint_descriptor fs_subset_in_desc __initdata = { | |||
144 | .bmAttributes = USB_ENDPOINT_XFER_BULK, | 144 | .bmAttributes = USB_ENDPOINT_XFER_BULK, |
145 | }; | 145 | }; |
146 | 146 | ||
147 | static struct usb_endpoint_descriptor fs_subset_out_desc __initdata = { | 147 | static struct usb_endpoint_descriptor fs_subset_out_desc = { |
148 | .bLength = USB_DT_ENDPOINT_SIZE, | 148 | .bLength = USB_DT_ENDPOINT_SIZE, |
149 | .bDescriptorType = USB_DT_ENDPOINT, | 149 | .bDescriptorType = USB_DT_ENDPOINT, |
150 | 150 | ||
@@ -152,7 +152,7 @@ static struct usb_endpoint_descriptor fs_subset_out_desc __initdata = { | |||
152 | .bmAttributes = USB_ENDPOINT_XFER_BULK, | 152 | .bmAttributes = USB_ENDPOINT_XFER_BULK, |
153 | }; | 153 | }; |
154 | 154 | ||
155 | static struct usb_descriptor_header *fs_eth_function[] __initdata = { | 155 | static struct usb_descriptor_header *fs_eth_function[] = { |
156 | (struct usb_descriptor_header *) &subset_data_intf, | 156 | (struct usb_descriptor_header *) &subset_data_intf, |
157 | (struct usb_descriptor_header *) &mdlm_header_desc, | 157 | (struct usb_descriptor_header *) &mdlm_header_desc, |
158 | (struct usb_descriptor_header *) &mdlm_desc, | 158 | (struct usb_descriptor_header *) &mdlm_desc, |
@@ -165,7 +165,7 @@ static struct usb_descriptor_header *fs_eth_function[] __initdata = { | |||
165 | 165 | ||
166 | /* high speed support: */ | 166 | /* high speed support: */ |
167 | 167 | ||
168 | static struct usb_endpoint_descriptor hs_subset_in_desc __initdata = { | 168 | static struct usb_endpoint_descriptor hs_subset_in_desc = { |
169 | .bLength = USB_DT_ENDPOINT_SIZE, | 169 | .bLength = USB_DT_ENDPOINT_SIZE, |
170 | .bDescriptorType = USB_DT_ENDPOINT, | 170 | .bDescriptorType = USB_DT_ENDPOINT, |
171 | 171 | ||
@@ -173,7 +173,7 @@ static struct usb_endpoint_descriptor hs_subset_in_desc __initdata = { | |||
173 | .wMaxPacketSize = cpu_to_le16(512), | 173 | .wMaxPacketSize = cpu_to_le16(512), |
174 | }; | 174 | }; |
175 | 175 | ||
176 | static struct usb_endpoint_descriptor hs_subset_out_desc __initdata = { | 176 | static struct usb_endpoint_descriptor hs_subset_out_desc = { |
177 | .bLength = USB_DT_ENDPOINT_SIZE, | 177 | .bLength = USB_DT_ENDPOINT_SIZE, |
178 | .bDescriptorType = USB_DT_ENDPOINT, | 178 | .bDescriptorType = USB_DT_ENDPOINT, |
179 | 179 | ||
@@ -181,7 +181,7 @@ static struct usb_endpoint_descriptor hs_subset_out_desc __initdata = { | |||
181 | .wMaxPacketSize = cpu_to_le16(512), | 181 | .wMaxPacketSize = cpu_to_le16(512), |
182 | }; | 182 | }; |
183 | 183 | ||
184 | static struct usb_descriptor_header *hs_eth_function[] __initdata = { | 184 | static struct usb_descriptor_header *hs_eth_function[] = { |
185 | (struct usb_descriptor_header *) &subset_data_intf, | 185 | (struct usb_descriptor_header *) &subset_data_intf, |
186 | (struct usb_descriptor_header *) &mdlm_header_desc, | 186 | (struct usb_descriptor_header *) &mdlm_header_desc, |
187 | (struct usb_descriptor_header *) &mdlm_desc, | 187 | (struct usb_descriptor_header *) &mdlm_desc, |
@@ -194,7 +194,7 @@ static struct usb_descriptor_header *hs_eth_function[] __initdata = { | |||
194 | 194 | ||
195 | /* super speed support: */ | 195 | /* super speed support: */ |
196 | 196 | ||
197 | static struct usb_endpoint_descriptor ss_subset_in_desc __initdata = { | 197 | static struct usb_endpoint_descriptor ss_subset_in_desc = { |
198 | .bLength = USB_DT_ENDPOINT_SIZE, | 198 | .bLength = USB_DT_ENDPOINT_SIZE, |
199 | .bDescriptorType = USB_DT_ENDPOINT, | 199 | .bDescriptorType = USB_DT_ENDPOINT, |
200 | 200 | ||
@@ -202,7 +202,7 @@ static struct usb_endpoint_descriptor ss_subset_in_desc __initdata = { | |||
202 | .wMaxPacketSize = cpu_to_le16(1024), | 202 | .wMaxPacketSize = cpu_to_le16(1024), |
203 | }; | 203 | }; |
204 | 204 | ||
205 | static struct usb_endpoint_descriptor ss_subset_out_desc __initdata = { | 205 | static struct usb_endpoint_descriptor ss_subset_out_desc = { |
206 | .bLength = USB_DT_ENDPOINT_SIZE, | 206 | .bLength = USB_DT_ENDPOINT_SIZE, |
207 | .bDescriptorType = USB_DT_ENDPOINT, | 207 | .bDescriptorType = USB_DT_ENDPOINT, |
208 | 208 | ||
@@ -210,7 +210,7 @@ static struct usb_endpoint_descriptor ss_subset_out_desc __initdata = { | |||
210 | .wMaxPacketSize = cpu_to_le16(1024), | 210 | .wMaxPacketSize = cpu_to_le16(1024), |
211 | }; | 211 | }; |
212 | 212 | ||
213 | static struct usb_ss_ep_comp_descriptor ss_subset_bulk_comp_desc __initdata = { | 213 | static struct usb_ss_ep_comp_descriptor ss_subset_bulk_comp_desc = { |
214 | .bLength = sizeof ss_subset_bulk_comp_desc, | 214 | .bLength = sizeof ss_subset_bulk_comp_desc, |
215 | .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, | 215 | .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, |
216 | 216 | ||
@@ -219,7 +219,7 @@ static struct usb_ss_ep_comp_descriptor ss_subset_bulk_comp_desc __initdata = { | |||
219 | /* .bmAttributes = 0, */ | 219 | /* .bmAttributes = 0, */ |
220 | }; | 220 | }; |
221 | 221 | ||
222 | static struct usb_descriptor_header *ss_eth_function[] __initdata = { | 222 | static struct usb_descriptor_header *ss_eth_function[] = { |
223 | (struct usb_descriptor_header *) &subset_data_intf, | 223 | (struct usb_descriptor_header *) &subset_data_intf, |
224 | (struct usb_descriptor_header *) &mdlm_header_desc, | 224 | (struct usb_descriptor_header *) &mdlm_header_desc, |
225 | (struct usb_descriptor_header *) &mdlm_desc, | 225 | (struct usb_descriptor_header *) &mdlm_desc, |
@@ -290,7 +290,7 @@ static void geth_disable(struct usb_function *f) | |||
290 | 290 | ||
291 | /* serial function driver setup/binding */ | 291 | /* serial function driver setup/binding */ |
292 | 292 | ||
293 | static int __init | 293 | static int |
294 | geth_bind(struct usb_configuration *c, struct usb_function *f) | 294 | geth_bind(struct usb_configuration *c, struct usb_function *f) |
295 | { | 295 | { |
296 | struct usb_composite_dev *cdev = c->cdev; | 296 | struct usb_composite_dev *cdev = c->cdev; |
@@ -404,7 +404,7 @@ geth_unbind(struct usb_configuration *c, struct usb_function *f) | |||
404 | * Caller must have called @gether_setup(). Caller is also responsible | 404 | * Caller must have called @gether_setup(). Caller is also responsible |
405 | * for calling @gether_cleanup() before module unload. | 405 | * for calling @gether_cleanup() before module unload. |
406 | */ | 406 | */ |
407 | int __init geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]) | 407 | int geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]) |
408 | { | 408 | { |
409 | struct f_gether *geth; | 409 | struct f_gether *geth; |
410 | int status; | 410 | int status; |
diff --git a/drivers/usb/gadget/f_audio.c b/drivers/usb/gadget/f_uac1.c index ec7ffcd0d0cd..1a5dcd5565e3 100644 --- a/drivers/usb/gadget/f_audio.c +++ b/drivers/usb/gadget/f_uac1.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <linux/device.h> | 14 | #include <linux/device.h> |
15 | #include <linux/atomic.h> | 15 | #include <linux/atomic.h> |
16 | 16 | ||
17 | #include "u_audio.h" | 17 | #include "u_uac1.h" |
18 | 18 | ||
19 | #define OUT_EP_MAX_PACKET_SIZE 200 | 19 | #define OUT_EP_MAX_PACKET_SIZE 200 |
20 | static int req_buf_size = OUT_EP_MAX_PACKET_SIZE; | 20 | static int req_buf_size = OUT_EP_MAX_PACKET_SIZE; |
@@ -216,29 +216,6 @@ static struct usb_descriptor_header *f_audio_desc[] __initdata = { | |||
216 | NULL, | 216 | NULL, |
217 | }; | 217 | }; |
218 | 218 | ||
219 | /* string IDs are assigned dynamically */ | ||
220 | |||
221 | #define STRING_MANUFACTURER_IDX 0 | ||
222 | #define STRING_PRODUCT_IDX 1 | ||
223 | |||
224 | static char manufacturer[50]; | ||
225 | |||
226 | static struct usb_string strings_dev[] = { | ||
227 | [STRING_MANUFACTURER_IDX].s = manufacturer, | ||
228 | [STRING_PRODUCT_IDX].s = DRIVER_DESC, | ||
229 | { } /* end of list */ | ||
230 | }; | ||
231 | |||
232 | static struct usb_gadget_strings stringtab_dev = { | ||
233 | .language = 0x0409, /* en-us */ | ||
234 | .strings = strings_dev, | ||
235 | }; | ||
236 | |||
237 | static struct usb_gadget_strings *audio_strings[] = { | ||
238 | &stringtab_dev, | ||
239 | NULL, | ||
240 | }; | ||
241 | |||
242 | /* | 219 | /* |
243 | * This function is an ALSA sound card following USB Audio Class Spec 1.0. | 220 | * This function is an ALSA sound card following USB Audio Class Spec 1.0. |
244 | */ | 221 | */ |
diff --git a/drivers/usb/gadget/f_uac2.c b/drivers/usb/gadget/f_uac2.c new file mode 100644 index 000000000000..e7cc4de93e33 --- /dev/null +++ b/drivers/usb/gadget/f_uac2.c | |||
@@ -0,0 +1,1449 @@ | |||
1 | /* | ||
2 | * f_uac2.c -- USB Audio Class 2.0 Function | ||
3 | * | ||
4 | * Copyright (C) 2011 | ||
5 | * Yadwinder Singh (yadi.brar01@gmail.com) | ||
6 | * Jaswinder Singh (jaswinder.singh@linaro.org) | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | */ | ||
13 | |||
14 | #include <linux/usb/audio.h> | ||
15 | #include <linux/usb/audio-v2.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/module.h> | ||
18 | |||
19 | #include <sound/core.h> | ||
20 | #include <sound/pcm.h> | ||
21 | #include <sound/pcm_params.h> | ||
22 | |||
23 | /* Playback(USB-IN) Default Stereo - Fl/Fr */ | ||
24 | static int p_chmask = 0x3; | ||
25 | module_param(p_chmask, uint, S_IRUGO); | ||
26 | MODULE_PARM_DESC(p_chmask, "Playback Channel Mask"); | ||
27 | |||
28 | /* Playback Default 48 KHz */ | ||
29 | static int p_srate = 48000; | ||
30 | module_param(p_srate, uint, S_IRUGO); | ||
31 | MODULE_PARM_DESC(p_srate, "Playback Sampling Rate"); | ||
32 | |||
33 | /* Playback Default 16bits/sample */ | ||
34 | static int p_ssize = 2; | ||
35 | module_param(p_ssize, uint, S_IRUGO); | ||
36 | MODULE_PARM_DESC(p_ssize, "Playback Sample Size(bytes)"); | ||
37 | |||
38 | /* Capture(USB-OUT) Default Stereo - Fl/Fr */ | ||
39 | static int c_chmask = 0x3; | ||
40 | module_param(c_chmask, uint, S_IRUGO); | ||
41 | MODULE_PARM_DESC(c_chmask, "Capture Channel Mask"); | ||
42 | |||
43 | /* Capture Default 64 KHz */ | ||
44 | static int c_srate = 64000; | ||
45 | module_param(c_srate, uint, S_IRUGO); | ||
46 | MODULE_PARM_DESC(c_srate, "Capture Sampling Rate"); | ||
47 | |||
48 | /* Capture Default 16bits/sample */ | ||
49 | static int c_ssize = 2; | ||
50 | module_param(c_ssize, uint, S_IRUGO); | ||
51 | MODULE_PARM_DESC(c_ssize, "Capture Sample Size(bytes)"); | ||
52 | |||
53 | #define DMA_ADDR_INVALID (~(dma_addr_t)0) | ||
54 | |||
55 | #define ALT_SET(x, a) do {(x) &= ~0xff; (x) |= (a); } while (0) | ||
56 | #define ALT_GET(x) ((x) & 0xff) | ||
57 | #define INTF_SET(x, i) do {(x) &= 0xff; (x) |= ((i) << 8); } while (0) | ||
58 | #define INTF_GET(x) ((x >> 8) & 0xff) | ||
59 | |||
60 | /* Keep everyone on toes */ | ||
61 | #define USB_XFERS 2 | ||
62 | |||
63 | /* | ||
64 | * The driver implements a simple UAC_2 topology. | ||
65 | * USB-OUT -> IT_1 -> OT_3 -> ALSA_Capture | ||
66 | * ALSA_Playback -> IT_2 -> OT_4 -> USB-IN | ||
67 | * Capture and Playback sampling rates are independently | ||
68 | * controlled by two clock sources : | ||
69 | * CLK_5 := c_srate, and CLK_6 := p_srate | ||
70 | */ | ||
71 | #define USB_OUT_IT_ID 1 | ||
72 | #define IO_IN_IT_ID 2 | ||
73 | #define IO_OUT_OT_ID 3 | ||
74 | #define USB_IN_OT_ID 4 | ||
75 | #define USB_OUT_CLK_ID 5 | ||
76 | #define USB_IN_CLK_ID 6 | ||
77 | |||
78 | #define CONTROL_ABSENT 0 | ||
79 | #define CONTROL_RDONLY 1 | ||
80 | #define CONTROL_RDWR 3 | ||
81 | |||
82 | #define CLK_FREQ_CTRL 0 | ||
83 | #define CLK_VLD_CTRL 2 | ||
84 | |||
85 | #define COPY_CTRL 0 | ||
86 | #define CONN_CTRL 2 | ||
87 | #define OVRLD_CTRL 4 | ||
88 | #define CLSTR_CTRL 6 | ||
89 | #define UNFLW_CTRL 8 | ||
90 | #define OVFLW_CTRL 10 | ||
91 | |||
92 | const char *uac2_name = "snd_uac2"; | ||
93 | |||
94 | struct uac2_req { | ||
95 | struct uac2_rtd_params *pp; /* parent param */ | ||
96 | struct usb_request *req; | ||
97 | }; | ||
98 | |||
99 | struct uac2_rtd_params { | ||
100 | bool ep_enabled; /* if the ep is enabled */ | ||
101 | /* Size of the ring buffer */ | ||
102 | size_t dma_bytes; | ||
103 | unsigned char *dma_area; | ||
104 | |||
105 | struct snd_pcm_substream *ss; | ||
106 | |||
107 | /* Ring buffer */ | ||
108 | ssize_t hw_ptr; | ||
109 | |||
110 | void *rbuf; | ||
111 | |||
112 | size_t period_size; | ||
113 | |||
114 | unsigned max_psize; | ||
115 | struct uac2_req ureq[USB_XFERS]; | ||
116 | |||
117 | spinlock_t lock; | ||
118 | }; | ||
119 | |||
120 | struct snd_uac2_chip { | ||
121 | struct platform_device pdev; | ||
122 | struct platform_driver pdrv; | ||
123 | |||
124 | struct uac2_rtd_params p_prm; | ||
125 | struct uac2_rtd_params c_prm; | ||
126 | |||
127 | struct snd_card *card; | ||
128 | struct snd_pcm *pcm; | ||
129 | }; | ||
130 | |||
131 | #define BUFF_SIZE_MAX (PAGE_SIZE * 16) | ||
132 | #define PRD_SIZE_MAX PAGE_SIZE | ||
133 | #define MIN_PERIODS 4 | ||
134 | |||
135 | static struct snd_pcm_hardware uac2_pcm_hardware = { | ||
136 | .info = SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER | ||
137 | | SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID | ||
138 | | SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME, | ||
139 | .rates = SNDRV_PCM_RATE_CONTINUOUS, | ||
140 | .periods_max = BUFF_SIZE_MAX / PRD_SIZE_MAX, | ||
141 | .buffer_bytes_max = BUFF_SIZE_MAX, | ||
142 | .period_bytes_max = PRD_SIZE_MAX, | ||
143 | .periods_min = MIN_PERIODS, | ||
144 | }; | ||
145 | |||
146 | struct audio_dev { | ||
147 | /* Currently active {Interface[15:8] | AltSettings[7:0]} */ | ||
148 | __u16 ac_alt, as_out_alt, as_in_alt; | ||
149 | |||
150 | struct usb_ep *in_ep, *out_ep; | ||
151 | struct usb_function func; | ||
152 | |||
153 | /* The ALSA Sound Card it represents on the USB-Client side */ | ||
154 | struct snd_uac2_chip uac2; | ||
155 | }; | ||
156 | |||
157 | static struct audio_dev *agdev_g; | ||
158 | |||
159 | static inline | ||
160 | struct audio_dev *func_to_agdev(struct usb_function *f) | ||
161 | { | ||
162 | return container_of(f, struct audio_dev, func); | ||
163 | } | ||
164 | |||
165 | static inline | ||
166 | struct audio_dev *uac2_to_agdev(struct snd_uac2_chip *u) | ||
167 | { | ||
168 | return container_of(u, struct audio_dev, uac2); | ||
169 | } | ||
170 | |||
171 | static inline | ||
172 | struct snd_uac2_chip *pdev_to_uac2(struct platform_device *p) | ||
173 | { | ||
174 | return container_of(p, struct snd_uac2_chip, pdev); | ||
175 | } | ||
176 | |||
177 | static inline | ||
178 | struct snd_uac2_chip *prm_to_uac2(struct uac2_rtd_params *r) | ||
179 | { | ||
180 | struct snd_uac2_chip *uac2 = container_of(r, | ||
181 | struct snd_uac2_chip, c_prm); | ||
182 | |||
183 | if (&uac2->c_prm != r) | ||
184 | uac2 = container_of(r, struct snd_uac2_chip, p_prm); | ||
185 | |||
186 | return uac2; | ||
187 | } | ||
188 | |||
189 | static inline | ||
190 | uint num_channels(uint chanmask) | ||
191 | { | ||
192 | uint num = 0; | ||
193 | |||
194 | while (chanmask) { | ||
195 | num += (chanmask & 1); | ||
196 | chanmask >>= 1; | ||
197 | } | ||
198 | |||
199 | return num; | ||
200 | } | ||
201 | |||
202 | static void | ||
203 | agdev_iso_complete(struct usb_ep *ep, struct usb_request *req) | ||
204 | { | ||
205 | unsigned pending; | ||
206 | unsigned long flags; | ||
207 | bool update_alsa = false; | ||
208 | unsigned char *src, *dst; | ||
209 | int status = req->status; | ||
210 | struct uac2_req *ur = req->context; | ||
211 | struct snd_pcm_substream *substream; | ||
212 | struct uac2_rtd_params *prm = ur->pp; | ||
213 | struct snd_uac2_chip *uac2 = prm_to_uac2(prm); | ||
214 | |||
215 | /* i/f shutting down */ | ||
216 | if (!prm->ep_enabled) | ||
217 | return; | ||
218 | |||
219 | /* | ||
220 | * We can't really do much about bad xfers. | ||
221 | * Afterall, the ISOCH xfers could fail legitimately. | ||
222 | */ | ||
223 | if (status) | ||
224 | pr_debug("%s: iso_complete status(%d) %d/%d\n", | ||
225 | __func__, status, req->actual, req->length); | ||
226 | |||
227 | substream = prm->ss; | ||
228 | |||
229 | /* Do nothing if ALSA isn't active */ | ||
230 | if (!substream) | ||
231 | goto exit; | ||
232 | |||
233 | spin_lock_irqsave(&prm->lock, flags); | ||
234 | |||
235 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { | ||
236 | src = prm->dma_area + prm->hw_ptr; | ||
237 | req->actual = req->length; | ||
238 | dst = req->buf; | ||
239 | } else { | ||
240 | dst = prm->dma_area + prm->hw_ptr; | ||
241 | src = req->buf; | ||
242 | } | ||
243 | |||
244 | pending = prm->hw_ptr % prm->period_size; | ||
245 | pending += req->actual; | ||
246 | if (pending >= prm->period_size) | ||
247 | update_alsa = true; | ||
248 | |||
249 | prm->hw_ptr = (prm->hw_ptr + req->actual) % prm->dma_bytes; | ||
250 | |||
251 | spin_unlock_irqrestore(&prm->lock, flags); | ||
252 | |||
253 | /* Pack USB load in ALSA ring buffer */ | ||
254 | memcpy(dst, src, req->actual); | ||
255 | exit: | ||
256 | if (usb_ep_queue(ep, req, GFP_ATOMIC)) | ||
257 | dev_err(&uac2->pdev.dev, "%d Error!\n", __LINE__); | ||
258 | |||
259 | if (update_alsa) | ||
260 | snd_pcm_period_elapsed(substream); | ||
261 | |||
262 | return; | ||
263 | } | ||
264 | |||
265 | static int | ||
266 | uac2_pcm_trigger(struct snd_pcm_substream *substream, int cmd) | ||
267 | { | ||
268 | struct snd_uac2_chip *uac2 = snd_pcm_substream_chip(substream); | ||
269 | struct audio_dev *agdev = uac2_to_agdev(uac2); | ||
270 | struct uac2_rtd_params *prm; | ||
271 | unsigned long flags; | ||
272 | struct usb_ep *ep; | ||
273 | int err = 0; | ||
274 | |||
275 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { | ||
276 | ep = agdev->in_ep; | ||
277 | prm = &uac2->p_prm; | ||
278 | } else { | ||
279 | ep = agdev->out_ep; | ||
280 | prm = &uac2->c_prm; | ||
281 | } | ||
282 | |||
283 | spin_lock_irqsave(&prm->lock, flags); | ||
284 | |||
285 | /* Reset */ | ||
286 | prm->hw_ptr = 0; | ||
287 | |||
288 | switch (cmd) { | ||
289 | case SNDRV_PCM_TRIGGER_START: | ||
290 | case SNDRV_PCM_TRIGGER_RESUME: | ||
291 | prm->ss = substream; | ||
292 | break; | ||
293 | case SNDRV_PCM_TRIGGER_STOP: | ||
294 | case SNDRV_PCM_TRIGGER_SUSPEND: | ||
295 | prm->ss = NULL; | ||
296 | break; | ||
297 | default: | ||
298 | err = -EINVAL; | ||
299 | } | ||
300 | |||
301 | spin_unlock_irqrestore(&prm->lock, flags); | ||
302 | |||
303 | /* Clear buffer after Play stops */ | ||
304 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && !prm->ss) | ||
305 | memset(prm->rbuf, 0, prm->max_psize * USB_XFERS); | ||
306 | |||
307 | return err; | ||
308 | } | ||
309 | |||
310 | static snd_pcm_uframes_t uac2_pcm_pointer(struct snd_pcm_substream *substream) | ||
311 | { | ||
312 | struct snd_uac2_chip *uac2 = snd_pcm_substream_chip(substream); | ||
313 | struct uac2_rtd_params *prm; | ||
314 | |||
315 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | ||
316 | prm = &uac2->p_prm; | ||
317 | else | ||
318 | prm = &uac2->c_prm; | ||
319 | |||
320 | return bytes_to_frames(substream->runtime, prm->hw_ptr); | ||
321 | } | ||
322 | |||
323 | static int uac2_pcm_hw_params(struct snd_pcm_substream *substream, | ||
324 | struct snd_pcm_hw_params *hw_params) | ||
325 | { | ||
326 | struct snd_uac2_chip *uac2 = snd_pcm_substream_chip(substream); | ||
327 | struct uac2_rtd_params *prm; | ||
328 | int err; | ||
329 | |||
330 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | ||
331 | prm = &uac2->p_prm; | ||
332 | else | ||
333 | prm = &uac2->c_prm; | ||
334 | |||
335 | err = snd_pcm_lib_malloc_pages(substream, | ||
336 | params_buffer_bytes(hw_params)); | ||
337 | if (err >= 0) { | ||
338 | prm->dma_bytes = substream->runtime->dma_bytes; | ||
339 | prm->dma_area = substream->runtime->dma_area; | ||
340 | prm->period_size = params_period_bytes(hw_params); | ||
341 | } | ||
342 | |||
343 | return err; | ||
344 | } | ||
345 | |||
346 | static int uac2_pcm_hw_free(struct snd_pcm_substream *substream) | ||
347 | { | ||
348 | struct snd_uac2_chip *uac2 = snd_pcm_substream_chip(substream); | ||
349 | struct uac2_rtd_params *prm; | ||
350 | |||
351 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | ||
352 | prm = &uac2->p_prm; | ||
353 | else | ||
354 | prm = &uac2->c_prm; | ||
355 | |||
356 | prm->dma_area = NULL; | ||
357 | prm->dma_bytes = 0; | ||
358 | prm->period_size = 0; | ||
359 | |||
360 | return snd_pcm_lib_free_pages(substream); | ||
361 | } | ||
362 | |||
363 | static int uac2_pcm_open(struct snd_pcm_substream *substream) | ||
364 | { | ||
365 | struct snd_uac2_chip *uac2 = snd_pcm_substream_chip(substream); | ||
366 | struct snd_pcm_runtime *runtime = substream->runtime; | ||
367 | |||
368 | runtime->hw = uac2_pcm_hardware; | ||
369 | |||
370 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { | ||
371 | spin_lock_init(&uac2->p_prm.lock); | ||
372 | runtime->hw.rate_min = p_srate; | ||
373 | runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE; /* ! p_ssize ! */ | ||
374 | runtime->hw.channels_min = num_channels(p_chmask); | ||
375 | runtime->hw.period_bytes_min = 2 * uac2->p_prm.max_psize | ||
376 | / runtime->hw.periods_min; | ||
377 | } else { | ||
378 | spin_lock_init(&uac2->c_prm.lock); | ||
379 | runtime->hw.rate_min = c_srate; | ||
380 | runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE; /* ! c_ssize ! */ | ||
381 | runtime->hw.channels_min = num_channels(c_chmask); | ||
382 | runtime->hw.period_bytes_min = 2 * uac2->c_prm.max_psize | ||
383 | / runtime->hw.periods_min; | ||
384 | } | ||
385 | |||
386 | runtime->hw.rate_max = runtime->hw.rate_min; | ||
387 | runtime->hw.channels_max = runtime->hw.channels_min; | ||
388 | |||
389 | snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); | ||
390 | |||
391 | return 0; | ||
392 | } | ||
393 | |||
394 | /* ALSA cries without these function pointers */ | ||
395 | static int uac2_pcm_null(struct snd_pcm_substream *substream) | ||
396 | { | ||
397 | return 0; | ||
398 | } | ||
399 | |||
400 | static struct snd_pcm_ops uac2_pcm_ops = { | ||
401 | .open = uac2_pcm_open, | ||
402 | .close = uac2_pcm_null, | ||
403 | .ioctl = snd_pcm_lib_ioctl, | ||
404 | .hw_params = uac2_pcm_hw_params, | ||
405 | .hw_free = uac2_pcm_hw_free, | ||
406 | .trigger = uac2_pcm_trigger, | ||
407 | .pointer = uac2_pcm_pointer, | ||
408 | .prepare = uac2_pcm_null, | ||
409 | }; | ||
410 | |||
411 | static int __devinit snd_uac2_probe(struct platform_device *pdev) | ||
412 | { | ||
413 | struct snd_uac2_chip *uac2 = pdev_to_uac2(pdev); | ||
414 | struct snd_card *card; | ||
415 | struct snd_pcm *pcm; | ||
416 | int err; | ||
417 | |||
418 | /* Choose any slot, with no id */ | ||
419 | err = snd_card_create(-1, NULL, THIS_MODULE, 0, &card); | ||
420 | if (err < 0) | ||
421 | return err; | ||
422 | |||
423 | uac2->card = card; | ||
424 | |||
425 | /* | ||
426 | * Create first PCM device | ||
427 | * Create a substream only for non-zero channel streams | ||
428 | */ | ||
429 | err = snd_pcm_new(uac2->card, "UAC2 PCM", 0, | ||
430 | p_chmask ? 1 : 0, c_chmask ? 1 : 0, &pcm); | ||
431 | if (err < 0) | ||
432 | goto snd_fail; | ||
433 | |||
434 | strcpy(pcm->name, "UAC2 PCM"); | ||
435 | pcm->private_data = uac2; | ||
436 | |||
437 | uac2->pcm = pcm; | ||
438 | |||
439 | snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &uac2_pcm_ops); | ||
440 | snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &uac2_pcm_ops); | ||
441 | |||
442 | strcpy(card->driver, "UAC2_Gadget"); | ||
443 | strcpy(card->shortname, "UAC2_Gadget"); | ||
444 | sprintf(card->longname, "UAC2_Gadget %i", pdev->id); | ||
445 | |||
446 | snd_card_set_dev(card, &pdev->dev); | ||
447 | |||
448 | snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS, | ||
449 | snd_dma_continuous_data(GFP_KERNEL), 0, BUFF_SIZE_MAX); | ||
450 | |||
451 | err = snd_card_register(card); | ||
452 | if (!err) { | ||
453 | platform_set_drvdata(pdev, card); | ||
454 | return 0; | ||
455 | } | ||
456 | |||
457 | snd_fail: | ||
458 | snd_card_free(card); | ||
459 | |||
460 | uac2->pcm = NULL; | ||
461 | uac2->card = NULL; | ||
462 | |||
463 | return err; | ||
464 | } | ||
465 | |||
466 | static int __devexit snd_uac2_remove(struct platform_device *pdev) | ||
467 | { | ||
468 | struct snd_card *card = platform_get_drvdata(pdev); | ||
469 | |||
470 | platform_set_drvdata(pdev, NULL); | ||
471 | |||
472 | if (card) | ||
473 | return snd_card_free(card); | ||
474 | |||
475 | return 0; | ||
476 | } | ||
477 | |||
478 | static int alsa_uac2_init(struct audio_dev *agdev) | ||
479 | { | ||
480 | struct snd_uac2_chip *uac2 = &agdev->uac2; | ||
481 | int err; | ||
482 | |||
483 | uac2->pdrv.probe = snd_uac2_probe; | ||
484 | uac2->pdrv.remove = snd_uac2_remove; | ||
485 | uac2->pdrv.driver.name = uac2_name; | ||
486 | |||
487 | uac2->pdev.id = 0; | ||
488 | uac2->pdev.name = uac2_name; | ||
489 | |||
490 | /* Register snd_uac2 driver */ | ||
491 | err = platform_driver_register(&uac2->pdrv); | ||
492 | if (err) | ||
493 | return err; | ||
494 | |||
495 | /* Register snd_uac2 device */ | ||
496 | err = platform_device_register(&uac2->pdev); | ||
497 | if (err) | ||
498 | platform_driver_unregister(&uac2->pdrv); | ||
499 | |||
500 | return err; | ||
501 | } | ||
502 | |||
503 | static void alsa_uac2_exit(struct audio_dev *agdev) | ||
504 | { | ||
505 | struct snd_uac2_chip *uac2 = &agdev->uac2; | ||
506 | |||
507 | platform_driver_unregister(&uac2->pdrv); | ||
508 | platform_device_unregister(&uac2->pdev); | ||
509 | } | ||
510 | |||
511 | |||
512 | /* --------- USB Function Interface ------------- */ | ||
513 | |||
514 | enum { | ||
515 | STR_ASSOC, | ||
516 | STR_IF_CTRL, | ||
517 | STR_CLKSRC_IN, | ||
518 | STR_CLKSRC_OUT, | ||
519 | STR_USB_IT, | ||
520 | STR_IO_IT, | ||
521 | STR_USB_OT, | ||
522 | STR_IO_OT, | ||
523 | STR_AS_OUT_ALT0, | ||
524 | STR_AS_OUT_ALT1, | ||
525 | STR_AS_IN_ALT0, | ||
526 | STR_AS_IN_ALT1, | ||
527 | }; | ||
528 | |||
529 | static const char ifassoc[] = "Source/Sink"; | ||
530 | static const char ifctrl[] = "Topology Control"; | ||
531 | static char clksrc_in[8]; | ||
532 | static char clksrc_out[8]; | ||
533 | static const char usb_it[] = "USBH Out"; | ||
534 | static const char io_it[] = "USBD Out"; | ||
535 | static const char usb_ot[] = "USBH In"; | ||
536 | static const char io_ot[] = "USBD In"; | ||
537 | static const char out_alt0[] = "Playback Inactive"; | ||
538 | static const char out_alt1[] = "Playback Active"; | ||
539 | static const char in_alt0[] = "Capture Inactive"; | ||
540 | static const char in_alt1[] = "Capture Active"; | ||
541 | |||
542 | static struct usb_string strings_fn[] = { | ||
543 | [STR_ASSOC].s = ifassoc, | ||
544 | [STR_IF_CTRL].s = ifctrl, | ||
545 | [STR_CLKSRC_IN].s = clksrc_in, | ||
546 | [STR_CLKSRC_OUT].s = clksrc_out, | ||
547 | [STR_USB_IT].s = usb_it, | ||
548 | [STR_IO_IT].s = io_it, | ||
549 | [STR_USB_OT].s = usb_ot, | ||
550 | [STR_IO_OT].s = io_ot, | ||
551 | [STR_AS_OUT_ALT0].s = out_alt0, | ||
552 | [STR_AS_OUT_ALT1].s = out_alt1, | ||
553 | [STR_AS_IN_ALT0].s = in_alt0, | ||
554 | [STR_AS_IN_ALT1].s = in_alt1, | ||
555 | { }, | ||
556 | }; | ||
557 | |||
558 | static struct usb_gadget_strings str_fn = { | ||
559 | .language = 0x0409, /* en-us */ | ||
560 | .strings = strings_fn, | ||
561 | }; | ||
562 | |||
563 | static struct usb_gadget_strings *fn_strings[] = { | ||
564 | &str_fn, | ||
565 | NULL, | ||
566 | }; | ||
567 | |||
568 | static struct usb_qualifier_descriptor devqual_desc = { | ||
569 | .bLength = sizeof devqual_desc, | ||
570 | .bDescriptorType = USB_DT_DEVICE_QUALIFIER, | ||
571 | |||
572 | .bcdUSB = cpu_to_le16(0x200), | ||
573 | .bDeviceClass = USB_CLASS_MISC, | ||
574 | .bDeviceSubClass = 0x02, | ||
575 | .bDeviceProtocol = 0x01, | ||
576 | .bNumConfigurations = 1, | ||
577 | .bRESERVED = 0, | ||
578 | }; | ||
579 | |||
580 | static struct usb_interface_assoc_descriptor iad_desc = { | ||
581 | .bLength = sizeof iad_desc, | ||
582 | .bDescriptorType = USB_DT_INTERFACE_ASSOCIATION, | ||
583 | |||
584 | .bFirstInterface = 0, | ||
585 | .bInterfaceCount = 3, | ||
586 | .bFunctionClass = USB_CLASS_AUDIO, | ||
587 | .bFunctionSubClass = UAC2_FUNCTION_SUBCLASS_UNDEFINED, | ||
588 | .bFunctionProtocol = UAC_VERSION_2, | ||
589 | }; | ||
590 | |||
591 | /* Audio Control Interface */ | ||
592 | static struct usb_interface_descriptor std_ac_if_desc = { | ||
593 | .bLength = sizeof std_ac_if_desc, | ||
594 | .bDescriptorType = USB_DT_INTERFACE, | ||
595 | |||
596 | .bAlternateSetting = 0, | ||
597 | .bNumEndpoints = 0, | ||
598 | .bInterfaceClass = USB_CLASS_AUDIO, | ||
599 | .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, | ||
600 | .bInterfaceProtocol = UAC_VERSION_2, | ||
601 | }; | ||
602 | |||
603 | /* Clock source for IN traffic */ | ||
604 | struct uac_clock_source_descriptor in_clk_src_desc = { | ||
605 | .bLength = sizeof in_clk_src_desc, | ||
606 | .bDescriptorType = USB_DT_CS_INTERFACE, | ||
607 | |||
608 | .bDescriptorSubtype = UAC2_CLOCK_SOURCE, | ||
609 | .bClockID = USB_IN_CLK_ID, | ||
610 | .bmAttributes = UAC_CLOCK_SOURCE_TYPE_INT_FIXED, | ||
611 | .bmControls = (CONTROL_RDONLY << CLK_FREQ_CTRL), | ||
612 | .bAssocTerminal = 0, | ||
613 | }; | ||
614 | |||
615 | /* Clock source for OUT traffic */ | ||
616 | struct uac_clock_source_descriptor out_clk_src_desc = { | ||
617 | .bLength = sizeof out_clk_src_desc, | ||
618 | .bDescriptorType = USB_DT_CS_INTERFACE, | ||
619 | |||
620 | .bDescriptorSubtype = UAC2_CLOCK_SOURCE, | ||
621 | .bClockID = USB_OUT_CLK_ID, | ||
622 | .bmAttributes = UAC_CLOCK_SOURCE_TYPE_INT_FIXED, | ||
623 | .bmControls = (CONTROL_RDONLY << CLK_FREQ_CTRL), | ||
624 | .bAssocTerminal = 0, | ||
625 | }; | ||
626 | |||
627 | /* Input Terminal for USB_OUT */ | ||
628 | struct uac2_input_terminal_descriptor usb_out_it_desc = { | ||
629 | .bLength = sizeof usb_out_it_desc, | ||
630 | .bDescriptorType = USB_DT_CS_INTERFACE, | ||
631 | |||
632 | .bDescriptorSubtype = UAC_INPUT_TERMINAL, | ||
633 | .bTerminalID = USB_OUT_IT_ID, | ||
634 | .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING), | ||
635 | .bAssocTerminal = 0, | ||
636 | .bCSourceID = USB_OUT_CLK_ID, | ||
637 | .iChannelNames = 0, | ||
638 | .bmControls = (CONTROL_RDWR << COPY_CTRL), | ||
639 | }; | ||
640 | |||
641 | /* Input Terminal for I/O-In */ | ||
642 | struct uac2_input_terminal_descriptor io_in_it_desc = { | ||
643 | .bLength = sizeof io_in_it_desc, | ||
644 | .bDescriptorType = USB_DT_CS_INTERFACE, | ||
645 | |||
646 | .bDescriptorSubtype = UAC_INPUT_TERMINAL, | ||
647 | .bTerminalID = IO_IN_IT_ID, | ||
648 | .wTerminalType = cpu_to_le16(UAC_INPUT_TERMINAL_UNDEFINED), | ||
649 | .bAssocTerminal = 0, | ||
650 | .bCSourceID = USB_IN_CLK_ID, | ||
651 | .iChannelNames = 0, | ||
652 | .bmControls = (CONTROL_RDWR << COPY_CTRL), | ||
653 | }; | ||
654 | |||
655 | /* Ouput Terminal for USB_IN */ | ||
656 | struct uac2_output_terminal_descriptor usb_in_ot_desc = { | ||
657 | .bLength = sizeof usb_in_ot_desc, | ||
658 | .bDescriptorType = USB_DT_CS_INTERFACE, | ||
659 | |||
660 | .bDescriptorSubtype = UAC_OUTPUT_TERMINAL, | ||
661 | .bTerminalID = USB_IN_OT_ID, | ||
662 | .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING), | ||
663 | .bAssocTerminal = 0, | ||
664 | .bSourceID = IO_IN_IT_ID, | ||
665 | .bCSourceID = USB_IN_CLK_ID, | ||
666 | .bmControls = (CONTROL_RDWR << COPY_CTRL), | ||
667 | }; | ||
668 | |||
669 | /* Ouput Terminal for I/O-Out */ | ||
670 | struct uac2_output_terminal_descriptor io_out_ot_desc = { | ||
671 | .bLength = sizeof io_out_ot_desc, | ||
672 | .bDescriptorType = USB_DT_CS_INTERFACE, | ||
673 | |||
674 | .bDescriptorSubtype = UAC_OUTPUT_TERMINAL, | ||
675 | .bTerminalID = IO_OUT_OT_ID, | ||
676 | .wTerminalType = cpu_to_le16(UAC_OUTPUT_TERMINAL_UNDEFINED), | ||
677 | .bAssocTerminal = 0, | ||
678 | .bSourceID = USB_OUT_IT_ID, | ||
679 | .bCSourceID = USB_OUT_CLK_ID, | ||
680 | .bmControls = (CONTROL_RDWR << COPY_CTRL), | ||
681 | }; | ||
682 | |||
683 | struct uac2_ac_header_descriptor ac_hdr_desc = { | ||
684 | .bLength = sizeof ac_hdr_desc, | ||
685 | .bDescriptorType = USB_DT_CS_INTERFACE, | ||
686 | |||
687 | .bDescriptorSubtype = UAC_MS_HEADER, | ||
688 | .bcdADC = cpu_to_le16(0x200), | ||
689 | .bCategory = UAC2_FUNCTION_IO_BOX, | ||
690 | .wTotalLength = sizeof in_clk_src_desc + sizeof out_clk_src_desc | ||
691 | + sizeof usb_out_it_desc + sizeof io_in_it_desc | ||
692 | + sizeof usb_in_ot_desc + sizeof io_out_ot_desc, | ||
693 | .bmControls = 0, | ||
694 | }; | ||
695 | |||
696 | /* Audio Streaming OUT Interface - Alt0 */ | ||
697 | static struct usb_interface_descriptor std_as_out_if0_desc = { | ||
698 | .bLength = sizeof std_as_out_if0_desc, | ||
699 | .bDescriptorType = USB_DT_INTERFACE, | ||
700 | |||
701 | .bAlternateSetting = 0, | ||
702 | .bNumEndpoints = 0, | ||
703 | .bInterfaceClass = USB_CLASS_AUDIO, | ||
704 | .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING, | ||
705 | .bInterfaceProtocol = UAC_VERSION_2, | ||
706 | }; | ||
707 | |||
708 | /* Audio Streaming OUT Interface - Alt1 */ | ||
709 | static struct usb_interface_descriptor std_as_out_if1_desc = { | ||
710 | .bLength = sizeof std_as_out_if1_desc, | ||
711 | .bDescriptorType = USB_DT_INTERFACE, | ||
712 | |||
713 | .bAlternateSetting = 1, | ||
714 | .bNumEndpoints = 1, | ||
715 | .bInterfaceClass = USB_CLASS_AUDIO, | ||
716 | .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING, | ||
717 | .bInterfaceProtocol = UAC_VERSION_2, | ||
718 | }; | ||
719 | |||
720 | /* Audio Stream OUT Intface Desc */ | ||
721 | struct uac2_as_header_descriptor as_out_hdr_desc = { | ||
722 | .bLength = sizeof as_out_hdr_desc, | ||
723 | .bDescriptorType = USB_DT_CS_INTERFACE, | ||
724 | |||
725 | .bDescriptorSubtype = UAC_AS_GENERAL, | ||
726 | .bTerminalLink = USB_OUT_IT_ID, | ||
727 | .bmControls = 0, | ||
728 | .bFormatType = UAC_FORMAT_TYPE_I, | ||
729 | .bmFormats = cpu_to_le32(UAC_FORMAT_TYPE_I_PCM), | ||
730 | .iChannelNames = 0, | ||
731 | }; | ||
732 | |||
733 | /* Audio USB_OUT Format */ | ||
734 | struct uac2_format_type_i_descriptor as_out_fmt1_desc = { | ||
735 | .bLength = sizeof as_out_fmt1_desc, | ||
736 | .bDescriptorType = USB_DT_CS_INTERFACE, | ||
737 | .bDescriptorSubtype = UAC_FORMAT_TYPE, | ||
738 | .bFormatType = UAC_FORMAT_TYPE_I, | ||
739 | }; | ||
740 | |||
741 | /* STD AS ISO OUT Endpoint */ | ||
742 | struct usb_endpoint_descriptor fs_epout_desc = { | ||
743 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
744 | .bDescriptorType = USB_DT_ENDPOINT, | ||
745 | |||
746 | .bEndpointAddress = USB_DIR_OUT, | ||
747 | .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, | ||
748 | .bInterval = 1, | ||
749 | }; | ||
750 | |||
751 | struct usb_endpoint_descriptor hs_epout_desc = { | ||
752 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
753 | .bDescriptorType = USB_DT_ENDPOINT, | ||
754 | |||
755 | .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, | ||
756 | .bInterval = 4, | ||
757 | }; | ||
758 | |||
759 | /* CS AS ISO OUT Endpoint */ | ||
760 | static struct uac2_iso_endpoint_descriptor as_iso_out_desc = { | ||
761 | .bLength = sizeof as_iso_out_desc, | ||
762 | .bDescriptorType = USB_DT_CS_ENDPOINT, | ||
763 | |||
764 | .bDescriptorSubtype = UAC_EP_GENERAL, | ||
765 | .bmAttributes = 0, | ||
766 | .bmControls = 0, | ||
767 | .bLockDelayUnits = 0, | ||
768 | .wLockDelay = 0, | ||
769 | }; | ||
770 | |||
771 | /* Audio Streaming IN Interface - Alt0 */ | ||
772 | static struct usb_interface_descriptor std_as_in_if0_desc = { | ||
773 | .bLength = sizeof std_as_in_if0_desc, | ||
774 | .bDescriptorType = USB_DT_INTERFACE, | ||
775 | |||
776 | .bAlternateSetting = 0, | ||
777 | .bNumEndpoints = 0, | ||
778 | .bInterfaceClass = USB_CLASS_AUDIO, | ||
779 | .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING, | ||
780 | .bInterfaceProtocol = UAC_VERSION_2, | ||
781 | }; | ||
782 | |||
783 | /* Audio Streaming IN Interface - Alt1 */ | ||
784 | static struct usb_interface_descriptor std_as_in_if1_desc = { | ||
785 | .bLength = sizeof std_as_in_if1_desc, | ||
786 | .bDescriptorType = USB_DT_INTERFACE, | ||
787 | |||
788 | .bAlternateSetting = 1, | ||
789 | .bNumEndpoints = 1, | ||
790 | .bInterfaceClass = USB_CLASS_AUDIO, | ||
791 | .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING, | ||
792 | .bInterfaceProtocol = UAC_VERSION_2, | ||
793 | }; | ||
794 | |||
795 | /* Audio Stream IN Intface Desc */ | ||
796 | struct uac2_as_header_descriptor as_in_hdr_desc = { | ||
797 | .bLength = sizeof as_in_hdr_desc, | ||
798 | .bDescriptorType = USB_DT_CS_INTERFACE, | ||
799 | |||
800 | .bDescriptorSubtype = UAC_AS_GENERAL, | ||
801 | .bTerminalLink = USB_IN_OT_ID, | ||
802 | .bmControls = 0, | ||
803 | .bFormatType = UAC_FORMAT_TYPE_I, | ||
804 | .bmFormats = cpu_to_le32(UAC_FORMAT_TYPE_I_PCM), | ||
805 | .iChannelNames = 0, | ||
806 | }; | ||
807 | |||
808 | /* Audio USB_IN Format */ | ||
809 | struct uac2_format_type_i_descriptor as_in_fmt1_desc = { | ||
810 | .bLength = sizeof as_in_fmt1_desc, | ||
811 | .bDescriptorType = USB_DT_CS_INTERFACE, | ||
812 | .bDescriptorSubtype = UAC_FORMAT_TYPE, | ||
813 | .bFormatType = UAC_FORMAT_TYPE_I, | ||
814 | }; | ||
815 | |||
816 | /* STD AS ISO IN Endpoint */ | ||
817 | struct usb_endpoint_descriptor fs_epin_desc = { | ||
818 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
819 | .bDescriptorType = USB_DT_ENDPOINT, | ||
820 | |||
821 | .bEndpointAddress = USB_DIR_IN, | ||
822 | .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, | ||
823 | .bInterval = 1, | ||
824 | }; | ||
825 | |||
826 | struct usb_endpoint_descriptor hs_epin_desc = { | ||
827 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
828 | .bDescriptorType = USB_DT_ENDPOINT, | ||
829 | |||
830 | .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, | ||
831 | .bInterval = 4, | ||
832 | }; | ||
833 | |||
834 | /* CS AS ISO IN Endpoint */ | ||
835 | static struct uac2_iso_endpoint_descriptor as_iso_in_desc = { | ||
836 | .bLength = sizeof as_iso_in_desc, | ||
837 | .bDescriptorType = USB_DT_CS_ENDPOINT, | ||
838 | |||
839 | .bDescriptorSubtype = UAC_EP_GENERAL, | ||
840 | .bmAttributes = 0, | ||
841 | .bmControls = 0, | ||
842 | .bLockDelayUnits = 0, | ||
843 | .wLockDelay = 0, | ||
844 | }; | ||
845 | |||
846 | static struct usb_descriptor_header *fs_audio_desc[] = { | ||
847 | (struct usb_descriptor_header *)&iad_desc, | ||
848 | (struct usb_descriptor_header *)&std_ac_if_desc, | ||
849 | |||
850 | (struct usb_descriptor_header *)&ac_hdr_desc, | ||
851 | (struct usb_descriptor_header *)&in_clk_src_desc, | ||
852 | (struct usb_descriptor_header *)&out_clk_src_desc, | ||
853 | (struct usb_descriptor_header *)&usb_out_it_desc, | ||
854 | (struct usb_descriptor_header *)&io_in_it_desc, | ||
855 | (struct usb_descriptor_header *)&usb_in_ot_desc, | ||
856 | (struct usb_descriptor_header *)&io_out_ot_desc, | ||
857 | |||
858 | (struct usb_descriptor_header *)&std_as_out_if0_desc, | ||
859 | (struct usb_descriptor_header *)&std_as_out_if1_desc, | ||
860 | |||
861 | (struct usb_descriptor_header *)&as_out_hdr_desc, | ||
862 | (struct usb_descriptor_header *)&as_out_fmt1_desc, | ||
863 | (struct usb_descriptor_header *)&fs_epout_desc, | ||
864 | (struct usb_descriptor_header *)&as_iso_out_desc, | ||
865 | |||
866 | (struct usb_descriptor_header *)&std_as_in_if0_desc, | ||
867 | (struct usb_descriptor_header *)&std_as_in_if1_desc, | ||
868 | |||
869 | (struct usb_descriptor_header *)&as_in_hdr_desc, | ||
870 | (struct usb_descriptor_header *)&as_in_fmt1_desc, | ||
871 | (struct usb_descriptor_header *)&fs_epin_desc, | ||
872 | (struct usb_descriptor_header *)&as_iso_in_desc, | ||
873 | NULL, | ||
874 | }; | ||
875 | |||
876 | static struct usb_descriptor_header *hs_audio_desc[] = { | ||
877 | (struct usb_descriptor_header *)&iad_desc, | ||
878 | (struct usb_descriptor_header *)&std_ac_if_desc, | ||
879 | |||
880 | (struct usb_descriptor_header *)&ac_hdr_desc, | ||
881 | (struct usb_descriptor_header *)&in_clk_src_desc, | ||
882 | (struct usb_descriptor_header *)&out_clk_src_desc, | ||
883 | (struct usb_descriptor_header *)&usb_out_it_desc, | ||
884 | (struct usb_descriptor_header *)&io_in_it_desc, | ||
885 | (struct usb_descriptor_header *)&usb_in_ot_desc, | ||
886 | (struct usb_descriptor_header *)&io_out_ot_desc, | ||
887 | |||
888 | (struct usb_descriptor_header *)&std_as_out_if0_desc, | ||
889 | (struct usb_descriptor_header *)&std_as_out_if1_desc, | ||
890 | |||
891 | (struct usb_descriptor_header *)&as_out_hdr_desc, | ||
892 | (struct usb_descriptor_header *)&as_out_fmt1_desc, | ||
893 | (struct usb_descriptor_header *)&hs_epout_desc, | ||
894 | (struct usb_descriptor_header *)&as_iso_out_desc, | ||
895 | |||
896 | (struct usb_descriptor_header *)&std_as_in_if0_desc, | ||
897 | (struct usb_descriptor_header *)&std_as_in_if1_desc, | ||
898 | |||
899 | (struct usb_descriptor_header *)&as_in_hdr_desc, | ||
900 | (struct usb_descriptor_header *)&as_in_fmt1_desc, | ||
901 | (struct usb_descriptor_header *)&hs_epin_desc, | ||
902 | (struct usb_descriptor_header *)&as_iso_in_desc, | ||
903 | NULL, | ||
904 | }; | ||
905 | |||
906 | struct cntrl_cur_lay3 { | ||
907 | __u32 dCUR; | ||
908 | }; | ||
909 | |||
910 | struct cntrl_range_lay3 { | ||
911 | __u16 wNumSubRanges; | ||
912 | __u32 dMIN; | ||
913 | __u32 dMAX; | ||
914 | __u32 dRES; | ||
915 | } __packed; | ||
916 | |||
917 | static inline void | ||
918 | free_ep(struct uac2_rtd_params *prm, struct usb_ep *ep) | ||
919 | { | ||
920 | struct snd_uac2_chip *uac2 = prm_to_uac2(prm); | ||
921 | int i; | ||
922 | |||
923 | prm->ep_enabled = false; | ||
924 | |||
925 | for (i = 0; i < USB_XFERS; i++) { | ||
926 | if (prm->ureq[i].req) { | ||
927 | usb_ep_dequeue(ep, prm->ureq[i].req); | ||
928 | usb_ep_free_request(ep, prm->ureq[i].req); | ||
929 | prm->ureq[i].req = NULL; | ||
930 | } | ||
931 | } | ||
932 | |||
933 | if (usb_ep_disable(ep)) | ||
934 | dev_err(&uac2->pdev.dev, | ||
935 | "%s:%d Error!\n", __func__, __LINE__); | ||
936 | } | ||
937 | |||
938 | static int __init | ||
939 | afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) | ||
940 | { | ||
941 | struct audio_dev *agdev = func_to_agdev(fn); | ||
942 | struct snd_uac2_chip *uac2 = &agdev->uac2; | ||
943 | struct usb_composite_dev *cdev = cfg->cdev; | ||
944 | struct usb_gadget *gadget = cdev->gadget; | ||
945 | struct uac2_rtd_params *prm; | ||
946 | int ret; | ||
947 | |||
948 | ret = usb_interface_id(cfg, fn); | ||
949 | if (ret < 0) { | ||
950 | dev_err(&uac2->pdev.dev, | ||
951 | "%s:%d Error!\n", __func__, __LINE__); | ||
952 | return ret; | ||
953 | } | ||
954 | std_ac_if_desc.bInterfaceNumber = ret; | ||
955 | ALT_SET(agdev->ac_alt, 0); | ||
956 | INTF_SET(agdev->ac_alt, ret); | ||
957 | |||
958 | ret = usb_interface_id(cfg, fn); | ||
959 | if (ret < 0) { | ||
960 | dev_err(&uac2->pdev.dev, | ||
961 | "%s:%d Error!\n", __func__, __LINE__); | ||
962 | return ret; | ||
963 | } | ||
964 | std_as_out_if0_desc.bInterfaceNumber = ret; | ||
965 | std_as_out_if1_desc.bInterfaceNumber = ret; | ||
966 | ALT_SET(agdev->as_out_alt, 0); | ||
967 | INTF_SET(agdev->as_out_alt, ret); | ||
968 | |||
969 | ret = usb_interface_id(cfg, fn); | ||
970 | if (ret < 0) { | ||
971 | dev_err(&uac2->pdev.dev, | ||
972 | "%s:%d Error!\n", __func__, __LINE__); | ||
973 | return ret; | ||
974 | } | ||
975 | std_as_in_if0_desc.bInterfaceNumber = ret; | ||
976 | std_as_in_if1_desc.bInterfaceNumber = ret; | ||
977 | ALT_SET(agdev->as_in_alt, 0); | ||
978 | INTF_SET(agdev->as_in_alt, ret); | ||
979 | |||
980 | agdev->out_ep = usb_ep_autoconfig(gadget, &fs_epout_desc); | ||
981 | if (!agdev->out_ep) | ||
982 | dev_err(&uac2->pdev.dev, | ||
983 | "%s:%d Error!\n", __func__, __LINE__); | ||
984 | agdev->out_ep->driver_data = agdev; | ||
985 | |||
986 | agdev->in_ep = usb_ep_autoconfig(gadget, &fs_epin_desc); | ||
987 | if (!agdev->in_ep) | ||
988 | dev_err(&uac2->pdev.dev, | ||
989 | "%s:%d Error!\n", __func__, __LINE__); | ||
990 | agdev->in_ep->driver_data = agdev; | ||
991 | |||
992 | hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress; | ||
993 | hs_epout_desc.wMaxPacketSize = fs_epout_desc.wMaxPacketSize; | ||
994 | hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress; | ||
995 | hs_epin_desc.wMaxPacketSize = fs_epin_desc.wMaxPacketSize; | ||
996 | |||
997 | fn->descriptors = usb_copy_descriptors(fs_audio_desc); | ||
998 | if (gadget_is_dualspeed(gadget)) | ||
999 | fn->hs_descriptors = usb_copy_descriptors(hs_audio_desc); | ||
1000 | |||
1001 | prm = &agdev->uac2.c_prm; | ||
1002 | prm->max_psize = hs_epout_desc.wMaxPacketSize; | ||
1003 | prm->rbuf = kzalloc(prm->max_psize * USB_XFERS, GFP_KERNEL); | ||
1004 | if (!prm->rbuf) { | ||
1005 | prm->max_psize = 0; | ||
1006 | dev_err(&uac2->pdev.dev, | ||
1007 | "%s:%d Error!\n", __func__, __LINE__); | ||
1008 | } | ||
1009 | |||
1010 | prm = &agdev->uac2.p_prm; | ||
1011 | prm->max_psize = hs_epin_desc.wMaxPacketSize; | ||
1012 | prm->rbuf = kzalloc(prm->max_psize * USB_XFERS, GFP_KERNEL); | ||
1013 | if (!prm->rbuf) { | ||
1014 | prm->max_psize = 0; | ||
1015 | dev_err(&uac2->pdev.dev, | ||
1016 | "%s:%d Error!\n", __func__, __LINE__); | ||
1017 | } | ||
1018 | |||
1019 | return alsa_uac2_init(agdev); | ||
1020 | } | ||
1021 | |||
1022 | static void | ||
1023 | afunc_unbind(struct usb_configuration *cfg, struct usb_function *fn) | ||
1024 | { | ||
1025 | struct audio_dev *agdev = func_to_agdev(fn); | ||
1026 | struct usb_composite_dev *cdev = cfg->cdev; | ||
1027 | struct usb_gadget *gadget = cdev->gadget; | ||
1028 | struct uac2_rtd_params *prm; | ||
1029 | |||
1030 | alsa_uac2_exit(agdev); | ||
1031 | |||
1032 | prm = &agdev->uac2.p_prm; | ||
1033 | kfree(prm->rbuf); | ||
1034 | |||
1035 | prm = &agdev->uac2.c_prm; | ||
1036 | kfree(prm->rbuf); | ||
1037 | |||
1038 | if (gadget_is_dualspeed(gadget)) | ||
1039 | usb_free_descriptors(fn->hs_descriptors); | ||
1040 | usb_free_descriptors(fn->descriptors); | ||
1041 | |||
1042 | if (agdev->in_ep) | ||
1043 | agdev->in_ep->driver_data = NULL; | ||
1044 | if (agdev->out_ep) | ||
1045 | agdev->out_ep->driver_data = NULL; | ||
1046 | } | ||
1047 | |||
1048 | static int | ||
1049 | afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt) | ||
1050 | { | ||
1051 | struct usb_composite_dev *cdev = fn->config->cdev; | ||
1052 | struct audio_dev *agdev = func_to_agdev(fn); | ||
1053 | struct snd_uac2_chip *uac2 = &agdev->uac2; | ||
1054 | struct usb_gadget *gadget = cdev->gadget; | ||
1055 | struct usb_request *req; | ||
1056 | struct usb_ep *ep; | ||
1057 | struct uac2_rtd_params *prm; | ||
1058 | int i; | ||
1059 | |||
1060 | /* No i/f has more than 2 alt settings */ | ||
1061 | if (alt > 1) { | ||
1062 | dev_err(&uac2->pdev.dev, | ||
1063 | "%s:%d Error!\n", __func__, __LINE__); | ||
1064 | return -EINVAL; | ||
1065 | } | ||
1066 | |||
1067 | if (intf == INTF_GET(agdev->ac_alt)) { | ||
1068 | /* Control I/f has only 1 AltSetting - 0 */ | ||
1069 | if (alt) { | ||
1070 | dev_err(&uac2->pdev.dev, | ||
1071 | "%s:%d Error!\n", __func__, __LINE__); | ||
1072 | return -EINVAL; | ||
1073 | } | ||
1074 | return 0; | ||
1075 | } | ||
1076 | |||
1077 | if (intf == INTF_GET(agdev->as_out_alt)) { | ||
1078 | ep = agdev->out_ep; | ||
1079 | prm = &uac2->c_prm; | ||
1080 | config_ep_by_speed(gadget, fn, ep); | ||
1081 | ALT_SET(agdev->as_out_alt, alt); | ||
1082 | } else if (intf == INTF_GET(agdev->as_in_alt)) { | ||
1083 | ep = agdev->in_ep; | ||
1084 | prm = &uac2->p_prm; | ||
1085 | config_ep_by_speed(gadget, fn, ep); | ||
1086 | ALT_SET(agdev->as_in_alt, alt); | ||
1087 | } else { | ||
1088 | dev_err(&uac2->pdev.dev, | ||
1089 | "%s:%d Error!\n", __func__, __LINE__); | ||
1090 | return -EINVAL; | ||
1091 | } | ||
1092 | |||
1093 | if (alt == 0) { | ||
1094 | free_ep(prm, ep); | ||
1095 | return 0; | ||
1096 | } | ||
1097 | |||
1098 | prm->ep_enabled = true; | ||
1099 | usb_ep_enable(ep); | ||
1100 | |||
1101 | for (i = 0; i < USB_XFERS; i++) { | ||
1102 | if (prm->ureq[i].req) { | ||
1103 | if (usb_ep_queue(ep, prm->ureq[i].req, GFP_ATOMIC)) | ||
1104 | dev_err(&uac2->pdev.dev, "%d Error!\n", | ||
1105 | __LINE__); | ||
1106 | continue; | ||
1107 | } | ||
1108 | |||
1109 | req = usb_ep_alloc_request(ep, GFP_ATOMIC); | ||
1110 | if (req == NULL) { | ||
1111 | dev_err(&uac2->pdev.dev, | ||
1112 | "%s:%d Error!\n", __func__, __LINE__); | ||
1113 | return -EINVAL; | ||
1114 | } | ||
1115 | |||
1116 | prm->ureq[i].req = req; | ||
1117 | prm->ureq[i].pp = prm; | ||
1118 | |||
1119 | req->zero = 0; | ||
1120 | req->dma = DMA_ADDR_INVALID; | ||
1121 | req->context = &prm->ureq[i]; | ||
1122 | req->length = prm->max_psize; | ||
1123 | req->complete = agdev_iso_complete; | ||
1124 | req->buf = prm->rbuf + i * req->length; | ||
1125 | |||
1126 | if (usb_ep_queue(ep, req, GFP_ATOMIC)) | ||
1127 | dev_err(&uac2->pdev.dev, "%d Error!\n", __LINE__); | ||
1128 | } | ||
1129 | |||
1130 | return 0; | ||
1131 | } | ||
1132 | |||
1133 | static int | ||
1134 | afunc_get_alt(struct usb_function *fn, unsigned intf) | ||
1135 | { | ||
1136 | struct audio_dev *agdev = func_to_agdev(fn); | ||
1137 | struct snd_uac2_chip *uac2 = &agdev->uac2; | ||
1138 | |||
1139 | if (intf == INTF_GET(agdev->ac_alt)) | ||
1140 | return ALT_GET(agdev->ac_alt); | ||
1141 | else if (intf == INTF_GET(agdev->as_out_alt)) | ||
1142 | return ALT_GET(agdev->as_out_alt); | ||
1143 | else if (intf == INTF_GET(agdev->as_in_alt)) | ||
1144 | return ALT_GET(agdev->as_in_alt); | ||
1145 | else | ||
1146 | dev_err(&uac2->pdev.dev, | ||
1147 | "%s:%d Invalid Interface %d!\n", | ||
1148 | __func__, __LINE__, intf); | ||
1149 | |||
1150 | return -EINVAL; | ||
1151 | } | ||
1152 | |||
1153 | static void | ||
1154 | afunc_disable(struct usb_function *fn) | ||
1155 | { | ||
1156 | struct audio_dev *agdev = func_to_agdev(fn); | ||
1157 | struct snd_uac2_chip *uac2 = &agdev->uac2; | ||
1158 | |||
1159 | free_ep(&uac2->p_prm, agdev->in_ep); | ||
1160 | ALT_SET(agdev->as_in_alt, 0); | ||
1161 | |||
1162 | free_ep(&uac2->c_prm, agdev->out_ep); | ||
1163 | ALT_SET(agdev->as_out_alt, 0); | ||
1164 | } | ||
1165 | |||
1166 | static int | ||
1167 | in_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr) | ||
1168 | { | ||
1169 | struct usb_request *req = fn->config->cdev->req; | ||
1170 | struct audio_dev *agdev = func_to_agdev(fn); | ||
1171 | struct snd_uac2_chip *uac2 = &agdev->uac2; | ||
1172 | u16 w_length = le16_to_cpu(cr->wLength); | ||
1173 | u16 w_index = le16_to_cpu(cr->wIndex); | ||
1174 | u16 w_value = le16_to_cpu(cr->wValue); | ||
1175 | u8 entity_id = (w_index >> 8) & 0xff; | ||
1176 | u8 control_selector = w_value >> 8; | ||
1177 | int value = -EOPNOTSUPP; | ||
1178 | |||
1179 | if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) { | ||
1180 | struct cntrl_cur_lay3 c; | ||
1181 | |||
1182 | if (entity_id == USB_IN_CLK_ID) | ||
1183 | c.dCUR = p_srate; | ||
1184 | else if (entity_id == USB_OUT_CLK_ID) | ||
1185 | c.dCUR = c_srate; | ||
1186 | |||
1187 | value = min_t(unsigned, w_length, sizeof c); | ||
1188 | memcpy(req->buf, &c, value); | ||
1189 | } else if (control_selector == UAC2_CS_CONTROL_CLOCK_VALID) { | ||
1190 | *(u8 *)req->buf = 1; | ||
1191 | value = min_t(unsigned, w_length, 1); | ||
1192 | } else { | ||
1193 | dev_err(&uac2->pdev.dev, | ||
1194 | "%s:%d control_selector=%d TODO!\n", | ||
1195 | __func__, __LINE__, control_selector); | ||
1196 | } | ||
1197 | |||
1198 | return value; | ||
1199 | } | ||
1200 | |||
1201 | static int | ||
1202 | in_rq_range(struct usb_function *fn, const struct usb_ctrlrequest *cr) | ||
1203 | { | ||
1204 | struct usb_request *req = fn->config->cdev->req; | ||
1205 | struct audio_dev *agdev = func_to_agdev(fn); | ||
1206 | struct snd_uac2_chip *uac2 = &agdev->uac2; | ||
1207 | u16 w_length = le16_to_cpu(cr->wLength); | ||
1208 | u16 w_index = le16_to_cpu(cr->wIndex); | ||
1209 | u16 w_value = le16_to_cpu(cr->wValue); | ||
1210 | u8 entity_id = (w_index >> 8) & 0xff; | ||
1211 | u8 control_selector = w_value >> 8; | ||
1212 | struct cntrl_range_lay3 r; | ||
1213 | int value = -EOPNOTSUPP; | ||
1214 | |||
1215 | if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) { | ||
1216 | if (entity_id == USB_IN_CLK_ID) | ||
1217 | r.dMIN = p_srate; | ||
1218 | else if (entity_id == USB_OUT_CLK_ID) | ||
1219 | r.dMIN = c_srate; | ||
1220 | else | ||
1221 | return -EOPNOTSUPP; | ||
1222 | |||
1223 | r.dMAX = r.dMIN; | ||
1224 | r.dRES = 0; | ||
1225 | r.wNumSubRanges = 1; | ||
1226 | |||
1227 | value = min_t(unsigned, w_length, sizeof r); | ||
1228 | memcpy(req->buf, &r, value); | ||
1229 | } else { | ||
1230 | dev_err(&uac2->pdev.dev, | ||
1231 | "%s:%d control_selector=%d TODO!\n", | ||
1232 | __func__, __LINE__, control_selector); | ||
1233 | } | ||
1234 | |||
1235 | return value; | ||
1236 | } | ||
1237 | |||
1238 | static int | ||
1239 | ac_rq_in(struct usb_function *fn, const struct usb_ctrlrequest *cr) | ||
1240 | { | ||
1241 | if (cr->bRequest == UAC2_CS_CUR) | ||
1242 | return in_rq_cur(fn, cr); | ||
1243 | else if (cr->bRequest == UAC2_CS_RANGE) | ||
1244 | return in_rq_range(fn, cr); | ||
1245 | else | ||
1246 | return -EOPNOTSUPP; | ||
1247 | } | ||
1248 | |||
1249 | static int | ||
1250 | out_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr) | ||
1251 | { | ||
1252 | u16 w_length = le16_to_cpu(cr->wLength); | ||
1253 | u16 w_value = le16_to_cpu(cr->wValue); | ||
1254 | u8 control_selector = w_value >> 8; | ||
1255 | |||
1256 | if (control_selector == UAC2_CS_CONTROL_SAM_FREQ) | ||
1257 | return w_length; | ||
1258 | |||
1259 | return -EOPNOTSUPP; | ||
1260 | } | ||
1261 | |||
1262 | static int | ||
1263 | setup_rq_inf(struct usb_function *fn, const struct usb_ctrlrequest *cr) | ||
1264 | { | ||
1265 | struct audio_dev *agdev = func_to_agdev(fn); | ||
1266 | struct snd_uac2_chip *uac2 = &agdev->uac2; | ||
1267 | u16 w_index = le16_to_cpu(cr->wIndex); | ||
1268 | u8 intf = w_index & 0xff; | ||
1269 | |||
1270 | if (intf != INTF_GET(agdev->ac_alt)) { | ||
1271 | dev_err(&uac2->pdev.dev, | ||
1272 | "%s:%d Error!\n", __func__, __LINE__); | ||
1273 | return -EOPNOTSUPP; | ||
1274 | } | ||
1275 | |||
1276 | if (cr->bRequestType & USB_DIR_IN) | ||
1277 | return ac_rq_in(fn, cr); | ||
1278 | else if (cr->bRequest == UAC2_CS_CUR) | ||
1279 | return out_rq_cur(fn, cr); | ||
1280 | |||
1281 | return -EOPNOTSUPP; | ||
1282 | } | ||
1283 | |||
1284 | static int | ||
1285 | afunc_setup(struct usb_function *fn, const struct usb_ctrlrequest *cr) | ||
1286 | { | ||
1287 | struct usb_composite_dev *cdev = fn->config->cdev; | ||
1288 | struct audio_dev *agdev = func_to_agdev(fn); | ||
1289 | struct snd_uac2_chip *uac2 = &agdev->uac2; | ||
1290 | struct usb_request *req = cdev->req; | ||
1291 | u16 w_length = le16_to_cpu(cr->wLength); | ||
1292 | int value = -EOPNOTSUPP; | ||
1293 | |||
1294 | /* Only Class specific requests are supposed to reach here */ | ||
1295 | if ((cr->bRequestType & USB_TYPE_MASK) != USB_TYPE_CLASS) | ||
1296 | return -EOPNOTSUPP; | ||
1297 | |||
1298 | if ((cr->bRequestType & USB_RECIP_MASK) == USB_RECIP_INTERFACE) | ||
1299 | value = setup_rq_inf(fn, cr); | ||
1300 | else | ||
1301 | dev_err(&uac2->pdev.dev, "%s:%d Error!\n", __func__, __LINE__); | ||
1302 | |||
1303 | if (value >= 0) { | ||
1304 | req->length = value; | ||
1305 | req->zero = value < w_length; | ||
1306 | value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC); | ||
1307 | if (value < 0) { | ||
1308 | dev_err(&uac2->pdev.dev, | ||
1309 | "%s:%d Error!\n", __func__, __LINE__); | ||
1310 | req->status = 0; | ||
1311 | } | ||
1312 | } | ||
1313 | |||
1314 | return value; | ||
1315 | } | ||
1316 | |||
1317 | static int audio_bind_config(struct usb_configuration *cfg) | ||
1318 | { | ||
1319 | int id, res; | ||
1320 | |||
1321 | agdev_g = kzalloc(sizeof *agdev_g, GFP_KERNEL); | ||
1322 | if (agdev_g == NULL) { | ||
1323 | printk(KERN_ERR "Unable to allocate audio gadget\n"); | ||
1324 | return -ENOMEM; | ||
1325 | } | ||
1326 | |||
1327 | id = usb_string_id(cfg->cdev); | ||
1328 | if (id < 0) | ||
1329 | return id; | ||
1330 | |||
1331 | strings_fn[STR_ASSOC].id = id; | ||
1332 | iad_desc.iFunction = id, | ||
1333 | |||
1334 | id = usb_string_id(cfg->cdev); | ||
1335 | if (id < 0) | ||
1336 | return id; | ||
1337 | |||
1338 | strings_fn[STR_IF_CTRL].id = id; | ||
1339 | std_ac_if_desc.iInterface = id, | ||
1340 | |||
1341 | id = usb_string_id(cfg->cdev); | ||
1342 | if (id < 0) | ||
1343 | return id; | ||
1344 | |||
1345 | strings_fn[STR_CLKSRC_IN].id = id; | ||
1346 | in_clk_src_desc.iClockSource = id, | ||
1347 | |||
1348 | id = usb_string_id(cfg->cdev); | ||
1349 | if (id < 0) | ||
1350 | return id; | ||
1351 | |||
1352 | strings_fn[STR_CLKSRC_OUT].id = id; | ||
1353 | out_clk_src_desc.iClockSource = id, | ||
1354 | |||
1355 | id = usb_string_id(cfg->cdev); | ||
1356 | if (id < 0) | ||
1357 | return id; | ||
1358 | |||
1359 | strings_fn[STR_USB_IT].id = id; | ||
1360 | usb_out_it_desc.iTerminal = id, | ||
1361 | |||
1362 | id = usb_string_id(cfg->cdev); | ||
1363 | if (id < 0) | ||
1364 | return id; | ||
1365 | |||
1366 | strings_fn[STR_IO_IT].id = id; | ||
1367 | io_in_it_desc.iTerminal = id; | ||
1368 | |||
1369 | id = usb_string_id(cfg->cdev); | ||
1370 | if (id < 0) | ||
1371 | return id; | ||
1372 | |||
1373 | strings_fn[STR_USB_OT].id = id; | ||
1374 | usb_in_ot_desc.iTerminal = id; | ||
1375 | |||
1376 | id = usb_string_id(cfg->cdev); | ||
1377 | if (id < 0) | ||
1378 | return id; | ||
1379 | |||
1380 | strings_fn[STR_IO_OT].id = id; | ||
1381 | io_out_ot_desc.iTerminal = id; | ||
1382 | |||
1383 | id = usb_string_id(cfg->cdev); | ||
1384 | if (id < 0) | ||
1385 | return id; | ||
1386 | |||
1387 | strings_fn[STR_AS_OUT_ALT0].id = id; | ||
1388 | std_as_out_if0_desc.iInterface = id; | ||
1389 | |||
1390 | id = usb_string_id(cfg->cdev); | ||
1391 | if (id < 0) | ||
1392 | return id; | ||
1393 | |||
1394 | strings_fn[STR_AS_OUT_ALT1].id = id; | ||
1395 | std_as_out_if1_desc.iInterface = id; | ||
1396 | |||
1397 | id = usb_string_id(cfg->cdev); | ||
1398 | if (id < 0) | ||
1399 | return id; | ||
1400 | |||
1401 | strings_fn[STR_AS_IN_ALT0].id = id; | ||
1402 | std_as_in_if0_desc.iInterface = id; | ||
1403 | |||
1404 | id = usb_string_id(cfg->cdev); | ||
1405 | if (id < 0) | ||
1406 | return id; | ||
1407 | |||
1408 | strings_fn[STR_AS_IN_ALT1].id = id; | ||
1409 | std_as_in_if1_desc.iInterface = id; | ||
1410 | |||
1411 | agdev_g->func.name = "uac2_func"; | ||
1412 | agdev_g->func.strings = fn_strings; | ||
1413 | agdev_g->func.bind = afunc_bind; | ||
1414 | agdev_g->func.unbind = afunc_unbind; | ||
1415 | agdev_g->func.set_alt = afunc_set_alt; | ||
1416 | agdev_g->func.get_alt = afunc_get_alt; | ||
1417 | agdev_g->func.disable = afunc_disable; | ||
1418 | agdev_g->func.setup = afunc_setup; | ||
1419 | |||
1420 | /* Initialize the configurable parameters */ | ||
1421 | usb_out_it_desc.bNrChannels = num_channels(c_chmask); | ||
1422 | usb_out_it_desc.bmChannelConfig = cpu_to_le32(c_chmask); | ||
1423 | io_in_it_desc.bNrChannels = num_channels(p_chmask); | ||
1424 | io_in_it_desc.bmChannelConfig = cpu_to_le32(p_chmask); | ||
1425 | as_out_hdr_desc.bNrChannels = num_channels(c_chmask); | ||
1426 | as_out_hdr_desc.bmChannelConfig = cpu_to_le32(c_chmask); | ||
1427 | as_in_hdr_desc.bNrChannels = num_channels(p_chmask); | ||
1428 | as_in_hdr_desc.bmChannelConfig = cpu_to_le32(p_chmask); | ||
1429 | as_out_fmt1_desc.bSubslotSize = c_ssize; | ||
1430 | as_out_fmt1_desc.bBitResolution = c_ssize * 8; | ||
1431 | as_in_fmt1_desc.bSubslotSize = p_ssize; | ||
1432 | as_in_fmt1_desc.bBitResolution = p_ssize * 8; | ||
1433 | |||
1434 | snprintf(clksrc_in, sizeof(clksrc_in), "%uHz", p_srate); | ||
1435 | snprintf(clksrc_out, sizeof(clksrc_out), "%uHz", c_srate); | ||
1436 | |||
1437 | res = usb_add_function(cfg, &agdev_g->func); | ||
1438 | if (res < 0) | ||
1439 | kfree(agdev_g); | ||
1440 | |||
1441 | return res; | ||
1442 | } | ||
1443 | |||
1444 | static void | ||
1445 | uac2_unbind_config(struct usb_configuration *cfg) | ||
1446 | { | ||
1447 | kfree(agdev_g); | ||
1448 | agdev_g = NULL; | ||
1449 | } | ||
diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c index 47766f0e7caa..4fac56927741 100644 --- a/drivers/usb/gadget/file_storage.c +++ b/drivers/usb/gadget/file_storage.c | |||
@@ -855,7 +855,7 @@ static int class_setup_req(struct fsg_dev *fsg, | |||
855 | if (transport_is_bbb()) { | 855 | if (transport_is_bbb()) { |
856 | switch (ctrl->bRequest) { | 856 | switch (ctrl->bRequest) { |
857 | 857 | ||
858 | case USB_BULK_RESET_REQUEST: | 858 | case US_BULK_RESET_REQUEST: |
859 | if (ctrl->bRequestType != (USB_DIR_OUT | | 859 | if (ctrl->bRequestType != (USB_DIR_OUT | |
860 | USB_TYPE_CLASS | USB_RECIP_INTERFACE)) | 860 | USB_TYPE_CLASS | USB_RECIP_INTERFACE)) |
861 | break; | 861 | break; |
@@ -871,7 +871,7 @@ static int class_setup_req(struct fsg_dev *fsg, | |||
871 | value = DELAYED_STATUS; | 871 | value = DELAYED_STATUS; |
872 | break; | 872 | break; |
873 | 873 | ||
874 | case USB_BULK_GET_MAX_LUN_REQUEST: | 874 | case US_BULK_GET_MAX_LUN: |
875 | if (ctrl->bRequestType != (USB_DIR_IN | | 875 | if (ctrl->bRequestType != (USB_DIR_IN | |
876 | USB_TYPE_CLASS | USB_RECIP_INTERFACE)) | 876 | USB_TYPE_CLASS | USB_RECIP_INTERFACE)) |
877 | break; | 877 | break; |
@@ -2125,7 +2125,7 @@ static int send_status(struct fsg_dev *fsg) | |||
2125 | struct fsg_lun *curlun = fsg->curlun; | 2125 | struct fsg_lun *curlun = fsg->curlun; |
2126 | struct fsg_buffhd *bh; | 2126 | struct fsg_buffhd *bh; |
2127 | int rc; | 2127 | int rc; |
2128 | u8 status = USB_STATUS_PASS; | 2128 | u8 status = US_BULK_STAT_OK; |
2129 | u32 sd, sdinfo = 0; | 2129 | u32 sd, sdinfo = 0; |
2130 | 2130 | ||
2131 | /* Wait for the next buffer to become available */ | 2131 | /* Wait for the next buffer to become available */ |
@@ -2146,11 +2146,11 @@ static int send_status(struct fsg_dev *fsg) | |||
2146 | 2146 | ||
2147 | if (fsg->phase_error) { | 2147 | if (fsg->phase_error) { |
2148 | DBG(fsg, "sending phase-error status\n"); | 2148 | DBG(fsg, "sending phase-error status\n"); |
2149 | status = USB_STATUS_PHASE_ERROR; | 2149 | status = US_BULK_STAT_PHASE; |
2150 | sd = SS_INVALID_COMMAND; | 2150 | sd = SS_INVALID_COMMAND; |
2151 | } else if (sd != SS_NO_SENSE) { | 2151 | } else if (sd != SS_NO_SENSE) { |
2152 | DBG(fsg, "sending command-failure status\n"); | 2152 | DBG(fsg, "sending command-failure status\n"); |
2153 | status = USB_STATUS_FAIL; | 2153 | status = US_BULK_STAT_FAIL; |
2154 | VDBG(fsg, " sense data: SK x%02x, ASC x%02x, ASCQ x%02x;" | 2154 | VDBG(fsg, " sense data: SK x%02x, ASC x%02x, ASCQ x%02x;" |
2155 | " info x%x\n", | 2155 | " info x%x\n", |
2156 | SK(sd), ASC(sd), ASCQ(sd), sdinfo); | 2156 | SK(sd), ASC(sd), ASCQ(sd), sdinfo); |
@@ -2160,12 +2160,12 @@ static int send_status(struct fsg_dev *fsg) | |||
2160 | struct bulk_cs_wrap *csw = bh->buf; | 2160 | struct bulk_cs_wrap *csw = bh->buf; |
2161 | 2161 | ||
2162 | /* Store and send the Bulk-only CSW */ | 2162 | /* Store and send the Bulk-only CSW */ |
2163 | csw->Signature = cpu_to_le32(USB_BULK_CS_SIG); | 2163 | csw->Signature = cpu_to_le32(US_BULK_CS_SIGN); |
2164 | csw->Tag = fsg->tag; | 2164 | csw->Tag = fsg->tag; |
2165 | csw->Residue = cpu_to_le32(fsg->residue); | 2165 | csw->Residue = cpu_to_le32(fsg->residue); |
2166 | csw->Status = status; | 2166 | csw->Status = status; |
2167 | 2167 | ||
2168 | bh->inreq->length = USB_BULK_CS_WRAP_LEN; | 2168 | bh->inreq->length = US_BULK_CS_WRAP_LEN; |
2169 | bh->inreq->zero = 0; | 2169 | bh->inreq->zero = 0; |
2170 | start_transfer(fsg, fsg->bulk_in, bh->inreq, | 2170 | start_transfer(fsg, fsg->bulk_in, bh->inreq, |
2171 | &bh->inreq_busy, &bh->state); | 2171 | &bh->inreq_busy, &bh->state); |
@@ -2609,16 +2609,16 @@ static int do_scsi_command(struct fsg_dev *fsg) | |||
2609 | static int received_cbw(struct fsg_dev *fsg, struct fsg_buffhd *bh) | 2609 | static int received_cbw(struct fsg_dev *fsg, struct fsg_buffhd *bh) |
2610 | { | 2610 | { |
2611 | struct usb_request *req = bh->outreq; | 2611 | struct usb_request *req = bh->outreq; |
2612 | struct fsg_bulk_cb_wrap *cbw = req->buf; | 2612 | struct bulk_cb_wrap *cbw = req->buf; |
2613 | 2613 | ||
2614 | /* Was this a real packet? Should it be ignored? */ | 2614 | /* Was this a real packet? Should it be ignored? */ |
2615 | if (req->status || test_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags)) | 2615 | if (req->status || test_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags)) |
2616 | return -EINVAL; | 2616 | return -EINVAL; |
2617 | 2617 | ||
2618 | /* Is the CBW valid? */ | 2618 | /* Is the CBW valid? */ |
2619 | if (req->actual != USB_BULK_CB_WRAP_LEN || | 2619 | if (req->actual != US_BULK_CB_WRAP_LEN || |
2620 | cbw->Signature != cpu_to_le32( | 2620 | cbw->Signature != cpu_to_le32( |
2621 | USB_BULK_CB_SIG)) { | 2621 | US_BULK_CB_SIGN)) { |
2622 | DBG(fsg, "invalid CBW: len %u sig 0x%x\n", | 2622 | DBG(fsg, "invalid CBW: len %u sig 0x%x\n", |
2623 | req->actual, | 2623 | req->actual, |
2624 | le32_to_cpu(cbw->Signature)); | 2624 | le32_to_cpu(cbw->Signature)); |
@@ -2638,7 +2638,7 @@ static int received_cbw(struct fsg_dev *fsg, struct fsg_buffhd *bh) | |||
2638 | } | 2638 | } |
2639 | 2639 | ||
2640 | /* Is the CBW meaningful? */ | 2640 | /* Is the CBW meaningful? */ |
2641 | if (cbw->Lun >= FSG_MAX_LUNS || cbw->Flags & ~USB_BULK_IN_FLAG || | 2641 | if (cbw->Lun >= FSG_MAX_LUNS || cbw->Flags & ~US_BULK_FLAG_IN || |
2642 | cbw->Length <= 0 || cbw->Length > MAX_COMMAND_SIZE) { | 2642 | cbw->Length <= 0 || cbw->Length > MAX_COMMAND_SIZE) { |
2643 | DBG(fsg, "non-meaningful CBW: lun = %u, flags = 0x%x, " | 2643 | DBG(fsg, "non-meaningful CBW: lun = %u, flags = 0x%x, " |
2644 | "cmdlen %u\n", | 2644 | "cmdlen %u\n", |
@@ -2656,7 +2656,7 @@ static int received_cbw(struct fsg_dev *fsg, struct fsg_buffhd *bh) | |||
2656 | /* Save the command for later */ | 2656 | /* Save the command for later */ |
2657 | fsg->cmnd_size = cbw->Length; | 2657 | fsg->cmnd_size = cbw->Length; |
2658 | memcpy(fsg->cmnd, cbw->CDB, fsg->cmnd_size); | 2658 | memcpy(fsg->cmnd, cbw->CDB, fsg->cmnd_size); |
2659 | if (cbw->Flags & USB_BULK_IN_FLAG) | 2659 | if (cbw->Flags & US_BULK_FLAG_IN) |
2660 | fsg->data_dir = DATA_DIR_TO_HOST; | 2660 | fsg->data_dir = DATA_DIR_TO_HOST; |
2661 | else | 2661 | else |
2662 | fsg->data_dir = DATA_DIR_FROM_HOST; | 2662 | fsg->data_dir = DATA_DIR_FROM_HOST; |
@@ -2685,7 +2685,7 @@ static int get_next_command(struct fsg_dev *fsg) | |||
2685 | } | 2685 | } |
2686 | 2686 | ||
2687 | /* Queue a request to read a Bulk-only CBW */ | 2687 | /* Queue a request to read a Bulk-only CBW */ |
2688 | set_bulk_out_req_length(fsg, bh, USB_BULK_CB_WRAP_LEN); | 2688 | set_bulk_out_req_length(fsg, bh, US_BULK_CB_WRAP_LEN); |
2689 | start_transfer(fsg, fsg->bulk_out, bh->outreq, | 2689 | start_transfer(fsg, fsg->bulk_out, bh->outreq, |
2690 | &bh->outreq_busy, &bh->state); | 2690 | &bh->outreq_busy, &bh->state); |
2691 | 2691 | ||
diff --git a/drivers/usb/gadget/fsl_qe_udc.c b/drivers/usb/gadget/fsl_qe_udc.c index b95697c03d07..877a2c46672b 100644 --- a/drivers/usb/gadget/fsl_qe_udc.c +++ b/drivers/usb/gadget/fsl_qe_udc.c | |||
@@ -1638,6 +1638,7 @@ static int qe_ep_disable(struct usb_ep *_ep) | |||
1638 | /* Nuke all pending requests (does flush) */ | 1638 | /* Nuke all pending requests (does flush) */ |
1639 | nuke(ep, -ESHUTDOWN); | 1639 | nuke(ep, -ESHUTDOWN); |
1640 | ep->desc = NULL; | 1640 | ep->desc = NULL; |
1641 | ep->ep.desc = NULL; | ||
1641 | ep->stopped = 1; | 1642 | ep->stopped = 1; |
1642 | ep->tx_req = NULL; | 1643 | ep->tx_req = NULL; |
1643 | qe_ep_reset(udc, ep->epnum); | 1644 | qe_ep_reset(udc, ep->epnum); |
diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c index b04712f19f1e..b30e21fdbb1b 100644 --- a/drivers/usb/gadget/fsl_udc_core.c +++ b/drivers/usb/gadget/fsl_udc_core.c | |||
@@ -659,6 +659,7 @@ static int fsl_ep_disable(struct usb_ep *_ep) | |||
659 | nuke(ep, -ESHUTDOWN); | 659 | nuke(ep, -ESHUTDOWN); |
660 | 660 | ||
661 | ep->desc = NULL; | 661 | ep->desc = NULL; |
662 | ep->ep.desc = NULL; | ||
662 | ep->stopped = 1; | 663 | ep->stopped = 1; |
663 | spin_unlock_irqrestore(&udc->lock, flags); | 664 | spin_unlock_irqrestore(&udc->lock, flags); |
664 | 665 | ||
@@ -768,7 +769,7 @@ static void fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req) | |||
768 | * @is_last: return flag if it is the last dTD of the request | 769 | * @is_last: return flag if it is the last dTD of the request |
769 | * return: pointer to the built dTD */ | 770 | * return: pointer to the built dTD */ |
770 | static struct ep_td_struct *fsl_build_dtd(struct fsl_req *req, unsigned *length, | 771 | static struct ep_td_struct *fsl_build_dtd(struct fsl_req *req, unsigned *length, |
771 | dma_addr_t *dma, int *is_last) | 772 | dma_addr_t *dma, int *is_last, gfp_t gfp_flags) |
772 | { | 773 | { |
773 | u32 swap_temp; | 774 | u32 swap_temp; |
774 | struct ep_td_struct *dtd; | 775 | struct ep_td_struct *dtd; |
@@ -777,7 +778,7 @@ static struct ep_td_struct *fsl_build_dtd(struct fsl_req *req, unsigned *length, | |||
777 | *length = min(req->req.length - req->req.actual, | 778 | *length = min(req->req.length - req->req.actual, |
778 | (unsigned)EP_MAX_LENGTH_TRANSFER); | 779 | (unsigned)EP_MAX_LENGTH_TRANSFER); |
779 | 780 | ||
780 | dtd = dma_pool_alloc(udc_controller->td_pool, GFP_KERNEL, dma); | 781 | dtd = dma_pool_alloc(udc_controller->td_pool, gfp_flags, dma); |
781 | if (dtd == NULL) | 782 | if (dtd == NULL) |
782 | return dtd; | 783 | return dtd; |
783 | 784 | ||
@@ -827,7 +828,7 @@ static struct ep_td_struct *fsl_build_dtd(struct fsl_req *req, unsigned *length, | |||
827 | } | 828 | } |
828 | 829 | ||
829 | /* Generate dtd chain for a request */ | 830 | /* Generate dtd chain for a request */ |
830 | static int fsl_req_to_dtd(struct fsl_req *req) | 831 | static int fsl_req_to_dtd(struct fsl_req *req, gfp_t gfp_flags) |
831 | { | 832 | { |
832 | unsigned count; | 833 | unsigned count; |
833 | int is_last; | 834 | int is_last; |
@@ -836,7 +837,7 @@ static int fsl_req_to_dtd(struct fsl_req *req) | |||
836 | dma_addr_t dma; | 837 | dma_addr_t dma; |
837 | 838 | ||
838 | do { | 839 | do { |
839 | dtd = fsl_build_dtd(req, &count, &dma, &is_last); | 840 | dtd = fsl_build_dtd(req, &count, &dma, &is_last, gfp_flags); |
840 | if (dtd == NULL) | 841 | if (dtd == NULL) |
841 | return -ENOMEM; | 842 | return -ENOMEM; |
842 | 843 | ||
@@ -910,13 +911,11 @@ fsl_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags) | |||
910 | req->req.actual = 0; | 911 | req->req.actual = 0; |
911 | req->dtd_count = 0; | 912 | req->dtd_count = 0; |
912 | 913 | ||
913 | spin_lock_irqsave(&udc->lock, flags); | ||
914 | |||
915 | /* build dtds and push them to device queue */ | 914 | /* build dtds and push them to device queue */ |
916 | if (!fsl_req_to_dtd(req)) { | 915 | if (!fsl_req_to_dtd(req, gfp_flags)) { |
916 | spin_lock_irqsave(&udc->lock, flags); | ||
917 | fsl_queue_td(ep, req); | 917 | fsl_queue_td(ep, req); |
918 | } else { | 918 | } else { |
919 | spin_unlock_irqrestore(&udc->lock, flags); | ||
920 | return -ENOMEM; | 919 | return -ENOMEM; |
921 | } | 920 | } |
922 | 921 | ||
@@ -1217,7 +1216,7 @@ static int fsl_vbus_draw(struct usb_gadget *gadget, unsigned mA) | |||
1217 | 1216 | ||
1218 | udc = container_of(gadget, struct fsl_udc, gadget); | 1217 | udc = container_of(gadget, struct fsl_udc, gadget); |
1219 | if (udc->transceiver) | 1218 | if (udc->transceiver) |
1220 | return otg_set_power(udc->transceiver, mA); | 1219 | return usb_phy_set_power(udc->transceiver, mA); |
1221 | return -ENOTSUPP; | 1220 | return -ENOTSUPP; |
1222 | } | 1221 | } |
1223 | 1222 | ||
@@ -1295,7 +1294,7 @@ static int ep0_prime_status(struct fsl_udc *udc, int direction) | |||
1295 | ep_is_in(ep) ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | 1294 | ep_is_in(ep) ? DMA_TO_DEVICE : DMA_FROM_DEVICE); |
1296 | req->mapped = 1; | 1295 | req->mapped = 1; |
1297 | 1296 | ||
1298 | if (fsl_req_to_dtd(req) == 0) | 1297 | if (fsl_req_to_dtd(req, GFP_ATOMIC) == 0) |
1299 | fsl_queue_td(ep, req); | 1298 | fsl_queue_td(ep, req); |
1300 | else | 1299 | else |
1301 | return -ENOMEM; | 1300 | return -ENOMEM; |
@@ -1379,7 +1378,7 @@ static void ch9getstatus(struct fsl_udc *udc, u8 request_type, u16 value, | |||
1379 | req->mapped = 1; | 1378 | req->mapped = 1; |
1380 | 1379 | ||
1381 | /* prime the data phase */ | 1380 | /* prime the data phase */ |
1382 | if ((fsl_req_to_dtd(req) == 0)) | 1381 | if ((fsl_req_to_dtd(req, GFP_ATOMIC) == 0)) |
1383 | fsl_queue_td(ep, req); | 1382 | fsl_queue_td(ep, req); |
1384 | else /* no mem */ | 1383 | else /* no mem */ |
1385 | goto stall; | 1384 | goto stall; |
@@ -1966,7 +1965,8 @@ static int fsl_start(struct usb_gadget_driver *driver, | |||
1966 | 1965 | ||
1967 | /* connect to bus through transceiver */ | 1966 | /* connect to bus through transceiver */ |
1968 | if (udc_controller->transceiver) { | 1967 | if (udc_controller->transceiver) { |
1969 | retval = otg_set_peripheral(udc_controller->transceiver, | 1968 | retval = otg_set_peripheral( |
1969 | udc_controller->transceiver->otg, | ||
1970 | &udc_controller->gadget); | 1970 | &udc_controller->gadget); |
1971 | if (retval < 0) { | 1971 | if (retval < 0) { |
1972 | ERR("can't bind to transceiver\n"); | 1972 | ERR("can't bind to transceiver\n"); |
@@ -2006,7 +2006,7 @@ static int fsl_stop(struct usb_gadget_driver *driver) | |||
2006 | return -EINVAL; | 2006 | return -EINVAL; |
2007 | 2007 | ||
2008 | if (udc_controller->transceiver) | 2008 | if (udc_controller->transceiver) |
2009 | otg_set_peripheral(udc_controller->transceiver, NULL); | 2009 | otg_set_peripheral(udc_controller->transceiver->otg, NULL); |
2010 | 2010 | ||
2011 | /* stop DR, disable intr */ | 2011 | /* stop DR, disable intr */ |
2012 | dr_controller_stop(udc_controller); | 2012 | dr_controller_stop(udc_controller); |
@@ -2430,7 +2430,7 @@ static int __init fsl_udc_probe(struct platform_device *pdev) | |||
2430 | 2430 | ||
2431 | #ifdef CONFIG_USB_OTG | 2431 | #ifdef CONFIG_USB_OTG |
2432 | if (pdata->operating_mode == FSL_USB2_DR_OTG) { | 2432 | if (pdata->operating_mode == FSL_USB2_DR_OTG) { |
2433 | udc_controller->transceiver = otg_get_transceiver(); | 2433 | udc_controller->transceiver = usb_get_transceiver(); |
2434 | if (!udc_controller->transceiver) { | 2434 | if (!udc_controller->transceiver) { |
2435 | ERR("Can't find OTG driver!\n"); | 2435 | ERR("Can't find OTG driver!\n"); |
2436 | ret = -ENODEV; | 2436 | ret = -ENODEV; |
diff --git a/drivers/usb/gadget/fsl_usb2_udc.h b/drivers/usb/gadget/fsl_usb2_udc.h index f781f5dec417..e651469fd39b 100644 --- a/drivers/usb/gadget/fsl_usb2_udc.h +++ b/drivers/usb/gadget/fsl_usb2_udc.h | |||
@@ -471,7 +471,7 @@ struct fsl_udc { | |||
471 | 471 | ||
472 | struct usb_ctrlrequest local_setup_buff; | 472 | struct usb_ctrlrequest local_setup_buff; |
473 | spinlock_t lock; | 473 | spinlock_t lock; |
474 | struct otg_transceiver *transceiver; | 474 | struct usb_phy *transceiver; |
475 | unsigned softconnect:1; | 475 | unsigned softconnect:1; |
476 | unsigned vbus_active:1; | 476 | unsigned vbus_active:1; |
477 | unsigned stopped:1; | 477 | unsigned stopped:1; |
diff --git a/drivers/usb/gadget/g_ffs.c b/drivers/usb/gadget/g_ffs.c index 0519d77915ec..331cd6729d3c 100644 --- a/drivers/usb/gadget/g_ffs.c +++ b/drivers/usb/gadget/g_ffs.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * g_ffs.c -- user mode file system API for USB composite function controllers | 2 | * g_ffs.c -- user mode file system API for USB composite function controllers |
3 | * | 3 | * |
4 | * Copyright (C) 2010 Samsung Electronics | 4 | * Copyright (C) 2010 Samsung Electronics |
5 | * Author: Michal Nazarewicz <m.nazarewicz@samsung.com> | 5 | * Author: Michal Nazarewicz <mina86@mina86.com> |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License as published by | 8 | * it under the terms of the GNU General Public License as published by |
diff --git a/drivers/usb/gadget/goku_udc.c b/drivers/usb/gadget/goku_udc.c index 5af70fcce139..e1dfd32dc805 100644 --- a/drivers/usb/gadget/goku_udc.c +++ b/drivers/usb/gadget/goku_udc.c | |||
@@ -235,6 +235,7 @@ static void ep_reset(struct goku_udc_regs __iomem *regs, struct goku_ep *ep) | |||
235 | 235 | ||
236 | ep->ep.maxpacket = MAX_FIFO_SIZE; | 236 | ep->ep.maxpacket = MAX_FIFO_SIZE; |
237 | ep->desc = NULL; | 237 | ep->desc = NULL; |
238 | ep->ep.desc = NULL; | ||
238 | ep->stopped = 1; | 239 | ep->stopped = 1; |
239 | ep->irqs = 0; | 240 | ep->irqs = 0; |
240 | ep->dma = 0; | 241 | ep->dma = 0; |
@@ -310,12 +311,9 @@ done(struct goku_ep *ep, struct goku_request *req, int status) | |||
310 | status = req->req.status; | 311 | status = req->req.status; |
311 | 312 | ||
312 | dev = ep->dev; | 313 | dev = ep->dev; |
313 | if (req->mapped) { | 314 | |
314 | pci_unmap_single(dev->pdev, req->req.dma, req->req.length, | 315 | if (ep->dma) |
315 | ep->is_in ? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE); | 316 | usb_gadget_unmap_request(&dev->gadget, &req->req, ep->is_in); |
316 | req->req.dma = DMA_ADDR_INVALID; | ||
317 | req->mapped = 0; | ||
318 | } | ||
319 | 317 | ||
320 | #ifndef USB_TRACE | 318 | #ifndef USB_TRACE |
321 | if (status && status != -ESHUTDOWN) | 319 | if (status && status != -ESHUTDOWN) |
@@ -736,10 +734,11 @@ goku_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags) | |||
736 | return -EBUSY; | 734 | return -EBUSY; |
737 | 735 | ||
738 | /* set up dma mapping in case the caller didn't */ | 736 | /* set up dma mapping in case the caller didn't */ |
739 | if (ep->dma && _req->dma == DMA_ADDR_INVALID) { | 737 | if (ep->dma) { |
740 | _req->dma = pci_map_single(dev->pdev, _req->buf, _req->length, | 738 | status = usb_gadget_map_request(&dev->gadget, &req->req, |
741 | ep->is_in ? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE); | 739 | ep->is_in); |
742 | req->mapped = 1; | 740 | if (status) |
741 | return status; | ||
743 | } | 742 | } |
744 | 743 | ||
745 | #ifdef USB_TRACE | 744 | #ifdef USB_TRACE |
diff --git a/drivers/usb/gadget/hid.c b/drivers/usb/gadget/hid.c index f888c3ede860..3493adf064f5 100644 --- a/drivers/usb/gadget/hid.c +++ b/drivers/usb/gadget/hid.c | |||
@@ -60,9 +60,9 @@ static struct usb_device_descriptor device_desc = { | |||
60 | /* .bDeviceClass = USB_CLASS_COMM, */ | 60 | /* .bDeviceClass = USB_CLASS_COMM, */ |
61 | /* .bDeviceSubClass = 0, */ | 61 | /* .bDeviceSubClass = 0, */ |
62 | /* .bDeviceProtocol = 0, */ | 62 | /* .bDeviceProtocol = 0, */ |
63 | .bDeviceClass = 0xEF, | 63 | .bDeviceClass = USB_CLASS_PER_INTERFACE, |
64 | .bDeviceSubClass = 2, | 64 | .bDeviceSubClass = 0, |
65 | .bDeviceProtocol = 1, | 65 | .bDeviceProtocol = 0, |
66 | /* .bMaxPacketSize0 = f(hardware) */ | 66 | /* .bMaxPacketSize0 = f(hardware) */ |
67 | 67 | ||
68 | /* Vendor and product id can be overridden by module parameters. */ | 68 | /* Vendor and product id can be overridden by module parameters. */ |
diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c index ae04266dba1b..4f18a0e46070 100644 --- a/drivers/usb/gadget/inode.c +++ b/drivers/usb/gadget/inode.c | |||
@@ -1043,6 +1043,8 @@ ep0_read (struct file *fd, char __user *buf, size_t len, loff_t *ptr) | |||
1043 | // FIXME don't call this with the spinlock held ... | 1043 | // FIXME don't call this with the spinlock held ... |
1044 | if (copy_to_user (buf, dev->req->buf, len)) | 1044 | if (copy_to_user (buf, dev->req->buf, len)) |
1045 | retval = -EFAULT; | 1045 | retval = -EFAULT; |
1046 | else | ||
1047 | retval = len; | ||
1046 | clean_req (dev->gadget->ep0, dev->req); | 1048 | clean_req (dev->gadget->ep0, dev->req); |
1047 | /* NOTE userspace can't yet choose to stall */ | 1049 | /* NOTE userspace can't yet choose to stall */ |
1048 | } | 1050 | } |
diff --git a/drivers/usb/gadget/langwell_udc.c b/drivers/usb/gadget/langwell_udc.c index e2293c1588ee..edd52d963f14 100644 --- a/drivers/usb/gadget/langwell_udc.c +++ b/drivers/usb/gadget/langwell_udc.c | |||
@@ -401,16 +401,7 @@ static void done(struct langwell_ep *ep, struct langwell_request *req, | |||
401 | dma_pool_free(dev->dtd_pool, curr_dtd, curr_dtd->dtd_dma); | 401 | dma_pool_free(dev->dtd_pool, curr_dtd, curr_dtd->dtd_dma); |
402 | } | 402 | } |
403 | 403 | ||
404 | if (req->mapped) { | 404 | usb_gadget_unmap_request(&dev->gadget, &req->req, is_in(ep)); |
405 | dma_unmap_single(&dev->pdev->dev, | ||
406 | req->req.dma, req->req.length, | ||
407 | is_in(ep) ? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE); | ||
408 | req->req.dma = DMA_ADDR_INVALID; | ||
409 | req->mapped = 0; | ||
410 | } else | ||
411 | dma_sync_single_for_cpu(&dev->pdev->dev, req->req.dma, | ||
412 | req->req.length, | ||
413 | is_in(ep) ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | ||
414 | 405 | ||
415 | if (status != -ESHUTDOWN) | 406 | if (status != -ESHUTDOWN) |
416 | dev_dbg(&dev->pdev->dev, | 407 | dev_dbg(&dev->pdev->dev, |
@@ -487,6 +478,7 @@ static int langwell_ep_disable(struct usb_ep *_ep) | |||
487 | nuke(ep, -ESHUTDOWN); | 478 | nuke(ep, -ESHUTDOWN); |
488 | 479 | ||
489 | ep->desc = NULL; | 480 | ep->desc = NULL; |
481 | ep->ep.desc = NULL; | ||
490 | ep->stopped = 1; | 482 | ep->stopped = 1; |
491 | 483 | ||
492 | spin_unlock_irqrestore(&dev->lock, flags); | 484 | spin_unlock_irqrestore(&dev->lock, flags); |
@@ -749,7 +741,8 @@ static int langwell_ep_queue(struct usb_ep *_ep, struct usb_request *_req, | |||
749 | struct langwell_ep *ep; | 741 | struct langwell_ep *ep; |
750 | struct langwell_udc *dev; | 742 | struct langwell_udc *dev; |
751 | unsigned long flags; | 743 | unsigned long flags; |
752 | int is_iso = 0, zlflag = 0; | 744 | int is_iso = 0; |
745 | int ret; | ||
753 | 746 | ||
754 | /* always require a cpu-view buffer */ | 747 | /* always require a cpu-view buffer */ |
755 | req = container_of(_req, struct langwell_request, req); | 748 | req = container_of(_req, struct langwell_request, req); |
@@ -776,33 +769,10 @@ static int langwell_ep_queue(struct usb_ep *_ep, struct usb_request *_req, | |||
776 | if (unlikely(!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN)) | 769 | if (unlikely(!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN)) |
777 | return -ESHUTDOWN; | 770 | return -ESHUTDOWN; |
778 | 771 | ||
779 | /* set up dma mapping in case the caller didn't */ | 772 | /* set up dma mapping */ |
780 | if (_req->dma == DMA_ADDR_INVALID) { | 773 | ret = usb_gadget_map_request(&dev->gadget, &req->req, is_in(ep)); |
781 | /* WORKAROUND: WARN_ON(size == 0) */ | 774 | if (ret) |
782 | if (_req->length == 0) { | 775 | return ret; |
783 | dev_vdbg(&dev->pdev->dev, "req->length: 0->1\n"); | ||
784 | zlflag = 1; | ||
785 | _req->length++; | ||
786 | } | ||
787 | |||
788 | _req->dma = dma_map_single(&dev->pdev->dev, | ||
789 | _req->buf, _req->length, | ||
790 | is_in(ep) ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | ||
791 | if (zlflag && (_req->length == 1)) { | ||
792 | dev_vdbg(&dev->pdev->dev, "req->length: 1->0\n"); | ||
793 | zlflag = 0; | ||
794 | _req->length = 0; | ||
795 | } | ||
796 | |||
797 | req->mapped = 1; | ||
798 | dev_vdbg(&dev->pdev->dev, "req->mapped = 1\n"); | ||
799 | } else { | ||
800 | dma_sync_single_for_device(&dev->pdev->dev, | ||
801 | _req->dma, _req->length, | ||
802 | is_in(ep) ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | ||
803 | req->mapped = 0; | ||
804 | dev_vdbg(&dev->pdev->dev, "req->mapped = 0\n"); | ||
805 | } | ||
806 | 776 | ||
807 | dev_dbg(&dev->pdev->dev, | 777 | dev_dbg(&dev->pdev->dev, |
808 | "%s queue req %p, len %u, buf %p, dma 0x%08x\n", | 778 | "%s queue req %p, len %u, buf %p, dma 0x%08x\n", |
@@ -1261,9 +1231,9 @@ static int langwell_vbus_draw(struct usb_gadget *_gadget, unsigned mA) | |||
1261 | dev_vdbg(&dev->pdev->dev, "---> %s()\n", __func__); | 1231 | dev_vdbg(&dev->pdev->dev, "---> %s()\n", __func__); |
1262 | 1232 | ||
1263 | if (dev->transceiver) { | 1233 | if (dev->transceiver) { |
1264 | dev_vdbg(&dev->pdev->dev, "otg_set_power\n"); | 1234 | dev_vdbg(&dev->pdev->dev, "usb_phy_set_power\n"); |
1265 | dev_vdbg(&dev->pdev->dev, "<--- %s()\n", __func__); | 1235 | dev_vdbg(&dev->pdev->dev, "<--- %s()\n", __func__); |
1266 | return otg_set_power(dev->transceiver, mA); | 1236 | return usb_phy_set_power(dev->transceiver, mA); |
1267 | } | 1237 | } |
1268 | 1238 | ||
1269 | dev_vdbg(&dev->pdev->dev, "<--- %s()\n", __func__); | 1239 | dev_vdbg(&dev->pdev->dev, "<--- %s()\n", __func__); |
@@ -1906,7 +1876,7 @@ static int langwell_stop(struct usb_gadget *g, | |||
1906 | 1876 | ||
1907 | /* unbind OTG transceiver */ | 1877 | /* unbind OTG transceiver */ |
1908 | if (dev->transceiver) | 1878 | if (dev->transceiver) |
1909 | (void)otg_set_peripheral(dev->transceiver, 0); | 1879 | (void)otg_set_peripheral(dev->transceiver->otg, 0); |
1910 | 1880 | ||
1911 | /* disable interrupt and set controller to stop state */ | 1881 | /* disable interrupt and set controller to stop state */ |
1912 | langwell_udc_stop(dev); | 1882 | langwell_udc_stop(dev); |
diff --git a/drivers/usb/gadget/langwell_udc.h b/drivers/usb/gadget/langwell_udc.h index d6e78accaffe..8c8087abb481 100644 --- a/drivers/usb/gadget/langwell_udc.h +++ b/drivers/usb/gadget/langwell_udc.h | |||
@@ -162,7 +162,7 @@ struct langwell_udc { | |||
162 | spinlock_t lock; /* device lock */ | 162 | spinlock_t lock; /* device lock */ |
163 | struct langwell_ep *ep; | 163 | struct langwell_ep *ep; |
164 | struct usb_gadget_driver *driver; | 164 | struct usb_gadget_driver *driver; |
165 | struct otg_transceiver *transceiver; | 165 | struct usb_phy *transceiver; |
166 | u8 dev_addr; | 166 | u8 dev_addr; |
167 | u32 usb_state; | 167 | u32 usb_state; |
168 | u32 resume_state; | 168 | u32 resume_state; |
diff --git a/drivers/usb/gadget/mass_storage.c b/drivers/usb/gadget/mass_storage.c index e24f72f82a47..1f376eba31f6 100644 --- a/drivers/usb/gadget/mass_storage.c +++ b/drivers/usb/gadget/mass_storage.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 2003-2008 Alan Stern | 4 | * Copyright (C) 2003-2008 Alan Stern |
5 | * Copyright (C) 2009 Samsung Electronics | 5 | * Copyright (C) 2009 Samsung Electronics |
6 | * Author: Michal Nazarewicz <m.nazarewicz@samsung.com> | 6 | * Author: Michal Nazarewicz <mina86@mina86.com> |
7 | * All rights reserved. | 7 | * All rights reserved. |
8 | * | 8 | * |
9 | * This program is free software; you can redistribute it and/or modify | 9 | * This program is free software; you can redistribute it and/or modify |
diff --git a/drivers/usb/gadget/multi.c b/drivers/usb/gadget/multi.c index 7e7f515b8b19..c37fb33a3d1b 100644 --- a/drivers/usb/gadget/multi.c +++ b/drivers/usb/gadget/multi.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * Copyright (C) 2008 David Brownell | 4 | * Copyright (C) 2008 David Brownell |
5 | * Copyright (C) 2008 Nokia Corporation | 5 | * Copyright (C) 2008 Nokia Corporation |
6 | * Copyright (C) 2009 Samsung Electronics | 6 | * Copyright (C) 2009 Samsung Electronics |
7 | * Author: Michal Nazarewicz (m.nazarewicz@samsung.com) | 7 | * Author: Michal Nazarewicz (mina86@mina86.com) |
8 | * | 8 | * |
9 | * This program is free software; you can redistribute it and/or modify | 9 | * This program is free software; you can redistribute it and/or modify |
10 | * it under the terms of the GNU General Public License as published by | 10 | * it under the terms of the GNU General Public License as published by |
diff --git a/drivers/usb/gadget/mv_udc.h b/drivers/usb/gadget/mv_udc.h index 34aadfae723d..e2be9519abbe 100644 --- a/drivers/usb/gadget/mv_udc.h +++ b/drivers/usb/gadget/mv_udc.h | |||
@@ -217,7 +217,7 @@ struct mv_udc { | |||
217 | struct work_struct vbus_work; | 217 | struct work_struct vbus_work; |
218 | struct workqueue_struct *qwork; | 218 | struct workqueue_struct *qwork; |
219 | 219 | ||
220 | struct otg_transceiver *transceiver; | 220 | struct usb_phy *transceiver; |
221 | 221 | ||
222 | struct mv_usb_platform_data *pdata; | 222 | struct mv_usb_platform_data *pdata; |
223 | 223 | ||
diff --git a/drivers/usb/gadget/mv_udc_core.c b/drivers/usb/gadget/mv_udc_core.c index f97e737d26f7..19bbe80c2f8c 100644 --- a/drivers/usb/gadget/mv_udc_core.c +++ b/drivers/usb/gadget/mv_udc_core.c | |||
@@ -608,6 +608,7 @@ static int mv_ep_disable(struct usb_ep *_ep) | |||
608 | nuke(ep, -ESHUTDOWN); | 608 | nuke(ep, -ESHUTDOWN); |
609 | 609 | ||
610 | ep->desc = NULL; | 610 | ep->desc = NULL; |
611 | ep->ep.desc = NULL; | ||
611 | ep->stopped = 1; | 612 | ep->stopped = 1; |
612 | 613 | ||
613 | spin_unlock_irqrestore(&udc->lock, flags); | 614 | spin_unlock_irqrestore(&udc->lock, flags); |
@@ -771,8 +772,7 @@ mv_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags) | |||
771 | udc->ep0_state = DATA_STATE_XMIT; | 772 | udc->ep0_state = DATA_STATE_XMIT; |
772 | 773 | ||
773 | /* irq handler advances the queue */ | 774 | /* irq handler advances the queue */ |
774 | if (req != NULL) | 775 | list_add_tail(&req->queue, &ep->queue); |
775 | list_add_tail(&req->queue, &ep->queue); | ||
776 | spin_unlock_irqrestore(&udc->lock, flags); | 776 | spin_unlock_irqrestore(&udc->lock, flags); |
777 | 777 | ||
778 | return 0; | 778 | return 0; |
@@ -1384,7 +1384,8 @@ static int mv_udc_start(struct usb_gadget_driver *driver, | |||
1384 | } | 1384 | } |
1385 | 1385 | ||
1386 | if (udc->transceiver) { | 1386 | if (udc->transceiver) { |
1387 | retval = otg_set_peripheral(udc->transceiver, &udc->gadget); | 1387 | retval = otg_set_peripheral(udc->transceiver->otg, |
1388 | &udc->gadget); | ||
1388 | if (retval) { | 1389 | if (retval) { |
1389 | dev_err(&udc->dev->dev, | 1390 | dev_err(&udc->dev->dev, |
1390 | "unable to register peripheral to otg\n"); | 1391 | "unable to register peripheral to otg\n"); |
@@ -2181,7 +2182,7 @@ static int __devinit mv_udc_probe(struct platform_device *dev) | |||
2181 | 2182 | ||
2182 | #ifdef CONFIG_USB_OTG_UTILS | 2183 | #ifdef CONFIG_USB_OTG_UTILS |
2183 | if (pdata->mode == MV_USB_MODE_OTG) | 2184 | if (pdata->mode == MV_USB_MODE_OTG) |
2184 | udc->transceiver = otg_get_transceiver(); | 2185 | udc->transceiver = usb_get_transceiver(); |
2185 | #endif | 2186 | #endif |
2186 | 2187 | ||
2187 | udc->clknum = pdata->clknum; | 2188 | udc->clknum = pdata->clknum; |
diff --git a/drivers/usb/gadget/net2272.c b/drivers/usb/gadget/net2272.c index 7322d293213e..01ae56f47174 100644 --- a/drivers/usb/gadget/net2272.c +++ b/drivers/usb/gadget/net2272.c | |||
@@ -385,12 +385,9 @@ net2272_done(struct net2272_ep *ep, struct net2272_request *req, int status) | |||
385 | status = req->req.status; | 385 | status = req->req.status; |
386 | 386 | ||
387 | dev = ep->dev; | 387 | dev = ep->dev; |
388 | if (use_dma && req->mapped) { | 388 | if (use_dma && ep->dma) |
389 | dma_unmap_single(dev->dev, req->req.dma, req->req.length, | 389 | usb_gadget_unmap_request(&dev->gadget, &req->req, |
390 | ep->is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | 390 | ep->is_in); |
391 | req->req.dma = DMA_ADDR_INVALID; | ||
392 | req->mapped = 0; | ||
393 | } | ||
394 | 391 | ||
395 | if (status && status != -ESHUTDOWN) | 392 | if (status && status != -ESHUTDOWN) |
396 | dev_vdbg(dev->dev, "complete %s req %p stat %d len %u/%u buf %p\n", | 393 | dev_vdbg(dev->dev, "complete %s req %p stat %d len %u/%u buf %p\n", |
@@ -850,10 +847,11 @@ net2272_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags) | |||
850 | return -ESHUTDOWN; | 847 | return -ESHUTDOWN; |
851 | 848 | ||
852 | /* set up dma mapping in case the caller didn't */ | 849 | /* set up dma mapping in case the caller didn't */ |
853 | if (use_dma && ep->dma && _req->dma == DMA_ADDR_INVALID) { | 850 | if (use_dma && ep->dma) { |
854 | _req->dma = dma_map_single(dev->dev, _req->buf, _req->length, | 851 | status = usb_gadget_map_request(&dev->gadget, _req, |
855 | ep->is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | 852 | ep->is_in); |
856 | req->mapped = 1; | 853 | if (status) |
854 | return status; | ||
857 | } | 855 | } |
858 | 856 | ||
859 | dev_vdbg(dev->dev, "%s queue req %p, len %d buf %p dma %08llx %s\n", | 857 | dev_vdbg(dev->dev, "%s queue req %p, len %d buf %p dma %08llx %s\n", |
diff --git a/drivers/usb/gadget/net2280.c b/drivers/usb/gadget/net2280.c index cdedd1336745..a5ccabc37f30 100644 --- a/drivers/usb/gadget/net2280.c +++ b/drivers/usb/gadget/net2280.c | |||
@@ -806,12 +806,8 @@ done (struct net2280_ep *ep, struct net2280_request *req, int status) | |||
806 | status = req->req.status; | 806 | status = req->req.status; |
807 | 807 | ||
808 | dev = ep->dev; | 808 | dev = ep->dev; |
809 | if (req->mapped) { | 809 | if (ep->dma) |
810 | pci_unmap_single (dev->pdev, req->req.dma, req->req.length, | 810 | usb_gadget_unmap_request(&dev->gadget, &req->req, ep->is_in); |
811 | ep->is_in ? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE); | ||
812 | req->req.dma = DMA_ADDR_INVALID; | ||
813 | req->mapped = 0; | ||
814 | } | ||
815 | 811 | ||
816 | if (status && status != -ESHUTDOWN) | 812 | if (status && status != -ESHUTDOWN) |
817 | VDEBUG (dev, "complete %s req %p stat %d len %u/%u\n", | 813 | VDEBUG (dev, "complete %s req %p stat %d len %u/%u\n", |
@@ -857,10 +853,13 @@ net2280_queue (struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags) | |||
857 | return -EOPNOTSUPP; | 853 | return -EOPNOTSUPP; |
858 | 854 | ||
859 | /* set up dma mapping in case the caller didn't */ | 855 | /* set up dma mapping in case the caller didn't */ |
860 | if (ep->dma && _req->dma == DMA_ADDR_INVALID) { | 856 | if (ep->dma) { |
861 | _req->dma = pci_map_single (dev->pdev, _req->buf, _req->length, | 857 | int ret; |
862 | ep->is_in ? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE); | 858 | |
863 | req->mapped = 1; | 859 | ret = usb_gadget_map_request(&dev->gadget, _req, |
860 | ep->is_in); | ||
861 | if (ret) | ||
862 | return ret; | ||
864 | } | 863 | } |
865 | 864 | ||
866 | #if 0 | 865 | #if 0 |
diff --git a/drivers/usb/gadget/omap_udc.c b/drivers/usb/gadget/omap_udc.c index 576cd8578b45..b44830df593e 100644 --- a/drivers/usb/gadget/omap_udc.c +++ b/drivers/usb/gadget/omap_udc.c | |||
@@ -251,6 +251,7 @@ static int omap_ep_disable(struct usb_ep *_ep) | |||
251 | 251 | ||
252 | spin_lock_irqsave(&ep->udc->lock, flags); | 252 | spin_lock_irqsave(&ep->udc->lock, flags); |
253 | ep->desc = NULL; | 253 | ep->desc = NULL; |
254 | ep->ep.desc = NULL; | ||
254 | nuke (ep, -ESHUTDOWN); | 255 | nuke (ep, -ESHUTDOWN); |
255 | ep->ep.maxpacket = ep->maxpacket; | 256 | ep->ep.maxpacket = ep->maxpacket; |
256 | ep->has_dma = 0; | 257 | ep->has_dma = 0; |
@@ -1213,7 +1214,7 @@ static int omap_wakeup(struct usb_gadget *gadget) | |||
1213 | /* NOTE: non-OTG systems may use SRP TOO... */ | 1214 | /* NOTE: non-OTG systems may use SRP TOO... */ |
1214 | } else if (!(udc->devstat & UDC_ATT)) { | 1215 | } else if (!(udc->devstat & UDC_ATT)) { |
1215 | if (udc->transceiver) | 1216 | if (udc->transceiver) |
1216 | retval = otg_start_srp(udc->transceiver); | 1217 | retval = otg_start_srp(udc->transceiver->otg); |
1217 | } | 1218 | } |
1218 | spin_unlock_irqrestore(&udc->lock, flags); | 1219 | spin_unlock_irqrestore(&udc->lock, flags); |
1219 | 1220 | ||
@@ -1345,7 +1346,7 @@ static int omap_vbus_draw(struct usb_gadget *gadget, unsigned mA) | |||
1345 | 1346 | ||
1346 | udc = container_of(gadget, struct omap_udc, gadget); | 1347 | udc = container_of(gadget, struct omap_udc, gadget); |
1347 | if (udc->transceiver) | 1348 | if (udc->transceiver) |
1348 | return otg_set_power(udc->transceiver, mA); | 1349 | return usb_phy_set_power(udc->transceiver, mA); |
1349 | return -EOPNOTSUPP; | 1350 | return -EOPNOTSUPP; |
1350 | } | 1351 | } |
1351 | 1352 | ||
@@ -1839,11 +1840,13 @@ static void devstate_irq(struct omap_udc *udc, u16 irq_src) | |||
1839 | spin_lock(&udc->lock); | 1840 | spin_lock(&udc->lock); |
1840 | } | 1841 | } |
1841 | if (udc->transceiver) | 1842 | if (udc->transceiver) |
1842 | otg_set_suspend(udc->transceiver, 1); | 1843 | usb_phy_set_suspend( |
1844 | udc->transceiver, 1); | ||
1843 | } else { | 1845 | } else { |
1844 | VDBG("resume\n"); | 1846 | VDBG("resume\n"); |
1845 | if (udc->transceiver) | 1847 | if (udc->transceiver) |
1846 | otg_set_suspend(udc->transceiver, 0); | 1848 | usb_phy_set_suspend( |
1849 | udc->transceiver, 0); | ||
1847 | if (udc->gadget.speed == USB_SPEED_FULL | 1850 | if (udc->gadget.speed == USB_SPEED_FULL |
1848 | && udc->driver->resume) { | 1851 | && udc->driver->resume) { |
1849 | spin_unlock(&udc->lock); | 1852 | spin_unlock(&udc->lock); |
@@ -2154,7 +2157,8 @@ static int omap_udc_start(struct usb_gadget_driver *driver, | |||
2154 | 2157 | ||
2155 | /* connect to bus through transceiver */ | 2158 | /* connect to bus through transceiver */ |
2156 | if (udc->transceiver) { | 2159 | if (udc->transceiver) { |
2157 | status = otg_set_peripheral(udc->transceiver, &udc->gadget); | 2160 | status = otg_set_peripheral(udc->transceiver->otg, |
2161 | &udc->gadget); | ||
2158 | if (status < 0) { | 2162 | if (status < 0) { |
2159 | ERR("can't bind to transceiver\n"); | 2163 | ERR("can't bind to transceiver\n"); |
2160 | if (driver->unbind) { | 2164 | if (driver->unbind) { |
@@ -2200,7 +2204,7 @@ static int omap_udc_stop(struct usb_gadget_driver *driver) | |||
2200 | omap_vbus_session(&udc->gadget, 0); | 2204 | omap_vbus_session(&udc->gadget, 0); |
2201 | 2205 | ||
2202 | if (udc->transceiver) | 2206 | if (udc->transceiver) |
2203 | (void) otg_set_peripheral(udc->transceiver, NULL); | 2207 | (void) otg_set_peripheral(udc->transceiver->otg, NULL); |
2204 | else | 2208 | else |
2205 | pullup_disable(udc); | 2209 | pullup_disable(udc); |
2206 | 2210 | ||
@@ -2650,7 +2654,7 @@ static void omap_udc_release(struct device *dev) | |||
2650 | } | 2654 | } |
2651 | 2655 | ||
2652 | static int __init | 2656 | static int __init |
2653 | omap_udc_setup(struct platform_device *odev, struct otg_transceiver *xceiv) | 2657 | omap_udc_setup(struct platform_device *odev, struct usb_phy *xceiv) |
2654 | { | 2658 | { |
2655 | unsigned tmp, buf; | 2659 | unsigned tmp, buf; |
2656 | 2660 | ||
@@ -2790,7 +2794,7 @@ static int __init omap_udc_probe(struct platform_device *pdev) | |||
2790 | { | 2794 | { |
2791 | int status = -ENODEV; | 2795 | int status = -ENODEV; |
2792 | int hmc; | 2796 | int hmc; |
2793 | struct otg_transceiver *xceiv = NULL; | 2797 | struct usb_phy *xceiv = NULL; |
2794 | const char *type = NULL; | 2798 | const char *type = NULL; |
2795 | struct omap_usb_config *config = pdev->dev.platform_data; | 2799 | struct omap_usb_config *config = pdev->dev.platform_data; |
2796 | struct clk *dc_clk; | 2800 | struct clk *dc_clk; |
@@ -2863,7 +2867,7 @@ static int __init omap_udc_probe(struct platform_device *pdev) | |||
2863 | * use it. Except for OTG, we don't _need_ to talk to one; | 2867 | * use it. Except for OTG, we don't _need_ to talk to one; |
2864 | * but not having one probably means no VBUS detection. | 2868 | * but not having one probably means no VBUS detection. |
2865 | */ | 2869 | */ |
2866 | xceiv = otg_get_transceiver(); | 2870 | xceiv = usb_get_transceiver(); |
2867 | if (xceiv) | 2871 | if (xceiv) |
2868 | type = xceiv->label; | 2872 | type = xceiv->label; |
2869 | else if (config->otg) { | 2873 | else if (config->otg) { |
@@ -3009,7 +3013,7 @@ cleanup1: | |||
3009 | 3013 | ||
3010 | cleanup0: | 3014 | cleanup0: |
3011 | if (xceiv) | 3015 | if (xceiv) |
3012 | otg_put_transceiver(xceiv); | 3016 | usb_put_transceiver(xceiv); |
3013 | 3017 | ||
3014 | if (cpu_is_omap16xx() || cpu_is_omap24xx() || cpu_is_omap7xx()) { | 3018 | if (cpu_is_omap16xx() || cpu_is_omap24xx() || cpu_is_omap7xx()) { |
3015 | clk_disable(hhc_clk); | 3019 | clk_disable(hhc_clk); |
@@ -3039,7 +3043,7 @@ static int __exit omap_udc_remove(struct platform_device *pdev) | |||
3039 | 3043 | ||
3040 | pullup_disable(udc); | 3044 | pullup_disable(udc); |
3041 | if (udc->transceiver) { | 3045 | if (udc->transceiver) { |
3042 | otg_put_transceiver(udc->transceiver); | 3046 | usb_put_transceiver(udc->transceiver); |
3043 | udc->transceiver = NULL; | 3047 | udc->transceiver = NULL; |
3044 | } | 3048 | } |
3045 | omap_writew(0, UDC_SYSCON1); | 3049 | omap_writew(0, UDC_SYSCON1); |
diff --git a/drivers/usb/gadget/omap_udc.h b/drivers/usb/gadget/omap_udc.h index 29edc51b6b22..59d3b2213cb1 100644 --- a/drivers/usb/gadget/omap_udc.h +++ b/drivers/usb/gadget/omap_udc.h | |||
@@ -164,7 +164,7 @@ struct omap_udc { | |||
164 | struct omap_ep ep[32]; | 164 | struct omap_ep ep[32]; |
165 | u16 devstat; | 165 | u16 devstat; |
166 | u16 clr_halt; | 166 | u16 clr_halt; |
167 | struct otg_transceiver *transceiver; | 167 | struct usb_phy *transceiver; |
168 | struct list_head iso; | 168 | struct list_head iso; |
169 | unsigned softconnect:1; | 169 | unsigned softconnect:1; |
170 | unsigned vbus_active:1; | 170 | unsigned vbus_active:1; |
diff --git a/drivers/usb/gadget/pch_udc.c b/drivers/usb/gadget/pch_udc.c index a3fcaae4bc2a..65307064a6fd 100644 --- a/drivers/usb/gadget/pch_udc.c +++ b/drivers/usb/gadget/pch_udc.c | |||
@@ -15,6 +15,14 @@ | |||
15 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
16 | #include <linux/usb/ch9.h> | 16 | #include <linux/usb/ch9.h> |
17 | #include <linux/usb/gadget.h> | 17 | #include <linux/usb/gadget.h> |
18 | #include <linux/gpio.h> | ||
19 | #include <linux/irq.h> | ||
20 | |||
21 | /* GPIO port for VBUS detecting */ | ||
22 | static int vbus_gpio_port = -1; /* GPIO port number (-1:Not used) */ | ||
23 | |||
24 | #define PCH_VBUS_PERIOD 3000 /* VBUS polling period (msec) */ | ||
25 | #define PCH_VBUS_INTERVAL 10 /* VBUS polling interval (msec) */ | ||
18 | 26 | ||
19 | /* Address offset of Registers */ | 27 | /* Address offset of Registers */ |
20 | #define UDC_EP_REG_SHIFT 0x20 /* Offset to next EP */ | 28 | #define UDC_EP_REG_SHIFT 0x20 /* Offset to next EP */ |
@@ -296,6 +304,21 @@ struct pch_udc_ep { | |||
296 | }; | 304 | }; |
297 | 305 | ||
298 | /** | 306 | /** |
307 | * struct pch_vbus_gpio_data - Structure holding GPIO informaton | ||
308 | * for detecting VBUS | ||
309 | * @port: gpio port number | ||
310 | * @intr: gpio interrupt number | ||
311 | * @irq_work_fall Structure for WorkQueue | ||
312 | * @irq_work_rise Structure for WorkQueue | ||
313 | */ | ||
314 | struct pch_vbus_gpio_data { | ||
315 | int port; | ||
316 | int intr; | ||
317 | struct work_struct irq_work_fall; | ||
318 | struct work_struct irq_work_rise; | ||
319 | }; | ||
320 | |||
321 | /** | ||
299 | * struct pch_udc_dev - Structure holding complete information | 322 | * struct pch_udc_dev - Structure holding complete information |
300 | * of the PCH USB device | 323 | * of the PCH USB device |
301 | * @gadget: gadget driver data | 324 | * @gadget: gadget driver data |
@@ -311,6 +334,7 @@ struct pch_udc_ep { | |||
311 | * @registered: driver regsitered with system | 334 | * @registered: driver regsitered with system |
312 | * @suspended: driver in suspended state | 335 | * @suspended: driver in suspended state |
313 | * @connected: gadget driver associated | 336 | * @connected: gadget driver associated |
337 | * @vbus_session: required vbus_session state | ||
314 | * @set_cfg_not_acked: pending acknowledgement 4 setup | 338 | * @set_cfg_not_acked: pending acknowledgement 4 setup |
315 | * @waiting_zlp_ack: pending acknowledgement 4 ZLP | 339 | * @waiting_zlp_ack: pending acknowledgement 4 ZLP |
316 | * @data_requests: DMA pool for data requests | 340 | * @data_requests: DMA pool for data requests |
@@ -322,6 +346,7 @@ struct pch_udc_ep { | |||
322 | * @base_addr: for mapped device memory | 346 | * @base_addr: for mapped device memory |
323 | * @irq: IRQ line for the device | 347 | * @irq: IRQ line for the device |
324 | * @cfg_data: current cfg, intf, and alt in use | 348 | * @cfg_data: current cfg, intf, and alt in use |
349 | * @vbus_gpio: GPIO informaton for detecting VBUS | ||
325 | */ | 350 | */ |
326 | struct pch_udc_dev { | 351 | struct pch_udc_dev { |
327 | struct usb_gadget gadget; | 352 | struct usb_gadget gadget; |
@@ -337,6 +362,7 @@ struct pch_udc_dev { | |||
337 | registered:1, | 362 | registered:1, |
338 | suspended:1, | 363 | suspended:1, |
339 | connected:1, | 364 | connected:1, |
365 | vbus_session:1, | ||
340 | set_cfg_not_acked:1, | 366 | set_cfg_not_acked:1, |
341 | waiting_zlp_ack:1; | 367 | waiting_zlp_ack:1; |
342 | struct pci_pool *data_requests; | 368 | struct pci_pool *data_requests; |
@@ -347,7 +373,8 @@ struct pch_udc_dev { | |||
347 | unsigned long phys_addr; | 373 | unsigned long phys_addr; |
348 | void __iomem *base_addr; | 374 | void __iomem *base_addr; |
349 | unsigned irq; | 375 | unsigned irq; |
350 | struct pch_udc_cfg_data cfg_data; | 376 | struct pch_udc_cfg_data cfg_data; |
377 | struct pch_vbus_gpio_data vbus_gpio; | ||
351 | }; | 378 | }; |
352 | 379 | ||
353 | #define PCH_UDC_PCI_BAR 1 | 380 | #define PCH_UDC_PCI_BAR 1 |
@@ -554,6 +581,29 @@ static void pch_udc_clear_disconnect(struct pch_udc_dev *dev) | |||
554 | } | 581 | } |
555 | 582 | ||
556 | /** | 583 | /** |
584 | * pch_udc_reconnect() - This API initializes usb device controller, | ||
585 | * and clear the disconnect status. | ||
586 | * @dev: Reference to pch_udc_regs structure | ||
587 | */ | ||
588 | static void pch_udc_init(struct pch_udc_dev *dev); | ||
589 | static void pch_udc_reconnect(struct pch_udc_dev *dev) | ||
590 | { | ||
591 | pch_udc_init(dev); | ||
592 | |||
593 | /* enable device interrupts */ | ||
594 | /* pch_udc_enable_interrupts() */ | ||
595 | pch_udc_bit_clr(dev, UDC_DEVIRQMSK_ADDR, | ||
596 | UDC_DEVINT_UR | UDC_DEVINT_ENUM); | ||
597 | |||
598 | /* Clear the disconnect */ | ||
599 | pch_udc_bit_set(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RES); | ||
600 | pch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_SD); | ||
601 | mdelay(1); | ||
602 | /* Resume USB signalling */ | ||
603 | pch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RES); | ||
604 | } | ||
605 | |||
606 | /** | ||
557 | * pch_udc_vbus_session() - set or clearr the disconnect status. | 607 | * pch_udc_vbus_session() - set or clearr the disconnect status. |
558 | * @dev: Reference to pch_udc_regs structure | 608 | * @dev: Reference to pch_udc_regs structure |
559 | * @is_active: Parameter specifying the action | 609 | * @is_active: Parameter specifying the action |
@@ -563,10 +613,18 @@ static void pch_udc_clear_disconnect(struct pch_udc_dev *dev) | |||
563 | static inline void pch_udc_vbus_session(struct pch_udc_dev *dev, | 613 | static inline void pch_udc_vbus_session(struct pch_udc_dev *dev, |
564 | int is_active) | 614 | int is_active) |
565 | { | 615 | { |
566 | if (is_active) | 616 | if (is_active) { |
567 | pch_udc_clear_disconnect(dev); | 617 | pch_udc_reconnect(dev); |
568 | else | 618 | dev->vbus_session = 1; |
619 | } else { | ||
620 | if (dev->driver && dev->driver->disconnect) { | ||
621 | spin_unlock(&dev->lock); | ||
622 | dev->driver->disconnect(&dev->gadget); | ||
623 | spin_lock(&dev->lock); | ||
624 | } | ||
569 | pch_udc_set_disconnect(dev); | 625 | pch_udc_set_disconnect(dev); |
626 | dev->vbus_session = 0; | ||
627 | } | ||
570 | } | 628 | } |
571 | 629 | ||
572 | /** | 630 | /** |
@@ -1126,7 +1184,17 @@ static int pch_udc_pcd_pullup(struct usb_gadget *gadget, int is_on) | |||
1126 | if (!gadget) | 1184 | if (!gadget) |
1127 | return -EINVAL; | 1185 | return -EINVAL; |
1128 | dev = container_of(gadget, struct pch_udc_dev, gadget); | 1186 | dev = container_of(gadget, struct pch_udc_dev, gadget); |
1129 | pch_udc_vbus_session(dev, is_on); | 1187 | if (is_on) { |
1188 | pch_udc_reconnect(dev); | ||
1189 | } else { | ||
1190 | if (dev->driver && dev->driver->disconnect) { | ||
1191 | spin_unlock(&dev->lock); | ||
1192 | dev->driver->disconnect(&dev->gadget); | ||
1193 | spin_lock(&dev->lock); | ||
1194 | } | ||
1195 | pch_udc_set_disconnect(dev); | ||
1196 | } | ||
1197 | |||
1130 | return 0; | 1198 | return 0; |
1131 | } | 1199 | } |
1132 | 1200 | ||
@@ -1183,6 +1251,188 @@ static const struct usb_gadget_ops pch_udc_ops = { | |||
1183 | }; | 1251 | }; |
1184 | 1252 | ||
1185 | /** | 1253 | /** |
1254 | * pch_vbus_gpio_get_value() - This API gets value of GPIO port as VBUS status. | ||
1255 | * @dev: Reference to the driver structure | ||
1256 | * | ||
1257 | * Return value: | ||
1258 | * 1: VBUS is high | ||
1259 | * 0: VBUS is low | ||
1260 | * -1: It is not enable to detect VBUS using GPIO | ||
1261 | */ | ||
1262 | static int pch_vbus_gpio_get_value(struct pch_udc_dev *dev) | ||
1263 | { | ||
1264 | int vbus = 0; | ||
1265 | |||
1266 | if (dev->vbus_gpio.port) | ||
1267 | vbus = gpio_get_value(dev->vbus_gpio.port) ? 1 : 0; | ||
1268 | else | ||
1269 | vbus = -1; | ||
1270 | |||
1271 | return vbus; | ||
1272 | } | ||
1273 | |||
1274 | /** | ||
1275 | * pch_vbus_gpio_work_fall() - This API keeps watch on VBUS becoming Low. | ||
1276 | * If VBUS is Low, disconnect is processed | ||
1277 | * @irq_work: Structure for WorkQueue | ||
1278 | * | ||
1279 | */ | ||
1280 | static void pch_vbus_gpio_work_fall(struct work_struct *irq_work) | ||
1281 | { | ||
1282 | struct pch_vbus_gpio_data *vbus_gpio = container_of(irq_work, | ||
1283 | struct pch_vbus_gpio_data, irq_work_fall); | ||
1284 | struct pch_udc_dev *dev = | ||
1285 | container_of(vbus_gpio, struct pch_udc_dev, vbus_gpio); | ||
1286 | int vbus_saved = -1; | ||
1287 | int vbus; | ||
1288 | int count; | ||
1289 | |||
1290 | if (!dev->vbus_gpio.port) | ||
1291 | return; | ||
1292 | |||
1293 | for (count = 0; count < (PCH_VBUS_PERIOD / PCH_VBUS_INTERVAL); | ||
1294 | count++) { | ||
1295 | vbus = pch_vbus_gpio_get_value(dev); | ||
1296 | |||
1297 | if ((vbus_saved == vbus) && (vbus == 0)) { | ||
1298 | dev_dbg(&dev->pdev->dev, "VBUS fell"); | ||
1299 | if (dev->driver | ||
1300 | && dev->driver->disconnect) { | ||
1301 | dev->driver->disconnect( | ||
1302 | &dev->gadget); | ||
1303 | } | ||
1304 | if (dev->vbus_gpio.intr) | ||
1305 | pch_udc_init(dev); | ||
1306 | else | ||
1307 | pch_udc_reconnect(dev); | ||
1308 | return; | ||
1309 | } | ||
1310 | vbus_saved = vbus; | ||
1311 | mdelay(PCH_VBUS_INTERVAL); | ||
1312 | } | ||
1313 | } | ||
1314 | |||
1315 | /** | ||
1316 | * pch_vbus_gpio_work_rise() - This API checks VBUS is High. | ||
1317 | * If VBUS is High, connect is processed | ||
1318 | * @irq_work: Structure for WorkQueue | ||
1319 | * | ||
1320 | */ | ||
1321 | static void pch_vbus_gpio_work_rise(struct work_struct *irq_work) | ||
1322 | { | ||
1323 | struct pch_vbus_gpio_data *vbus_gpio = container_of(irq_work, | ||
1324 | struct pch_vbus_gpio_data, irq_work_rise); | ||
1325 | struct pch_udc_dev *dev = | ||
1326 | container_of(vbus_gpio, struct pch_udc_dev, vbus_gpio); | ||
1327 | int vbus; | ||
1328 | |||
1329 | if (!dev->vbus_gpio.port) | ||
1330 | return; | ||
1331 | |||
1332 | mdelay(PCH_VBUS_INTERVAL); | ||
1333 | vbus = pch_vbus_gpio_get_value(dev); | ||
1334 | |||
1335 | if (vbus == 1) { | ||
1336 | dev_dbg(&dev->pdev->dev, "VBUS rose"); | ||
1337 | pch_udc_reconnect(dev); | ||
1338 | return; | ||
1339 | } | ||
1340 | } | ||
1341 | |||
1342 | /** | ||
1343 | * pch_vbus_gpio_irq() - IRQ handler for GPIO intrerrupt for changing VBUS | ||
1344 | * @irq: Interrupt request number | ||
1345 | * @dev: Reference to the device structure | ||
1346 | * | ||
1347 | * Return codes: | ||
1348 | * 0: Success | ||
1349 | * -EINVAL: GPIO port is invalid or can't be initialized. | ||
1350 | */ | ||
1351 | static irqreturn_t pch_vbus_gpio_irq(int irq, void *data) | ||
1352 | { | ||
1353 | struct pch_udc_dev *dev = (struct pch_udc_dev *)data; | ||
1354 | |||
1355 | if (!dev->vbus_gpio.port || !dev->vbus_gpio.intr) | ||
1356 | return IRQ_NONE; | ||
1357 | |||
1358 | if (pch_vbus_gpio_get_value(dev)) | ||
1359 | schedule_work(&dev->vbus_gpio.irq_work_rise); | ||
1360 | else | ||
1361 | schedule_work(&dev->vbus_gpio.irq_work_fall); | ||
1362 | |||
1363 | return IRQ_HANDLED; | ||
1364 | } | ||
1365 | |||
1366 | /** | ||
1367 | * pch_vbus_gpio_init() - This API initializes GPIO port detecting VBUS. | ||
1368 | * @dev: Reference to the driver structure | ||
1369 | * @vbus_gpio Number of GPIO port to detect gpio | ||
1370 | * | ||
1371 | * Return codes: | ||
1372 | * 0: Success | ||
1373 | * -EINVAL: GPIO port is invalid or can't be initialized. | ||
1374 | */ | ||
1375 | static int pch_vbus_gpio_init(struct pch_udc_dev *dev, int vbus_gpio_port) | ||
1376 | { | ||
1377 | int err; | ||
1378 | int irq_num = 0; | ||
1379 | |||
1380 | dev->vbus_gpio.port = 0; | ||
1381 | dev->vbus_gpio.intr = 0; | ||
1382 | |||
1383 | if (vbus_gpio_port <= -1) | ||
1384 | return -EINVAL; | ||
1385 | |||
1386 | err = gpio_is_valid(vbus_gpio_port); | ||
1387 | if (!err) { | ||
1388 | pr_err("%s: gpio port %d is invalid\n", | ||
1389 | __func__, vbus_gpio_port); | ||
1390 | return -EINVAL; | ||
1391 | } | ||
1392 | |||
1393 | err = gpio_request(vbus_gpio_port, "pch_vbus"); | ||
1394 | if (err) { | ||
1395 | pr_err("%s: can't request gpio port %d, err: %d\n", | ||
1396 | __func__, vbus_gpio_port, err); | ||
1397 | return -EINVAL; | ||
1398 | } | ||
1399 | |||
1400 | dev->vbus_gpio.port = vbus_gpio_port; | ||
1401 | gpio_direction_input(vbus_gpio_port); | ||
1402 | INIT_WORK(&dev->vbus_gpio.irq_work_fall, pch_vbus_gpio_work_fall); | ||
1403 | |||
1404 | irq_num = gpio_to_irq(vbus_gpio_port); | ||
1405 | if (irq_num > 0) { | ||
1406 | irq_set_irq_type(irq_num, IRQ_TYPE_EDGE_BOTH); | ||
1407 | err = request_irq(irq_num, pch_vbus_gpio_irq, 0, | ||
1408 | "vbus_detect", dev); | ||
1409 | if (!err) { | ||
1410 | dev->vbus_gpio.intr = irq_num; | ||
1411 | INIT_WORK(&dev->vbus_gpio.irq_work_rise, | ||
1412 | pch_vbus_gpio_work_rise); | ||
1413 | } else { | ||
1414 | pr_err("%s: can't request irq %d, err: %d\n", | ||
1415 | __func__, irq_num, err); | ||
1416 | } | ||
1417 | } | ||
1418 | |||
1419 | return 0; | ||
1420 | } | ||
1421 | |||
1422 | /** | ||
1423 | * pch_vbus_gpio_free() - This API frees resources of GPIO port | ||
1424 | * @dev: Reference to the driver structure | ||
1425 | */ | ||
1426 | static void pch_vbus_gpio_free(struct pch_udc_dev *dev) | ||
1427 | { | ||
1428 | if (dev->vbus_gpio.intr) | ||
1429 | free_irq(dev->vbus_gpio.intr, dev); | ||
1430 | |||
1431 | if (dev->vbus_gpio.port) | ||
1432 | gpio_free(dev->vbus_gpio.port); | ||
1433 | } | ||
1434 | |||
1435 | /** | ||
1186 | * complete_req() - This API is invoked from the driver when processing | 1436 | * complete_req() - This API is invoked from the driver when processing |
1187 | * of a request is complete | 1437 | * of a request is complete |
1188 | * @ep: Reference to the endpoint structure | 1438 | * @ep: Reference to the endpoint structure |
@@ -1493,6 +1743,7 @@ static int pch_udc_pcd_ep_disable(struct usb_ep *usbep) | |||
1493 | pch_udc_ep_disable(ep); | 1743 | pch_udc_ep_disable(ep); |
1494 | pch_udc_disable_ep_interrupts(ep->dev, PCH_UDC_EPINT(ep->in, ep->num)); | 1744 | pch_udc_disable_ep_interrupts(ep->dev, PCH_UDC_EPINT(ep->in, ep->num)); |
1495 | ep->desc = NULL; | 1745 | ep->desc = NULL; |
1746 | ep->ep.desc = NULL; | ||
1496 | INIT_LIST_HEAD(&ep->queue); | 1747 | INIT_LIST_HEAD(&ep->queue); |
1497 | spin_unlock_irqrestore(&ep->dev->lock, iflags); | 1748 | spin_unlock_irqrestore(&ep->dev->lock, iflags); |
1498 | return 0; | 1749 | return 0; |
@@ -2335,8 +2586,11 @@ static void pch_udc_svc_ur_interrupt(struct pch_udc_dev *dev) | |||
2335 | /* Complete request queue */ | 2586 | /* Complete request queue */ |
2336 | empty_req_queue(ep); | 2587 | empty_req_queue(ep); |
2337 | } | 2588 | } |
2338 | if (dev->driver && dev->driver->disconnect) | 2589 | if (dev->driver && dev->driver->disconnect) { |
2590 | spin_unlock(&dev->lock); | ||
2339 | dev->driver->disconnect(&dev->gadget); | 2591 | dev->driver->disconnect(&dev->gadget); |
2592 | spin_lock(&dev->lock); | ||
2593 | } | ||
2340 | } | 2594 | } |
2341 | 2595 | ||
2342 | /** | 2596 | /** |
@@ -2371,6 +2625,11 @@ static void pch_udc_svc_enum_interrupt(struct pch_udc_dev *dev) | |||
2371 | pch_udc_set_dma(dev, DMA_DIR_TX); | 2625 | pch_udc_set_dma(dev, DMA_DIR_TX); |
2372 | pch_udc_set_dma(dev, DMA_DIR_RX); | 2626 | pch_udc_set_dma(dev, DMA_DIR_RX); |
2373 | pch_udc_ep_set_rrdy(&(dev->ep[UDC_EP0OUT_IDX])); | 2627 | pch_udc_ep_set_rrdy(&(dev->ep[UDC_EP0OUT_IDX])); |
2628 | |||
2629 | /* enable device interrupts */ | ||
2630 | pch_udc_enable_interrupts(dev, UDC_DEVINT_UR | UDC_DEVINT_US | | ||
2631 | UDC_DEVINT_ES | UDC_DEVINT_ENUM | | ||
2632 | UDC_DEVINT_SI | UDC_DEVINT_SC); | ||
2374 | } | 2633 | } |
2375 | 2634 | ||
2376 | /** | 2635 | /** |
@@ -2459,12 +2718,18 @@ static void pch_udc_svc_cfg_interrupt(struct pch_udc_dev *dev) | |||
2459 | */ | 2718 | */ |
2460 | static void pch_udc_dev_isr(struct pch_udc_dev *dev, u32 dev_intr) | 2719 | static void pch_udc_dev_isr(struct pch_udc_dev *dev, u32 dev_intr) |
2461 | { | 2720 | { |
2721 | int vbus; | ||
2722 | |||
2462 | /* USB Reset Interrupt */ | 2723 | /* USB Reset Interrupt */ |
2463 | if (dev_intr & UDC_DEVINT_UR) | 2724 | if (dev_intr & UDC_DEVINT_UR) { |
2464 | pch_udc_svc_ur_interrupt(dev); | 2725 | pch_udc_svc_ur_interrupt(dev); |
2726 | dev_dbg(&dev->pdev->dev, "USB_RESET\n"); | ||
2727 | } | ||
2465 | /* Enumeration Done Interrupt */ | 2728 | /* Enumeration Done Interrupt */ |
2466 | if (dev_intr & UDC_DEVINT_ENUM) | 2729 | if (dev_intr & UDC_DEVINT_ENUM) { |
2467 | pch_udc_svc_enum_interrupt(dev); | 2730 | pch_udc_svc_enum_interrupt(dev); |
2731 | dev_dbg(&dev->pdev->dev, "USB_ENUM\n"); | ||
2732 | } | ||
2468 | /* Set Interface Interrupt */ | 2733 | /* Set Interface Interrupt */ |
2469 | if (dev_intr & UDC_DEVINT_SI) | 2734 | if (dev_intr & UDC_DEVINT_SI) |
2470 | pch_udc_svc_intf_interrupt(dev); | 2735 | pch_udc_svc_intf_interrupt(dev); |
@@ -2472,8 +2737,30 @@ static void pch_udc_dev_isr(struct pch_udc_dev *dev, u32 dev_intr) | |||
2472 | if (dev_intr & UDC_DEVINT_SC) | 2737 | if (dev_intr & UDC_DEVINT_SC) |
2473 | pch_udc_svc_cfg_interrupt(dev); | 2738 | pch_udc_svc_cfg_interrupt(dev); |
2474 | /* USB Suspend interrupt */ | 2739 | /* USB Suspend interrupt */ |
2475 | if (dev_intr & UDC_DEVINT_US) | 2740 | if (dev_intr & UDC_DEVINT_US) { |
2741 | if (dev->driver | ||
2742 | && dev->driver->suspend) { | ||
2743 | spin_unlock(&dev->lock); | ||
2744 | dev->driver->suspend(&dev->gadget); | ||
2745 | spin_lock(&dev->lock); | ||
2746 | } | ||
2747 | |||
2748 | vbus = pch_vbus_gpio_get_value(dev); | ||
2749 | if ((dev->vbus_session == 0) | ||
2750 | && (vbus != 1)) { | ||
2751 | if (dev->driver && dev->driver->disconnect) { | ||
2752 | spin_unlock(&dev->lock); | ||
2753 | dev->driver->disconnect(&dev->gadget); | ||
2754 | spin_lock(&dev->lock); | ||
2755 | } | ||
2756 | pch_udc_reconnect(dev); | ||
2757 | } else if ((dev->vbus_session == 0) | ||
2758 | && (vbus == 1) | ||
2759 | && !dev->vbus_gpio.intr) | ||
2760 | schedule_work(&dev->vbus_gpio.irq_work_fall); | ||
2761 | |||
2476 | dev_dbg(&dev->pdev->dev, "USB_SUSPEND\n"); | 2762 | dev_dbg(&dev->pdev->dev, "USB_SUSPEND\n"); |
2763 | } | ||
2477 | /* Clear the SOF interrupt, if enabled */ | 2764 | /* Clear the SOF interrupt, if enabled */ |
2478 | if (dev_intr & UDC_DEVINT_SOF) | 2765 | if (dev_intr & UDC_DEVINT_SOF) |
2479 | dev_dbg(&dev->pdev->dev, "SOF\n"); | 2766 | dev_dbg(&dev->pdev->dev, "SOF\n"); |
@@ -2499,6 +2786,14 @@ static irqreturn_t pch_udc_isr(int irq, void *pdev) | |||
2499 | dev_intr = pch_udc_read_device_interrupts(dev); | 2786 | dev_intr = pch_udc_read_device_interrupts(dev); |
2500 | ep_intr = pch_udc_read_ep_interrupts(dev); | 2787 | ep_intr = pch_udc_read_ep_interrupts(dev); |
2501 | 2788 | ||
2789 | /* For a hot plug, this find that the controller is hung up. */ | ||
2790 | if (dev_intr == ep_intr) | ||
2791 | if (dev_intr == pch_udc_readl(dev, UDC_DEVCFG_ADDR)) { | ||
2792 | dev_dbg(&dev->pdev->dev, "UDC: Hung up\n"); | ||
2793 | /* The controller is reset */ | ||
2794 | pch_udc_writel(dev, UDC_SRST, UDC_SRST_ADDR); | ||
2795 | return IRQ_HANDLED; | ||
2796 | } | ||
2502 | if (dev_intr) | 2797 | if (dev_intr) |
2503 | /* Clear device interrupts */ | 2798 | /* Clear device interrupts */ |
2504 | pch_udc_write_device_interrupts(dev, dev_intr); | 2799 | pch_udc_write_device_interrupts(dev, dev_intr); |
@@ -2625,6 +2920,7 @@ static int pch_udc_pcd_init(struct pch_udc_dev *dev) | |||
2625 | { | 2920 | { |
2626 | pch_udc_init(dev); | 2921 | pch_udc_init(dev); |
2627 | pch_udc_pcd_reinit(dev); | 2922 | pch_udc_pcd_reinit(dev); |
2923 | pch_vbus_gpio_init(dev, vbus_gpio_port); | ||
2628 | return 0; | 2924 | return 0; |
2629 | } | 2925 | } |
2630 | 2926 | ||
@@ -2725,7 +3021,8 @@ static int pch_udc_start(struct usb_gadget_driver *driver, | |||
2725 | pch_udc_setup_ep0(dev); | 3021 | pch_udc_setup_ep0(dev); |
2726 | 3022 | ||
2727 | /* clear SD */ | 3023 | /* clear SD */ |
2728 | pch_udc_clear_disconnect(dev); | 3024 | if ((pch_vbus_gpio_get_value(dev) != 0) || !dev->vbus_gpio.intr) |
3025 | pch_udc_clear_disconnect(dev); | ||
2729 | 3026 | ||
2730 | dev->connected = 1; | 3027 | dev->connected = 1; |
2731 | return 0; | 3028 | return 0; |
@@ -2803,6 +3100,8 @@ static void pch_udc_remove(struct pci_dev *pdev) | |||
2803 | UDC_EP0OUT_BUFF_SIZE * 4, DMA_FROM_DEVICE); | 3100 | UDC_EP0OUT_BUFF_SIZE * 4, DMA_FROM_DEVICE); |
2804 | kfree(dev->ep0out_buf); | 3101 | kfree(dev->ep0out_buf); |
2805 | 3102 | ||
3103 | pch_vbus_gpio_free(dev); | ||
3104 | |||
2806 | pch_udc_exit(dev); | 3105 | pch_udc_exit(dev); |
2807 | 3106 | ||
2808 | if (dev->irq_registered) | 3107 | if (dev->irq_registered) |
@@ -2912,8 +3211,10 @@ static int pch_udc_probe(struct pci_dev *pdev, | |||
2912 | } | 3211 | } |
2913 | pch_udc = dev; | 3212 | pch_udc = dev; |
2914 | /* initialize the hardware */ | 3213 | /* initialize the hardware */ |
2915 | if (pch_udc_pcd_init(dev)) | 3214 | if (pch_udc_pcd_init(dev)) { |
3215 | retval = -ENODEV; | ||
2916 | goto finished; | 3216 | goto finished; |
3217 | } | ||
2917 | if (request_irq(pdev->irq, pch_udc_isr, IRQF_SHARED, KBUILD_MODNAME, | 3218 | if (request_irq(pdev->irq, pch_udc_isr, IRQF_SHARED, KBUILD_MODNAME, |
2918 | dev)) { | 3219 | dev)) { |
2919 | dev_err(&pdev->dev, "%s: request_irq(%d) fail\n", __func__, | 3220 | dev_err(&pdev->dev, "%s: request_irq(%d) fail\n", __func__, |
diff --git a/drivers/usb/gadget/pxa25x_udc.c b/drivers/usb/gadget/pxa25x_udc.c index dd470635f4f7..1b33634f2736 100644 --- a/drivers/usb/gadget/pxa25x_udc.c +++ b/drivers/usb/gadget/pxa25x_udc.c | |||
@@ -283,6 +283,7 @@ static int pxa25x_ep_disable (struct usb_ep *_ep) | |||
283 | pxa25x_ep_fifo_flush (_ep); | 283 | pxa25x_ep_fifo_flush (_ep); |
284 | 284 | ||
285 | ep->desc = NULL; | 285 | ep->desc = NULL; |
286 | ep->ep.desc = NULL; | ||
286 | ep->stopped = 1; | 287 | ep->stopped = 1; |
287 | 288 | ||
288 | local_irq_restore(flags); | 289 | local_irq_restore(flags); |
@@ -995,7 +996,7 @@ static int pxa25x_udc_vbus_draw(struct usb_gadget *_gadget, unsigned mA) | |||
995 | udc = container_of(_gadget, struct pxa25x_udc, gadget); | 996 | udc = container_of(_gadget, struct pxa25x_udc, gadget); |
996 | 997 | ||
997 | if (udc->transceiver) | 998 | if (udc->transceiver) |
998 | return otg_set_power(udc->transceiver, mA); | 999 | return usb_phy_set_power(udc->transceiver, mA); |
999 | return -EOPNOTSUPP; | 1000 | return -EOPNOTSUPP; |
1000 | } | 1001 | } |
1001 | 1002 | ||
@@ -1192,6 +1193,7 @@ static void udc_reinit(struct pxa25x_udc *dev) | |||
1192 | list_add_tail (&ep->ep.ep_list, &dev->gadget.ep_list); | 1193 | list_add_tail (&ep->ep.ep_list, &dev->gadget.ep_list); |
1193 | 1194 | ||
1194 | ep->desc = NULL; | 1195 | ep->desc = NULL; |
1196 | ep->ep.desc = NULL; | ||
1195 | ep->stopped = 0; | 1197 | ep->stopped = 0; |
1196 | INIT_LIST_HEAD (&ep->queue); | 1198 | INIT_LIST_HEAD (&ep->queue); |
1197 | ep->pio_irqs = 0; | 1199 | ep->pio_irqs = 0; |
@@ -1301,7 +1303,8 @@ fail: | |||
1301 | 1303 | ||
1302 | /* connect to bus through transceiver */ | 1304 | /* connect to bus through transceiver */ |
1303 | if (dev->transceiver) { | 1305 | if (dev->transceiver) { |
1304 | retval = otg_set_peripheral(dev->transceiver, &dev->gadget); | 1306 | retval = otg_set_peripheral(dev->transceiver->otg, |
1307 | &dev->gadget); | ||
1305 | if (retval) { | 1308 | if (retval) { |
1306 | DMSG("can't bind to transceiver\n"); | 1309 | DMSG("can't bind to transceiver\n"); |
1307 | if (driver->unbind) | 1310 | if (driver->unbind) |
@@ -1360,7 +1363,7 @@ static int pxa25x_stop(struct usb_gadget_driver *driver) | |||
1360 | local_irq_enable(); | 1363 | local_irq_enable(); |
1361 | 1364 | ||
1362 | if (dev->transceiver) | 1365 | if (dev->transceiver) |
1363 | (void) otg_set_peripheral(dev->transceiver, NULL); | 1366 | (void) otg_set_peripheral(dev->transceiver->otg, NULL); |
1364 | 1367 | ||
1365 | driver->unbind(&dev->gadget); | 1368 | driver->unbind(&dev->gadget); |
1366 | dev->gadget.dev.driver = NULL; | 1369 | dev->gadget.dev.driver = NULL; |
@@ -2159,7 +2162,7 @@ static int __init pxa25x_udc_probe(struct platform_device *pdev) | |||
2159 | dev->dev = &pdev->dev; | 2162 | dev->dev = &pdev->dev; |
2160 | dev->mach = pdev->dev.platform_data; | 2163 | dev->mach = pdev->dev.platform_data; |
2161 | 2164 | ||
2162 | dev->transceiver = otg_get_transceiver(); | 2165 | dev->transceiver = usb_get_transceiver(); |
2163 | 2166 | ||
2164 | if (gpio_is_valid(dev->mach->gpio_pullup)) { | 2167 | if (gpio_is_valid(dev->mach->gpio_pullup)) { |
2165 | if ((retval = gpio_request(dev->mach->gpio_pullup, | 2168 | if ((retval = gpio_request(dev->mach->gpio_pullup, |
@@ -2238,7 +2241,7 @@ lubbock_fail0: | |||
2238 | gpio_free(dev->mach->gpio_pullup); | 2241 | gpio_free(dev->mach->gpio_pullup); |
2239 | err_gpio_pullup: | 2242 | err_gpio_pullup: |
2240 | if (dev->transceiver) { | 2243 | if (dev->transceiver) { |
2241 | otg_put_transceiver(dev->transceiver); | 2244 | usb_put_transceiver(dev->transceiver); |
2242 | dev->transceiver = NULL; | 2245 | dev->transceiver = NULL; |
2243 | } | 2246 | } |
2244 | clk_put(dev->clk); | 2247 | clk_put(dev->clk); |
@@ -2280,7 +2283,7 @@ static int __exit pxa25x_udc_remove(struct platform_device *pdev) | |||
2280 | clk_put(dev->clk); | 2283 | clk_put(dev->clk); |
2281 | 2284 | ||
2282 | if (dev->transceiver) { | 2285 | if (dev->transceiver) { |
2283 | otg_put_transceiver(dev->transceiver); | 2286 | usb_put_transceiver(dev->transceiver); |
2284 | dev->transceiver = NULL; | 2287 | dev->transceiver = NULL; |
2285 | } | 2288 | } |
2286 | 2289 | ||
diff --git a/drivers/usb/gadget/pxa25x_udc.h b/drivers/usb/gadget/pxa25x_udc.h index 8eaf4e43726b..893e917f048e 100644 --- a/drivers/usb/gadget/pxa25x_udc.h +++ b/drivers/usb/gadget/pxa25x_udc.h | |||
@@ -119,7 +119,7 @@ struct pxa25x_udc { | |||
119 | struct device *dev; | 119 | struct device *dev; |
120 | struct clk *clk; | 120 | struct clk *clk; |
121 | struct pxa2xx_udc_mach_info *mach; | 121 | struct pxa2xx_udc_mach_info *mach; |
122 | struct otg_transceiver *transceiver; | 122 | struct usb_phy *transceiver; |
123 | u64 dma_mask; | 123 | u64 dma_mask; |
124 | struct pxa25x_ep ep [PXA_UDC_NUM_ENDPOINTS]; | 124 | struct pxa25x_ep ep [PXA_UDC_NUM_ENDPOINTS]; |
125 | 125 | ||
diff --git a/drivers/usb/gadget/pxa27x_udc.c b/drivers/usb/gadget/pxa27x_udc.c index f4c44eb806c3..98acb3ab9e17 100644 --- a/drivers/usb/gadget/pxa27x_udc.c +++ b/drivers/usb/gadget/pxa27x_udc.c | |||
@@ -1666,7 +1666,7 @@ static int pxa_udc_vbus_draw(struct usb_gadget *_gadget, unsigned mA) | |||
1666 | 1666 | ||
1667 | udc = to_gadget_udc(_gadget); | 1667 | udc = to_gadget_udc(_gadget); |
1668 | if (udc->transceiver) | 1668 | if (udc->transceiver) |
1669 | return otg_set_power(udc->transceiver, mA); | 1669 | return usb_phy_set_power(udc->transceiver, mA); |
1670 | return -EOPNOTSUPP; | 1670 | return -EOPNOTSUPP; |
1671 | } | 1671 | } |
1672 | 1672 | ||
@@ -1835,7 +1835,8 @@ static int pxa27x_udc_start(struct usb_gadget_driver *driver, | |||
1835 | driver->driver.name); | 1835 | driver->driver.name); |
1836 | 1836 | ||
1837 | if (udc->transceiver) { | 1837 | if (udc->transceiver) { |
1838 | retval = otg_set_peripheral(udc->transceiver, &udc->gadget); | 1838 | retval = otg_set_peripheral(udc->transceiver->otg, |
1839 | &udc->gadget); | ||
1839 | if (retval) { | 1840 | if (retval) { |
1840 | dev_err(udc->dev, "can't bind to transceiver\n"); | 1841 | dev_err(udc->dev, "can't bind to transceiver\n"); |
1841 | goto transceiver_fail; | 1842 | goto transceiver_fail; |
@@ -1908,7 +1909,7 @@ static int pxa27x_udc_stop(struct usb_gadget_driver *driver) | |||
1908 | driver->driver.name); | 1909 | driver->driver.name); |
1909 | 1910 | ||
1910 | if (udc->transceiver) | 1911 | if (udc->transceiver) |
1911 | return otg_set_peripheral(udc->transceiver, NULL); | 1912 | return otg_set_peripheral(udc->transceiver->otg, NULL); |
1912 | return 0; | 1913 | return 0; |
1913 | } | 1914 | } |
1914 | 1915 | ||
@@ -2463,7 +2464,7 @@ static int __init pxa_udc_probe(struct platform_device *pdev) | |||
2463 | 2464 | ||
2464 | udc->dev = &pdev->dev; | 2465 | udc->dev = &pdev->dev; |
2465 | udc->mach = pdev->dev.platform_data; | 2466 | udc->mach = pdev->dev.platform_data; |
2466 | udc->transceiver = otg_get_transceiver(); | 2467 | udc->transceiver = usb_get_transceiver(); |
2467 | 2468 | ||
2468 | gpio = udc->mach->gpio_pullup; | 2469 | gpio = udc->mach->gpio_pullup; |
2469 | if (gpio_is_valid(gpio)) { | 2470 | if (gpio_is_valid(gpio)) { |
@@ -2542,7 +2543,7 @@ static int __exit pxa_udc_remove(struct platform_device *_dev) | |||
2542 | if (gpio_is_valid(gpio)) | 2543 | if (gpio_is_valid(gpio)) |
2543 | gpio_free(gpio); | 2544 | gpio_free(gpio); |
2544 | 2545 | ||
2545 | otg_put_transceiver(udc->transceiver); | 2546 | usb_put_transceiver(udc->transceiver); |
2546 | 2547 | ||
2547 | udc->transceiver = NULL; | 2548 | udc->transceiver = NULL; |
2548 | platform_set_drvdata(_dev, NULL); | 2549 | platform_set_drvdata(_dev, NULL); |
diff --git a/drivers/usb/gadget/pxa27x_udc.h b/drivers/usb/gadget/pxa27x_udc.h index 7f4e8f424e80..a1d268c6f2cc 100644 --- a/drivers/usb/gadget/pxa27x_udc.h +++ b/drivers/usb/gadget/pxa27x_udc.h | |||
@@ -447,7 +447,7 @@ struct pxa_udc { | |||
447 | struct usb_gadget_driver *driver; | 447 | struct usb_gadget_driver *driver; |
448 | struct device *dev; | 448 | struct device *dev; |
449 | struct pxa2xx_udc_mach_info *mach; | 449 | struct pxa2xx_udc_mach_info *mach; |
450 | struct otg_transceiver *transceiver; | 450 | struct usb_phy *transceiver; |
451 | 451 | ||
452 | enum ep0_state ep0state; | 452 | enum ep0_state ep0state; |
453 | struct udc_stats stats; | 453 | struct udc_stats stats; |
diff --git a/drivers/usb/gadget/r8a66597-udc.c b/drivers/usb/gadget/r8a66597-udc.c index f5b8d215e1d5..c4401e7dd3a6 100644 --- a/drivers/usb/gadget/r8a66597-udc.c +++ b/drivers/usb/gadget/r8a66597-udc.c | |||
@@ -663,11 +663,7 @@ static int sudmac_alloc_channel(struct r8a66597 *r8a66597, | |||
663 | ep->fifoctr = D0FIFOCTR; | 663 | ep->fifoctr = D0FIFOCTR; |
664 | 664 | ||
665 | /* dma mapping */ | 665 | /* dma mapping */ |
666 | req->req.dma = dma_map_single(r8a66597_to_dev(ep->r8a66597), | 666 | return usb_gadget_map_request(&r8a66597->gadget, &req->req, dma->dir); |
667 | req->req.buf, req->req.length, | ||
668 | dma->dir ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | ||
669 | |||
670 | return 0; | ||
671 | } | 667 | } |
672 | 668 | ||
673 | static void sudmac_free_channel(struct r8a66597 *r8a66597, | 669 | static void sudmac_free_channel(struct r8a66597 *r8a66597, |
@@ -677,9 +673,7 @@ static void sudmac_free_channel(struct r8a66597 *r8a66597, | |||
677 | if (!r8a66597_is_sudmac(r8a66597)) | 673 | if (!r8a66597_is_sudmac(r8a66597)) |
678 | return; | 674 | return; |
679 | 675 | ||
680 | dma_unmap_single(r8a66597_to_dev(ep->r8a66597), | 676 | usb_gadget_unmap_request(&r8a66597->gadget, &req->req, ep->dma->dir); |
681 | req->req.dma, req->req.length, | ||
682 | ep->dma->dir ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | ||
683 | 677 | ||
684 | r8a66597_bclr(r8a66597, DREQE, ep->fifosel); | 678 | r8a66597_bclr(r8a66597, DREQE, ep->fifosel); |
685 | r8a66597_change_curpipe(r8a66597, 0, 0, ep->fifosel); | 679 | r8a66597_change_curpipe(r8a66597, 0, 0, ep->fifosel); |
diff --git a/drivers/usb/gadget/s3c-hsudc.c b/drivers/usb/gadget/s3c-hsudc.c index df8661d266cb..cef9b82ff911 100644 --- a/drivers/usb/gadget/s3c-hsudc.c +++ b/drivers/usb/gadget/s3c-hsudc.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/prefetch.h> | 30 | #include <linux/prefetch.h> |
31 | #include <linux/platform_data/s3c-hsudc.h> | 31 | #include <linux/platform_data/s3c-hsudc.h> |
32 | #include <linux/regulator/consumer.h> | 32 | #include <linux/regulator/consumer.h> |
33 | #include <linux/pm_runtime.h> | ||
33 | 34 | ||
34 | #include <mach/regs-s3c2443-clock.h> | 35 | #include <mach/regs-s3c2443-clock.h> |
35 | 36 | ||
@@ -145,7 +146,7 @@ struct s3c_hsudc { | |||
145 | struct usb_gadget_driver *driver; | 146 | struct usb_gadget_driver *driver; |
146 | struct device *dev; | 147 | struct device *dev; |
147 | struct s3c24xx_hsudc_platdata *pd; | 148 | struct s3c24xx_hsudc_platdata *pd; |
148 | struct otg_transceiver *transceiver; | 149 | struct usb_phy *transceiver; |
149 | struct regulator_bulk_data supplies[ARRAY_SIZE(s3c_hsudc_supply_names)]; | 150 | struct regulator_bulk_data supplies[ARRAY_SIZE(s3c_hsudc_supply_names)]; |
150 | spinlock_t lock; | 151 | spinlock_t lock; |
151 | void __iomem *regs; | 152 | void __iomem *regs; |
@@ -759,7 +760,7 @@ static int s3c_hsudc_ep_enable(struct usb_ep *_ep, | |||
759 | unsigned long flags; | 760 | unsigned long flags; |
760 | u32 ecr = 0; | 761 | u32 ecr = 0; |
761 | 762 | ||
762 | hsep = container_of(_ep, struct s3c_hsudc_ep, ep); | 763 | hsep = our_ep(_ep); |
763 | if (!_ep || !desc || hsep->desc || _ep->name == ep0name | 764 | if (!_ep || !desc || hsep->desc || _ep->name == ep0name |
764 | || desc->bDescriptorType != USB_DT_ENDPOINT | 765 | || desc->bDescriptorType != USB_DT_ENDPOINT |
765 | || hsep->bEndpointAddress != desc->bEndpointAddress | 766 | || hsep->bEndpointAddress != desc->bEndpointAddress |
@@ -816,6 +817,7 @@ static int s3c_hsudc_ep_disable(struct usb_ep *_ep) | |||
816 | s3c_hsudc_nuke_ep(hsep, -ESHUTDOWN); | 817 | s3c_hsudc_nuke_ep(hsep, -ESHUTDOWN); |
817 | 818 | ||
818 | hsep->desc = 0; | 819 | hsep->desc = 0; |
820 | hsep->ep.desc = NULL; | ||
819 | hsep->stopped = 1; | 821 | hsep->stopped = 1; |
820 | 822 | ||
821 | spin_unlock_irqrestore(&hsudc->lock, flags); | 823 | spin_unlock_irqrestore(&hsudc->lock, flags); |
@@ -853,7 +855,7 @@ static void s3c_hsudc_free_request(struct usb_ep *ep, struct usb_request *_req) | |||
853 | { | 855 | { |
854 | struct s3c_hsudc_req *hsreq; | 856 | struct s3c_hsudc_req *hsreq; |
855 | 857 | ||
856 | hsreq = container_of(_req, struct s3c_hsudc_req, req); | 858 | hsreq = our_req(_req); |
857 | WARN_ON(!list_empty(&hsreq->queue)); | 859 | WARN_ON(!list_empty(&hsreq->queue)); |
858 | kfree(hsreq); | 860 | kfree(hsreq); |
859 | } | 861 | } |
@@ -876,12 +878,12 @@ static int s3c_hsudc_queue(struct usb_ep *_ep, struct usb_request *_req, | |||
876 | u32 offset; | 878 | u32 offset; |
877 | u32 csr; | 879 | u32 csr; |
878 | 880 | ||
879 | hsreq = container_of(_req, struct s3c_hsudc_req, req); | 881 | hsreq = our_req(_req); |
880 | if ((!_req || !_req->complete || !_req->buf || | 882 | if ((!_req || !_req->complete || !_req->buf || |
881 | !list_empty(&hsreq->queue))) | 883 | !list_empty(&hsreq->queue))) |
882 | return -EINVAL; | 884 | return -EINVAL; |
883 | 885 | ||
884 | hsep = container_of(_ep, struct s3c_hsudc_ep, ep); | 886 | hsep = our_ep(_ep); |
885 | hsudc = hsep->dev; | 887 | hsudc = hsep->dev; |
886 | if (!hsudc->driver || hsudc->gadget.speed == USB_SPEED_UNKNOWN) | 888 | if (!hsudc->driver || hsudc->gadget.speed == USB_SPEED_UNKNOWN) |
887 | return -ESHUTDOWN; | 889 | return -ESHUTDOWN; |
@@ -935,7 +937,7 @@ static int s3c_hsudc_dequeue(struct usb_ep *_ep, struct usb_request *_req) | |||
935 | struct s3c_hsudc_req *hsreq; | 937 | struct s3c_hsudc_req *hsreq; |
936 | unsigned long flags; | 938 | unsigned long flags; |
937 | 939 | ||
938 | hsep = container_of(_ep, struct s3c_hsudc_ep, ep); | 940 | hsep = our_ep(_ep); |
939 | if (!_ep || hsep->ep.name == ep0name) | 941 | if (!_ep || hsep->ep.name == ep0name) |
940 | return -EINVAL; | 942 | return -EINVAL; |
941 | 943 | ||
@@ -1005,6 +1007,7 @@ static void s3c_hsudc_initep(struct s3c_hsudc *hsudc, | |||
1005 | hsep->ep.ops = &s3c_hsudc_ep_ops; | 1007 | hsep->ep.ops = &s3c_hsudc_ep_ops; |
1006 | hsep->fifo = hsudc->regs + S3C_BR(epnum); | 1008 | hsep->fifo = hsudc->regs + S3C_BR(epnum); |
1007 | hsep->desc = 0; | 1009 | hsep->desc = 0; |
1010 | hsep->ep.desc = NULL; | ||
1008 | hsep->stopped = 0; | 1011 | hsep->stopped = 0; |
1009 | hsep->wedge = 0; | 1012 | hsep->wedge = 0; |
1010 | 1013 | ||
@@ -1166,7 +1169,8 @@ static int s3c_hsudc_start(struct usb_gadget *gadget, | |||
1166 | 1169 | ||
1167 | /* connect to bus through transceiver */ | 1170 | /* connect to bus through transceiver */ |
1168 | if (hsudc->transceiver) { | 1171 | if (hsudc->transceiver) { |
1169 | ret = otg_set_peripheral(hsudc->transceiver, &hsudc->gadget); | 1172 | ret = otg_set_peripheral(hsudc->transceiver->otg, |
1173 | &hsudc->gadget); | ||
1170 | if (ret) { | 1174 | if (ret) { |
1171 | dev_err(hsudc->dev, "%s: can't bind to transceiver\n", | 1175 | dev_err(hsudc->dev, "%s: can't bind to transceiver\n", |
1172 | hsudc->gadget.name); | 1176 | hsudc->gadget.name); |
@@ -1178,6 +1182,9 @@ static int s3c_hsudc_start(struct usb_gadget *gadget, | |||
1178 | dev_info(hsudc->dev, "bound driver %s\n", driver->driver.name); | 1182 | dev_info(hsudc->dev, "bound driver %s\n", driver->driver.name); |
1179 | 1183 | ||
1180 | s3c_hsudc_reconfig(hsudc); | 1184 | s3c_hsudc_reconfig(hsudc); |
1185 | |||
1186 | pm_runtime_get_sync(hsudc->dev); | ||
1187 | |||
1181 | s3c_hsudc_init_phy(); | 1188 | s3c_hsudc_init_phy(); |
1182 | if (hsudc->pd->gpio_init) | 1189 | if (hsudc->pd->gpio_init) |
1183 | hsudc->pd->gpio_init(); | 1190 | hsudc->pd->gpio_init(); |
@@ -1208,13 +1215,16 @@ static int s3c_hsudc_stop(struct usb_gadget *gadget, | |||
1208 | hsudc->gadget.dev.driver = NULL; | 1215 | hsudc->gadget.dev.driver = NULL; |
1209 | hsudc->gadget.speed = USB_SPEED_UNKNOWN; | 1216 | hsudc->gadget.speed = USB_SPEED_UNKNOWN; |
1210 | s3c_hsudc_uninit_phy(); | 1217 | s3c_hsudc_uninit_phy(); |
1218 | |||
1219 | pm_runtime_put(hsudc->dev); | ||
1220 | |||
1211 | if (hsudc->pd->gpio_uninit) | 1221 | if (hsudc->pd->gpio_uninit) |
1212 | hsudc->pd->gpio_uninit(); | 1222 | hsudc->pd->gpio_uninit(); |
1213 | s3c_hsudc_stop_activity(hsudc); | 1223 | s3c_hsudc_stop_activity(hsudc); |
1214 | spin_unlock_irqrestore(&hsudc->lock, flags); | 1224 | spin_unlock_irqrestore(&hsudc->lock, flags); |
1215 | 1225 | ||
1216 | if (hsudc->transceiver) | 1226 | if (hsudc->transceiver) |
1217 | (void) otg_set_peripheral(hsudc->transceiver, NULL); | 1227 | (void) otg_set_peripheral(hsudc->transceiver->otg, NULL); |
1218 | 1228 | ||
1219 | disable_irq(hsudc->irq); | 1229 | disable_irq(hsudc->irq); |
1220 | 1230 | ||
@@ -1243,7 +1253,7 @@ static int s3c_hsudc_vbus_draw(struct usb_gadget *gadget, unsigned mA) | |||
1243 | return -ENODEV; | 1253 | return -ENODEV; |
1244 | 1254 | ||
1245 | if (hsudc->transceiver) | 1255 | if (hsudc->transceiver) |
1246 | return otg_set_power(hsudc->transceiver, mA); | 1256 | return usb_phy_set_power(hsudc->transceiver, mA); |
1247 | 1257 | ||
1248 | return -EOPNOTSUPP; | 1258 | return -EOPNOTSUPP; |
1249 | } | 1259 | } |
@@ -1275,7 +1285,7 @@ static int __devinit s3c_hsudc_probe(struct platform_device *pdev) | |||
1275 | hsudc->dev = dev; | 1285 | hsudc->dev = dev; |
1276 | hsudc->pd = pdev->dev.platform_data; | 1286 | hsudc->pd = pdev->dev.platform_data; |
1277 | 1287 | ||
1278 | hsudc->transceiver = otg_get_transceiver(); | 1288 | hsudc->transceiver = usb_get_transceiver(); |
1279 | 1289 | ||
1280 | for (i = 0; i < ARRAY_SIZE(hsudc->supplies); i++) | 1290 | for (i = 0; i < ARRAY_SIZE(hsudc->supplies); i++) |
1281 | hsudc->supplies[i].supply = s3c_hsudc_supply_names[i]; | 1291 | hsudc->supplies[i].supply = s3c_hsudc_supply_names[i]; |
@@ -1362,6 +1372,8 @@ static int __devinit s3c_hsudc_probe(struct platform_device *pdev) | |||
1362 | if (ret) | 1372 | if (ret) |
1363 | goto err_add_udc; | 1373 | goto err_add_udc; |
1364 | 1374 | ||
1375 | pm_runtime_enable(dev); | ||
1376 | |||
1365 | return 0; | 1377 | return 0; |
1366 | err_add_udc: | 1378 | err_add_udc: |
1367 | device_unregister(&hsudc->gadget.dev); | 1379 | device_unregister(&hsudc->gadget.dev); |
@@ -1377,7 +1389,7 @@ err_remap: | |||
1377 | release_mem_region(res->start, resource_size(res)); | 1389 | release_mem_region(res->start, resource_size(res)); |
1378 | err_res: | 1390 | err_res: |
1379 | if (hsudc->transceiver) | 1391 | if (hsudc->transceiver) |
1380 | otg_put_transceiver(hsudc->transceiver); | 1392 | usb_put_transceiver(hsudc->transceiver); |
1381 | 1393 | ||
1382 | regulator_bulk_free(ARRAY_SIZE(hsudc->supplies), hsudc->supplies); | 1394 | regulator_bulk_free(ARRAY_SIZE(hsudc->supplies), hsudc->supplies); |
1383 | err_supplies: | 1395 | err_supplies: |
diff --git a/drivers/usb/gadget/s3c2410_udc.c b/drivers/usb/gadget/s3c2410_udc.c index 3f87cb9344bb..ab9c65e2c1d5 100644 --- a/drivers/usb/gadget/s3c2410_udc.c +++ b/drivers/usb/gadget/s3c2410_udc.c | |||
@@ -1148,6 +1148,7 @@ static int s3c2410_udc_ep_disable(struct usb_ep *_ep) | |||
1148 | dprintk(DEBUG_NORMAL, "ep_disable: %s\n", _ep->name); | 1148 | dprintk(DEBUG_NORMAL, "ep_disable: %s\n", _ep->name); |
1149 | 1149 | ||
1150 | ep->desc = NULL; | 1150 | ep->desc = NULL; |
1151 | ep->ep.desc = NULL; | ||
1151 | ep->halted = 1; | 1152 | ep->halted = 1; |
1152 | 1153 | ||
1153 | s3c2410_udc_nuke (ep->dev, ep, -ESHUTDOWN); | 1154 | s3c2410_udc_nuke (ep->dev, ep, -ESHUTDOWN); |
@@ -1630,6 +1631,7 @@ static void s3c2410_udc_reinit(struct s3c2410_udc *dev) | |||
1630 | 1631 | ||
1631 | ep->dev = dev; | 1632 | ep->dev = dev; |
1632 | ep->desc = NULL; | 1633 | ep->desc = NULL; |
1634 | ep->ep.desc = NULL; | ||
1633 | ep->halted = 0; | 1635 | ep->halted = 0; |
1634 | INIT_LIST_HEAD (&ep->queue); | 1636 | INIT_LIST_HEAD (&ep->queue); |
1635 | } | 1637 | } |
diff --git a/drivers/usb/gadget/serial.c b/drivers/usb/gadget/serial.c index ad9e5b2df642..665c07422c26 100644 --- a/drivers/usb/gadget/serial.c +++ b/drivers/usb/gadget/serial.c | |||
@@ -242,7 +242,7 @@ static struct usb_composite_driver gserial_driver = { | |||
242 | .name = "g_serial", | 242 | .name = "g_serial", |
243 | .dev = &device_desc, | 243 | .dev = &device_desc, |
244 | .strings = dev_strings, | 244 | .strings = dev_strings, |
245 | .max_speed = USB_SPEED_HIGH, | 245 | .max_speed = USB_SPEED_SUPER, |
246 | }; | 246 | }; |
247 | 247 | ||
248 | static int __init init(void) | 248 | static int __init init(void) |
diff --git a/drivers/usb/gadget/storage_common.c b/drivers/usb/gadget/storage_common.c index 85ea14e2545e..8081ca3a70a2 100644 --- a/drivers/usb/gadget/storage_common.c +++ b/drivers/usb/gadget/storage_common.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 2003-2008 Alan Stern | 4 | * Copyright (C) 2003-2008 Alan Stern |
5 | * Copyeight (C) 2009 Samsung Electronics | 5 | * Copyeight (C) 2009 Samsung Electronics |
6 | * Author: Michal Nazarewicz (m.nazarewicz@samsung.com) | 6 | * Author: Michal Nazarewicz (mina86@mina86.com) |
7 | * | 7 | * |
8 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
@@ -145,48 +145,8 @@ | |||
145 | 145 | ||
146 | #endif /* DUMP_MSGS */ | 146 | #endif /* DUMP_MSGS */ |
147 | 147 | ||
148 | |||
149 | |||
150 | |||
151 | |||
152 | /*-------------------------------------------------------------------------*/ | 148 | /*-------------------------------------------------------------------------*/ |
153 | 149 | ||
154 | /* Bulk-only data structures */ | ||
155 | |||
156 | /* Command Block Wrapper */ | ||
157 | struct fsg_bulk_cb_wrap { | ||
158 | __le32 Signature; /* Contains 'USBC' */ | ||
159 | u32 Tag; /* Unique per command id */ | ||
160 | __le32 DataTransferLength; /* Size of the data */ | ||
161 | u8 Flags; /* Direction in bit 7 */ | ||
162 | u8 Lun; /* LUN (normally 0) */ | ||
163 | u8 Length; /* Of the CDB, <= MAX_COMMAND_SIZE */ | ||
164 | u8 CDB[16]; /* Command Data Block */ | ||
165 | }; | ||
166 | |||
167 | #define USB_BULK_CB_WRAP_LEN 31 | ||
168 | #define USB_BULK_CB_SIG 0x43425355 /* Spells out USBC */ | ||
169 | #define USB_BULK_IN_FLAG 0x80 | ||
170 | |||
171 | /* Command Status Wrapper */ | ||
172 | struct bulk_cs_wrap { | ||
173 | __le32 Signature; /* Should = 'USBS' */ | ||
174 | u32 Tag; /* Same as original command */ | ||
175 | __le32 Residue; /* Amount not transferred */ | ||
176 | u8 Status; /* See below */ | ||
177 | }; | ||
178 | |||
179 | #define USB_BULK_CS_WRAP_LEN 13 | ||
180 | #define USB_BULK_CS_SIG 0x53425355 /* Spells out 'USBS' */ | ||
181 | #define USB_STATUS_PASS 0 | ||
182 | #define USB_STATUS_FAIL 1 | ||
183 | #define USB_STATUS_PHASE_ERROR 2 | ||
184 | |||
185 | /* Bulk-only class specific requests */ | ||
186 | #define USB_BULK_RESET_REQUEST 0xff | ||
187 | #define USB_BULK_GET_MAX_LUN_REQUEST 0xfe | ||
188 | |||
189 | |||
190 | /* CBI Interrupt data structure */ | 150 | /* CBI Interrupt data structure */ |
191 | struct interrupt_data { | 151 | struct interrupt_data { |
192 | u8 bType; | 152 | u8 bType; |
diff --git a/drivers/usb/gadget/u_audio.c b/drivers/usb/gadget/u_uac1.c index 59ffe1ecf1c9..af9898982059 100644 --- a/drivers/usb/gadget/u_audio.c +++ b/drivers/usb/gadget/u_uac1.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * u_audio.c -- ALSA audio utilities for Gadget stack | 2 | * u_uac1.c -- ALSA audio utilities for Gadget stack |
3 | * | 3 | * |
4 | * Copyright (C) 2008 Bryan Wu <cooloney@kernel.org> | 4 | * Copyright (C) 2008 Bryan Wu <cooloney@kernel.org> |
5 | * Copyright (C) 2008 Analog Devices, Inc | 5 | * Copyright (C) 2008 Analog Devices, Inc |
@@ -17,7 +17,7 @@ | |||
17 | #include <linux/random.h> | 17 | #include <linux/random.h> |
18 | #include <linux/syscalls.h> | 18 | #include <linux/syscalls.h> |
19 | 19 | ||
20 | #include "u_audio.h" | 20 | #include "u_uac1.h" |
21 | 21 | ||
22 | /* | 22 | /* |
23 | * This component encapsulates the ALSA devices for USB audio gadget | 23 | * This component encapsulates the ALSA devices for USB audio gadget |
diff --git a/drivers/usb/gadget/u_audio.h b/drivers/usb/gadget/u_uac1.h index 08ffce3298e6..18c2e729faf6 100644 --- a/drivers/usb/gadget/u_audio.h +++ b/drivers/usb/gadget/u_uac1.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * u_audio.h -- interface to USB gadget "ALSA AUDIO" utilities | 2 | * u_uac1.h -- interface to USB gadget "ALSA AUDIO" utilities |
3 | * | 3 | * |
4 | * Copyright (C) 2008 Bryan Wu <cooloney@kernel.org> | 4 | * Copyright (C) 2008 Bryan Wu <cooloney@kernel.org> |
5 | * Copyright (C) 2008 Analog Devices, Inc | 5 | * Copyright (C) 2008 Analog Devices, Inc |
diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c index 0b0d12ccc487..56da49f31d6c 100644 --- a/drivers/usb/gadget/udc-core.c +++ b/drivers/usb/gadget/udc-core.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/device.h> | 22 | #include <linux/device.h> |
23 | #include <linux/list.h> | 23 | #include <linux/list.h> |
24 | #include <linux/err.h> | 24 | #include <linux/err.h> |
25 | #include <linux/dma-mapping.h> | ||
25 | 26 | ||
26 | #include <linux/usb/ch9.h> | 27 | #include <linux/usb/ch9.h> |
27 | #include <linux/usb/gadget.h> | 28 | #include <linux/usb/gadget.h> |
@@ -49,6 +50,57 @@ static DEFINE_MUTEX(udc_lock); | |||
49 | 50 | ||
50 | /* ------------------------------------------------------------------------- */ | 51 | /* ------------------------------------------------------------------------- */ |
51 | 52 | ||
53 | int usb_gadget_map_request(struct usb_gadget *gadget, | ||
54 | struct usb_request *req, int is_in) | ||
55 | { | ||
56 | if (req->length == 0) | ||
57 | return 0; | ||
58 | |||
59 | if (req->num_sgs) { | ||
60 | int mapped; | ||
61 | |||
62 | mapped = dma_map_sg(&gadget->dev, req->sg, req->num_sgs, | ||
63 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | ||
64 | if (mapped == 0) { | ||
65 | dev_err(&gadget->dev, "failed to map SGs\n"); | ||
66 | return -EFAULT; | ||
67 | } | ||
68 | |||
69 | req->num_mapped_sgs = mapped; | ||
70 | } else { | ||
71 | req->dma = dma_map_single(&gadget->dev, req->buf, req->length, | ||
72 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | ||
73 | |||
74 | if (dma_mapping_error(&gadget->dev, req->dma)) { | ||
75 | dev_err(&gadget->dev, "failed to map buffer\n"); | ||
76 | return -EFAULT; | ||
77 | } | ||
78 | } | ||
79 | |||
80 | return 0; | ||
81 | } | ||
82 | EXPORT_SYMBOL_GPL(usb_gadget_map_request); | ||
83 | |||
84 | void usb_gadget_unmap_request(struct usb_gadget *gadget, | ||
85 | struct usb_request *req, int is_in) | ||
86 | { | ||
87 | if (req->length == 0) | ||
88 | return; | ||
89 | |||
90 | if (req->num_mapped_sgs) { | ||
91 | dma_unmap_sg(&gadget->dev, req->sg, req->num_mapped_sgs, | ||
92 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | ||
93 | |||
94 | req->num_mapped_sgs = 0; | ||
95 | } else { | ||
96 | dma_unmap_single(&gadget->dev, req->dma, req->length, | ||
97 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | ||
98 | } | ||
99 | } | ||
100 | EXPORT_SYMBOL_GPL(usb_gadget_unmap_request); | ||
101 | |||
102 | /* ------------------------------------------------------------------------- */ | ||
103 | |||
52 | /** | 104 | /** |
53 | * usb_gadget_start - tells usb device controller to start up | 105 | * usb_gadget_start - tells usb device controller to start up |
54 | * @gadget: The gadget we want to get started | 106 | * @gadget: The gadget we want to get started |
diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index 353cdd488b93..f788eb86707c 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig | |||
@@ -27,6 +27,10 @@ config USB_XHCI_HCD | |||
27 | To compile this driver as a module, choose M here: the | 27 | To compile this driver as a module, choose M here: the |
28 | module will be called xhci-hcd. | 28 | module will be called xhci-hcd. |
29 | 29 | ||
30 | config USB_XHCI_PLATFORM | ||
31 | tristate | ||
32 | depends on USB_XHCI_HCD | ||
33 | |||
30 | config USB_XHCI_HCD_DEBUGGING | 34 | config USB_XHCI_HCD_DEBUGGING |
31 | bool "Debugging for the xHCI host controller" | 35 | bool "Debugging for the xHCI host controller" |
32 | depends on USB_XHCI_HCD | 36 | depends on USB_XHCI_HCD |
@@ -196,7 +200,7 @@ config USB_EHCI_S5P | |||
196 | 200 | ||
197 | config USB_EHCI_MV | 201 | config USB_EHCI_MV |
198 | bool "EHCI support for Marvell on-chip controller" | 202 | bool "EHCI support for Marvell on-chip controller" |
199 | depends on USB_EHCI_HCD | 203 | depends on USB_EHCI_HCD && (ARCH_PXA || ARCH_MMP) |
200 | select USB_EHCI_ROOT_HUB_TT | 204 | select USB_EHCI_ROOT_HUB_TT |
201 | ---help--- | 205 | ---help--- |
202 | Enables support for Marvell (including PXA and MMP series) on-chip | 206 | Enables support for Marvell (including PXA and MMP series) on-chip |
@@ -218,11 +222,15 @@ config USB_CNS3XXX_EHCI | |||
218 | support. | 222 | support. |
219 | 223 | ||
220 | config USB_EHCI_ATH79 | 224 | config USB_EHCI_ATH79 |
221 | bool "EHCI support for AR7XXX/AR9XXX SoCs" | 225 | bool "EHCI support for AR7XXX/AR9XXX SoCs (DEPRECATED)" |
222 | depends on USB_EHCI_HCD && (SOC_AR71XX || SOC_AR724X || SOC_AR913X || SOC_AR933X) | 226 | depends on USB_EHCI_HCD && (SOC_AR71XX || SOC_AR724X || SOC_AR913X || SOC_AR933X) |
223 | select USB_EHCI_ROOT_HUB_TT | 227 | select USB_EHCI_ROOT_HUB_TT |
228 | select USB_EHCI_HCD_PLATFORM | ||
224 | default y | 229 | default y |
225 | ---help--- | 230 | ---help--- |
231 | This option is deprecated now and the driver was removed, use | ||
232 | USB_EHCI_HCD_PLATFORM instead. | ||
233 | |||
226 | Enables support for the built-in EHCI controller present | 234 | Enables support for the built-in EHCI controller present |
227 | on the Atheros AR7XXX/AR9XXX SoCs. | 235 | on the Atheros AR7XXX/AR9XXX SoCs. |
228 | 236 | ||
@@ -312,10 +320,14 @@ config USB_OHCI_HCD_OMAP3 | |||
312 | OMAP3 and later chips. | 320 | OMAP3 and later chips. |
313 | 321 | ||
314 | config USB_OHCI_ATH79 | 322 | config USB_OHCI_ATH79 |
315 | bool "USB OHCI support for the Atheros AR71XX/AR7240 SoCs" | 323 | bool "USB OHCI support for the Atheros AR71XX/AR7240 SoCs (DEPRECATED)" |
316 | depends on USB_OHCI_HCD && (SOC_AR71XX || SOC_AR724X) | 324 | depends on USB_OHCI_HCD && (SOC_AR71XX || SOC_AR724X) |
325 | select USB_OHCI_HCD_PLATFORM | ||
317 | default y | 326 | default y |
318 | help | 327 | help |
328 | This option is deprecated now and the driver was removed, use | ||
329 | USB_OHCI_HCD_PLATFORM instead. | ||
330 | |||
319 | Enables support for the built-in OHCI controller present on the | 331 | Enables support for the built-in OHCI controller present on the |
320 | Atheros AR71XX/AR7240 SoCs. | 332 | Atheros AR71XX/AR7240 SoCs. |
321 | 333 | ||
@@ -393,6 +405,26 @@ config USB_CNS3XXX_OHCI | |||
393 | Enable support for the CNS3XXX SOC's on-chip OHCI controller. | 405 | Enable support for the CNS3XXX SOC's on-chip OHCI controller. |
394 | It is needed for low-speed USB 1.0 device support. | 406 | It is needed for low-speed USB 1.0 device support. |
395 | 407 | ||
408 | config USB_OHCI_HCD_PLATFORM | ||
409 | bool "Generic OHCI driver for a platform device" | ||
410 | depends on USB_OHCI_HCD && EXPERIMENTAL | ||
411 | default n | ||
412 | ---help--- | ||
413 | Adds an OHCI host driver for a generic platform device, which | ||
414 | provieds a memory space and an irq. | ||
415 | |||
416 | If unsure, say N. | ||
417 | |||
418 | config USB_EHCI_HCD_PLATFORM | ||
419 | bool "Generic EHCI driver for a platform device" | ||
420 | depends on USB_EHCI_HCD && EXPERIMENTAL | ||
421 | default n | ||
422 | ---help--- | ||
423 | Adds an EHCI host driver for a generic platform device, which | ||
424 | provieds a memory space and an irq. | ||
425 | |||
426 | If unsure, say N. | ||
427 | |||
396 | config USB_OHCI_BIG_ENDIAN_DESC | 428 | config USB_OHCI_BIG_ENDIAN_DESC |
397 | bool | 429 | bool |
398 | depends on USB_OHCI_HCD | 430 | depends on USB_OHCI_HCD |
@@ -606,10 +638,3 @@ config USB_OCTEON_OHCI | |||
606 | config USB_OCTEON2_COMMON | 638 | config USB_OCTEON2_COMMON |
607 | bool | 639 | bool |
608 | default y if USB_OCTEON_EHCI || USB_OCTEON_OHCI | 640 | default y if USB_OCTEON_EHCI || USB_OCTEON_OHCI |
609 | |||
610 | config USB_PXA168_EHCI | ||
611 | bool "Marvell PXA168 on-chip EHCI HCD support" | ||
612 | depends on USB_EHCI_HCD && ARCH_MMP | ||
613 | help | ||
614 | Enable support for Marvell PXA168 SoC's on-chip EHCI | ||
615 | host controller | ||
diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile index 7ca290fcb070..0982bcc140bd 100644 --- a/drivers/usb/host/Makefile +++ b/drivers/usb/host/Makefile | |||
@@ -15,6 +15,10 @@ xhci-hcd-y := xhci.o xhci-mem.o | |||
15 | xhci-hcd-y += xhci-ring.o xhci-hub.o xhci-dbg.o | 15 | xhci-hcd-y += xhci-ring.o xhci-hub.o xhci-dbg.o |
16 | xhci-hcd-$(CONFIG_PCI) += xhci-pci.o | 16 | xhci-hcd-$(CONFIG_PCI) += xhci-pci.o |
17 | 17 | ||
18 | ifneq ($(CONFIG_USB_XHCI_PLATFORM), ) | ||
19 | xhci-hcd-y += xhci-plat.o | ||
20 | endif | ||
21 | |||
18 | obj-$(CONFIG_USB_WHCI_HCD) += whci/ | 22 | obj-$(CONFIG_USB_WHCI_HCD) += whci/ |
19 | 23 | ||
20 | obj-$(CONFIG_PCI) += pci-quirks.o | 24 | obj-$(CONFIG_PCI) += pci-quirks.o |
diff --git a/drivers/usb/host/ehci-ath79.c b/drivers/usb/host/ehci-ath79.c deleted file mode 100644 index f1424f9bc363..000000000000 --- a/drivers/usb/host/ehci-ath79.c +++ /dev/null | |||
@@ -1,208 +0,0 @@ | |||
1 | /* | ||
2 | * Bus Glue for Atheros AR7XXX/AR9XXX built-in EHCI controller. | ||
3 | * | ||
4 | * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
6 | * | ||
7 | * Parts of this file are based on Atheros' 2.6.15 BSP | ||
8 | * Copyright (C) 2007 Atheros Communications, Inc. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify it | ||
11 | * under the terms of the GNU General Public License version 2 as published | ||
12 | * by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/platform_device.h> | ||
16 | |||
17 | enum { | ||
18 | EHCI_ATH79_IP_V1 = 0, | ||
19 | EHCI_ATH79_IP_V2, | ||
20 | }; | ||
21 | |||
22 | static const struct platform_device_id ehci_ath79_id_table[] = { | ||
23 | { | ||
24 | .name = "ar71xx-ehci", | ||
25 | .driver_data = EHCI_ATH79_IP_V1, | ||
26 | }, | ||
27 | { | ||
28 | .name = "ar724x-ehci", | ||
29 | .driver_data = EHCI_ATH79_IP_V2, | ||
30 | }, | ||
31 | { | ||
32 | .name = "ar913x-ehci", | ||
33 | .driver_data = EHCI_ATH79_IP_V2, | ||
34 | }, | ||
35 | { | ||
36 | .name = "ar933x-ehci", | ||
37 | .driver_data = EHCI_ATH79_IP_V2, | ||
38 | }, | ||
39 | { | ||
40 | /* terminating entry */ | ||
41 | }, | ||
42 | }; | ||
43 | |||
44 | MODULE_DEVICE_TABLE(platform, ehci_ath79_id_table); | ||
45 | |||
46 | static int ehci_ath79_init(struct usb_hcd *hcd) | ||
47 | { | ||
48 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
49 | struct platform_device *pdev = to_platform_device(hcd->self.controller); | ||
50 | const struct platform_device_id *id; | ||
51 | int ret; | ||
52 | |||
53 | id = platform_get_device_id(pdev); | ||
54 | if (!id) { | ||
55 | dev_err(hcd->self.controller, "missing device id\n"); | ||
56 | return -EINVAL; | ||
57 | } | ||
58 | |||
59 | switch (id->driver_data) { | ||
60 | case EHCI_ATH79_IP_V1: | ||
61 | ehci->has_synopsys_hc_bug = 1; | ||
62 | |||
63 | ehci->caps = hcd->regs; | ||
64 | ehci->regs = hcd->regs + | ||
65 | HC_LENGTH(ehci, | ||
66 | ehci_readl(ehci, &ehci->caps->hc_capbase)); | ||
67 | break; | ||
68 | |||
69 | case EHCI_ATH79_IP_V2: | ||
70 | hcd->has_tt = 1; | ||
71 | |||
72 | ehci->caps = hcd->regs + 0x100; | ||
73 | ehci->regs = hcd->regs + 0x100 + | ||
74 | HC_LENGTH(ehci, | ||
75 | ehci_readl(ehci, &ehci->caps->hc_capbase)); | ||
76 | break; | ||
77 | |||
78 | default: | ||
79 | BUG(); | ||
80 | } | ||
81 | |||
82 | dbg_hcs_params(ehci, "reset"); | ||
83 | dbg_hcc_params(ehci, "reset"); | ||
84 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | ||
85 | ehci->sbrn = 0x20; | ||
86 | |||
87 | ehci_reset(ehci); | ||
88 | |||
89 | ret = ehci_init(hcd); | ||
90 | if (ret) | ||
91 | return ret; | ||
92 | |||
93 | ehci_port_power(ehci, 0); | ||
94 | |||
95 | return 0; | ||
96 | } | ||
97 | |||
98 | static const struct hc_driver ehci_ath79_hc_driver = { | ||
99 | .description = hcd_name, | ||
100 | .product_desc = "Atheros built-in EHCI controller", | ||
101 | .hcd_priv_size = sizeof(struct ehci_hcd), | ||
102 | .irq = ehci_irq, | ||
103 | .flags = HCD_MEMORY | HCD_USB2, | ||
104 | |||
105 | .reset = ehci_ath79_init, | ||
106 | .start = ehci_run, | ||
107 | .stop = ehci_stop, | ||
108 | .shutdown = ehci_shutdown, | ||
109 | |||
110 | .urb_enqueue = ehci_urb_enqueue, | ||
111 | .urb_dequeue = ehci_urb_dequeue, | ||
112 | .endpoint_disable = ehci_endpoint_disable, | ||
113 | .endpoint_reset = ehci_endpoint_reset, | ||
114 | |||
115 | .get_frame_number = ehci_get_frame, | ||
116 | |||
117 | .hub_status_data = ehci_hub_status_data, | ||
118 | .hub_control = ehci_hub_control, | ||
119 | |||
120 | .relinquish_port = ehci_relinquish_port, | ||
121 | .port_handed_over = ehci_port_handed_over, | ||
122 | |||
123 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | ||
124 | }; | ||
125 | |||
126 | static int ehci_ath79_probe(struct platform_device *pdev) | ||
127 | { | ||
128 | struct usb_hcd *hcd; | ||
129 | struct resource *res; | ||
130 | int irq; | ||
131 | int ret; | ||
132 | |||
133 | if (usb_disabled()) | ||
134 | return -ENODEV; | ||
135 | |||
136 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
137 | if (!res) { | ||
138 | dev_dbg(&pdev->dev, "no IRQ specified\n"); | ||
139 | return -ENODEV; | ||
140 | } | ||
141 | irq = res->start; | ||
142 | |||
143 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
144 | if (!res) { | ||
145 | dev_dbg(&pdev->dev, "no base address specified\n"); | ||
146 | return -ENODEV; | ||
147 | } | ||
148 | |||
149 | hcd = usb_create_hcd(&ehci_ath79_hc_driver, &pdev->dev, | ||
150 | dev_name(&pdev->dev)); | ||
151 | if (!hcd) | ||
152 | return -ENOMEM; | ||
153 | |||
154 | hcd->rsrc_start = res->start; | ||
155 | hcd->rsrc_len = resource_size(res); | ||
156 | |||
157 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | ||
158 | dev_dbg(&pdev->dev, "controller already in use\n"); | ||
159 | ret = -EBUSY; | ||
160 | goto err_put_hcd; | ||
161 | } | ||
162 | |||
163 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); | ||
164 | if (!hcd->regs) { | ||
165 | dev_dbg(&pdev->dev, "error mapping memory\n"); | ||
166 | ret = -EFAULT; | ||
167 | goto err_release_region; | ||
168 | } | ||
169 | |||
170 | ret = usb_add_hcd(hcd, irq, IRQF_SHARED); | ||
171 | if (ret) | ||
172 | goto err_iounmap; | ||
173 | |||
174 | return 0; | ||
175 | |||
176 | err_iounmap: | ||
177 | iounmap(hcd->regs); | ||
178 | |||
179 | err_release_region: | ||
180 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
181 | err_put_hcd: | ||
182 | usb_put_hcd(hcd); | ||
183 | return ret; | ||
184 | } | ||
185 | |||
186 | static int ehci_ath79_remove(struct platform_device *pdev) | ||
187 | { | ||
188 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
189 | |||
190 | usb_remove_hcd(hcd); | ||
191 | iounmap(hcd->regs); | ||
192 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
193 | usb_put_hcd(hcd); | ||
194 | |||
195 | return 0; | ||
196 | } | ||
197 | |||
198 | static struct platform_driver ehci_ath79_driver = { | ||
199 | .probe = ehci_ath79_probe, | ||
200 | .remove = ehci_ath79_remove, | ||
201 | .id_table = ehci_ath79_id_table, | ||
202 | .driver = { | ||
203 | .owner = THIS_MODULE, | ||
204 | .name = "ath79-ehci", | ||
205 | } | ||
206 | }; | ||
207 | |||
208 | MODULE_ALIAS(PLATFORM_MODULE_PREFIX "ath79-ehci"); | ||
diff --git a/drivers/usb/host/ehci-dbg.c b/drivers/usb/host/ehci-dbg.c index d6d74d2e09f4..fd9109d7eb0e 100644 --- a/drivers/usb/host/ehci-dbg.c +++ b/drivers/usb/host/ehci-dbg.c | |||
@@ -107,7 +107,7 @@ static void dbg_hcc_params (struct ehci_hcd *ehci, char *label) | |||
107 | HCC_PER_PORT_CHANGE_EVENT(params) ? " ppce" : "", | 107 | HCC_PER_PORT_CHANGE_EVENT(params) ? " ppce" : "", |
108 | HCC_HW_PREFETCH(params) ? " hw prefetch" : "", | 108 | HCC_HW_PREFETCH(params) ? " hw prefetch" : "", |
109 | HCC_32FRAME_PERIODIC_LIST(params) ? | 109 | HCC_32FRAME_PERIODIC_LIST(params) ? |
110 | " 32 peridic list" : ""); | 110 | " 32 periodic list" : ""); |
111 | } | 111 | } |
112 | } | 112 | } |
113 | #else | 113 | #else |
diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index b556a72264d1..3e7345172e03 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c | |||
@@ -142,12 +142,12 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver, | |||
142 | if (pdata->operating_mode == FSL_USB2_DR_OTG) { | 142 | if (pdata->operating_mode == FSL_USB2_DR_OTG) { |
143 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 143 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
144 | 144 | ||
145 | ehci->transceiver = otg_get_transceiver(); | 145 | ehci->transceiver = usb_get_transceiver(); |
146 | dev_dbg(&pdev->dev, "hcd=0x%p ehci=0x%p, transceiver=0x%p\n", | 146 | dev_dbg(&pdev->dev, "hcd=0x%p ehci=0x%p, transceiver=0x%p\n", |
147 | hcd, ehci, ehci->transceiver); | 147 | hcd, ehci, ehci->transceiver); |
148 | 148 | ||
149 | if (ehci->transceiver) { | 149 | if (ehci->transceiver) { |
150 | retval = otg_set_host(ehci->transceiver, | 150 | retval = otg_set_host(ehci->transceiver->otg, |
151 | &ehci_to_hcd(ehci)->self); | 151 | &ehci_to_hcd(ehci)->self); |
152 | if (retval) { | 152 | if (retval) { |
153 | if (ehci->transceiver) | 153 | if (ehci->transceiver) |
@@ -194,7 +194,7 @@ static void usb_hcd_fsl_remove(struct usb_hcd *hcd, | |||
194 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 194 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
195 | 195 | ||
196 | if (ehci->transceiver) { | 196 | if (ehci->transceiver) { |
197 | otg_set_host(ehci->transceiver, NULL); | 197 | otg_set_host(ehci->transceiver->otg, NULL); |
198 | put_device(ehci->transceiver->dev); | 198 | put_device(ehci->transceiver->dev); |
199 | } | 199 | } |
200 | 200 | ||
@@ -216,6 +216,8 @@ static void ehci_fsl_setup_phy(struct ehci_hcd *ehci, | |||
216 | unsigned int port_offset) | 216 | unsigned int port_offset) |
217 | { | 217 | { |
218 | u32 portsc; | 218 | u32 portsc; |
219 | struct usb_hcd *hcd = ehci_to_hcd(ehci); | ||
220 | void __iomem *non_ehci = hcd->regs; | ||
219 | 221 | ||
220 | portsc = ehci_readl(ehci, &ehci->regs->port_status[port_offset]); | 222 | portsc = ehci_readl(ehci, &ehci->regs->port_status[port_offset]); |
221 | portsc &= ~(PORT_PTS_MSK | PORT_PTS_PTW); | 223 | portsc &= ~(PORT_PTS_MSK | PORT_PTS_PTW); |
@@ -231,6 +233,8 @@ static void ehci_fsl_setup_phy(struct ehci_hcd *ehci, | |||
231 | portsc |= PORT_PTS_PTW; | 233 | portsc |= PORT_PTS_PTW; |
232 | /* fall through */ | 234 | /* fall through */ |
233 | case FSL_USB2_PHY_UTMI: | 235 | case FSL_USB2_PHY_UTMI: |
236 | /* enable UTMI PHY */ | ||
237 | setbits32(non_ehci + FSL_SOC_USB_CTRL, CTRL_UTMI_PHY_EN); | ||
234 | portsc |= PORT_PTS_UTMI; | 238 | portsc |= PORT_PTS_UTMI; |
235 | break; | 239 | break; |
236 | case FSL_USB2_PHY_NONE: | 240 | case FSL_USB2_PHY_NONE: |
@@ -252,21 +256,18 @@ static void ehci_fsl_usb_setup(struct ehci_hcd *ehci) | |||
252 | if (pdata->have_sysif_regs) { | 256 | if (pdata->have_sysif_regs) { |
253 | temp = in_be32(non_ehci + FSL_SOC_USB_CTRL); | 257 | temp = in_be32(non_ehci + FSL_SOC_USB_CTRL); |
254 | out_be32(non_ehci + FSL_SOC_USB_CTRL, temp | 0x00000004); | 258 | out_be32(non_ehci + FSL_SOC_USB_CTRL, temp | 0x00000004); |
255 | out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0000001b); | ||
256 | } | ||
257 | 259 | ||
258 | #if defined(CONFIG_PPC32) && !defined(CONFIG_NOT_COHERENT_CACHE) | 260 | /* |
259 | /* | 261 | * Turn on cache snooping hardware, since some PowerPC platforms |
260 | * Turn on cache snooping hardware, since some PowerPC platforms | 262 | * wholly rely on hardware to deal with cache coherent |
261 | * wholly rely on hardware to deal with cache coherent | 263 | */ |
262 | */ | ||
263 | 264 | ||
264 | /* Setup Snooping for all the 4GB space */ | 265 | /* Setup Snooping for all the 4GB space */ |
265 | /* SNOOP1 starts from 0x0, size 2G */ | 266 | /* SNOOP1 starts from 0x0, size 2G */ |
266 | out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0 | SNOOP_SIZE_2GB); | 267 | out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0 | SNOOP_SIZE_2GB); |
267 | /* SNOOP2 starts from 0x80000000, size 2G */ | 268 | /* SNOOP2 starts from 0x80000000, size 2G */ |
268 | out_be32(non_ehci + FSL_SOC_USB_SNOOP2, 0x80000000 | SNOOP_SIZE_2GB); | 269 | out_be32(non_ehci + FSL_SOC_USB_SNOOP2, 0x80000000 | SNOOP_SIZE_2GB); |
269 | #endif | 270 | } |
270 | 271 | ||
271 | if ((pdata->operating_mode == FSL_USB2_DR_HOST) || | 272 | if ((pdata->operating_mode == FSL_USB2_DR_HOST) || |
272 | (pdata->operating_mode == FSL_USB2_DR_OTG)) | 273 | (pdata->operating_mode == FSL_USB2_DR_OTG)) |
@@ -316,7 +317,9 @@ static int ehci_fsl_setup(struct usb_hcd *hcd) | |||
316 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 317 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
317 | int retval; | 318 | int retval; |
318 | struct fsl_usb2_platform_data *pdata; | 319 | struct fsl_usb2_platform_data *pdata; |
320 | struct device *dev; | ||
319 | 321 | ||
322 | dev = hcd->self.controller; | ||
320 | pdata = hcd->self.controller->platform_data; | 323 | pdata = hcd->self.controller->platform_data; |
321 | ehci->big_endian_desc = pdata->big_endian_desc; | 324 | ehci->big_endian_desc = pdata->big_endian_desc; |
322 | ehci->big_endian_mmio = pdata->big_endian_mmio; | 325 | ehci->big_endian_mmio = pdata->big_endian_mmio; |
@@ -346,6 +349,16 @@ static int ehci_fsl_setup(struct usb_hcd *hcd) | |||
346 | 349 | ||
347 | ehci_reset(ehci); | 350 | ehci_reset(ehci); |
348 | 351 | ||
352 | if (of_device_is_compatible(dev->parent->of_node, | ||
353 | "fsl,mpc5121-usb2-dr")) { | ||
354 | /* | ||
355 | * set SBUSCFG:AHBBRST so that control msgs don't | ||
356 | * fail when doing heavy PATA writes. | ||
357 | */ | ||
358 | ehci_writel(ehci, SBUSCFG_INCR8, | ||
359 | hcd->regs + FSL_SOC_USB_SBUSCFG); | ||
360 | } | ||
361 | |||
349 | retval = ehci_fsl_reinit(ehci); | 362 | retval = ehci_fsl_reinit(ehci); |
350 | return retval; | 363 | return retval; |
351 | } | 364 | } |
@@ -469,6 +482,8 @@ static int ehci_fsl_mpc512x_drv_resume(struct device *dev) | |||
469 | ehci_writel(ehci, ISIPHYCTRL_PXE | ISIPHYCTRL_PHYE, | 482 | ehci_writel(ehci, ISIPHYCTRL_PXE | ISIPHYCTRL_PHYE, |
470 | hcd->regs + FSL_SOC_USB_ISIPHYCTRL); | 483 | hcd->regs + FSL_SOC_USB_ISIPHYCTRL); |
471 | 484 | ||
485 | ehci_writel(ehci, SBUSCFG_INCR8, hcd->regs + FSL_SOC_USB_SBUSCFG); | ||
486 | |||
472 | /* restore EHCI registers */ | 487 | /* restore EHCI registers */ |
473 | ehci_writel(ehci, pdata->pm_command, &ehci->regs->command); | 488 | ehci_writel(ehci, pdata->pm_command, &ehci->regs->command); |
474 | ehci_writel(ehci, pdata->pm_intr_enable, &ehci->regs->intr_enable); | 489 | ehci_writel(ehci, pdata->pm_intr_enable, &ehci->regs->intr_enable); |
diff --git a/drivers/usb/host/ehci-fsl.h b/drivers/usb/host/ehci-fsl.h index 491806221165..863fb0c080d7 100644 --- a/drivers/usb/host/ehci-fsl.h +++ b/drivers/usb/host/ehci-fsl.h | |||
@@ -19,6 +19,8 @@ | |||
19 | #define _EHCI_FSL_H | 19 | #define _EHCI_FSL_H |
20 | 20 | ||
21 | /* offsets for the non-ehci registers in the FSL SOC USB controller */ | 21 | /* offsets for the non-ehci registers in the FSL SOC USB controller */ |
22 | #define FSL_SOC_USB_SBUSCFG 0x90 | ||
23 | #define SBUSCFG_INCR8 0x02 /* INCR8, specified */ | ||
22 | #define FSL_SOC_USB_ULPIVP 0x170 | 24 | #define FSL_SOC_USB_ULPIVP 0x170 |
23 | #define FSL_SOC_USB_PORTSC1 0x184 | 25 | #define FSL_SOC_USB_PORTSC1 0x184 |
24 | #define PORT_PTS_MSK (3<<30) | 26 | #define PORT_PTS_MSK (3<<30) |
@@ -45,5 +47,7 @@ | |||
45 | #define FSL_SOC_USB_PRICTRL 0x40c /* NOTE: big-endian */ | 47 | #define FSL_SOC_USB_PRICTRL 0x40c /* NOTE: big-endian */ |
46 | #define FSL_SOC_USB_SICTRL 0x410 /* NOTE: big-endian */ | 48 | #define FSL_SOC_USB_SICTRL 0x410 /* NOTE: big-endian */ |
47 | #define FSL_SOC_USB_CTRL 0x500 /* NOTE: big-endian */ | 49 | #define FSL_SOC_USB_CTRL 0x500 /* NOTE: big-endian */ |
50 | #define CTRL_UTMI_PHY_EN (1<<9) | ||
51 | #define CTRL_PHY_CLK_VALID (1 << 17) | ||
48 | #define SNOOP_SIZE_2GB 0x1e | 52 | #define SNOOP_SIZE_2GB 0x1e |
49 | #endif /* _EHCI_FSL_H */ | 53 | #endif /* _EHCI_FSL_H */ |
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index a007a9fe0f87..aede6374e4b6 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
@@ -1351,21 +1351,11 @@ MODULE_LICENSE ("GPL"); | |||
1351 | #define PLATFORM_DRIVER s5p_ehci_driver | 1351 | #define PLATFORM_DRIVER s5p_ehci_driver |
1352 | #endif | 1352 | #endif |
1353 | 1353 | ||
1354 | #ifdef CONFIG_USB_EHCI_ATH79 | ||
1355 | #include "ehci-ath79.c" | ||
1356 | #define PLATFORM_DRIVER ehci_ath79_driver | ||
1357 | #endif | ||
1358 | |||
1359 | #ifdef CONFIG_SPARC_LEON | 1354 | #ifdef CONFIG_SPARC_LEON |
1360 | #include "ehci-grlib.c" | 1355 | #include "ehci-grlib.c" |
1361 | #define PLATFORM_DRIVER ehci_grlib_driver | 1356 | #define PLATFORM_DRIVER ehci_grlib_driver |
1362 | #endif | 1357 | #endif |
1363 | 1358 | ||
1364 | #ifdef CONFIG_USB_PXA168_EHCI | ||
1365 | #include "ehci-pxa168.c" | ||
1366 | #define PLATFORM_DRIVER ehci_pxa168_driver | ||
1367 | #endif | ||
1368 | |||
1369 | #ifdef CONFIG_CPU_XLR | 1359 | #ifdef CONFIG_CPU_XLR |
1370 | #include "ehci-xls.c" | 1360 | #include "ehci-xls.c" |
1371 | #define PLATFORM_DRIVER ehci_xls_driver | 1361 | #define PLATFORM_DRIVER ehci_xls_driver |
@@ -1376,6 +1366,16 @@ MODULE_LICENSE ("GPL"); | |||
1376 | #define PLATFORM_DRIVER ehci_mv_driver | 1366 | #define PLATFORM_DRIVER ehci_mv_driver |
1377 | #endif | 1367 | #endif |
1378 | 1368 | ||
1369 | #ifdef CONFIG_MACH_LOONGSON1 | ||
1370 | #include "ehci-ls1x.c" | ||
1371 | #define PLATFORM_DRIVER ehci_ls1x_driver | ||
1372 | #endif | ||
1373 | |||
1374 | #ifdef CONFIG_USB_EHCI_HCD_PLATFORM | ||
1375 | #include "ehci-platform.c" | ||
1376 | #define PLATFORM_DRIVER ehci_platform_driver | ||
1377 | #endif | ||
1378 | |||
1379 | #if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) && \ | 1379 | #if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) && \ |
1380 | !defined(PS3_SYSTEM_BUS_DRIVER) && !defined(OF_PLATFORM_DRIVER) && \ | 1380 | !defined(PS3_SYSTEM_BUS_DRIVER) && !defined(OF_PLATFORM_DRIVER) && \ |
1381 | !defined(XILINX_OF_PLATFORM_DRIVER) | 1381 | !defined(XILINX_OF_PLATFORM_DRIVER) |
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 77bbb2357e47..256fbd42e48c 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
@@ -107,7 +107,7 @@ static void ehci_handover_companion_ports(struct ehci_hcd *ehci) | |||
107 | ehci->owned_ports = 0; | 107 | ehci->owned_ports = 0; |
108 | } | 108 | } |
109 | 109 | ||
110 | static int ehci_port_change(struct ehci_hcd *ehci) | 110 | static int __maybe_unused ehci_port_change(struct ehci_hcd *ehci) |
111 | { | 111 | { |
112 | int i = HCS_N_PORTS(ehci->hcs_params); | 112 | int i = HCS_N_PORTS(ehci->hcs_params); |
113 | 113 | ||
@@ -727,7 +727,7 @@ static int ehci_hub_control ( | |||
727 | #ifdef CONFIG_USB_OTG | 727 | #ifdef CONFIG_USB_OTG |
728 | if ((hcd->self.otg_port == (wIndex + 1)) | 728 | if ((hcd->self.otg_port == (wIndex + 1)) |
729 | && hcd->self.b_hnp_enable) { | 729 | && hcd->self.b_hnp_enable) { |
730 | otg_start_hnp(ehci->transceiver); | 730 | otg_start_hnp(ehci->transceiver->otg); |
731 | break; | 731 | break; |
732 | } | 732 | } |
733 | #endif | 733 | #endif |
@@ -1076,7 +1076,8 @@ error_exit: | |||
1076 | return retval; | 1076 | return retval; |
1077 | } | 1077 | } |
1078 | 1078 | ||
1079 | static void ehci_relinquish_port(struct usb_hcd *hcd, int portnum) | 1079 | static void __maybe_unused ehci_relinquish_port(struct usb_hcd *hcd, |
1080 | int portnum) | ||
1080 | { | 1081 | { |
1081 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 1082 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
1082 | 1083 | ||
@@ -1085,7 +1086,8 @@ static void ehci_relinquish_port(struct usb_hcd *hcd, int portnum) | |||
1085 | set_owner(ehci, --portnum, PORT_OWNER); | 1086 | set_owner(ehci, --portnum, PORT_OWNER); |
1086 | } | 1087 | } |
1087 | 1088 | ||
1088 | static int ehci_port_handed_over(struct usb_hcd *hcd, int portnum) | 1089 | static int __maybe_unused ehci_port_handed_over(struct usb_hcd *hcd, |
1090 | int portnum) | ||
1089 | { | 1091 | { |
1090 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 1092 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
1091 | u32 __iomem *reg; | 1093 | u32 __iomem *reg; |
diff --git a/drivers/usb/host/ehci-ls1x.c b/drivers/usb/host/ehci-ls1x.c new file mode 100644 index 000000000000..a283e59709d6 --- /dev/null +++ b/drivers/usb/host/ehci-ls1x.c | |||
@@ -0,0 +1,159 @@ | |||
1 | /* | ||
2 | * Bus Glue for Loongson LS1X built-in EHCI controller. | ||
3 | * | ||
4 | * Copyright (c) 2012 Zhang, Keguang <keguang.zhang@gmail.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License version 2 as published | ||
8 | * by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | |||
12 | #include <linux/platform_device.h> | ||
13 | |||
14 | static int ehci_ls1x_reset(struct usb_hcd *hcd) | ||
15 | { | ||
16 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
17 | int ret; | ||
18 | |||
19 | ehci->caps = hcd->regs; | ||
20 | |||
21 | ret = ehci_setup(hcd); | ||
22 | if (ret) | ||
23 | return ret; | ||
24 | |||
25 | ehci_port_power(ehci, 0); | ||
26 | |||
27 | return 0; | ||
28 | } | ||
29 | |||
30 | static const struct hc_driver ehci_ls1x_hc_driver = { | ||
31 | .description = hcd_name, | ||
32 | .product_desc = "LOONGSON1 EHCI", | ||
33 | .hcd_priv_size = sizeof(struct ehci_hcd), | ||
34 | |||
35 | /* | ||
36 | * generic hardware linkage | ||
37 | */ | ||
38 | .irq = ehci_irq, | ||
39 | .flags = HCD_MEMORY | HCD_USB2, | ||
40 | |||
41 | /* | ||
42 | * basic lifecycle operations | ||
43 | */ | ||
44 | .reset = ehci_ls1x_reset, | ||
45 | .start = ehci_run, | ||
46 | .stop = ehci_stop, | ||
47 | .shutdown = ehci_shutdown, | ||
48 | |||
49 | /* | ||
50 | * managing i/o requests and associated device resources | ||
51 | */ | ||
52 | .urb_enqueue = ehci_urb_enqueue, | ||
53 | .urb_dequeue = ehci_urb_dequeue, | ||
54 | .endpoint_disable = ehci_endpoint_disable, | ||
55 | .endpoint_reset = ehci_endpoint_reset, | ||
56 | |||
57 | /* | ||
58 | * scheduling support | ||
59 | */ | ||
60 | .get_frame_number = ehci_get_frame, | ||
61 | |||
62 | /* | ||
63 | * root hub support | ||
64 | */ | ||
65 | .hub_status_data = ehci_hub_status_data, | ||
66 | .hub_control = ehci_hub_control, | ||
67 | .relinquish_port = ehci_relinquish_port, | ||
68 | .port_handed_over = ehci_port_handed_over, | ||
69 | |||
70 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | ||
71 | }; | ||
72 | |||
73 | static int ehci_hcd_ls1x_probe(struct platform_device *pdev) | ||
74 | { | ||
75 | struct usb_hcd *hcd; | ||
76 | struct resource *res; | ||
77 | int irq; | ||
78 | int ret; | ||
79 | |||
80 | pr_debug("initializing loongson1 ehci USB Controller\n"); | ||
81 | |||
82 | if (usb_disabled()) | ||
83 | return -ENODEV; | ||
84 | |||
85 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
86 | if (!res) { | ||
87 | dev_err(&pdev->dev, | ||
88 | "Found HC with no IRQ. Check %s setup!\n", | ||
89 | dev_name(&pdev->dev)); | ||
90 | return -ENODEV; | ||
91 | } | ||
92 | irq = res->start; | ||
93 | |||
94 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
95 | if (!res) { | ||
96 | dev_err(&pdev->dev, | ||
97 | "Found HC with no register addr. Check %s setup!\n", | ||
98 | dev_name(&pdev->dev)); | ||
99 | return -ENODEV; | ||
100 | } | ||
101 | |||
102 | hcd = usb_create_hcd(&ehci_ls1x_hc_driver, &pdev->dev, | ||
103 | dev_name(&pdev->dev)); | ||
104 | if (!hcd) | ||
105 | return -ENOMEM; | ||
106 | hcd->rsrc_start = res->start; | ||
107 | hcd->rsrc_len = resource_size(res); | ||
108 | |||
109 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | ||
110 | dev_dbg(&pdev->dev, "controller already in use\n"); | ||
111 | ret = -EBUSY; | ||
112 | goto err_put_hcd; | ||
113 | } | ||
114 | |||
115 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); | ||
116 | if (hcd->regs == NULL) { | ||
117 | dev_dbg(&pdev->dev, "error mapping memory\n"); | ||
118 | ret = -EFAULT; | ||
119 | goto err_release_region; | ||
120 | } | ||
121 | |||
122 | ret = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED); | ||
123 | if (ret) | ||
124 | goto err_iounmap; | ||
125 | |||
126 | return ret; | ||
127 | |||
128 | err_iounmap: | ||
129 | iounmap(hcd->regs); | ||
130 | err_release_region: | ||
131 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
132 | err_put_hcd: | ||
133 | usb_put_hcd(hcd); | ||
134 | return ret; | ||
135 | } | ||
136 | |||
137 | static int ehci_hcd_ls1x_remove(struct platform_device *pdev) | ||
138 | { | ||
139 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
140 | |||
141 | usb_remove_hcd(hcd); | ||
142 | iounmap(hcd->regs); | ||
143 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
144 | usb_put_hcd(hcd); | ||
145 | |||
146 | return 0; | ||
147 | } | ||
148 | |||
149 | static struct platform_driver ehci_ls1x_driver = { | ||
150 | .probe = ehci_hcd_ls1x_probe, | ||
151 | .remove = ehci_hcd_ls1x_remove, | ||
152 | .shutdown = usb_hcd_platform_shutdown, | ||
153 | .driver = { | ||
154 | .name = "ls1x-ehci", | ||
155 | .owner = THIS_MODULE, | ||
156 | }, | ||
157 | }; | ||
158 | |||
159 | MODULE_ALIAS(PLATFORM_MODULE_PREFIX "ls1x-ehci"); | ||
diff --git a/drivers/usb/host/ehci-msm.c b/drivers/usb/host/ehci-msm.c index 592d5f76803e..9803a55fd5f4 100644 --- a/drivers/usb/host/ehci-msm.c +++ b/drivers/usb/host/ehci-msm.c | |||
@@ -32,7 +32,7 @@ | |||
32 | 32 | ||
33 | #define MSM_USB_BASE (hcd->regs) | 33 | #define MSM_USB_BASE (hcd->regs) |
34 | 34 | ||
35 | static struct otg_transceiver *otg; | 35 | static struct usb_phy *phy; |
36 | 36 | ||
37 | static int ehci_msm_reset(struct usb_hcd *hcd) | 37 | static int ehci_msm_reset(struct usb_hcd *hcd) |
38 | { | 38 | { |
@@ -145,14 +145,14 @@ static int ehci_msm_probe(struct platform_device *pdev) | |||
145 | * powering up VBUS, mapping of registers address space and power | 145 | * powering up VBUS, mapping of registers address space and power |
146 | * management. | 146 | * management. |
147 | */ | 147 | */ |
148 | otg = otg_get_transceiver(); | 148 | phy = usb_get_transceiver(); |
149 | if (!otg) { | 149 | if (!phy) { |
150 | dev_err(&pdev->dev, "unable to find transceiver\n"); | 150 | dev_err(&pdev->dev, "unable to find transceiver\n"); |
151 | ret = -ENODEV; | 151 | ret = -ENODEV; |
152 | goto unmap; | 152 | goto unmap; |
153 | } | 153 | } |
154 | 154 | ||
155 | ret = otg_set_host(otg, &hcd->self); | 155 | ret = otg_set_host(phy->otg, &hcd->self); |
156 | if (ret < 0) { | 156 | if (ret < 0) { |
157 | dev_err(&pdev->dev, "unable to register with transceiver\n"); | 157 | dev_err(&pdev->dev, "unable to register with transceiver\n"); |
158 | goto put_transceiver; | 158 | goto put_transceiver; |
@@ -169,7 +169,7 @@ static int ehci_msm_probe(struct platform_device *pdev) | |||
169 | return 0; | 169 | return 0; |
170 | 170 | ||
171 | put_transceiver: | 171 | put_transceiver: |
172 | otg_put_transceiver(otg); | 172 | usb_put_transceiver(phy); |
173 | unmap: | 173 | unmap: |
174 | iounmap(hcd->regs); | 174 | iounmap(hcd->regs); |
175 | put_hcd: | 175 | put_hcd: |
@@ -186,8 +186,8 @@ static int __devexit ehci_msm_remove(struct platform_device *pdev) | |||
186 | pm_runtime_disable(&pdev->dev); | 186 | pm_runtime_disable(&pdev->dev); |
187 | pm_runtime_set_suspended(&pdev->dev); | 187 | pm_runtime_set_suspended(&pdev->dev); |
188 | 188 | ||
189 | otg_set_host(otg, NULL); | 189 | otg_set_host(phy->otg, NULL); |
190 | otg_put_transceiver(otg); | 190 | usb_put_transceiver(phy); |
191 | 191 | ||
192 | usb_put_hcd(hcd); | 192 | usb_put_hcd(hcd); |
193 | 193 | ||
diff --git a/drivers/usb/host/ehci-mv.c b/drivers/usb/host/ehci-mv.c index 52a604fb9321..a936bbcff8f4 100644 --- a/drivers/usb/host/ehci-mv.c +++ b/drivers/usb/host/ehci-mv.c | |||
@@ -28,7 +28,7 @@ struct ehci_hcd_mv { | |||
28 | void __iomem *cap_regs; | 28 | void __iomem *cap_regs; |
29 | void __iomem *op_regs; | 29 | void __iomem *op_regs; |
30 | 30 | ||
31 | struct otg_transceiver *otg; | 31 | struct usb_phy *otg; |
32 | 32 | ||
33 | struct mv_usb_platform_data *pdata; | 33 | struct mv_usb_platform_data *pdata; |
34 | 34 | ||
@@ -253,7 +253,7 @@ static int mv_ehci_probe(struct platform_device *pdev) | |||
253 | ehci_mv->mode = pdata->mode; | 253 | ehci_mv->mode = pdata->mode; |
254 | if (ehci_mv->mode == MV_USB_MODE_OTG) { | 254 | if (ehci_mv->mode == MV_USB_MODE_OTG) { |
255 | #ifdef CONFIG_USB_OTG_UTILS | 255 | #ifdef CONFIG_USB_OTG_UTILS |
256 | ehci_mv->otg = otg_get_transceiver(); | 256 | ehci_mv->otg = usb_get_transceiver(); |
257 | if (!ehci_mv->otg) { | 257 | if (!ehci_mv->otg) { |
258 | dev_err(&pdev->dev, | 258 | dev_err(&pdev->dev, |
259 | "unable to find transceiver\n"); | 259 | "unable to find transceiver\n"); |
@@ -261,7 +261,7 @@ static int mv_ehci_probe(struct platform_device *pdev) | |||
261 | goto err_disable_clk; | 261 | goto err_disable_clk; |
262 | } | 262 | } |
263 | 263 | ||
264 | retval = otg_set_host(ehci_mv->otg, &hcd->self); | 264 | retval = otg_set_host(ehci_mv->otg->otg, &hcd->self); |
265 | if (retval < 0) { | 265 | if (retval < 0) { |
266 | dev_err(&pdev->dev, | 266 | dev_err(&pdev->dev, |
267 | "unable to register with transceiver\n"); | 267 | "unable to register with transceiver\n"); |
@@ -303,7 +303,7 @@ err_set_vbus: | |||
303 | #ifdef CONFIG_USB_OTG_UTILS | 303 | #ifdef CONFIG_USB_OTG_UTILS |
304 | err_put_transceiver: | 304 | err_put_transceiver: |
305 | if (ehci_mv->otg) | 305 | if (ehci_mv->otg) |
306 | otg_put_transceiver(ehci_mv->otg); | 306 | usb_put_transceiver(ehci_mv->otg); |
307 | #endif | 307 | #endif |
308 | err_disable_clk: | 308 | err_disable_clk: |
309 | mv_ehci_disable(ehci_mv); | 309 | mv_ehci_disable(ehci_mv); |
@@ -332,8 +332,8 @@ static int mv_ehci_remove(struct platform_device *pdev) | |||
332 | usb_remove_hcd(hcd); | 332 | usb_remove_hcd(hcd); |
333 | 333 | ||
334 | if (ehci_mv->otg) { | 334 | if (ehci_mv->otg) { |
335 | otg_set_host(ehci_mv->otg, NULL); | 335 | otg_set_host(ehci_mv->otg->otg, NULL); |
336 | otg_put_transceiver(ehci_mv->otg); | 336 | usb_put_transceiver(ehci_mv->otg); |
337 | } | 337 | } |
338 | 338 | ||
339 | if (ehci_mv->mode == MV_USB_MODE_HOST) { | 339 | if (ehci_mv->mode == MV_USB_MODE_HOST) { |
diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c index 55978fcfa4b2..a797d51ecbe8 100644 --- a/drivers/usb/host/ehci-mxc.c +++ b/drivers/usb/host/ehci-mxc.c | |||
@@ -220,13 +220,13 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev) | |||
220 | /* Initialize the transceiver */ | 220 | /* Initialize the transceiver */ |
221 | if (pdata->otg) { | 221 | if (pdata->otg) { |
222 | pdata->otg->io_priv = hcd->regs + ULPI_VIEWPORT_OFFSET; | 222 | pdata->otg->io_priv = hcd->regs + ULPI_VIEWPORT_OFFSET; |
223 | ret = otg_init(pdata->otg); | 223 | ret = usb_phy_init(pdata->otg); |
224 | if (ret) { | 224 | if (ret) { |
225 | dev_err(dev, "unable to init transceiver, probably missing\n"); | 225 | dev_err(dev, "unable to init transceiver, probably missing\n"); |
226 | ret = -ENODEV; | 226 | ret = -ENODEV; |
227 | goto err_add; | 227 | goto err_add; |
228 | } | 228 | } |
229 | ret = otg_set_vbus(pdata->otg, 1); | 229 | ret = otg_set_vbus(pdata->otg->otg, 1); |
230 | if (ret) { | 230 | if (ret) { |
231 | dev_err(dev, "unable to enable vbus on transceiver\n"); | 231 | dev_err(dev, "unable to enable vbus on transceiver\n"); |
232 | goto err_add; | 232 | goto err_add; |
@@ -247,9 +247,11 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev) | |||
247 | * It's in violation of USB specs | 247 | * It's in violation of USB specs |
248 | */ | 248 | */ |
249 | if (machine_is_mx51_efikamx() || machine_is_mx51_efikasb()) { | 249 | if (machine_is_mx51_efikamx() || machine_is_mx51_efikasb()) { |
250 | flags = otg_io_read(pdata->otg, ULPI_OTG_CTRL); | 250 | flags = usb_phy_io_read(pdata->otg, |
251 | ULPI_OTG_CTRL); | ||
251 | flags |= ULPI_OTG_CTRL_CHRGVBUS; | 252 | flags |= ULPI_OTG_CTRL_CHRGVBUS; |
252 | ret = otg_io_write(pdata->otg, flags, ULPI_OTG_CTRL); | 253 | ret = usb_phy_io_write(pdata->otg, flags, |
254 | ULPI_OTG_CTRL); | ||
253 | if (ret) { | 255 | if (ret) { |
254 | dev_err(dev, "unable to set CHRVBUS\n"); | 256 | dev_err(dev, "unable to set CHRVBUS\n"); |
255 | goto err_add; | 257 | goto err_add; |
@@ -297,7 +299,7 @@ static int __exit ehci_mxc_drv_remove(struct platform_device *pdev) | |||
297 | pdata->exit(pdev); | 299 | pdata->exit(pdev); |
298 | 300 | ||
299 | if (pdata->otg) | 301 | if (pdata->otg) |
300 | otg_shutdown(pdata->otg); | 302 | usb_phy_shutdown(pdata->otg); |
301 | 303 | ||
302 | usb_remove_hcd(hcd); | 304 | usb_remove_hcd(hcd); |
303 | iounmap(hcd->regs); | 305 | iounmap(hcd->regs); |
diff --git a/drivers/usb/host/ehci-platform.c b/drivers/usb/host/ehci-platform.c new file mode 100644 index 000000000000..d238b4e24bb6 --- /dev/null +++ b/drivers/usb/host/ehci-platform.c | |||
@@ -0,0 +1,198 @@ | |||
1 | /* | ||
2 | * Generic platform ehci driver | ||
3 | * | ||
4 | * Copyright 2007 Steven Brown <sbrown@cortland.com> | ||
5 | * Copyright 2010-2012 Hauke Mehrtens <hauke@hauke-m.de> | ||
6 | * | ||
7 | * Derived from the ohci-ssb driver | ||
8 | * Copyright 2007 Michael Buesch <m@bues.ch> | ||
9 | * | ||
10 | * Derived from the EHCI-PCI driver | ||
11 | * Copyright (c) 2000-2004 by David Brownell | ||
12 | * | ||
13 | * Derived from the ohci-pci driver | ||
14 | * Copyright 1999 Roman Weissgaerber | ||
15 | * Copyright 2000-2002 David Brownell | ||
16 | * Copyright 1999 Linus Torvalds | ||
17 | * Copyright 1999 Gregory P. Smith | ||
18 | * | ||
19 | * Licensed under the GNU/GPL. See COPYING for details. | ||
20 | */ | ||
21 | #include <linux/platform_device.h> | ||
22 | #include <linux/usb/ehci_pdriver.h> | ||
23 | |||
24 | static int ehci_platform_reset(struct usb_hcd *hcd) | ||
25 | { | ||
26 | struct platform_device *pdev = to_platform_device(hcd->self.controller); | ||
27 | struct usb_ehci_pdata *pdata = pdev->dev.platform_data; | ||
28 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
29 | int retval; | ||
30 | |||
31 | hcd->has_tt = pdata->has_tt; | ||
32 | ehci->has_synopsys_hc_bug = pdata->has_synopsys_hc_bug; | ||
33 | ehci->big_endian_desc = pdata->big_endian_desc; | ||
34 | ehci->big_endian_mmio = pdata->big_endian_mmio; | ||
35 | |||
36 | ehci->caps = hcd->regs + pdata->caps_offset; | ||
37 | retval = ehci_setup(hcd); | ||
38 | if (retval) | ||
39 | return retval; | ||
40 | |||
41 | if (pdata->port_power_on) | ||
42 | ehci_port_power(ehci, 1); | ||
43 | if (pdata->port_power_off) | ||
44 | ehci_port_power(ehci, 0); | ||
45 | |||
46 | return 0; | ||
47 | } | ||
48 | |||
49 | static const struct hc_driver ehci_platform_hc_driver = { | ||
50 | .description = hcd_name, | ||
51 | .product_desc = "Generic Platform EHCI Controller", | ||
52 | .hcd_priv_size = sizeof(struct ehci_hcd), | ||
53 | |||
54 | .irq = ehci_irq, | ||
55 | .flags = HCD_MEMORY | HCD_USB2, | ||
56 | |||
57 | .reset = ehci_platform_reset, | ||
58 | .start = ehci_run, | ||
59 | .stop = ehci_stop, | ||
60 | .shutdown = ehci_shutdown, | ||
61 | |||
62 | .urb_enqueue = ehci_urb_enqueue, | ||
63 | .urb_dequeue = ehci_urb_dequeue, | ||
64 | .endpoint_disable = ehci_endpoint_disable, | ||
65 | .endpoint_reset = ehci_endpoint_reset, | ||
66 | |||
67 | .get_frame_number = ehci_get_frame, | ||
68 | |||
69 | .hub_status_data = ehci_hub_status_data, | ||
70 | .hub_control = ehci_hub_control, | ||
71 | #if defined(CONFIG_PM) | ||
72 | .bus_suspend = ehci_bus_suspend, | ||
73 | .bus_resume = ehci_bus_resume, | ||
74 | #endif | ||
75 | .relinquish_port = ehci_relinquish_port, | ||
76 | .port_handed_over = ehci_port_handed_over, | ||
77 | |||
78 | .update_device = ehci_update_device, | ||
79 | |||
80 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | ||
81 | }; | ||
82 | |||
83 | static int __devinit ehci_platform_probe(struct platform_device *dev) | ||
84 | { | ||
85 | struct usb_hcd *hcd; | ||
86 | struct resource *res_mem; | ||
87 | int irq; | ||
88 | int err = -ENOMEM; | ||
89 | |||
90 | BUG_ON(!dev->dev.platform_data); | ||
91 | |||
92 | if (usb_disabled()) | ||
93 | return -ENODEV; | ||
94 | |||
95 | irq = platform_get_irq(dev, 0); | ||
96 | if (irq < 0) { | ||
97 | pr_err("no irq provieded"); | ||
98 | return irq; | ||
99 | } | ||
100 | res_mem = platform_get_resource(dev, IORESOURCE_MEM, 0); | ||
101 | if (!res_mem) { | ||
102 | pr_err("no memory recourse provieded"); | ||
103 | return -ENXIO; | ||
104 | } | ||
105 | |||
106 | hcd = usb_create_hcd(&ehci_platform_hc_driver, &dev->dev, | ||
107 | dev_name(&dev->dev)); | ||
108 | if (!hcd) | ||
109 | return -ENOMEM; | ||
110 | |||
111 | hcd->rsrc_start = res_mem->start; | ||
112 | hcd->rsrc_len = resource_size(res_mem); | ||
113 | |||
114 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | ||
115 | pr_err("controller already in use"); | ||
116 | err = -EBUSY; | ||
117 | goto err_put_hcd; | ||
118 | } | ||
119 | |||
120 | hcd->regs = ioremap_nocache(hcd->rsrc_start, hcd->rsrc_len); | ||
121 | if (!hcd->regs) | ||
122 | goto err_release_region; | ||
123 | err = usb_add_hcd(hcd, irq, IRQF_SHARED); | ||
124 | if (err) | ||
125 | goto err_iounmap; | ||
126 | |||
127 | platform_set_drvdata(dev, hcd); | ||
128 | |||
129 | return err; | ||
130 | |||
131 | err_iounmap: | ||
132 | iounmap(hcd->regs); | ||
133 | err_release_region: | ||
134 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
135 | err_put_hcd: | ||
136 | usb_put_hcd(hcd); | ||
137 | return err; | ||
138 | } | ||
139 | |||
140 | static int __devexit ehci_platform_remove(struct platform_device *dev) | ||
141 | { | ||
142 | struct usb_hcd *hcd = platform_get_drvdata(dev); | ||
143 | |||
144 | usb_remove_hcd(hcd); | ||
145 | iounmap(hcd->regs); | ||
146 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
147 | usb_put_hcd(hcd); | ||
148 | platform_set_drvdata(dev, NULL); | ||
149 | |||
150 | return 0; | ||
151 | } | ||
152 | |||
153 | #ifdef CONFIG_PM | ||
154 | |||
155 | static int ehci_platform_suspend(struct device *dev) | ||
156 | { | ||
157 | struct usb_hcd *hcd = dev_get_drvdata(dev); | ||
158 | bool wakeup = device_may_wakeup(dev); | ||
159 | |||
160 | ehci_prepare_ports_for_controller_suspend(hcd_to_ehci(hcd), wakeup); | ||
161 | return 0; | ||
162 | } | ||
163 | |||
164 | static int ehci_platform_resume(struct device *dev) | ||
165 | { | ||
166 | struct usb_hcd *hcd = dev_get_drvdata(dev); | ||
167 | |||
168 | ehci_prepare_ports_for_controller_resume(hcd_to_ehci(hcd)); | ||
169 | return 0; | ||
170 | } | ||
171 | |||
172 | #else /* !CONFIG_PM */ | ||
173 | #define ehci_platform_suspend NULL | ||
174 | #define ehci_platform_resume NULL | ||
175 | #endif /* CONFIG_PM */ | ||
176 | |||
177 | static const struct platform_device_id ehci_platform_table[] = { | ||
178 | { "ehci-platform", 0 }, | ||
179 | { } | ||
180 | }; | ||
181 | MODULE_DEVICE_TABLE(platform, ehci_platform_table); | ||
182 | |||
183 | static const struct dev_pm_ops ehci_platform_pm_ops = { | ||
184 | .suspend = ehci_platform_suspend, | ||
185 | .resume = ehci_platform_resume, | ||
186 | }; | ||
187 | |||
188 | static struct platform_driver ehci_platform_driver = { | ||
189 | .id_table = ehci_platform_table, | ||
190 | .probe = ehci_platform_probe, | ||
191 | .remove = __devexit_p(ehci_platform_remove), | ||
192 | .shutdown = usb_hcd_platform_shutdown, | ||
193 | .driver = { | ||
194 | .owner = THIS_MODULE, | ||
195 | .name = "ehci-platform", | ||
196 | .pm = &ehci_platform_pm_ops, | ||
197 | } | ||
198 | }; | ||
diff --git a/drivers/usb/host/ehci-pxa168.c b/drivers/usb/host/ehci-pxa168.c deleted file mode 100644 index 8d0e7a22e711..000000000000 --- a/drivers/usb/host/ehci-pxa168.c +++ /dev/null | |||
@@ -1,363 +0,0 @@ | |||
1 | /* | ||
2 | * drivers/usb/host/ehci-pxa168.c | ||
3 | * | ||
4 | * Tanmay Upadhyay <tanmay.upadhyay@einfochips.com> | ||
5 | * | ||
6 | * Based on drivers/usb/host/ehci-orion.c | ||
7 | * | ||
8 | * This file is licensed under the terms of the GNU General Public | ||
9 | * License version 2. This program is licensed "as is" without any | ||
10 | * warranty of any kind, whether express or implied. | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/module.h> | ||
15 | #include <linux/platform_device.h> | ||
16 | #include <linux/clk.h> | ||
17 | #include <mach/pxa168.h> | ||
18 | |||
19 | #define USB_PHY_CTRL_REG 0x4 | ||
20 | #define USB_PHY_PLL_REG 0x8 | ||
21 | #define USB_PHY_TX_REG 0xc | ||
22 | |||
23 | #define FBDIV_SHIFT 4 | ||
24 | |||
25 | #define ICP_SHIFT 12 | ||
26 | #define ICP_15 2 | ||
27 | #define ICP_20 3 | ||
28 | #define ICP_25 4 | ||
29 | |||
30 | #define KVCO_SHIFT 15 | ||
31 | |||
32 | #define PLLCALI12_SHIFT 25 | ||
33 | #define CALI12_VDD 0 | ||
34 | #define CALI12_09 1 | ||
35 | #define CALI12_10 2 | ||
36 | #define CALI12_11 3 | ||
37 | |||
38 | #define PLLVDD12_SHIFT 27 | ||
39 | #define VDD12_VDD 0 | ||
40 | #define VDD12_10 1 | ||
41 | #define VDD12_11 2 | ||
42 | #define VDD12_12 3 | ||
43 | |||
44 | #define PLLVDD18_SHIFT 29 | ||
45 | #define VDD18_19 0 | ||
46 | #define VDD18_20 1 | ||
47 | #define VDD18_21 2 | ||
48 | #define VDD18_22 3 | ||
49 | |||
50 | |||
51 | #define PLL_READY (1 << 23) | ||
52 | #define VCOCAL_START (1 << 21) | ||
53 | #define REG_RCAL_START (1 << 12) | ||
54 | |||
55 | struct pxa168_usb_drv_data { | ||
56 | struct ehci_hcd ehci; | ||
57 | struct clk *pxa168_usb_clk; | ||
58 | struct resource *usb_phy_res; | ||
59 | void __iomem *usb_phy_reg_base; | ||
60 | }; | ||
61 | |||
62 | static int ehci_pxa168_setup(struct usb_hcd *hcd) | ||
63 | { | ||
64 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
65 | int retval; | ||
66 | |||
67 | ehci_reset(ehci); | ||
68 | retval = ehci_halt(ehci); | ||
69 | if (retval) | ||
70 | return retval; | ||
71 | |||
72 | /* | ||
73 | * data structure init | ||
74 | */ | ||
75 | retval = ehci_init(hcd); | ||
76 | if (retval) | ||
77 | return retval; | ||
78 | |||
79 | hcd->has_tt = 1; | ||
80 | |||
81 | ehci_port_power(ehci, 0); | ||
82 | |||
83 | return retval; | ||
84 | } | ||
85 | |||
86 | static const struct hc_driver ehci_pxa168_hc_driver = { | ||
87 | .description = hcd_name, | ||
88 | .product_desc = "Marvell PXA168 EHCI", | ||
89 | .hcd_priv_size = sizeof(struct pxa168_usb_drv_data), | ||
90 | |||
91 | /* | ||
92 | * generic hardware linkage | ||
93 | */ | ||
94 | .irq = ehci_irq, | ||
95 | .flags = HCD_MEMORY | HCD_USB2, | ||
96 | |||
97 | /* | ||
98 | * basic lifecycle operations | ||
99 | */ | ||
100 | .reset = ehci_pxa168_setup, | ||
101 | .start = ehci_run, | ||
102 | .stop = ehci_stop, | ||
103 | .shutdown = ehci_shutdown, | ||
104 | |||
105 | /* | ||
106 | * managing i/o requests and associated device resources | ||
107 | */ | ||
108 | .urb_enqueue = ehci_urb_enqueue, | ||
109 | .urb_dequeue = ehci_urb_dequeue, | ||
110 | .endpoint_disable = ehci_endpoint_disable, | ||
111 | .endpoint_reset = ehci_endpoint_reset, | ||
112 | |||
113 | /* | ||
114 | * scheduling support | ||
115 | */ | ||
116 | .get_frame_number = ehci_get_frame, | ||
117 | |||
118 | /* | ||
119 | * root hub support | ||
120 | */ | ||
121 | .hub_status_data = ehci_hub_status_data, | ||
122 | .hub_control = ehci_hub_control, | ||
123 | .bus_suspend = ehci_bus_suspend, | ||
124 | .bus_resume = ehci_bus_resume, | ||
125 | .relinquish_port = ehci_relinquish_port, | ||
126 | .port_handed_over = ehci_port_handed_over, | ||
127 | |||
128 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | ||
129 | }; | ||
130 | |||
131 | static int pxa168_usb_phy_init(struct platform_device *pdev) | ||
132 | { | ||
133 | struct resource *res; | ||
134 | void __iomem *usb_phy_reg_base; | ||
135 | struct pxa168_usb_pdata *pdata; | ||
136 | struct pxa168_usb_drv_data *drv_data; | ||
137 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
138 | unsigned long reg_val; | ||
139 | int pll_retry_cont = 10000, err = 0; | ||
140 | |||
141 | drv_data = (struct pxa168_usb_drv_data *)hcd->hcd_priv; | ||
142 | pdata = (struct pxa168_usb_pdata *)pdev->dev.platform_data; | ||
143 | |||
144 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1); | ||
145 | if (!res) { | ||
146 | dev_err(&pdev->dev, | ||
147 | "Found HC with no PHY register addr. Check %s setup!\n", | ||
148 | dev_name(&pdev->dev)); | ||
149 | return -ENODEV; | ||
150 | } | ||
151 | |||
152 | if (!request_mem_region(res->start, resource_size(res), | ||
153 | ehci_pxa168_hc_driver.description)) { | ||
154 | dev_dbg(&pdev->dev, "controller already in use\n"); | ||
155 | return -EBUSY; | ||
156 | } | ||
157 | |||
158 | usb_phy_reg_base = ioremap(res->start, resource_size(res)); | ||
159 | if (usb_phy_reg_base == NULL) { | ||
160 | dev_dbg(&pdev->dev, "error mapping memory\n"); | ||
161 | err = -EFAULT; | ||
162 | goto err1; | ||
163 | } | ||
164 | drv_data->usb_phy_reg_base = usb_phy_reg_base; | ||
165 | drv_data->usb_phy_res = res; | ||
166 | |||
167 | /* If someone wants to init USB phy in board specific way */ | ||
168 | if (pdata && pdata->phy_init) | ||
169 | return pdata->phy_init(usb_phy_reg_base); | ||
170 | |||
171 | /* Power up the PHY and PLL */ | ||
172 | writel(readl(usb_phy_reg_base + USB_PHY_CTRL_REG) | 0x3, | ||
173 | usb_phy_reg_base + USB_PHY_CTRL_REG); | ||
174 | |||
175 | /* Configure PHY PLL */ | ||
176 | reg_val = readl(usb_phy_reg_base + USB_PHY_PLL_REG) & ~(0x7e03ffff); | ||
177 | reg_val |= (VDD18_22 << PLLVDD18_SHIFT | VDD12_12 << PLLVDD12_SHIFT | | ||
178 | CALI12_11 << PLLCALI12_SHIFT | 3 << KVCO_SHIFT | | ||
179 | ICP_15 << ICP_SHIFT | 0xee << FBDIV_SHIFT | 0xb); | ||
180 | writel(reg_val, usb_phy_reg_base + USB_PHY_PLL_REG); | ||
181 | |||
182 | /* Make sure PHY PLL is ready */ | ||
183 | while (!(readl(usb_phy_reg_base + USB_PHY_PLL_REG) & PLL_READY)) { | ||
184 | if (!(pll_retry_cont--)) { | ||
185 | dev_dbg(&pdev->dev, "USB PHY PLL not ready\n"); | ||
186 | err = -EIO; | ||
187 | goto err2; | ||
188 | } | ||
189 | } | ||
190 | |||
191 | /* Toggle VCOCAL_START bit of U2PLL for PLL calibration */ | ||
192 | udelay(200); | ||
193 | writel(readl(usb_phy_reg_base + USB_PHY_PLL_REG) | VCOCAL_START, | ||
194 | usb_phy_reg_base + USB_PHY_PLL_REG); | ||
195 | udelay(40); | ||
196 | writel(readl(usb_phy_reg_base + USB_PHY_PLL_REG) & ~VCOCAL_START, | ||
197 | usb_phy_reg_base + USB_PHY_PLL_REG); | ||
198 | |||
199 | /* Toggle REG_RCAL_START bit of U2PTX for impedance calibration */ | ||
200 | udelay(400); | ||
201 | writel(readl(usb_phy_reg_base + USB_PHY_TX_REG) | REG_RCAL_START, | ||
202 | usb_phy_reg_base + USB_PHY_TX_REG); | ||
203 | udelay(40); | ||
204 | writel(readl(usb_phy_reg_base + USB_PHY_TX_REG) & ~REG_RCAL_START, | ||
205 | usb_phy_reg_base + USB_PHY_TX_REG); | ||
206 | |||
207 | /* Make sure PHY PLL is ready again */ | ||
208 | pll_retry_cont = 0; | ||
209 | while (!(readl(usb_phy_reg_base + USB_PHY_PLL_REG) & PLL_READY)) { | ||
210 | if (!(pll_retry_cont--)) { | ||
211 | dev_dbg(&pdev->dev, "USB PHY PLL not ready\n"); | ||
212 | err = -EIO; | ||
213 | goto err2; | ||
214 | } | ||
215 | } | ||
216 | |||
217 | return 0; | ||
218 | err2: | ||
219 | iounmap(usb_phy_reg_base); | ||
220 | err1: | ||
221 | release_mem_region(res->start, resource_size(res)); | ||
222 | return err; | ||
223 | } | ||
224 | |||
225 | static int __devinit ehci_pxa168_drv_probe(struct platform_device *pdev) | ||
226 | { | ||
227 | struct resource *res; | ||
228 | struct usb_hcd *hcd; | ||
229 | struct ehci_hcd *ehci; | ||
230 | struct pxa168_usb_drv_data *drv_data; | ||
231 | void __iomem *regs; | ||
232 | int irq, err = 0; | ||
233 | |||
234 | if (usb_disabled()) | ||
235 | return -ENODEV; | ||
236 | |||
237 | pr_debug("Initializing pxa168-SoC USB Host Controller\n"); | ||
238 | |||
239 | irq = platform_get_irq(pdev, 0); | ||
240 | if (irq <= 0) { | ||
241 | dev_err(&pdev->dev, | ||
242 | "Found HC with no IRQ. Check %s setup!\n", | ||
243 | dev_name(&pdev->dev)); | ||
244 | err = -ENODEV; | ||
245 | goto err1; | ||
246 | } | ||
247 | |||
248 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
249 | if (!res) { | ||
250 | dev_err(&pdev->dev, | ||
251 | "Found HC with no register addr. Check %s setup!\n", | ||
252 | dev_name(&pdev->dev)); | ||
253 | err = -ENODEV; | ||
254 | goto err1; | ||
255 | } | ||
256 | |||
257 | if (!request_mem_region(res->start, resource_size(res), | ||
258 | ehci_pxa168_hc_driver.description)) { | ||
259 | dev_dbg(&pdev->dev, "controller already in use\n"); | ||
260 | err = -EBUSY; | ||
261 | goto err1; | ||
262 | } | ||
263 | |||
264 | regs = ioremap(res->start, resource_size(res)); | ||
265 | if (regs == NULL) { | ||
266 | dev_dbg(&pdev->dev, "error mapping memory\n"); | ||
267 | err = -EFAULT; | ||
268 | goto err2; | ||
269 | } | ||
270 | |||
271 | hcd = usb_create_hcd(&ehci_pxa168_hc_driver, | ||
272 | &pdev->dev, dev_name(&pdev->dev)); | ||
273 | if (!hcd) { | ||
274 | err = -ENOMEM; | ||
275 | goto err3; | ||
276 | } | ||
277 | |||
278 | drv_data = (struct pxa168_usb_drv_data *)hcd->hcd_priv; | ||
279 | |||
280 | /* Enable USB clock */ | ||
281 | drv_data->pxa168_usb_clk = clk_get(&pdev->dev, "PXA168-USBCLK"); | ||
282 | if (IS_ERR(drv_data->pxa168_usb_clk)) { | ||
283 | dev_err(&pdev->dev, "Couldn't get USB clock\n"); | ||
284 | err = PTR_ERR(drv_data->pxa168_usb_clk); | ||
285 | goto err4; | ||
286 | } | ||
287 | clk_enable(drv_data->pxa168_usb_clk); | ||
288 | |||
289 | err = pxa168_usb_phy_init(pdev); | ||
290 | if (err) { | ||
291 | dev_err(&pdev->dev, "USB PHY initialization failed\n"); | ||
292 | goto err5; | ||
293 | } | ||
294 | |||
295 | hcd->rsrc_start = res->start; | ||
296 | hcd->rsrc_len = resource_size(res); | ||
297 | hcd->regs = regs; | ||
298 | |||
299 | ehci = hcd_to_ehci(hcd); | ||
300 | ehci->caps = hcd->regs + 0x100; | ||
301 | ehci->regs = hcd->regs + 0x100 + | ||
302 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); | ||
303 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | ||
304 | hcd->has_tt = 1; | ||
305 | ehci->sbrn = 0x20; | ||
306 | |||
307 | err = usb_add_hcd(hcd, irq, IRQF_SHARED | IRQF_DISABLED); | ||
308 | if (err) | ||
309 | goto err5; | ||
310 | |||
311 | return 0; | ||
312 | |||
313 | err5: | ||
314 | clk_disable(drv_data->pxa168_usb_clk); | ||
315 | clk_put(drv_data->pxa168_usb_clk); | ||
316 | err4: | ||
317 | usb_put_hcd(hcd); | ||
318 | err3: | ||
319 | iounmap(regs); | ||
320 | err2: | ||
321 | release_mem_region(res->start, resource_size(res)); | ||
322 | err1: | ||
323 | dev_err(&pdev->dev, "init %s fail, %d\n", | ||
324 | dev_name(&pdev->dev), err); | ||
325 | |||
326 | return err; | ||
327 | } | ||
328 | |||
329 | static int __exit ehci_pxa168_drv_remove(struct platform_device *pdev) | ||
330 | { | ||
331 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
332 | struct pxa168_usb_drv_data *drv_data = | ||
333 | (struct pxa168_usb_drv_data *)hcd->hcd_priv; | ||
334 | |||
335 | usb_remove_hcd(hcd); | ||
336 | |||
337 | /* Power down PHY & PLL */ | ||
338 | writel(readl(drv_data->usb_phy_reg_base + USB_PHY_CTRL_REG) & (~0x3), | ||
339 | drv_data->usb_phy_reg_base + USB_PHY_CTRL_REG); | ||
340 | |||
341 | clk_disable(drv_data->pxa168_usb_clk); | ||
342 | clk_put(drv_data->pxa168_usb_clk); | ||
343 | |||
344 | iounmap(hcd->regs); | ||
345 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
346 | |||
347 | iounmap(drv_data->usb_phy_reg_base); | ||
348 | release_mem_region(drv_data->usb_phy_res->start, | ||
349 | resource_size(drv_data->usb_phy_res)); | ||
350 | |||
351 | usb_put_hcd(hcd); | ||
352 | |||
353 | return 0; | ||
354 | } | ||
355 | |||
356 | MODULE_ALIAS("platform:pxa168-ehci"); | ||
357 | |||
358 | static struct platform_driver ehci_pxa168_driver = { | ||
359 | .probe = ehci_pxa168_drv_probe, | ||
360 | .remove = __exit_p(ehci_pxa168_drv_remove), | ||
361 | .shutdown = usb_hcd_platform_shutdown, | ||
362 | .driver.name = "pxa168-ehci", | ||
363 | }; | ||
diff --git a/drivers/usb/host/ehci-s5p.c b/drivers/usb/host/ehci-s5p.c index 293f7412992e..f098e2a291a0 100644 --- a/drivers/usb/host/ehci-s5p.c +++ b/drivers/usb/host/ehci-s5p.c | |||
@@ -17,6 +17,15 @@ | |||
17 | #include <plat/ehci.h> | 17 | #include <plat/ehci.h> |
18 | #include <plat/usb-phy.h> | 18 | #include <plat/usb-phy.h> |
19 | 19 | ||
20 | #define EHCI_INSNREG00(base) (base + 0x90) | ||
21 | #define EHCI_INSNREG00_ENA_INCR16 (0x1 << 25) | ||
22 | #define EHCI_INSNREG00_ENA_INCR8 (0x1 << 24) | ||
23 | #define EHCI_INSNREG00_ENA_INCR4 (0x1 << 23) | ||
24 | #define EHCI_INSNREG00_ENA_INCRX_ALIGN (0x1 << 22) | ||
25 | #define EHCI_INSNREG00_ENABLE_DMA_BURST \ | ||
26 | (EHCI_INSNREG00_ENA_INCR16 | EHCI_INSNREG00_ENA_INCR8 | \ | ||
27 | EHCI_INSNREG00_ENA_INCR4 | EHCI_INSNREG00_ENA_INCRX_ALIGN) | ||
28 | |||
20 | struct s5p_ehci_hcd { | 29 | struct s5p_ehci_hcd { |
21 | struct device *dev; | 30 | struct device *dev; |
22 | struct usb_hcd *hcd; | 31 | struct usb_hcd *hcd; |
@@ -128,6 +137,9 @@ static int __devinit s5p_ehci_probe(struct platform_device *pdev) | |||
128 | ehci->regs = hcd->regs + | 137 | ehci->regs = hcd->regs + |
129 | HC_LENGTH(ehci, readl(&ehci->caps->hc_capbase)); | 138 | HC_LENGTH(ehci, readl(&ehci->caps->hc_capbase)); |
130 | 139 | ||
140 | /* DMA burst Enable */ | ||
141 | writel(EHCI_INSNREG00_ENABLE_DMA_BURST, EHCI_INSNREG00(hcd->regs)); | ||
142 | |||
131 | dbg_hcs_params(ehci, "reset"); | 143 | dbg_hcs_params(ehci, "reset"); |
132 | dbg_hcc_params(ehci, "reset"); | 144 | dbg_hcc_params(ehci, "reset"); |
133 | 145 | ||
@@ -234,6 +246,9 @@ static int s5p_ehci_resume(struct device *dev) | |||
234 | if (pdata && pdata->phy_init) | 246 | if (pdata && pdata->phy_init) |
235 | pdata->phy_init(pdev, S5P_USB_PHY_HOST); | 247 | pdata->phy_init(pdev, S5P_USB_PHY_HOST); |
236 | 248 | ||
249 | /* DMA burst Enable */ | ||
250 | writel(EHCI_INSNREG00_ENABLE_DMA_BURST, EHCI_INSNREG00(hcd->regs)); | ||
251 | |||
237 | if (time_before(jiffies, ehci->next_statechange)) | 252 | if (time_before(jiffies, ehci->next_statechange)) |
238 | msleep(100); | 253 | msleep(100); |
239 | 254 | ||
diff --git a/drivers/usb/host/ehci-spear.c b/drivers/usb/host/ehci-spear.c index b115b0b76e33..6e928559169c 100644 --- a/drivers/usb/host/ehci-spear.c +++ b/drivers/usb/host/ehci-spear.c | |||
@@ -11,8 +11,10 @@ | |||
11 | * more details. | 11 | * more details. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <linux/platform_device.h> | ||
15 | #include <linux/clk.h> | 14 | #include <linux/clk.h> |
15 | #include <linux/jiffies.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/pm.h> | ||
16 | 18 | ||
17 | struct spear_ehci { | 19 | struct spear_ehci { |
18 | struct ehci_hcd ehci; | 20 | struct ehci_hcd ehci; |
@@ -90,6 +92,82 @@ static const struct hc_driver ehci_spear_hc_driver = { | |||
90 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | 92 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, |
91 | }; | 93 | }; |
92 | 94 | ||
95 | #ifdef CONFIG_PM | ||
96 | static int ehci_spear_drv_suspend(struct device *dev) | ||
97 | { | ||
98 | struct usb_hcd *hcd = dev_get_drvdata(dev); | ||
99 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
100 | unsigned long flags; | ||
101 | int rc = 0; | ||
102 | |||
103 | if (time_before(jiffies, ehci->next_statechange)) | ||
104 | msleep(10); | ||
105 | |||
106 | /* | ||
107 | * Root hub was already suspended. Disable irq emission and mark HW | ||
108 | * unaccessible. The PM and USB cores make sure that the root hub is | ||
109 | * either suspended or stopped. | ||
110 | */ | ||
111 | spin_lock_irqsave(&ehci->lock, flags); | ||
112 | ehci_prepare_ports_for_controller_suspend(ehci, device_may_wakeup(dev)); | ||
113 | ehci_writel(ehci, 0, &ehci->regs->intr_enable); | ||
114 | ehci_readl(ehci, &ehci->regs->intr_enable); | ||
115 | spin_unlock_irqrestore(&ehci->lock, flags); | ||
116 | |||
117 | return rc; | ||
118 | } | ||
119 | |||
120 | static int ehci_spear_drv_resume(struct device *dev) | ||
121 | { | ||
122 | struct usb_hcd *hcd = dev_get_drvdata(dev); | ||
123 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
124 | |||
125 | if (time_before(jiffies, ehci->next_statechange)) | ||
126 | msleep(100); | ||
127 | |||
128 | if (ehci_readl(ehci, &ehci->regs->configured_flag) == FLAG_CF) { | ||
129 | int mask = INTR_MASK; | ||
130 | |||
131 | ehci_prepare_ports_for_controller_resume(ehci); | ||
132 | |||
133 | if (!hcd->self.root_hub->do_remote_wakeup) | ||
134 | mask &= ~STS_PCD; | ||
135 | |||
136 | ehci_writel(ehci, mask, &ehci->regs->intr_enable); | ||
137 | ehci_readl(ehci, &ehci->regs->intr_enable); | ||
138 | return 0; | ||
139 | } | ||
140 | |||
141 | usb_root_hub_lost_power(hcd->self.root_hub); | ||
142 | |||
143 | /* | ||
144 | * Else reset, to cope with power loss or flush-to-storage style | ||
145 | * "resume" having let BIOS kick in during reboot. | ||
146 | */ | ||
147 | ehci_halt(ehci); | ||
148 | ehci_reset(ehci); | ||
149 | |||
150 | /* emptying the schedule aborts any urbs */ | ||
151 | spin_lock_irq(&ehci->lock); | ||
152 | if (ehci->reclaim) | ||
153 | end_unlink_async(ehci); | ||
154 | |||
155 | ehci_work(ehci); | ||
156 | spin_unlock_irq(&ehci->lock); | ||
157 | |||
158 | ehci_writel(ehci, ehci->command, &ehci->regs->command); | ||
159 | ehci_writel(ehci, FLAG_CF, &ehci->regs->configured_flag); | ||
160 | ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */ | ||
161 | |||
162 | /* here we "know" root ports should always stay powered */ | ||
163 | ehci_port_power(ehci, 1); | ||
164 | return 0; | ||
165 | } | ||
166 | #endif /* CONFIG_PM */ | ||
167 | |||
168 | static SIMPLE_DEV_PM_OPS(ehci_spear_pm_ops, ehci_spear_drv_suspend, | ||
169 | ehci_spear_drv_resume); | ||
170 | |||
93 | static int spear_ehci_hcd_drv_probe(struct platform_device *pdev) | 171 | static int spear_ehci_hcd_drv_probe(struct platform_device *pdev) |
94 | { | 172 | { |
95 | struct usb_hcd *hcd ; | 173 | struct usb_hcd *hcd ; |
@@ -205,7 +283,8 @@ static struct platform_driver spear_ehci_hcd_driver = { | |||
205 | .shutdown = usb_hcd_platform_shutdown, | 283 | .shutdown = usb_hcd_platform_shutdown, |
206 | .driver = { | 284 | .driver = { |
207 | .name = "spear-ehci", | 285 | .name = "spear-ehci", |
208 | .bus = &platform_bus_type | 286 | .bus = &platform_bus_type, |
287 | .pm = &ehci_spear_pm_ops, | ||
209 | } | 288 | } |
210 | }; | 289 | }; |
211 | 290 | ||
diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c index dbc7fe8ca9e7..3de48a2d7955 100644 --- a/drivers/usb/host/ehci-tegra.c +++ b/drivers/usb/host/ehci-tegra.c | |||
@@ -35,7 +35,7 @@ struct tegra_ehci_hcd { | |||
35 | struct tegra_usb_phy *phy; | 35 | struct tegra_usb_phy *phy; |
36 | struct clk *clk; | 36 | struct clk *clk; |
37 | struct clk *emc_clk; | 37 | struct clk *emc_clk; |
38 | struct otg_transceiver *transceiver; | 38 | struct usb_phy *transceiver; |
39 | int host_resumed; | 39 | int host_resumed; |
40 | int bus_suspended; | 40 | int bus_suspended; |
41 | int port_resuming; | 41 | int port_resuming; |
@@ -733,9 +733,9 @@ static int tegra_ehci_probe(struct platform_device *pdev) | |||
733 | 733 | ||
734 | #ifdef CONFIG_USB_OTG_UTILS | 734 | #ifdef CONFIG_USB_OTG_UTILS |
735 | if (pdata->operating_mode == TEGRA_USB_OTG) { | 735 | if (pdata->operating_mode == TEGRA_USB_OTG) { |
736 | tegra->transceiver = otg_get_transceiver(); | 736 | tegra->transceiver = usb_get_transceiver(); |
737 | if (tegra->transceiver) | 737 | if (tegra->transceiver) |
738 | otg_set_host(tegra->transceiver, &hcd->self); | 738 | otg_set_host(tegra->transceiver->otg, &hcd->self); |
739 | } | 739 | } |
740 | #endif | 740 | #endif |
741 | 741 | ||
@@ -750,8 +750,8 @@ static int tegra_ehci_probe(struct platform_device *pdev) | |||
750 | fail: | 750 | fail: |
751 | #ifdef CONFIG_USB_OTG_UTILS | 751 | #ifdef CONFIG_USB_OTG_UTILS |
752 | if (tegra->transceiver) { | 752 | if (tegra->transceiver) { |
753 | otg_set_host(tegra->transceiver, NULL); | 753 | otg_set_host(tegra->transceiver->otg, NULL); |
754 | otg_put_transceiver(tegra->transceiver); | 754 | usb_put_transceiver(tegra->transceiver); |
755 | } | 755 | } |
756 | #endif | 756 | #endif |
757 | tegra_usb_phy_close(tegra->phy); | 757 | tegra_usb_phy_close(tegra->phy); |
@@ -808,8 +808,8 @@ static int tegra_ehci_remove(struct platform_device *pdev) | |||
808 | 808 | ||
809 | #ifdef CONFIG_USB_OTG_UTILS | 809 | #ifdef CONFIG_USB_OTG_UTILS |
810 | if (tegra->transceiver) { | 810 | if (tegra->transceiver) { |
811 | otg_set_host(tegra->transceiver, NULL); | 811 | otg_set_host(tegra->transceiver->otg, NULL); |
812 | otg_put_transceiver(tegra->transceiver); | 812 | usb_put_transceiver(tegra->transceiver); |
813 | } | 813 | } |
814 | #endif | 814 | #endif |
815 | 815 | ||
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index 0a5fda73b3f2..8f9acbc96fde 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h | |||
@@ -176,7 +176,7 @@ struct ehci_hcd { /* one per controller */ | |||
176 | /* | 176 | /* |
177 | * OTG controllers and transceivers need software interaction | 177 | * OTG controllers and transceivers need software interaction |
178 | */ | 178 | */ |
179 | struct otg_transceiver *transceiver; | 179 | struct usb_phy *transceiver; |
180 | }; | 180 | }; |
181 | 181 | ||
182 | /* convert between an HCD pointer and the corresponding EHCI_HCD */ | 182 | /* convert between an HCD pointer and the corresponding EHCI_HCD */ |
diff --git a/drivers/usb/host/fsl-mph-dr-of.c b/drivers/usb/host/fsl-mph-dr-of.c index 7916e56a725e..ab333ac6071d 100644 --- a/drivers/usb/host/fsl-mph-dr-of.c +++ b/drivers/usb/host/fsl-mph-dr-of.c | |||
@@ -94,7 +94,6 @@ struct platform_device * __devinit fsl_usb2_device_register( | |||
94 | pdev->dev.parent = &ofdev->dev; | 94 | pdev->dev.parent = &ofdev->dev; |
95 | 95 | ||
96 | pdev->dev.coherent_dma_mask = ofdev->dev.coherent_dma_mask; | 96 | pdev->dev.coherent_dma_mask = ofdev->dev.coherent_dma_mask; |
97 | pdev->dev.dma_mask = &pdev->archdata.dma_mask; | ||
98 | *pdev->dev.dma_mask = *ofdev->dev.dma_mask; | 97 | *pdev->dev.dma_mask = *ofdev->dev.dma_mask; |
99 | 98 | ||
100 | retval = platform_device_add_data(pdev, pdata, sizeof(*pdata)); | 99 | retval = platform_device_add_data(pdev, pdata, sizeof(*pdata)); |
diff --git a/drivers/usb/host/imx21-dbg.c b/drivers/usb/host/imx21-dbg.c index 6d7533427163..ec98ecee3517 100644 --- a/drivers/usb/host/imx21-dbg.c +++ b/drivers/usb/host/imx21-dbg.c | |||
@@ -239,7 +239,7 @@ static int debug_status_show(struct seq_file *s, void *v) | |||
239 | "ETDs allocated: %d/%d (max=%d)\n" | 239 | "ETDs allocated: %d/%d (max=%d)\n" |
240 | "ETDs in use sw: %d\n" | 240 | "ETDs in use sw: %d\n" |
241 | "ETDs in use hw: %d\n" | 241 | "ETDs in use hw: %d\n" |
242 | "DMEM alocated: %d/%d (max=%d)\n" | 242 | "DMEM allocated: %d/%d (max=%d)\n" |
243 | "DMEM blocks: %d\n" | 243 | "DMEM blocks: %d\n" |
244 | "Queued waiting for ETD: %d\n" | 244 | "Queued waiting for ETD: %d\n" |
245 | "Queued waiting for DMEM: %d\n", | 245 | "Queued waiting for DMEM: %d\n", |
diff --git a/drivers/usb/host/isp116x-hcd.c b/drivers/usb/host/isp116x-hcd.c index d91e5f211a76..924880087a74 100644 --- a/drivers/usb/host/isp116x-hcd.c +++ b/drivers/usb/host/isp116x-hcd.c | |||
@@ -1569,6 +1569,9 @@ static int __devinit isp116x_probe(struct platform_device *pdev) | |||
1569 | int ret = 0; | 1569 | int ret = 0; |
1570 | unsigned long irqflags; | 1570 | unsigned long irqflags; |
1571 | 1571 | ||
1572 | if (usb_disabled()) | ||
1573 | return -ENODEV; | ||
1574 | |||
1572 | if (pdev->num_resources < 3) { | 1575 | if (pdev->num_resources < 3) { |
1573 | ret = -ENODEV; | 1576 | ret = -ENODEV; |
1574 | goto err1; | 1577 | goto err1; |
@@ -1708,22 +1711,4 @@ static struct platform_driver isp116x_driver = { | |||
1708 | }, | 1711 | }, |
1709 | }; | 1712 | }; |
1710 | 1713 | ||
1711 | /*-----------------------------------------------------------------*/ | 1714 | module_platform_driver(isp116x_driver); |
1712 | |||
1713 | static int __init isp116x_init(void) | ||
1714 | { | ||
1715 | if (usb_disabled()) | ||
1716 | return -ENODEV; | ||
1717 | |||
1718 | INFO("driver %s, %s\n", hcd_name, DRIVER_VERSION); | ||
1719 | return platform_driver_register(&isp116x_driver); | ||
1720 | } | ||
1721 | |||
1722 | module_init(isp116x_init); | ||
1723 | |||
1724 | static void __exit isp116x_cleanup(void) | ||
1725 | { | ||
1726 | platform_driver_unregister(&isp116x_driver); | ||
1727 | } | ||
1728 | |||
1729 | module_exit(isp116x_cleanup); | ||
diff --git a/drivers/usb/host/isp1362-hcd.c b/drivers/usb/host/isp1362-hcd.c index e5fd8aa57af1..9e63cdf1ab75 100644 --- a/drivers/usb/host/isp1362-hcd.c +++ b/drivers/usb/host/isp1362-hcd.c | |||
@@ -2693,6 +2693,9 @@ static int __devinit isp1362_probe(struct platform_device *pdev) | |||
2693 | struct resource *irq_res; | 2693 | struct resource *irq_res; |
2694 | unsigned int irq_flags = 0; | 2694 | unsigned int irq_flags = 0; |
2695 | 2695 | ||
2696 | if (usb_disabled()) | ||
2697 | return -ENODEV; | ||
2698 | |||
2696 | /* basic sanity checks first. board-specific init logic should | 2699 | /* basic sanity checks first. board-specific init logic should |
2697 | * have initialized this the three resources and probably board | 2700 | * have initialized this the three resources and probably board |
2698 | * specific platform_data. we don't probe for IRQs, and do only | 2701 | * specific platform_data. we don't probe for IRQs, and do only |
@@ -2864,19 +2867,4 @@ static struct platform_driver isp1362_driver = { | |||
2864 | }, | 2867 | }, |
2865 | }; | 2868 | }; |
2866 | 2869 | ||
2867 | /*-------------------------------------------------------------------------*/ | 2870 | module_platform_driver(isp1362_driver); |
2868 | |||
2869 | static int __init isp1362_init(void) | ||
2870 | { | ||
2871 | if (usb_disabled()) | ||
2872 | return -ENODEV; | ||
2873 | pr_info("driver %s, %s\n", hcd_name, DRIVER_VERSION); | ||
2874 | return platform_driver_register(&isp1362_driver); | ||
2875 | } | ||
2876 | module_init(isp1362_init); | ||
2877 | |||
2878 | static void __exit isp1362_cleanup(void) | ||
2879 | { | ||
2880 | platform_driver_unregister(&isp1362_driver); | ||
2881 | } | ||
2882 | module_exit(isp1362_cleanup); | ||
diff --git a/drivers/usb/host/ohci-ath79.c b/drivers/usb/host/ohci-ath79.c deleted file mode 100644 index 18d574d6958b..000000000000 --- a/drivers/usb/host/ohci-ath79.c +++ /dev/null | |||
@@ -1,151 +0,0 @@ | |||
1 | /* | ||
2 | * OHCI HCD (Host Controller Driver) for USB. | ||
3 | * | ||
4 | * Bus Glue for Atheros AR71XX/AR724X built-in OHCI controller. | ||
5 | * | ||
6 | * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org> | ||
7 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
8 | * | ||
9 | * Parts of this file are based on Atheros' 2.6.15 BSP | ||
10 | * Copyright (C) 2007 Atheros Communications, Inc. | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or modify it | ||
13 | * under the terms of the GNU General Public License version 2 as published | ||
14 | * by the Free Software Foundation. | ||
15 | */ | ||
16 | |||
17 | #include <linux/platform_device.h> | ||
18 | |||
19 | static int __devinit ohci_ath79_start(struct usb_hcd *hcd) | ||
20 | { | ||
21 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | ||
22 | int ret; | ||
23 | |||
24 | ret = ohci_init(ohci); | ||
25 | if (ret < 0) | ||
26 | return ret; | ||
27 | |||
28 | ret = ohci_run(ohci); | ||
29 | if (ret < 0) | ||
30 | goto err; | ||
31 | |||
32 | return 0; | ||
33 | |||
34 | err: | ||
35 | ohci_stop(hcd); | ||
36 | return ret; | ||
37 | } | ||
38 | |||
39 | static const struct hc_driver ohci_ath79_hc_driver = { | ||
40 | .description = hcd_name, | ||
41 | .product_desc = "Atheros built-in OHCI controller", | ||
42 | .hcd_priv_size = sizeof(struct ohci_hcd), | ||
43 | |||
44 | .irq = ohci_irq, | ||
45 | .flags = HCD_USB11 | HCD_MEMORY, | ||
46 | |||
47 | .start = ohci_ath79_start, | ||
48 | .stop = ohci_stop, | ||
49 | .shutdown = ohci_shutdown, | ||
50 | |||
51 | .urb_enqueue = ohci_urb_enqueue, | ||
52 | .urb_dequeue = ohci_urb_dequeue, | ||
53 | .endpoint_disable = ohci_endpoint_disable, | ||
54 | |||
55 | /* | ||
56 | * scheduling support | ||
57 | */ | ||
58 | .get_frame_number = ohci_get_frame, | ||
59 | |||
60 | /* | ||
61 | * root hub support | ||
62 | */ | ||
63 | .hub_status_data = ohci_hub_status_data, | ||
64 | .hub_control = ohci_hub_control, | ||
65 | .start_port_reset = ohci_start_port_reset, | ||
66 | }; | ||
67 | |||
68 | static int ohci_ath79_probe(struct platform_device *pdev) | ||
69 | { | ||
70 | struct usb_hcd *hcd; | ||
71 | struct resource *res; | ||
72 | int irq; | ||
73 | int ret; | ||
74 | |||
75 | if (usb_disabled()) | ||
76 | return -ENODEV; | ||
77 | |||
78 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
79 | if (!res) { | ||
80 | dev_dbg(&pdev->dev, "no IRQ specified\n"); | ||
81 | return -ENODEV; | ||
82 | } | ||
83 | irq = res->start; | ||
84 | |||
85 | hcd = usb_create_hcd(&ohci_ath79_hc_driver, &pdev->dev, | ||
86 | dev_name(&pdev->dev)); | ||
87 | if (!hcd) | ||
88 | return -ENOMEM; | ||
89 | |||
90 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
91 | if (!res) { | ||
92 | dev_dbg(&pdev->dev, "no base address specified\n"); | ||
93 | ret = -ENODEV; | ||
94 | goto err_put_hcd; | ||
95 | } | ||
96 | hcd->rsrc_start = res->start; | ||
97 | hcd->rsrc_len = resource_size(res); | ||
98 | |||
99 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | ||
100 | dev_dbg(&pdev->dev, "controller already in use\n"); | ||
101 | ret = -EBUSY; | ||
102 | goto err_put_hcd; | ||
103 | } | ||
104 | |||
105 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); | ||
106 | if (!hcd->regs) { | ||
107 | dev_dbg(&pdev->dev, "error mapping memory\n"); | ||
108 | ret = -EFAULT; | ||
109 | goto err_release_region; | ||
110 | } | ||
111 | |||
112 | ohci_hcd_init(hcd_to_ohci(hcd)); | ||
113 | |||
114 | ret = usb_add_hcd(hcd, irq, 0); | ||
115 | if (ret) | ||
116 | goto err_stop_hcd; | ||
117 | |||
118 | return 0; | ||
119 | |||
120 | err_stop_hcd: | ||
121 | iounmap(hcd->regs); | ||
122 | err_release_region: | ||
123 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
124 | err_put_hcd: | ||
125 | usb_put_hcd(hcd); | ||
126 | return ret; | ||
127 | } | ||
128 | |||
129 | static int ohci_ath79_remove(struct platform_device *pdev) | ||
130 | { | ||
131 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
132 | |||
133 | usb_remove_hcd(hcd); | ||
134 | iounmap(hcd->regs); | ||
135 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
136 | usb_put_hcd(hcd); | ||
137 | |||
138 | return 0; | ||
139 | } | ||
140 | |||
141 | static struct platform_driver ohci_hcd_ath79_driver = { | ||
142 | .probe = ohci_ath79_probe, | ||
143 | .remove = ohci_ath79_remove, | ||
144 | .shutdown = usb_hcd_platform_shutdown, | ||
145 | .driver = { | ||
146 | .name = "ath79-ohci", | ||
147 | .owner = THIS_MODULE, | ||
148 | }, | ||
149 | }; | ||
150 | |||
151 | MODULE_ALIAS(PLATFORM_MODULE_PREFIX "ath79-ohci"); | ||
diff --git a/drivers/usb/host/ohci-exynos.c b/drivers/usb/host/ohci-exynos.c index 55aa35aa3d7b..37bb20ebb6fc 100644 --- a/drivers/usb/host/ohci-exynos.c +++ b/drivers/usb/host/ohci-exynos.c | |||
@@ -212,12 +212,10 @@ static int exynos_ohci_suspend(struct device *dev) | |||
212 | * mark HW unaccessible, bail out if RH has been resumed. Use | 212 | * mark HW unaccessible, bail out if RH has been resumed. Use |
213 | * the spinlock to properly synchronize with possible pending | 213 | * the spinlock to properly synchronize with possible pending |
214 | * RH suspend or resume activity. | 214 | * RH suspend or resume activity. |
215 | * | ||
216 | * This is still racy as hcd->state is manipulated outside of | ||
217 | * any locks =P But that will be a different fix. | ||
218 | */ | 215 | */ |
219 | spin_lock_irqsave(&ohci->lock, flags); | 216 | spin_lock_irqsave(&ohci->lock, flags); |
220 | if (hcd->state != HC_STATE_SUSPENDED && hcd->state != HC_STATE_HALT) { | 217 | if (ohci->rh_state != OHCI_RH_SUSPENDED && |
218 | ohci->rh_state != OHCI_RH_HALTED) { | ||
221 | rc = -EINVAL; | 219 | rc = -EINVAL; |
222 | goto fail; | 220 | goto fail; |
223 | } | 221 | } |
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 34b9edd86651..cd5e382db89c 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
@@ -899,7 +899,7 @@ static void ohci_stop (struct usb_hcd *hcd) | |||
899 | ohci_usb_reset (ohci); | 899 | ohci_usb_reset (ohci); |
900 | ohci_writel (ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable); | 900 | ohci_writel (ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable); |
901 | free_irq(hcd->irq, hcd); | 901 | free_irq(hcd->irq, hcd); |
902 | hcd->irq = -1; | 902 | hcd->irq = 0; |
903 | 903 | ||
904 | if (quirk_zfmicro(ohci)) | 904 | if (quirk_zfmicro(ohci)) |
905 | del_timer(&ohci->unlink_watchdog); | 905 | del_timer(&ohci->unlink_watchdog); |
@@ -1050,9 +1050,9 @@ MODULE_LICENSE ("GPL"); | |||
1050 | #define PLATFORM_DRIVER ohci_hcd_at91_driver | 1050 | #define PLATFORM_DRIVER ohci_hcd_at91_driver |
1051 | #endif | 1051 | #endif |
1052 | 1052 | ||
1053 | #ifdef CONFIG_ARCH_PNX4008 | 1053 | #if defined(CONFIG_ARCH_PNX4008) || defined(CONFIG_ARCH_LPC32XX) |
1054 | #include "ohci-pnx4008.c" | 1054 | #include "ohci-nxp.c" |
1055 | #define PLATFORM_DRIVER usb_hcd_pnx4008_driver | 1055 | #define PLATFORM_DRIVER usb_hcd_nxp_driver |
1056 | #endif | 1056 | #endif |
1057 | 1057 | ||
1058 | #ifdef CONFIG_ARCH_DAVINCI_DA8XX | 1058 | #ifdef CONFIG_ARCH_DAVINCI_DA8XX |
@@ -1111,16 +1111,16 @@ MODULE_LICENSE ("GPL"); | |||
1111 | #define PLATFORM_DRIVER ohci_hcd_cns3xxx_driver | 1111 | #define PLATFORM_DRIVER ohci_hcd_cns3xxx_driver |
1112 | #endif | 1112 | #endif |
1113 | 1113 | ||
1114 | #ifdef CONFIG_USB_OHCI_ATH79 | ||
1115 | #include "ohci-ath79.c" | ||
1116 | #define PLATFORM_DRIVER ohci_hcd_ath79_driver | ||
1117 | #endif | ||
1118 | |||
1119 | #ifdef CONFIG_CPU_XLR | 1114 | #ifdef CONFIG_CPU_XLR |
1120 | #include "ohci-xls.c" | 1115 | #include "ohci-xls.c" |
1121 | #define PLATFORM_DRIVER ohci_xls_driver | 1116 | #define PLATFORM_DRIVER ohci_xls_driver |
1122 | #endif | 1117 | #endif |
1123 | 1118 | ||
1119 | #ifdef CONFIG_USB_OHCI_HCD_PLATFORM | ||
1120 | #include "ohci-platform.c" | ||
1121 | #define PLATFORM_DRIVER ohci_platform_driver | ||
1122 | #endif | ||
1123 | |||
1124 | #if !defined(PCI_DRIVER) && \ | 1124 | #if !defined(PCI_DRIVER) && \ |
1125 | !defined(PLATFORM_DRIVER) && \ | 1125 | !defined(PLATFORM_DRIVER) && \ |
1126 | !defined(OMAP1_PLATFORM_DRIVER) && \ | 1126 | !defined(OMAP1_PLATFORM_DRIVER) && \ |
diff --git a/drivers/usb/host/ohci-pnx4008.c b/drivers/usb/host/ohci-nxp.c index 0013db7bdf92..6618de1d881d 100644 --- a/drivers/usb/host/ohci-pnx4008.c +++ b/drivers/usb/host/ohci-nxp.c | |||
@@ -1,7 +1,9 @@ | |||
1 | /* | 1 | /* |
2 | * drivers/usb/host/ohci-pnx4008.c | 2 | * driver for NXP USB Host devices |
3 | * | 3 | * |
4 | * driver for Philips PNX4008 USB Host | 4 | * Currently supported OHCI host devices: |
5 | * - Philips PNX4008 | ||
6 | * - NXP LPC32xx | ||
5 | * | 7 | * |
6 | * Authors: Dmitry Chigirev <source@mvista.com> | 8 | * Authors: Dmitry Chigirev <source@mvista.com> |
7 | * Vitaly Wool <vitalywool@gmail.com> | 9 | * Vitaly Wool <vitalywool@gmail.com> |
@@ -22,20 +24,24 @@ | |||
22 | #include <linux/i2c.h> | 24 | #include <linux/i2c.h> |
23 | 25 | ||
24 | #include <mach/hardware.h> | 26 | #include <mach/hardware.h> |
27 | #include <asm/mach-types.h> | ||
25 | #include <asm/io.h> | 28 | #include <asm/io.h> |
26 | 29 | ||
27 | #include <mach/platform.h> | 30 | #include <mach/platform.h> |
28 | #include <mach/irqs.h> | 31 | #include <mach/irqs.h> |
29 | #include <asm/gpio.h> | 32 | #include <asm/gpio.h> |
30 | 33 | ||
31 | #define USB_CTRL IO_ADDRESS(PNX4008_PWRMAN_BASE + 0x64) | 34 | #define USB_CONFIG_BASE 0x31020000 |
35 | #define PWRMAN_BASE 0x40004000 | ||
36 | |||
37 | #define USB_CTRL IO_ADDRESS(PWRMAN_BASE + 0x64) | ||
32 | 38 | ||
33 | /* USB_CTRL bit defines */ | 39 | /* USB_CTRL bit defines */ |
34 | #define USB_SLAVE_HCLK_EN (1 << 24) | 40 | #define USB_SLAVE_HCLK_EN (1 << 24) |
35 | #define USB_HOST_NEED_CLK_EN (1 << 21) | 41 | #define USB_HOST_NEED_CLK_EN (1 << 21) |
36 | 42 | ||
37 | #define USB_OTG_CLK_CTRL IO_ADDRESS(PNX4008_USB_CONFIG_BASE + 0xFF4) | 43 | #define USB_OTG_CLK_CTRL IO_ADDRESS(USB_CONFIG_BASE + 0xFF4) |
38 | #define USB_OTG_CLK_STAT IO_ADDRESS(PNX4008_USB_CONFIG_BASE + 0xFF8) | 44 | #define USB_OTG_CLK_STAT IO_ADDRESS(USB_CONFIG_BASE + 0xFF8) |
39 | 45 | ||
40 | /* USB_OTG_CLK_CTRL bit defines */ | 46 | /* USB_OTG_CLK_CTRL bit defines */ |
41 | #define AHB_M_CLOCK_ON (1 << 4) | 47 | #define AHB_M_CLOCK_ON (1 << 4) |
@@ -44,7 +50,7 @@ | |||
44 | #define DEV_CLOCK_ON (1 << 1) | 50 | #define DEV_CLOCK_ON (1 << 1) |
45 | #define HOST_CLOCK_ON (1 << 0) | 51 | #define HOST_CLOCK_ON (1 << 0) |
46 | 52 | ||
47 | #define USB_OTG_STAT_CONTROL IO_ADDRESS(PNX4008_USB_CONFIG_BASE + 0x110) | 53 | #define USB_OTG_STAT_CONTROL IO_ADDRESS(USB_CONFIG_BASE + 0x110) |
48 | 54 | ||
49 | /* USB_OTG_STAT_CONTROL bit defines */ | 55 | /* USB_OTG_STAT_CONTROL bit defines */ |
50 | #define TRANSPARENT_I2C_EN (1 << 7) | 56 | #define TRANSPARENT_I2C_EN (1 << 7) |
@@ -98,6 +104,15 @@ | |||
98 | #define ISP1301_I2C_INTERRUPT_RISING 0xE | 104 | #define ISP1301_I2C_INTERRUPT_RISING 0xE |
99 | #define ISP1301_I2C_REG_CLEAR_ADDR 1 | 105 | #define ISP1301_I2C_REG_CLEAR_ADDR 1 |
100 | 106 | ||
107 | /* On LPC32xx, those are undefined */ | ||
108 | #ifndef start_int_set_falling_edge | ||
109 | #define start_int_set_falling_edge(irq) | ||
110 | #define start_int_set_rising_edge(irq) | ||
111 | #define start_int_ack(irq) | ||
112 | #define start_int_mask(irq) | ||
113 | #define start_int_umask(irq) | ||
114 | #endif | ||
115 | |||
101 | static struct i2c_driver isp1301_driver; | 116 | static struct i2c_driver isp1301_driver; |
102 | static struct i2c_client *isp1301_i2c_client; | 117 | static struct i2c_client *isp1301_i2c_client; |
103 | 118 | ||
@@ -121,73 +136,129 @@ static int isp1301_remove(struct i2c_client *client) | |||
121 | } | 136 | } |
122 | 137 | ||
123 | static const struct i2c_device_id isp1301_id[] = { | 138 | static const struct i2c_device_id isp1301_id[] = { |
124 | { "isp1301_pnx", 0 }, | 139 | { "isp1301_nxp", 0 }, |
125 | { } | 140 | { } |
126 | }; | 141 | }; |
127 | 142 | ||
128 | static struct i2c_driver isp1301_driver = { | 143 | static struct i2c_driver isp1301_driver = { |
129 | .driver = { | 144 | .driver = { |
130 | .name = "isp1301_pnx", | 145 | .name = "isp1301_nxp", |
131 | }, | 146 | }, |
132 | .probe = isp1301_probe, | 147 | .probe = isp1301_probe, |
133 | .remove = isp1301_remove, | 148 | .remove = isp1301_remove, |
134 | .id_table = isp1301_id, | 149 | .id_table = isp1301_id, |
135 | }; | 150 | }; |
136 | 151 | ||
137 | static void i2c_write(u8 buf, u8 subaddr) | 152 | static void isp1301_configure_pnx4008(void) |
138 | { | ||
139 | char tmpbuf[2]; | ||
140 | |||
141 | tmpbuf[0] = subaddr; /*register number */ | ||
142 | tmpbuf[1] = buf; /*register data */ | ||
143 | i2c_master_send(isp1301_i2c_client, &tmpbuf[0], 2); | ||
144 | } | ||
145 | |||
146 | static void isp1301_configure(void) | ||
147 | { | 153 | { |
148 | /* PNX4008 only supports DAT_SE0 USB mode */ | 154 | /* PNX4008 only supports DAT_SE0 USB mode */ |
149 | /* PNX4008 R2A requires setting the MAX603 to output 3.6V */ | 155 | /* PNX4008 R2A requires setting the MAX603 to output 3.6V */ |
150 | /* Power up externel charge-pump */ | 156 | /* Power up externel charge-pump */ |
151 | 157 | ||
152 | i2c_write(MC1_DAT_SE0 | MC1_SPEED_REG, ISP1301_I2C_MODE_CONTROL_1); | 158 | i2c_smbus_write_byte_data(isp1301_i2c_client, |
153 | i2c_write(~(MC1_DAT_SE0 | MC1_SPEED_REG), | 159 | ISP1301_I2C_MODE_CONTROL_1, MC1_DAT_SE0 | MC1_SPEED_REG); |
154 | ISP1301_I2C_MODE_CONTROL_1 | ISP1301_I2C_REG_CLEAR_ADDR); | 160 | i2c_smbus_write_byte_data(isp1301_i2c_client, |
155 | i2c_write(MC2_BI_DI | MC2_PSW_EN | MC2_SPD_SUSP_CTRL, | 161 | ISP1301_I2C_MODE_CONTROL_1 | ISP1301_I2C_REG_CLEAR_ADDR, |
156 | ISP1301_I2C_MODE_CONTROL_2); | 162 | ~(MC1_DAT_SE0 | MC1_SPEED_REG)); |
157 | i2c_write(~(MC2_BI_DI | MC2_PSW_EN | MC2_SPD_SUSP_CTRL), | 163 | i2c_smbus_write_byte_data(isp1301_i2c_client, |
158 | ISP1301_I2C_MODE_CONTROL_2 | ISP1301_I2C_REG_CLEAR_ADDR); | 164 | ISP1301_I2C_MODE_CONTROL_2, |
159 | i2c_write(OTG1_DM_PULLDOWN | OTG1_DP_PULLDOWN, | 165 | MC2_BI_DI | MC2_PSW_EN | MC2_SPD_SUSP_CTRL); |
160 | ISP1301_I2C_OTG_CONTROL_1); | 166 | i2c_smbus_write_byte_data(isp1301_i2c_client, |
161 | i2c_write(~(OTG1_DM_PULLDOWN | OTG1_DP_PULLDOWN), | 167 | ISP1301_I2C_MODE_CONTROL_2 | ISP1301_I2C_REG_CLEAR_ADDR, |
162 | ISP1301_I2C_OTG_CONTROL_1 | ISP1301_I2C_REG_CLEAR_ADDR); | 168 | ~(MC2_BI_DI | MC2_PSW_EN | MC2_SPD_SUSP_CTRL)); |
163 | i2c_write(0xFF, | 169 | i2c_smbus_write_byte_data(isp1301_i2c_client, |
164 | ISP1301_I2C_INTERRUPT_LATCH | ISP1301_I2C_REG_CLEAR_ADDR); | 170 | ISP1301_I2C_OTG_CONTROL_1, OTG1_DM_PULLDOWN | OTG1_DP_PULLDOWN); |
165 | i2c_write(0xFF, | 171 | i2c_smbus_write_byte_data(isp1301_i2c_client, |
166 | ISP1301_I2C_INTERRUPT_FALLING | ISP1301_I2C_REG_CLEAR_ADDR); | 172 | ISP1301_I2C_OTG_CONTROL_1 | ISP1301_I2C_REG_CLEAR_ADDR, |
167 | i2c_write(0xFF, | 173 | ~(OTG1_DM_PULLDOWN | OTG1_DP_PULLDOWN)); |
168 | ISP1301_I2C_INTERRUPT_RISING | ISP1301_I2C_REG_CLEAR_ADDR); | 174 | i2c_smbus_write_byte_data(isp1301_i2c_client, |
175 | ISP1301_I2C_INTERRUPT_LATCH | ISP1301_I2C_REG_CLEAR_ADDR, 0xFF); | ||
176 | i2c_smbus_write_byte_data(isp1301_i2c_client, | ||
177 | ISP1301_I2C_INTERRUPT_FALLING | ISP1301_I2C_REG_CLEAR_ADDR, | ||
178 | 0xFF); | ||
179 | i2c_smbus_write_byte_data(isp1301_i2c_client, | ||
180 | ISP1301_I2C_INTERRUPT_RISING | ISP1301_I2C_REG_CLEAR_ADDR, | ||
181 | 0xFF); | ||
182 | } | ||
169 | 183 | ||
184 | static void isp1301_configure_lpc32xx(void) | ||
185 | { | ||
186 | /* LPC32XX only supports DAT_SE0 USB mode */ | ||
187 | /* This sequence is important */ | ||
188 | |||
189 | /* Disable transparent UART mode first */ | ||
190 | i2c_smbus_write_byte_data(isp1301_i2c_client, | ||
191 | (ISP1301_I2C_MODE_CONTROL_1 | ISP1301_I2C_REG_CLEAR_ADDR), | ||
192 | MC1_UART_EN); | ||
193 | i2c_smbus_write_byte_data(isp1301_i2c_client, | ||
194 | (ISP1301_I2C_MODE_CONTROL_1 | ISP1301_I2C_REG_CLEAR_ADDR), | ||
195 | ~MC1_SPEED_REG); | ||
196 | i2c_smbus_write_byte_data(isp1301_i2c_client, | ||
197 | ISP1301_I2C_MODE_CONTROL_1, MC1_SPEED_REG); | ||
198 | i2c_smbus_write_byte_data(isp1301_i2c_client, | ||
199 | (ISP1301_I2C_MODE_CONTROL_2 | ISP1301_I2C_REG_CLEAR_ADDR), | ||
200 | ~0); | ||
201 | i2c_smbus_write_byte_data(isp1301_i2c_client, | ||
202 | ISP1301_I2C_MODE_CONTROL_2, | ||
203 | (MC2_BI_DI | MC2_PSW_EN | MC2_SPD_SUSP_CTRL)); | ||
204 | i2c_smbus_write_byte_data(isp1301_i2c_client, | ||
205 | (ISP1301_I2C_OTG_CONTROL_1 | ISP1301_I2C_REG_CLEAR_ADDR), ~0); | ||
206 | i2c_smbus_write_byte_data(isp1301_i2c_client, | ||
207 | ISP1301_I2C_MODE_CONTROL_1, MC1_DAT_SE0); | ||
208 | i2c_smbus_write_byte_data(isp1301_i2c_client, | ||
209 | ISP1301_I2C_OTG_CONTROL_1, | ||
210 | (OTG1_DM_PULLDOWN | OTG1_DP_PULLDOWN)); | ||
211 | i2c_smbus_write_byte_data(isp1301_i2c_client, | ||
212 | (ISP1301_I2C_OTG_CONTROL_1 | ISP1301_I2C_REG_CLEAR_ADDR), | ||
213 | (OTG1_DM_PULLUP | OTG1_DP_PULLUP)); | ||
214 | i2c_smbus_write_byte_data(isp1301_i2c_client, | ||
215 | ISP1301_I2C_INTERRUPT_LATCH | ISP1301_I2C_REG_CLEAR_ADDR, ~0); | ||
216 | i2c_smbus_write_byte_data(isp1301_i2c_client, | ||
217 | ISP1301_I2C_INTERRUPT_FALLING | ISP1301_I2C_REG_CLEAR_ADDR, | ||
218 | ~0); | ||
219 | i2c_smbus_write_byte_data(isp1301_i2c_client, | ||
220 | ISP1301_I2C_INTERRUPT_RISING | ISP1301_I2C_REG_CLEAR_ADDR, ~0); | ||
221 | |||
222 | /* Enable usb_need_clk clock after transceiver is initialized */ | ||
223 | __raw_writel((__raw_readl(USB_CTRL) | (1 << 22)), USB_CTRL); | ||
224 | |||
225 | printk(KERN_INFO "ISP1301 Vendor ID : 0x%04x\n", | ||
226 | i2c_smbus_read_word_data(isp1301_i2c_client, 0x00)); | ||
227 | printk(KERN_INFO "ISP1301 Product ID : 0x%04x\n", | ||
228 | i2c_smbus_read_word_data(isp1301_i2c_client, 0x02)); | ||
229 | printk(KERN_INFO "ISP1301 Version ID : 0x%04x\n", | ||
230 | i2c_smbus_read_word_data(isp1301_i2c_client, 0x14)); | ||
231 | } | ||
232 | |||
233 | static void isp1301_configure(void) | ||
234 | { | ||
235 | if (machine_is_pnx4008()) | ||
236 | isp1301_configure_pnx4008(); | ||
237 | else | ||
238 | isp1301_configure_lpc32xx(); | ||
170 | } | 239 | } |
171 | 240 | ||
172 | static inline void isp1301_vbus_on(void) | 241 | static inline void isp1301_vbus_on(void) |
173 | { | 242 | { |
174 | i2c_write(OTG1_VBUS_DRV, ISP1301_I2C_OTG_CONTROL_1); | 243 | i2c_smbus_write_byte_data(isp1301_i2c_client, ISP1301_I2C_OTG_CONTROL_1, |
244 | OTG1_VBUS_DRV); | ||
175 | } | 245 | } |
176 | 246 | ||
177 | static inline void isp1301_vbus_off(void) | 247 | static inline void isp1301_vbus_off(void) |
178 | { | 248 | { |
179 | i2c_write(OTG1_VBUS_DRV, | 249 | i2c_smbus_write_byte_data(isp1301_i2c_client, |
180 | ISP1301_I2C_OTG_CONTROL_1 | ISP1301_I2C_REG_CLEAR_ADDR); | 250 | ISP1301_I2C_OTG_CONTROL_1 | ISP1301_I2C_REG_CLEAR_ADDR, |
251 | OTG1_VBUS_DRV); | ||
181 | } | 252 | } |
182 | 253 | ||
183 | static void pnx4008_start_hc(void) | 254 | static void nxp_start_hc(void) |
184 | { | 255 | { |
185 | unsigned long tmp = __raw_readl(USB_OTG_STAT_CONTROL) | HOST_EN; | 256 | unsigned long tmp = __raw_readl(USB_OTG_STAT_CONTROL) | HOST_EN; |
186 | __raw_writel(tmp, USB_OTG_STAT_CONTROL); | 257 | __raw_writel(tmp, USB_OTG_STAT_CONTROL); |
187 | isp1301_vbus_on(); | 258 | isp1301_vbus_on(); |
188 | } | 259 | } |
189 | 260 | ||
190 | static void pnx4008_stop_hc(void) | 261 | static void nxp_stop_hc(void) |
191 | { | 262 | { |
192 | unsigned long tmp; | 263 | unsigned long tmp; |
193 | isp1301_vbus_off(); | 264 | isp1301_vbus_off(); |
@@ -195,7 +266,7 @@ static void pnx4008_stop_hc(void) | |||
195 | __raw_writel(tmp, USB_OTG_STAT_CONTROL); | 266 | __raw_writel(tmp, USB_OTG_STAT_CONTROL); |
196 | } | 267 | } |
197 | 268 | ||
198 | static int __devinit ohci_pnx4008_start(struct usb_hcd *hcd) | 269 | static int __devinit ohci_nxp_start(struct usb_hcd *hcd) |
199 | { | 270 | { |
200 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | 271 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); |
201 | int ret; | 272 | int ret; |
@@ -211,9 +282,9 @@ static int __devinit ohci_pnx4008_start(struct usb_hcd *hcd) | |||
211 | return 0; | 282 | return 0; |
212 | } | 283 | } |
213 | 284 | ||
214 | static const struct hc_driver ohci_pnx4008_hc_driver = { | 285 | static const struct hc_driver ohci_nxp_hc_driver = { |
215 | .description = hcd_name, | 286 | .description = hcd_name, |
216 | .product_desc = "pnx4008 OHCI", | 287 | .product_desc = "nxp OHCI", |
217 | 288 | ||
218 | /* | 289 | /* |
219 | * generic hardware linkage | 290 | * generic hardware linkage |
@@ -225,7 +296,7 @@ static const struct hc_driver ohci_pnx4008_hc_driver = { | |||
225 | /* | 296 | /* |
226 | * basic lifecycle operations | 297 | * basic lifecycle operations |
227 | */ | 298 | */ |
228 | .start = ohci_pnx4008_start, | 299 | .start = ohci_nxp_start, |
229 | .stop = ohci_stop, | 300 | .stop = ohci_stop, |
230 | .shutdown = ohci_shutdown, | 301 | .shutdown = ohci_shutdown, |
231 | 302 | ||
@@ -255,54 +326,58 @@ static const struct hc_driver ohci_pnx4008_hc_driver = { | |||
255 | 326 | ||
256 | #define USB_CLOCK_MASK (AHB_M_CLOCK_ON| OTG_CLOCK_ON | HOST_CLOCK_ON | I2C_CLOCK_ON) | 327 | #define USB_CLOCK_MASK (AHB_M_CLOCK_ON| OTG_CLOCK_ON | HOST_CLOCK_ON | I2C_CLOCK_ON) |
257 | 328 | ||
258 | static void pnx4008_set_usb_bits(void) | 329 | static void nxp_set_usb_bits(void) |
259 | { | 330 | { |
260 | start_int_set_falling_edge(SE_USB_OTG_ATX_INT_N); | 331 | if (machine_is_pnx4008()) { |
261 | start_int_ack(SE_USB_OTG_ATX_INT_N); | 332 | start_int_set_falling_edge(SE_USB_OTG_ATX_INT_N); |
262 | start_int_umask(SE_USB_OTG_ATX_INT_N); | 333 | start_int_ack(SE_USB_OTG_ATX_INT_N); |
263 | 334 | start_int_umask(SE_USB_OTG_ATX_INT_N); | |
264 | start_int_set_rising_edge(SE_USB_OTG_TIMER_INT); | 335 | |
265 | start_int_ack(SE_USB_OTG_TIMER_INT); | 336 | start_int_set_rising_edge(SE_USB_OTG_TIMER_INT); |
266 | start_int_umask(SE_USB_OTG_TIMER_INT); | 337 | start_int_ack(SE_USB_OTG_TIMER_INT); |
267 | 338 | start_int_umask(SE_USB_OTG_TIMER_INT); | |
268 | start_int_set_rising_edge(SE_USB_I2C_INT); | 339 | |
269 | start_int_ack(SE_USB_I2C_INT); | 340 | start_int_set_rising_edge(SE_USB_I2C_INT); |
270 | start_int_umask(SE_USB_I2C_INT); | 341 | start_int_ack(SE_USB_I2C_INT); |
271 | 342 | start_int_umask(SE_USB_I2C_INT); | |
272 | start_int_set_rising_edge(SE_USB_INT); | 343 | |
273 | start_int_ack(SE_USB_INT); | 344 | start_int_set_rising_edge(SE_USB_INT); |
274 | start_int_umask(SE_USB_INT); | 345 | start_int_ack(SE_USB_INT); |
275 | 346 | start_int_umask(SE_USB_INT); | |
276 | start_int_set_rising_edge(SE_USB_NEED_CLK_INT); | 347 | |
277 | start_int_ack(SE_USB_NEED_CLK_INT); | 348 | start_int_set_rising_edge(SE_USB_NEED_CLK_INT); |
278 | start_int_umask(SE_USB_NEED_CLK_INT); | 349 | start_int_ack(SE_USB_NEED_CLK_INT); |
279 | 350 | start_int_umask(SE_USB_NEED_CLK_INT); | |
280 | start_int_set_rising_edge(SE_USB_AHB_NEED_CLK_INT); | 351 | |
281 | start_int_ack(SE_USB_AHB_NEED_CLK_INT); | 352 | start_int_set_rising_edge(SE_USB_AHB_NEED_CLK_INT); |
282 | start_int_umask(SE_USB_AHB_NEED_CLK_INT); | 353 | start_int_ack(SE_USB_AHB_NEED_CLK_INT); |
354 | start_int_umask(SE_USB_AHB_NEED_CLK_INT); | ||
355 | } | ||
283 | } | 356 | } |
284 | 357 | ||
285 | static void pnx4008_unset_usb_bits(void) | 358 | static void nxp_unset_usb_bits(void) |
286 | { | 359 | { |
287 | start_int_mask(SE_USB_OTG_ATX_INT_N); | 360 | if (machine_is_pnx4008()) { |
288 | start_int_mask(SE_USB_OTG_TIMER_INT); | 361 | start_int_mask(SE_USB_OTG_ATX_INT_N); |
289 | start_int_mask(SE_USB_I2C_INT); | 362 | start_int_mask(SE_USB_OTG_TIMER_INT); |
290 | start_int_mask(SE_USB_INT); | 363 | start_int_mask(SE_USB_I2C_INT); |
291 | start_int_mask(SE_USB_NEED_CLK_INT); | 364 | start_int_mask(SE_USB_INT); |
292 | start_int_mask(SE_USB_AHB_NEED_CLK_INT); | 365 | start_int_mask(SE_USB_NEED_CLK_INT); |
366 | start_int_mask(SE_USB_AHB_NEED_CLK_INT); | ||
367 | } | ||
293 | } | 368 | } |
294 | 369 | ||
295 | static int __devinit usb_hcd_pnx4008_probe(struct platform_device *pdev) | 370 | static int __devinit usb_hcd_nxp_probe(struct platform_device *pdev) |
296 | { | 371 | { |
297 | struct usb_hcd *hcd = 0; | 372 | struct usb_hcd *hcd = 0; |
298 | struct ohci_hcd *ohci; | 373 | struct ohci_hcd *ohci; |
299 | const struct hc_driver *driver = &ohci_pnx4008_hc_driver; | 374 | const struct hc_driver *driver = &ohci_nxp_hc_driver; |
300 | struct i2c_adapter *i2c_adap; | 375 | struct i2c_adapter *i2c_adap; |
301 | struct i2c_board_info i2c_info; | 376 | struct i2c_board_info i2c_info; |
302 | 377 | ||
303 | int ret = 0, irq; | 378 | int ret = 0, irq; |
304 | 379 | ||
305 | dev_dbg(&pdev->dev, "%s: " DRIVER_DESC " (pnx4008)\n", hcd_name); | 380 | dev_dbg(&pdev->dev, "%s: " DRIVER_DESC " (nxp)\n", hcd_name); |
306 | if (usb_disabled()) { | 381 | if (usb_disabled()) { |
307 | err("USB is disabled"); | 382 | err("USB is disabled"); |
308 | ret = -ENODEV; | 383 | ret = -ENODEV; |
@@ -327,7 +402,7 @@ static int __devinit usb_hcd_pnx4008_probe(struct platform_device *pdev) | |||
327 | } | 402 | } |
328 | i2c_adap = i2c_get_adapter(2); | 403 | i2c_adap = i2c_get_adapter(2); |
329 | memset(&i2c_info, 0, sizeof(struct i2c_board_info)); | 404 | memset(&i2c_info, 0, sizeof(struct i2c_board_info)); |
330 | strlcpy(i2c_info.type, "isp1301_pnx", I2C_NAME_SIZE); | 405 | strlcpy(i2c_info.type, "isp1301_nxp", I2C_NAME_SIZE); |
331 | isp1301_i2c_client = i2c_new_probed_device(i2c_adap, &i2c_info, | 406 | isp1301_i2c_client = i2c_new_probed_device(i2c_adap, &i2c_info, |
332 | normal_i2c, NULL); | 407 | normal_i2c, NULL); |
333 | i2c_put_adapter(i2c_adap); | 408 | i2c_put_adapter(i2c_adap); |
@@ -375,7 +450,7 @@ static int __devinit usb_hcd_pnx4008_probe(struct platform_device *pdev) | |||
375 | } | 450 | } |
376 | 451 | ||
377 | /* Set all USB bits in the Start Enable register */ | 452 | /* Set all USB bits in the Start Enable register */ |
378 | pnx4008_set_usb_bits(); | 453 | nxp_set_usb_bits(); |
379 | 454 | ||
380 | hcd->rsrc_start = pdev->resource[0].start; | 455 | hcd->rsrc_start = pdev->resource[0].start; |
381 | hcd->rsrc_len = pdev->resource[0].end - pdev->resource[0].start + 1; | 456 | hcd->rsrc_len = pdev->resource[0].end - pdev->resource[0].start + 1; |
@@ -392,7 +467,7 @@ static int __devinit usb_hcd_pnx4008_probe(struct platform_device *pdev) | |||
392 | goto out4; | 467 | goto out4; |
393 | } | 468 | } |
394 | 469 | ||
395 | pnx4008_start_hc(); | 470 | nxp_start_hc(); |
396 | platform_set_drvdata(pdev, hcd); | 471 | platform_set_drvdata(pdev, hcd); |
397 | ohci = hcd_to_ohci(hcd); | 472 | ohci = hcd_to_ohci(hcd); |
398 | ohci_hcd_init(ohci); | 473 | ohci_hcd_init(ohci); |
@@ -402,9 +477,9 @@ static int __devinit usb_hcd_pnx4008_probe(struct platform_device *pdev) | |||
402 | if (ret == 0) | 477 | if (ret == 0) |
403 | return ret; | 478 | return ret; |
404 | 479 | ||
405 | pnx4008_stop_hc(); | 480 | nxp_stop_hc(); |
406 | out4: | 481 | out4: |
407 | pnx4008_unset_usb_bits(); | 482 | nxp_unset_usb_bits(); |
408 | usb_put_hcd(hcd); | 483 | usb_put_hcd(hcd); |
409 | out3: | 484 | out3: |
410 | clk_disable(usb_clk); | 485 | clk_disable(usb_clk); |
@@ -419,15 +494,15 @@ out: | |||
419 | return ret; | 494 | return ret; |
420 | } | 495 | } |
421 | 496 | ||
422 | static int usb_hcd_pnx4008_remove(struct platform_device *pdev) | 497 | static int usb_hcd_nxp_remove(struct platform_device *pdev) |
423 | { | 498 | { |
424 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | 499 | struct usb_hcd *hcd = platform_get_drvdata(pdev); |
425 | 500 | ||
426 | usb_remove_hcd(hcd); | 501 | usb_remove_hcd(hcd); |
427 | pnx4008_stop_hc(); | 502 | nxp_stop_hc(); |
428 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | 503 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); |
429 | usb_put_hcd(hcd); | 504 | usb_put_hcd(hcd); |
430 | pnx4008_unset_usb_bits(); | 505 | nxp_unset_usb_bits(); |
431 | clk_disable(usb_clk); | 506 | clk_disable(usb_clk); |
432 | clk_put(usb_clk); | 507 | clk_put(usb_clk); |
433 | i2c_unregister_device(isp1301_i2c_client); | 508 | i2c_unregister_device(isp1301_i2c_client); |
@@ -442,12 +517,12 @@ static int usb_hcd_pnx4008_remove(struct platform_device *pdev) | |||
442 | /* work with hotplug and coldplug */ | 517 | /* work with hotplug and coldplug */ |
443 | MODULE_ALIAS("platform:usb-ohci"); | 518 | MODULE_ALIAS("platform:usb-ohci"); |
444 | 519 | ||
445 | static struct platform_driver usb_hcd_pnx4008_driver = { | 520 | static struct platform_driver usb_hcd_nxp_driver = { |
446 | .driver = { | 521 | .driver = { |
447 | .name = "usb-ohci", | 522 | .name = "usb-ohci", |
448 | .owner = THIS_MODULE, | 523 | .owner = THIS_MODULE, |
449 | }, | 524 | }, |
450 | .probe = usb_hcd_pnx4008_probe, | 525 | .probe = usb_hcd_nxp_probe, |
451 | .remove = usb_hcd_pnx4008_remove, | 526 | .remove = usb_hcd_nxp_remove, |
452 | }; | 527 | }; |
453 | 528 | ||
diff --git a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c index db3968656d21..96451e41ee8a 100644 --- a/drivers/usb/host/ohci-omap.c +++ b/drivers/usb/host/ohci-omap.c | |||
@@ -171,7 +171,7 @@ static void start_hnp(struct ohci_hcd *ohci) | |||
171 | unsigned long flags; | 171 | unsigned long flags; |
172 | u32 l; | 172 | u32 l; |
173 | 173 | ||
174 | otg_start_hnp(ohci->transceiver); | 174 | otg_start_hnp(ohci->transceiver->otg); |
175 | 175 | ||
176 | local_irq_save(flags); | 176 | local_irq_save(flags); |
177 | ohci->transceiver->state = OTG_STATE_A_SUSPEND; | 177 | ohci->transceiver->state = OTG_STATE_A_SUSPEND; |
@@ -210,9 +210,9 @@ static int ohci_omap_init(struct usb_hcd *hcd) | |||
210 | 210 | ||
211 | #ifdef CONFIG_USB_OTG | 211 | #ifdef CONFIG_USB_OTG |
212 | if (need_transceiver) { | 212 | if (need_transceiver) { |
213 | ohci->transceiver = otg_get_transceiver(); | 213 | ohci->transceiver = usb_get_transceiver(); |
214 | if (ohci->transceiver) { | 214 | if (ohci->transceiver) { |
215 | int status = otg_set_host(ohci->transceiver, | 215 | int status = otg_set_host(ohci->transceiver->otg, |
216 | &ohci_to_hcd(ohci)->self); | 216 | &ohci_to_hcd(ohci)->self); |
217 | dev_dbg(hcd->self.controller, "init %s transceiver, status %d\n", | 217 | dev_dbg(hcd->self.controller, "init %s transceiver, status %d\n", |
218 | ohci->transceiver->label, status); | 218 | ohci->transceiver->label, status); |
@@ -404,7 +404,7 @@ usb_hcd_omap_remove (struct usb_hcd *hcd, struct platform_device *pdev) | |||
404 | 404 | ||
405 | usb_remove_hcd(hcd); | 405 | usb_remove_hcd(hcd); |
406 | if (ohci->transceiver) { | 406 | if (ohci->transceiver) { |
407 | (void) otg_set_host(ohci->transceiver, 0); | 407 | (void) otg_set_host(ohci->transceiver->otg, 0); |
408 | put_device(ohci->transceiver->dev); | 408 | put_device(ohci->transceiver->dev); |
409 | } | 409 | } |
410 | if (machine_is_omap_osk()) | 410 | if (machine_is_omap_osk()) |
diff --git a/drivers/usb/host/ohci-platform.c b/drivers/usb/host/ohci-platform.c new file mode 100644 index 000000000000..ec5c6791c8b4 --- /dev/null +++ b/drivers/usb/host/ohci-platform.c | |||
@@ -0,0 +1,194 @@ | |||
1 | /* | ||
2 | * Generic platform ohci driver | ||
3 | * | ||
4 | * Copyright 2007 Michael Buesch <m@bues.ch> | ||
5 | * Copyright 2011-2012 Hauke Mehrtens <hauke@hauke-m.de> | ||
6 | * | ||
7 | * Derived from the OCHI-SSB driver | ||
8 | * Derived from the OHCI-PCI driver | ||
9 | * Copyright 1999 Roman Weissgaerber | ||
10 | * Copyright 2000-2002 David Brownell | ||
11 | * Copyright 1999 Linus Torvalds | ||
12 | * Copyright 1999 Gregory P. Smith | ||
13 | * | ||
14 | * Licensed under the GNU/GPL. See COPYING for details. | ||
15 | */ | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/usb/ohci_pdriver.h> | ||
18 | |||
19 | static int ohci_platform_reset(struct usb_hcd *hcd) | ||
20 | { | ||
21 | struct platform_device *pdev = to_platform_device(hcd->self.controller); | ||
22 | struct usb_ohci_pdata *pdata = pdev->dev.platform_data; | ||
23 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | ||
24 | int err; | ||
25 | |||
26 | if (pdata->big_endian_desc) | ||
27 | ohci->flags |= OHCI_QUIRK_BE_DESC; | ||
28 | if (pdata->big_endian_mmio) | ||
29 | ohci->flags |= OHCI_QUIRK_BE_MMIO; | ||
30 | if (pdata->no_big_frame_no) | ||
31 | ohci->flags |= OHCI_QUIRK_FRAME_NO; | ||
32 | |||
33 | ohci_hcd_init(ohci); | ||
34 | err = ohci_init(ohci); | ||
35 | |||
36 | return err; | ||
37 | } | ||
38 | |||
39 | static int ohci_platform_start(struct usb_hcd *hcd) | ||
40 | { | ||
41 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | ||
42 | int err; | ||
43 | |||
44 | err = ohci_run(ohci); | ||
45 | if (err < 0) { | ||
46 | ohci_err(ohci, "can't start\n"); | ||
47 | ohci_stop(hcd); | ||
48 | } | ||
49 | |||
50 | return err; | ||
51 | } | ||
52 | |||
53 | static const struct hc_driver ohci_platform_hc_driver = { | ||
54 | .description = hcd_name, | ||
55 | .product_desc = "Generic Platform OHCI Controller", | ||
56 | .hcd_priv_size = sizeof(struct ohci_hcd), | ||
57 | |||
58 | .irq = ohci_irq, | ||
59 | .flags = HCD_MEMORY | HCD_USB11, | ||
60 | |||
61 | .reset = ohci_platform_reset, | ||
62 | .start = ohci_platform_start, | ||
63 | .stop = ohci_stop, | ||
64 | .shutdown = ohci_shutdown, | ||
65 | |||
66 | .urb_enqueue = ohci_urb_enqueue, | ||
67 | .urb_dequeue = ohci_urb_dequeue, | ||
68 | .endpoint_disable = ohci_endpoint_disable, | ||
69 | |||
70 | .get_frame_number = ohci_get_frame, | ||
71 | |||
72 | .hub_status_data = ohci_hub_status_data, | ||
73 | .hub_control = ohci_hub_control, | ||
74 | #ifdef CONFIG_PM | ||
75 | .bus_suspend = ohci_bus_suspend, | ||
76 | .bus_resume = ohci_bus_resume, | ||
77 | #endif | ||
78 | |||
79 | .start_port_reset = ohci_start_port_reset, | ||
80 | }; | ||
81 | |||
82 | static int __devinit ohci_platform_probe(struct platform_device *dev) | ||
83 | { | ||
84 | struct usb_hcd *hcd; | ||
85 | struct resource *res_mem; | ||
86 | int irq; | ||
87 | int err = -ENOMEM; | ||
88 | |||
89 | BUG_ON(!dev->dev.platform_data); | ||
90 | |||
91 | if (usb_disabled()) | ||
92 | return -ENODEV; | ||
93 | |||
94 | irq = platform_get_irq(dev, 0); | ||
95 | if (irq < 0) { | ||
96 | pr_err("no irq provieded"); | ||
97 | return irq; | ||
98 | } | ||
99 | |||
100 | res_mem = platform_get_resource(dev, IORESOURCE_MEM, 0); | ||
101 | if (!res_mem) { | ||
102 | pr_err("no memory recourse provieded"); | ||
103 | return -ENXIO; | ||
104 | } | ||
105 | |||
106 | hcd = usb_create_hcd(&ohci_platform_hc_driver, &dev->dev, | ||
107 | dev_name(&dev->dev)); | ||
108 | if (!hcd) | ||
109 | return -ENOMEM; | ||
110 | |||
111 | hcd->rsrc_start = res_mem->start; | ||
112 | hcd->rsrc_len = resource_size(res_mem); | ||
113 | |||
114 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | ||
115 | pr_err("controller already in use"); | ||
116 | err = -EBUSY; | ||
117 | goto err_put_hcd; | ||
118 | } | ||
119 | |||
120 | hcd->regs = ioremap_nocache(hcd->rsrc_start, hcd->rsrc_len); | ||
121 | if (!hcd->regs) | ||
122 | goto err_release_region; | ||
123 | err = usb_add_hcd(hcd, irq, IRQF_SHARED); | ||
124 | if (err) | ||
125 | goto err_iounmap; | ||
126 | |||
127 | platform_set_drvdata(dev, hcd); | ||
128 | |||
129 | return err; | ||
130 | |||
131 | err_iounmap: | ||
132 | iounmap(hcd->regs); | ||
133 | err_release_region: | ||
134 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
135 | err_put_hcd: | ||
136 | usb_put_hcd(hcd); | ||
137 | return err; | ||
138 | } | ||
139 | |||
140 | static int __devexit ohci_platform_remove(struct platform_device *dev) | ||
141 | { | ||
142 | struct usb_hcd *hcd = platform_get_drvdata(dev); | ||
143 | |||
144 | usb_remove_hcd(hcd); | ||
145 | iounmap(hcd->regs); | ||
146 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
147 | usb_put_hcd(hcd); | ||
148 | platform_set_drvdata(dev, NULL); | ||
149 | |||
150 | return 0; | ||
151 | } | ||
152 | |||
153 | #ifdef CONFIG_PM | ||
154 | |||
155 | static int ohci_platform_suspend(struct device *dev) | ||
156 | { | ||
157 | return 0; | ||
158 | } | ||
159 | |||
160 | static int ohci_platform_resume(struct device *dev) | ||
161 | { | ||
162 | struct usb_hcd *hcd = dev_get_drvdata(dev); | ||
163 | |||
164 | ohci_finish_controller_resume(hcd); | ||
165 | return 0; | ||
166 | } | ||
167 | |||
168 | #else /* !CONFIG_PM */ | ||
169 | #define ohci_platform_suspend NULL | ||
170 | #define ohci_platform_resume NULL | ||
171 | #endif /* CONFIG_PM */ | ||
172 | |||
173 | static const struct platform_device_id ohci_platform_table[] = { | ||
174 | { "ohci-platform", 0 }, | ||
175 | { } | ||
176 | }; | ||
177 | MODULE_DEVICE_TABLE(platform, ohci_platform_table); | ||
178 | |||
179 | static const struct dev_pm_ops ohci_platform_pm_ops = { | ||
180 | .suspend = ohci_platform_suspend, | ||
181 | .resume = ohci_platform_resume, | ||
182 | }; | ||
183 | |||
184 | static struct platform_driver ohci_platform_driver = { | ||
185 | .id_table = ohci_platform_table, | ||
186 | .probe = ohci_platform_probe, | ||
187 | .remove = __devexit_p(ohci_platform_remove), | ||
188 | .shutdown = usb_hcd_platform_shutdown, | ||
189 | .driver = { | ||
190 | .owner = THIS_MODULE, | ||
191 | .name = "ohci-platform", | ||
192 | .pm = &ohci_platform_pm_ops, | ||
193 | } | ||
194 | }; | ||
diff --git a/drivers/usb/host/ohci-pxa27x.c b/drivers/usb/host/ohci-pxa27x.c index 6313e4439f37..c31b2815be1c 100644 --- a/drivers/usb/host/ohci-pxa27x.c +++ b/drivers/usb/host/ohci-pxa27x.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/signal.h> | 23 | #include <linux/signal.h> |
24 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
25 | #include <linux/clk.h> | 25 | #include <linux/clk.h> |
26 | #include <mach/hardware.h> | ||
26 | #include <mach/ohci.h> | 27 | #include <mach/ohci.h> |
27 | #include <mach/pxa3xx-u2d.h> | 28 | #include <mach/pxa3xx-u2d.h> |
28 | 29 | ||
@@ -218,7 +219,7 @@ static int pxa27x_start_hc(struct pxa27x_ohci *ohci, struct device *dev) | |||
218 | 219 | ||
219 | inf = dev->platform_data; | 220 | inf = dev->platform_data; |
220 | 221 | ||
221 | clk_enable(ohci->clk); | 222 | clk_prepare_enable(ohci->clk); |
222 | 223 | ||
223 | pxa27x_reset_hc(ohci); | 224 | pxa27x_reset_hc(ohci); |
224 | 225 | ||
@@ -268,7 +269,7 @@ static void pxa27x_stop_hc(struct pxa27x_ohci *ohci, struct device *dev) | |||
268 | __raw_writel(uhccoms, ohci->mmio_base + UHCCOMS); | 269 | __raw_writel(uhccoms, ohci->mmio_base + UHCCOMS); |
269 | udelay(10); | 270 | udelay(10); |
270 | 271 | ||
271 | clk_disable(ohci->clk); | 272 | clk_disable_unprepare(ohci->clk); |
272 | } | 273 | } |
273 | 274 | ||
274 | 275 | ||
diff --git a/drivers/usb/host/ohci.h b/drivers/usb/host/ohci.h index 8ff6f7ea96fd..1b19aea25a2b 100644 --- a/drivers/usb/host/ohci.h +++ b/drivers/usb/host/ohci.h | |||
@@ -376,7 +376,7 @@ struct ohci_hcd { | |||
376 | * OTG controllers and transceivers need software interaction; | 376 | * OTG controllers and transceivers need software interaction; |
377 | * other external transceivers should be software-transparent | 377 | * other external transceivers should be software-transparent |
378 | */ | 378 | */ |
379 | struct otg_transceiver *transceiver; | 379 | struct usb_phy *transceiver; |
380 | void (*start_hnp)(struct ohci_hcd *ohci); | 380 | void (*start_hnp)(struct ohci_hcd *ohci); |
381 | 381 | ||
382 | /* | 382 | /* |
diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c index e84ca1928dbf..2bf1320dc9c3 100644 --- a/drivers/usb/host/r8a66597-hcd.c +++ b/drivers/usb/host/r8a66597-hcd.c | |||
@@ -2428,6 +2428,9 @@ static int __devinit r8a66597_probe(struct platform_device *pdev) | |||
2428 | int i; | 2428 | int i; |
2429 | unsigned long irq_trigger; | 2429 | unsigned long irq_trigger; |
2430 | 2430 | ||
2431 | if (usb_disabled()) | ||
2432 | return -ENODEV; | ||
2433 | |||
2431 | if (pdev->dev.dma_mask) { | 2434 | if (pdev->dev.dma_mask) { |
2432 | ret = -EINVAL; | 2435 | ret = -EINVAL; |
2433 | dev_err(&pdev->dev, "dma not supported\n"); | 2436 | dev_err(&pdev->dev, "dma not supported\n"); |
@@ -2552,20 +2555,4 @@ static struct platform_driver r8a66597_driver = { | |||
2552 | }, | 2555 | }, |
2553 | }; | 2556 | }; |
2554 | 2557 | ||
2555 | static int __init r8a66597_init(void) | 2558 | module_platform_driver(r8a66597_driver); |
2556 | { | ||
2557 | if (usb_disabled()) | ||
2558 | return -ENODEV; | ||
2559 | |||
2560 | printk(KERN_INFO KBUILD_MODNAME ": driver %s, %s\n", hcd_name, | ||
2561 | DRIVER_VERSION); | ||
2562 | return platform_driver_register(&r8a66597_driver); | ||
2563 | } | ||
2564 | module_init(r8a66597_init); | ||
2565 | |||
2566 | static void __exit r8a66597_cleanup(void) | ||
2567 | { | ||
2568 | platform_driver_unregister(&r8a66597_driver); | ||
2569 | } | ||
2570 | module_exit(r8a66597_cleanup); | ||
2571 | |||
diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c index 961d6638d8f9..2a2cce2d2fa7 100644 --- a/drivers/usb/host/sl811-hcd.c +++ b/drivers/usb/host/sl811-hcd.c | |||
@@ -1632,6 +1632,9 @@ sl811h_probe(struct platform_device *dev) | |||
1632 | u8 tmp, ioaddr = 0; | 1632 | u8 tmp, ioaddr = 0; |
1633 | unsigned long irqflags; | 1633 | unsigned long irqflags; |
1634 | 1634 | ||
1635 | if (usb_disabled()) | ||
1636 | return -ENODEV; | ||
1637 | |||
1635 | /* basic sanity checks first. board-specific init logic should | 1638 | /* basic sanity checks first. board-specific init logic should |
1636 | * have initialized these three resources and probably board | 1639 | * have initialized these three resources and probably board |
1637 | * specific platform_data. we don't probe for IRQs, and do only | 1640 | * specific platform_data. we don't probe for IRQs, and do only |
@@ -1817,20 +1820,4 @@ struct platform_driver sl811h_driver = { | |||
1817 | }; | 1820 | }; |
1818 | EXPORT_SYMBOL(sl811h_driver); | 1821 | EXPORT_SYMBOL(sl811h_driver); |
1819 | 1822 | ||
1820 | /*-------------------------------------------------------------------------*/ | 1823 | module_platform_driver(sl811h_driver); |
1821 | |||
1822 | static int __init sl811h_init(void) | ||
1823 | { | ||
1824 | if (usb_disabled()) | ||
1825 | return -ENODEV; | ||
1826 | |||
1827 | INFO("driver %s, %s\n", hcd_name, DRIVER_VERSION); | ||
1828 | return platform_driver_register(&sl811h_driver); | ||
1829 | } | ||
1830 | module_init(sl811h_init); | ||
1831 | |||
1832 | static void __exit sl811h_cleanup(void) | ||
1833 | { | ||
1834 | platform_driver_unregister(&sl811h_driver); | ||
1835 | } | ||
1836 | module_exit(sl811h_cleanup); | ||
diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c index 6b5eb1017e2c..e37dea87bb56 100644 --- a/drivers/usb/host/uhci-hcd.c +++ b/drivers/usb/host/uhci-hcd.c | |||
@@ -565,6 +565,9 @@ static int uhci_start(struct usb_hcd *hcd) | |||
565 | struct dentry __maybe_unused *dentry; | 565 | struct dentry __maybe_unused *dentry; |
566 | 566 | ||
567 | hcd->uses_new_polling = 1; | 567 | hcd->uses_new_polling = 1; |
568 | /* Accept arbitrarily long scatter-gather lists */ | ||
569 | if (!(hcd->driver->flags & HCD_LOCAL_MEM)) | ||
570 | hcd->self.sg_tablesize = ~0; | ||
568 | 571 | ||
569 | spin_lock_init(&uhci->lock); | 572 | spin_lock_init(&uhci->lock); |
570 | setup_timer(&uhci->fsbr_timer, uhci_fsbr_timeout, | 573 | setup_timer(&uhci->fsbr_timer, uhci_fsbr_timeout, |
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c index 557b6f32db86..673ad120c43e 100644 --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c | |||
@@ -422,6 +422,32 @@ void xhci_set_link_state(struct xhci_hcd *xhci, __le32 __iomem **port_array, | |||
422 | xhci_writel(xhci, temp, port_array[port_id]); | 422 | xhci_writel(xhci, temp, port_array[port_id]); |
423 | } | 423 | } |
424 | 424 | ||
425 | void xhci_set_remote_wake_mask(struct xhci_hcd *xhci, | ||
426 | __le32 __iomem **port_array, int port_id, u16 wake_mask) | ||
427 | { | ||
428 | u32 temp; | ||
429 | |||
430 | temp = xhci_readl(xhci, port_array[port_id]); | ||
431 | temp = xhci_port_state_to_neutral(temp); | ||
432 | |||
433 | if (wake_mask & USB_PORT_FEAT_REMOTE_WAKE_CONNECT) | ||
434 | temp |= PORT_WKCONN_E; | ||
435 | else | ||
436 | temp &= ~PORT_WKCONN_E; | ||
437 | |||
438 | if (wake_mask & USB_PORT_FEAT_REMOTE_WAKE_DISCONNECT) | ||
439 | temp |= PORT_WKDISC_E; | ||
440 | else | ||
441 | temp &= ~PORT_WKDISC_E; | ||
442 | |||
443 | if (wake_mask & USB_PORT_FEAT_REMOTE_WAKE_OVER_CURRENT) | ||
444 | temp |= PORT_WKOC_E; | ||
445 | else | ||
446 | temp &= ~PORT_WKOC_E; | ||
447 | |||
448 | xhci_writel(xhci, temp, port_array[port_id]); | ||
449 | } | ||
450 | |||
425 | /* Test and clear port RWC bit */ | 451 | /* Test and clear port RWC bit */ |
426 | void xhci_test_and_clear_bit(struct xhci_hcd *xhci, __le32 __iomem **port_array, | 452 | void xhci_test_and_clear_bit(struct xhci_hcd *xhci, __le32 __iomem **port_array, |
427 | int port_id, u32 port_bit) | 453 | int port_id, u32 port_bit) |
@@ -448,6 +474,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
448 | int slot_id; | 474 | int slot_id; |
449 | struct xhci_bus_state *bus_state; | 475 | struct xhci_bus_state *bus_state; |
450 | u16 link_state = 0; | 476 | u16 link_state = 0; |
477 | u16 wake_mask = 0; | ||
451 | 478 | ||
452 | max_ports = xhci_get_ports(hcd, &port_array); | 479 | max_ports = xhci_get_ports(hcd, &port_array); |
453 | bus_state = &xhci->bus_state[hcd_index(hcd)]; | 480 | bus_state = &xhci->bus_state[hcd_index(hcd)]; |
@@ -593,6 +620,8 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
593 | case SetPortFeature: | 620 | case SetPortFeature: |
594 | if (wValue == USB_PORT_FEAT_LINK_STATE) | 621 | if (wValue == USB_PORT_FEAT_LINK_STATE) |
595 | link_state = (wIndex & 0xff00) >> 3; | 622 | link_state = (wIndex & 0xff00) >> 3; |
623 | if (wValue == USB_PORT_FEAT_REMOTE_WAKE_MASK) | ||
624 | wake_mask = wIndex & 0xff00; | ||
596 | wIndex &= 0xff; | 625 | wIndex &= 0xff; |
597 | if (!wIndex || wIndex > max_ports) | 626 | if (!wIndex || wIndex > max_ports) |
598 | goto error; | 627 | goto error; |
@@ -703,6 +732,14 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
703 | temp = xhci_readl(xhci, port_array[wIndex]); | 732 | temp = xhci_readl(xhci, port_array[wIndex]); |
704 | xhci_dbg(xhci, "set port reset, actual port %d status = 0x%x\n", wIndex, temp); | 733 | xhci_dbg(xhci, "set port reset, actual port %d status = 0x%x\n", wIndex, temp); |
705 | break; | 734 | break; |
735 | case USB_PORT_FEAT_REMOTE_WAKE_MASK: | ||
736 | xhci_set_remote_wake_mask(xhci, port_array, | ||
737 | wIndex, wake_mask); | ||
738 | temp = xhci_readl(xhci, port_array[wIndex]); | ||
739 | xhci_dbg(xhci, "set port remote wake mask, " | ||
740 | "actual port %d status = 0x%x\n", | ||
741 | wIndex, temp); | ||
742 | break; | ||
706 | case USB_PORT_FEAT_BH_PORT_RESET: | 743 | case USB_PORT_FEAT_BH_PORT_RESET: |
707 | temp |= PORT_WR; | 744 | temp |= PORT_WR; |
708 | xhci_writel(xhci, temp, port_array[wIndex]); | 745 | xhci_writel(xhci, temp, port_array[wIndex]); |
@@ -883,6 +920,10 @@ int xhci_bus_suspend(struct usb_hcd *hcd) | |||
883 | t2 |= PORT_LINK_STROBE | XDEV_U3; | 920 | t2 |= PORT_LINK_STROBE | XDEV_U3; |
884 | set_bit(port_index, &bus_state->bus_suspended); | 921 | set_bit(port_index, &bus_state->bus_suspended); |
885 | } | 922 | } |
923 | /* USB core sets remote wake mask for USB 3.0 hubs, | ||
924 | * including the USB 3.0 roothub, but only if CONFIG_USB_SUSPEND | ||
925 | * is enabled, so also enable remote wake here. | ||
926 | */ | ||
886 | if (hcd->self.root_hub->do_remote_wakeup) { | 927 | if (hcd->self.root_hub->do_remote_wakeup) { |
887 | if (t1 & PORT_CONNECT) { | 928 | if (t1 & PORT_CONNECT) { |
888 | t2 |= PORT_WKOC_E | PORT_WKDISC_E; | 929 | t2 |= PORT_WKOC_E | PORT_WKDISC_E; |
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 383fc857491c..cae4c6f2845a 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c | |||
@@ -34,10 +34,12 @@ | |||
34 | * Section 4.11.1.1: | 34 | * Section 4.11.1.1: |
35 | * "All components of all Command and Transfer TRBs shall be initialized to '0'" | 35 | * "All components of all Command and Transfer TRBs shall be initialized to '0'" |
36 | */ | 36 | */ |
37 | static struct xhci_segment *xhci_segment_alloc(struct xhci_hcd *xhci, gfp_t flags) | 37 | static struct xhci_segment *xhci_segment_alloc(struct xhci_hcd *xhci, |
38 | unsigned int cycle_state, gfp_t flags) | ||
38 | { | 39 | { |
39 | struct xhci_segment *seg; | 40 | struct xhci_segment *seg; |
40 | dma_addr_t dma; | 41 | dma_addr_t dma; |
42 | int i; | ||
41 | 43 | ||
42 | seg = kzalloc(sizeof *seg, flags); | 44 | seg = kzalloc(sizeof *seg, flags); |
43 | if (!seg) | 45 | if (!seg) |
@@ -50,6 +52,11 @@ static struct xhci_segment *xhci_segment_alloc(struct xhci_hcd *xhci, gfp_t flag | |||
50 | } | 52 | } |
51 | 53 | ||
52 | memset(seg->trbs, 0, SEGMENT_SIZE); | 54 | memset(seg->trbs, 0, SEGMENT_SIZE); |
55 | /* If the cycle state is 0, set the cycle bit to 1 for all the TRBs */ | ||
56 | if (cycle_state == 0) { | ||
57 | for (i = 0; i < TRBS_PER_SEGMENT; i++) | ||
58 | seg->trbs[i].link.control |= TRB_CYCLE; | ||
59 | } | ||
53 | seg->dma = dma; | 60 | seg->dma = dma; |
54 | seg->next = NULL; | 61 | seg->next = NULL; |
55 | 62 | ||
@@ -65,6 +72,20 @@ static void xhci_segment_free(struct xhci_hcd *xhci, struct xhci_segment *seg) | |||
65 | kfree(seg); | 72 | kfree(seg); |
66 | } | 73 | } |
67 | 74 | ||
75 | static void xhci_free_segments_for_ring(struct xhci_hcd *xhci, | ||
76 | struct xhci_segment *first) | ||
77 | { | ||
78 | struct xhci_segment *seg; | ||
79 | |||
80 | seg = first->next; | ||
81 | while (seg != first) { | ||
82 | struct xhci_segment *next = seg->next; | ||
83 | xhci_segment_free(xhci, seg); | ||
84 | seg = next; | ||
85 | } | ||
86 | xhci_segment_free(xhci, first); | ||
87 | } | ||
88 | |||
68 | /* | 89 | /* |
69 | * Make the prev segment point to the next segment. | 90 | * Make the prev segment point to the next segment. |
70 | * | 91 | * |
@@ -73,14 +94,14 @@ static void xhci_segment_free(struct xhci_hcd *xhci, struct xhci_segment *seg) | |||
73 | * related flags, such as End TRB, Toggle Cycle, and no snoop. | 94 | * related flags, such as End TRB, Toggle Cycle, and no snoop. |
74 | */ | 95 | */ |
75 | static void xhci_link_segments(struct xhci_hcd *xhci, struct xhci_segment *prev, | 96 | static void xhci_link_segments(struct xhci_hcd *xhci, struct xhci_segment *prev, |
76 | struct xhci_segment *next, bool link_trbs, bool isoc) | 97 | struct xhci_segment *next, enum xhci_ring_type type) |
77 | { | 98 | { |
78 | u32 val; | 99 | u32 val; |
79 | 100 | ||
80 | if (!prev || !next) | 101 | if (!prev || !next) |
81 | return; | 102 | return; |
82 | prev->next = next; | 103 | prev->next = next; |
83 | if (link_trbs) { | 104 | if (type != TYPE_EVENT) { |
84 | prev->trbs[TRBS_PER_SEGMENT-1].link.segment_ptr = | 105 | prev->trbs[TRBS_PER_SEGMENT-1].link.segment_ptr = |
85 | cpu_to_le64(next->dma); | 106 | cpu_to_le64(next->dma); |
86 | 107 | ||
@@ -91,35 +112,55 @@ static void xhci_link_segments(struct xhci_hcd *xhci, struct xhci_segment *prev, | |||
91 | /* Always set the chain bit with 0.95 hardware */ | 112 | /* Always set the chain bit with 0.95 hardware */ |
92 | /* Set chain bit for isoc rings on AMD 0.96 host */ | 113 | /* Set chain bit for isoc rings on AMD 0.96 host */ |
93 | if (xhci_link_trb_quirk(xhci) || | 114 | if (xhci_link_trb_quirk(xhci) || |
94 | (isoc && (xhci->quirks & XHCI_AMD_0x96_HOST))) | 115 | (type == TYPE_ISOC && |
116 | (xhci->quirks & XHCI_AMD_0x96_HOST))) | ||
95 | val |= TRB_CHAIN; | 117 | val |= TRB_CHAIN; |
96 | prev->trbs[TRBS_PER_SEGMENT-1].link.control = cpu_to_le32(val); | 118 | prev->trbs[TRBS_PER_SEGMENT-1].link.control = cpu_to_le32(val); |
97 | } | 119 | } |
98 | } | 120 | } |
99 | 121 | ||
122 | /* | ||
123 | * Link the ring to the new segments. | ||
124 | * Set Toggle Cycle for the new ring if needed. | ||
125 | */ | ||
126 | static void xhci_link_rings(struct xhci_hcd *xhci, struct xhci_ring *ring, | ||
127 | struct xhci_segment *first, struct xhci_segment *last, | ||
128 | unsigned int num_segs) | ||
129 | { | ||
130 | struct xhci_segment *next; | ||
131 | |||
132 | if (!ring || !first || !last) | ||
133 | return; | ||
134 | |||
135 | next = ring->enq_seg->next; | ||
136 | xhci_link_segments(xhci, ring->enq_seg, first, ring->type); | ||
137 | xhci_link_segments(xhci, last, next, ring->type); | ||
138 | ring->num_segs += num_segs; | ||
139 | ring->num_trbs_free += (TRBS_PER_SEGMENT - 1) * num_segs; | ||
140 | |||
141 | if (ring->type != TYPE_EVENT && ring->enq_seg == ring->last_seg) { | ||
142 | ring->last_seg->trbs[TRBS_PER_SEGMENT-1].link.control | ||
143 | &= ~cpu_to_le32(LINK_TOGGLE); | ||
144 | last->trbs[TRBS_PER_SEGMENT-1].link.control | ||
145 | |= cpu_to_le32(LINK_TOGGLE); | ||
146 | ring->last_seg = last; | ||
147 | } | ||
148 | } | ||
149 | |||
100 | /* XXX: Do we need the hcd structure in all these functions? */ | 150 | /* XXX: Do we need the hcd structure in all these functions? */ |
101 | void xhci_ring_free(struct xhci_hcd *xhci, struct xhci_ring *ring) | 151 | void xhci_ring_free(struct xhci_hcd *xhci, struct xhci_ring *ring) |
102 | { | 152 | { |
103 | struct xhci_segment *seg; | ||
104 | struct xhci_segment *first_seg; | ||
105 | |||
106 | if (!ring) | 153 | if (!ring) |
107 | return; | 154 | return; |
108 | if (ring->first_seg) { | 155 | |
109 | first_seg = ring->first_seg; | 156 | if (ring->first_seg) |
110 | seg = first_seg->next; | 157 | xhci_free_segments_for_ring(xhci, ring->first_seg); |
111 | while (seg != first_seg) { | 158 | |
112 | struct xhci_segment *next = seg->next; | ||
113 | xhci_segment_free(xhci, seg); | ||
114 | seg = next; | ||
115 | } | ||
116 | xhci_segment_free(xhci, first_seg); | ||
117 | ring->first_seg = NULL; | ||
118 | } | ||
119 | kfree(ring); | 159 | kfree(ring); |
120 | } | 160 | } |
121 | 161 | ||
122 | static void xhci_initialize_ring_info(struct xhci_ring *ring) | 162 | static void xhci_initialize_ring_info(struct xhci_ring *ring, |
163 | unsigned int cycle_state) | ||
123 | { | 164 | { |
124 | /* The ring is empty, so the enqueue pointer == dequeue pointer */ | 165 | /* The ring is empty, so the enqueue pointer == dequeue pointer */ |
125 | ring->enqueue = ring->first_seg->trbs; | 166 | ring->enqueue = ring->first_seg->trbs; |
@@ -129,11 +170,53 @@ static void xhci_initialize_ring_info(struct xhci_ring *ring) | |||
129 | /* The ring is initialized to 0. The producer must write 1 to the cycle | 170 | /* The ring is initialized to 0. The producer must write 1 to the cycle |
130 | * bit to handover ownership of the TRB, so PCS = 1. The consumer must | 171 | * bit to handover ownership of the TRB, so PCS = 1. The consumer must |
131 | * compare CCS to the cycle bit to check ownership, so CCS = 1. | 172 | * compare CCS to the cycle bit to check ownership, so CCS = 1. |
173 | * | ||
174 | * New rings are initialized with cycle state equal to 1; if we are | ||
175 | * handling ring expansion, set the cycle state equal to the old ring. | ||
132 | */ | 176 | */ |
133 | ring->cycle_state = 1; | 177 | ring->cycle_state = cycle_state; |
134 | /* Not necessary for new rings, but needed for re-initialized rings */ | 178 | /* Not necessary for new rings, but needed for re-initialized rings */ |
135 | ring->enq_updates = 0; | 179 | ring->enq_updates = 0; |
136 | ring->deq_updates = 0; | 180 | ring->deq_updates = 0; |
181 | |||
182 | /* | ||
183 | * Each segment has a link TRB, and leave an extra TRB for SW | ||
184 | * accounting purpose | ||
185 | */ | ||
186 | ring->num_trbs_free = ring->num_segs * (TRBS_PER_SEGMENT - 1) - 1; | ||
187 | } | ||
188 | |||
189 | /* Allocate segments and link them for a ring */ | ||
190 | static int xhci_alloc_segments_for_ring(struct xhci_hcd *xhci, | ||
191 | struct xhci_segment **first, struct xhci_segment **last, | ||
192 | unsigned int num_segs, unsigned int cycle_state, | ||
193 | enum xhci_ring_type type, gfp_t flags) | ||
194 | { | ||
195 | struct xhci_segment *prev; | ||
196 | |||
197 | prev = xhci_segment_alloc(xhci, cycle_state, flags); | ||
198 | if (!prev) | ||
199 | return -ENOMEM; | ||
200 | num_segs--; | ||
201 | |||
202 | *first = prev; | ||
203 | while (num_segs > 0) { | ||
204 | struct xhci_segment *next; | ||
205 | |||
206 | next = xhci_segment_alloc(xhci, cycle_state, flags); | ||
207 | if (!next) { | ||
208 | xhci_free_segments_for_ring(xhci, *first); | ||
209 | return -ENOMEM; | ||
210 | } | ||
211 | xhci_link_segments(xhci, prev, next, type); | ||
212 | |||
213 | prev = next; | ||
214 | num_segs--; | ||
215 | } | ||
216 | xhci_link_segments(xhci, prev, *first, type); | ||
217 | *last = prev; | ||
218 | |||
219 | return 0; | ||
137 | } | 220 | } |
138 | 221 | ||
139 | /** | 222 | /** |
@@ -144,44 +227,34 @@ static void xhci_initialize_ring_info(struct xhci_ring *ring) | |||
144 | * See section 4.9.1 and figures 15 and 16. | 227 | * See section 4.9.1 and figures 15 and 16. |
145 | */ | 228 | */ |
146 | static struct xhci_ring *xhci_ring_alloc(struct xhci_hcd *xhci, | 229 | static struct xhci_ring *xhci_ring_alloc(struct xhci_hcd *xhci, |
147 | unsigned int num_segs, bool link_trbs, bool isoc, gfp_t flags) | 230 | unsigned int num_segs, unsigned int cycle_state, |
231 | enum xhci_ring_type type, gfp_t flags) | ||
148 | { | 232 | { |
149 | struct xhci_ring *ring; | 233 | struct xhci_ring *ring; |
150 | struct xhci_segment *prev; | 234 | int ret; |
151 | 235 | ||
152 | ring = kzalloc(sizeof *(ring), flags); | 236 | ring = kzalloc(sizeof *(ring), flags); |
153 | if (!ring) | 237 | if (!ring) |
154 | return NULL; | 238 | return NULL; |
155 | 239 | ||
240 | ring->num_segs = num_segs; | ||
156 | INIT_LIST_HEAD(&ring->td_list); | 241 | INIT_LIST_HEAD(&ring->td_list); |
242 | ring->type = type; | ||
157 | if (num_segs == 0) | 243 | if (num_segs == 0) |
158 | return ring; | 244 | return ring; |
159 | 245 | ||
160 | ring->first_seg = xhci_segment_alloc(xhci, flags); | 246 | ret = xhci_alloc_segments_for_ring(xhci, &ring->first_seg, |
161 | if (!ring->first_seg) | 247 | &ring->last_seg, num_segs, cycle_state, type, flags); |
248 | if (ret) | ||
162 | goto fail; | 249 | goto fail; |
163 | num_segs--; | ||
164 | 250 | ||
165 | prev = ring->first_seg; | 251 | /* Only event ring does not use link TRB */ |
166 | while (num_segs > 0) { | 252 | if (type != TYPE_EVENT) { |
167 | struct xhci_segment *next; | ||
168 | |||
169 | next = xhci_segment_alloc(xhci, flags); | ||
170 | if (!next) | ||
171 | goto fail; | ||
172 | xhci_link_segments(xhci, prev, next, link_trbs, isoc); | ||
173 | |||
174 | prev = next; | ||
175 | num_segs--; | ||
176 | } | ||
177 | xhci_link_segments(xhci, prev, ring->first_seg, link_trbs, isoc); | ||
178 | |||
179 | if (link_trbs) { | ||
180 | /* See section 4.9.2.1 and 6.4.4.1 */ | 253 | /* See section 4.9.2.1 and 6.4.4.1 */ |
181 | prev->trbs[TRBS_PER_SEGMENT-1].link.control |= | 254 | ring->last_seg->trbs[TRBS_PER_SEGMENT - 1].link.control |= |
182 | cpu_to_le32(LINK_TOGGLE); | 255 | cpu_to_le32(LINK_TOGGLE); |
183 | } | 256 | } |
184 | xhci_initialize_ring_info(ring); | 257 | xhci_initialize_ring_info(ring, cycle_state); |
185 | return ring; | 258 | return ring; |
186 | 259 | ||
187 | fail: | 260 | fail: |
@@ -217,23 +290,64 @@ void xhci_free_or_cache_endpoint_ring(struct xhci_hcd *xhci, | |||
217 | * pointers to the beginning of the ring. | 290 | * pointers to the beginning of the ring. |
218 | */ | 291 | */ |
219 | static void xhci_reinit_cached_ring(struct xhci_hcd *xhci, | 292 | static void xhci_reinit_cached_ring(struct xhci_hcd *xhci, |
220 | struct xhci_ring *ring, bool isoc) | 293 | struct xhci_ring *ring, unsigned int cycle_state, |
294 | enum xhci_ring_type type) | ||
221 | { | 295 | { |
222 | struct xhci_segment *seg = ring->first_seg; | 296 | struct xhci_segment *seg = ring->first_seg; |
297 | int i; | ||
298 | |||
223 | do { | 299 | do { |
224 | memset(seg->trbs, 0, | 300 | memset(seg->trbs, 0, |
225 | sizeof(union xhci_trb)*TRBS_PER_SEGMENT); | 301 | sizeof(union xhci_trb)*TRBS_PER_SEGMENT); |
302 | if (cycle_state == 0) { | ||
303 | for (i = 0; i < TRBS_PER_SEGMENT; i++) | ||
304 | seg->trbs[i].link.control |= TRB_CYCLE; | ||
305 | } | ||
226 | /* All endpoint rings have link TRBs */ | 306 | /* All endpoint rings have link TRBs */ |
227 | xhci_link_segments(xhci, seg, seg->next, 1, isoc); | 307 | xhci_link_segments(xhci, seg, seg->next, type); |
228 | seg = seg->next; | 308 | seg = seg->next; |
229 | } while (seg != ring->first_seg); | 309 | } while (seg != ring->first_seg); |
230 | xhci_initialize_ring_info(ring); | 310 | ring->type = type; |
311 | xhci_initialize_ring_info(ring, cycle_state); | ||
231 | /* td list should be empty since all URBs have been cancelled, | 312 | /* td list should be empty since all URBs have been cancelled, |
232 | * but just in case... | 313 | * but just in case... |
233 | */ | 314 | */ |
234 | INIT_LIST_HEAD(&ring->td_list); | 315 | INIT_LIST_HEAD(&ring->td_list); |
235 | } | 316 | } |
236 | 317 | ||
318 | /* | ||
319 | * Expand an existing ring. | ||
320 | * Look for a cached ring or allocate a new ring which has same segment numbers | ||
321 | * and link the two rings. | ||
322 | */ | ||
323 | int xhci_ring_expansion(struct xhci_hcd *xhci, struct xhci_ring *ring, | ||
324 | unsigned int num_trbs, gfp_t flags) | ||
325 | { | ||
326 | struct xhci_segment *first; | ||
327 | struct xhci_segment *last; | ||
328 | unsigned int num_segs; | ||
329 | unsigned int num_segs_needed; | ||
330 | int ret; | ||
331 | |||
332 | num_segs_needed = (num_trbs + (TRBS_PER_SEGMENT - 1) - 1) / | ||
333 | (TRBS_PER_SEGMENT - 1); | ||
334 | |||
335 | /* Allocate number of segments we needed, or double the ring size */ | ||
336 | num_segs = ring->num_segs > num_segs_needed ? | ||
337 | ring->num_segs : num_segs_needed; | ||
338 | |||
339 | ret = xhci_alloc_segments_for_ring(xhci, &first, &last, | ||
340 | num_segs, ring->cycle_state, ring->type, flags); | ||
341 | if (ret) | ||
342 | return -ENOMEM; | ||
343 | |||
344 | xhci_link_rings(xhci, ring, first, last, num_segs); | ||
345 | xhci_dbg(xhci, "ring expansion succeed, now has %d segments\n", | ||
346 | ring->num_segs); | ||
347 | |||
348 | return 0; | ||
349 | } | ||
350 | |||
237 | #define CTX_SIZE(_hcc) (HCC_64BYTE_CONTEXT(_hcc) ? 64 : 32) | 351 | #define CTX_SIZE(_hcc) (HCC_64BYTE_CONTEXT(_hcc) ? 64 : 32) |
238 | 352 | ||
239 | static struct xhci_container_ctx *xhci_alloc_container_ctx(struct xhci_hcd *xhci, | 353 | static struct xhci_container_ctx *xhci_alloc_container_ctx(struct xhci_hcd *xhci, |
@@ -528,7 +642,7 @@ struct xhci_stream_info *xhci_alloc_stream_info(struct xhci_hcd *xhci, | |||
528 | */ | 642 | */ |
529 | for (cur_stream = 1; cur_stream < num_streams; cur_stream++) { | 643 | for (cur_stream = 1; cur_stream < num_streams; cur_stream++) { |
530 | stream_info->stream_rings[cur_stream] = | 644 | stream_info->stream_rings[cur_stream] = |
531 | xhci_ring_alloc(xhci, 1, true, false, mem_flags); | 645 | xhci_ring_alloc(xhci, 2, 1, TYPE_STREAM, mem_flags); |
532 | cur_ring = stream_info->stream_rings[cur_stream]; | 646 | cur_ring = stream_info->stream_rings[cur_stream]; |
533 | if (!cur_ring) | 647 | if (!cur_ring) |
534 | goto cleanup_rings; | 648 | goto cleanup_rings; |
@@ -862,7 +976,7 @@ int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id, | |||
862 | } | 976 | } |
863 | 977 | ||
864 | /* Allocate endpoint 0 ring */ | 978 | /* Allocate endpoint 0 ring */ |
865 | dev->eps[0].ring = xhci_ring_alloc(xhci, 1, true, false, flags); | 979 | dev->eps[0].ring = xhci_ring_alloc(xhci, 2, 1, TYPE_CTRL, flags); |
866 | if (!dev->eps[0].ring) | 980 | if (!dev->eps[0].ring) |
867 | goto fail; | 981 | goto fail; |
868 | 982 | ||
@@ -1300,24 +1414,16 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, | |||
1300 | struct xhci_ring *ep_ring; | 1414 | struct xhci_ring *ep_ring; |
1301 | unsigned int max_packet; | 1415 | unsigned int max_packet; |
1302 | unsigned int max_burst; | 1416 | unsigned int max_burst; |
1417 | enum xhci_ring_type type; | ||
1303 | u32 max_esit_payload; | 1418 | u32 max_esit_payload; |
1304 | 1419 | ||
1305 | ep_index = xhci_get_endpoint_index(&ep->desc); | 1420 | ep_index = xhci_get_endpoint_index(&ep->desc); |
1306 | ep_ctx = xhci_get_ep_ctx(xhci, virt_dev->in_ctx, ep_index); | 1421 | ep_ctx = xhci_get_ep_ctx(xhci, virt_dev->in_ctx, ep_index); |
1307 | 1422 | ||
1423 | type = usb_endpoint_type(&ep->desc); | ||
1308 | /* Set up the endpoint ring */ | 1424 | /* Set up the endpoint ring */ |
1309 | /* | 1425 | virt_dev->eps[ep_index].new_ring = |
1310 | * Isochronous endpoint ring needs bigger size because one isoc URB | 1426 | xhci_ring_alloc(xhci, 2, 1, type, mem_flags); |
1311 | * carries multiple packets and it will insert multiple tds to the | ||
1312 | * ring. | ||
1313 | * This should be replaced with dynamic ring resizing in the future. | ||
1314 | */ | ||
1315 | if (usb_endpoint_xfer_isoc(&ep->desc)) | ||
1316 | virt_dev->eps[ep_index].new_ring = | ||
1317 | xhci_ring_alloc(xhci, 8, true, true, mem_flags); | ||
1318 | else | ||
1319 | virt_dev->eps[ep_index].new_ring = | ||
1320 | xhci_ring_alloc(xhci, 1, true, false, mem_flags); | ||
1321 | if (!virt_dev->eps[ep_index].new_ring) { | 1427 | if (!virt_dev->eps[ep_index].new_ring) { |
1322 | /* Attempt to use the ring cache */ | 1428 | /* Attempt to use the ring cache */ |
1323 | if (virt_dev->num_rings_cached == 0) | 1429 | if (virt_dev->num_rings_cached == 0) |
@@ -1327,7 +1433,7 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, | |||
1327 | virt_dev->ring_cache[virt_dev->num_rings_cached] = NULL; | 1433 | virt_dev->ring_cache[virt_dev->num_rings_cached] = NULL; |
1328 | virt_dev->num_rings_cached--; | 1434 | virt_dev->num_rings_cached--; |
1329 | xhci_reinit_cached_ring(xhci, virt_dev->eps[ep_index].new_ring, | 1435 | xhci_reinit_cached_ring(xhci, virt_dev->eps[ep_index].new_ring, |
1330 | usb_endpoint_xfer_isoc(&ep->desc) ? true : false); | 1436 | 1, type); |
1331 | } | 1437 | } |
1332 | virt_dev->eps[ep_index].skip = false; | 1438 | virt_dev->eps[ep_index].skip = false; |
1333 | ep_ring = virt_dev->eps[ep_index].new_ring; | 1439 | ep_ring = virt_dev->eps[ep_index].new_ring; |
@@ -2157,7 +2263,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | |||
2157 | unsigned int val, val2; | 2263 | unsigned int val, val2; |
2158 | u64 val_64; | 2264 | u64 val_64; |
2159 | struct xhci_segment *seg; | 2265 | struct xhci_segment *seg; |
2160 | u32 page_size; | 2266 | u32 page_size, temp; |
2161 | int i; | 2267 | int i; |
2162 | 2268 | ||
2163 | page_size = xhci_readl(xhci, &xhci->op_regs->page_size); | 2269 | page_size = xhci_readl(xhci, &xhci->op_regs->page_size); |
@@ -2235,7 +2341,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | |||
2235 | goto fail; | 2341 | goto fail; |
2236 | 2342 | ||
2237 | /* Set up the command ring to have one segments for now. */ | 2343 | /* Set up the command ring to have one segments for now. */ |
2238 | xhci->cmd_ring = xhci_ring_alloc(xhci, 1, true, false, flags); | 2344 | xhci->cmd_ring = xhci_ring_alloc(xhci, 1, 1, TYPE_COMMAND, flags); |
2239 | if (!xhci->cmd_ring) | 2345 | if (!xhci->cmd_ring) |
2240 | goto fail; | 2346 | goto fail; |
2241 | xhci_dbg(xhci, "Allocated command ring at %p\n", xhci->cmd_ring); | 2347 | xhci_dbg(xhci, "Allocated command ring at %p\n", xhci->cmd_ring); |
@@ -2266,7 +2372,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | |||
2266 | * the event ring segment table (ERST). Section 4.9.3. | 2372 | * the event ring segment table (ERST). Section 4.9.3. |
2267 | */ | 2373 | */ |
2268 | xhci_dbg(xhci, "// Allocating event ring\n"); | 2374 | xhci_dbg(xhci, "// Allocating event ring\n"); |
2269 | xhci->event_ring = xhci_ring_alloc(xhci, ERST_NUM_SEGS, false, false, | 2375 | xhci->event_ring = xhci_ring_alloc(xhci, ERST_NUM_SEGS, 1, TYPE_EVENT, |
2270 | flags); | 2376 | flags); |
2271 | if (!xhci->event_ring) | 2377 | if (!xhci->event_ring) |
2272 | goto fail; | 2378 | goto fail; |
@@ -2340,6 +2446,15 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | |||
2340 | 2446 | ||
2341 | INIT_LIST_HEAD(&xhci->lpm_failed_devs); | 2447 | INIT_LIST_HEAD(&xhci->lpm_failed_devs); |
2342 | 2448 | ||
2449 | /* Enable USB 3.0 device notifications for function remote wake, which | ||
2450 | * is necessary for allowing USB 3.0 devices to do remote wakeup from | ||
2451 | * U3 (device suspend). | ||
2452 | */ | ||
2453 | temp = xhci_readl(xhci, &xhci->op_regs->dev_notification); | ||
2454 | temp &= ~DEV_NOTE_MASK; | ||
2455 | temp |= DEV_NOTE_FWAKE; | ||
2456 | xhci_writel(xhci, temp, &xhci->op_regs->dev_notification); | ||
2457 | |||
2343 | return 0; | 2458 | return 0; |
2344 | 2459 | ||
2345 | fail: | 2460 | fail: |
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c new file mode 100644 index 000000000000..689bc18b051d --- /dev/null +++ b/drivers/usb/host/xhci-plat.c | |||
@@ -0,0 +1,205 @@ | |||
1 | /* | ||
2 | * xhci-plat.c - xHCI host controller driver platform Bus Glue. | ||
3 | * | ||
4 | * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com | ||
5 | * Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de> | ||
6 | * | ||
7 | * A lot of code borrowed from the Linux xHCI driver. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or | ||
10 | * modify it under the terms of the GNU General Public License | ||
11 | * version 2 as published by the Free Software Foundation. | ||
12 | */ | ||
13 | |||
14 | #include <linux/platform_device.h> | ||
15 | #include <linux/module.h> | ||
16 | #include <linux/slab.h> | ||
17 | |||
18 | #include "xhci.h" | ||
19 | |||
20 | static void xhci_plat_quirks(struct device *dev, struct xhci_hcd *xhci) | ||
21 | { | ||
22 | /* | ||
23 | * As of now platform drivers don't provide MSI support so we ensure | ||
24 | * here that the generic code does not try to make a pci_dev from our | ||
25 | * dev struct in order to setup MSI | ||
26 | */ | ||
27 | xhci->quirks |= XHCI_BROKEN_MSI; | ||
28 | } | ||
29 | |||
30 | /* called during probe() after chip reset completes */ | ||
31 | static int xhci_plat_setup(struct usb_hcd *hcd) | ||
32 | { | ||
33 | return xhci_gen_setup(hcd, xhci_plat_quirks); | ||
34 | } | ||
35 | |||
36 | static const struct hc_driver xhci_plat_xhci_driver = { | ||
37 | .description = "xhci-hcd", | ||
38 | .product_desc = "xHCI Host Controller", | ||
39 | .hcd_priv_size = sizeof(struct xhci_hcd *), | ||
40 | |||
41 | /* | ||
42 | * generic hardware linkage | ||
43 | */ | ||
44 | .irq = xhci_irq, | ||
45 | .flags = HCD_MEMORY | HCD_USB3 | HCD_SHARED, | ||
46 | |||
47 | /* | ||
48 | * basic lifecycle operations | ||
49 | */ | ||
50 | .reset = xhci_plat_setup, | ||
51 | .start = xhci_run, | ||
52 | .stop = xhci_stop, | ||
53 | .shutdown = xhci_shutdown, | ||
54 | |||
55 | /* | ||
56 | * managing i/o requests and associated device resources | ||
57 | */ | ||
58 | .urb_enqueue = xhci_urb_enqueue, | ||
59 | .urb_dequeue = xhci_urb_dequeue, | ||
60 | .alloc_dev = xhci_alloc_dev, | ||
61 | .free_dev = xhci_free_dev, | ||
62 | .alloc_streams = xhci_alloc_streams, | ||
63 | .free_streams = xhci_free_streams, | ||
64 | .add_endpoint = xhci_add_endpoint, | ||
65 | .drop_endpoint = xhci_drop_endpoint, | ||
66 | .endpoint_reset = xhci_endpoint_reset, | ||
67 | .check_bandwidth = xhci_check_bandwidth, | ||
68 | .reset_bandwidth = xhci_reset_bandwidth, | ||
69 | .address_device = xhci_address_device, | ||
70 | .update_hub_device = xhci_update_hub_device, | ||
71 | .reset_device = xhci_discover_or_reset_device, | ||
72 | |||
73 | /* | ||
74 | * scheduling support | ||
75 | */ | ||
76 | .get_frame_number = xhci_get_frame, | ||
77 | |||
78 | /* Root hub support */ | ||
79 | .hub_control = xhci_hub_control, | ||
80 | .hub_status_data = xhci_hub_status_data, | ||
81 | .bus_suspend = xhci_bus_suspend, | ||
82 | .bus_resume = xhci_bus_resume, | ||
83 | }; | ||
84 | |||
85 | static int xhci_plat_probe(struct platform_device *pdev) | ||
86 | { | ||
87 | const struct hc_driver *driver; | ||
88 | struct xhci_hcd *xhci; | ||
89 | struct resource *res; | ||
90 | struct usb_hcd *hcd; | ||
91 | int ret; | ||
92 | int irq; | ||
93 | |||
94 | if (usb_disabled()) | ||
95 | return -ENODEV; | ||
96 | |||
97 | driver = &xhci_plat_xhci_driver; | ||
98 | |||
99 | irq = platform_get_irq(pdev, 0); | ||
100 | if (irq < 0) | ||
101 | return -ENODEV; | ||
102 | |||
103 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
104 | if (!res) | ||
105 | return -ENODEV; | ||
106 | |||
107 | hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); | ||
108 | if (!hcd) | ||
109 | return -ENOMEM; | ||
110 | |||
111 | hcd->rsrc_start = res->start; | ||
112 | hcd->rsrc_len = resource_size(res); | ||
113 | |||
114 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, | ||
115 | driver->description)) { | ||
116 | dev_dbg(&pdev->dev, "controller already in use\n"); | ||
117 | ret = -EBUSY; | ||
118 | goto put_hcd; | ||
119 | } | ||
120 | |||
121 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); | ||
122 | if (!hcd->regs) { | ||
123 | dev_dbg(&pdev->dev, "error mapping memory\n"); | ||
124 | ret = -EFAULT; | ||
125 | goto release_mem_region; | ||
126 | } | ||
127 | |||
128 | ret = usb_add_hcd(hcd, irq, IRQF_SHARED); | ||
129 | if (ret) | ||
130 | goto unmap_registers; | ||
131 | |||
132 | /* USB 2.0 roothub is stored in the platform_device now. */ | ||
133 | hcd = dev_get_drvdata(&pdev->dev); | ||
134 | xhci = hcd_to_xhci(hcd); | ||
135 | xhci->shared_hcd = usb_create_shared_hcd(driver, &pdev->dev, | ||
136 | dev_name(&pdev->dev), hcd); | ||
137 | if (!xhci->shared_hcd) { | ||
138 | ret = -ENOMEM; | ||
139 | goto dealloc_usb2_hcd; | ||
140 | } | ||
141 | |||
142 | /* | ||
143 | * Set the xHCI pointer before xhci_plat_setup() (aka hcd_driver.reset) | ||
144 | * is called by usb_add_hcd(). | ||
145 | */ | ||
146 | *((struct xhci_hcd **) xhci->shared_hcd->hcd_priv) = xhci; | ||
147 | |||
148 | ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED); | ||
149 | if (ret) | ||
150 | goto put_usb3_hcd; | ||
151 | |||
152 | return 0; | ||
153 | |||
154 | put_usb3_hcd: | ||
155 | usb_put_hcd(xhci->shared_hcd); | ||
156 | |||
157 | dealloc_usb2_hcd: | ||
158 | usb_remove_hcd(hcd); | ||
159 | |||
160 | unmap_registers: | ||
161 | iounmap(hcd->regs); | ||
162 | |||
163 | release_mem_region: | ||
164 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
165 | |||
166 | put_hcd: | ||
167 | usb_put_hcd(hcd); | ||
168 | |||
169 | return ret; | ||
170 | } | ||
171 | |||
172 | static int xhci_plat_remove(struct platform_device *dev) | ||
173 | { | ||
174 | struct usb_hcd *hcd = platform_get_drvdata(dev); | ||
175 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | ||
176 | |||
177 | usb_remove_hcd(xhci->shared_hcd); | ||
178 | usb_put_hcd(xhci->shared_hcd); | ||
179 | |||
180 | usb_remove_hcd(hcd); | ||
181 | iounmap(hcd->regs); | ||
182 | usb_put_hcd(hcd); | ||
183 | kfree(xhci); | ||
184 | |||
185 | return 0; | ||
186 | } | ||
187 | |||
188 | static struct platform_driver usb_xhci_driver = { | ||
189 | .probe = xhci_plat_probe, | ||
190 | .remove = xhci_plat_remove, | ||
191 | .driver = { | ||
192 | .name = "xhci-hcd", | ||
193 | }, | ||
194 | }; | ||
195 | MODULE_ALIAS("platform:xhci-hcd"); | ||
196 | |||
197 | int xhci_register_plat(void) | ||
198 | { | ||
199 | return platform_driver_register(&usb_xhci_driver); | ||
200 | } | ||
201 | |||
202 | void xhci_unregister_plat(void) | ||
203 | { | ||
204 | platform_driver_unregister(&usb_xhci_driver); | ||
205 | } | ||
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index b62037bff688..6bd9d53062eb 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
@@ -143,17 +143,25 @@ static void next_trb(struct xhci_hcd *xhci, | |||
143 | * See Cycle bit rules. SW is the consumer for the event ring only. | 143 | * See Cycle bit rules. SW is the consumer for the event ring only. |
144 | * Don't make a ring full of link TRBs. That would be dumb and this would loop. | 144 | * Don't make a ring full of link TRBs. That would be dumb and this would loop. |
145 | */ | 145 | */ |
146 | static void inc_deq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer) | 146 | static void inc_deq(struct xhci_hcd *xhci, struct xhci_ring *ring) |
147 | { | 147 | { |
148 | union xhci_trb *next = ++(ring->dequeue); | 148 | union xhci_trb *next; |
149 | unsigned long long addr; | 149 | unsigned long long addr; |
150 | 150 | ||
151 | ring->deq_updates++; | 151 | ring->deq_updates++; |
152 | |||
153 | /* If this is not event ring, there is one more usable TRB */ | ||
154 | if (ring->type != TYPE_EVENT && | ||
155 | !last_trb(xhci, ring, ring->deq_seg, ring->dequeue)) | ||
156 | ring->num_trbs_free++; | ||
157 | next = ++(ring->dequeue); | ||
158 | |||
152 | /* Update the dequeue pointer further if that was a link TRB or we're at | 159 | /* Update the dequeue pointer further if that was a link TRB or we're at |
153 | * the end of an event ring segment (which doesn't have link TRBS) | 160 | * the end of an event ring segment (which doesn't have link TRBS) |
154 | */ | 161 | */ |
155 | while (last_trb(xhci, ring, ring->deq_seg, next)) { | 162 | while (last_trb(xhci, ring, ring->deq_seg, next)) { |
156 | if (consumer && last_trb_on_last_seg(xhci, ring, ring->deq_seg, next)) { | 163 | if (ring->type == TYPE_EVENT && last_trb_on_last_seg(xhci, |
164 | ring, ring->deq_seg, next)) { | ||
157 | ring->cycle_state = (ring->cycle_state ? 0 : 1); | 165 | ring->cycle_state = (ring->cycle_state ? 0 : 1); |
158 | } | 166 | } |
159 | ring->deq_seg = ring->deq_seg->next; | 167 | ring->deq_seg = ring->deq_seg->next; |
@@ -181,13 +189,17 @@ static void inc_deq(struct xhci_hcd *xhci, struct xhci_ring *ring, bool consumer | |||
181 | * prepare_transfer()? | 189 | * prepare_transfer()? |
182 | */ | 190 | */ |
183 | static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, | 191 | static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, |
184 | bool consumer, bool more_trbs_coming, bool isoc) | 192 | bool more_trbs_coming) |
185 | { | 193 | { |
186 | u32 chain; | 194 | u32 chain; |
187 | union xhci_trb *next; | 195 | union xhci_trb *next; |
188 | unsigned long long addr; | 196 | unsigned long long addr; |
189 | 197 | ||
190 | chain = le32_to_cpu(ring->enqueue->generic.field[3]) & TRB_CHAIN; | 198 | chain = le32_to_cpu(ring->enqueue->generic.field[3]) & TRB_CHAIN; |
199 | /* If this is not event ring, there is one less usable TRB */ | ||
200 | if (ring->type != TYPE_EVENT && | ||
201 | !last_trb(xhci, ring, ring->enq_seg, ring->enqueue)) | ||
202 | ring->num_trbs_free--; | ||
191 | next = ++(ring->enqueue); | 203 | next = ++(ring->enqueue); |
192 | 204 | ||
193 | ring->enq_updates++; | 205 | ring->enq_updates++; |
@@ -195,35 +207,35 @@ static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, | |||
195 | * the end of an event ring segment (which doesn't have link TRBS) | 207 | * the end of an event ring segment (which doesn't have link TRBS) |
196 | */ | 208 | */ |
197 | while (last_trb(xhci, ring, ring->enq_seg, next)) { | 209 | while (last_trb(xhci, ring, ring->enq_seg, next)) { |
198 | if (!consumer) { | 210 | if (ring->type != TYPE_EVENT) { |
199 | if (ring != xhci->event_ring) { | 211 | /* |
200 | /* | 212 | * If the caller doesn't plan on enqueueing more |
201 | * If the caller doesn't plan on enqueueing more | 213 | * TDs before ringing the doorbell, then we |
202 | * TDs before ringing the doorbell, then we | 214 | * don't want to give the link TRB to the |
203 | * don't want to give the link TRB to the | 215 | * hardware just yet. We'll give the link TRB |
204 | * hardware just yet. We'll give the link TRB | 216 | * back in prepare_ring() just before we enqueue |
205 | * back in prepare_ring() just before we enqueue | 217 | * the TD at the top of the ring. |
206 | * the TD at the top of the ring. | 218 | */ |
207 | */ | 219 | if (!chain && !more_trbs_coming) |
208 | if (!chain && !more_trbs_coming) | 220 | break; |
209 | break; | ||
210 | 221 | ||
211 | /* If we're not dealing with 0.95 hardware or | 222 | /* If we're not dealing with 0.95 hardware or |
212 | * isoc rings on AMD 0.96 host, | 223 | * isoc rings on AMD 0.96 host, |
213 | * carry over the chain bit of the previous TRB | 224 | * carry over the chain bit of the previous TRB |
214 | * (which may mean the chain bit is cleared). | 225 | * (which may mean the chain bit is cleared). |
215 | */ | 226 | */ |
216 | if (!(isoc && (xhci->quirks & XHCI_AMD_0x96_HOST)) | 227 | if (!(ring->type == TYPE_ISOC && |
228 | (xhci->quirks & XHCI_AMD_0x96_HOST)) | ||
217 | && !xhci_link_trb_quirk(xhci)) { | 229 | && !xhci_link_trb_quirk(xhci)) { |
218 | next->link.control &= | 230 | next->link.control &= |
219 | cpu_to_le32(~TRB_CHAIN); | 231 | cpu_to_le32(~TRB_CHAIN); |
220 | next->link.control |= | 232 | next->link.control |= |
221 | cpu_to_le32(chain); | 233 | cpu_to_le32(chain); |
222 | } | ||
223 | /* Give this link TRB to the hardware */ | ||
224 | wmb(); | ||
225 | next->link.control ^= cpu_to_le32(TRB_CYCLE); | ||
226 | } | 234 | } |
235 | /* Give this link TRB to the hardware */ | ||
236 | wmb(); | ||
237 | next->link.control ^= cpu_to_le32(TRB_CYCLE); | ||
238 | |||
227 | /* Toggle the cycle bit after the last ring segment. */ | 239 | /* Toggle the cycle bit after the last ring segment. */ |
228 | if (last_trb_on_last_seg(xhci, ring, ring->enq_seg, next)) { | 240 | if (last_trb_on_last_seg(xhci, ring, ring->enq_seg, next)) { |
229 | ring->cycle_state = (ring->cycle_state ? 0 : 1); | 241 | ring->cycle_state = (ring->cycle_state ? 0 : 1); |
@@ -237,55 +249,23 @@ static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, | |||
237 | } | 249 | } |
238 | 250 | ||
239 | /* | 251 | /* |
240 | * Check to see if there's room to enqueue num_trbs on the ring. See rules | 252 | * Check to see if there's room to enqueue num_trbs on the ring and make sure |
241 | * above. | 253 | * enqueue pointer will not advance into dequeue segment. See rules above. |
242 | * FIXME: this would be simpler and faster if we just kept track of the number | ||
243 | * of free TRBs in a ring. | ||
244 | */ | 254 | */ |
245 | static int room_on_ring(struct xhci_hcd *xhci, struct xhci_ring *ring, | 255 | static inline int room_on_ring(struct xhci_hcd *xhci, struct xhci_ring *ring, |
246 | unsigned int num_trbs) | 256 | unsigned int num_trbs) |
247 | { | 257 | { |
248 | int i; | 258 | int num_trbs_in_deq_seg; |
249 | union xhci_trb *enq = ring->enqueue; | 259 | |
250 | struct xhci_segment *enq_seg = ring->enq_seg; | 260 | if (ring->num_trbs_free < num_trbs) |
251 | struct xhci_segment *cur_seg; | 261 | return 0; |
252 | unsigned int left_on_ring; | 262 | |
253 | 263 | if (ring->type != TYPE_COMMAND && ring->type != TYPE_EVENT) { | |
254 | /* If we are currently pointing to a link TRB, advance the | 264 | num_trbs_in_deq_seg = ring->dequeue - ring->deq_seg->trbs; |
255 | * enqueue pointer before checking for space */ | 265 | if (ring->num_trbs_free < num_trbs + num_trbs_in_deq_seg) |
256 | while (last_trb(xhci, ring, enq_seg, enq)) { | ||
257 | enq_seg = enq_seg->next; | ||
258 | enq = enq_seg->trbs; | ||
259 | } | ||
260 | |||
261 | /* Check if ring is empty */ | ||
262 | if (enq == ring->dequeue) { | ||
263 | /* Can't use link trbs */ | ||
264 | left_on_ring = TRBS_PER_SEGMENT - 1; | ||
265 | for (cur_seg = enq_seg->next; cur_seg != enq_seg; | ||
266 | cur_seg = cur_seg->next) | ||
267 | left_on_ring += TRBS_PER_SEGMENT - 1; | ||
268 | |||
269 | /* Always need one TRB free in the ring. */ | ||
270 | left_on_ring -= 1; | ||
271 | if (num_trbs > left_on_ring) { | ||
272 | xhci_warn(xhci, "Not enough room on ring; " | ||
273 | "need %u TRBs, %u TRBs left\n", | ||
274 | num_trbs, left_on_ring); | ||
275 | return 0; | ||
276 | } | ||
277 | return 1; | ||
278 | } | ||
279 | /* Make sure there's an extra empty TRB available */ | ||
280 | for (i = 0; i <= num_trbs; ++i) { | ||
281 | if (enq == ring->dequeue) | ||
282 | return 0; | 266 | return 0; |
283 | enq++; | ||
284 | while (last_trb(xhci, ring, enq_seg, enq)) { | ||
285 | enq_seg = enq_seg->next; | ||
286 | enq = enq_seg->trbs; | ||
287 | } | ||
288 | } | 267 | } |
268 | |||
289 | return 1; | 269 | return 1; |
290 | } | 270 | } |
291 | 271 | ||
@@ -892,6 +872,43 @@ void xhci_stop_endpoint_command_watchdog(unsigned long arg) | |||
892 | xhci_dbg(xhci, "xHCI host controller is dead.\n"); | 872 | xhci_dbg(xhci, "xHCI host controller is dead.\n"); |
893 | } | 873 | } |
894 | 874 | ||
875 | |||
876 | static void update_ring_for_set_deq_completion(struct xhci_hcd *xhci, | ||
877 | struct xhci_virt_device *dev, | ||
878 | struct xhci_ring *ep_ring, | ||
879 | unsigned int ep_index) | ||
880 | { | ||
881 | union xhci_trb *dequeue_temp; | ||
882 | int num_trbs_free_temp; | ||
883 | bool revert = false; | ||
884 | |||
885 | num_trbs_free_temp = ep_ring->num_trbs_free; | ||
886 | dequeue_temp = ep_ring->dequeue; | ||
887 | |||
888 | while (ep_ring->dequeue != dev->eps[ep_index].queued_deq_ptr) { | ||
889 | /* We have more usable TRBs */ | ||
890 | ep_ring->num_trbs_free++; | ||
891 | ep_ring->dequeue++; | ||
892 | if (last_trb(xhci, ep_ring, ep_ring->deq_seg, | ||
893 | ep_ring->dequeue)) { | ||
894 | if (ep_ring->dequeue == | ||
895 | dev->eps[ep_index].queued_deq_ptr) | ||
896 | break; | ||
897 | ep_ring->deq_seg = ep_ring->deq_seg->next; | ||
898 | ep_ring->dequeue = ep_ring->deq_seg->trbs; | ||
899 | } | ||
900 | if (ep_ring->dequeue == dequeue_temp) { | ||
901 | revert = true; | ||
902 | break; | ||
903 | } | ||
904 | } | ||
905 | |||
906 | if (revert) { | ||
907 | xhci_dbg(xhci, "Unable to find new dequeue pointer\n"); | ||
908 | ep_ring->num_trbs_free = num_trbs_free_temp; | ||
909 | } | ||
910 | } | ||
911 | |||
895 | /* | 912 | /* |
896 | * When we get a completion for a Set Transfer Ring Dequeue Pointer command, | 913 | * When we get a completion for a Set Transfer Ring Dequeue Pointer command, |
897 | * we need to clear the set deq pending flag in the endpoint ring state, so that | 914 | * we need to clear the set deq pending flag in the endpoint ring state, so that |
@@ -973,8 +990,8 @@ static void handle_set_deq_completion(struct xhci_hcd *xhci, | |||
973 | /* Update the ring's dequeue segment and dequeue pointer | 990 | /* Update the ring's dequeue segment and dequeue pointer |
974 | * to reflect the new position. | 991 | * to reflect the new position. |
975 | */ | 992 | */ |
976 | ep_ring->deq_seg = dev->eps[ep_index].queued_deq_seg; | 993 | update_ring_for_set_deq_completion(xhci, dev, |
977 | ep_ring->dequeue = dev->eps[ep_index].queued_deq_ptr; | 994 | ep_ring, ep_index); |
978 | } else { | 995 | } else { |
979 | xhci_warn(xhci, "Mismatch between completed Set TR Deq " | 996 | xhci_warn(xhci, "Mismatch between completed Set TR Deq " |
980 | "Ptr command & xHCI internal state.\n"); | 997 | "Ptr command & xHCI internal state.\n"); |
@@ -1185,7 +1202,7 @@ bandwidth_change: | |||
1185 | xhci->error_bitmask |= 1 << 6; | 1202 | xhci->error_bitmask |= 1 << 6; |
1186 | break; | 1203 | break; |
1187 | } | 1204 | } |
1188 | inc_deq(xhci, xhci->cmd_ring, false); | 1205 | inc_deq(xhci, xhci->cmd_ring); |
1189 | } | 1206 | } |
1190 | 1207 | ||
1191 | static void handle_vendor_event(struct xhci_hcd *xhci, | 1208 | static void handle_vendor_event(struct xhci_hcd *xhci, |
@@ -1237,6 +1254,26 @@ static unsigned int find_faked_portnum_from_hw_portnum(struct usb_hcd *hcd, | |||
1237 | return num_similar_speed_ports; | 1254 | return num_similar_speed_ports; |
1238 | } | 1255 | } |
1239 | 1256 | ||
1257 | static void handle_device_notification(struct xhci_hcd *xhci, | ||
1258 | union xhci_trb *event) | ||
1259 | { | ||
1260 | u32 slot_id; | ||
1261 | struct usb_device *udev; | ||
1262 | |||
1263 | slot_id = TRB_TO_SLOT_ID(event->generic.field[3]); | ||
1264 | if (!xhci->devs[slot_id]) { | ||
1265 | xhci_warn(xhci, "Device Notification event for " | ||
1266 | "unused slot %u\n", slot_id); | ||
1267 | return; | ||
1268 | } | ||
1269 | |||
1270 | xhci_dbg(xhci, "Device Wake Notification event for slot ID %u\n", | ||
1271 | slot_id); | ||
1272 | udev = xhci->devs[slot_id]->udev; | ||
1273 | if (udev && udev->parent) | ||
1274 | usb_wakeup_notification(udev->parent, udev->portnum); | ||
1275 | } | ||
1276 | |||
1240 | static void handle_port_status(struct xhci_hcd *xhci, | 1277 | static void handle_port_status(struct xhci_hcd *xhci, |
1241 | union xhci_trb *event) | 1278 | union xhci_trb *event) |
1242 | { | 1279 | { |
@@ -1321,20 +1358,21 @@ static void handle_port_status(struct xhci_hcd *xhci, | |||
1321 | } | 1358 | } |
1322 | 1359 | ||
1323 | if (DEV_SUPERSPEED(temp)) { | 1360 | if (DEV_SUPERSPEED(temp)) { |
1324 | xhci_dbg(xhci, "resume SS port %d\n", port_id); | 1361 | xhci_dbg(xhci, "remote wake SS port %d\n", port_id); |
1362 | /* Set a flag to say the port signaled remote wakeup, | ||
1363 | * so we can tell the difference between the end of | ||
1364 | * device and host initiated resume. | ||
1365 | */ | ||
1366 | bus_state->port_remote_wakeup |= 1 << faked_port_index; | ||
1367 | xhci_test_and_clear_bit(xhci, port_array, | ||
1368 | faked_port_index, PORT_PLC); | ||
1325 | xhci_set_link_state(xhci, port_array, faked_port_index, | 1369 | xhci_set_link_state(xhci, port_array, faked_port_index, |
1326 | XDEV_U0); | 1370 | XDEV_U0); |
1327 | slot_id = xhci_find_slot_id_by_port(hcd, xhci, | 1371 | /* Need to wait until the next link state change |
1328 | faked_port_index + 1); | 1372 | * indicates the device is actually in U0. |
1329 | if (!slot_id) { | 1373 | */ |
1330 | xhci_dbg(xhci, "slot_id is zero\n"); | 1374 | bogus_port_status = true; |
1331 | goto cleanup; | 1375 | goto cleanup; |
1332 | } | ||
1333 | xhci_ring_device(xhci, slot_id); | ||
1334 | xhci_dbg(xhci, "resume SS port %d finished\n", port_id); | ||
1335 | /* Clear PORT_PLC */ | ||
1336 | xhci_test_and_clear_bit(xhci, port_array, | ||
1337 | faked_port_index, PORT_PLC); | ||
1338 | } else { | 1376 | } else { |
1339 | xhci_dbg(xhci, "resume HS port %d\n", port_id); | 1377 | xhci_dbg(xhci, "resume HS port %d\n", port_id); |
1340 | bus_state->resume_done[faked_port_index] = jiffies + | 1378 | bus_state->resume_done[faked_port_index] = jiffies + |
@@ -1345,13 +1383,39 @@ static void handle_port_status(struct xhci_hcd *xhci, | |||
1345 | } | 1383 | } |
1346 | } | 1384 | } |
1347 | 1385 | ||
1386 | if ((temp & PORT_PLC) && (temp & PORT_PLS_MASK) == XDEV_U0 && | ||
1387 | DEV_SUPERSPEED(temp)) { | ||
1388 | xhci_dbg(xhci, "resume SS port %d finished\n", port_id); | ||
1389 | /* We've just brought the device into U0 through either the | ||
1390 | * Resume state after a device remote wakeup, or through the | ||
1391 | * U3Exit state after a host-initiated resume. If it's a device | ||
1392 | * initiated remote wake, don't pass up the link state change, | ||
1393 | * so the roothub behavior is consistent with external | ||
1394 | * USB 3.0 hub behavior. | ||
1395 | */ | ||
1396 | slot_id = xhci_find_slot_id_by_port(hcd, xhci, | ||
1397 | faked_port_index + 1); | ||
1398 | if (slot_id && xhci->devs[slot_id]) | ||
1399 | xhci_ring_device(xhci, slot_id); | ||
1400 | if (bus_state->port_remote_wakeup && (1 << faked_port_index)) { | ||
1401 | bus_state->port_remote_wakeup &= | ||
1402 | ~(1 << faked_port_index); | ||
1403 | xhci_test_and_clear_bit(xhci, port_array, | ||
1404 | faked_port_index, PORT_PLC); | ||
1405 | usb_wakeup_notification(hcd->self.root_hub, | ||
1406 | faked_port_index + 1); | ||
1407 | bogus_port_status = true; | ||
1408 | goto cleanup; | ||
1409 | } | ||
1410 | } | ||
1411 | |||
1348 | if (hcd->speed != HCD_USB3) | 1412 | if (hcd->speed != HCD_USB3) |
1349 | xhci_test_and_clear_bit(xhci, port_array, faked_port_index, | 1413 | xhci_test_and_clear_bit(xhci, port_array, faked_port_index, |
1350 | PORT_PLC); | 1414 | PORT_PLC); |
1351 | 1415 | ||
1352 | cleanup: | 1416 | cleanup: |
1353 | /* Update event ring dequeue pointer before dropping the lock */ | 1417 | /* Update event ring dequeue pointer before dropping the lock */ |
1354 | inc_deq(xhci, xhci->event_ring, true); | 1418 | inc_deq(xhci, xhci->event_ring); |
1355 | 1419 | ||
1356 | /* Don't make the USB core poll the roothub if we got a bad port status | 1420 | /* Don't make the USB core poll the roothub if we got a bad port status |
1357 | * change event. Besides, at that point we can't tell which roothub | 1421 | * change event. Besides, at that point we can't tell which roothub |
@@ -1546,8 +1610,8 @@ static int finish_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
1546 | } else { | 1610 | } else { |
1547 | /* Update ring dequeue pointer */ | 1611 | /* Update ring dequeue pointer */ |
1548 | while (ep_ring->dequeue != td->last_trb) | 1612 | while (ep_ring->dequeue != td->last_trb) |
1549 | inc_deq(xhci, ep_ring, false); | 1613 | inc_deq(xhci, ep_ring); |
1550 | inc_deq(xhci, ep_ring, false); | 1614 | inc_deq(xhci, ep_ring); |
1551 | } | 1615 | } |
1552 | 1616 | ||
1553 | td_cleanup: | 1617 | td_cleanup: |
@@ -1795,8 +1859,8 @@ static int skip_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
1795 | 1859 | ||
1796 | /* Update ring dequeue pointer */ | 1860 | /* Update ring dequeue pointer */ |
1797 | while (ep_ring->dequeue != td->last_trb) | 1861 | while (ep_ring->dequeue != td->last_trb) |
1798 | inc_deq(xhci, ep_ring, false); | 1862 | inc_deq(xhci, ep_ring); |
1799 | inc_deq(xhci, ep_ring, false); | 1863 | inc_deq(xhci, ep_ring); |
1800 | 1864 | ||
1801 | return finish_td(xhci, td, NULL, event, ep, status, true); | 1865 | return finish_td(xhci, td, NULL, event, ep, status, true); |
1802 | } | 1866 | } |
@@ -2183,7 +2247,7 @@ cleanup: | |||
2183 | * Will roll back to continue process missed tds. | 2247 | * Will roll back to continue process missed tds. |
2184 | */ | 2248 | */ |
2185 | if (trb_comp_code == COMP_MISSED_INT || !ep->skip) { | 2249 | if (trb_comp_code == COMP_MISSED_INT || !ep->skip) { |
2186 | inc_deq(xhci, xhci->event_ring, true); | 2250 | inc_deq(xhci, xhci->event_ring); |
2187 | } | 2251 | } |
2188 | 2252 | ||
2189 | if (ret) { | 2253 | if (ret) { |
@@ -2277,6 +2341,9 @@ static int xhci_handle_event(struct xhci_hcd *xhci) | |||
2277 | else | 2341 | else |
2278 | update_ptrs = 0; | 2342 | update_ptrs = 0; |
2279 | break; | 2343 | break; |
2344 | case TRB_TYPE(TRB_DEV_NOTE): | ||
2345 | handle_device_notification(xhci, event); | ||
2346 | break; | ||
2280 | default: | 2347 | default: |
2281 | if ((le32_to_cpu(event->event_cmd.flags) & TRB_TYPE_BITMASK) >= | 2348 | if ((le32_to_cpu(event->event_cmd.flags) & TRB_TYPE_BITMASK) >= |
2282 | TRB_TYPE(48)) | 2349 | TRB_TYPE(48)) |
@@ -2295,7 +2362,7 @@ static int xhci_handle_event(struct xhci_hcd *xhci) | |||
2295 | 2362 | ||
2296 | if (update_ptrs) | 2363 | if (update_ptrs) |
2297 | /* Update SW event ring dequeue pointer */ | 2364 | /* Update SW event ring dequeue pointer */ |
2298 | inc_deq(xhci, xhci->event_ring, true); | 2365 | inc_deq(xhci, xhci->event_ring); |
2299 | 2366 | ||
2300 | /* Are there more items on the event ring? Caller will call us again to | 2367 | /* Are there more items on the event ring? Caller will call us again to |
2301 | * check. | 2368 | * check. |
@@ -2346,7 +2413,7 @@ hw_died: | |||
2346 | /* FIXME when MSI-X is supported and there are multiple vectors */ | 2413 | /* FIXME when MSI-X is supported and there are multiple vectors */ |
2347 | /* Clear the MSI-X event interrupt status */ | 2414 | /* Clear the MSI-X event interrupt status */ |
2348 | 2415 | ||
2349 | if (hcd->irq != -1) { | 2416 | if (hcd->irq) { |
2350 | u32 irq_pending; | 2417 | u32 irq_pending; |
2351 | /* Acknowledge the PCI interrupt */ | 2418 | /* Acknowledge the PCI interrupt */ |
2352 | irq_pending = xhci_readl(xhci, &xhci->ir_set->irq_pending); | 2419 | irq_pending = xhci_readl(xhci, &xhci->ir_set->irq_pending); |
@@ -2411,7 +2478,7 @@ irqreturn_t xhci_msi_irq(int irq, struct usb_hcd *hcd) | |||
2411 | * prepare_transfer()? | 2478 | * prepare_transfer()? |
2412 | */ | 2479 | */ |
2413 | static void queue_trb(struct xhci_hcd *xhci, struct xhci_ring *ring, | 2480 | static void queue_trb(struct xhci_hcd *xhci, struct xhci_ring *ring, |
2414 | bool consumer, bool more_trbs_coming, bool isoc, | 2481 | bool more_trbs_coming, |
2415 | u32 field1, u32 field2, u32 field3, u32 field4) | 2482 | u32 field1, u32 field2, u32 field3, u32 field4) |
2416 | { | 2483 | { |
2417 | struct xhci_generic_trb *trb; | 2484 | struct xhci_generic_trb *trb; |
@@ -2421,7 +2488,7 @@ static void queue_trb(struct xhci_hcd *xhci, struct xhci_ring *ring, | |||
2421 | trb->field[1] = cpu_to_le32(field2); | 2488 | trb->field[1] = cpu_to_le32(field2); |
2422 | trb->field[2] = cpu_to_le32(field3); | 2489 | trb->field[2] = cpu_to_le32(field3); |
2423 | trb->field[3] = cpu_to_le32(field4); | 2490 | trb->field[3] = cpu_to_le32(field4); |
2424 | inc_enq(xhci, ring, consumer, more_trbs_coming, isoc); | 2491 | inc_enq(xhci, ring, more_trbs_coming); |
2425 | } | 2492 | } |
2426 | 2493 | ||
2427 | /* | 2494 | /* |
@@ -2429,8 +2496,10 @@ static void queue_trb(struct xhci_hcd *xhci, struct xhci_ring *ring, | |||
2429 | * FIXME allocate segments if the ring is full. | 2496 | * FIXME allocate segments if the ring is full. |
2430 | */ | 2497 | */ |
2431 | static int prepare_ring(struct xhci_hcd *xhci, struct xhci_ring *ep_ring, | 2498 | static int prepare_ring(struct xhci_hcd *xhci, struct xhci_ring *ep_ring, |
2432 | u32 ep_state, unsigned int num_trbs, bool isoc, gfp_t mem_flags) | 2499 | u32 ep_state, unsigned int num_trbs, gfp_t mem_flags) |
2433 | { | 2500 | { |
2501 | unsigned int num_trbs_needed; | ||
2502 | |||
2434 | /* Make sure the endpoint has been added to xHC schedule */ | 2503 | /* Make sure the endpoint has been added to xHC schedule */ |
2435 | switch (ep_state) { | 2504 | switch (ep_state) { |
2436 | case EP_STATE_DISABLED: | 2505 | case EP_STATE_DISABLED: |
@@ -2458,11 +2527,25 @@ static int prepare_ring(struct xhci_hcd *xhci, struct xhci_ring *ep_ring, | |||
2458 | */ | 2527 | */ |
2459 | return -EINVAL; | 2528 | return -EINVAL; |
2460 | } | 2529 | } |
2461 | if (!room_on_ring(xhci, ep_ring, num_trbs)) { | 2530 | |
2462 | /* FIXME allocate more room */ | 2531 | while (1) { |
2463 | xhci_err(xhci, "ERROR no room on ep ring\n"); | 2532 | if (room_on_ring(xhci, ep_ring, num_trbs)) |
2464 | return -ENOMEM; | 2533 | break; |
2465 | } | 2534 | |
2535 | if (ep_ring == xhci->cmd_ring) { | ||
2536 | xhci_err(xhci, "Do not support expand command ring\n"); | ||
2537 | return -ENOMEM; | ||
2538 | } | ||
2539 | |||
2540 | xhci_dbg(xhci, "ERROR no room on ep ring, " | ||
2541 | "try ring expansion\n"); | ||
2542 | num_trbs_needed = num_trbs - ep_ring->num_trbs_free; | ||
2543 | if (xhci_ring_expansion(xhci, ep_ring, num_trbs_needed, | ||
2544 | mem_flags)) { | ||
2545 | xhci_err(xhci, "Ring expansion failed\n"); | ||
2546 | return -ENOMEM; | ||
2547 | } | ||
2548 | }; | ||
2466 | 2549 | ||
2467 | if (enqueue_is_link_trb(ep_ring)) { | 2550 | if (enqueue_is_link_trb(ep_ring)) { |
2468 | struct xhci_ring *ring = ep_ring; | 2551 | struct xhci_ring *ring = ep_ring; |
@@ -2474,8 +2557,9 @@ static int prepare_ring(struct xhci_hcd *xhci, struct xhci_ring *ep_ring, | |||
2474 | /* If we're not dealing with 0.95 hardware or isoc rings | 2557 | /* If we're not dealing with 0.95 hardware or isoc rings |
2475 | * on AMD 0.96 host, clear the chain bit. | 2558 | * on AMD 0.96 host, clear the chain bit. |
2476 | */ | 2559 | */ |
2477 | if (!xhci_link_trb_quirk(xhci) && !(isoc && | 2560 | if (!xhci_link_trb_quirk(xhci) && |
2478 | (xhci->quirks & XHCI_AMD_0x96_HOST))) | 2561 | !(ring->type == TYPE_ISOC && |
2562 | (xhci->quirks & XHCI_AMD_0x96_HOST))) | ||
2479 | next->link.control &= cpu_to_le32(~TRB_CHAIN); | 2563 | next->link.control &= cpu_to_le32(~TRB_CHAIN); |
2480 | else | 2564 | else |
2481 | next->link.control |= cpu_to_le32(TRB_CHAIN); | 2565 | next->link.control |= cpu_to_le32(TRB_CHAIN); |
@@ -2503,7 +2587,6 @@ static int prepare_transfer(struct xhci_hcd *xhci, | |||
2503 | unsigned int num_trbs, | 2587 | unsigned int num_trbs, |
2504 | struct urb *urb, | 2588 | struct urb *urb, |
2505 | unsigned int td_index, | 2589 | unsigned int td_index, |
2506 | bool isoc, | ||
2507 | gfp_t mem_flags) | 2590 | gfp_t mem_flags) |
2508 | { | 2591 | { |
2509 | int ret; | 2592 | int ret; |
@@ -2521,7 +2604,7 @@ static int prepare_transfer(struct xhci_hcd *xhci, | |||
2521 | 2604 | ||
2522 | ret = prepare_ring(xhci, ep_ring, | 2605 | ret = prepare_ring(xhci, ep_ring, |
2523 | le32_to_cpu(ep_ctx->ep_info) & EP_STATE_MASK, | 2606 | le32_to_cpu(ep_ctx->ep_info) & EP_STATE_MASK, |
2524 | num_trbs, isoc, mem_flags); | 2607 | num_trbs, mem_flags); |
2525 | if (ret) | 2608 | if (ret) |
2526 | return ret; | 2609 | return ret; |
2527 | 2610 | ||
@@ -2731,7 +2814,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
2731 | 2814 | ||
2732 | trb_buff_len = prepare_transfer(xhci, xhci->devs[slot_id], | 2815 | trb_buff_len = prepare_transfer(xhci, xhci->devs[slot_id], |
2733 | ep_index, urb->stream_id, | 2816 | ep_index, urb->stream_id, |
2734 | num_trbs, urb, 0, false, mem_flags); | 2817 | num_trbs, urb, 0, mem_flags); |
2735 | if (trb_buff_len < 0) | 2818 | if (trb_buff_len < 0) |
2736 | return trb_buff_len; | 2819 | return trb_buff_len; |
2737 | 2820 | ||
@@ -2819,7 +2902,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
2819 | more_trbs_coming = true; | 2902 | more_trbs_coming = true; |
2820 | else | 2903 | else |
2821 | more_trbs_coming = false; | 2904 | more_trbs_coming = false; |
2822 | queue_trb(xhci, ep_ring, false, more_trbs_coming, false, | 2905 | queue_trb(xhci, ep_ring, more_trbs_coming, |
2823 | lower_32_bits(addr), | 2906 | lower_32_bits(addr), |
2824 | upper_32_bits(addr), | 2907 | upper_32_bits(addr), |
2825 | length_field, | 2908 | length_field, |
@@ -2901,7 +2984,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
2901 | 2984 | ||
2902 | ret = prepare_transfer(xhci, xhci->devs[slot_id], | 2985 | ret = prepare_transfer(xhci, xhci->devs[slot_id], |
2903 | ep_index, urb->stream_id, | 2986 | ep_index, urb->stream_id, |
2904 | num_trbs, urb, 0, false, mem_flags); | 2987 | num_trbs, urb, 0, mem_flags); |
2905 | if (ret < 0) | 2988 | if (ret < 0) |
2906 | return ret; | 2989 | return ret; |
2907 | 2990 | ||
@@ -2973,7 +3056,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
2973 | more_trbs_coming = true; | 3056 | more_trbs_coming = true; |
2974 | else | 3057 | else |
2975 | more_trbs_coming = false; | 3058 | more_trbs_coming = false; |
2976 | queue_trb(xhci, ep_ring, false, more_trbs_coming, false, | 3059 | queue_trb(xhci, ep_ring, more_trbs_coming, |
2977 | lower_32_bits(addr), | 3060 | lower_32_bits(addr), |
2978 | upper_32_bits(addr), | 3061 | upper_32_bits(addr), |
2979 | length_field, | 3062 | length_field, |
@@ -3030,7 +3113,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3030 | num_trbs++; | 3113 | num_trbs++; |
3031 | ret = prepare_transfer(xhci, xhci->devs[slot_id], | 3114 | ret = prepare_transfer(xhci, xhci->devs[slot_id], |
3032 | ep_index, urb->stream_id, | 3115 | ep_index, urb->stream_id, |
3033 | num_trbs, urb, 0, false, mem_flags); | 3116 | num_trbs, urb, 0, mem_flags); |
3034 | if (ret < 0) | 3117 | if (ret < 0) |
3035 | return ret; | 3118 | return ret; |
3036 | 3119 | ||
@@ -3063,7 +3146,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3063 | } | 3146 | } |
3064 | } | 3147 | } |
3065 | 3148 | ||
3066 | queue_trb(xhci, ep_ring, false, true, false, | 3149 | queue_trb(xhci, ep_ring, true, |
3067 | setup->bRequestType | setup->bRequest << 8 | le16_to_cpu(setup->wValue) << 16, | 3150 | setup->bRequestType | setup->bRequest << 8 | le16_to_cpu(setup->wValue) << 16, |
3068 | le16_to_cpu(setup->wIndex) | le16_to_cpu(setup->wLength) << 16, | 3151 | le16_to_cpu(setup->wIndex) | le16_to_cpu(setup->wLength) << 16, |
3069 | TRB_LEN(8) | TRB_INTR_TARGET(0), | 3152 | TRB_LEN(8) | TRB_INTR_TARGET(0), |
@@ -3083,7 +3166,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3083 | if (urb->transfer_buffer_length > 0) { | 3166 | if (urb->transfer_buffer_length > 0) { |
3084 | if (setup->bRequestType & USB_DIR_IN) | 3167 | if (setup->bRequestType & USB_DIR_IN) |
3085 | field |= TRB_DIR_IN; | 3168 | field |= TRB_DIR_IN; |
3086 | queue_trb(xhci, ep_ring, false, true, false, | 3169 | queue_trb(xhci, ep_ring, true, |
3087 | lower_32_bits(urb->transfer_dma), | 3170 | lower_32_bits(urb->transfer_dma), |
3088 | upper_32_bits(urb->transfer_dma), | 3171 | upper_32_bits(urb->transfer_dma), |
3089 | length_field, | 3172 | length_field, |
@@ -3099,7 +3182,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3099 | field = 0; | 3182 | field = 0; |
3100 | else | 3183 | else |
3101 | field = TRB_DIR_IN; | 3184 | field = TRB_DIR_IN; |
3102 | queue_trb(xhci, ep_ring, false, false, false, | 3185 | queue_trb(xhci, ep_ring, false, |
3103 | 0, | 3186 | 0, |
3104 | 0, | 3187 | 0, |
3105 | TRB_INTR_TARGET(0), | 3188 | TRB_INTR_TARGET(0), |
@@ -3239,8 +3322,7 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3239 | trbs_per_td = count_isoc_trbs_needed(xhci, urb, i); | 3322 | trbs_per_td = count_isoc_trbs_needed(xhci, urb, i); |
3240 | 3323 | ||
3241 | ret = prepare_transfer(xhci, xhci->devs[slot_id], ep_index, | 3324 | ret = prepare_transfer(xhci, xhci->devs[slot_id], ep_index, |
3242 | urb->stream_id, trbs_per_td, urb, i, true, | 3325 | urb->stream_id, trbs_per_td, urb, i, mem_flags); |
3243 | mem_flags); | ||
3244 | if (ret < 0) { | 3326 | if (ret < 0) { |
3245 | if (i == 0) | 3327 | if (i == 0) |
3246 | return ret; | 3328 | return ret; |
@@ -3310,7 +3392,7 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3310 | remainder | | 3392 | remainder | |
3311 | TRB_INTR_TARGET(0); | 3393 | TRB_INTR_TARGET(0); |
3312 | 3394 | ||
3313 | queue_trb(xhci, ep_ring, false, more_trbs_coming, true, | 3395 | queue_trb(xhci, ep_ring, more_trbs_coming, |
3314 | lower_32_bits(addr), | 3396 | lower_32_bits(addr), |
3315 | upper_32_bits(addr), | 3397 | upper_32_bits(addr), |
3316 | length_field, | 3398 | length_field, |
@@ -3357,6 +3439,7 @@ cleanup: | |||
3357 | ep_ring->enqueue = urb_priv->td[0]->first_trb; | 3439 | ep_ring->enqueue = urb_priv->td[0]->first_trb; |
3358 | ep_ring->enq_seg = urb_priv->td[0]->start_seg; | 3440 | ep_ring->enq_seg = urb_priv->td[0]->start_seg; |
3359 | ep_ring->cycle_state = start_cycle; | 3441 | ep_ring->cycle_state = start_cycle; |
3442 | ep_ring->num_trbs_free = ep_ring->num_trbs_free_temp; | ||
3360 | usb_hcd_unlink_urb_from_ep(bus_to_hcd(urb->dev->bus), urb); | 3443 | usb_hcd_unlink_urb_from_ep(bus_to_hcd(urb->dev->bus), urb); |
3361 | return ret; | 3444 | return ret; |
3362 | } | 3445 | } |
@@ -3393,7 +3476,7 @@ int xhci_queue_isoc_tx_prepare(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3393 | * Do not insert any td of the urb to the ring if the check failed. | 3476 | * Do not insert any td of the urb to the ring if the check failed. |
3394 | */ | 3477 | */ |
3395 | ret = prepare_ring(xhci, ep_ring, le32_to_cpu(ep_ctx->ep_info) & EP_STATE_MASK, | 3478 | ret = prepare_ring(xhci, ep_ring, le32_to_cpu(ep_ctx->ep_info) & EP_STATE_MASK, |
3396 | num_trbs, true, mem_flags); | 3479 | num_trbs, mem_flags); |
3397 | if (ret) | 3480 | if (ret) |
3398 | return ret; | 3481 | return ret; |
3399 | 3482 | ||
@@ -3429,6 +3512,8 @@ int xhci_queue_isoc_tx_prepare(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3429 | urb->dev->speed == USB_SPEED_FULL) | 3512 | urb->dev->speed == USB_SPEED_FULL) |
3430 | urb->interval /= 8; | 3513 | urb->interval /= 8; |
3431 | } | 3514 | } |
3515 | ep_ring->num_trbs_free_temp = ep_ring->num_trbs_free; | ||
3516 | |||
3432 | return xhci_queue_isoc_tx(xhci, GFP_ATOMIC, urb, slot_id, ep_index); | 3517 | return xhci_queue_isoc_tx(xhci, GFP_ATOMIC, urb, slot_id, ep_index); |
3433 | } | 3518 | } |
3434 | 3519 | ||
@@ -3452,7 +3537,7 @@ static int queue_command(struct xhci_hcd *xhci, u32 field1, u32 field2, | |||
3452 | reserved_trbs++; | 3537 | reserved_trbs++; |
3453 | 3538 | ||
3454 | ret = prepare_ring(xhci, xhci->cmd_ring, EP_STATE_RUNNING, | 3539 | ret = prepare_ring(xhci, xhci->cmd_ring, EP_STATE_RUNNING, |
3455 | reserved_trbs, false, GFP_ATOMIC); | 3540 | reserved_trbs, GFP_ATOMIC); |
3456 | if (ret < 0) { | 3541 | if (ret < 0) { |
3457 | xhci_err(xhci, "ERR: No room for command on command ring\n"); | 3542 | xhci_err(xhci, "ERR: No room for command on command ring\n"); |
3458 | if (command_must_succeed) | 3543 | if (command_must_succeed) |
@@ -3460,8 +3545,8 @@ static int queue_command(struct xhci_hcd *xhci, u32 field1, u32 field2, | |||
3460 | "unfailable commands failed.\n"); | 3545 | "unfailable commands failed.\n"); |
3461 | return ret; | 3546 | return ret; |
3462 | } | 3547 | } |
3463 | queue_trb(xhci, xhci->cmd_ring, false, false, false, field1, field2, | 3548 | queue_trb(xhci, xhci->cmd_ring, false, field1, field2, field3, |
3464 | field3, field4 | xhci->cmd_ring->cycle_state); | 3549 | field4 | xhci->cmd_ring->cycle_state); |
3465 | return 0; | 3550 | return 0; |
3466 | } | 3551 | } |
3467 | 3552 | ||
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index c939f5fdef9e..e1963d4a430f 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
@@ -224,13 +224,13 @@ static void xhci_free_irq(struct xhci_hcd *xhci) | |||
224 | int ret; | 224 | int ret; |
225 | 225 | ||
226 | /* return if using legacy interrupt */ | 226 | /* return if using legacy interrupt */ |
227 | if (xhci_to_hcd(xhci)->irq >= 0) | 227 | if (xhci_to_hcd(xhci)->irq > 0) |
228 | return; | 228 | return; |
229 | 229 | ||
230 | ret = xhci_free_msi(xhci); | 230 | ret = xhci_free_msi(xhci); |
231 | if (!ret) | 231 | if (!ret) |
232 | return; | 232 | return; |
233 | if (pdev->irq >= 0) | 233 | if (pdev->irq > 0) |
234 | free_irq(pdev->irq, xhci_to_hcd(xhci)); | 234 | free_irq(pdev->irq, xhci_to_hcd(xhci)); |
235 | 235 | ||
236 | return; | 236 | return; |
@@ -341,7 +341,7 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd) | |||
341 | /* unregister the legacy interrupt */ | 341 | /* unregister the legacy interrupt */ |
342 | if (hcd->irq) | 342 | if (hcd->irq) |
343 | free_irq(hcd->irq, hcd); | 343 | free_irq(hcd->irq, hcd); |
344 | hcd->irq = -1; | 344 | hcd->irq = 0; |
345 | 345 | ||
346 | ret = xhci_setup_msix(xhci); | 346 | ret = xhci_setup_msix(xhci); |
347 | if (ret) | 347 | if (ret) |
@@ -349,7 +349,7 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd) | |||
349 | ret = xhci_setup_msi(xhci); | 349 | ret = xhci_setup_msi(xhci); |
350 | 350 | ||
351 | if (!ret) | 351 | if (!ret) |
352 | /* hcd->irq is -1, we have MSI */ | 352 | /* hcd->irq is 0, we have MSI */ |
353 | return 0; | 353 | return 0; |
354 | 354 | ||
355 | if (!pdev->irq) { | 355 | if (!pdev->irq) { |
@@ -729,6 +729,7 @@ static void xhci_clear_command_ring(struct xhci_hcd *xhci) | |||
729 | ring->enq_seg = ring->deq_seg; | 729 | ring->enq_seg = ring->deq_seg; |
730 | ring->enqueue = ring->dequeue; | 730 | ring->enqueue = ring->dequeue; |
731 | 731 | ||
732 | ring->num_trbs_free = ring->num_segs * (TRBS_PER_SEGMENT - 1) - 1; | ||
732 | /* | 733 | /* |
733 | * Ring is now zeroed, so the HW should look for change of ownership | 734 | * Ring is now zeroed, so the HW should look for change of ownership |
734 | * when the cycle bit is set to 1. | 735 | * when the cycle bit is set to 1. |
@@ -3614,26 +3615,38 @@ static int xhci_besl_encoding[16] = {125, 150, 200, 300, 400, 500, 1000, 2000, | |||
3614 | 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000}; | 3615 | 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000}; |
3615 | 3616 | ||
3616 | /* Calculate HIRD/BESL for USB2 PORTPMSC*/ | 3617 | /* Calculate HIRD/BESL for USB2 PORTPMSC*/ |
3617 | static int xhci_calculate_hird_besl(int u2del, bool use_besl) | 3618 | static int xhci_calculate_hird_besl(struct xhci_hcd *xhci, |
3619 | struct usb_device *udev) | ||
3618 | { | 3620 | { |
3619 | int hird; | 3621 | int u2del, besl, besl_host; |
3622 | int besl_device = 0; | ||
3623 | u32 field; | ||
3624 | |||
3625 | u2del = HCS_U2_LATENCY(xhci->hcs_params3); | ||
3626 | field = le32_to_cpu(udev->bos->ext_cap->bmAttributes); | ||
3620 | 3627 | ||
3621 | if (use_besl) { | 3628 | if (field & USB_BESL_SUPPORT) { |
3622 | for (hird = 0; hird < 16; hird++) { | 3629 | for (besl_host = 0; besl_host < 16; besl_host++) { |
3623 | if (xhci_besl_encoding[hird] >= u2del) | 3630 | if (xhci_besl_encoding[besl_host] >= u2del) |
3624 | break; | 3631 | break; |
3625 | } | 3632 | } |
3633 | /* Use baseline BESL value as default */ | ||
3634 | if (field & USB_BESL_BASELINE_VALID) | ||
3635 | besl_device = USB_GET_BESL_BASELINE(field); | ||
3636 | else if (field & USB_BESL_DEEP_VALID) | ||
3637 | besl_device = USB_GET_BESL_DEEP(field); | ||
3626 | } else { | 3638 | } else { |
3627 | if (u2del <= 50) | 3639 | if (u2del <= 50) |
3628 | hird = 0; | 3640 | besl_host = 0; |
3629 | else | 3641 | else |
3630 | hird = (u2del - 51) / 75 + 1; | 3642 | besl_host = (u2del - 51) / 75 + 1; |
3631 | |||
3632 | if (hird > 15) | ||
3633 | hird = 15; | ||
3634 | } | 3643 | } |
3635 | 3644 | ||
3636 | return hird; | 3645 | besl = besl_host + besl_device; |
3646 | if (besl > 15) | ||
3647 | besl = 15; | ||
3648 | |||
3649 | return besl; | ||
3637 | } | 3650 | } |
3638 | 3651 | ||
3639 | static int xhci_usb2_software_lpm_test(struct usb_hcd *hcd, | 3652 | static int xhci_usb2_software_lpm_test(struct usb_hcd *hcd, |
@@ -3646,7 +3659,7 @@ static int xhci_usb2_software_lpm_test(struct usb_hcd *hcd, | |||
3646 | u32 temp, dev_id; | 3659 | u32 temp, dev_id; |
3647 | unsigned int port_num; | 3660 | unsigned int port_num; |
3648 | unsigned long flags; | 3661 | unsigned long flags; |
3649 | int u2del, hird; | 3662 | int hird; |
3650 | int ret; | 3663 | int ret; |
3651 | 3664 | ||
3652 | if (hcd->speed == HCD_USB3 || !xhci->sw_lpm_support || | 3665 | if (hcd->speed == HCD_USB3 || !xhci->sw_lpm_support || |
@@ -3692,12 +3705,7 @@ static int xhci_usb2_software_lpm_test(struct usb_hcd *hcd, | |||
3692 | * HIRD or BESL shoule be used. See USB2.0 LPM errata. | 3705 | * HIRD or BESL shoule be used. See USB2.0 LPM errata. |
3693 | */ | 3706 | */ |
3694 | pm_addr = port_array[port_num] + 1; | 3707 | pm_addr = port_array[port_num] + 1; |
3695 | u2del = HCS_U2_LATENCY(xhci->hcs_params3); | 3708 | hird = xhci_calculate_hird_besl(xhci, udev); |
3696 | if (le32_to_cpu(udev->bos->ext_cap->bmAttributes) & (1 << 2)) | ||
3697 | hird = xhci_calculate_hird_besl(u2del, 1); | ||
3698 | else | ||
3699 | hird = xhci_calculate_hird_besl(u2del, 0); | ||
3700 | |||
3701 | temp = PORT_L1DS(udev->slot_id) | PORT_HIRD(hird); | 3709 | temp = PORT_L1DS(udev->slot_id) | PORT_HIRD(hird); |
3702 | xhci_writel(xhci, temp, pm_addr); | 3710 | xhci_writel(xhci, temp, pm_addr); |
3703 | 3711 | ||
@@ -3776,7 +3784,7 @@ int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd, | |||
3776 | u32 temp; | 3784 | u32 temp; |
3777 | unsigned int port_num; | 3785 | unsigned int port_num; |
3778 | unsigned long flags; | 3786 | unsigned long flags; |
3779 | int u2del, hird; | 3787 | int hird; |
3780 | 3788 | ||
3781 | if (hcd->speed == HCD_USB3 || !xhci->hw_lpm_support || | 3789 | if (hcd->speed == HCD_USB3 || !xhci->hw_lpm_support || |
3782 | !udev->lpm_capable) | 3790 | !udev->lpm_capable) |
@@ -3799,11 +3807,7 @@ int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd, | |||
3799 | xhci_dbg(xhci, "%s port %d USB2 hardware LPM\n", | 3807 | xhci_dbg(xhci, "%s port %d USB2 hardware LPM\n", |
3800 | enable ? "enable" : "disable", port_num); | 3808 | enable ? "enable" : "disable", port_num); |
3801 | 3809 | ||
3802 | u2del = HCS_U2_LATENCY(xhci->hcs_params3); | 3810 | hird = xhci_calculate_hird_besl(xhci, udev); |
3803 | if (le32_to_cpu(udev->bos->ext_cap->bmAttributes) & (1 << 2)) | ||
3804 | hird = xhci_calculate_hird_besl(u2del, 1); | ||
3805 | else | ||
3806 | hird = xhci_calculate_hird_besl(u2del, 0); | ||
3807 | 3811 | ||
3808 | if (enable) { | 3812 | if (enable) { |
3809 | temp &= ~PORT_HIRD_MASK; | 3813 | temp &= ~PORT_HIRD_MASK; |
@@ -3964,7 +3968,8 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks) | |||
3964 | int retval; | 3968 | int retval; |
3965 | u32 temp; | 3969 | u32 temp; |
3966 | 3970 | ||
3967 | hcd->self.sg_tablesize = TRBS_PER_SEGMENT - 2; | 3971 | /* Accept arbitrarily long scatter-gather lists */ |
3972 | hcd->self.sg_tablesize = ~0; | ||
3968 | 3973 | ||
3969 | if (usb_hcd_is_primary_hcd(hcd)) { | 3974 | if (usb_hcd_is_primary_hcd(hcd)) { |
3970 | xhci = kzalloc(sizeof(struct xhci_hcd), GFP_KERNEL); | 3975 | xhci = kzalloc(sizeof(struct xhci_hcd), GFP_KERNEL); |
@@ -4059,6 +4064,11 @@ static int __init xhci_hcd_init(void) | |||
4059 | printk(KERN_DEBUG "Problem registering PCI driver."); | 4064 | printk(KERN_DEBUG "Problem registering PCI driver."); |
4060 | return retval; | 4065 | return retval; |
4061 | } | 4066 | } |
4067 | retval = xhci_register_plat(); | ||
4068 | if (retval < 0) { | ||
4069 | printk(KERN_DEBUG "Problem registering platform driver."); | ||
4070 | goto unreg_pci; | ||
4071 | } | ||
4062 | /* | 4072 | /* |
4063 | * Check the compiler generated sizes of structures that must be laid | 4073 | * Check the compiler generated sizes of structures that must be laid |
4064 | * out in specific ways for hardware access. | 4074 | * out in specific ways for hardware access. |
@@ -4078,11 +4088,15 @@ static int __init xhci_hcd_init(void) | |||
4078 | BUILD_BUG_ON(sizeof(struct xhci_run_regs) != (8+8*128)*32/8); | 4088 | BUILD_BUG_ON(sizeof(struct xhci_run_regs) != (8+8*128)*32/8); |
4079 | BUILD_BUG_ON(sizeof(struct xhci_doorbell_array) != 256*32/8); | 4089 | BUILD_BUG_ON(sizeof(struct xhci_doorbell_array) != 256*32/8); |
4080 | return 0; | 4090 | return 0; |
4091 | unreg_pci: | ||
4092 | xhci_unregister_pci(); | ||
4093 | return retval; | ||
4081 | } | 4094 | } |
4082 | module_init(xhci_hcd_init); | 4095 | module_init(xhci_hcd_init); |
4083 | 4096 | ||
4084 | static void __exit xhci_hcd_cleanup(void) | 4097 | static void __exit xhci_hcd_cleanup(void) |
4085 | { | 4098 | { |
4086 | xhci_unregister_pci(); | 4099 | xhci_unregister_pci(); |
4100 | xhci_unregister_plat(); | ||
4087 | } | 4101 | } |
4088 | module_exit(xhci_hcd_cleanup); | 4102 | module_exit(xhci_hcd_cleanup); |
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index fb99c8379142..91074fdab3eb 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
@@ -1223,10 +1223,7 @@ union xhci_trb { | |||
1223 | /* Allow two commands + a link TRB, along with any reserved command TRBs */ | 1223 | /* Allow two commands + a link TRB, along with any reserved command TRBs */ |
1224 | #define MAX_RSVD_CMD_TRBS (TRBS_PER_SEGMENT - 3) | 1224 | #define MAX_RSVD_CMD_TRBS (TRBS_PER_SEGMENT - 3) |
1225 | #define SEGMENT_SIZE (TRBS_PER_SEGMENT*16) | 1225 | #define SEGMENT_SIZE (TRBS_PER_SEGMENT*16) |
1226 | /* SEGMENT_SHIFT should be log2(SEGMENT_SIZE). | 1226 | #define SEGMENT_SHIFT (__ffs(SEGMENT_SIZE)) |
1227 | * Change this if you change TRBS_PER_SEGMENT! | ||
1228 | */ | ||
1229 | #define SEGMENT_SHIFT 10 | ||
1230 | /* TRB buffer pointers can't cross 64KB boundaries */ | 1227 | /* TRB buffer pointers can't cross 64KB boundaries */ |
1231 | #define TRB_MAX_BUFF_SHIFT 16 | 1228 | #define TRB_MAX_BUFF_SHIFT 16 |
1232 | #define TRB_MAX_BUFF_SIZE (1 << TRB_MAX_BUFF_SHIFT) | 1229 | #define TRB_MAX_BUFF_SIZE (1 << TRB_MAX_BUFF_SHIFT) |
@@ -1253,8 +1250,19 @@ struct xhci_dequeue_state { | |||
1253 | int new_cycle_state; | 1250 | int new_cycle_state; |
1254 | }; | 1251 | }; |
1255 | 1252 | ||
1253 | enum xhci_ring_type { | ||
1254 | TYPE_CTRL = 0, | ||
1255 | TYPE_ISOC, | ||
1256 | TYPE_BULK, | ||
1257 | TYPE_INTR, | ||
1258 | TYPE_STREAM, | ||
1259 | TYPE_COMMAND, | ||
1260 | TYPE_EVENT, | ||
1261 | }; | ||
1262 | |||
1256 | struct xhci_ring { | 1263 | struct xhci_ring { |
1257 | struct xhci_segment *first_seg; | 1264 | struct xhci_segment *first_seg; |
1265 | struct xhci_segment *last_seg; | ||
1258 | union xhci_trb *enqueue; | 1266 | union xhci_trb *enqueue; |
1259 | struct xhci_segment *enq_seg; | 1267 | struct xhci_segment *enq_seg; |
1260 | unsigned int enq_updates; | 1268 | unsigned int enq_updates; |
@@ -1269,6 +1277,10 @@ struct xhci_ring { | |||
1269 | */ | 1277 | */ |
1270 | u32 cycle_state; | 1278 | u32 cycle_state; |
1271 | unsigned int stream_id; | 1279 | unsigned int stream_id; |
1280 | unsigned int num_segs; | ||
1281 | unsigned int num_trbs_free; | ||
1282 | unsigned int num_trbs_free_temp; | ||
1283 | enum xhci_ring_type type; | ||
1272 | bool last_td_was_short; | 1284 | bool last_td_was_short; |
1273 | }; | 1285 | }; |
1274 | 1286 | ||
@@ -1344,6 +1356,7 @@ struct xhci_bus_state { | |||
1344 | /* ports suspend status arrays - max 31 ports for USB2, 15 for USB3 */ | 1356 | /* ports suspend status arrays - max 31 ports for USB2, 15 for USB3 */ |
1345 | u32 port_c_suspend; | 1357 | u32 port_c_suspend; |
1346 | u32 suspended_ports; | 1358 | u32 suspended_ports; |
1359 | u32 port_remote_wakeup; | ||
1347 | unsigned long resume_done[USB_MAXCHILDREN]; | 1360 | unsigned long resume_done[USB_MAXCHILDREN]; |
1348 | }; | 1361 | }; |
1349 | 1362 | ||
@@ -1609,6 +1622,8 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, struct xhci_virt_device *virt_dev, | |||
1609 | struct usb_device *udev, struct usb_host_endpoint *ep, | 1622 | struct usb_device *udev, struct usb_host_endpoint *ep, |
1610 | gfp_t mem_flags); | 1623 | gfp_t mem_flags); |
1611 | void xhci_ring_free(struct xhci_hcd *xhci, struct xhci_ring *ring); | 1624 | void xhci_ring_free(struct xhci_hcd *xhci, struct xhci_ring *ring); |
1625 | int xhci_ring_expansion(struct xhci_hcd *xhci, struct xhci_ring *ring, | ||
1626 | unsigned int num_trbs, gfp_t flags); | ||
1612 | void xhci_free_or_cache_endpoint_ring(struct xhci_hcd *xhci, | 1627 | void xhci_free_or_cache_endpoint_ring(struct xhci_hcd *xhci, |
1613 | struct xhci_virt_device *virt_dev, | 1628 | struct xhci_virt_device *virt_dev, |
1614 | unsigned int ep_index); | 1629 | unsigned int ep_index); |
@@ -1648,6 +1663,17 @@ static inline int xhci_register_pci(void) { return 0; } | |||
1648 | static inline void xhci_unregister_pci(void) {} | 1663 | static inline void xhci_unregister_pci(void) {} |
1649 | #endif | 1664 | #endif |
1650 | 1665 | ||
1666 | #if defined(CONFIG_USB_XHCI_PLATFORM) \ | ||
1667 | || defined(CONFIG_USB_XHCI_PLATFORM_MODULE) | ||
1668 | int xhci_register_plat(void); | ||
1669 | void xhci_unregister_plat(void); | ||
1670 | #else | ||
1671 | static inline int xhci_register_plat(void) | ||
1672 | { return 0; } | ||
1673 | static inline void xhci_unregister_plat(void) | ||
1674 | { } | ||
1675 | #endif | ||
1676 | |||
1651 | /* xHCI host controller glue */ | 1677 | /* xHCI host controller glue */ |
1652 | typedef void (*xhci_get_quirks_t)(struct device *, struct xhci_hcd *); | 1678 | typedef void (*xhci_get_quirks_t)(struct device *, struct xhci_hcd *); |
1653 | void xhci_quiesce(struct xhci_hcd *xhci); | 1679 | void xhci_quiesce(struct xhci_hcd *xhci); |
diff --git a/drivers/usb/musb/am35x.c b/drivers/usb/musb/am35x.c index e233d2b7d335..9f3eda91ea4d 100644 --- a/drivers/usb/musb/am35x.c +++ b/drivers/usb/musb/am35x.c | |||
@@ -226,6 +226,7 @@ static irqreturn_t am35x_musb_interrupt(int irq, void *hci) | |||
226 | struct device *dev = musb->controller; | 226 | struct device *dev = musb->controller; |
227 | struct musb_hdrc_platform_data *plat = dev->platform_data; | 227 | struct musb_hdrc_platform_data *plat = dev->platform_data; |
228 | struct omap_musb_board_data *data = plat->board_data; | 228 | struct omap_musb_board_data *data = plat->board_data; |
229 | struct usb_otg *otg = musb->xceiv->otg; | ||
229 | unsigned long flags; | 230 | unsigned long flags; |
230 | irqreturn_t ret = IRQ_NONE; | 231 | irqreturn_t ret = IRQ_NONE; |
231 | u32 epintr, usbintr; | 232 | u32 epintr, usbintr; |
@@ -289,14 +290,14 @@ static irqreturn_t am35x_musb_interrupt(int irq, void *hci) | |||
289 | WARNING("VBUS error workaround (delay coming)\n"); | 290 | WARNING("VBUS error workaround (delay coming)\n"); |
290 | } else if (is_host_enabled(musb) && drvvbus) { | 291 | } else if (is_host_enabled(musb) && drvvbus) { |
291 | MUSB_HST_MODE(musb); | 292 | MUSB_HST_MODE(musb); |
292 | musb->xceiv->default_a = 1; | 293 | otg->default_a = 1; |
293 | musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; | 294 | musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; |
294 | portstate(musb->port1_status |= USB_PORT_STAT_POWER); | 295 | portstate(musb->port1_status |= USB_PORT_STAT_POWER); |
295 | del_timer(&otg_workaround); | 296 | del_timer(&otg_workaround); |
296 | } else { | 297 | } else { |
297 | musb->is_active = 0; | 298 | musb->is_active = 0; |
298 | MUSB_DEV_MODE(musb); | 299 | MUSB_DEV_MODE(musb); |
299 | musb->xceiv->default_a = 0; | 300 | otg->default_a = 0; |
300 | musb->xceiv->state = OTG_STATE_B_IDLE; | 301 | musb->xceiv->state = OTG_STATE_B_IDLE; |
301 | portstate(musb->port1_status &= ~USB_PORT_STAT_POWER); | 302 | portstate(musb->port1_status &= ~USB_PORT_STAT_POWER); |
302 | } | 303 | } |
@@ -363,7 +364,7 @@ static int am35x_musb_init(struct musb *musb) | |||
363 | return -ENODEV; | 364 | return -ENODEV; |
364 | 365 | ||
365 | usb_nop_xceiv_register(); | 366 | usb_nop_xceiv_register(); |
366 | musb->xceiv = otg_get_transceiver(); | 367 | musb->xceiv = usb_get_transceiver(); |
367 | if (!musb->xceiv) | 368 | if (!musb->xceiv) |
368 | return -ENODEV; | 369 | return -ENODEV; |
369 | 370 | ||
@@ -405,7 +406,7 @@ static int am35x_musb_exit(struct musb *musb) | |||
405 | if (data->set_phy_power) | 406 | if (data->set_phy_power) |
406 | data->set_phy_power(0); | 407 | data->set_phy_power(0); |
407 | 408 | ||
408 | otg_put_transceiver(musb->xceiv); | 409 | usb_put_transceiver(musb->xceiv); |
409 | usb_nop_xceiv_unregister(); | 410 | usb_nop_xceiv_unregister(); |
410 | 411 | ||
411 | return 0; | 412 | return 0; |
@@ -456,7 +457,7 @@ static const struct musb_platform_ops am35x_ops = { | |||
456 | 457 | ||
457 | static u64 am35x_dmamask = DMA_BIT_MASK(32); | 458 | static u64 am35x_dmamask = DMA_BIT_MASK(32); |
458 | 459 | ||
459 | static int __init am35x_probe(struct platform_device *pdev) | 460 | static int __devinit am35x_probe(struct platform_device *pdev) |
460 | { | 461 | { |
461 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; | 462 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; |
462 | struct platform_device *musb; | 463 | struct platform_device *musb; |
@@ -561,7 +562,7 @@ err0: | |||
561 | return ret; | 562 | return ret; |
562 | } | 563 | } |
563 | 564 | ||
564 | static int __exit am35x_remove(struct platform_device *pdev) | 565 | static int __devexit am35x_remove(struct platform_device *pdev) |
565 | { | 566 | { |
566 | struct am35x_glue *glue = platform_get_drvdata(pdev); | 567 | struct am35x_glue *glue = platform_get_drvdata(pdev); |
567 | 568 | ||
@@ -630,7 +631,8 @@ static struct dev_pm_ops am35x_pm_ops = { | |||
630 | #endif | 631 | #endif |
631 | 632 | ||
632 | static struct platform_driver am35x_driver = { | 633 | static struct platform_driver am35x_driver = { |
633 | .remove = __exit_p(am35x_remove), | 634 | .probe = am35x_probe, |
635 | .remove = __devexit_p(am35x_remove), | ||
634 | .driver = { | 636 | .driver = { |
635 | .name = "musb-am35x", | 637 | .name = "musb-am35x", |
636 | .pm = DEV_PM_OPS, | 638 | .pm = DEV_PM_OPS, |
@@ -643,9 +645,9 @@ MODULE_LICENSE("GPL v2"); | |||
643 | 645 | ||
644 | static int __init am35x_init(void) | 646 | static int __init am35x_init(void) |
645 | { | 647 | { |
646 | return platform_driver_probe(&am35x_driver, am35x_probe); | 648 | return platform_driver_register(&am35x_driver); |
647 | } | 649 | } |
648 | subsys_initcall(am35x_init); | 650 | module_init(am35x_init); |
649 | 651 | ||
650 | static void __exit am35x_exit(void) | 652 | static void __exit am35x_exit(void) |
651 | { | 653 | { |
diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c index 5e7cfba5b079..a087ed6c3be9 100644 --- a/drivers/usb/musb/blackfin.c +++ b/drivers/usb/musb/blackfin.c | |||
@@ -317,7 +317,7 @@ static void bfin_musb_set_vbus(struct musb *musb, int is_on) | |||
317 | musb_readb(musb->mregs, MUSB_DEVCTL)); | 317 | musb_readb(musb->mregs, MUSB_DEVCTL)); |
318 | } | 318 | } |
319 | 319 | ||
320 | static int bfin_musb_set_power(struct otg_transceiver *x, unsigned mA) | 320 | static int bfin_musb_set_power(struct usb_phy *x, unsigned mA) |
321 | { | 321 | { |
322 | return 0; | 322 | return 0; |
323 | } | 323 | } |
@@ -415,7 +415,7 @@ static int bfin_musb_init(struct musb *musb) | |||
415 | gpio_direction_output(musb->config->gpio_vrsel, 0); | 415 | gpio_direction_output(musb->config->gpio_vrsel, 0); |
416 | 416 | ||
417 | usb_nop_xceiv_register(); | 417 | usb_nop_xceiv_register(); |
418 | musb->xceiv = otg_get_transceiver(); | 418 | musb->xceiv = usb_get_transceiver(); |
419 | if (!musb->xceiv) { | 419 | if (!musb->xceiv) { |
420 | gpio_free(musb->config->gpio_vrsel); | 420 | gpio_free(musb->config->gpio_vrsel); |
421 | return -ENODEV; | 421 | return -ENODEV; |
@@ -440,7 +440,7 @@ static int bfin_musb_exit(struct musb *musb) | |||
440 | { | 440 | { |
441 | gpio_free(musb->config->gpio_vrsel); | 441 | gpio_free(musb->config->gpio_vrsel); |
442 | 442 | ||
443 | otg_put_transceiver(musb->xceiv); | 443 | usb_put_transceiver(musb->xceiv); |
444 | usb_nop_xceiv_unregister(); | 444 | usb_nop_xceiv_unregister(); |
445 | return 0; | 445 | return 0; |
446 | } | 446 | } |
@@ -463,7 +463,7 @@ static const struct musb_platform_ops bfin_ops = { | |||
463 | 463 | ||
464 | static u64 bfin_dmamask = DMA_BIT_MASK(32); | 464 | static u64 bfin_dmamask = DMA_BIT_MASK(32); |
465 | 465 | ||
466 | static int __init bfin_probe(struct platform_device *pdev) | 466 | static int __devinit bfin_probe(struct platform_device *pdev) |
467 | { | 467 | { |
468 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; | 468 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; |
469 | struct platform_device *musb; | 469 | struct platform_device *musb; |
@@ -525,7 +525,7 @@ err0: | |||
525 | return ret; | 525 | return ret; |
526 | } | 526 | } |
527 | 527 | ||
528 | static int __exit bfin_remove(struct platform_device *pdev) | 528 | static int __devexit bfin_remove(struct platform_device *pdev) |
529 | { | 529 | { |
530 | struct bfin_glue *glue = platform_get_drvdata(pdev); | 530 | struct bfin_glue *glue = platform_get_drvdata(pdev); |
531 | 531 | ||
@@ -575,6 +575,7 @@ static struct dev_pm_ops bfin_pm_ops = { | |||
575 | #endif | 575 | #endif |
576 | 576 | ||
577 | static struct platform_driver bfin_driver = { | 577 | static struct platform_driver bfin_driver = { |
578 | .probe = bfin_probe, | ||
578 | .remove = __exit_p(bfin_remove), | 579 | .remove = __exit_p(bfin_remove), |
579 | .driver = { | 580 | .driver = { |
580 | .name = "musb-blackfin", | 581 | .name = "musb-blackfin", |
@@ -588,9 +589,9 @@ MODULE_LICENSE("GPL v2"); | |||
588 | 589 | ||
589 | static int __init bfin_init(void) | 590 | static int __init bfin_init(void) |
590 | { | 591 | { |
591 | return platform_driver_probe(&bfin_driver, bfin_probe); | 592 | return platform_driver_register(&bfin_driver); |
592 | } | 593 | } |
593 | subsys_initcall(bfin_init); | 594 | module_init(bfin_init); |
594 | 595 | ||
595 | static void __exit bfin_exit(void) | 596 | static void __exit bfin_exit(void) |
596 | { | 597 | { |
diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c index 2613bfdb09b6..8bd9566f3fbb 100644 --- a/drivers/usb/musb/da8xx.c +++ b/drivers/usb/musb/da8xx.c | |||
@@ -294,6 +294,7 @@ static irqreturn_t da8xx_musb_interrupt(int irq, void *hci) | |||
294 | { | 294 | { |
295 | struct musb *musb = hci; | 295 | struct musb *musb = hci; |
296 | void __iomem *reg_base = musb->ctrl_base; | 296 | void __iomem *reg_base = musb->ctrl_base; |
297 | struct usb_otg *otg = musb->xceiv->otg; | ||
297 | unsigned long flags; | 298 | unsigned long flags; |
298 | irqreturn_t ret = IRQ_NONE; | 299 | irqreturn_t ret = IRQ_NONE; |
299 | u32 status; | 300 | u32 status; |
@@ -351,14 +352,14 @@ static irqreturn_t da8xx_musb_interrupt(int irq, void *hci) | |||
351 | WARNING("VBUS error workaround (delay coming)\n"); | 352 | WARNING("VBUS error workaround (delay coming)\n"); |
352 | } else if (is_host_enabled(musb) && drvvbus) { | 353 | } else if (is_host_enabled(musb) && drvvbus) { |
353 | MUSB_HST_MODE(musb); | 354 | MUSB_HST_MODE(musb); |
354 | musb->xceiv->default_a = 1; | 355 | otg->default_a = 1; |
355 | musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; | 356 | musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; |
356 | portstate(musb->port1_status |= USB_PORT_STAT_POWER); | 357 | portstate(musb->port1_status |= USB_PORT_STAT_POWER); |
357 | del_timer(&otg_workaround); | 358 | del_timer(&otg_workaround); |
358 | } else { | 359 | } else { |
359 | musb->is_active = 0; | 360 | musb->is_active = 0; |
360 | MUSB_DEV_MODE(musb); | 361 | MUSB_DEV_MODE(musb); |
361 | musb->xceiv->default_a = 0; | 362 | otg->default_a = 0; |
362 | musb->xceiv->state = OTG_STATE_B_IDLE; | 363 | musb->xceiv->state = OTG_STATE_B_IDLE; |
363 | portstate(musb->port1_status &= ~USB_PORT_STAT_POWER); | 364 | portstate(musb->port1_status &= ~USB_PORT_STAT_POWER); |
364 | } | 365 | } |
@@ -424,7 +425,7 @@ static int da8xx_musb_init(struct musb *musb) | |||
424 | goto fail; | 425 | goto fail; |
425 | 426 | ||
426 | usb_nop_xceiv_register(); | 427 | usb_nop_xceiv_register(); |
427 | musb->xceiv = otg_get_transceiver(); | 428 | musb->xceiv = usb_get_transceiver(); |
428 | if (!musb->xceiv) | 429 | if (!musb->xceiv) |
429 | goto fail; | 430 | goto fail; |
430 | 431 | ||
@@ -457,7 +458,7 @@ static int da8xx_musb_exit(struct musb *musb) | |||
457 | 458 | ||
458 | phy_off(); | 459 | phy_off(); |
459 | 460 | ||
460 | otg_put_transceiver(musb->xceiv); | 461 | usb_put_transceiver(musb->xceiv); |
461 | usb_nop_xceiv_unregister(); | 462 | usb_nop_xceiv_unregister(); |
462 | 463 | ||
463 | return 0; | 464 | return 0; |
@@ -478,7 +479,7 @@ static const struct musb_platform_ops da8xx_ops = { | |||
478 | 479 | ||
479 | static u64 da8xx_dmamask = DMA_BIT_MASK(32); | 480 | static u64 da8xx_dmamask = DMA_BIT_MASK(32); |
480 | 481 | ||
481 | static int __init da8xx_probe(struct platform_device *pdev) | 482 | static int __devinit da8xx_probe(struct platform_device *pdev) |
482 | { | 483 | { |
483 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; | 484 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; |
484 | struct platform_device *musb; | 485 | struct platform_device *musb; |
@@ -562,7 +563,7 @@ err0: | |||
562 | return ret; | 563 | return ret; |
563 | } | 564 | } |
564 | 565 | ||
565 | static int __exit da8xx_remove(struct platform_device *pdev) | 566 | static int __devexit da8xx_remove(struct platform_device *pdev) |
566 | { | 567 | { |
567 | struct da8xx_glue *glue = platform_get_drvdata(pdev); | 568 | struct da8xx_glue *glue = platform_get_drvdata(pdev); |
568 | 569 | ||
@@ -576,7 +577,8 @@ static int __exit da8xx_remove(struct platform_device *pdev) | |||
576 | } | 577 | } |
577 | 578 | ||
578 | static struct platform_driver da8xx_driver = { | 579 | static struct platform_driver da8xx_driver = { |
579 | .remove = __exit_p(da8xx_remove), | 580 | .probe = da8xx_probe, |
581 | .remove = __devexit_p(da8xx_remove), | ||
580 | .driver = { | 582 | .driver = { |
581 | .name = "musb-da8xx", | 583 | .name = "musb-da8xx", |
582 | }, | 584 | }, |
@@ -588,9 +590,9 @@ MODULE_LICENSE("GPL v2"); | |||
588 | 590 | ||
589 | static int __init da8xx_init(void) | 591 | static int __init da8xx_init(void) |
590 | { | 592 | { |
591 | return platform_driver_probe(&da8xx_driver, da8xx_probe); | 593 | return platform_driver_register(&da8xx_driver); |
592 | } | 594 | } |
593 | subsys_initcall(da8xx_init); | 595 | module_init(da8xx_init); |
594 | 596 | ||
595 | static void __exit da8xx_exit(void) | 597 | static void __exit da8xx_exit(void) |
596 | { | 598 | { |
diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c index 7c569f51212a..97ab975fa442 100644 --- a/drivers/usb/musb/davinci.c +++ b/drivers/usb/musb/davinci.c | |||
@@ -265,6 +265,7 @@ static irqreturn_t davinci_musb_interrupt(int irq, void *__hci) | |||
265 | unsigned long flags; | 265 | unsigned long flags; |
266 | irqreturn_t retval = IRQ_NONE; | 266 | irqreturn_t retval = IRQ_NONE; |
267 | struct musb *musb = __hci; | 267 | struct musb *musb = __hci; |
268 | struct usb_otg *otg = musb->xceiv->otg; | ||
268 | void __iomem *tibase = musb->ctrl_base; | 269 | void __iomem *tibase = musb->ctrl_base; |
269 | struct cppi *cppi; | 270 | struct cppi *cppi; |
270 | u32 tmp; | 271 | u32 tmp; |
@@ -331,14 +332,14 @@ static irqreturn_t davinci_musb_interrupt(int irq, void *__hci) | |||
331 | WARNING("VBUS error workaround (delay coming)\n"); | 332 | WARNING("VBUS error workaround (delay coming)\n"); |
332 | } else if (is_host_enabled(musb) && drvvbus) { | 333 | } else if (is_host_enabled(musb) && drvvbus) { |
333 | MUSB_HST_MODE(musb); | 334 | MUSB_HST_MODE(musb); |
334 | musb->xceiv->default_a = 1; | 335 | otg->default_a = 1; |
335 | musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; | 336 | musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; |
336 | portstate(musb->port1_status |= USB_PORT_STAT_POWER); | 337 | portstate(musb->port1_status |= USB_PORT_STAT_POWER); |
337 | del_timer(&otg_workaround); | 338 | del_timer(&otg_workaround); |
338 | } else { | 339 | } else { |
339 | musb->is_active = 0; | 340 | musb->is_active = 0; |
340 | MUSB_DEV_MODE(musb); | 341 | MUSB_DEV_MODE(musb); |
341 | musb->xceiv->default_a = 0; | 342 | otg->default_a = 0; |
342 | musb->xceiv->state = OTG_STATE_B_IDLE; | 343 | musb->xceiv->state = OTG_STATE_B_IDLE; |
343 | portstate(musb->port1_status &= ~USB_PORT_STAT_POWER); | 344 | portstate(musb->port1_status &= ~USB_PORT_STAT_POWER); |
344 | } | 345 | } |
@@ -383,7 +384,7 @@ static int davinci_musb_init(struct musb *musb) | |||
383 | u32 revision; | 384 | u32 revision; |
384 | 385 | ||
385 | usb_nop_xceiv_register(); | 386 | usb_nop_xceiv_register(); |
386 | musb->xceiv = otg_get_transceiver(); | 387 | musb->xceiv = usb_get_transceiver(); |
387 | if (!musb->xceiv) | 388 | if (!musb->xceiv) |
388 | return -ENODEV; | 389 | return -ENODEV; |
389 | 390 | ||
@@ -442,7 +443,7 @@ static int davinci_musb_init(struct musb *musb) | |||
442 | return 0; | 443 | return 0; |
443 | 444 | ||
444 | fail: | 445 | fail: |
445 | otg_put_transceiver(musb->xceiv); | 446 | usb_put_transceiver(musb->xceiv); |
446 | usb_nop_xceiv_unregister(); | 447 | usb_nop_xceiv_unregister(); |
447 | return -ENODEV; | 448 | return -ENODEV; |
448 | } | 449 | } |
@@ -464,7 +465,7 @@ static int davinci_musb_exit(struct musb *musb) | |||
464 | davinci_musb_source_power(musb, 0 /*off*/, 1); | 465 | davinci_musb_source_power(musb, 0 /*off*/, 1); |
465 | 466 | ||
466 | /* delay, to avoid problems with module reload */ | 467 | /* delay, to avoid problems with module reload */ |
467 | if (is_host_enabled(musb) && musb->xceiv->default_a) { | 468 | if (is_host_enabled(musb) && musb->xceiv->otg->default_a) { |
468 | int maxdelay = 30; | 469 | int maxdelay = 30; |
469 | u8 devctl, warn = 0; | 470 | u8 devctl, warn = 0; |
470 | 471 | ||
@@ -491,7 +492,7 @@ static int davinci_musb_exit(struct musb *musb) | |||
491 | 492 | ||
492 | phy_off(); | 493 | phy_off(); |
493 | 494 | ||
494 | otg_put_transceiver(musb->xceiv); | 495 | usb_put_transceiver(musb->xceiv); |
495 | usb_nop_xceiv_unregister(); | 496 | usb_nop_xceiv_unregister(); |
496 | 497 | ||
497 | return 0; | 498 | return 0; |
@@ -511,7 +512,7 @@ static const struct musb_platform_ops davinci_ops = { | |||
511 | 512 | ||
512 | static u64 davinci_dmamask = DMA_BIT_MASK(32); | 513 | static u64 davinci_dmamask = DMA_BIT_MASK(32); |
513 | 514 | ||
514 | static int __init davinci_probe(struct platform_device *pdev) | 515 | static int __devinit davinci_probe(struct platform_device *pdev) |
515 | { | 516 | { |
516 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; | 517 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; |
517 | struct platform_device *musb; | 518 | struct platform_device *musb; |
@@ -594,7 +595,7 @@ err0: | |||
594 | return ret; | 595 | return ret; |
595 | } | 596 | } |
596 | 597 | ||
597 | static int __exit davinci_remove(struct platform_device *pdev) | 598 | static int __devexit davinci_remove(struct platform_device *pdev) |
598 | { | 599 | { |
599 | struct davinci_glue *glue = platform_get_drvdata(pdev); | 600 | struct davinci_glue *glue = platform_get_drvdata(pdev); |
600 | 601 | ||
@@ -608,7 +609,8 @@ static int __exit davinci_remove(struct platform_device *pdev) | |||
608 | } | 609 | } |
609 | 610 | ||
610 | static struct platform_driver davinci_driver = { | 611 | static struct platform_driver davinci_driver = { |
611 | .remove = __exit_p(davinci_remove), | 612 | .probe = davinci_probe, |
613 | .remove = __devexit_p(davinci_remove), | ||
612 | .driver = { | 614 | .driver = { |
613 | .name = "musb-davinci", | 615 | .name = "musb-davinci", |
614 | }, | 616 | }, |
@@ -620,9 +622,9 @@ MODULE_LICENSE("GPL v2"); | |||
620 | 622 | ||
621 | static int __init davinci_init(void) | 623 | static int __init davinci_init(void) |
622 | { | 624 | { |
623 | return platform_driver_probe(&davinci_driver, davinci_probe); | 625 | return platform_driver_register(&davinci_driver); |
624 | } | 626 | } |
625 | subsys_initcall(davinci_init); | 627 | module_init(davinci_init); |
626 | 628 | ||
627 | static void __exit davinci_exit(void) | 629 | static void __exit davinci_exit(void) |
628 | { | 630 | { |
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index 3d11cf64ebd1..0f8b82918a40 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
@@ -131,9 +131,9 @@ static inline struct musb *dev_to_musb(struct device *dev) | |||
131 | /*-------------------------------------------------------------------------*/ | 131 | /*-------------------------------------------------------------------------*/ |
132 | 132 | ||
133 | #ifndef CONFIG_BLACKFIN | 133 | #ifndef CONFIG_BLACKFIN |
134 | static int musb_ulpi_read(struct otg_transceiver *otg, u32 offset) | 134 | static int musb_ulpi_read(struct usb_phy *phy, u32 offset) |
135 | { | 135 | { |
136 | void __iomem *addr = otg->io_priv; | 136 | void __iomem *addr = phy->io_priv; |
137 | int i = 0; | 137 | int i = 0; |
138 | u8 r; | 138 | u8 r; |
139 | u8 power; | 139 | u8 power; |
@@ -165,10 +165,9 @@ static int musb_ulpi_read(struct otg_transceiver *otg, u32 offset) | |||
165 | return musb_readb(addr, MUSB_ULPI_REG_DATA); | 165 | return musb_readb(addr, MUSB_ULPI_REG_DATA); |
166 | } | 166 | } |
167 | 167 | ||
168 | static int musb_ulpi_write(struct otg_transceiver *otg, | 168 | static int musb_ulpi_write(struct usb_phy *phy, u32 offset, u32 data) |
169 | u32 offset, u32 data) | ||
170 | { | 169 | { |
171 | void __iomem *addr = otg->io_priv; | 170 | void __iomem *addr = phy->io_priv; |
172 | int i = 0; | 171 | int i = 0; |
173 | u8 r = 0; | 172 | u8 r = 0; |
174 | u8 power; | 173 | u8 power; |
@@ -200,7 +199,7 @@ static int musb_ulpi_write(struct otg_transceiver *otg, | |||
200 | #define musb_ulpi_write NULL | 199 | #define musb_ulpi_write NULL |
201 | #endif | 200 | #endif |
202 | 201 | ||
203 | static struct otg_io_access_ops musb_ulpi_access = { | 202 | static struct usb_phy_io_ops musb_ulpi_access = { |
204 | .read = musb_ulpi_read, | 203 | .read = musb_ulpi_read, |
205 | .write = musb_ulpi_write, | 204 | .write = musb_ulpi_write, |
206 | }; | 205 | }; |
@@ -414,6 +413,7 @@ void musb_hnp_stop(struct musb *musb) | |||
414 | static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | 413 | static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, |
415 | u8 devctl, u8 power) | 414 | u8 devctl, u8 power) |
416 | { | 415 | { |
416 | struct usb_otg *otg = musb->xceiv->otg; | ||
417 | irqreturn_t handled = IRQ_NONE; | 417 | irqreturn_t handled = IRQ_NONE; |
418 | 418 | ||
419 | dev_dbg(musb->controller, "<== Power=%02x, DevCtl=%02x, int_usb=0x%x\n", power, devctl, | 419 | dev_dbg(musb->controller, "<== Power=%02x, DevCtl=%02x, int_usb=0x%x\n", power, devctl, |
@@ -626,7 +626,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
626 | case OTG_STATE_B_PERIPHERAL: | 626 | case OTG_STATE_B_PERIPHERAL: |
627 | musb_g_suspend(musb); | 627 | musb_g_suspend(musb); |
628 | musb->is_active = is_otg_enabled(musb) | 628 | musb->is_active = is_otg_enabled(musb) |
629 | && musb->xceiv->gadget->b_hnp_enable; | 629 | && otg->gadget->b_hnp_enable; |
630 | if (musb->is_active) { | 630 | if (musb->is_active) { |
631 | musb->xceiv->state = OTG_STATE_B_WAIT_ACON; | 631 | musb->xceiv->state = OTG_STATE_B_WAIT_ACON; |
632 | dev_dbg(musb->controller, "HNP: Setting timer for b_ase0_brst\n"); | 632 | dev_dbg(musb->controller, "HNP: Setting timer for b_ase0_brst\n"); |
@@ -643,7 +643,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
643 | case OTG_STATE_A_HOST: | 643 | case OTG_STATE_A_HOST: |
644 | musb->xceiv->state = OTG_STATE_A_SUSPEND; | 644 | musb->xceiv->state = OTG_STATE_A_SUSPEND; |
645 | musb->is_active = is_otg_enabled(musb) | 645 | musb->is_active = is_otg_enabled(musb) |
646 | && musb->xceiv->host->b_hnp_enable; | 646 | && otg->host->b_hnp_enable; |
647 | break; | 647 | break; |
648 | case OTG_STATE_B_HOST: | 648 | case OTG_STATE_B_HOST: |
649 | /* Transition to B_PERIPHERAL, see 6.8.2.6 p 44 */ | 649 | /* Transition to B_PERIPHERAL, see 6.8.2.6 p 44 */ |
@@ -1017,12 +1017,12 @@ static void musb_shutdown(struct platform_device *pdev) | |||
1017 | || defined(CONFIG_USB_MUSB_OMAP2PLUS_MODULE) \ | 1017 | || defined(CONFIG_USB_MUSB_OMAP2PLUS_MODULE) \ |
1018 | || defined(CONFIG_USB_MUSB_AM35X) \ | 1018 | || defined(CONFIG_USB_MUSB_AM35X) \ |
1019 | || defined(CONFIG_USB_MUSB_AM35X_MODULE) | 1019 | || defined(CONFIG_USB_MUSB_AM35X_MODULE) |
1020 | static ushort __initdata fifo_mode = 4; | 1020 | static ushort __devinitdata fifo_mode = 4; |
1021 | #elif defined(CONFIG_USB_MUSB_UX500) \ | 1021 | #elif defined(CONFIG_USB_MUSB_UX500) \ |
1022 | || defined(CONFIG_USB_MUSB_UX500_MODULE) | 1022 | || defined(CONFIG_USB_MUSB_UX500_MODULE) |
1023 | static ushort __initdata fifo_mode = 5; | 1023 | static ushort __devinitdata fifo_mode = 5; |
1024 | #else | 1024 | #else |
1025 | static ushort __initdata fifo_mode = 2; | 1025 | static ushort __devinitdata fifo_mode = 2; |
1026 | #endif | 1026 | #endif |
1027 | 1027 | ||
1028 | /* "modprobe ... fifo_mode=1" etc */ | 1028 | /* "modprobe ... fifo_mode=1" etc */ |
@@ -1035,7 +1035,7 @@ MODULE_PARM_DESC(fifo_mode, "initial endpoint configuration"); | |||
1035 | */ | 1035 | */ |
1036 | 1036 | ||
1037 | /* mode 0 - fits in 2KB */ | 1037 | /* mode 0 - fits in 2KB */ |
1038 | static struct musb_fifo_cfg __initdata mode_0_cfg[] = { | 1038 | static struct musb_fifo_cfg __devinitdata mode_0_cfg[] = { |
1039 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, | 1039 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, |
1040 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, | 1040 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, |
1041 | { .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, }, | 1041 | { .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, }, |
@@ -1044,7 +1044,7 @@ static struct musb_fifo_cfg __initdata mode_0_cfg[] = { | |||
1044 | }; | 1044 | }; |
1045 | 1045 | ||
1046 | /* mode 1 - fits in 4KB */ | 1046 | /* mode 1 - fits in 4KB */ |
1047 | static struct musb_fifo_cfg __initdata mode_1_cfg[] = { | 1047 | static struct musb_fifo_cfg __devinitdata mode_1_cfg[] = { |
1048 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, .mode = BUF_DOUBLE, }, | 1048 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, .mode = BUF_DOUBLE, }, |
1049 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, .mode = BUF_DOUBLE, }, | 1049 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, .mode = BUF_DOUBLE, }, |
1050 | { .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, .mode = BUF_DOUBLE, }, | 1050 | { .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, .mode = BUF_DOUBLE, }, |
@@ -1053,7 +1053,7 @@ static struct musb_fifo_cfg __initdata mode_1_cfg[] = { | |||
1053 | }; | 1053 | }; |
1054 | 1054 | ||
1055 | /* mode 2 - fits in 4KB */ | 1055 | /* mode 2 - fits in 4KB */ |
1056 | static struct musb_fifo_cfg __initdata mode_2_cfg[] = { | 1056 | static struct musb_fifo_cfg __devinitdata mode_2_cfg[] = { |
1057 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, | 1057 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, |
1058 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, | 1058 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, |
1059 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, | 1059 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, |
@@ -1063,7 +1063,7 @@ static struct musb_fifo_cfg __initdata mode_2_cfg[] = { | |||
1063 | }; | 1063 | }; |
1064 | 1064 | ||
1065 | /* mode 3 - fits in 4KB */ | 1065 | /* mode 3 - fits in 4KB */ |
1066 | static struct musb_fifo_cfg __initdata mode_3_cfg[] = { | 1066 | static struct musb_fifo_cfg __devinitdata mode_3_cfg[] = { |
1067 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, .mode = BUF_DOUBLE, }, | 1067 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, .mode = BUF_DOUBLE, }, |
1068 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, .mode = BUF_DOUBLE, }, | 1068 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, .mode = BUF_DOUBLE, }, |
1069 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, | 1069 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, |
@@ -1073,7 +1073,7 @@ static struct musb_fifo_cfg __initdata mode_3_cfg[] = { | |||
1073 | }; | 1073 | }; |
1074 | 1074 | ||
1075 | /* mode 4 - fits in 16KB */ | 1075 | /* mode 4 - fits in 16KB */ |
1076 | static struct musb_fifo_cfg __initdata mode_4_cfg[] = { | 1076 | static struct musb_fifo_cfg __devinitdata mode_4_cfg[] = { |
1077 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, | 1077 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, |
1078 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, | 1078 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, |
1079 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, | 1079 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, |
@@ -1104,7 +1104,7 @@ static struct musb_fifo_cfg __initdata mode_4_cfg[] = { | |||
1104 | }; | 1104 | }; |
1105 | 1105 | ||
1106 | /* mode 5 - fits in 8KB */ | 1106 | /* mode 5 - fits in 8KB */ |
1107 | static struct musb_fifo_cfg __initdata mode_5_cfg[] = { | 1107 | static struct musb_fifo_cfg __devinitdata mode_5_cfg[] = { |
1108 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, | 1108 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, |
1109 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, | 1109 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, |
1110 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, | 1110 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, |
@@ -1140,7 +1140,7 @@ static struct musb_fifo_cfg __initdata mode_5_cfg[] = { | |||
1140 | * | 1140 | * |
1141 | * returns negative errno or offset for next fifo. | 1141 | * returns negative errno or offset for next fifo. |
1142 | */ | 1142 | */ |
1143 | static int __init | 1143 | static int __devinit |
1144 | fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep, | 1144 | fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep, |
1145 | const struct musb_fifo_cfg *cfg, u16 offset) | 1145 | const struct musb_fifo_cfg *cfg, u16 offset) |
1146 | { | 1146 | { |
@@ -1211,11 +1211,11 @@ fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep, | |||
1211 | return offset + (maxpacket << ((c_size & MUSB_FIFOSZ_DPB) ? 1 : 0)); | 1211 | return offset + (maxpacket << ((c_size & MUSB_FIFOSZ_DPB) ? 1 : 0)); |
1212 | } | 1212 | } |
1213 | 1213 | ||
1214 | static struct musb_fifo_cfg __initdata ep0_cfg = { | 1214 | static struct musb_fifo_cfg __devinitdata ep0_cfg = { |
1215 | .style = FIFO_RXTX, .maxpacket = 64, | 1215 | .style = FIFO_RXTX, .maxpacket = 64, |
1216 | }; | 1216 | }; |
1217 | 1217 | ||
1218 | static int __init ep_config_from_table(struct musb *musb) | 1218 | static int __devinit ep_config_from_table(struct musb *musb) |
1219 | { | 1219 | { |
1220 | const struct musb_fifo_cfg *cfg; | 1220 | const struct musb_fifo_cfg *cfg; |
1221 | unsigned i, n; | 1221 | unsigned i, n; |
@@ -1306,7 +1306,7 @@ done: | |||
1306 | * ep_config_from_hw - when MUSB_C_DYNFIFO_DEF is false | 1306 | * ep_config_from_hw - when MUSB_C_DYNFIFO_DEF is false |
1307 | * @param musb the controller | 1307 | * @param musb the controller |
1308 | */ | 1308 | */ |
1309 | static int __init ep_config_from_hw(struct musb *musb) | 1309 | static int __devinit ep_config_from_hw(struct musb *musb) |
1310 | { | 1310 | { |
1311 | u8 epnum = 0; | 1311 | u8 epnum = 0; |
1312 | struct musb_hw_ep *hw_ep; | 1312 | struct musb_hw_ep *hw_ep; |
@@ -1353,7 +1353,7 @@ enum { MUSB_CONTROLLER_MHDRC, MUSB_CONTROLLER_HDRC, }; | |||
1353 | /* Initialize MUSB (M)HDRC part of the USB hardware subsystem; | 1353 | /* Initialize MUSB (M)HDRC part of the USB hardware subsystem; |
1354 | * configure endpoints, or take their config from silicon | 1354 | * configure endpoints, or take their config from silicon |
1355 | */ | 1355 | */ |
1356 | static int __init musb_core_init(u16 musb_type, struct musb *musb) | 1356 | static int __devinit musb_core_init(u16 musb_type, struct musb *musb) |
1357 | { | 1357 | { |
1358 | u8 reg; | 1358 | u8 reg; |
1359 | char *type; | 1359 | char *type; |
@@ -1589,7 +1589,7 @@ irqreturn_t musb_interrupt(struct musb *musb) | |||
1589 | EXPORT_SYMBOL_GPL(musb_interrupt); | 1589 | EXPORT_SYMBOL_GPL(musb_interrupt); |
1590 | 1590 | ||
1591 | #ifndef CONFIG_MUSB_PIO_ONLY | 1591 | #ifndef CONFIG_MUSB_PIO_ONLY |
1592 | static bool __initdata use_dma = 1; | 1592 | static bool __devinitdata use_dma = 1; |
1593 | 1593 | ||
1594 | /* "modprobe ... use_dma=0" etc */ | 1594 | /* "modprobe ... use_dma=0" etc */ |
1595 | module_param(use_dma, bool, 0); | 1595 | module_param(use_dma, bool, 0); |
@@ -1777,7 +1777,7 @@ static void musb_irq_work(struct work_struct *data) | |||
1777 | * Init support | 1777 | * Init support |
1778 | */ | 1778 | */ |
1779 | 1779 | ||
1780 | static struct musb *__init | 1780 | static struct musb *__devinit |
1781 | allocate_instance(struct device *dev, | 1781 | allocate_instance(struct device *dev, |
1782 | struct musb_hdrc_config *config, void __iomem *mbase) | 1782 | struct musb_hdrc_config *config, void __iomem *mbase) |
1783 | { | 1783 | { |
@@ -1853,7 +1853,7 @@ static void musb_free(struct musb *musb) | |||
1853 | * @mregs: virtual address of controller registers, | 1853 | * @mregs: virtual address of controller registers, |
1854 | * not yet corrected for platform-specific offsets | 1854 | * not yet corrected for platform-specific offsets |
1855 | */ | 1855 | */ |
1856 | static int __init | 1856 | static int __devinit |
1857 | musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) | 1857 | musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) |
1858 | { | 1858 | { |
1859 | int status; | 1859 | int status; |
@@ -1961,11 +1961,11 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) | |||
1961 | if (is_host_enabled(musb)) { | 1961 | if (is_host_enabled(musb)) { |
1962 | struct usb_hcd *hcd = musb_to_hcd(musb); | 1962 | struct usb_hcd *hcd = musb_to_hcd(musb); |
1963 | 1963 | ||
1964 | otg_set_host(musb->xceiv, &hcd->self); | 1964 | otg_set_host(musb->xceiv->otg, &hcd->self); |
1965 | 1965 | ||
1966 | if (is_otg_enabled(musb)) | 1966 | if (is_otg_enabled(musb)) |
1967 | hcd->self.otg_port = 1; | 1967 | hcd->self.otg_port = 1; |
1968 | musb->xceiv->host = &hcd->self; | 1968 | musb->xceiv->otg->host = &hcd->self; |
1969 | hcd->power_budget = 2 * (plat->power ? : 250); | 1969 | hcd->power_budget = 2 * (plat->power ? : 250); |
1970 | 1970 | ||
1971 | /* program PHY to use external vBus if required */ | 1971 | /* program PHY to use external vBus if required */ |
@@ -1984,10 +1984,10 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) | |||
1984 | struct usb_hcd *hcd = musb_to_hcd(musb); | 1984 | struct usb_hcd *hcd = musb_to_hcd(musb); |
1985 | 1985 | ||
1986 | MUSB_HST_MODE(musb); | 1986 | MUSB_HST_MODE(musb); |
1987 | musb->xceiv->default_a = 1; | 1987 | musb->xceiv->otg->default_a = 1; |
1988 | musb->xceiv->state = OTG_STATE_A_IDLE; | 1988 | musb->xceiv->state = OTG_STATE_A_IDLE; |
1989 | 1989 | ||
1990 | status = usb_add_hcd(musb_to_hcd(musb), -1, 0); | 1990 | status = usb_add_hcd(musb_to_hcd(musb), 0, 0); |
1991 | 1991 | ||
1992 | hcd->self.uses_pio_for_control = 1; | 1992 | hcd->self.uses_pio_for_control = 1; |
1993 | dev_dbg(musb->controller, "%s mode, status %d, devctl %02x %c\n", | 1993 | dev_dbg(musb->controller, "%s mode, status %d, devctl %02x %c\n", |
@@ -1999,7 +1999,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) | |||
1999 | 1999 | ||
2000 | } else /* peripheral is enabled */ { | 2000 | } else /* peripheral is enabled */ { |
2001 | MUSB_DEV_MODE(musb); | 2001 | MUSB_DEV_MODE(musb); |
2002 | musb->xceiv->default_a = 0; | 2002 | musb->xceiv->otg->default_a = 0; |
2003 | musb->xceiv->state = OTG_STATE_B_IDLE; | 2003 | musb->xceiv->state = OTG_STATE_B_IDLE; |
2004 | 2004 | ||
2005 | status = musb_gadget_setup(musb); | 2005 | status = musb_gadget_setup(musb); |
@@ -2073,7 +2073,7 @@ fail0: | |||
2073 | static u64 *orig_dma_mask; | 2073 | static u64 *orig_dma_mask; |
2074 | #endif | 2074 | #endif |
2075 | 2075 | ||
2076 | static int __init musb_probe(struct platform_device *pdev) | 2076 | static int __devinit musb_probe(struct platform_device *pdev) |
2077 | { | 2077 | { |
2078 | struct device *dev = &pdev->dev; | 2078 | struct device *dev = &pdev->dev; |
2079 | int irq = platform_get_irq_byname(pdev, "mc"); | 2079 | int irq = platform_get_irq_byname(pdev, "mc"); |
@@ -2102,7 +2102,7 @@ static int __init musb_probe(struct platform_device *pdev) | |||
2102 | return status; | 2102 | return status; |
2103 | } | 2103 | } |
2104 | 2104 | ||
2105 | static int __exit musb_remove(struct platform_device *pdev) | 2105 | static int __devexit musb_remove(struct platform_device *pdev) |
2106 | { | 2106 | { |
2107 | struct musb *musb = dev_to_musb(&pdev->dev); | 2107 | struct musb *musb = dev_to_musb(&pdev->dev); |
2108 | void __iomem *ctrl_base = musb->ctrl_base; | 2108 | void __iomem *ctrl_base = musb->ctrl_base; |
@@ -2112,11 +2112,9 @@ static int __exit musb_remove(struct platform_device *pdev) | |||
2112 | * - Peripheral mode: peripheral is deactivated (or never-activated) | 2112 | * - Peripheral mode: peripheral is deactivated (or never-activated) |
2113 | * - OTG mode: both roles are deactivated (or never-activated) | 2113 | * - OTG mode: both roles are deactivated (or never-activated) |
2114 | */ | 2114 | */ |
2115 | pm_runtime_get_sync(musb->controller); | ||
2116 | musb_exit_debugfs(musb); | 2115 | musb_exit_debugfs(musb); |
2117 | musb_shutdown(pdev); | 2116 | musb_shutdown(pdev); |
2118 | 2117 | ||
2119 | pm_runtime_put(musb->controller); | ||
2120 | musb_free(musb); | 2118 | musb_free(musb); |
2121 | iounmap(ctrl_base); | 2119 | iounmap(ctrl_base); |
2122 | device_init_wakeup(&pdev->dev, 0); | 2120 | device_init_wakeup(&pdev->dev, 0); |
@@ -2364,7 +2362,8 @@ static struct platform_driver musb_driver = { | |||
2364 | .owner = THIS_MODULE, | 2362 | .owner = THIS_MODULE, |
2365 | .pm = MUSB_DEV_PM_OPS, | 2363 | .pm = MUSB_DEV_PM_OPS, |
2366 | }, | 2364 | }, |
2367 | .remove = __exit_p(musb_remove), | 2365 | .probe = musb_probe, |
2366 | .remove = __devexit_p(musb_remove), | ||
2368 | .shutdown = musb_shutdown, | 2367 | .shutdown = musb_shutdown, |
2369 | }; | 2368 | }; |
2370 | 2369 | ||
@@ -2380,13 +2379,9 @@ static int __init musb_init(void) | |||
2380 | ", " | 2379 | ", " |
2381 | "otg (peripheral+host)", | 2380 | "otg (peripheral+host)", |
2382 | musb_driver_name); | 2381 | musb_driver_name); |
2383 | return platform_driver_probe(&musb_driver, musb_probe); | 2382 | return platform_driver_register(&musb_driver); |
2384 | } | 2383 | } |
2385 | 2384 | module_init(musb_init); | |
2386 | /* make us init after usbcore and i2c (transceivers, regulators, etc) | ||
2387 | * and before usb gadget and host-side drivers start to register | ||
2388 | */ | ||
2389 | fs_initcall(musb_init); | ||
2390 | 2385 | ||
2391 | static void __exit musb_cleanup(void) | 2386 | static void __exit musb_cleanup(void) |
2392 | { | 2387 | { |
diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h index 3d28fb8a2dc9..93de517a32a0 100644 --- a/drivers/usb/musb/musb_core.h +++ b/drivers/usb/musb/musb_core.h | |||
@@ -372,7 +372,7 @@ struct musb { | |||
372 | u16 int_rx; | 372 | u16 int_rx; |
373 | u16 int_tx; | 373 | u16 int_tx; |
374 | 374 | ||
375 | struct otg_transceiver *xceiv; | 375 | struct usb_phy *xceiv; |
376 | u8 xceiv_event; | 376 | u8 xceiv_event; |
377 | 377 | ||
378 | int nIrq; | 378 | int nIrq; |
diff --git a/drivers/usb/musb/musb_debugfs.c b/drivers/usb/musb/musb_debugfs.c index 13d9af9bf920..40a37c91cc10 100644 --- a/drivers/usb/musb/musb_debugfs.c +++ b/drivers/usb/musb/musb_debugfs.c | |||
@@ -235,29 +235,29 @@ static const struct file_operations musb_test_mode_fops = { | |||
235 | .release = single_release, | 235 | .release = single_release, |
236 | }; | 236 | }; |
237 | 237 | ||
238 | int __init musb_init_debugfs(struct musb *musb) | 238 | int __devinit musb_init_debugfs(struct musb *musb) |
239 | { | 239 | { |
240 | struct dentry *root; | 240 | struct dentry *root; |
241 | struct dentry *file; | 241 | struct dentry *file; |
242 | int ret; | 242 | int ret; |
243 | 243 | ||
244 | root = debugfs_create_dir("musb", NULL); | 244 | root = debugfs_create_dir("musb", NULL); |
245 | if (IS_ERR(root)) { | 245 | if (!root) { |
246 | ret = PTR_ERR(root); | 246 | ret = -ENOMEM; |
247 | goto err0; | 247 | goto err0; |
248 | } | 248 | } |
249 | 249 | ||
250 | file = debugfs_create_file("regdump", S_IRUGO, root, musb, | 250 | file = debugfs_create_file("regdump", S_IRUGO, root, musb, |
251 | &musb_regdump_fops); | 251 | &musb_regdump_fops); |
252 | if (IS_ERR(file)) { | 252 | if (!file) { |
253 | ret = PTR_ERR(file); | 253 | ret = -ENOMEM; |
254 | goto err1; | 254 | goto err1; |
255 | } | 255 | } |
256 | 256 | ||
257 | file = debugfs_create_file("testmode", S_IRUGO | S_IWUSR, | 257 | file = debugfs_create_file("testmode", S_IRUGO | S_IWUSR, |
258 | root, musb, &musb_test_mode_fops); | 258 | root, musb, &musb_test_mode_fops); |
259 | if (IS_ERR(file)) { | 259 | if (!file) { |
260 | ret = PTR_ERR(file); | 260 | ret = -ENOMEM; |
261 | goto err1; | 261 | goto err1; |
262 | } | 262 | } |
263 | 263 | ||
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index ac3d2eec20fe..f42c29b11f71 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c | |||
@@ -574,6 +574,15 @@ void musb_g_tx(struct musb *musb, u8 epnum) | |||
574 | 574 | ||
575 | if (request->actual == request->length) { | 575 | if (request->actual == request->length) { |
576 | musb_g_giveback(musb_ep, request, 0); | 576 | musb_g_giveback(musb_ep, request, 0); |
577 | /* | ||
578 | * In the giveback function the MUSB lock is | ||
579 | * released and acquired after sometime. During | ||
580 | * this time period the INDEX register could get | ||
581 | * changed by the gadget_queue function especially | ||
582 | * on SMP systems. Reselect the INDEX to be sure | ||
583 | * we are reading/modifying the right registers | ||
584 | */ | ||
585 | musb_ep_select(mbase, epnum); | ||
577 | req = musb_ep->desc ? next_request(musb_ep) : NULL; | 586 | req = musb_ep->desc ? next_request(musb_ep) : NULL; |
578 | if (!req) { | 587 | if (!req) { |
579 | dev_dbg(musb->controller, "%s idle now\n", | 588 | dev_dbg(musb->controller, "%s idle now\n", |
@@ -983,6 +992,15 @@ void musb_g_rx(struct musb *musb, u8 epnum) | |||
983 | } | 992 | } |
984 | #endif | 993 | #endif |
985 | musb_g_giveback(musb_ep, request, 0); | 994 | musb_g_giveback(musb_ep, request, 0); |
995 | /* | ||
996 | * In the giveback function the MUSB lock is | ||
997 | * released and acquired after sometime. During | ||
998 | * this time period the INDEX register could get | ||
999 | * changed by the gadget_queue function especially | ||
1000 | * on SMP systems. Reselect the INDEX to be sure | ||
1001 | * we are reading/modifying the right registers | ||
1002 | */ | ||
1003 | musb_ep_select(mbase, epnum); | ||
986 | 1004 | ||
987 | req = next_request(musb_ep); | 1005 | req = next_request(musb_ep); |
988 | if (!req) | 1006 | if (!req) |
@@ -1624,7 +1642,7 @@ static int musb_gadget_wakeup(struct usb_gadget *gadget) | |||
1624 | } | 1642 | } |
1625 | 1643 | ||
1626 | spin_unlock_irqrestore(&musb->lock, flags); | 1644 | spin_unlock_irqrestore(&musb->lock, flags); |
1627 | otg_start_srp(musb->xceiv); | 1645 | otg_start_srp(musb->xceiv->otg); |
1628 | spin_lock_irqsave(&musb->lock, flags); | 1646 | spin_lock_irqsave(&musb->lock, flags); |
1629 | 1647 | ||
1630 | /* Block idling for at least 1s */ | 1648 | /* Block idling for at least 1s */ |
@@ -1703,7 +1721,7 @@ static int musb_gadget_vbus_draw(struct usb_gadget *gadget, unsigned mA) | |||
1703 | 1721 | ||
1704 | if (!musb->xceiv->set_power) | 1722 | if (!musb->xceiv->set_power) |
1705 | return -EOPNOTSUPP; | 1723 | return -EOPNOTSUPP; |
1706 | return otg_set_power(musb->xceiv, mA); | 1724 | return usb_phy_set_power(musb->xceiv, mA); |
1707 | } | 1725 | } |
1708 | 1726 | ||
1709 | static int musb_gadget_pullup(struct usb_gadget *gadget, int is_on) | 1727 | static int musb_gadget_pullup(struct usb_gadget *gadget, int is_on) |
@@ -1762,7 +1780,7 @@ static void musb_gadget_release(struct device *dev) | |||
1762 | } | 1780 | } |
1763 | 1781 | ||
1764 | 1782 | ||
1765 | static void __init | 1783 | static void __devinit |
1766 | init_peripheral_ep(struct musb *musb, struct musb_ep *ep, u8 epnum, int is_in) | 1784 | init_peripheral_ep(struct musb *musb, struct musb_ep *ep, u8 epnum, int is_in) |
1767 | { | 1785 | { |
1768 | struct musb_hw_ep *hw_ep = musb->endpoints + epnum; | 1786 | struct musb_hw_ep *hw_ep = musb->endpoints + epnum; |
@@ -1799,7 +1817,7 @@ init_peripheral_ep(struct musb *musb, struct musb_ep *ep, u8 epnum, int is_in) | |||
1799 | * Initialize the endpoints exposed to peripheral drivers, with backlinks | 1817 | * Initialize the endpoints exposed to peripheral drivers, with backlinks |
1800 | * to the rest of the driver state. | 1818 | * to the rest of the driver state. |
1801 | */ | 1819 | */ |
1802 | static inline void __init musb_g_init_endpoints(struct musb *musb) | 1820 | static inline void __devinit musb_g_init_endpoints(struct musb *musb) |
1803 | { | 1821 | { |
1804 | u8 epnum; | 1822 | u8 epnum; |
1805 | struct musb_hw_ep *hw_ep; | 1823 | struct musb_hw_ep *hw_ep; |
@@ -1832,7 +1850,7 @@ static inline void __init musb_g_init_endpoints(struct musb *musb) | |||
1832 | /* called once during driver setup to initialize and link into | 1850 | /* called once during driver setup to initialize and link into |
1833 | * the driver model; memory is zeroed. | 1851 | * the driver model; memory is zeroed. |
1834 | */ | 1852 | */ |
1835 | int __init musb_gadget_setup(struct musb *musb) | 1853 | int __devinit musb_gadget_setup(struct musb *musb) |
1836 | { | 1854 | { |
1837 | int status; | 1855 | int status; |
1838 | 1856 | ||
@@ -1898,6 +1916,7 @@ static int musb_gadget_start(struct usb_gadget *g, | |||
1898 | struct usb_gadget_driver *driver) | 1916 | struct usb_gadget_driver *driver) |
1899 | { | 1917 | { |
1900 | struct musb *musb = gadget_to_musb(g); | 1918 | struct musb *musb = gadget_to_musb(g); |
1919 | struct usb_otg *otg = musb->xceiv->otg; | ||
1901 | unsigned long flags; | 1920 | unsigned long flags; |
1902 | int retval = -EINVAL; | 1921 | int retval = -EINVAL; |
1903 | 1922 | ||
@@ -1914,7 +1933,7 @@ static int musb_gadget_start(struct usb_gadget *g, | |||
1914 | spin_lock_irqsave(&musb->lock, flags); | 1933 | spin_lock_irqsave(&musb->lock, flags); |
1915 | musb->is_active = 1; | 1934 | musb->is_active = 1; |
1916 | 1935 | ||
1917 | otg_set_peripheral(musb->xceiv, &musb->g); | 1936 | otg_set_peripheral(otg, &musb->g); |
1918 | musb->xceiv->state = OTG_STATE_B_IDLE; | 1937 | musb->xceiv->state = OTG_STATE_B_IDLE; |
1919 | 1938 | ||
1920 | /* | 1939 | /* |
@@ -1938,15 +1957,15 @@ static int musb_gadget_start(struct usb_gadget *g, | |||
1938 | * handles power budgeting ... this way also | 1957 | * handles power budgeting ... this way also |
1939 | * ensures HdrcStart is indirectly called. | 1958 | * ensures HdrcStart is indirectly called. |
1940 | */ | 1959 | */ |
1941 | retval = usb_add_hcd(musb_to_hcd(musb), -1, 0); | 1960 | retval = usb_add_hcd(musb_to_hcd(musb), 0, 0); |
1942 | if (retval < 0) { | 1961 | if (retval < 0) { |
1943 | dev_dbg(musb->controller, "add_hcd failed, %d\n", retval); | 1962 | dev_dbg(musb->controller, "add_hcd failed, %d\n", retval); |
1944 | goto err2; | 1963 | goto err2; |
1945 | } | 1964 | } |
1946 | 1965 | ||
1947 | if ((musb->xceiv->last_event == USB_EVENT_ID) | 1966 | if ((musb->xceiv->last_event == USB_EVENT_ID) |
1948 | && musb->xceiv->set_vbus) | 1967 | && otg->set_vbus) |
1949 | otg_set_vbus(musb->xceiv, 1); | 1968 | otg_set_vbus(otg, 1); |
1950 | 1969 | ||
1951 | hcd->self.uses_pio_for_control = 1; | 1970 | hcd->self.uses_pio_for_control = 1; |
1952 | } | 1971 | } |
@@ -2028,7 +2047,7 @@ static int musb_gadget_stop(struct usb_gadget *g, | |||
2028 | 2047 | ||
2029 | musb->xceiv->state = OTG_STATE_UNDEFINED; | 2048 | musb->xceiv->state = OTG_STATE_UNDEFINED; |
2030 | stop_activity(musb, driver); | 2049 | stop_activity(musb, driver); |
2031 | otg_set_peripheral(musb->xceiv, NULL); | 2050 | otg_set_peripheral(musb->xceiv->otg, NULL); |
2032 | 2051 | ||
2033 | dev_dbg(musb->controller, "unregistering driver %s\n", driver->function); | 2052 | dev_dbg(musb->controller, "unregistering driver %s\n", driver->function); |
2034 | 2053 | ||
diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c index e9f80adc45a4..22ec3e379980 100644 --- a/drivers/usb/musb/musb_virthub.c +++ b/drivers/usb/musb/musb_virthub.c | |||
@@ -47,6 +47,7 @@ | |||
47 | 47 | ||
48 | static void musb_port_suspend(struct musb *musb, bool do_suspend) | 48 | static void musb_port_suspend(struct musb *musb, bool do_suspend) |
49 | { | 49 | { |
50 | struct usb_otg *otg = musb->xceiv->otg; | ||
50 | u8 power; | 51 | u8 power; |
51 | void __iomem *mbase = musb->mregs; | 52 | void __iomem *mbase = musb->mregs; |
52 | 53 | ||
@@ -81,7 +82,7 @@ static void musb_port_suspend(struct musb *musb, bool do_suspend) | |||
81 | case OTG_STATE_A_HOST: | 82 | case OTG_STATE_A_HOST: |
82 | musb->xceiv->state = OTG_STATE_A_SUSPEND; | 83 | musb->xceiv->state = OTG_STATE_A_SUSPEND; |
83 | musb->is_active = is_otg_enabled(musb) | 84 | musb->is_active = is_otg_enabled(musb) |
84 | && musb->xceiv->host->b_hnp_enable; | 85 | && otg->host->b_hnp_enable; |
85 | if (musb->is_active) | 86 | if (musb->is_active) |
86 | mod_timer(&musb->otg_timer, jiffies | 87 | mod_timer(&musb->otg_timer, jiffies |
87 | + msecs_to_jiffies( | 88 | + msecs_to_jiffies( |
@@ -91,7 +92,7 @@ static void musb_port_suspend(struct musb *musb, bool do_suspend) | |||
91 | case OTG_STATE_B_HOST: | 92 | case OTG_STATE_B_HOST: |
92 | musb->xceiv->state = OTG_STATE_B_WAIT_ACON; | 93 | musb->xceiv->state = OTG_STATE_B_WAIT_ACON; |
93 | musb->is_active = is_otg_enabled(musb) | 94 | musb->is_active = is_otg_enabled(musb) |
94 | && musb->xceiv->host->b_hnp_enable; | 95 | && otg->host->b_hnp_enable; |
95 | musb_platform_try_idle(musb, 0); | 96 | musb_platform_try_idle(musb, 0); |
96 | break; | 97 | break; |
97 | default: | 98 | default: |
@@ -179,6 +180,8 @@ static void musb_port_reset(struct musb *musb, bool do_reset) | |||
179 | 180 | ||
180 | void musb_root_disconnect(struct musb *musb) | 181 | void musb_root_disconnect(struct musb *musb) |
181 | { | 182 | { |
183 | struct usb_otg *otg = musb->xceiv->otg; | ||
184 | |||
182 | musb->port1_status = USB_PORT_STAT_POWER | 185 | musb->port1_status = USB_PORT_STAT_POWER |
183 | | (USB_PORT_STAT_C_CONNECTION << 16); | 186 | | (USB_PORT_STAT_C_CONNECTION << 16); |
184 | 187 | ||
@@ -188,7 +191,7 @@ void musb_root_disconnect(struct musb *musb) | |||
188 | switch (musb->xceiv->state) { | 191 | switch (musb->xceiv->state) { |
189 | case OTG_STATE_A_SUSPEND: | 192 | case OTG_STATE_A_SUSPEND: |
190 | if (is_otg_enabled(musb) | 193 | if (is_otg_enabled(musb) |
191 | && musb->xceiv->host->b_hnp_enable) { | 194 | && otg->host->b_hnp_enable) { |
192 | musb->xceiv->state = OTG_STATE_A_PERIPHERAL; | 195 | musb->xceiv->state = OTG_STATE_A_PERIPHERAL; |
193 | musb->g.is_a_peripheral = 1; | 196 | musb->g.is_a_peripheral = 1; |
194 | break; | 197 | break; |
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c index df719eae3b03..2ae0bb309994 100644 --- a/drivers/usb/musb/omap2430.c +++ b/drivers/usb/musb/omap2430.c | |||
@@ -132,6 +132,7 @@ static void omap2430_musb_try_idle(struct musb *musb, unsigned long timeout) | |||
132 | 132 | ||
133 | static void omap2430_musb_set_vbus(struct musb *musb, int is_on) | 133 | static void omap2430_musb_set_vbus(struct musb *musb, int is_on) |
134 | { | 134 | { |
135 | struct usb_otg *otg = musb->xceiv->otg; | ||
135 | u8 devctl; | 136 | u8 devctl; |
136 | unsigned long timeout = jiffies + msecs_to_jiffies(1000); | 137 | unsigned long timeout = jiffies + msecs_to_jiffies(1000); |
137 | int ret = 1; | 138 | int ret = 1; |
@@ -163,11 +164,11 @@ static void omap2430_musb_set_vbus(struct musb *musb, int is_on) | |||
163 | } | 164 | } |
164 | } | 165 | } |
165 | 166 | ||
166 | if (ret && musb->xceiv->set_vbus) | 167 | if (ret && otg->set_vbus) |
167 | otg_set_vbus(musb->xceiv, 1); | 168 | otg_set_vbus(otg, 1); |
168 | } else { | 169 | } else { |
169 | musb->is_active = 1; | 170 | musb->is_active = 1; |
170 | musb->xceiv->default_a = 1; | 171 | otg->default_a = 1; |
171 | musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; | 172 | musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; |
172 | devctl |= MUSB_DEVCTL_SESSION; | 173 | devctl |= MUSB_DEVCTL_SESSION; |
173 | MUSB_HST_MODE(musb); | 174 | MUSB_HST_MODE(musb); |
@@ -179,7 +180,7 @@ static void omap2430_musb_set_vbus(struct musb *musb, int is_on) | |||
179 | * jumping right to B_IDLE... | 180 | * jumping right to B_IDLE... |
180 | */ | 181 | */ |
181 | 182 | ||
182 | musb->xceiv->default_a = 0; | 183 | otg->default_a = 0; |
183 | musb->xceiv->state = OTG_STATE_B_IDLE; | 184 | musb->xceiv->state = OTG_STATE_B_IDLE; |
184 | devctl &= ~MUSB_DEVCTL_SESSION; | 185 | devctl &= ~MUSB_DEVCTL_SESSION; |
185 | 186 | ||
@@ -246,7 +247,7 @@ static void musb_otg_notifier_work(struct work_struct *data_notifier_work) | |||
246 | 247 | ||
247 | if (!is_otg_enabled(musb) || musb->gadget_driver) { | 248 | if (!is_otg_enabled(musb) || musb->gadget_driver) { |
248 | pm_runtime_get_sync(musb->controller); | 249 | pm_runtime_get_sync(musb->controller); |
249 | otg_init(musb->xceiv); | 250 | usb_phy_init(musb->xceiv); |
250 | omap2430_musb_set_vbus(musb, 1); | 251 | omap2430_musb_set_vbus(musb, 1); |
251 | } | 252 | } |
252 | break; | 253 | break; |
@@ -256,7 +257,7 @@ static void musb_otg_notifier_work(struct work_struct *data_notifier_work) | |||
256 | 257 | ||
257 | if (musb->gadget_driver) | 258 | if (musb->gadget_driver) |
258 | pm_runtime_get_sync(musb->controller); | 259 | pm_runtime_get_sync(musb->controller); |
259 | otg_init(musb->xceiv); | 260 | usb_phy_init(musb->xceiv); |
260 | break; | 261 | break; |
261 | 262 | ||
262 | case USB_EVENT_NONE: | 263 | case USB_EVENT_NONE: |
@@ -269,10 +270,10 @@ static void musb_otg_notifier_work(struct work_struct *data_notifier_work) | |||
269 | } | 270 | } |
270 | 271 | ||
271 | if (data->interface_type == MUSB_INTERFACE_UTMI) { | 272 | if (data->interface_type == MUSB_INTERFACE_UTMI) { |
272 | if (musb->xceiv->set_vbus) | 273 | if (musb->xceiv->otg->set_vbus) |
273 | otg_set_vbus(musb->xceiv, 0); | 274 | otg_set_vbus(musb->xceiv->otg, 0); |
274 | } | 275 | } |
275 | otg_shutdown(musb->xceiv); | 276 | usb_phy_shutdown(musb->xceiv); |
276 | break; | 277 | break; |
277 | default: | 278 | default: |
278 | dev_dbg(musb->controller, "ID float\n"); | 279 | dev_dbg(musb->controller, "ID float\n"); |
@@ -290,7 +291,7 @@ static int omap2430_musb_init(struct musb *musb) | |||
290 | * up through ULPI. TWL4030-family PMICs include one, | 291 | * up through ULPI. TWL4030-family PMICs include one, |
291 | * which needs a driver, drivers aren't always needed. | 292 | * which needs a driver, drivers aren't always needed. |
292 | */ | 293 | */ |
293 | musb->xceiv = otg_get_transceiver(); | 294 | musb->xceiv = usb_get_transceiver(); |
294 | if (!musb->xceiv) { | 295 | if (!musb->xceiv) { |
295 | pr_err("HS USB OTG: no transceiver configured\n"); | 296 | pr_err("HS USB OTG: no transceiver configured\n"); |
296 | return -ENODEV; | 297 | return -ENODEV; |
@@ -325,7 +326,7 @@ static int omap2430_musb_init(struct musb *musb) | |||
325 | musb_readl(musb->mregs, OTG_SIMENABLE)); | 326 | musb_readl(musb->mregs, OTG_SIMENABLE)); |
326 | 327 | ||
327 | musb->nb.notifier_call = musb_otg_notifications; | 328 | musb->nb.notifier_call = musb_otg_notifications; |
328 | status = otg_register_notifier(musb->xceiv, &musb->nb); | 329 | status = usb_register_notifier(musb->xceiv, &musb->nb); |
329 | 330 | ||
330 | if (status) | 331 | if (status) |
331 | dev_dbg(musb->controller, "notification register failed\n"); | 332 | dev_dbg(musb->controller, "notification register failed\n"); |
@@ -349,7 +350,7 @@ static void omap2430_musb_enable(struct musb *musb) | |||
349 | switch (musb->xceiv->last_event) { | 350 | switch (musb->xceiv->last_event) { |
350 | 351 | ||
351 | case USB_EVENT_ID: | 352 | case USB_EVENT_ID: |
352 | otg_init(musb->xceiv); | 353 | usb_phy_init(musb->xceiv); |
353 | if (data->interface_type != MUSB_INTERFACE_UTMI) | 354 | if (data->interface_type != MUSB_INTERFACE_UTMI) |
354 | break; | 355 | break; |
355 | devctl = musb_readb(musb->mregs, MUSB_DEVCTL); | 356 | devctl = musb_readb(musb->mregs, MUSB_DEVCTL); |
@@ -368,7 +369,7 @@ static void omap2430_musb_enable(struct musb *musb) | |||
368 | break; | 369 | break; |
369 | 370 | ||
370 | case USB_EVENT_VBUS: | 371 | case USB_EVENT_VBUS: |
371 | otg_init(musb->xceiv); | 372 | usb_phy_init(musb->xceiv); |
372 | break; | 373 | break; |
373 | 374 | ||
374 | default: | 375 | default: |
@@ -379,7 +380,7 @@ static void omap2430_musb_enable(struct musb *musb) | |||
379 | static void omap2430_musb_disable(struct musb *musb) | 380 | static void omap2430_musb_disable(struct musb *musb) |
380 | { | 381 | { |
381 | if (musb->xceiv->last_event) | 382 | if (musb->xceiv->last_event) |
382 | otg_shutdown(musb->xceiv); | 383 | usb_phy_shutdown(musb->xceiv); |
383 | } | 384 | } |
384 | 385 | ||
385 | static int omap2430_musb_exit(struct musb *musb) | 386 | static int omap2430_musb_exit(struct musb *musb) |
@@ -388,7 +389,7 @@ static int omap2430_musb_exit(struct musb *musb) | |||
388 | cancel_work_sync(&musb->otg_notifier_work); | 389 | cancel_work_sync(&musb->otg_notifier_work); |
389 | 390 | ||
390 | omap2430_low_level_exit(musb); | 391 | omap2430_low_level_exit(musb); |
391 | otg_put_transceiver(musb->xceiv); | 392 | usb_put_transceiver(musb->xceiv); |
392 | 393 | ||
393 | return 0; | 394 | return 0; |
394 | } | 395 | } |
@@ -408,7 +409,7 @@ static const struct musb_platform_ops omap2430_ops = { | |||
408 | 409 | ||
409 | static u64 omap2430_dmamask = DMA_BIT_MASK(32); | 410 | static u64 omap2430_dmamask = DMA_BIT_MASK(32); |
410 | 411 | ||
411 | static int __init omap2430_probe(struct platform_device *pdev) | 412 | static int __devinit omap2430_probe(struct platform_device *pdev) |
412 | { | 413 | { |
413 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; | 414 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; |
414 | struct platform_device *musb; | 415 | struct platform_device *musb; |
@@ -471,7 +472,7 @@ err0: | |||
471 | return ret; | 472 | return ret; |
472 | } | 473 | } |
473 | 474 | ||
474 | static int __exit omap2430_remove(struct platform_device *pdev) | 475 | static int __devexit omap2430_remove(struct platform_device *pdev) |
475 | { | 476 | { |
476 | struct omap2430_glue *glue = platform_get_drvdata(pdev); | 477 | struct omap2430_glue *glue = platform_get_drvdata(pdev); |
477 | 478 | ||
@@ -494,7 +495,7 @@ static int omap2430_runtime_suspend(struct device *dev) | |||
494 | OTG_INTERFSEL); | 495 | OTG_INTERFSEL); |
495 | 496 | ||
496 | omap2430_low_level_exit(musb); | 497 | omap2430_low_level_exit(musb); |
497 | otg_set_suspend(musb->xceiv, 1); | 498 | usb_phy_set_suspend(musb->xceiv, 1); |
498 | 499 | ||
499 | return 0; | 500 | return 0; |
500 | } | 501 | } |
@@ -508,7 +509,7 @@ static int omap2430_runtime_resume(struct device *dev) | |||
508 | musb_writel(musb->mregs, OTG_INTERFSEL, | 509 | musb_writel(musb->mregs, OTG_INTERFSEL, |
509 | musb->context.otg_interfsel); | 510 | musb->context.otg_interfsel); |
510 | 511 | ||
511 | otg_set_suspend(musb->xceiv, 0); | 512 | usb_phy_set_suspend(musb->xceiv, 0); |
512 | 513 | ||
513 | return 0; | 514 | return 0; |
514 | } | 515 | } |
@@ -524,7 +525,8 @@ static struct dev_pm_ops omap2430_pm_ops = { | |||
524 | #endif | 525 | #endif |
525 | 526 | ||
526 | static struct platform_driver omap2430_driver = { | 527 | static struct platform_driver omap2430_driver = { |
527 | .remove = __exit_p(omap2430_remove), | 528 | .probe = omap2430_probe, |
529 | .remove = __devexit_p(omap2430_remove), | ||
528 | .driver = { | 530 | .driver = { |
529 | .name = "musb-omap2430", | 531 | .name = "musb-omap2430", |
530 | .pm = DEV_PM_OPS, | 532 | .pm = DEV_PM_OPS, |
@@ -537,9 +539,9 @@ MODULE_LICENSE("GPL v2"); | |||
537 | 539 | ||
538 | static int __init omap2430_init(void) | 540 | static int __init omap2430_init(void) |
539 | { | 541 | { |
540 | return platform_driver_probe(&omap2430_driver, omap2430_probe); | 542 | return platform_driver_register(&omap2430_driver); |
541 | } | 543 | } |
542 | subsys_initcall(omap2430_init); | 544 | module_init(omap2430_init); |
543 | 545 | ||
544 | static void __exit omap2430_exit(void) | 546 | static void __exit omap2430_exit(void) |
545 | { | 547 | { |
diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c index 1f405616e6cd..de1355946a83 100644 --- a/drivers/usb/musb/tusb6010.c +++ b/drivers/usb/musb/tusb6010.c | |||
@@ -277,7 +277,7 @@ static struct musb *the_musb; | |||
277 | * mode), or low power Default-B sessions, something else supplies power. | 277 | * mode), or low power Default-B sessions, something else supplies power. |
278 | * Caller must take care of locking. | 278 | * Caller must take care of locking. |
279 | */ | 279 | */ |
280 | static int tusb_draw_power(struct otg_transceiver *x, unsigned mA) | 280 | static int tusb_draw_power(struct usb_phy *x, unsigned mA) |
281 | { | 281 | { |
282 | struct musb *musb = the_musb; | 282 | struct musb *musb = the_musb; |
283 | void __iomem *tbase = musb->ctrl_base; | 283 | void __iomem *tbase = musb->ctrl_base; |
@@ -293,7 +293,7 @@ static int tusb_draw_power(struct otg_transceiver *x, unsigned mA) | |||
293 | * The actual current usage would be very board-specific. For now, | 293 | * The actual current usage would be very board-specific. For now, |
294 | * it's simpler to just use an aggregate (also board-specific). | 294 | * it's simpler to just use an aggregate (also board-specific). |
295 | */ | 295 | */ |
296 | if (x->default_a || mA < (musb->min_power << 1)) | 296 | if (x->otg->default_a || mA < (musb->min_power << 1)) |
297 | mA = 0; | 297 | mA = 0; |
298 | 298 | ||
299 | reg = musb_readl(tbase, TUSB_PRCM_MNGMT); | 299 | reg = musb_readl(tbase, TUSB_PRCM_MNGMT); |
@@ -510,6 +510,7 @@ static void tusb_musb_set_vbus(struct musb *musb, int is_on) | |||
510 | void __iomem *tbase = musb->ctrl_base; | 510 | void __iomem *tbase = musb->ctrl_base; |
511 | u32 conf, prcm, timer; | 511 | u32 conf, prcm, timer; |
512 | u8 devctl; | 512 | u8 devctl; |
513 | struct usb_otg *otg = musb->xceiv->otg; | ||
513 | 514 | ||
514 | /* HDRC controls CPEN, but beware current surges during device | 515 | /* HDRC controls CPEN, but beware current surges during device |
515 | * connect. They can trigger transient overcurrent conditions | 516 | * connect. They can trigger transient overcurrent conditions |
@@ -522,7 +523,7 @@ static void tusb_musb_set_vbus(struct musb *musb, int is_on) | |||
522 | 523 | ||
523 | if (is_on) { | 524 | if (is_on) { |
524 | timer = OTG_TIMER_MS(OTG_TIME_A_WAIT_VRISE); | 525 | timer = OTG_TIMER_MS(OTG_TIME_A_WAIT_VRISE); |
525 | musb->xceiv->default_a = 1; | 526 | otg->default_a = 1; |
526 | musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; | 527 | musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; |
527 | devctl |= MUSB_DEVCTL_SESSION; | 528 | devctl |= MUSB_DEVCTL_SESSION; |
528 | 529 | ||
@@ -548,11 +549,11 @@ static void tusb_musb_set_vbus(struct musb *musb, int is_on) | |||
548 | musb->xceiv->state = OTG_STATE_A_IDLE; | 549 | musb->xceiv->state = OTG_STATE_A_IDLE; |
549 | } | 550 | } |
550 | musb->is_active = 0; | 551 | musb->is_active = 0; |
551 | musb->xceiv->default_a = 1; | 552 | otg->default_a = 1; |
552 | MUSB_HST_MODE(musb); | 553 | MUSB_HST_MODE(musb); |
553 | } else { | 554 | } else { |
554 | musb->is_active = 0; | 555 | musb->is_active = 0; |
555 | musb->xceiv->default_a = 0; | 556 | otg->default_a = 0; |
556 | musb->xceiv->state = OTG_STATE_B_IDLE; | 557 | musb->xceiv->state = OTG_STATE_B_IDLE; |
557 | MUSB_DEV_MODE(musb); | 558 | MUSB_DEV_MODE(musb); |
558 | } | 559 | } |
@@ -644,6 +645,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase) | |||
644 | { | 645 | { |
645 | u32 otg_stat = musb_readl(tbase, TUSB_DEV_OTG_STAT); | 646 | u32 otg_stat = musb_readl(tbase, TUSB_DEV_OTG_STAT); |
646 | unsigned long idle_timeout = 0; | 647 | unsigned long idle_timeout = 0; |
648 | struct usb_otg *otg = musb->xceiv->otg; | ||
647 | 649 | ||
648 | /* ID pin */ | 650 | /* ID pin */ |
649 | if ((int_src & TUSB_INT_SRC_ID_STATUS_CHNG)) { | 651 | if ((int_src & TUSB_INT_SRC_ID_STATUS_CHNG)) { |
@@ -654,7 +656,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase) | |||
654 | else | 656 | else |
655 | default_a = is_host_enabled(musb); | 657 | default_a = is_host_enabled(musb); |
656 | dev_dbg(musb->controller, "Default-%c\n", default_a ? 'A' : 'B'); | 658 | dev_dbg(musb->controller, "Default-%c\n", default_a ? 'A' : 'B'); |
657 | musb->xceiv->default_a = default_a; | 659 | otg->default_a = default_a; |
658 | tusb_musb_set_vbus(musb, default_a); | 660 | tusb_musb_set_vbus(musb, default_a); |
659 | 661 | ||
660 | /* Don't allow idling immediately */ | 662 | /* Don't allow idling immediately */ |
@@ -666,7 +668,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase) | |||
666 | if (int_src & TUSB_INT_SRC_VBUS_SENSE_CHNG) { | 668 | if (int_src & TUSB_INT_SRC_VBUS_SENSE_CHNG) { |
667 | 669 | ||
668 | /* B-dev state machine: no vbus ~= disconnect */ | 670 | /* B-dev state machine: no vbus ~= disconnect */ |
669 | if ((is_otg_enabled(musb) && !musb->xceiv->default_a) | 671 | if ((is_otg_enabled(musb) && !otg->default_a) |
670 | || !is_host_enabled(musb)) { | 672 | || !is_host_enabled(musb)) { |
671 | /* ? musb_root_disconnect(musb); */ | 673 | /* ? musb_root_disconnect(musb); */ |
672 | musb->port1_status &= | 674 | musb->port1_status &= |
@@ -1076,7 +1078,7 @@ static int tusb_musb_init(struct musb *musb) | |||
1076 | int ret; | 1078 | int ret; |
1077 | 1079 | ||
1078 | usb_nop_xceiv_register(); | 1080 | usb_nop_xceiv_register(); |
1079 | musb->xceiv = otg_get_transceiver(); | 1081 | musb->xceiv = usb_get_transceiver(); |
1080 | if (!musb->xceiv) | 1082 | if (!musb->xceiv) |
1081 | return -ENODEV; | 1083 | return -ENODEV; |
1082 | 1084 | ||
@@ -1128,7 +1130,7 @@ done: | |||
1128 | if (sync) | 1130 | if (sync) |
1129 | iounmap(sync); | 1131 | iounmap(sync); |
1130 | 1132 | ||
1131 | otg_put_transceiver(musb->xceiv); | 1133 | usb_put_transceiver(musb->xceiv); |
1132 | usb_nop_xceiv_unregister(); | 1134 | usb_nop_xceiv_unregister(); |
1133 | } | 1135 | } |
1134 | return ret; | 1136 | return ret; |
@@ -1144,7 +1146,7 @@ static int tusb_musb_exit(struct musb *musb) | |||
1144 | 1146 | ||
1145 | iounmap(musb->sync_va); | 1147 | iounmap(musb->sync_va); |
1146 | 1148 | ||
1147 | otg_put_transceiver(musb->xceiv); | 1149 | usb_put_transceiver(musb->xceiv); |
1148 | usb_nop_xceiv_unregister(); | 1150 | usb_nop_xceiv_unregister(); |
1149 | return 0; | 1151 | return 0; |
1150 | } | 1152 | } |
@@ -1165,7 +1167,7 @@ static const struct musb_platform_ops tusb_ops = { | |||
1165 | 1167 | ||
1166 | static u64 tusb_dmamask = DMA_BIT_MASK(32); | 1168 | static u64 tusb_dmamask = DMA_BIT_MASK(32); |
1167 | 1169 | ||
1168 | static int __init tusb_probe(struct platform_device *pdev) | 1170 | static int __devinit tusb_probe(struct platform_device *pdev) |
1169 | { | 1171 | { |
1170 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; | 1172 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; |
1171 | struct platform_device *musb; | 1173 | struct platform_device *musb; |
@@ -1227,7 +1229,7 @@ err0: | |||
1227 | return ret; | 1229 | return ret; |
1228 | } | 1230 | } |
1229 | 1231 | ||
1230 | static int __exit tusb_remove(struct platform_device *pdev) | 1232 | static int __devexit tusb_remove(struct platform_device *pdev) |
1231 | { | 1233 | { |
1232 | struct tusb6010_glue *glue = platform_get_drvdata(pdev); | 1234 | struct tusb6010_glue *glue = platform_get_drvdata(pdev); |
1233 | 1235 | ||
@@ -1239,7 +1241,8 @@ static int __exit tusb_remove(struct platform_device *pdev) | |||
1239 | } | 1241 | } |
1240 | 1242 | ||
1241 | static struct platform_driver tusb_driver = { | 1243 | static struct platform_driver tusb_driver = { |
1242 | .remove = __exit_p(tusb_remove), | 1244 | .probe = tusb_probe, |
1245 | .remove = __devexit_p(tusb_remove), | ||
1243 | .driver = { | 1246 | .driver = { |
1244 | .name = "musb-tusb", | 1247 | .name = "musb-tusb", |
1245 | }, | 1248 | }, |
@@ -1251,9 +1254,9 @@ MODULE_LICENSE("GPL v2"); | |||
1251 | 1254 | ||
1252 | static int __init tusb_init(void) | 1255 | static int __init tusb_init(void) |
1253 | { | 1256 | { |
1254 | return platform_driver_probe(&tusb_driver, tusb_probe); | 1257 | return platform_driver_register(&tusb_driver); |
1255 | } | 1258 | } |
1256 | subsys_initcall(tusb_init); | 1259 | module_init(tusb_init); |
1257 | 1260 | ||
1258 | static void __exit tusb_exit(void) | 1261 | static void __exit tusb_exit(void) |
1259 | { | 1262 | { |
diff --git a/drivers/usb/musb/ux500.c b/drivers/usb/musb/ux500.c index f7e04bf34a13..aa09dd417b94 100644 --- a/drivers/usb/musb/ux500.c +++ b/drivers/usb/musb/ux500.c | |||
@@ -37,7 +37,7 @@ struct ux500_glue { | |||
37 | 37 | ||
38 | static int ux500_musb_init(struct musb *musb) | 38 | static int ux500_musb_init(struct musb *musb) |
39 | { | 39 | { |
40 | musb->xceiv = otg_get_transceiver(); | 40 | musb->xceiv = usb_get_transceiver(); |
41 | if (!musb->xceiv) { | 41 | if (!musb->xceiv) { |
42 | pr_err("HS USB OTG: no transceiver configured\n"); | 42 | pr_err("HS USB OTG: no transceiver configured\n"); |
43 | return -ENODEV; | 43 | return -ENODEV; |
@@ -48,7 +48,7 @@ static int ux500_musb_init(struct musb *musb) | |||
48 | 48 | ||
49 | static int ux500_musb_exit(struct musb *musb) | 49 | static int ux500_musb_exit(struct musb *musb) |
50 | { | 50 | { |
51 | otg_put_transceiver(musb->xceiv); | 51 | usb_put_transceiver(musb->xceiv); |
52 | 52 | ||
53 | return 0; | 53 | return 0; |
54 | } | 54 | } |
@@ -58,7 +58,7 @@ static const struct musb_platform_ops ux500_ops = { | |||
58 | .exit = ux500_musb_exit, | 58 | .exit = ux500_musb_exit, |
59 | }; | 59 | }; |
60 | 60 | ||
61 | static int __init ux500_probe(struct platform_device *pdev) | 61 | static int __devinit ux500_probe(struct platform_device *pdev) |
62 | { | 62 | { |
63 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; | 63 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; |
64 | struct platform_device *musb; | 64 | struct platform_device *musb; |
@@ -141,7 +141,7 @@ err0: | |||
141 | return ret; | 141 | return ret; |
142 | } | 142 | } |
143 | 143 | ||
144 | static int __exit ux500_remove(struct platform_device *pdev) | 144 | static int __devexit ux500_remove(struct platform_device *pdev) |
145 | { | 145 | { |
146 | struct ux500_glue *glue = platform_get_drvdata(pdev); | 146 | struct ux500_glue *glue = platform_get_drvdata(pdev); |
147 | 147 | ||
@@ -160,7 +160,7 @@ static int ux500_suspend(struct device *dev) | |||
160 | struct ux500_glue *glue = dev_get_drvdata(dev); | 160 | struct ux500_glue *glue = dev_get_drvdata(dev); |
161 | struct musb *musb = glue_to_musb(glue); | 161 | struct musb *musb = glue_to_musb(glue); |
162 | 162 | ||
163 | otg_set_suspend(musb->xceiv, 1); | 163 | usb_phy_set_suspend(musb->xceiv, 1); |
164 | clk_disable(glue->clk); | 164 | clk_disable(glue->clk); |
165 | 165 | ||
166 | return 0; | 166 | return 0; |
@@ -178,7 +178,7 @@ static int ux500_resume(struct device *dev) | |||
178 | return ret; | 178 | return ret; |
179 | } | 179 | } |
180 | 180 | ||
181 | otg_set_suspend(musb->xceiv, 0); | 181 | usb_phy_set_suspend(musb->xceiv, 0); |
182 | 182 | ||
183 | return 0; | 183 | return 0; |
184 | } | 184 | } |
@@ -194,7 +194,8 @@ static const struct dev_pm_ops ux500_pm_ops = { | |||
194 | #endif | 194 | #endif |
195 | 195 | ||
196 | static struct platform_driver ux500_driver = { | 196 | static struct platform_driver ux500_driver = { |
197 | .remove = __exit_p(ux500_remove), | 197 | .probe = ux500_probe, |
198 | .remove = __devexit_p(ux500_remove), | ||
198 | .driver = { | 199 | .driver = { |
199 | .name = "musb-ux500", | 200 | .name = "musb-ux500", |
200 | .pm = DEV_PM_OPS, | 201 | .pm = DEV_PM_OPS, |
@@ -207,9 +208,9 @@ MODULE_LICENSE("GPL v2"); | |||
207 | 208 | ||
208 | static int __init ux500_init(void) | 209 | static int __init ux500_init(void) |
209 | { | 210 | { |
210 | return platform_driver_probe(&ux500_driver, ux500_probe); | 211 | return platform_driver_register(&ux500_driver); |
211 | } | 212 | } |
212 | subsys_initcall(ux500_init); | 213 | module_init(ux500_init); |
213 | 214 | ||
214 | static void __exit ux500_exit(void) | 215 | static void __exit ux500_exit(void) |
215 | { | 216 | { |
diff --git a/drivers/usb/otg/Kconfig b/drivers/usb/otg/Kconfig index 735ef4c2339a..5c87db06b598 100644 --- a/drivers/usb/otg/Kconfig +++ b/drivers/usb/otg/Kconfig | |||
@@ -23,7 +23,7 @@ config USB_GPIO_VBUS | |||
23 | select USB_OTG_UTILS | 23 | select USB_OTG_UTILS |
24 | help | 24 | help |
25 | Provides simple GPIO VBUS sensing for controllers with an | 25 | Provides simple GPIO VBUS sensing for controllers with an |
26 | internal transceiver via the otg_transceiver interface, and | 26 | internal transceiver via the usb_phy interface, and |
27 | optionally control of a D+ pullup GPIO as well as a VBUS | 27 | optionally control of a D+ pullup GPIO as well as a VBUS |
28 | current limit regulator. | 28 | current limit regulator. |
29 | 29 | ||
diff --git a/drivers/usb/otg/ab8500-usb.c b/drivers/usb/otg/ab8500-usb.c index 74fe6e62e0f7..a84af677dc59 100644 --- a/drivers/usb/otg/ab8500-usb.c +++ b/drivers/usb/otg/ab8500-usb.c | |||
@@ -68,7 +68,7 @@ enum ab8500_usb_link_status { | |||
68 | }; | 68 | }; |
69 | 69 | ||
70 | struct ab8500_usb { | 70 | struct ab8500_usb { |
71 | struct otg_transceiver otg; | 71 | struct usb_phy phy; |
72 | struct device *dev; | 72 | struct device *dev; |
73 | int irq_num_id_rise; | 73 | int irq_num_id_rise; |
74 | int irq_num_id_fall; | 74 | int irq_num_id_fall; |
@@ -82,9 +82,9 @@ struct ab8500_usb { | |||
82 | int rev; | 82 | int rev; |
83 | }; | 83 | }; |
84 | 84 | ||
85 | static inline struct ab8500_usb *xceiv_to_ab(struct otg_transceiver *x) | 85 | static inline struct ab8500_usb *phy_to_ab(struct usb_phy *x) |
86 | { | 86 | { |
87 | return container_of(x, struct ab8500_usb, otg); | 87 | return container_of(x, struct ab8500_usb, phy); |
88 | } | 88 | } |
89 | 89 | ||
90 | static void ab8500_usb_wd_workaround(struct ab8500_usb *ab) | 90 | static void ab8500_usb_wd_workaround(struct ab8500_usb *ab) |
@@ -153,7 +153,7 @@ static int ab8500_usb_link_status_update(struct ab8500_usb *ab) | |||
153 | u8 reg; | 153 | u8 reg; |
154 | enum ab8500_usb_link_status lsts; | 154 | enum ab8500_usb_link_status lsts; |
155 | void *v = NULL; | 155 | void *v = NULL; |
156 | enum usb_xceiv_events event; | 156 | enum usb_phy_events event; |
157 | 157 | ||
158 | abx500_get_register_interruptible(ab->dev, | 158 | abx500_get_register_interruptible(ab->dev, |
159 | AB8500_USB, | 159 | AB8500_USB, |
@@ -169,8 +169,8 @@ static int ab8500_usb_link_status_update(struct ab8500_usb *ab) | |||
169 | /* TODO: Disable regulators. */ | 169 | /* TODO: Disable regulators. */ |
170 | ab8500_usb_host_phy_dis(ab); | 170 | ab8500_usb_host_phy_dis(ab); |
171 | ab8500_usb_peri_phy_dis(ab); | 171 | ab8500_usb_peri_phy_dis(ab); |
172 | ab->otg.state = OTG_STATE_B_IDLE; | 172 | ab->phy.state = OTG_STATE_B_IDLE; |
173 | ab->otg.default_a = false; | 173 | ab->phy.otg->default_a = false; |
174 | ab->vbus_draw = 0; | 174 | ab->vbus_draw = 0; |
175 | event = USB_EVENT_NONE; | 175 | event = USB_EVENT_NONE; |
176 | break; | 176 | break; |
@@ -181,22 +181,22 @@ static int ab8500_usb_link_status_update(struct ab8500_usb *ab) | |||
181 | case USB_LINK_HOST_CHG_NM: | 181 | case USB_LINK_HOST_CHG_NM: |
182 | case USB_LINK_HOST_CHG_HS: | 182 | case USB_LINK_HOST_CHG_HS: |
183 | case USB_LINK_HOST_CHG_HS_CHIRP: | 183 | case USB_LINK_HOST_CHG_HS_CHIRP: |
184 | if (ab->otg.gadget) { | 184 | if (ab->phy.otg->gadget) { |
185 | /* TODO: Enable regulators. */ | 185 | /* TODO: Enable regulators. */ |
186 | ab8500_usb_peri_phy_en(ab); | 186 | ab8500_usb_peri_phy_en(ab); |
187 | v = ab->otg.gadget; | 187 | v = ab->phy.otg->gadget; |
188 | } | 188 | } |
189 | event = USB_EVENT_VBUS; | 189 | event = USB_EVENT_VBUS; |
190 | break; | 190 | break; |
191 | 191 | ||
192 | case USB_LINK_HM_IDGND: | 192 | case USB_LINK_HM_IDGND: |
193 | if (ab->otg.host) { | 193 | if (ab->phy.otg->host) { |
194 | /* TODO: Enable regulators. */ | 194 | /* TODO: Enable regulators. */ |
195 | ab8500_usb_host_phy_en(ab); | 195 | ab8500_usb_host_phy_en(ab); |
196 | v = ab->otg.host; | 196 | v = ab->phy.otg->host; |
197 | } | 197 | } |
198 | ab->otg.state = OTG_STATE_A_IDLE; | 198 | ab->phy.state = OTG_STATE_A_IDLE; |
199 | ab->otg.default_a = true; | 199 | ab->phy.otg->default_a = true; |
200 | event = USB_EVENT_ID; | 200 | event = USB_EVENT_ID; |
201 | break; | 201 | break; |
202 | 202 | ||
@@ -212,7 +212,7 @@ static int ab8500_usb_link_status_update(struct ab8500_usb *ab) | |||
212 | break; | 212 | break; |
213 | } | 213 | } |
214 | 214 | ||
215 | atomic_notifier_call_chain(&ab->otg.notifier, event, v); | 215 | atomic_notifier_call_chain(&ab->phy.notifier, event, v); |
216 | 216 | ||
217 | return 0; | 217 | return 0; |
218 | } | 218 | } |
@@ -262,27 +262,27 @@ static void ab8500_usb_phy_disable_work(struct work_struct *work) | |||
262 | struct ab8500_usb *ab = container_of(work, struct ab8500_usb, | 262 | struct ab8500_usb *ab = container_of(work, struct ab8500_usb, |
263 | phy_dis_work); | 263 | phy_dis_work); |
264 | 264 | ||
265 | if (!ab->otg.host) | 265 | if (!ab->phy.otg->host) |
266 | ab8500_usb_host_phy_dis(ab); | 266 | ab8500_usb_host_phy_dis(ab); |
267 | 267 | ||
268 | if (!ab->otg.gadget) | 268 | if (!ab->phy.otg->gadget) |
269 | ab8500_usb_peri_phy_dis(ab); | 269 | ab8500_usb_peri_phy_dis(ab); |
270 | } | 270 | } |
271 | 271 | ||
272 | static int ab8500_usb_set_power(struct otg_transceiver *otg, unsigned mA) | 272 | static int ab8500_usb_set_power(struct usb_phy *phy, unsigned mA) |
273 | { | 273 | { |
274 | struct ab8500_usb *ab; | 274 | struct ab8500_usb *ab; |
275 | 275 | ||
276 | if (!otg) | 276 | if (!phy) |
277 | return -ENODEV; | 277 | return -ENODEV; |
278 | 278 | ||
279 | ab = xceiv_to_ab(otg); | 279 | ab = phy_to_ab(phy); |
280 | 280 | ||
281 | ab->vbus_draw = mA; | 281 | ab->vbus_draw = mA; |
282 | 282 | ||
283 | if (mA) | 283 | if (mA) |
284 | atomic_notifier_call_chain(&ab->otg.notifier, | 284 | atomic_notifier_call_chain(&ab->phy.notifier, |
285 | USB_EVENT_ENUMERATED, ab->otg.gadget); | 285 | USB_EVENT_ENUMERATED, ab->phy.otg->gadget); |
286 | return 0; | 286 | return 0; |
287 | } | 287 | } |
288 | 288 | ||
@@ -290,21 +290,21 @@ static int ab8500_usb_set_power(struct otg_transceiver *otg, unsigned mA) | |||
290 | * ab->vbus_draw. | 290 | * ab->vbus_draw. |
291 | */ | 291 | */ |
292 | 292 | ||
293 | static int ab8500_usb_set_suspend(struct otg_transceiver *x, int suspend) | 293 | static int ab8500_usb_set_suspend(struct usb_phy *x, int suspend) |
294 | { | 294 | { |
295 | /* TODO */ | 295 | /* TODO */ |
296 | return 0; | 296 | return 0; |
297 | } | 297 | } |
298 | 298 | ||
299 | static int ab8500_usb_set_peripheral(struct otg_transceiver *otg, | 299 | static int ab8500_usb_set_peripheral(struct usb_otg *otg, |
300 | struct usb_gadget *gadget) | 300 | struct usb_gadget *gadget) |
301 | { | 301 | { |
302 | struct ab8500_usb *ab; | 302 | struct ab8500_usb *ab; |
303 | 303 | ||
304 | if (!otg) | 304 | if (!otg) |
305 | return -ENODEV; | 305 | return -ENODEV; |
306 | 306 | ||
307 | ab = xceiv_to_ab(otg); | 307 | ab = phy_to_ab(otg->phy); |
308 | 308 | ||
309 | /* Some drivers call this function in atomic context. | 309 | /* Some drivers call this function in atomic context. |
310 | * Do not update ab8500 registers directly till this | 310 | * Do not update ab8500 registers directly till this |
@@ -313,11 +313,11 @@ static int ab8500_usb_set_peripheral(struct otg_transceiver *otg, | |||
313 | 313 | ||
314 | if (!gadget) { | 314 | if (!gadget) { |
315 | /* TODO: Disable regulators. */ | 315 | /* TODO: Disable regulators. */ |
316 | ab->otg.gadget = NULL; | 316 | otg->gadget = NULL; |
317 | schedule_work(&ab->phy_dis_work); | 317 | schedule_work(&ab->phy_dis_work); |
318 | } else { | 318 | } else { |
319 | ab->otg.gadget = gadget; | 319 | otg->gadget = gadget; |
320 | ab->otg.state = OTG_STATE_B_IDLE; | 320 | otg->phy->state = OTG_STATE_B_IDLE; |
321 | 321 | ||
322 | /* Phy will not be enabled if cable is already | 322 | /* Phy will not be enabled if cable is already |
323 | * plugged-in. Schedule to enable phy. | 323 | * plugged-in. Schedule to enable phy. |
@@ -329,15 +329,14 @@ static int ab8500_usb_set_peripheral(struct otg_transceiver *otg, | |||
329 | return 0; | 329 | return 0; |
330 | } | 330 | } |
331 | 331 | ||
332 | static int ab8500_usb_set_host(struct otg_transceiver *otg, | 332 | static int ab8500_usb_set_host(struct usb_otg *otg, struct usb_bus *host) |
333 | struct usb_bus *host) | ||
334 | { | 333 | { |
335 | struct ab8500_usb *ab; | 334 | struct ab8500_usb *ab; |
336 | 335 | ||
337 | if (!otg) | 336 | if (!otg) |
338 | return -ENODEV; | 337 | return -ENODEV; |
339 | 338 | ||
340 | ab = xceiv_to_ab(otg); | 339 | ab = phy_to_ab(otg->phy); |
341 | 340 | ||
342 | /* Some drivers call this function in atomic context. | 341 | /* Some drivers call this function in atomic context. |
343 | * Do not update ab8500 registers directly till this | 342 | * Do not update ab8500 registers directly till this |
@@ -346,10 +345,10 @@ static int ab8500_usb_set_host(struct otg_transceiver *otg, | |||
346 | 345 | ||
347 | if (!host) { | 346 | if (!host) { |
348 | /* TODO: Disable regulators. */ | 347 | /* TODO: Disable regulators. */ |
349 | ab->otg.host = NULL; | 348 | otg->host = NULL; |
350 | schedule_work(&ab->phy_dis_work); | 349 | schedule_work(&ab->phy_dis_work); |
351 | } else { | 350 | } else { |
352 | ab->otg.host = host; | 351 | otg->host = host; |
353 | /* Phy will not be enabled if cable is already | 352 | /* Phy will not be enabled if cable is already |
354 | * plugged-in. Schedule to enable phy. | 353 | * plugged-in. Schedule to enable phy. |
355 | * Use same delay to avoid any race condition. | 354 | * Use same delay to avoid any race condition. |
@@ -472,6 +471,7 @@ static int ab8500_usb_v2_res_setup(struct platform_device *pdev, | |||
472 | static int __devinit ab8500_usb_probe(struct platform_device *pdev) | 471 | static int __devinit ab8500_usb_probe(struct platform_device *pdev) |
473 | { | 472 | { |
474 | struct ab8500_usb *ab; | 473 | struct ab8500_usb *ab; |
474 | struct usb_otg *otg; | ||
475 | int err; | 475 | int err; |
476 | int rev; | 476 | int rev; |
477 | 477 | ||
@@ -488,19 +488,28 @@ static int __devinit ab8500_usb_probe(struct platform_device *pdev) | |||
488 | if (!ab) | 488 | if (!ab) |
489 | return -ENOMEM; | 489 | return -ENOMEM; |
490 | 490 | ||
491 | otg = kzalloc(sizeof *otg, GFP_KERNEL); | ||
492 | if (!otg) { | ||
493 | kfree(ab); | ||
494 | return -ENOMEM; | ||
495 | } | ||
496 | |||
491 | ab->dev = &pdev->dev; | 497 | ab->dev = &pdev->dev; |
492 | ab->rev = rev; | 498 | ab->rev = rev; |
493 | ab->otg.dev = ab->dev; | 499 | ab->phy.dev = ab->dev; |
494 | ab->otg.label = "ab8500"; | 500 | ab->phy.otg = otg; |
495 | ab->otg.state = OTG_STATE_UNDEFINED; | 501 | ab->phy.label = "ab8500"; |
496 | ab->otg.set_host = ab8500_usb_set_host; | 502 | ab->phy.set_suspend = ab8500_usb_set_suspend; |
497 | ab->otg.set_peripheral = ab8500_usb_set_peripheral; | 503 | ab->phy.set_power = ab8500_usb_set_power; |
498 | ab->otg.set_suspend = ab8500_usb_set_suspend; | 504 | ab->phy.state = OTG_STATE_UNDEFINED; |
499 | ab->otg.set_power = ab8500_usb_set_power; | 505 | |
506 | otg->phy = &ab->phy; | ||
507 | otg->set_host = ab8500_usb_set_host; | ||
508 | otg->set_peripheral = ab8500_usb_set_peripheral; | ||
500 | 509 | ||
501 | platform_set_drvdata(pdev, ab); | 510 | platform_set_drvdata(pdev, ab); |
502 | 511 | ||
503 | ATOMIC_INIT_NOTIFIER_HEAD(&ab->otg.notifier); | 512 | ATOMIC_INIT_NOTIFIER_HEAD(&ab->phy.notifier); |
504 | 513 | ||
505 | /* v1: Wait for link status to become stable. | 514 | /* v1: Wait for link status to become stable. |
506 | * all: Updates form set_host and set_peripheral as they are atomic. | 515 | * all: Updates form set_host and set_peripheral as they are atomic. |
@@ -520,7 +529,7 @@ static int __devinit ab8500_usb_probe(struct platform_device *pdev) | |||
520 | if (err < 0) | 529 | if (err < 0) |
521 | goto fail0; | 530 | goto fail0; |
522 | 531 | ||
523 | err = otg_set_transceiver(&ab->otg); | 532 | err = usb_set_transceiver(&ab->phy); |
524 | if (err) { | 533 | if (err) { |
525 | dev_err(&pdev->dev, "Can't register transceiver\n"); | 534 | dev_err(&pdev->dev, "Can't register transceiver\n"); |
526 | goto fail1; | 535 | goto fail1; |
@@ -532,6 +541,7 @@ static int __devinit ab8500_usb_probe(struct platform_device *pdev) | |||
532 | fail1: | 541 | fail1: |
533 | ab8500_usb_irq_free(ab); | 542 | ab8500_usb_irq_free(ab); |
534 | fail0: | 543 | fail0: |
544 | kfree(otg); | ||
535 | kfree(ab); | 545 | kfree(ab); |
536 | return err; | 546 | return err; |
537 | } | 547 | } |
@@ -546,13 +556,14 @@ static int __devexit ab8500_usb_remove(struct platform_device *pdev) | |||
546 | 556 | ||
547 | cancel_work_sync(&ab->phy_dis_work); | 557 | cancel_work_sync(&ab->phy_dis_work); |
548 | 558 | ||
549 | otg_set_transceiver(NULL); | 559 | usb_set_transceiver(NULL); |
550 | 560 | ||
551 | ab8500_usb_host_phy_dis(ab); | 561 | ab8500_usb_host_phy_dis(ab); |
552 | ab8500_usb_peri_phy_dis(ab); | 562 | ab8500_usb_peri_phy_dis(ab); |
553 | 563 | ||
554 | platform_set_drvdata(pdev, NULL); | 564 | platform_set_drvdata(pdev, NULL); |
555 | 565 | ||
566 | kfree(ab->phy.otg); | ||
556 | kfree(ab); | 567 | kfree(ab); |
557 | 568 | ||
558 | return 0; | 569 | return 0; |
diff --git a/drivers/usb/otg/fsl_otg.c b/drivers/usb/otg/fsl_otg.c index a190850d2d3b..be4a63e8302f 100644 --- a/drivers/usb/otg/fsl_otg.c +++ b/drivers/usb/otg/fsl_otg.c | |||
@@ -275,7 +275,7 @@ void b_srp_end(unsigned long foo) | |||
275 | fsl_otg_dischrg_vbus(0); | 275 | fsl_otg_dischrg_vbus(0); |
276 | srp_wait_done = 1; | 276 | srp_wait_done = 1; |
277 | 277 | ||
278 | if ((fsl_otg_dev->otg.state == OTG_STATE_B_SRP_INIT) && | 278 | if ((fsl_otg_dev->phy.state == OTG_STATE_B_SRP_INIT) && |
279 | fsl_otg_dev->fsm.b_sess_vld) | 279 | fsl_otg_dev->fsm.b_sess_vld) |
280 | fsl_otg_dev->fsm.b_srp_done = 1; | 280 | fsl_otg_dev->fsm.b_srp_done = 1; |
281 | } | 281 | } |
@@ -288,7 +288,7 @@ void b_srp_end(unsigned long foo) | |||
288 | void a_wait_enum(unsigned long foo) | 288 | void a_wait_enum(unsigned long foo) |
289 | { | 289 | { |
290 | VDBG("a_wait_enum timeout\n"); | 290 | VDBG("a_wait_enum timeout\n"); |
291 | if (!fsl_otg_dev->otg.host->b_hnp_enable) | 291 | if (!fsl_otg_dev->phy.otg->host->b_hnp_enable) |
292 | fsl_otg_add_timer(a_wait_enum_tmr); | 292 | fsl_otg_add_timer(a_wait_enum_tmr); |
293 | else | 293 | else |
294 | otg_statemachine(&fsl_otg_dev->fsm); | 294 | otg_statemachine(&fsl_otg_dev->fsm); |
@@ -452,14 +452,14 @@ void otg_reset_controller(void) | |||
452 | /* Call suspend/resume routines in host driver */ | 452 | /* Call suspend/resume routines in host driver */ |
453 | int fsl_otg_start_host(struct otg_fsm *fsm, int on) | 453 | int fsl_otg_start_host(struct otg_fsm *fsm, int on) |
454 | { | 454 | { |
455 | struct otg_transceiver *xceiv = fsm->transceiver; | 455 | struct usb_otg *otg = fsm->otg; |
456 | struct device *dev; | 456 | struct device *dev; |
457 | struct fsl_otg *otg_dev = container_of(xceiv, struct fsl_otg, otg); | 457 | struct fsl_otg *otg_dev = container_of(otg->phy, struct fsl_otg, phy); |
458 | u32 retval = 0; | 458 | u32 retval = 0; |
459 | 459 | ||
460 | if (!xceiv->host) | 460 | if (!otg->host) |
461 | return -ENODEV; | 461 | return -ENODEV; |
462 | dev = xceiv->host->controller; | 462 | dev = otg->host->controller; |
463 | 463 | ||
464 | /* | 464 | /* |
465 | * Update a_vbus_vld state as a_vbus_vld int is disabled | 465 | * Update a_vbus_vld state as a_vbus_vld int is disabled |
@@ -518,14 +518,14 @@ end: | |||
518 | */ | 518 | */ |
519 | int fsl_otg_start_gadget(struct otg_fsm *fsm, int on) | 519 | int fsl_otg_start_gadget(struct otg_fsm *fsm, int on) |
520 | { | 520 | { |
521 | struct otg_transceiver *xceiv = fsm->transceiver; | 521 | struct usb_otg *otg = fsm->otg; |
522 | struct device *dev; | 522 | struct device *dev; |
523 | 523 | ||
524 | if (!xceiv->gadget || !xceiv->gadget->dev.parent) | 524 | if (!otg->gadget || !otg->gadget->dev.parent) |
525 | return -ENODEV; | 525 | return -ENODEV; |
526 | 526 | ||
527 | VDBG("gadget %s\n", on ? "on" : "off"); | 527 | VDBG("gadget %s\n", on ? "on" : "off"); |
528 | dev = xceiv->gadget->dev.parent; | 528 | dev = otg->gadget->dev.parent; |
529 | 529 | ||
530 | if (on) { | 530 | if (on) { |
531 | if (dev->driver->resume) | 531 | if (dev->driver->resume) |
@@ -542,14 +542,14 @@ int fsl_otg_start_gadget(struct otg_fsm *fsm, int on) | |||
542 | * Called by initialization code of host driver. Register host controller | 542 | * Called by initialization code of host driver. Register host controller |
543 | * to the OTG. Suspend host for OTG role detection. | 543 | * to the OTG. Suspend host for OTG role detection. |
544 | */ | 544 | */ |
545 | static int fsl_otg_set_host(struct otg_transceiver *otg_p, struct usb_bus *host) | 545 | static int fsl_otg_set_host(struct usb_otg *otg, struct usb_bus *host) |
546 | { | 546 | { |
547 | struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); | 547 | struct fsl_otg *otg_dev = container_of(otg->phy, struct fsl_otg, phy); |
548 | 548 | ||
549 | if (!otg_p || otg_dev != fsl_otg_dev) | 549 | if (!otg || otg_dev != fsl_otg_dev) |
550 | return -ENODEV; | 550 | return -ENODEV; |
551 | 551 | ||
552 | otg_p->host = host; | 552 | otg->host = host; |
553 | 553 | ||
554 | otg_dev->fsm.a_bus_drop = 0; | 554 | otg_dev->fsm.a_bus_drop = 0; |
555 | otg_dev->fsm.a_bus_req = 1; | 555 | otg_dev->fsm.a_bus_req = 1; |
@@ -557,8 +557,8 @@ static int fsl_otg_set_host(struct otg_transceiver *otg_p, struct usb_bus *host) | |||
557 | if (host) { | 557 | if (host) { |
558 | VDBG("host off......\n"); | 558 | VDBG("host off......\n"); |
559 | 559 | ||
560 | otg_p->host->otg_port = fsl_otg_initdata.otg_port; | 560 | otg->host->otg_port = fsl_otg_initdata.otg_port; |
561 | otg_p->host->is_b_host = otg_dev->fsm.id; | 561 | otg->host->is_b_host = otg_dev->fsm.id; |
562 | /* | 562 | /* |
563 | * must leave time for khubd to finish its thing | 563 | * must leave time for khubd to finish its thing |
564 | * before yanking the host driver out from under it, | 564 | * before yanking the host driver out from under it, |
@@ -574,7 +574,7 @@ static int fsl_otg_set_host(struct otg_transceiver *otg_p, struct usb_bus *host) | |||
574 | /* Mini-A cable connected */ | 574 | /* Mini-A cable connected */ |
575 | struct otg_fsm *fsm = &otg_dev->fsm; | 575 | struct otg_fsm *fsm = &otg_dev->fsm; |
576 | 576 | ||
577 | otg_p->state = OTG_STATE_UNDEFINED; | 577 | otg->phy->state = OTG_STATE_UNDEFINED; |
578 | fsm->protocol = PROTO_UNDEF; | 578 | fsm->protocol = PROTO_UNDEF; |
579 | } | 579 | } |
580 | } | 580 | } |
@@ -587,29 +587,29 @@ static int fsl_otg_set_host(struct otg_transceiver *otg_p, struct usb_bus *host) | |||
587 | } | 587 | } |
588 | 588 | ||
589 | /* Called by initialization code of udc. Register udc to OTG. */ | 589 | /* Called by initialization code of udc. Register udc to OTG. */ |
590 | static int fsl_otg_set_peripheral(struct otg_transceiver *otg_p, | 590 | static int fsl_otg_set_peripheral(struct usb_otg *otg, |
591 | struct usb_gadget *gadget) | 591 | struct usb_gadget *gadget) |
592 | { | 592 | { |
593 | struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); | 593 | struct fsl_otg *otg_dev = container_of(otg->phy, struct fsl_otg, phy); |
594 | 594 | ||
595 | VDBG("otg_dev 0x%x\n", (int)otg_dev); | 595 | VDBG("otg_dev 0x%x\n", (int)otg_dev); |
596 | VDBG("fsl_otg_dev 0x%x\n", (int)fsl_otg_dev); | 596 | VDBG("fsl_otg_dev 0x%x\n", (int)fsl_otg_dev); |
597 | 597 | ||
598 | if (!otg_p || otg_dev != fsl_otg_dev) | 598 | if (!otg || otg_dev != fsl_otg_dev) |
599 | return -ENODEV; | 599 | return -ENODEV; |
600 | 600 | ||
601 | if (!gadget) { | 601 | if (!gadget) { |
602 | if (!otg_dev->otg.default_a) | 602 | if (!otg->default_a) |
603 | otg_p->gadget->ops->vbus_draw(otg_p->gadget, 0); | 603 | otg->gadget->ops->vbus_draw(otg->gadget, 0); |
604 | usb_gadget_vbus_disconnect(otg_dev->otg.gadget); | 604 | usb_gadget_vbus_disconnect(otg->gadget); |
605 | otg_dev->otg.gadget = 0; | 605 | otg->gadget = 0; |
606 | otg_dev->fsm.b_bus_req = 0; | 606 | otg_dev->fsm.b_bus_req = 0; |
607 | otg_statemachine(&otg_dev->fsm); | 607 | otg_statemachine(&otg_dev->fsm); |
608 | return 0; | 608 | return 0; |
609 | } | 609 | } |
610 | 610 | ||
611 | otg_p->gadget = gadget; | 611 | otg->gadget = gadget; |
612 | otg_p->gadget->is_a_peripheral = !otg_dev->fsm.id; | 612 | otg->gadget->is_a_peripheral = !otg_dev->fsm.id; |
613 | 613 | ||
614 | otg_dev->fsm.b_bus_req = 1; | 614 | otg_dev->fsm.b_bus_req = 1; |
615 | 615 | ||
@@ -625,11 +625,11 @@ static int fsl_otg_set_peripheral(struct otg_transceiver *otg_p, | |||
625 | } | 625 | } |
626 | 626 | ||
627 | /* Set OTG port power, only for B-device */ | 627 | /* Set OTG port power, only for B-device */ |
628 | static int fsl_otg_set_power(struct otg_transceiver *otg_p, unsigned mA) | 628 | static int fsl_otg_set_power(struct usb_phy *phy, unsigned mA) |
629 | { | 629 | { |
630 | if (!fsl_otg_dev) | 630 | if (!fsl_otg_dev) |
631 | return -ENODEV; | 631 | return -ENODEV; |
632 | if (otg_p->state == OTG_STATE_B_PERIPHERAL) | 632 | if (phy->state == OTG_STATE_B_PERIPHERAL) |
633 | pr_info("FSL OTG: Draw %d mA\n", mA); | 633 | pr_info("FSL OTG: Draw %d mA\n", mA); |
634 | 634 | ||
635 | return 0; | 635 | return 0; |
@@ -658,12 +658,12 @@ static void fsl_otg_event(struct work_struct *work) | |||
658 | } | 658 | } |
659 | 659 | ||
660 | /* B-device start SRP */ | 660 | /* B-device start SRP */ |
661 | static int fsl_otg_start_srp(struct otg_transceiver *otg_p) | 661 | static int fsl_otg_start_srp(struct usb_otg *otg) |
662 | { | 662 | { |
663 | struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); | 663 | struct fsl_otg *otg_dev = container_of(otg->phy, struct fsl_otg, phy); |
664 | 664 | ||
665 | if (!otg_p || otg_dev != fsl_otg_dev | 665 | if (!otg || otg_dev != fsl_otg_dev |
666 | || otg_p->state != OTG_STATE_B_IDLE) | 666 | || otg->phy->state != OTG_STATE_B_IDLE) |
667 | return -ENODEV; | 667 | return -ENODEV; |
668 | 668 | ||
669 | otg_dev->fsm.b_bus_req = 1; | 669 | otg_dev->fsm.b_bus_req = 1; |
@@ -673,11 +673,11 @@ static int fsl_otg_start_srp(struct otg_transceiver *otg_p) | |||
673 | } | 673 | } |
674 | 674 | ||
675 | /* A_host suspend will call this function to start hnp */ | 675 | /* A_host suspend will call this function to start hnp */ |
676 | static int fsl_otg_start_hnp(struct otg_transceiver *otg_p) | 676 | static int fsl_otg_start_hnp(struct usb_otg *otg) |
677 | { | 677 | { |
678 | struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); | 678 | struct fsl_otg *otg_dev = container_of(otg->phy, struct fsl_otg, phy); |
679 | 679 | ||
680 | if (!otg_p || otg_dev != fsl_otg_dev) | 680 | if (!otg || otg_dev != fsl_otg_dev) |
681 | return -ENODEV; | 681 | return -ENODEV; |
682 | 682 | ||
683 | DBG("start_hnp...n"); | 683 | DBG("start_hnp...n"); |
@@ -698,7 +698,7 @@ static int fsl_otg_start_hnp(struct otg_transceiver *otg_p) | |||
698 | irqreturn_t fsl_otg_isr(int irq, void *dev_id) | 698 | irqreturn_t fsl_otg_isr(int irq, void *dev_id) |
699 | { | 699 | { |
700 | struct otg_fsm *fsm = &((struct fsl_otg *)dev_id)->fsm; | 700 | struct otg_fsm *fsm = &((struct fsl_otg *)dev_id)->fsm; |
701 | struct otg_transceiver *otg = &((struct fsl_otg *)dev_id)->otg; | 701 | struct usb_otg *otg = ((struct fsl_otg *)dev_id)->phy.otg; |
702 | u32 otg_int_src, otg_sc; | 702 | u32 otg_int_src, otg_sc; |
703 | 703 | ||
704 | otg_sc = fsl_readl(&usb_dr_regs->otgsc); | 704 | otg_sc = fsl_readl(&usb_dr_regs->otgsc); |
@@ -774,6 +774,12 @@ static int fsl_otg_conf(struct platform_device *pdev) | |||
774 | if (!fsl_otg_tc) | 774 | if (!fsl_otg_tc) |
775 | return -ENOMEM; | 775 | return -ENOMEM; |
776 | 776 | ||
777 | fsl_otg_tc->phy.otg = kzalloc(sizeof(struct usb_otg), GFP_KERNEL); | ||
778 | if (!fsl_otg_tc->phy.otg) { | ||
779 | kfree(fsl_otg_tc); | ||
780 | return -ENOMEM; | ||
781 | } | ||
782 | |||
777 | INIT_DELAYED_WORK(&fsl_otg_tc->otg_event, fsl_otg_event); | 783 | INIT_DELAYED_WORK(&fsl_otg_tc->otg_event, fsl_otg_event); |
778 | 784 | ||
779 | INIT_LIST_HEAD(&active_timers); | 785 | INIT_LIST_HEAD(&active_timers); |
@@ -788,17 +794,19 @@ static int fsl_otg_conf(struct platform_device *pdev) | |||
788 | fsl_otg_tc->fsm.ops = &fsl_otg_ops; | 794 | fsl_otg_tc->fsm.ops = &fsl_otg_ops; |
789 | 795 | ||
790 | /* initialize the otg structure */ | 796 | /* initialize the otg structure */ |
791 | fsl_otg_tc->otg.label = DRIVER_DESC; | 797 | fsl_otg_tc->phy.label = DRIVER_DESC; |
792 | fsl_otg_tc->otg.set_host = fsl_otg_set_host; | 798 | fsl_otg_tc->phy.set_power = fsl_otg_set_power; |
793 | fsl_otg_tc->otg.set_peripheral = fsl_otg_set_peripheral; | 799 | |
794 | fsl_otg_tc->otg.set_power = fsl_otg_set_power; | 800 | fsl_otg_tc->phy.otg->phy = &fsl_otg_tc->phy; |
795 | fsl_otg_tc->otg.start_hnp = fsl_otg_start_hnp; | 801 | fsl_otg_tc->phy.otg->set_host = fsl_otg_set_host; |
796 | fsl_otg_tc->otg.start_srp = fsl_otg_start_srp; | 802 | fsl_otg_tc->phy.otg->set_peripheral = fsl_otg_set_peripheral; |
803 | fsl_otg_tc->phy.otg->start_hnp = fsl_otg_start_hnp; | ||
804 | fsl_otg_tc->phy.otg->start_srp = fsl_otg_start_srp; | ||
797 | 805 | ||
798 | fsl_otg_dev = fsl_otg_tc; | 806 | fsl_otg_dev = fsl_otg_tc; |
799 | 807 | ||
800 | /* Store the otg transceiver */ | 808 | /* Store the otg transceiver */ |
801 | status = otg_set_transceiver(&fsl_otg_tc->otg); | 809 | status = usb_set_transceiver(&fsl_otg_tc->phy); |
802 | if (status) { | 810 | if (status) { |
803 | pr_warn(FSL_OTG_NAME ": unable to register OTG transceiver.\n"); | 811 | pr_warn(FSL_OTG_NAME ": unable to register OTG transceiver.\n"); |
804 | goto err; | 812 | goto err; |
@@ -807,6 +815,7 @@ static int fsl_otg_conf(struct platform_device *pdev) | |||
807 | return 0; | 815 | return 0; |
808 | err: | 816 | err: |
809 | fsl_otg_uninit_timers(); | 817 | fsl_otg_uninit_timers(); |
818 | kfree(fsl_otg_tc->phy.otg); | ||
810 | kfree(fsl_otg_tc); | 819 | kfree(fsl_otg_tc); |
811 | return status; | 820 | return status; |
812 | } | 821 | } |
@@ -815,19 +824,19 @@ err: | |||
815 | int usb_otg_start(struct platform_device *pdev) | 824 | int usb_otg_start(struct platform_device *pdev) |
816 | { | 825 | { |
817 | struct fsl_otg *p_otg; | 826 | struct fsl_otg *p_otg; |
818 | struct otg_transceiver *otg_trans = otg_get_transceiver(); | 827 | struct usb_phy *otg_trans = usb_get_transceiver(); |
819 | struct otg_fsm *fsm; | 828 | struct otg_fsm *fsm; |
820 | int status; | 829 | int status; |
821 | struct resource *res; | 830 | struct resource *res; |
822 | u32 temp; | 831 | u32 temp; |
823 | struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; | 832 | struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; |
824 | 833 | ||
825 | p_otg = container_of(otg_trans, struct fsl_otg, otg); | 834 | p_otg = container_of(otg_trans, struct fsl_otg, phy); |
826 | fsm = &p_otg->fsm; | 835 | fsm = &p_otg->fsm; |
827 | 836 | ||
828 | /* Initialize the state machine structure with default values */ | 837 | /* Initialize the state machine structure with default values */ |
829 | SET_OTG_STATE(otg_trans, OTG_STATE_UNDEFINED); | 838 | SET_OTG_STATE(otg_trans, OTG_STATE_UNDEFINED); |
830 | fsm->transceiver = &p_otg->otg; | 839 | fsm->otg = p_otg->phy.otg; |
831 | 840 | ||
832 | /* We don't require predefined MEM/IRQ resource index */ | 841 | /* We don't require predefined MEM/IRQ resource index */ |
833 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 842 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
@@ -857,9 +866,10 @@ int usb_otg_start(struct platform_device *pdev) | |||
857 | status = request_irq(p_otg->irq, fsl_otg_isr, | 866 | status = request_irq(p_otg->irq, fsl_otg_isr, |
858 | IRQF_SHARED, driver_name, p_otg); | 867 | IRQF_SHARED, driver_name, p_otg); |
859 | if (status) { | 868 | if (status) { |
860 | dev_dbg(p_otg->otg.dev, "can't get IRQ %d, error %d\n", | 869 | dev_dbg(p_otg->phy.dev, "can't get IRQ %d, error %d\n", |
861 | p_otg->irq, status); | 870 | p_otg->irq, status); |
862 | iounmap(p_otg->dr_mem_map); | 871 | iounmap(p_otg->dr_mem_map); |
872 | kfree(p_otg->phy.otg); | ||
863 | kfree(p_otg); | 873 | kfree(p_otg); |
864 | return status; | 874 | return status; |
865 | } | 875 | } |
@@ -919,10 +929,10 @@ int usb_otg_start(struct platform_device *pdev) | |||
919 | * Also: record initial state of ID pin | 929 | * Also: record initial state of ID pin |
920 | */ | 930 | */ |
921 | if (fsl_readl(&p_otg->dr_mem_map->otgsc) & OTGSC_STS_USB_ID) { | 931 | if (fsl_readl(&p_otg->dr_mem_map->otgsc) & OTGSC_STS_USB_ID) { |
922 | p_otg->otg.state = OTG_STATE_UNDEFINED; | 932 | p_otg->phy.state = OTG_STATE_UNDEFINED; |
923 | p_otg->fsm.id = 1; | 933 | p_otg->fsm.id = 1; |
924 | } else { | 934 | } else { |
925 | p_otg->otg.state = OTG_STATE_A_IDLE; | 935 | p_otg->phy.state = OTG_STATE_A_IDLE; |
926 | p_otg->fsm.id = 0; | 936 | p_otg->fsm.id = 0; |
927 | } | 937 | } |
928 | 938 | ||
@@ -978,7 +988,7 @@ static int show_fsl_usb2_otg_state(struct device *dev, | |||
978 | /* State */ | 988 | /* State */ |
979 | t = scnprintf(next, size, | 989 | t = scnprintf(next, size, |
980 | "OTG state: %s\n\n", | 990 | "OTG state: %s\n\n", |
981 | otg_state_string(fsl_otg_dev->otg.state)); | 991 | otg_state_string(fsl_otg_dev->phy.state)); |
982 | size -= t; | 992 | size -= t; |
983 | next += t; | 993 | next += t; |
984 | 994 | ||
@@ -1124,12 +1134,13 @@ static int __devexit fsl_otg_remove(struct platform_device *pdev) | |||
1124 | { | 1134 | { |
1125 | struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; | 1135 | struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; |
1126 | 1136 | ||
1127 | otg_set_transceiver(NULL); | 1137 | usb_set_transceiver(NULL); |
1128 | free_irq(fsl_otg_dev->irq, fsl_otg_dev); | 1138 | free_irq(fsl_otg_dev->irq, fsl_otg_dev); |
1129 | 1139 | ||
1130 | iounmap((void *)usb_dr_regs); | 1140 | iounmap((void *)usb_dr_regs); |
1131 | 1141 | ||
1132 | fsl_otg_uninit_timers(); | 1142 | fsl_otg_uninit_timers(); |
1143 | kfree(fsl_otg_dev->phy.otg); | ||
1133 | kfree(fsl_otg_dev); | 1144 | kfree(fsl_otg_dev); |
1134 | 1145 | ||
1135 | device_remove_file(&pdev->dev, &dev_attr_fsl_usb2_otg_state); | 1146 | device_remove_file(&pdev->dev, &dev_attr_fsl_usb2_otg_state); |
diff --git a/drivers/usb/otg/fsl_otg.h b/drivers/usb/otg/fsl_otg.h index 3f8ef731aac9..ca266280895d 100644 --- a/drivers/usb/otg/fsl_otg.h +++ b/drivers/usb/otg/fsl_otg.h | |||
@@ -369,7 +369,7 @@ inline struct fsl_otg_timer *otg_timer_initializer | |||
369 | } | 369 | } |
370 | 370 | ||
371 | struct fsl_otg { | 371 | struct fsl_otg { |
372 | struct otg_transceiver otg; | 372 | struct usb_phy phy; |
373 | struct otg_fsm fsm; | 373 | struct otg_fsm fsm; |
374 | struct usb_dr_mmap *dr_mem_map; | 374 | struct usb_dr_mmap *dr_mem_map; |
375 | struct delayed_work otg_event; | 375 | struct delayed_work otg_event; |
diff --git a/drivers/usb/otg/gpio_vbus.c b/drivers/usb/otg/gpio_vbus.c index fb644c107ded..3ece43a2e4c1 100644 --- a/drivers/usb/otg/gpio_vbus.c +++ b/drivers/usb/otg/gpio_vbus.c | |||
@@ -32,7 +32,7 @@ | |||
32 | * Needs to be loaded before the UDC driver that will use it. | 32 | * Needs to be loaded before the UDC driver that will use it. |
33 | */ | 33 | */ |
34 | struct gpio_vbus_data { | 34 | struct gpio_vbus_data { |
35 | struct otg_transceiver otg; | 35 | struct usb_phy phy; |
36 | struct device *dev; | 36 | struct device *dev; |
37 | struct regulator *vbus_draw; | 37 | struct regulator *vbus_draw; |
38 | int vbus_draw_enabled; | 38 | int vbus_draw_enabled; |
@@ -98,7 +98,7 @@ static void gpio_vbus_work(struct work_struct *work) | |||
98 | struct gpio_vbus_mach_info *pdata = gpio_vbus->dev->platform_data; | 98 | struct gpio_vbus_mach_info *pdata = gpio_vbus->dev->platform_data; |
99 | int gpio; | 99 | int gpio; |
100 | 100 | ||
101 | if (!gpio_vbus->otg.gadget) | 101 | if (!gpio_vbus->phy.otg->gadget) |
102 | return; | 102 | return; |
103 | 103 | ||
104 | /* Peripheral controllers which manage the pullup themselves won't have | 104 | /* Peripheral controllers which manage the pullup themselves won't have |
@@ -108,8 +108,8 @@ static void gpio_vbus_work(struct work_struct *work) | |||
108 | */ | 108 | */ |
109 | gpio = pdata->gpio_pullup; | 109 | gpio = pdata->gpio_pullup; |
110 | if (is_vbus_powered(pdata)) { | 110 | if (is_vbus_powered(pdata)) { |
111 | gpio_vbus->otg.state = OTG_STATE_B_PERIPHERAL; | 111 | gpio_vbus->phy.state = OTG_STATE_B_PERIPHERAL; |
112 | usb_gadget_vbus_connect(gpio_vbus->otg.gadget); | 112 | usb_gadget_vbus_connect(gpio_vbus->phy.otg->gadget); |
113 | 113 | ||
114 | /* drawing a "unit load" is *always* OK, except for OTG */ | 114 | /* drawing a "unit load" is *always* OK, except for OTG */ |
115 | set_vbus_draw(gpio_vbus, 100); | 115 | set_vbus_draw(gpio_vbus, 100); |
@@ -124,8 +124,8 @@ static void gpio_vbus_work(struct work_struct *work) | |||
124 | 124 | ||
125 | set_vbus_draw(gpio_vbus, 0); | 125 | set_vbus_draw(gpio_vbus, 0); |
126 | 126 | ||
127 | usb_gadget_vbus_disconnect(gpio_vbus->otg.gadget); | 127 | usb_gadget_vbus_disconnect(gpio_vbus->phy.otg->gadget); |
128 | gpio_vbus->otg.state = OTG_STATE_B_IDLE; | 128 | gpio_vbus->phy.state = OTG_STATE_B_IDLE; |
129 | } | 129 | } |
130 | } | 130 | } |
131 | 131 | ||
@@ -135,12 +135,13 @@ static irqreturn_t gpio_vbus_irq(int irq, void *data) | |||
135 | struct platform_device *pdev = data; | 135 | struct platform_device *pdev = data; |
136 | struct gpio_vbus_mach_info *pdata = pdev->dev.platform_data; | 136 | struct gpio_vbus_mach_info *pdata = pdev->dev.platform_data; |
137 | struct gpio_vbus_data *gpio_vbus = platform_get_drvdata(pdev); | 137 | struct gpio_vbus_data *gpio_vbus = platform_get_drvdata(pdev); |
138 | struct usb_otg *otg = gpio_vbus->phy.otg; | ||
138 | 139 | ||
139 | dev_dbg(&pdev->dev, "VBUS %s (gadget: %s)\n", | 140 | dev_dbg(&pdev->dev, "VBUS %s (gadget: %s)\n", |
140 | is_vbus_powered(pdata) ? "supplied" : "inactive", | 141 | is_vbus_powered(pdata) ? "supplied" : "inactive", |
141 | gpio_vbus->otg.gadget ? gpio_vbus->otg.gadget->name : "none"); | 142 | otg->gadget ? otg->gadget->name : "none"); |
142 | 143 | ||
143 | if (gpio_vbus->otg.gadget) | 144 | if (otg->gadget) |
144 | schedule_work(&gpio_vbus->work); | 145 | schedule_work(&gpio_vbus->work); |
145 | 146 | ||
146 | return IRQ_HANDLED; | 147 | return IRQ_HANDLED; |
@@ -149,15 +150,15 @@ static irqreturn_t gpio_vbus_irq(int irq, void *data) | |||
149 | /* OTG transceiver interface */ | 150 | /* OTG transceiver interface */ |
150 | 151 | ||
151 | /* bind/unbind the peripheral controller */ | 152 | /* bind/unbind the peripheral controller */ |
152 | static int gpio_vbus_set_peripheral(struct otg_transceiver *otg, | 153 | static int gpio_vbus_set_peripheral(struct usb_otg *otg, |
153 | struct usb_gadget *gadget) | 154 | struct usb_gadget *gadget) |
154 | { | 155 | { |
155 | struct gpio_vbus_data *gpio_vbus; | 156 | struct gpio_vbus_data *gpio_vbus; |
156 | struct gpio_vbus_mach_info *pdata; | 157 | struct gpio_vbus_mach_info *pdata; |
157 | struct platform_device *pdev; | 158 | struct platform_device *pdev; |
158 | int gpio, irq; | 159 | int gpio, irq; |
159 | 160 | ||
160 | gpio_vbus = container_of(otg, struct gpio_vbus_data, otg); | 161 | gpio_vbus = container_of(otg->phy, struct gpio_vbus_data, phy); |
161 | pdev = to_platform_device(gpio_vbus->dev); | 162 | pdev = to_platform_device(gpio_vbus->dev); |
162 | pdata = gpio_vbus->dev->platform_data; | 163 | pdata = gpio_vbus->dev->platform_data; |
163 | irq = gpio_to_irq(pdata->gpio_vbus); | 164 | irq = gpio_to_irq(pdata->gpio_vbus); |
@@ -174,7 +175,7 @@ static int gpio_vbus_set_peripheral(struct otg_transceiver *otg, | |||
174 | set_vbus_draw(gpio_vbus, 0); | 175 | set_vbus_draw(gpio_vbus, 0); |
175 | 176 | ||
176 | usb_gadget_vbus_disconnect(otg->gadget); | 177 | usb_gadget_vbus_disconnect(otg->gadget); |
177 | otg->state = OTG_STATE_UNDEFINED; | 178 | otg->phy->state = OTG_STATE_UNDEFINED; |
178 | 179 | ||
179 | otg->gadget = NULL; | 180 | otg->gadget = NULL; |
180 | return 0; | 181 | return 0; |
@@ -189,23 +190,23 @@ static int gpio_vbus_set_peripheral(struct otg_transceiver *otg, | |||
189 | } | 190 | } |
190 | 191 | ||
191 | /* effective for B devices, ignored for A-peripheral */ | 192 | /* effective for B devices, ignored for A-peripheral */ |
192 | static int gpio_vbus_set_power(struct otg_transceiver *otg, unsigned mA) | 193 | static int gpio_vbus_set_power(struct usb_phy *phy, unsigned mA) |
193 | { | 194 | { |
194 | struct gpio_vbus_data *gpio_vbus; | 195 | struct gpio_vbus_data *gpio_vbus; |
195 | 196 | ||
196 | gpio_vbus = container_of(otg, struct gpio_vbus_data, otg); | 197 | gpio_vbus = container_of(phy, struct gpio_vbus_data, phy); |
197 | 198 | ||
198 | if (otg->state == OTG_STATE_B_PERIPHERAL) | 199 | if (phy->state == OTG_STATE_B_PERIPHERAL) |
199 | set_vbus_draw(gpio_vbus, mA); | 200 | set_vbus_draw(gpio_vbus, mA); |
200 | return 0; | 201 | return 0; |
201 | } | 202 | } |
202 | 203 | ||
203 | /* for non-OTG B devices: set/clear transceiver suspend mode */ | 204 | /* for non-OTG B devices: set/clear transceiver suspend mode */ |
204 | static int gpio_vbus_set_suspend(struct otg_transceiver *otg, int suspend) | 205 | static int gpio_vbus_set_suspend(struct usb_phy *phy, int suspend) |
205 | { | 206 | { |
206 | struct gpio_vbus_data *gpio_vbus; | 207 | struct gpio_vbus_data *gpio_vbus; |
207 | 208 | ||
208 | gpio_vbus = container_of(otg, struct gpio_vbus_data, otg); | 209 | gpio_vbus = container_of(phy, struct gpio_vbus_data, phy); |
209 | 210 | ||
210 | /* draw max 0 mA from vbus in suspend mode; or the previously | 211 | /* draw max 0 mA from vbus in suspend mode; or the previously |
211 | * recorded amount of current if not suspended | 212 | * recorded amount of current if not suspended |
@@ -213,7 +214,7 @@ static int gpio_vbus_set_suspend(struct otg_transceiver *otg, int suspend) | |||
213 | * NOTE: high powered configs (mA > 100) may draw up to 2.5 mA | 214 | * NOTE: high powered configs (mA > 100) may draw up to 2.5 mA |
214 | * if they're wake-enabled ... we don't handle that yet. | 215 | * if they're wake-enabled ... we don't handle that yet. |
215 | */ | 216 | */ |
216 | return gpio_vbus_set_power(otg, suspend ? 0 : gpio_vbus->mA); | 217 | return gpio_vbus_set_power(phy, suspend ? 0 : gpio_vbus->mA); |
217 | } | 218 | } |
218 | 219 | ||
219 | /* platform driver interface */ | 220 | /* platform driver interface */ |
@@ -233,13 +234,21 @@ static int __init gpio_vbus_probe(struct platform_device *pdev) | |||
233 | if (!gpio_vbus) | 234 | if (!gpio_vbus) |
234 | return -ENOMEM; | 235 | return -ENOMEM; |
235 | 236 | ||
237 | gpio_vbus->phy.otg = kzalloc(sizeof(struct usb_otg), GFP_KERNEL); | ||
238 | if (!gpio_vbus->phy.otg) { | ||
239 | kfree(gpio_vbus); | ||
240 | return -ENOMEM; | ||
241 | } | ||
242 | |||
236 | platform_set_drvdata(pdev, gpio_vbus); | 243 | platform_set_drvdata(pdev, gpio_vbus); |
237 | gpio_vbus->dev = &pdev->dev; | 244 | gpio_vbus->dev = &pdev->dev; |
238 | gpio_vbus->otg.label = "gpio-vbus"; | 245 | gpio_vbus->phy.label = "gpio-vbus"; |
239 | gpio_vbus->otg.state = OTG_STATE_UNDEFINED; | 246 | gpio_vbus->phy.set_power = gpio_vbus_set_power; |
240 | gpio_vbus->otg.set_peripheral = gpio_vbus_set_peripheral; | 247 | gpio_vbus->phy.set_suspend = gpio_vbus_set_suspend; |
241 | gpio_vbus->otg.set_power = gpio_vbus_set_power; | 248 | gpio_vbus->phy.state = OTG_STATE_UNDEFINED; |
242 | gpio_vbus->otg.set_suspend = gpio_vbus_set_suspend; | 249 | |
250 | gpio_vbus->phy.otg->phy = &gpio_vbus->phy; | ||
251 | gpio_vbus->phy.otg->set_peripheral = gpio_vbus_set_peripheral; | ||
243 | 252 | ||
244 | err = gpio_request(gpio, "vbus_detect"); | 253 | err = gpio_request(gpio, "vbus_detect"); |
245 | if (err) { | 254 | if (err) { |
@@ -288,7 +297,7 @@ static int __init gpio_vbus_probe(struct platform_device *pdev) | |||
288 | } | 297 | } |
289 | 298 | ||
290 | /* only active when a gadget is registered */ | 299 | /* only active when a gadget is registered */ |
291 | err = otg_set_transceiver(&gpio_vbus->otg); | 300 | err = usb_set_transceiver(&gpio_vbus->phy); |
292 | if (err) { | 301 | if (err) { |
293 | dev_err(&pdev->dev, "can't register transceiver, err: %d\n", | 302 | dev_err(&pdev->dev, "can't register transceiver, err: %d\n", |
294 | err); | 303 | err); |
@@ -304,6 +313,7 @@ err_irq: | |||
304 | gpio_free(pdata->gpio_vbus); | 313 | gpio_free(pdata->gpio_vbus); |
305 | err_gpio: | 314 | err_gpio: |
306 | platform_set_drvdata(pdev, NULL); | 315 | platform_set_drvdata(pdev, NULL); |
316 | kfree(gpio_vbus->phy.otg); | ||
307 | kfree(gpio_vbus); | 317 | kfree(gpio_vbus); |
308 | return err; | 318 | return err; |
309 | } | 319 | } |
@@ -316,13 +326,14 @@ static int __exit gpio_vbus_remove(struct platform_device *pdev) | |||
316 | 326 | ||
317 | regulator_put(gpio_vbus->vbus_draw); | 327 | regulator_put(gpio_vbus->vbus_draw); |
318 | 328 | ||
319 | otg_set_transceiver(NULL); | 329 | usb_set_transceiver(NULL); |
320 | 330 | ||
321 | free_irq(gpio_to_irq(gpio), &pdev->dev); | 331 | free_irq(gpio_to_irq(gpio), &pdev->dev); |
322 | if (gpio_is_valid(pdata->gpio_pullup)) | 332 | if (gpio_is_valid(pdata->gpio_pullup)) |
323 | gpio_free(pdata->gpio_pullup); | 333 | gpio_free(pdata->gpio_pullup); |
324 | gpio_free(gpio); | 334 | gpio_free(gpio); |
325 | platform_set_drvdata(pdev, NULL); | 335 | platform_set_drvdata(pdev, NULL); |
336 | kfree(gpio_vbus->phy.otg); | ||
326 | kfree(gpio_vbus); | 337 | kfree(gpio_vbus); |
327 | 338 | ||
328 | return 0; | 339 | return 0; |
diff --git a/drivers/usb/otg/isp1301_omap.c b/drivers/usb/otg/isp1301_omap.c index 8c86787c2f09..70cf5d7bca48 100644 --- a/drivers/usb/otg/isp1301_omap.c +++ b/drivers/usb/otg/isp1301_omap.c | |||
@@ -52,7 +52,7 @@ MODULE_DESCRIPTION("ISP1301 USB OTG Transceiver Driver"); | |||
52 | MODULE_LICENSE("GPL"); | 52 | MODULE_LICENSE("GPL"); |
53 | 53 | ||
54 | struct isp1301 { | 54 | struct isp1301 { |
55 | struct otg_transceiver otg; | 55 | struct usb_phy phy; |
56 | struct i2c_client *client; | 56 | struct i2c_client *client; |
57 | void (*i2c_release)(struct device *dev); | 57 | void (*i2c_release)(struct device *dev); |
58 | 58 | ||
@@ -236,7 +236,7 @@ isp1301_clear_bits(struct isp1301 *isp, u8 reg, u8 bits) | |||
236 | 236 | ||
237 | static inline const char *state_name(struct isp1301 *isp) | 237 | static inline const char *state_name(struct isp1301 *isp) |
238 | { | 238 | { |
239 | return otg_state_string(isp->otg.state); | 239 | return otg_state_string(isp->phy.state); |
240 | } | 240 | } |
241 | 241 | ||
242 | /*-------------------------------------------------------------------------*/ | 242 | /*-------------------------------------------------------------------------*/ |
@@ -251,7 +251,7 @@ static inline const char *state_name(struct isp1301 *isp) | |||
251 | 251 | ||
252 | static void power_down(struct isp1301 *isp) | 252 | static void power_down(struct isp1301 *isp) |
253 | { | 253 | { |
254 | isp->otg.state = OTG_STATE_UNDEFINED; | 254 | isp->phy.state = OTG_STATE_UNDEFINED; |
255 | 255 | ||
256 | // isp1301_set_bits(isp, ISP1301_MODE_CONTROL_2, MC2_GLOBAL_PWR_DN); | 256 | // isp1301_set_bits(isp, ISP1301_MODE_CONTROL_2, MC2_GLOBAL_PWR_DN); |
257 | isp1301_set_bits(isp, ISP1301_MODE_CONTROL_1, MC1_SUSPEND); | 257 | isp1301_set_bits(isp, ISP1301_MODE_CONTROL_1, MC1_SUSPEND); |
@@ -280,13 +280,13 @@ static int host_suspend(struct isp1301 *isp) | |||
280 | #else | 280 | #else |
281 | struct device *dev; | 281 | struct device *dev; |
282 | 282 | ||
283 | if (!isp->otg.host) | 283 | if (!isp->phy.otg->host) |
284 | return -ENODEV; | 284 | return -ENODEV; |
285 | 285 | ||
286 | /* Currently ASSUMES only the OTG port matters; | 286 | /* Currently ASSUMES only the OTG port matters; |
287 | * other ports could be active... | 287 | * other ports could be active... |
288 | */ | 288 | */ |
289 | dev = isp->otg.host->controller; | 289 | dev = isp->phy.otg->host->controller; |
290 | return dev->driver->suspend(dev, 3, 0); | 290 | return dev->driver->suspend(dev, 3, 0); |
291 | #endif | 291 | #endif |
292 | } | 292 | } |
@@ -298,20 +298,20 @@ static int host_resume(struct isp1301 *isp) | |||
298 | #else | 298 | #else |
299 | struct device *dev; | 299 | struct device *dev; |
300 | 300 | ||
301 | if (!isp->otg.host) | 301 | if (!isp->phy.otg->host) |
302 | return -ENODEV; | 302 | return -ENODEV; |
303 | 303 | ||
304 | dev = isp->otg.host->controller; | 304 | dev = isp->phy.otg->host->controller; |
305 | return dev->driver->resume(dev, 0); | 305 | return dev->driver->resume(dev, 0); |
306 | #endif | 306 | #endif |
307 | } | 307 | } |
308 | 308 | ||
309 | static int gadget_suspend(struct isp1301 *isp) | 309 | static int gadget_suspend(struct isp1301 *isp) |
310 | { | 310 | { |
311 | isp->otg.gadget->b_hnp_enable = 0; | 311 | isp->phy.otg->gadget->b_hnp_enable = 0; |
312 | isp->otg.gadget->a_hnp_support = 0; | 312 | isp->phy.otg->gadget->a_hnp_support = 0; |
313 | isp->otg.gadget->a_alt_hnp_support = 0; | 313 | isp->phy.otg->gadget->a_alt_hnp_support = 0; |
314 | return usb_gadget_vbus_disconnect(isp->otg.gadget); | 314 | return usb_gadget_vbus_disconnect(isp->phy.otg->gadget); |
315 | } | 315 | } |
316 | 316 | ||
317 | /*-------------------------------------------------------------------------*/ | 317 | /*-------------------------------------------------------------------------*/ |
@@ -341,19 +341,19 @@ static void a_idle(struct isp1301 *isp, const char *tag) | |||
341 | { | 341 | { |
342 | u32 l; | 342 | u32 l; |
343 | 343 | ||
344 | if (isp->otg.state == OTG_STATE_A_IDLE) | 344 | if (isp->phy.state == OTG_STATE_A_IDLE) |
345 | return; | 345 | return; |
346 | 346 | ||
347 | isp->otg.default_a = 1; | 347 | isp->phy.otg->default_a = 1; |
348 | if (isp->otg.host) { | 348 | if (isp->phy.otg->host) { |
349 | isp->otg.host->is_b_host = 0; | 349 | isp->phy.otg->host->is_b_host = 0; |
350 | host_suspend(isp); | 350 | host_suspend(isp); |
351 | } | 351 | } |
352 | if (isp->otg.gadget) { | 352 | if (isp->phy.otg->gadget) { |
353 | isp->otg.gadget->is_a_peripheral = 1; | 353 | isp->phy.otg->gadget->is_a_peripheral = 1; |
354 | gadget_suspend(isp); | 354 | gadget_suspend(isp); |
355 | } | 355 | } |
356 | isp->otg.state = OTG_STATE_A_IDLE; | 356 | isp->phy.state = OTG_STATE_A_IDLE; |
357 | l = omap_readl(OTG_CTRL) & OTG_XCEIV_OUTPUTS; | 357 | l = omap_readl(OTG_CTRL) & OTG_XCEIV_OUTPUTS; |
358 | omap_writel(l, OTG_CTRL); | 358 | omap_writel(l, OTG_CTRL); |
359 | isp->last_otg_ctrl = l; | 359 | isp->last_otg_ctrl = l; |
@@ -365,19 +365,19 @@ static void b_idle(struct isp1301 *isp, const char *tag) | |||
365 | { | 365 | { |
366 | u32 l; | 366 | u32 l; |
367 | 367 | ||
368 | if (isp->otg.state == OTG_STATE_B_IDLE) | 368 | if (isp->phy.state == OTG_STATE_B_IDLE) |
369 | return; | 369 | return; |
370 | 370 | ||
371 | isp->otg.default_a = 0; | 371 | isp->phy.otg->default_a = 0; |
372 | if (isp->otg.host) { | 372 | if (isp->phy.otg->host) { |
373 | isp->otg.host->is_b_host = 1; | 373 | isp->phy.otg->host->is_b_host = 1; |
374 | host_suspend(isp); | 374 | host_suspend(isp); |
375 | } | 375 | } |
376 | if (isp->otg.gadget) { | 376 | if (isp->phy.otg->gadget) { |
377 | isp->otg.gadget->is_a_peripheral = 0; | 377 | isp->phy.otg->gadget->is_a_peripheral = 0; |
378 | gadget_suspend(isp); | 378 | gadget_suspend(isp); |
379 | } | 379 | } |
380 | isp->otg.state = OTG_STATE_B_IDLE; | 380 | isp->phy.state = OTG_STATE_B_IDLE; |
381 | l = omap_readl(OTG_CTRL) & OTG_XCEIV_OUTPUTS; | 381 | l = omap_readl(OTG_CTRL) & OTG_XCEIV_OUTPUTS; |
382 | omap_writel(l, OTG_CTRL); | 382 | omap_writel(l, OTG_CTRL); |
383 | isp->last_otg_ctrl = l; | 383 | isp->last_otg_ctrl = l; |
@@ -478,7 +478,7 @@ static void check_state(struct isp1301 *isp, const char *tag) | |||
478 | default: | 478 | default: |
479 | break; | 479 | break; |
480 | } | 480 | } |
481 | if (isp->otg.state == state && !extra) | 481 | if (isp->phy.state == state && !extra) |
482 | return; | 482 | return; |
483 | pr_debug("otg: %s FSM %s/%02x, %s, %06x\n", tag, | 483 | pr_debug("otg: %s FSM %s/%02x, %s, %06x\n", tag, |
484 | otg_state_string(state), fsm, state_name(isp), | 484 | otg_state_string(state), fsm, state_name(isp), |
@@ -502,22 +502,23 @@ static void update_otg1(struct isp1301 *isp, u8 int_src) | |||
502 | 502 | ||
503 | if (int_src & INTR_SESS_VLD) | 503 | if (int_src & INTR_SESS_VLD) |
504 | otg_ctrl |= OTG_ASESSVLD; | 504 | otg_ctrl |= OTG_ASESSVLD; |
505 | else if (isp->otg.state == OTG_STATE_A_WAIT_VFALL) { | 505 | else if (isp->phy.state == OTG_STATE_A_WAIT_VFALL) { |
506 | a_idle(isp, "vfall"); | 506 | a_idle(isp, "vfall"); |
507 | otg_ctrl &= ~OTG_CTRL_BITS; | 507 | otg_ctrl &= ~OTG_CTRL_BITS; |
508 | } | 508 | } |
509 | if (int_src & INTR_VBUS_VLD) | 509 | if (int_src & INTR_VBUS_VLD) |
510 | otg_ctrl |= OTG_VBUSVLD; | 510 | otg_ctrl |= OTG_VBUSVLD; |
511 | if (int_src & INTR_ID_GND) { /* default-A */ | 511 | if (int_src & INTR_ID_GND) { /* default-A */ |
512 | if (isp->otg.state == OTG_STATE_B_IDLE | 512 | if (isp->phy.state == OTG_STATE_B_IDLE |
513 | || isp->otg.state == OTG_STATE_UNDEFINED) { | 513 | || isp->phy.state |
514 | == OTG_STATE_UNDEFINED) { | ||
514 | a_idle(isp, "init"); | 515 | a_idle(isp, "init"); |
515 | return; | 516 | return; |
516 | } | 517 | } |
517 | } else { /* default-B */ | 518 | } else { /* default-B */ |
518 | otg_ctrl |= OTG_ID; | 519 | otg_ctrl |= OTG_ID; |
519 | if (isp->otg.state == OTG_STATE_A_IDLE | 520 | if (isp->phy.state == OTG_STATE_A_IDLE |
520 | || isp->otg.state == OTG_STATE_UNDEFINED) { | 521 | || isp->phy.state == OTG_STATE_UNDEFINED) { |
521 | b_idle(isp, "init"); | 522 | b_idle(isp, "init"); |
522 | return; | 523 | return; |
523 | } | 524 | } |
@@ -551,14 +552,14 @@ static void otg_update_isp(struct isp1301 *isp) | |||
551 | isp->last_otg_ctrl = otg_ctrl; | 552 | isp->last_otg_ctrl = otg_ctrl; |
552 | otg_ctrl = otg_ctrl & OTG_XCEIV_INPUTS; | 553 | otg_ctrl = otg_ctrl & OTG_XCEIV_INPUTS; |
553 | 554 | ||
554 | switch (isp->otg.state) { | 555 | switch (isp->phy.state) { |
555 | case OTG_STATE_B_IDLE: | 556 | case OTG_STATE_B_IDLE: |
556 | case OTG_STATE_B_PERIPHERAL: | 557 | case OTG_STATE_B_PERIPHERAL: |
557 | case OTG_STATE_B_SRP_INIT: | 558 | case OTG_STATE_B_SRP_INIT: |
558 | if (!(otg_ctrl & OTG_PULLUP)) { | 559 | if (!(otg_ctrl & OTG_PULLUP)) { |
559 | // if (otg_ctrl & OTG_B_HNPEN) { | 560 | // if (otg_ctrl & OTG_B_HNPEN) { |
560 | if (isp->otg.gadget->b_hnp_enable) { | 561 | if (isp->phy.otg->gadget->b_hnp_enable) { |
561 | isp->otg.state = OTG_STATE_B_WAIT_ACON; | 562 | isp->phy.state = OTG_STATE_B_WAIT_ACON; |
562 | pr_debug(" --> b_wait_acon\n"); | 563 | pr_debug(" --> b_wait_acon\n"); |
563 | } | 564 | } |
564 | goto pulldown; | 565 | goto pulldown; |
@@ -585,10 +586,10 @@ pulldown: | |||
585 | else clr |= ISP; \ | 586 | else clr |= ISP; \ |
586 | } while (0) | 587 | } while (0) |
587 | 588 | ||
588 | if (!(isp->otg.host)) | 589 | if (!(isp->phy.otg->host)) |
589 | otg_ctrl &= ~OTG_DRV_VBUS; | 590 | otg_ctrl &= ~OTG_DRV_VBUS; |
590 | 591 | ||
591 | switch (isp->otg.state) { | 592 | switch (isp->phy.state) { |
592 | case OTG_STATE_A_SUSPEND: | 593 | case OTG_STATE_A_SUSPEND: |
593 | if (otg_ctrl & OTG_DRV_VBUS) { | 594 | if (otg_ctrl & OTG_DRV_VBUS) { |
594 | set |= OTG1_VBUS_DRV; | 595 | set |= OTG1_VBUS_DRV; |
@@ -599,7 +600,7 @@ pulldown: | |||
599 | 600 | ||
600 | /* FALLTHROUGH */ | 601 | /* FALLTHROUGH */ |
601 | case OTG_STATE_A_VBUS_ERR: | 602 | case OTG_STATE_A_VBUS_ERR: |
602 | isp->otg.state = OTG_STATE_A_WAIT_VFALL; | 603 | isp->phy.state = OTG_STATE_A_WAIT_VFALL; |
603 | pr_debug(" --> a_wait_vfall\n"); | 604 | pr_debug(" --> a_wait_vfall\n"); |
604 | /* FALLTHROUGH */ | 605 | /* FALLTHROUGH */ |
605 | case OTG_STATE_A_WAIT_VFALL: | 606 | case OTG_STATE_A_WAIT_VFALL: |
@@ -608,7 +609,7 @@ pulldown: | |||
608 | break; | 609 | break; |
609 | case OTG_STATE_A_IDLE: | 610 | case OTG_STATE_A_IDLE: |
610 | if (otg_ctrl & OTG_DRV_VBUS) { | 611 | if (otg_ctrl & OTG_DRV_VBUS) { |
611 | isp->otg.state = OTG_STATE_A_WAIT_VRISE; | 612 | isp->phy.state = OTG_STATE_A_WAIT_VRISE; |
612 | pr_debug(" --> a_wait_vrise\n"); | 613 | pr_debug(" --> a_wait_vrise\n"); |
613 | } | 614 | } |
614 | /* FALLTHROUGH */ | 615 | /* FALLTHROUGH */ |
@@ -628,17 +629,17 @@ pulldown: | |||
628 | if (otg_change & OTG_PULLUP) { | 629 | if (otg_change & OTG_PULLUP) { |
629 | u32 l; | 630 | u32 l; |
630 | 631 | ||
631 | switch (isp->otg.state) { | 632 | switch (isp->phy.state) { |
632 | case OTG_STATE_B_IDLE: | 633 | case OTG_STATE_B_IDLE: |
633 | if (clr & OTG1_DP_PULLUP) | 634 | if (clr & OTG1_DP_PULLUP) |
634 | break; | 635 | break; |
635 | isp->otg.state = OTG_STATE_B_PERIPHERAL; | 636 | isp->phy.state = OTG_STATE_B_PERIPHERAL; |
636 | pr_debug(" --> b_peripheral\n"); | 637 | pr_debug(" --> b_peripheral\n"); |
637 | break; | 638 | break; |
638 | case OTG_STATE_A_SUSPEND: | 639 | case OTG_STATE_A_SUSPEND: |
639 | if (clr & OTG1_DP_PULLUP) | 640 | if (clr & OTG1_DP_PULLUP) |
640 | break; | 641 | break; |
641 | isp->otg.state = OTG_STATE_A_PERIPHERAL; | 642 | isp->phy.state = OTG_STATE_A_PERIPHERAL; |
642 | pr_debug(" --> a_peripheral\n"); | 643 | pr_debug(" --> a_peripheral\n"); |
643 | break; | 644 | break; |
644 | default: | 645 | default: |
@@ -659,6 +660,7 @@ static irqreturn_t omap_otg_irq(int irq, void *_isp) | |||
659 | u32 otg_ctrl; | 660 | u32 otg_ctrl; |
660 | int ret = IRQ_NONE; | 661 | int ret = IRQ_NONE; |
661 | struct isp1301 *isp = _isp; | 662 | struct isp1301 *isp = _isp; |
663 | struct usb_otg *otg = isp->phy.otg; | ||
662 | 664 | ||
663 | /* update ISP1301 transceiver from OTG controller */ | 665 | /* update ISP1301 transceiver from OTG controller */ |
664 | if (otg_irq & OPRT_CHG) { | 666 | if (otg_irq & OPRT_CHG) { |
@@ -675,7 +677,7 @@ static irqreturn_t omap_otg_irq(int irq, void *_isp) | |||
675 | * remote wakeup (SRP, normal) using their own timer | 677 | * remote wakeup (SRP, normal) using their own timer |
676 | * to give "check cable and A-device" messages. | 678 | * to give "check cable and A-device" messages. |
677 | */ | 679 | */ |
678 | if (isp->otg.state == OTG_STATE_B_SRP_INIT) | 680 | if (isp->phy.state == OTG_STATE_B_SRP_INIT) |
679 | b_idle(isp, "srp_timeout"); | 681 | b_idle(isp, "srp_timeout"); |
680 | 682 | ||
681 | omap_writew(B_SRP_TMROUT, OTG_IRQ_SRC); | 683 | omap_writew(B_SRP_TMROUT, OTG_IRQ_SRC); |
@@ -693,7 +695,7 @@ static irqreturn_t omap_otg_irq(int irq, void *_isp) | |||
693 | omap_writel(otg_ctrl, OTG_CTRL); | 695 | omap_writel(otg_ctrl, OTG_CTRL); |
694 | 696 | ||
695 | /* subset of b_peripheral()... */ | 697 | /* subset of b_peripheral()... */ |
696 | isp->otg.state = OTG_STATE_B_PERIPHERAL; | 698 | isp->phy.state = OTG_STATE_B_PERIPHERAL; |
697 | pr_debug(" --> b_peripheral\n"); | 699 | pr_debug(" --> b_peripheral\n"); |
698 | 700 | ||
699 | omap_writew(B_HNP_FAIL, OTG_IRQ_SRC); | 701 | omap_writew(B_HNP_FAIL, OTG_IRQ_SRC); |
@@ -705,9 +707,9 @@ static irqreturn_t omap_otg_irq(int irq, void *_isp) | |||
705 | state_name(isp), omap_readl(OTG_CTRL)); | 707 | state_name(isp), omap_readl(OTG_CTRL)); |
706 | 708 | ||
707 | isp1301_defer_work(isp, WORK_UPDATE_OTG); | 709 | isp1301_defer_work(isp, WORK_UPDATE_OTG); |
708 | switch (isp->otg.state) { | 710 | switch (isp->phy.state) { |
709 | case OTG_STATE_A_IDLE: | 711 | case OTG_STATE_A_IDLE: |
710 | if (!isp->otg.host) | 712 | if (!otg->host) |
711 | break; | 713 | break; |
712 | isp1301_defer_work(isp, WORK_HOST_RESUME); | 714 | isp1301_defer_work(isp, WORK_HOST_RESUME); |
713 | otg_ctrl = omap_readl(OTG_CTRL); | 715 | otg_ctrl = omap_readl(OTG_CTRL); |
@@ -736,7 +738,7 @@ static irqreturn_t omap_otg_irq(int irq, void *_isp) | |||
736 | otg_ctrl |= OTG_BUSDROP; | 738 | otg_ctrl |= OTG_BUSDROP; |
737 | otg_ctrl &= ~OTG_A_BUSREQ & OTG_CTRL_MASK & ~OTG_XCEIV_INPUTS; | 739 | otg_ctrl &= ~OTG_A_BUSREQ & OTG_CTRL_MASK & ~OTG_XCEIV_INPUTS; |
738 | omap_writel(otg_ctrl, OTG_CTRL); | 740 | omap_writel(otg_ctrl, OTG_CTRL); |
739 | isp->otg.state = OTG_STATE_A_WAIT_VFALL; | 741 | isp->phy.state = OTG_STATE_A_WAIT_VFALL; |
740 | 742 | ||
741 | omap_writew(A_REQ_TMROUT, OTG_IRQ_SRC); | 743 | omap_writew(A_REQ_TMROUT, OTG_IRQ_SRC); |
742 | ret = IRQ_HANDLED; | 744 | ret = IRQ_HANDLED; |
@@ -750,7 +752,7 @@ static irqreturn_t omap_otg_irq(int irq, void *_isp) | |||
750 | otg_ctrl |= OTG_BUSDROP; | 752 | otg_ctrl |= OTG_BUSDROP; |
751 | otg_ctrl &= ~OTG_A_BUSREQ & OTG_CTRL_MASK & ~OTG_XCEIV_INPUTS; | 753 | otg_ctrl &= ~OTG_A_BUSREQ & OTG_CTRL_MASK & ~OTG_XCEIV_INPUTS; |
752 | omap_writel(otg_ctrl, OTG_CTRL); | 754 | omap_writel(otg_ctrl, OTG_CTRL); |
753 | isp->otg.state = OTG_STATE_A_VBUS_ERR; | 755 | isp->phy.state = OTG_STATE_A_VBUS_ERR; |
754 | 756 | ||
755 | omap_writew(A_VBUS_ERR, OTG_IRQ_SRC); | 757 | omap_writew(A_VBUS_ERR, OTG_IRQ_SRC); |
756 | ret = IRQ_HANDLED; | 758 | ret = IRQ_HANDLED; |
@@ -771,7 +773,7 @@ static irqreturn_t omap_otg_irq(int irq, void *_isp) | |||
771 | 773 | ||
772 | /* role is peripheral */ | 774 | /* role is peripheral */ |
773 | if (otg_ctrl & OTG_DRIVER_SEL) { | 775 | if (otg_ctrl & OTG_DRIVER_SEL) { |
774 | switch (isp->otg.state) { | 776 | switch (isp->phy.state) { |
775 | case OTG_STATE_A_IDLE: | 777 | case OTG_STATE_A_IDLE: |
776 | b_idle(isp, __func__); | 778 | b_idle(isp, __func__); |
777 | break; | 779 | break; |
@@ -787,19 +789,19 @@ static irqreturn_t omap_otg_irq(int irq, void *_isp) | |||
787 | omap_writel(otg_ctrl | OTG_A_BUSREQ, OTG_CTRL); | 789 | omap_writel(otg_ctrl | OTG_A_BUSREQ, OTG_CTRL); |
788 | } | 790 | } |
789 | 791 | ||
790 | if (isp->otg.host) { | 792 | if (otg->host) { |
791 | switch (isp->otg.state) { | 793 | switch (isp->phy.state) { |
792 | case OTG_STATE_B_WAIT_ACON: | 794 | case OTG_STATE_B_WAIT_ACON: |
793 | isp->otg.state = OTG_STATE_B_HOST; | 795 | isp->phy.state = OTG_STATE_B_HOST; |
794 | pr_debug(" --> b_host\n"); | 796 | pr_debug(" --> b_host\n"); |
795 | kick = 1; | 797 | kick = 1; |
796 | break; | 798 | break; |
797 | case OTG_STATE_A_WAIT_BCON: | 799 | case OTG_STATE_A_WAIT_BCON: |
798 | isp->otg.state = OTG_STATE_A_HOST; | 800 | isp->phy.state = OTG_STATE_A_HOST; |
799 | pr_debug(" --> a_host\n"); | 801 | pr_debug(" --> a_host\n"); |
800 | break; | 802 | break; |
801 | case OTG_STATE_A_PERIPHERAL: | 803 | case OTG_STATE_A_PERIPHERAL: |
802 | isp->otg.state = OTG_STATE_A_WAIT_BCON; | 804 | isp->phy.state = OTG_STATE_A_WAIT_BCON; |
803 | pr_debug(" --> a_wait_bcon\n"); | 805 | pr_debug(" --> a_wait_bcon\n"); |
804 | break; | 806 | break; |
805 | default: | 807 | default: |
@@ -813,8 +815,7 @@ static irqreturn_t omap_otg_irq(int irq, void *_isp) | |||
813 | ret = IRQ_HANDLED; | 815 | ret = IRQ_HANDLED; |
814 | 816 | ||
815 | if (kick) | 817 | if (kick) |
816 | usb_bus_start_enum(isp->otg.host, | 818 | usb_bus_start_enum(otg->host, otg->host->otg_port); |
817 | isp->otg.host->otg_port); | ||
818 | } | 819 | } |
819 | 820 | ||
820 | check_state(isp, __func__); | 821 | check_state(isp, __func__); |
@@ -930,7 +931,7 @@ static void b_peripheral(struct isp1301 *isp) | |||
930 | l = omap_readl(OTG_CTRL) & OTG_XCEIV_OUTPUTS; | 931 | l = omap_readl(OTG_CTRL) & OTG_XCEIV_OUTPUTS; |
931 | omap_writel(l, OTG_CTRL); | 932 | omap_writel(l, OTG_CTRL); |
932 | 933 | ||
933 | usb_gadget_vbus_connect(isp->otg.gadget); | 934 | usb_gadget_vbus_connect(isp->phy.otg->gadget); |
934 | 935 | ||
935 | #ifdef CONFIG_USB_OTG | 936 | #ifdef CONFIG_USB_OTG |
936 | enable_vbus_draw(isp, 8); | 937 | enable_vbus_draw(isp, 8); |
@@ -940,7 +941,7 @@ static void b_peripheral(struct isp1301 *isp) | |||
940 | /* UDC driver just set OTG_BSESSVLD */ | 941 | /* UDC driver just set OTG_BSESSVLD */ |
941 | isp1301_set_bits(isp, ISP1301_OTG_CONTROL_1, OTG1_DP_PULLUP); | 942 | isp1301_set_bits(isp, ISP1301_OTG_CONTROL_1, OTG1_DP_PULLUP); |
942 | isp1301_clear_bits(isp, ISP1301_OTG_CONTROL_1, OTG1_DP_PULLDOWN); | 943 | isp1301_clear_bits(isp, ISP1301_OTG_CONTROL_1, OTG1_DP_PULLDOWN); |
943 | isp->otg.state = OTG_STATE_B_PERIPHERAL; | 944 | isp->phy.state = OTG_STATE_B_PERIPHERAL; |
944 | pr_debug(" --> b_peripheral\n"); | 945 | pr_debug(" --> b_peripheral\n"); |
945 | dump_regs(isp, "2periph"); | 946 | dump_regs(isp, "2periph"); |
946 | #endif | 947 | #endif |
@@ -948,8 +949,9 @@ static void b_peripheral(struct isp1301 *isp) | |||
948 | 949 | ||
949 | static void isp_update_otg(struct isp1301 *isp, u8 stat) | 950 | static void isp_update_otg(struct isp1301 *isp, u8 stat) |
950 | { | 951 | { |
952 | struct usb_otg *otg = isp->phy.otg; | ||
951 | u8 isp_stat, isp_bstat; | 953 | u8 isp_stat, isp_bstat; |
952 | enum usb_otg_state state = isp->otg.state; | 954 | enum usb_otg_state state = isp->phy.state; |
953 | 955 | ||
954 | if (stat & INTR_BDIS_ACON) | 956 | if (stat & INTR_BDIS_ACON) |
955 | pr_debug("OTG: BDIS_ACON, %s\n", state_name(isp)); | 957 | pr_debug("OTG: BDIS_ACON, %s\n", state_name(isp)); |
@@ -957,7 +959,7 @@ static void isp_update_otg(struct isp1301 *isp, u8 stat) | |||
957 | /* start certain state transitions right away */ | 959 | /* start certain state transitions right away */ |
958 | isp_stat = isp1301_get_u8(isp, ISP1301_INTERRUPT_SOURCE); | 960 | isp_stat = isp1301_get_u8(isp, ISP1301_INTERRUPT_SOURCE); |
959 | if (isp_stat & INTR_ID_GND) { | 961 | if (isp_stat & INTR_ID_GND) { |
960 | if (isp->otg.default_a) { | 962 | if (otg->default_a) { |
961 | switch (state) { | 963 | switch (state) { |
962 | case OTG_STATE_B_IDLE: | 964 | case OTG_STATE_B_IDLE: |
963 | a_idle(isp, "idle"); | 965 | a_idle(isp, "idle"); |
@@ -972,7 +974,7 @@ static void isp_update_otg(struct isp1301 *isp, u8 stat) | |||
972 | * when HNP is used. | 974 | * when HNP is used. |
973 | */ | 975 | */ |
974 | if (isp_stat & INTR_VBUS_VLD) | 976 | if (isp_stat & INTR_VBUS_VLD) |
975 | isp->otg.state = OTG_STATE_A_HOST; | 977 | isp->phy.state = OTG_STATE_A_HOST; |
976 | break; | 978 | break; |
977 | case OTG_STATE_A_WAIT_VFALL: | 979 | case OTG_STATE_A_WAIT_VFALL: |
978 | if (!(isp_stat & INTR_SESS_VLD)) | 980 | if (!(isp_stat & INTR_SESS_VLD)) |
@@ -980,7 +982,7 @@ static void isp_update_otg(struct isp1301 *isp, u8 stat) | |||
980 | break; | 982 | break; |
981 | default: | 983 | default: |
982 | if (!(isp_stat & INTR_VBUS_VLD)) | 984 | if (!(isp_stat & INTR_VBUS_VLD)) |
983 | isp->otg.state = OTG_STATE_A_VBUS_ERR; | 985 | isp->phy.state = OTG_STATE_A_VBUS_ERR; |
984 | break; | 986 | break; |
985 | } | 987 | } |
986 | isp_bstat = isp1301_get_u8(isp, ISP1301_OTG_STATUS); | 988 | isp_bstat = isp1301_get_u8(isp, ISP1301_OTG_STATUS); |
@@ -989,14 +991,14 @@ static void isp_update_otg(struct isp1301 *isp, u8 stat) | |||
989 | case OTG_STATE_B_PERIPHERAL: | 991 | case OTG_STATE_B_PERIPHERAL: |
990 | case OTG_STATE_B_HOST: | 992 | case OTG_STATE_B_HOST: |
991 | case OTG_STATE_B_WAIT_ACON: | 993 | case OTG_STATE_B_WAIT_ACON: |
992 | usb_gadget_vbus_disconnect(isp->otg.gadget); | 994 | usb_gadget_vbus_disconnect(otg->gadget); |
993 | break; | 995 | break; |
994 | default: | 996 | default: |
995 | break; | 997 | break; |
996 | } | 998 | } |
997 | if (state != OTG_STATE_A_IDLE) | 999 | if (state != OTG_STATE_A_IDLE) |
998 | a_idle(isp, "id"); | 1000 | a_idle(isp, "id"); |
999 | if (isp->otg.host && state == OTG_STATE_A_IDLE) | 1001 | if (otg->host && state == OTG_STATE_A_IDLE) |
1000 | isp1301_defer_work(isp, WORK_HOST_RESUME); | 1002 | isp1301_defer_work(isp, WORK_HOST_RESUME); |
1001 | isp_bstat = 0; | 1003 | isp_bstat = 0; |
1002 | } | 1004 | } |
@@ -1006,10 +1008,10 @@ static void isp_update_otg(struct isp1301 *isp, u8 stat) | |||
1006 | /* if user unplugged mini-A end of cable, | 1008 | /* if user unplugged mini-A end of cable, |
1007 | * don't bypass A_WAIT_VFALL. | 1009 | * don't bypass A_WAIT_VFALL. |
1008 | */ | 1010 | */ |
1009 | if (isp->otg.default_a) { | 1011 | if (otg->default_a) { |
1010 | switch (state) { | 1012 | switch (state) { |
1011 | default: | 1013 | default: |
1012 | isp->otg.state = OTG_STATE_A_WAIT_VFALL; | 1014 | isp->phy.state = OTG_STATE_A_WAIT_VFALL; |
1013 | break; | 1015 | break; |
1014 | case OTG_STATE_A_WAIT_VFALL: | 1016 | case OTG_STATE_A_WAIT_VFALL: |
1015 | state = OTG_STATE_A_IDLE; | 1017 | state = OTG_STATE_A_IDLE; |
@@ -1022,7 +1024,7 @@ static void isp_update_otg(struct isp1301 *isp, u8 stat) | |||
1022 | host_suspend(isp); | 1024 | host_suspend(isp); |
1023 | isp1301_clear_bits(isp, ISP1301_MODE_CONTROL_1, | 1025 | isp1301_clear_bits(isp, ISP1301_MODE_CONTROL_1, |
1024 | MC1_BDIS_ACON_EN); | 1026 | MC1_BDIS_ACON_EN); |
1025 | isp->otg.state = OTG_STATE_B_IDLE; | 1027 | isp->phy.state = OTG_STATE_B_IDLE; |
1026 | l = omap_readl(OTG_CTRL) & OTG_CTRL_MASK; | 1028 | l = omap_readl(OTG_CTRL) & OTG_CTRL_MASK; |
1027 | l &= ~OTG_CTRL_BITS; | 1029 | l &= ~OTG_CTRL_BITS; |
1028 | omap_writel(l, OTG_CTRL); | 1030 | omap_writel(l, OTG_CTRL); |
@@ -1033,7 +1035,7 @@ static void isp_update_otg(struct isp1301 *isp, u8 stat) | |||
1033 | } | 1035 | } |
1034 | isp_bstat = isp1301_get_u8(isp, ISP1301_OTG_STATUS); | 1036 | isp_bstat = isp1301_get_u8(isp, ISP1301_OTG_STATUS); |
1035 | 1037 | ||
1036 | switch (isp->otg.state) { | 1038 | switch (isp->phy.state) { |
1037 | case OTG_STATE_B_PERIPHERAL: | 1039 | case OTG_STATE_B_PERIPHERAL: |
1038 | case OTG_STATE_B_WAIT_ACON: | 1040 | case OTG_STATE_B_WAIT_ACON: |
1039 | case OTG_STATE_B_HOST: | 1041 | case OTG_STATE_B_HOST: |
@@ -1055,7 +1057,7 @@ static void isp_update_otg(struct isp1301 *isp, u8 stat) | |||
1055 | omap_writel(l, OTG_CTRL); | 1057 | omap_writel(l, OTG_CTRL); |
1056 | /* FALLTHROUGH */ | 1058 | /* FALLTHROUGH */ |
1057 | case OTG_STATE_B_IDLE: | 1059 | case OTG_STATE_B_IDLE: |
1058 | if (isp->otg.gadget && (isp_bstat & OTG_B_SESS_VLD)) { | 1060 | if (otg->gadget && (isp_bstat & OTG_B_SESS_VLD)) { |
1059 | #ifdef CONFIG_USB_OTG | 1061 | #ifdef CONFIG_USB_OTG |
1060 | update_otg1(isp, isp_stat); | 1062 | update_otg1(isp, isp_stat); |
1061 | update_otg2(isp, isp_bstat); | 1063 | update_otg2(isp, isp_bstat); |
@@ -1073,7 +1075,7 @@ static void isp_update_otg(struct isp1301 *isp, u8 stat) | |||
1073 | } | 1075 | } |
1074 | } | 1076 | } |
1075 | 1077 | ||
1076 | if (state != isp->otg.state) | 1078 | if (state != isp->phy.state) |
1077 | pr_debug(" isp, %s -> %s\n", | 1079 | pr_debug(" isp, %s -> %s\n", |
1078 | otg_state_string(state), state_name(isp)); | 1080 | otg_state_string(state), state_name(isp)); |
1079 | 1081 | ||
@@ -1131,10 +1133,10 @@ isp1301_work(struct work_struct *work) | |||
1131 | * skip A_WAIT_VRISE; hc transitions invisibly | 1133 | * skip A_WAIT_VRISE; hc transitions invisibly |
1132 | * skip A_WAIT_BCON; same. | 1134 | * skip A_WAIT_BCON; same. |
1133 | */ | 1135 | */ |
1134 | switch (isp->otg.state) { | 1136 | switch (isp->phy.state) { |
1135 | case OTG_STATE_A_WAIT_BCON: | 1137 | case OTG_STATE_A_WAIT_BCON: |
1136 | case OTG_STATE_A_WAIT_VRISE: | 1138 | case OTG_STATE_A_WAIT_VRISE: |
1137 | isp->otg.state = OTG_STATE_A_HOST; | 1139 | isp->phy.state = OTG_STATE_A_HOST; |
1138 | pr_debug(" --> a_host\n"); | 1140 | pr_debug(" --> a_host\n"); |
1139 | otg_ctrl = omap_readl(OTG_CTRL); | 1141 | otg_ctrl = omap_readl(OTG_CTRL); |
1140 | otg_ctrl |= OTG_A_BUSREQ; | 1142 | otg_ctrl |= OTG_A_BUSREQ; |
@@ -1143,7 +1145,7 @@ isp1301_work(struct work_struct *work) | |||
1143 | omap_writel(otg_ctrl, OTG_CTRL); | 1145 | omap_writel(otg_ctrl, OTG_CTRL); |
1144 | break; | 1146 | break; |
1145 | case OTG_STATE_B_WAIT_ACON: | 1147 | case OTG_STATE_B_WAIT_ACON: |
1146 | isp->otg.state = OTG_STATE_B_HOST; | 1148 | isp->phy.state = OTG_STATE_B_HOST; |
1147 | pr_debug(" --> b_host (acon)\n"); | 1149 | pr_debug(" --> b_host (acon)\n"); |
1148 | break; | 1150 | break; |
1149 | case OTG_STATE_B_HOST: | 1151 | case OTG_STATE_B_HOST: |
@@ -1204,6 +1206,7 @@ static void isp1301_release(struct device *dev) | |||
1204 | /* ugly -- i2c hijacks our memory hook to wait_for_completion() */ | 1206 | /* ugly -- i2c hijacks our memory hook to wait_for_completion() */ |
1205 | if (isp->i2c_release) | 1207 | if (isp->i2c_release) |
1206 | isp->i2c_release(dev); | 1208 | isp->i2c_release(dev); |
1209 | kfree(isp->phy.otg); | ||
1207 | kfree (isp); | 1210 | kfree (isp); |
1208 | } | 1211 | } |
1209 | 1212 | ||
@@ -1274,9 +1277,9 @@ static int isp1301_otg_enable(struct isp1301 *isp) | |||
1274 | 1277 | ||
1275 | /* add or disable the host device+driver */ | 1278 | /* add or disable the host device+driver */ |
1276 | static int | 1279 | static int |
1277 | isp1301_set_host(struct otg_transceiver *otg, struct usb_bus *host) | 1280 | isp1301_set_host(struct usb_otg *otg, struct usb_bus *host) |
1278 | { | 1281 | { |
1279 | struct isp1301 *isp = container_of(otg, struct isp1301, otg); | 1282 | struct isp1301 *isp = container_of(otg->phy, struct isp1301, phy); |
1280 | 1283 | ||
1281 | if (!otg || isp != the_transceiver) | 1284 | if (!otg || isp != the_transceiver) |
1282 | return -ENODEV; | 1285 | return -ENODEV; |
@@ -1284,21 +1287,21 @@ isp1301_set_host(struct otg_transceiver *otg, struct usb_bus *host) | |||
1284 | if (!host) { | 1287 | if (!host) { |
1285 | omap_writew(0, OTG_IRQ_EN); | 1288 | omap_writew(0, OTG_IRQ_EN); |
1286 | power_down(isp); | 1289 | power_down(isp); |
1287 | isp->otg.host = NULL; | 1290 | otg->host = NULL; |
1288 | return 0; | 1291 | return 0; |
1289 | } | 1292 | } |
1290 | 1293 | ||
1291 | #ifdef CONFIG_USB_OTG | 1294 | #ifdef CONFIG_USB_OTG |
1292 | isp->otg.host = host; | 1295 | otg->host = host; |
1293 | dev_dbg(&isp->client->dev, "registered host\n"); | 1296 | dev_dbg(&isp->client->dev, "registered host\n"); |
1294 | host_suspend(isp); | 1297 | host_suspend(isp); |
1295 | if (isp->otg.gadget) | 1298 | if (otg->gadget) |
1296 | return isp1301_otg_enable(isp); | 1299 | return isp1301_otg_enable(isp); |
1297 | return 0; | 1300 | return 0; |
1298 | 1301 | ||
1299 | #elif !defined(CONFIG_USB_GADGET_OMAP) | 1302 | #elif !defined(CONFIG_USB_GADGET_OMAP) |
1300 | // FIXME update its refcount | 1303 | // FIXME update its refcount |
1301 | isp->otg.host = host; | 1304 | otg->host = host; |
1302 | 1305 | ||
1303 | power_up(isp); | 1306 | power_up(isp); |
1304 | 1307 | ||
@@ -1330,9 +1333,9 @@ isp1301_set_host(struct otg_transceiver *otg, struct usb_bus *host) | |||
1330 | } | 1333 | } |
1331 | 1334 | ||
1332 | static int | 1335 | static int |
1333 | isp1301_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *gadget) | 1336 | isp1301_set_peripheral(struct usb_otg *otg, struct usb_gadget *gadget) |
1334 | { | 1337 | { |
1335 | struct isp1301 *isp = container_of(otg, struct isp1301, otg); | 1338 | struct isp1301 *isp = container_of(otg->phy, struct isp1301, phy); |
1336 | #ifndef CONFIG_USB_OTG | 1339 | #ifndef CONFIG_USB_OTG |
1337 | u32 l; | 1340 | u32 l; |
1338 | #endif | 1341 | #endif |
@@ -1342,24 +1345,24 @@ isp1301_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *gadget) | |||
1342 | 1345 | ||
1343 | if (!gadget) { | 1346 | if (!gadget) { |
1344 | omap_writew(0, OTG_IRQ_EN); | 1347 | omap_writew(0, OTG_IRQ_EN); |
1345 | if (!isp->otg.default_a) | 1348 | if (!otg->default_a) |
1346 | enable_vbus_draw(isp, 0); | 1349 | enable_vbus_draw(isp, 0); |
1347 | usb_gadget_vbus_disconnect(isp->otg.gadget); | 1350 | usb_gadget_vbus_disconnect(otg->gadget); |
1348 | isp->otg.gadget = NULL; | 1351 | otg->gadget = NULL; |
1349 | power_down(isp); | 1352 | power_down(isp); |
1350 | return 0; | 1353 | return 0; |
1351 | } | 1354 | } |
1352 | 1355 | ||
1353 | #ifdef CONFIG_USB_OTG | 1356 | #ifdef CONFIG_USB_OTG |
1354 | isp->otg.gadget = gadget; | 1357 | otg->gadget = gadget; |
1355 | dev_dbg(&isp->client->dev, "registered gadget\n"); | 1358 | dev_dbg(&isp->client->dev, "registered gadget\n"); |
1356 | /* gadget driver may be suspended until vbus_connect () */ | 1359 | /* gadget driver may be suspended until vbus_connect () */ |
1357 | if (isp->otg.host) | 1360 | if (otg->host) |
1358 | return isp1301_otg_enable(isp); | 1361 | return isp1301_otg_enable(isp); |
1359 | return 0; | 1362 | return 0; |
1360 | 1363 | ||
1361 | #elif !defined(CONFIG_USB_OHCI_HCD) && !defined(CONFIG_USB_OHCI_HCD_MODULE) | 1364 | #elif !defined(CONFIG_USB_OHCI_HCD) && !defined(CONFIG_USB_OHCI_HCD_MODULE) |
1362 | isp->otg.gadget = gadget; | 1365 | otg->gadget = gadget; |
1363 | // FIXME update its refcount | 1366 | // FIXME update its refcount |
1364 | 1367 | ||
1365 | l = omap_readl(OTG_CTRL) & OTG_CTRL_MASK; | 1368 | l = omap_readl(OTG_CTRL) & OTG_CTRL_MASK; |
@@ -1368,7 +1371,7 @@ isp1301_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *gadget) | |||
1368 | omap_writel(l, OTG_CTRL); | 1371 | omap_writel(l, OTG_CTRL); |
1369 | 1372 | ||
1370 | power_up(isp); | 1373 | power_up(isp); |
1371 | isp->otg.state = OTG_STATE_B_IDLE; | 1374 | isp->phy.state = OTG_STATE_B_IDLE; |
1372 | 1375 | ||
1373 | if (machine_is_omap_h2() || machine_is_omap_h3()) | 1376 | if (machine_is_omap_h2() || machine_is_omap_h3()) |
1374 | isp1301_set_bits(isp, ISP1301_MODE_CONTROL_1, MC1_DAT_SE0); | 1377 | isp1301_set_bits(isp, ISP1301_MODE_CONTROL_1, MC1_DAT_SE0); |
@@ -1399,7 +1402,7 @@ isp1301_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *gadget) | |||
1399 | /*-------------------------------------------------------------------------*/ | 1402 | /*-------------------------------------------------------------------------*/ |
1400 | 1403 | ||
1401 | static int | 1404 | static int |
1402 | isp1301_set_power(struct otg_transceiver *dev, unsigned mA) | 1405 | isp1301_set_power(struct usb_phy *dev, unsigned mA) |
1403 | { | 1406 | { |
1404 | if (!the_transceiver) | 1407 | if (!the_transceiver) |
1405 | return -ENODEV; | 1408 | return -ENODEV; |
@@ -1409,13 +1412,13 @@ isp1301_set_power(struct otg_transceiver *dev, unsigned mA) | |||
1409 | } | 1412 | } |
1410 | 1413 | ||
1411 | static int | 1414 | static int |
1412 | isp1301_start_srp(struct otg_transceiver *dev) | 1415 | isp1301_start_srp(struct usb_otg *otg) |
1413 | { | 1416 | { |
1414 | struct isp1301 *isp = container_of(dev, struct isp1301, otg); | 1417 | struct isp1301 *isp = container_of(otg->phy, struct isp1301, phy); |
1415 | u32 otg_ctrl; | 1418 | u32 otg_ctrl; |
1416 | 1419 | ||
1417 | if (!dev || isp != the_transceiver | 1420 | if (!otg || isp != the_transceiver |
1418 | || isp->otg.state != OTG_STATE_B_IDLE) | 1421 | || isp->phy.state != OTG_STATE_B_IDLE) |
1419 | return -ENODEV; | 1422 | return -ENODEV; |
1420 | 1423 | ||
1421 | otg_ctrl = omap_readl(OTG_CTRL); | 1424 | otg_ctrl = omap_readl(OTG_CTRL); |
@@ -1425,7 +1428,7 @@ isp1301_start_srp(struct otg_transceiver *dev) | |||
1425 | otg_ctrl |= OTG_B_BUSREQ; | 1428 | otg_ctrl |= OTG_B_BUSREQ; |
1426 | otg_ctrl &= ~OTG_A_BUSREQ & OTG_CTRL_MASK; | 1429 | otg_ctrl &= ~OTG_A_BUSREQ & OTG_CTRL_MASK; |
1427 | omap_writel(otg_ctrl, OTG_CTRL); | 1430 | omap_writel(otg_ctrl, OTG_CTRL); |
1428 | isp->otg.state = OTG_STATE_B_SRP_INIT; | 1431 | isp->phy.state = OTG_STATE_B_SRP_INIT; |
1429 | 1432 | ||
1430 | pr_debug("otg: SRP, %s ... %06x\n", state_name(isp), | 1433 | pr_debug("otg: SRP, %s ... %06x\n", state_name(isp), |
1431 | omap_readl(OTG_CTRL)); | 1434 | omap_readl(OTG_CTRL)); |
@@ -1436,27 +1439,26 @@ isp1301_start_srp(struct otg_transceiver *dev) | |||
1436 | } | 1439 | } |
1437 | 1440 | ||
1438 | static int | 1441 | static int |
1439 | isp1301_start_hnp(struct otg_transceiver *dev) | 1442 | isp1301_start_hnp(struct usb_otg *otg) |
1440 | { | 1443 | { |
1441 | #ifdef CONFIG_USB_OTG | 1444 | #ifdef CONFIG_USB_OTG |
1442 | struct isp1301 *isp = container_of(dev, struct isp1301, otg); | 1445 | struct isp1301 *isp = container_of(otg->phy, struct isp1301, phy); |
1443 | u32 l; | 1446 | u32 l; |
1444 | 1447 | ||
1445 | if (!dev || isp != the_transceiver) | 1448 | if (!otg || isp != the_transceiver) |
1446 | return -ENODEV; | 1449 | return -ENODEV; |
1447 | if (isp->otg.default_a && (isp->otg.host == NULL | 1450 | if (otg->default_a && (otg->host == NULL || !otg->host->b_hnp_enable)) |
1448 | || !isp->otg.host->b_hnp_enable)) | ||
1449 | return -ENOTCONN; | 1451 | return -ENOTCONN; |
1450 | if (!isp->otg.default_a && (isp->otg.gadget == NULL | 1452 | if (!otg->default_a && (otg->gadget == NULL |
1451 | || !isp->otg.gadget->b_hnp_enable)) | 1453 | || !otg->gadget->b_hnp_enable)) |
1452 | return -ENOTCONN; | 1454 | return -ENOTCONN; |
1453 | 1455 | ||
1454 | /* We want hardware to manage most HNP protocol timings. | 1456 | /* We want hardware to manage most HNP protocol timings. |
1455 | * So do this part as early as possible... | 1457 | * So do this part as early as possible... |
1456 | */ | 1458 | */ |
1457 | switch (isp->otg.state) { | 1459 | switch (isp->phy.state) { |
1458 | case OTG_STATE_B_HOST: | 1460 | case OTG_STATE_B_HOST: |
1459 | isp->otg.state = OTG_STATE_B_PERIPHERAL; | 1461 | isp->phy.state = OTG_STATE_B_PERIPHERAL; |
1460 | /* caller will suspend next */ | 1462 | /* caller will suspend next */ |
1461 | break; | 1463 | break; |
1462 | case OTG_STATE_A_HOST: | 1464 | case OTG_STATE_A_HOST: |
@@ -1466,7 +1468,7 @@ isp1301_start_hnp(struct otg_transceiver *dev) | |||
1466 | MC1_BDIS_ACON_EN); | 1468 | MC1_BDIS_ACON_EN); |
1467 | #endif | 1469 | #endif |
1468 | /* caller must suspend then clear A_BUSREQ */ | 1470 | /* caller must suspend then clear A_BUSREQ */ |
1469 | usb_gadget_vbus_connect(isp->otg.gadget); | 1471 | usb_gadget_vbus_connect(otg->gadget); |
1470 | l = omap_readl(OTG_CTRL); | 1472 | l = omap_readl(OTG_CTRL); |
1471 | l |= OTG_A_SETB_HNPEN; | 1473 | l |= OTG_A_SETB_HNPEN; |
1472 | omap_writel(l, OTG_CTRL); | 1474 | omap_writel(l, OTG_CTRL); |
@@ -1503,6 +1505,12 @@ isp1301_probe(struct i2c_client *i2c, const struct i2c_device_id *id) | |||
1503 | if (!isp) | 1505 | if (!isp) |
1504 | return 0; | 1506 | return 0; |
1505 | 1507 | ||
1508 | isp->phy.otg = kzalloc(sizeof *isp->phy.otg, GFP_KERNEL); | ||
1509 | if (!isp->phy.otg) { | ||
1510 | kfree(isp); | ||
1511 | return 0; | ||
1512 | } | ||
1513 | |||
1506 | INIT_WORK(&isp->work, isp1301_work); | 1514 | INIT_WORK(&isp->work, isp1301_work); |
1507 | init_timer(&isp->timer); | 1515 | init_timer(&isp->timer); |
1508 | isp->timer.function = isp1301_timer; | 1516 | isp->timer.function = isp1301_timer; |
@@ -1576,14 +1584,15 @@ isp1301_probe(struct i2c_client *i2c, const struct i2c_device_id *id) | |||
1576 | goto fail; | 1584 | goto fail; |
1577 | } | 1585 | } |
1578 | 1586 | ||
1579 | isp->otg.dev = &i2c->dev; | 1587 | isp->phy.dev = &i2c->dev; |
1580 | isp->otg.label = DRIVER_NAME; | 1588 | isp->phy.label = DRIVER_NAME; |
1589 | isp->phy.set_power = isp1301_set_power, | ||
1581 | 1590 | ||
1582 | isp->otg.set_host = isp1301_set_host, | 1591 | isp->phy.otg->phy = &isp->phy; |
1583 | isp->otg.set_peripheral = isp1301_set_peripheral, | 1592 | isp->phy.otg->set_host = isp1301_set_host, |
1584 | isp->otg.set_power = isp1301_set_power, | 1593 | isp->phy.otg->set_peripheral = isp1301_set_peripheral, |
1585 | isp->otg.start_srp = isp1301_start_srp, | 1594 | isp->phy.otg->start_srp = isp1301_start_srp, |
1586 | isp->otg.start_hnp = isp1301_start_hnp, | 1595 | isp->phy.otg->start_hnp = isp1301_start_hnp, |
1587 | 1596 | ||
1588 | enable_vbus_draw(isp, 0); | 1597 | enable_vbus_draw(isp, 0); |
1589 | power_down(isp); | 1598 | power_down(isp); |
@@ -1601,7 +1610,7 @@ isp1301_probe(struct i2c_client *i2c, const struct i2c_device_id *id) | |||
1601 | dev_dbg(&i2c->dev, "scheduled timer, %d min\n", TIMER_MINUTES); | 1610 | dev_dbg(&i2c->dev, "scheduled timer, %d min\n", TIMER_MINUTES); |
1602 | #endif | 1611 | #endif |
1603 | 1612 | ||
1604 | status = otg_set_transceiver(&isp->otg); | 1613 | status = usb_set_transceiver(&isp->phy); |
1605 | if (status < 0) | 1614 | if (status < 0) |
1606 | dev_err(&i2c->dev, "can't register transceiver, %d\n", | 1615 | dev_err(&i2c->dev, "can't register transceiver, %d\n", |
1607 | status); | 1616 | status); |
@@ -1609,6 +1618,7 @@ isp1301_probe(struct i2c_client *i2c, const struct i2c_device_id *id) | |||
1609 | return 0; | 1618 | return 0; |
1610 | 1619 | ||
1611 | fail: | 1620 | fail: |
1621 | kfree(isp->phy.otg); | ||
1612 | kfree(isp); | 1622 | kfree(isp); |
1613 | return -ENODEV; | 1623 | return -ENODEV; |
1614 | } | 1624 | } |
@@ -1639,7 +1649,7 @@ subsys_initcall(isp_init); | |||
1639 | static void __exit isp_exit(void) | 1649 | static void __exit isp_exit(void) |
1640 | { | 1650 | { |
1641 | if (the_transceiver) | 1651 | if (the_transceiver) |
1642 | otg_set_transceiver(NULL); | 1652 | usb_set_transceiver(NULL); |
1643 | i2c_del_driver(&isp1301_driver); | 1653 | i2c_del_driver(&isp1301_driver); |
1644 | } | 1654 | } |
1645 | module_exit(isp_exit); | 1655 | module_exit(isp_exit); |
diff --git a/drivers/usb/otg/msm_otg.c b/drivers/usb/otg/msm_otg.c index b276f8fcdeba..1d0347c247d1 100644 --- a/drivers/usb/otg/msm_otg.c +++ b/drivers/usb/otg/msm_otg.c | |||
@@ -69,9 +69,9 @@ static int msm_hsusb_init_vddcx(struct msm_otg *motg, int init) | |||
69 | int ret = 0; | 69 | int ret = 0; |
70 | 70 | ||
71 | if (init) { | 71 | if (init) { |
72 | hsusb_vddcx = regulator_get(motg->otg.dev, "HSUSB_VDDCX"); | 72 | hsusb_vddcx = regulator_get(motg->phy.dev, "HSUSB_VDDCX"); |
73 | if (IS_ERR(hsusb_vddcx)) { | 73 | if (IS_ERR(hsusb_vddcx)) { |
74 | dev_err(motg->otg.dev, "unable to get hsusb vddcx\n"); | 74 | dev_err(motg->phy.dev, "unable to get hsusb vddcx\n"); |
75 | return PTR_ERR(hsusb_vddcx); | 75 | return PTR_ERR(hsusb_vddcx); |
76 | } | 76 | } |
77 | 77 | ||
@@ -79,7 +79,7 @@ static int msm_hsusb_init_vddcx(struct msm_otg *motg, int init) | |||
79 | USB_PHY_VDD_DIG_VOL_MIN, | 79 | USB_PHY_VDD_DIG_VOL_MIN, |
80 | USB_PHY_VDD_DIG_VOL_MAX); | 80 | USB_PHY_VDD_DIG_VOL_MAX); |
81 | if (ret) { | 81 | if (ret) { |
82 | dev_err(motg->otg.dev, "unable to set the voltage " | 82 | dev_err(motg->phy.dev, "unable to set the voltage " |
83 | "for hsusb vddcx\n"); | 83 | "for hsusb vddcx\n"); |
84 | regulator_put(hsusb_vddcx); | 84 | regulator_put(hsusb_vddcx); |
85 | return ret; | 85 | return ret; |
@@ -87,18 +87,18 @@ static int msm_hsusb_init_vddcx(struct msm_otg *motg, int init) | |||
87 | 87 | ||
88 | ret = regulator_enable(hsusb_vddcx); | 88 | ret = regulator_enable(hsusb_vddcx); |
89 | if (ret) { | 89 | if (ret) { |
90 | dev_err(motg->otg.dev, "unable to enable hsusb vddcx\n"); | 90 | dev_err(motg->phy.dev, "unable to enable hsusb vddcx\n"); |
91 | regulator_put(hsusb_vddcx); | 91 | regulator_put(hsusb_vddcx); |
92 | } | 92 | } |
93 | } else { | 93 | } else { |
94 | ret = regulator_set_voltage(hsusb_vddcx, 0, | 94 | ret = regulator_set_voltage(hsusb_vddcx, 0, |
95 | USB_PHY_VDD_DIG_VOL_MAX); | 95 | USB_PHY_VDD_DIG_VOL_MAX); |
96 | if (ret) | 96 | if (ret) |
97 | dev_err(motg->otg.dev, "unable to set the voltage " | 97 | dev_err(motg->phy.dev, "unable to set the voltage " |
98 | "for hsusb vddcx\n"); | 98 | "for hsusb vddcx\n"); |
99 | ret = regulator_disable(hsusb_vddcx); | 99 | ret = regulator_disable(hsusb_vddcx); |
100 | if (ret) | 100 | if (ret) |
101 | dev_err(motg->otg.dev, "unable to disable hsusb vddcx\n"); | 101 | dev_err(motg->phy.dev, "unable to disable hsusb vddcx\n"); |
102 | 102 | ||
103 | regulator_put(hsusb_vddcx); | 103 | regulator_put(hsusb_vddcx); |
104 | } | 104 | } |
@@ -111,40 +111,40 @@ static int msm_hsusb_ldo_init(struct msm_otg *motg, int init) | |||
111 | int rc = 0; | 111 | int rc = 0; |
112 | 112 | ||
113 | if (init) { | 113 | if (init) { |
114 | hsusb_3p3 = regulator_get(motg->otg.dev, "HSUSB_3p3"); | 114 | hsusb_3p3 = regulator_get(motg->phy.dev, "HSUSB_3p3"); |
115 | if (IS_ERR(hsusb_3p3)) { | 115 | if (IS_ERR(hsusb_3p3)) { |
116 | dev_err(motg->otg.dev, "unable to get hsusb 3p3\n"); | 116 | dev_err(motg->phy.dev, "unable to get hsusb 3p3\n"); |
117 | return PTR_ERR(hsusb_3p3); | 117 | return PTR_ERR(hsusb_3p3); |
118 | } | 118 | } |
119 | 119 | ||
120 | rc = regulator_set_voltage(hsusb_3p3, USB_PHY_3P3_VOL_MIN, | 120 | rc = regulator_set_voltage(hsusb_3p3, USB_PHY_3P3_VOL_MIN, |
121 | USB_PHY_3P3_VOL_MAX); | 121 | USB_PHY_3P3_VOL_MAX); |
122 | if (rc) { | 122 | if (rc) { |
123 | dev_err(motg->otg.dev, "unable to set voltage level " | 123 | dev_err(motg->phy.dev, "unable to set voltage level " |
124 | "for hsusb 3p3\n"); | 124 | "for hsusb 3p3\n"); |
125 | goto put_3p3; | 125 | goto put_3p3; |
126 | } | 126 | } |
127 | rc = regulator_enable(hsusb_3p3); | 127 | rc = regulator_enable(hsusb_3p3); |
128 | if (rc) { | 128 | if (rc) { |
129 | dev_err(motg->otg.dev, "unable to enable the hsusb 3p3\n"); | 129 | dev_err(motg->phy.dev, "unable to enable the hsusb 3p3\n"); |
130 | goto put_3p3; | 130 | goto put_3p3; |
131 | } | 131 | } |
132 | hsusb_1p8 = regulator_get(motg->otg.dev, "HSUSB_1p8"); | 132 | hsusb_1p8 = regulator_get(motg->phy.dev, "HSUSB_1p8"); |
133 | if (IS_ERR(hsusb_1p8)) { | 133 | if (IS_ERR(hsusb_1p8)) { |
134 | dev_err(motg->otg.dev, "unable to get hsusb 1p8\n"); | 134 | dev_err(motg->phy.dev, "unable to get hsusb 1p8\n"); |
135 | rc = PTR_ERR(hsusb_1p8); | 135 | rc = PTR_ERR(hsusb_1p8); |
136 | goto disable_3p3; | 136 | goto disable_3p3; |
137 | } | 137 | } |
138 | rc = regulator_set_voltage(hsusb_1p8, USB_PHY_1P8_VOL_MIN, | 138 | rc = regulator_set_voltage(hsusb_1p8, USB_PHY_1P8_VOL_MIN, |
139 | USB_PHY_1P8_VOL_MAX); | 139 | USB_PHY_1P8_VOL_MAX); |
140 | if (rc) { | 140 | if (rc) { |
141 | dev_err(motg->otg.dev, "unable to set voltage level " | 141 | dev_err(motg->phy.dev, "unable to set voltage level " |
142 | "for hsusb 1p8\n"); | 142 | "for hsusb 1p8\n"); |
143 | goto put_1p8; | 143 | goto put_1p8; |
144 | } | 144 | } |
145 | rc = regulator_enable(hsusb_1p8); | 145 | rc = regulator_enable(hsusb_1p8); |
146 | if (rc) { | 146 | if (rc) { |
147 | dev_err(motg->otg.dev, "unable to enable the hsusb 1p8\n"); | 147 | dev_err(motg->phy.dev, "unable to enable the hsusb 1p8\n"); |
148 | goto put_1p8; | 148 | goto put_1p8; |
149 | } | 149 | } |
150 | 150 | ||
@@ -235,9 +235,9 @@ static int msm_hsusb_ldo_set_mode(int on) | |||
235 | return ret < 0 ? ret : 0; | 235 | return ret < 0 ? ret : 0; |
236 | } | 236 | } |
237 | 237 | ||
238 | static int ulpi_read(struct otg_transceiver *otg, u32 reg) | 238 | static int ulpi_read(struct usb_phy *phy, u32 reg) |
239 | { | 239 | { |
240 | struct msm_otg *motg = container_of(otg, struct msm_otg, otg); | 240 | struct msm_otg *motg = container_of(phy, struct msm_otg, phy); |
241 | int cnt = 0; | 241 | int cnt = 0; |
242 | 242 | ||
243 | /* initiate read operation */ | 243 | /* initiate read operation */ |
@@ -253,16 +253,16 @@ static int ulpi_read(struct otg_transceiver *otg, u32 reg) | |||
253 | } | 253 | } |
254 | 254 | ||
255 | if (cnt >= ULPI_IO_TIMEOUT_USEC) { | 255 | if (cnt >= ULPI_IO_TIMEOUT_USEC) { |
256 | dev_err(otg->dev, "ulpi_read: timeout %08x\n", | 256 | dev_err(phy->dev, "ulpi_read: timeout %08x\n", |
257 | readl(USB_ULPI_VIEWPORT)); | 257 | readl(USB_ULPI_VIEWPORT)); |
258 | return -ETIMEDOUT; | 258 | return -ETIMEDOUT; |
259 | } | 259 | } |
260 | return ULPI_DATA_READ(readl(USB_ULPI_VIEWPORT)); | 260 | return ULPI_DATA_READ(readl(USB_ULPI_VIEWPORT)); |
261 | } | 261 | } |
262 | 262 | ||
263 | static int ulpi_write(struct otg_transceiver *otg, u32 val, u32 reg) | 263 | static int ulpi_write(struct usb_phy *phy, u32 val, u32 reg) |
264 | { | 264 | { |
265 | struct msm_otg *motg = container_of(otg, struct msm_otg, otg); | 265 | struct msm_otg *motg = container_of(phy, struct msm_otg, phy); |
266 | int cnt = 0; | 266 | int cnt = 0; |
267 | 267 | ||
268 | /* initiate write operation */ | 268 | /* initiate write operation */ |
@@ -279,13 +279,13 @@ static int ulpi_write(struct otg_transceiver *otg, u32 val, u32 reg) | |||
279 | } | 279 | } |
280 | 280 | ||
281 | if (cnt >= ULPI_IO_TIMEOUT_USEC) { | 281 | if (cnt >= ULPI_IO_TIMEOUT_USEC) { |
282 | dev_err(otg->dev, "ulpi_write: timeout\n"); | 282 | dev_err(phy->dev, "ulpi_write: timeout\n"); |
283 | return -ETIMEDOUT; | 283 | return -ETIMEDOUT; |
284 | } | 284 | } |
285 | return 0; | 285 | return 0; |
286 | } | 286 | } |
287 | 287 | ||
288 | static struct otg_io_access_ops msm_otg_io_ops = { | 288 | static struct usb_phy_io_ops msm_otg_io_ops = { |
289 | .read = ulpi_read, | 289 | .read = ulpi_read, |
290 | .write = ulpi_write, | 290 | .write = ulpi_write, |
291 | }; | 291 | }; |
@@ -299,9 +299,9 @@ static void ulpi_init(struct msm_otg *motg) | |||
299 | return; | 299 | return; |
300 | 300 | ||
301 | while (seq[0] >= 0) { | 301 | while (seq[0] >= 0) { |
302 | dev_vdbg(motg->otg.dev, "ulpi: write 0x%02x to 0x%02x\n", | 302 | dev_vdbg(motg->phy.dev, "ulpi: write 0x%02x to 0x%02x\n", |
303 | seq[0], seq[1]); | 303 | seq[0], seq[1]); |
304 | ulpi_write(&motg->otg, seq[0], seq[1]); | 304 | ulpi_write(&motg->phy, seq[0], seq[1]); |
305 | seq += 2; | 305 | seq += 2; |
306 | } | 306 | } |
307 | } | 307 | } |
@@ -313,11 +313,11 @@ static int msm_otg_link_clk_reset(struct msm_otg *motg, bool assert) | |||
313 | if (assert) { | 313 | if (assert) { |
314 | ret = clk_reset(motg->clk, CLK_RESET_ASSERT); | 314 | ret = clk_reset(motg->clk, CLK_RESET_ASSERT); |
315 | if (ret) | 315 | if (ret) |
316 | dev_err(motg->otg.dev, "usb hs_clk assert failed\n"); | 316 | dev_err(motg->phy.dev, "usb hs_clk assert failed\n"); |
317 | } else { | 317 | } else { |
318 | ret = clk_reset(motg->clk, CLK_RESET_DEASSERT); | 318 | ret = clk_reset(motg->clk, CLK_RESET_DEASSERT); |
319 | if (ret) | 319 | if (ret) |
320 | dev_err(motg->otg.dev, "usb hs_clk deassert failed\n"); | 320 | dev_err(motg->phy.dev, "usb hs_clk deassert failed\n"); |
321 | } | 321 | } |
322 | return ret; | 322 | return ret; |
323 | } | 323 | } |
@@ -328,13 +328,13 @@ static int msm_otg_phy_clk_reset(struct msm_otg *motg) | |||
328 | 328 | ||
329 | ret = clk_reset(motg->phy_reset_clk, CLK_RESET_ASSERT); | 329 | ret = clk_reset(motg->phy_reset_clk, CLK_RESET_ASSERT); |
330 | if (ret) { | 330 | if (ret) { |
331 | dev_err(motg->otg.dev, "usb phy clk assert failed\n"); | 331 | dev_err(motg->phy.dev, "usb phy clk assert failed\n"); |
332 | return ret; | 332 | return ret; |
333 | } | 333 | } |
334 | usleep_range(10000, 12000); | 334 | usleep_range(10000, 12000); |
335 | ret = clk_reset(motg->phy_reset_clk, CLK_RESET_DEASSERT); | 335 | ret = clk_reset(motg->phy_reset_clk, CLK_RESET_DEASSERT); |
336 | if (ret) | 336 | if (ret) |
337 | dev_err(motg->otg.dev, "usb phy clk deassert failed\n"); | 337 | dev_err(motg->phy.dev, "usb phy clk deassert failed\n"); |
338 | return ret; | 338 | return ret; |
339 | } | 339 | } |
340 | 340 | ||
@@ -358,7 +358,7 @@ static int msm_otg_phy_reset(struct msm_otg *motg) | |||
358 | writel(val | PORTSC_PTS_ULPI, USB_PORTSC); | 358 | writel(val | PORTSC_PTS_ULPI, USB_PORTSC); |
359 | 359 | ||
360 | for (retries = 3; retries > 0; retries--) { | 360 | for (retries = 3; retries > 0; retries--) { |
361 | ret = ulpi_write(&motg->otg, ULPI_FUNC_CTRL_SUSPENDM, | 361 | ret = ulpi_write(&motg->phy, ULPI_FUNC_CTRL_SUSPENDM, |
362 | ULPI_CLR(ULPI_FUNC_CTRL)); | 362 | ULPI_CLR(ULPI_FUNC_CTRL)); |
363 | if (!ret) | 363 | if (!ret) |
364 | break; | 364 | break; |
@@ -375,7 +375,7 @@ static int msm_otg_phy_reset(struct msm_otg *motg) | |||
375 | return ret; | 375 | return ret; |
376 | 376 | ||
377 | for (retries = 3; retries > 0; retries--) { | 377 | for (retries = 3; retries > 0; retries--) { |
378 | ret = ulpi_read(&motg->otg, ULPI_DEBUG); | 378 | ret = ulpi_read(&motg->phy, ULPI_DEBUG); |
379 | if (ret != -ETIMEDOUT) | 379 | if (ret != -ETIMEDOUT) |
380 | break; | 380 | break; |
381 | ret = msm_otg_phy_clk_reset(motg); | 381 | ret = msm_otg_phy_clk_reset(motg); |
@@ -385,14 +385,14 @@ static int msm_otg_phy_reset(struct msm_otg *motg) | |||
385 | if (!retries) | 385 | if (!retries) |
386 | return -ETIMEDOUT; | 386 | return -ETIMEDOUT; |
387 | 387 | ||
388 | dev_info(motg->otg.dev, "phy_reset: success\n"); | 388 | dev_info(motg->phy.dev, "phy_reset: success\n"); |
389 | return 0; | 389 | return 0; |
390 | } | 390 | } |
391 | 391 | ||
392 | #define LINK_RESET_TIMEOUT_USEC (250 * 1000) | 392 | #define LINK_RESET_TIMEOUT_USEC (250 * 1000) |
393 | static int msm_otg_reset(struct otg_transceiver *otg) | 393 | static int msm_otg_reset(struct usb_phy *phy) |
394 | { | 394 | { |
395 | struct msm_otg *motg = container_of(otg, struct msm_otg, otg); | 395 | struct msm_otg *motg = container_of(phy, struct msm_otg, phy); |
396 | struct msm_otg_platform_data *pdata = motg->pdata; | 396 | struct msm_otg_platform_data *pdata = motg->pdata; |
397 | int cnt = 0; | 397 | int cnt = 0; |
398 | int ret; | 398 | int ret; |
@@ -401,7 +401,7 @@ static int msm_otg_reset(struct otg_transceiver *otg) | |||
401 | 401 | ||
402 | ret = msm_otg_phy_reset(motg); | 402 | ret = msm_otg_phy_reset(motg); |
403 | if (ret) { | 403 | if (ret) { |
404 | dev_err(otg->dev, "phy_reset failed\n"); | 404 | dev_err(phy->dev, "phy_reset failed\n"); |
405 | return ret; | 405 | return ret; |
406 | } | 406 | } |
407 | 407 | ||
@@ -435,8 +435,8 @@ static int msm_otg_reset(struct otg_transceiver *otg) | |||
435 | val |= OTGSC_BSVIE; | 435 | val |= OTGSC_BSVIE; |
436 | } | 436 | } |
437 | writel(val, USB_OTGSC); | 437 | writel(val, USB_OTGSC); |
438 | ulpi_write(otg, ulpi_val, ULPI_USB_INT_EN_RISE); | 438 | ulpi_write(phy, ulpi_val, ULPI_USB_INT_EN_RISE); |
439 | ulpi_write(otg, ulpi_val, ULPI_USB_INT_EN_FALL); | 439 | ulpi_write(phy, ulpi_val, ULPI_USB_INT_EN_FALL); |
440 | } | 440 | } |
441 | 441 | ||
442 | return 0; | 442 | return 0; |
@@ -448,8 +448,8 @@ static int msm_otg_reset(struct otg_transceiver *otg) | |||
448 | #ifdef CONFIG_PM_SLEEP | 448 | #ifdef CONFIG_PM_SLEEP |
449 | static int msm_otg_suspend(struct msm_otg *motg) | 449 | static int msm_otg_suspend(struct msm_otg *motg) |
450 | { | 450 | { |
451 | struct otg_transceiver *otg = &motg->otg; | 451 | struct usb_phy *phy = &motg->phy; |
452 | struct usb_bus *bus = otg->host; | 452 | struct usb_bus *bus = phy->otg->host; |
453 | struct msm_otg_platform_data *pdata = motg->pdata; | 453 | struct msm_otg_platform_data *pdata = motg->pdata; |
454 | int cnt = 0; | 454 | int cnt = 0; |
455 | 455 | ||
@@ -475,10 +475,10 @@ static int msm_otg_suspend(struct msm_otg *motg) | |||
475 | */ | 475 | */ |
476 | 476 | ||
477 | if (motg->pdata->phy_type == CI_45NM_INTEGRATED_PHY) { | 477 | if (motg->pdata->phy_type == CI_45NM_INTEGRATED_PHY) { |
478 | ulpi_read(otg, 0x14); | 478 | ulpi_read(phy, 0x14); |
479 | if (pdata->otg_control == OTG_PHY_CONTROL) | 479 | if (pdata->otg_control == OTG_PHY_CONTROL) |
480 | ulpi_write(otg, 0x01, 0x30); | 480 | ulpi_write(phy, 0x01, 0x30); |
481 | ulpi_write(otg, 0x08, 0x09); | 481 | ulpi_write(phy, 0x08, 0x09); |
482 | } | 482 | } |
483 | 483 | ||
484 | /* | 484 | /* |
@@ -495,8 +495,8 @@ static int msm_otg_suspend(struct msm_otg *motg) | |||
495 | } | 495 | } |
496 | 496 | ||
497 | if (cnt >= PHY_SUSPEND_TIMEOUT_USEC) { | 497 | if (cnt >= PHY_SUSPEND_TIMEOUT_USEC) { |
498 | dev_err(otg->dev, "Unable to suspend PHY\n"); | 498 | dev_err(phy->dev, "Unable to suspend PHY\n"); |
499 | msm_otg_reset(otg); | 499 | msm_otg_reset(phy); |
500 | enable_irq(motg->irq); | 500 | enable_irq(motg->irq); |
501 | return -ETIMEDOUT; | 501 | return -ETIMEDOUT; |
502 | } | 502 | } |
@@ -528,7 +528,7 @@ static int msm_otg_suspend(struct msm_otg *motg) | |||
528 | msm_hsusb_config_vddcx(0); | 528 | msm_hsusb_config_vddcx(0); |
529 | } | 529 | } |
530 | 530 | ||
531 | if (device_may_wakeup(otg->dev)) | 531 | if (device_may_wakeup(phy->dev)) |
532 | enable_irq_wake(motg->irq); | 532 | enable_irq_wake(motg->irq); |
533 | if (bus) | 533 | if (bus) |
534 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &(bus_to_hcd(bus))->flags); | 534 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &(bus_to_hcd(bus))->flags); |
@@ -536,15 +536,15 @@ static int msm_otg_suspend(struct msm_otg *motg) | |||
536 | atomic_set(&motg->in_lpm, 1); | 536 | atomic_set(&motg->in_lpm, 1); |
537 | enable_irq(motg->irq); | 537 | enable_irq(motg->irq); |
538 | 538 | ||
539 | dev_info(otg->dev, "USB in low power mode\n"); | 539 | dev_info(phy->dev, "USB in low power mode\n"); |
540 | 540 | ||
541 | return 0; | 541 | return 0; |
542 | } | 542 | } |
543 | 543 | ||
544 | static int msm_otg_resume(struct msm_otg *motg) | 544 | static int msm_otg_resume(struct msm_otg *motg) |
545 | { | 545 | { |
546 | struct otg_transceiver *otg = &motg->otg; | 546 | struct usb_phy *phy = &motg->phy; |
547 | struct usb_bus *bus = otg->host; | 547 | struct usb_bus *bus = phy->otg->host; |
548 | int cnt = 0; | 548 | int cnt = 0; |
549 | unsigned temp; | 549 | unsigned temp; |
550 | 550 | ||
@@ -592,13 +592,13 @@ static int msm_otg_resume(struct msm_otg *motg) | |||
592 | * PHY. USB state can not be restored. Re-insertion | 592 | * PHY. USB state can not be restored. Re-insertion |
593 | * of USB cable is the only way to get USB working. | 593 | * of USB cable is the only way to get USB working. |
594 | */ | 594 | */ |
595 | dev_err(otg->dev, "Unable to resume USB." | 595 | dev_err(phy->dev, "Unable to resume USB." |
596 | "Re-plugin the cable\n"); | 596 | "Re-plugin the cable\n"); |
597 | msm_otg_reset(otg); | 597 | msm_otg_reset(phy); |
598 | } | 598 | } |
599 | 599 | ||
600 | skip_phy_resume: | 600 | skip_phy_resume: |
601 | if (device_may_wakeup(otg->dev)) | 601 | if (device_may_wakeup(phy->dev)) |
602 | disable_irq_wake(motg->irq); | 602 | disable_irq_wake(motg->irq); |
603 | if (bus) | 603 | if (bus) |
604 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &(bus_to_hcd(bus))->flags); | 604 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &(bus_to_hcd(bus))->flags); |
@@ -607,11 +607,11 @@ skip_phy_resume: | |||
607 | 607 | ||
608 | if (motg->async_int) { | 608 | if (motg->async_int) { |
609 | motg->async_int = 0; | 609 | motg->async_int = 0; |
610 | pm_runtime_put(otg->dev); | 610 | pm_runtime_put(phy->dev); |
611 | enable_irq(motg->irq); | 611 | enable_irq(motg->irq); |
612 | } | 612 | } |
613 | 613 | ||
614 | dev_info(otg->dev, "USB exited from low power mode\n"); | 614 | dev_info(phy->dev, "USB exited from low power mode\n"); |
615 | 615 | ||
616 | return 0; | 616 | return 0; |
617 | } | 617 | } |
@@ -623,13 +623,13 @@ static void msm_otg_notify_charger(struct msm_otg *motg, unsigned mA) | |||
623 | return; | 623 | return; |
624 | 624 | ||
625 | /* TODO: Notify PMIC about available current */ | 625 | /* TODO: Notify PMIC about available current */ |
626 | dev_info(motg->otg.dev, "Avail curr from USB = %u\n", mA); | 626 | dev_info(motg->phy.dev, "Avail curr from USB = %u\n", mA); |
627 | motg->cur_power = mA; | 627 | motg->cur_power = mA; |
628 | } | 628 | } |
629 | 629 | ||
630 | static int msm_otg_set_power(struct otg_transceiver *otg, unsigned mA) | 630 | static int msm_otg_set_power(struct usb_phy *phy, unsigned mA) |
631 | { | 631 | { |
632 | struct msm_otg *motg = container_of(otg, struct msm_otg, otg); | 632 | struct msm_otg *motg = container_of(phy, struct msm_otg, phy); |
633 | 633 | ||
634 | /* | 634 | /* |
635 | * Gadget driver uses set_power method to notify about the | 635 | * Gadget driver uses set_power method to notify about the |
@@ -644,19 +644,19 @@ static int msm_otg_set_power(struct otg_transceiver *otg, unsigned mA) | |||
644 | return 0; | 644 | return 0; |
645 | } | 645 | } |
646 | 646 | ||
647 | static void msm_otg_start_host(struct otg_transceiver *otg, int on) | 647 | static void msm_otg_start_host(struct usb_phy *phy, int on) |
648 | { | 648 | { |
649 | struct msm_otg *motg = container_of(otg, struct msm_otg, otg); | 649 | struct msm_otg *motg = container_of(phy, struct msm_otg, phy); |
650 | struct msm_otg_platform_data *pdata = motg->pdata; | 650 | struct msm_otg_platform_data *pdata = motg->pdata; |
651 | struct usb_hcd *hcd; | 651 | struct usb_hcd *hcd; |
652 | 652 | ||
653 | if (!otg->host) | 653 | if (!phy->otg->host) |
654 | return; | 654 | return; |
655 | 655 | ||
656 | hcd = bus_to_hcd(otg->host); | 656 | hcd = bus_to_hcd(phy->otg->host); |
657 | 657 | ||
658 | if (on) { | 658 | if (on) { |
659 | dev_dbg(otg->dev, "host on\n"); | 659 | dev_dbg(phy->dev, "host on\n"); |
660 | 660 | ||
661 | if (pdata->vbus_power) | 661 | if (pdata->vbus_power) |
662 | pdata->vbus_power(1); | 662 | pdata->vbus_power(1); |
@@ -671,7 +671,7 @@ static void msm_otg_start_host(struct otg_transceiver *otg, int on) | |||
671 | usb_add_hcd(hcd, hcd->irq, IRQF_SHARED); | 671 | usb_add_hcd(hcd, hcd->irq, IRQF_SHARED); |
672 | #endif | 672 | #endif |
673 | } else { | 673 | } else { |
674 | dev_dbg(otg->dev, "host off\n"); | 674 | dev_dbg(phy->dev, "host off\n"); |
675 | 675 | ||
676 | #ifdef CONFIG_USB | 676 | #ifdef CONFIG_USB |
677 | usb_remove_hcd(hcd); | 677 | usb_remove_hcd(hcd); |
@@ -683,9 +683,9 @@ static void msm_otg_start_host(struct otg_transceiver *otg, int on) | |||
683 | } | 683 | } |
684 | } | 684 | } |
685 | 685 | ||
686 | static int msm_otg_set_host(struct otg_transceiver *otg, struct usb_bus *host) | 686 | static int msm_otg_set_host(struct usb_otg *otg, struct usb_bus *host) |
687 | { | 687 | { |
688 | struct msm_otg *motg = container_of(otg, struct msm_otg, otg); | 688 | struct msm_otg *motg = container_of(otg->phy, struct msm_otg, phy); |
689 | struct usb_hcd *hcd; | 689 | struct usb_hcd *hcd; |
690 | 690 | ||
691 | /* | 691 | /* |
@@ -693,16 +693,16 @@ static int msm_otg_set_host(struct otg_transceiver *otg, struct usb_bus *host) | |||
693 | * only peripheral configuration. | 693 | * only peripheral configuration. |
694 | */ | 694 | */ |
695 | if (motg->pdata->mode == USB_PERIPHERAL) { | 695 | if (motg->pdata->mode == USB_PERIPHERAL) { |
696 | dev_info(otg->dev, "Host mode is not supported\n"); | 696 | dev_info(otg->phy->dev, "Host mode is not supported\n"); |
697 | return -ENODEV; | 697 | return -ENODEV; |
698 | } | 698 | } |
699 | 699 | ||
700 | if (!host) { | 700 | if (!host) { |
701 | if (otg->state == OTG_STATE_A_HOST) { | 701 | if (otg->phy->state == OTG_STATE_A_HOST) { |
702 | pm_runtime_get_sync(otg->dev); | 702 | pm_runtime_get_sync(otg->phy->dev); |
703 | msm_otg_start_host(otg, 0); | 703 | msm_otg_start_host(otg->phy, 0); |
704 | otg->host = NULL; | 704 | otg->host = NULL; |
705 | otg->state = OTG_STATE_UNDEFINED; | 705 | otg->phy->state = OTG_STATE_UNDEFINED; |
706 | schedule_work(&motg->sm_work); | 706 | schedule_work(&motg->sm_work); |
707 | } else { | 707 | } else { |
708 | otg->host = NULL; | 708 | otg->host = NULL; |
@@ -715,30 +715,30 @@ static int msm_otg_set_host(struct otg_transceiver *otg, struct usb_bus *host) | |||
715 | hcd->power_budget = motg->pdata->power_budget; | 715 | hcd->power_budget = motg->pdata->power_budget; |
716 | 716 | ||
717 | otg->host = host; | 717 | otg->host = host; |
718 | dev_dbg(otg->dev, "host driver registered w/ tranceiver\n"); | 718 | dev_dbg(otg->phy->dev, "host driver registered w/ tranceiver\n"); |
719 | 719 | ||
720 | /* | 720 | /* |
721 | * Kick the state machine work, if peripheral is not supported | 721 | * Kick the state machine work, if peripheral is not supported |
722 | * or peripheral is already registered with us. | 722 | * or peripheral is already registered with us. |
723 | */ | 723 | */ |
724 | if (motg->pdata->mode == USB_HOST || otg->gadget) { | 724 | if (motg->pdata->mode == USB_HOST || otg->gadget) { |
725 | pm_runtime_get_sync(otg->dev); | 725 | pm_runtime_get_sync(otg->phy->dev); |
726 | schedule_work(&motg->sm_work); | 726 | schedule_work(&motg->sm_work); |
727 | } | 727 | } |
728 | 728 | ||
729 | return 0; | 729 | return 0; |
730 | } | 730 | } |
731 | 731 | ||
732 | static void msm_otg_start_peripheral(struct otg_transceiver *otg, int on) | 732 | static void msm_otg_start_peripheral(struct usb_phy *phy, int on) |
733 | { | 733 | { |
734 | struct msm_otg *motg = container_of(otg, struct msm_otg, otg); | 734 | struct msm_otg *motg = container_of(phy, struct msm_otg, phy); |
735 | struct msm_otg_platform_data *pdata = motg->pdata; | 735 | struct msm_otg_platform_data *pdata = motg->pdata; |
736 | 736 | ||
737 | if (!otg->gadget) | 737 | if (!phy->otg->gadget) |
738 | return; | 738 | return; |
739 | 739 | ||
740 | if (on) { | 740 | if (on) { |
741 | dev_dbg(otg->dev, "gadget on\n"); | 741 | dev_dbg(phy->dev, "gadget on\n"); |
742 | /* | 742 | /* |
743 | * Some boards have a switch cotrolled by gpio | 743 | * Some boards have a switch cotrolled by gpio |
744 | * to enable/disable internal HUB. Disable internal | 744 | * to enable/disable internal HUB. Disable internal |
@@ -746,36 +746,36 @@ static void msm_otg_start_peripheral(struct otg_transceiver *otg, int on) | |||
746 | */ | 746 | */ |
747 | if (pdata->setup_gpio) | 747 | if (pdata->setup_gpio) |
748 | pdata->setup_gpio(OTG_STATE_B_PERIPHERAL); | 748 | pdata->setup_gpio(OTG_STATE_B_PERIPHERAL); |
749 | usb_gadget_vbus_connect(otg->gadget); | 749 | usb_gadget_vbus_connect(phy->otg->gadget); |
750 | } else { | 750 | } else { |
751 | dev_dbg(otg->dev, "gadget off\n"); | 751 | dev_dbg(phy->dev, "gadget off\n"); |
752 | usb_gadget_vbus_disconnect(otg->gadget); | 752 | usb_gadget_vbus_disconnect(phy->otg->gadget); |
753 | if (pdata->setup_gpio) | 753 | if (pdata->setup_gpio) |
754 | pdata->setup_gpio(OTG_STATE_UNDEFINED); | 754 | pdata->setup_gpio(OTG_STATE_UNDEFINED); |
755 | } | 755 | } |
756 | 756 | ||
757 | } | 757 | } |
758 | 758 | ||
759 | static int msm_otg_set_peripheral(struct otg_transceiver *otg, | 759 | static int msm_otg_set_peripheral(struct usb_otg *otg, |
760 | struct usb_gadget *gadget) | 760 | struct usb_gadget *gadget) |
761 | { | 761 | { |
762 | struct msm_otg *motg = container_of(otg, struct msm_otg, otg); | 762 | struct msm_otg *motg = container_of(otg->phy, struct msm_otg, phy); |
763 | 763 | ||
764 | /* | 764 | /* |
765 | * Fail peripheral registration if this board can support | 765 | * Fail peripheral registration if this board can support |
766 | * only host configuration. | 766 | * only host configuration. |
767 | */ | 767 | */ |
768 | if (motg->pdata->mode == USB_HOST) { | 768 | if (motg->pdata->mode == USB_HOST) { |
769 | dev_info(otg->dev, "Peripheral mode is not supported\n"); | 769 | dev_info(otg->phy->dev, "Peripheral mode is not supported\n"); |
770 | return -ENODEV; | 770 | return -ENODEV; |
771 | } | 771 | } |
772 | 772 | ||
773 | if (!gadget) { | 773 | if (!gadget) { |
774 | if (otg->state == OTG_STATE_B_PERIPHERAL) { | 774 | if (otg->phy->state == OTG_STATE_B_PERIPHERAL) { |
775 | pm_runtime_get_sync(otg->dev); | 775 | pm_runtime_get_sync(otg->phy->dev); |
776 | msm_otg_start_peripheral(otg, 0); | 776 | msm_otg_start_peripheral(otg->phy, 0); |
777 | otg->gadget = NULL; | 777 | otg->gadget = NULL; |
778 | otg->state = OTG_STATE_UNDEFINED; | 778 | otg->phy->state = OTG_STATE_UNDEFINED; |
779 | schedule_work(&motg->sm_work); | 779 | schedule_work(&motg->sm_work); |
780 | } else { | 780 | } else { |
781 | otg->gadget = NULL; | 781 | otg->gadget = NULL; |
@@ -784,14 +784,14 @@ static int msm_otg_set_peripheral(struct otg_transceiver *otg, | |||
784 | return 0; | 784 | return 0; |
785 | } | 785 | } |
786 | otg->gadget = gadget; | 786 | otg->gadget = gadget; |
787 | dev_dbg(otg->dev, "peripheral driver registered w/ tranceiver\n"); | 787 | dev_dbg(otg->phy->dev, "peripheral driver registered w/ tranceiver\n"); |
788 | 788 | ||
789 | /* | 789 | /* |
790 | * Kick the state machine work, if host is not supported | 790 | * Kick the state machine work, if host is not supported |
791 | * or host is already registered with us. | 791 | * or host is already registered with us. |
792 | */ | 792 | */ |
793 | if (motg->pdata->mode == USB_PERIPHERAL || otg->host) { | 793 | if (motg->pdata->mode == USB_PERIPHERAL || otg->host) { |
794 | pm_runtime_get_sync(otg->dev); | 794 | pm_runtime_get_sync(otg->phy->dev); |
795 | schedule_work(&motg->sm_work); | 795 | schedule_work(&motg->sm_work); |
796 | } | 796 | } |
797 | 797 | ||
@@ -800,17 +800,17 @@ static int msm_otg_set_peripheral(struct otg_transceiver *otg, | |||
800 | 800 | ||
801 | static bool msm_chg_check_secondary_det(struct msm_otg *motg) | 801 | static bool msm_chg_check_secondary_det(struct msm_otg *motg) |
802 | { | 802 | { |
803 | struct otg_transceiver *otg = &motg->otg; | 803 | struct usb_phy *phy = &motg->phy; |
804 | u32 chg_det; | 804 | u32 chg_det; |
805 | bool ret = false; | 805 | bool ret = false; |
806 | 806 | ||
807 | switch (motg->pdata->phy_type) { | 807 | switch (motg->pdata->phy_type) { |
808 | case CI_45NM_INTEGRATED_PHY: | 808 | case CI_45NM_INTEGRATED_PHY: |
809 | chg_det = ulpi_read(otg, 0x34); | 809 | chg_det = ulpi_read(phy, 0x34); |
810 | ret = chg_det & (1 << 4); | 810 | ret = chg_det & (1 << 4); |
811 | break; | 811 | break; |
812 | case SNPS_28NM_INTEGRATED_PHY: | 812 | case SNPS_28NM_INTEGRATED_PHY: |
813 | chg_det = ulpi_read(otg, 0x87); | 813 | chg_det = ulpi_read(phy, 0x87); |
814 | ret = chg_det & 1; | 814 | ret = chg_det & 1; |
815 | break; | 815 | break; |
816 | default: | 816 | default: |
@@ -821,38 +821,38 @@ static bool msm_chg_check_secondary_det(struct msm_otg *motg) | |||
821 | 821 | ||
822 | static void msm_chg_enable_secondary_det(struct msm_otg *motg) | 822 | static void msm_chg_enable_secondary_det(struct msm_otg *motg) |
823 | { | 823 | { |
824 | struct otg_transceiver *otg = &motg->otg; | 824 | struct usb_phy *phy = &motg->phy; |
825 | u32 chg_det; | 825 | u32 chg_det; |
826 | 826 | ||
827 | switch (motg->pdata->phy_type) { | 827 | switch (motg->pdata->phy_type) { |
828 | case CI_45NM_INTEGRATED_PHY: | 828 | case CI_45NM_INTEGRATED_PHY: |
829 | chg_det = ulpi_read(otg, 0x34); | 829 | chg_det = ulpi_read(phy, 0x34); |
830 | /* Turn off charger block */ | 830 | /* Turn off charger block */ |
831 | chg_det |= ~(1 << 1); | 831 | chg_det |= ~(1 << 1); |
832 | ulpi_write(otg, chg_det, 0x34); | 832 | ulpi_write(phy, chg_det, 0x34); |
833 | udelay(20); | 833 | udelay(20); |
834 | /* control chg block via ULPI */ | 834 | /* control chg block via ULPI */ |
835 | chg_det &= ~(1 << 3); | 835 | chg_det &= ~(1 << 3); |
836 | ulpi_write(otg, chg_det, 0x34); | 836 | ulpi_write(phy, chg_det, 0x34); |
837 | /* put it in host mode for enabling D- source */ | 837 | /* put it in host mode for enabling D- source */ |
838 | chg_det &= ~(1 << 2); | 838 | chg_det &= ~(1 << 2); |
839 | ulpi_write(otg, chg_det, 0x34); | 839 | ulpi_write(phy, chg_det, 0x34); |
840 | /* Turn on chg detect block */ | 840 | /* Turn on chg detect block */ |
841 | chg_det &= ~(1 << 1); | 841 | chg_det &= ~(1 << 1); |
842 | ulpi_write(otg, chg_det, 0x34); | 842 | ulpi_write(phy, chg_det, 0x34); |
843 | udelay(20); | 843 | udelay(20); |
844 | /* enable chg detection */ | 844 | /* enable chg detection */ |
845 | chg_det &= ~(1 << 0); | 845 | chg_det &= ~(1 << 0); |
846 | ulpi_write(otg, chg_det, 0x34); | 846 | ulpi_write(phy, chg_det, 0x34); |
847 | break; | 847 | break; |
848 | case SNPS_28NM_INTEGRATED_PHY: | 848 | case SNPS_28NM_INTEGRATED_PHY: |
849 | /* | 849 | /* |
850 | * Configure DM as current source, DP as current sink | 850 | * Configure DM as current source, DP as current sink |
851 | * and enable battery charging comparators. | 851 | * and enable battery charging comparators. |
852 | */ | 852 | */ |
853 | ulpi_write(otg, 0x8, 0x85); | 853 | ulpi_write(phy, 0x8, 0x85); |
854 | ulpi_write(otg, 0x2, 0x85); | 854 | ulpi_write(phy, 0x2, 0x85); |
855 | ulpi_write(otg, 0x1, 0x85); | 855 | ulpi_write(phy, 0x1, 0x85); |
856 | break; | 856 | break; |
857 | default: | 857 | default: |
858 | break; | 858 | break; |
@@ -861,17 +861,17 @@ static void msm_chg_enable_secondary_det(struct msm_otg *motg) | |||
861 | 861 | ||
862 | static bool msm_chg_check_primary_det(struct msm_otg *motg) | 862 | static bool msm_chg_check_primary_det(struct msm_otg *motg) |
863 | { | 863 | { |
864 | struct otg_transceiver *otg = &motg->otg; | 864 | struct usb_phy *phy = &motg->phy; |
865 | u32 chg_det; | 865 | u32 chg_det; |
866 | bool ret = false; | 866 | bool ret = false; |
867 | 867 | ||
868 | switch (motg->pdata->phy_type) { | 868 | switch (motg->pdata->phy_type) { |
869 | case CI_45NM_INTEGRATED_PHY: | 869 | case CI_45NM_INTEGRATED_PHY: |
870 | chg_det = ulpi_read(otg, 0x34); | 870 | chg_det = ulpi_read(phy, 0x34); |
871 | ret = chg_det & (1 << 4); | 871 | ret = chg_det & (1 << 4); |
872 | break; | 872 | break; |
873 | case SNPS_28NM_INTEGRATED_PHY: | 873 | case SNPS_28NM_INTEGRATED_PHY: |
874 | chg_det = ulpi_read(otg, 0x87); | 874 | chg_det = ulpi_read(phy, 0x87); |
875 | ret = chg_det & 1; | 875 | ret = chg_det & 1; |
876 | break; | 876 | break; |
877 | default: | 877 | default: |
@@ -882,23 +882,23 @@ static bool msm_chg_check_primary_det(struct msm_otg *motg) | |||
882 | 882 | ||
883 | static void msm_chg_enable_primary_det(struct msm_otg *motg) | 883 | static void msm_chg_enable_primary_det(struct msm_otg *motg) |
884 | { | 884 | { |
885 | struct otg_transceiver *otg = &motg->otg; | 885 | struct usb_phy *phy = &motg->phy; |
886 | u32 chg_det; | 886 | u32 chg_det; |
887 | 887 | ||
888 | switch (motg->pdata->phy_type) { | 888 | switch (motg->pdata->phy_type) { |
889 | case CI_45NM_INTEGRATED_PHY: | 889 | case CI_45NM_INTEGRATED_PHY: |
890 | chg_det = ulpi_read(otg, 0x34); | 890 | chg_det = ulpi_read(phy, 0x34); |
891 | /* enable chg detection */ | 891 | /* enable chg detection */ |
892 | chg_det &= ~(1 << 0); | 892 | chg_det &= ~(1 << 0); |
893 | ulpi_write(otg, chg_det, 0x34); | 893 | ulpi_write(phy, chg_det, 0x34); |
894 | break; | 894 | break; |
895 | case SNPS_28NM_INTEGRATED_PHY: | 895 | case SNPS_28NM_INTEGRATED_PHY: |
896 | /* | 896 | /* |
897 | * Configure DP as current source, DM as current sink | 897 | * Configure DP as current source, DM as current sink |
898 | * and enable battery charging comparators. | 898 | * and enable battery charging comparators. |
899 | */ | 899 | */ |
900 | ulpi_write(otg, 0x2, 0x85); | 900 | ulpi_write(phy, 0x2, 0x85); |
901 | ulpi_write(otg, 0x1, 0x85); | 901 | ulpi_write(phy, 0x1, 0x85); |
902 | break; | 902 | break; |
903 | default: | 903 | default: |
904 | break; | 904 | break; |
@@ -907,17 +907,17 @@ static void msm_chg_enable_primary_det(struct msm_otg *motg) | |||
907 | 907 | ||
908 | static bool msm_chg_check_dcd(struct msm_otg *motg) | 908 | static bool msm_chg_check_dcd(struct msm_otg *motg) |
909 | { | 909 | { |
910 | struct otg_transceiver *otg = &motg->otg; | 910 | struct usb_phy *phy = &motg->phy; |
911 | u32 line_state; | 911 | u32 line_state; |
912 | bool ret = false; | 912 | bool ret = false; |
913 | 913 | ||
914 | switch (motg->pdata->phy_type) { | 914 | switch (motg->pdata->phy_type) { |
915 | case CI_45NM_INTEGRATED_PHY: | 915 | case CI_45NM_INTEGRATED_PHY: |
916 | line_state = ulpi_read(otg, 0x15); | 916 | line_state = ulpi_read(phy, 0x15); |
917 | ret = !(line_state & 1); | 917 | ret = !(line_state & 1); |
918 | break; | 918 | break; |
919 | case SNPS_28NM_INTEGRATED_PHY: | 919 | case SNPS_28NM_INTEGRATED_PHY: |
920 | line_state = ulpi_read(otg, 0x87); | 920 | line_state = ulpi_read(phy, 0x87); |
921 | ret = line_state & 2; | 921 | ret = line_state & 2; |
922 | break; | 922 | break; |
923 | default: | 923 | default: |
@@ -928,17 +928,17 @@ static bool msm_chg_check_dcd(struct msm_otg *motg) | |||
928 | 928 | ||
929 | static void msm_chg_disable_dcd(struct msm_otg *motg) | 929 | static void msm_chg_disable_dcd(struct msm_otg *motg) |
930 | { | 930 | { |
931 | struct otg_transceiver *otg = &motg->otg; | 931 | struct usb_phy *phy = &motg->phy; |
932 | u32 chg_det; | 932 | u32 chg_det; |
933 | 933 | ||
934 | switch (motg->pdata->phy_type) { | 934 | switch (motg->pdata->phy_type) { |
935 | case CI_45NM_INTEGRATED_PHY: | 935 | case CI_45NM_INTEGRATED_PHY: |
936 | chg_det = ulpi_read(otg, 0x34); | 936 | chg_det = ulpi_read(phy, 0x34); |
937 | chg_det &= ~(1 << 5); | 937 | chg_det &= ~(1 << 5); |
938 | ulpi_write(otg, chg_det, 0x34); | 938 | ulpi_write(phy, chg_det, 0x34); |
939 | break; | 939 | break; |
940 | case SNPS_28NM_INTEGRATED_PHY: | 940 | case SNPS_28NM_INTEGRATED_PHY: |
941 | ulpi_write(otg, 0x10, 0x86); | 941 | ulpi_write(phy, 0x10, 0x86); |
942 | break; | 942 | break; |
943 | default: | 943 | default: |
944 | break; | 944 | break; |
@@ -947,19 +947,19 @@ static void msm_chg_disable_dcd(struct msm_otg *motg) | |||
947 | 947 | ||
948 | static void msm_chg_enable_dcd(struct msm_otg *motg) | 948 | static void msm_chg_enable_dcd(struct msm_otg *motg) |
949 | { | 949 | { |
950 | struct otg_transceiver *otg = &motg->otg; | 950 | struct usb_phy *phy = &motg->phy; |
951 | u32 chg_det; | 951 | u32 chg_det; |
952 | 952 | ||
953 | switch (motg->pdata->phy_type) { | 953 | switch (motg->pdata->phy_type) { |
954 | case CI_45NM_INTEGRATED_PHY: | 954 | case CI_45NM_INTEGRATED_PHY: |
955 | chg_det = ulpi_read(otg, 0x34); | 955 | chg_det = ulpi_read(phy, 0x34); |
956 | /* Turn on D+ current source */ | 956 | /* Turn on D+ current source */ |
957 | chg_det |= (1 << 5); | 957 | chg_det |= (1 << 5); |
958 | ulpi_write(otg, chg_det, 0x34); | 958 | ulpi_write(phy, chg_det, 0x34); |
959 | break; | 959 | break; |
960 | case SNPS_28NM_INTEGRATED_PHY: | 960 | case SNPS_28NM_INTEGRATED_PHY: |
961 | /* Data contact detection enable */ | 961 | /* Data contact detection enable */ |
962 | ulpi_write(otg, 0x10, 0x85); | 962 | ulpi_write(phy, 0x10, 0x85); |
963 | break; | 963 | break; |
964 | default: | 964 | default: |
965 | break; | 965 | break; |
@@ -968,32 +968,32 @@ static void msm_chg_enable_dcd(struct msm_otg *motg) | |||
968 | 968 | ||
969 | static void msm_chg_block_on(struct msm_otg *motg) | 969 | static void msm_chg_block_on(struct msm_otg *motg) |
970 | { | 970 | { |
971 | struct otg_transceiver *otg = &motg->otg; | 971 | struct usb_phy *phy = &motg->phy; |
972 | u32 func_ctrl, chg_det; | 972 | u32 func_ctrl, chg_det; |
973 | 973 | ||
974 | /* put the controller in non-driving mode */ | 974 | /* put the controller in non-driving mode */ |
975 | func_ctrl = ulpi_read(otg, ULPI_FUNC_CTRL); | 975 | func_ctrl = ulpi_read(phy, ULPI_FUNC_CTRL); |
976 | func_ctrl &= ~ULPI_FUNC_CTRL_OPMODE_MASK; | 976 | func_ctrl &= ~ULPI_FUNC_CTRL_OPMODE_MASK; |
977 | func_ctrl |= ULPI_FUNC_CTRL_OPMODE_NONDRIVING; | 977 | func_ctrl |= ULPI_FUNC_CTRL_OPMODE_NONDRIVING; |
978 | ulpi_write(otg, func_ctrl, ULPI_FUNC_CTRL); | 978 | ulpi_write(phy, func_ctrl, ULPI_FUNC_CTRL); |
979 | 979 | ||
980 | switch (motg->pdata->phy_type) { | 980 | switch (motg->pdata->phy_type) { |
981 | case CI_45NM_INTEGRATED_PHY: | 981 | case CI_45NM_INTEGRATED_PHY: |
982 | chg_det = ulpi_read(otg, 0x34); | 982 | chg_det = ulpi_read(phy, 0x34); |
983 | /* control chg block via ULPI */ | 983 | /* control chg block via ULPI */ |
984 | chg_det &= ~(1 << 3); | 984 | chg_det &= ~(1 << 3); |
985 | ulpi_write(otg, chg_det, 0x34); | 985 | ulpi_write(phy, chg_det, 0x34); |
986 | /* Turn on chg detect block */ | 986 | /* Turn on chg detect block */ |
987 | chg_det &= ~(1 << 1); | 987 | chg_det &= ~(1 << 1); |
988 | ulpi_write(otg, chg_det, 0x34); | 988 | ulpi_write(phy, chg_det, 0x34); |
989 | udelay(20); | 989 | udelay(20); |
990 | break; | 990 | break; |
991 | case SNPS_28NM_INTEGRATED_PHY: | 991 | case SNPS_28NM_INTEGRATED_PHY: |
992 | /* Clear charger detecting control bits */ | 992 | /* Clear charger detecting control bits */ |
993 | ulpi_write(otg, 0x3F, 0x86); | 993 | ulpi_write(phy, 0x3F, 0x86); |
994 | /* Clear alt interrupt latch and enable bits */ | 994 | /* Clear alt interrupt latch and enable bits */ |
995 | ulpi_write(otg, 0x1F, 0x92); | 995 | ulpi_write(phy, 0x1F, 0x92); |
996 | ulpi_write(otg, 0x1F, 0x95); | 996 | ulpi_write(phy, 0x1F, 0x95); |
997 | udelay(100); | 997 | udelay(100); |
998 | break; | 998 | break; |
999 | default: | 999 | default: |
@@ -1003,32 +1003,32 @@ static void msm_chg_block_on(struct msm_otg *motg) | |||
1003 | 1003 | ||
1004 | static void msm_chg_block_off(struct msm_otg *motg) | 1004 | static void msm_chg_block_off(struct msm_otg *motg) |
1005 | { | 1005 | { |
1006 | struct otg_transceiver *otg = &motg->otg; | 1006 | struct usb_phy *phy = &motg->phy; |
1007 | u32 func_ctrl, chg_det; | 1007 | u32 func_ctrl, chg_det; |
1008 | 1008 | ||
1009 | switch (motg->pdata->phy_type) { | 1009 | switch (motg->pdata->phy_type) { |
1010 | case CI_45NM_INTEGRATED_PHY: | 1010 | case CI_45NM_INTEGRATED_PHY: |
1011 | chg_det = ulpi_read(otg, 0x34); | 1011 | chg_det = ulpi_read(phy, 0x34); |
1012 | /* Turn off charger block */ | 1012 | /* Turn off charger block */ |
1013 | chg_det |= ~(1 << 1); | 1013 | chg_det |= ~(1 << 1); |
1014 | ulpi_write(otg, chg_det, 0x34); | 1014 | ulpi_write(phy, chg_det, 0x34); |
1015 | break; | 1015 | break; |
1016 | case SNPS_28NM_INTEGRATED_PHY: | 1016 | case SNPS_28NM_INTEGRATED_PHY: |
1017 | /* Clear charger detecting control bits */ | 1017 | /* Clear charger detecting control bits */ |
1018 | ulpi_write(otg, 0x3F, 0x86); | 1018 | ulpi_write(phy, 0x3F, 0x86); |
1019 | /* Clear alt interrupt latch and enable bits */ | 1019 | /* Clear alt interrupt latch and enable bits */ |
1020 | ulpi_write(otg, 0x1F, 0x92); | 1020 | ulpi_write(phy, 0x1F, 0x92); |
1021 | ulpi_write(otg, 0x1F, 0x95); | 1021 | ulpi_write(phy, 0x1F, 0x95); |
1022 | break; | 1022 | break; |
1023 | default: | 1023 | default: |
1024 | break; | 1024 | break; |
1025 | } | 1025 | } |
1026 | 1026 | ||
1027 | /* put the controller in normal mode */ | 1027 | /* put the controller in normal mode */ |
1028 | func_ctrl = ulpi_read(otg, ULPI_FUNC_CTRL); | 1028 | func_ctrl = ulpi_read(phy, ULPI_FUNC_CTRL); |
1029 | func_ctrl &= ~ULPI_FUNC_CTRL_OPMODE_MASK; | 1029 | func_ctrl &= ~ULPI_FUNC_CTRL_OPMODE_MASK; |
1030 | func_ctrl |= ULPI_FUNC_CTRL_OPMODE_NORMAL; | 1030 | func_ctrl |= ULPI_FUNC_CTRL_OPMODE_NORMAL; |
1031 | ulpi_write(otg, func_ctrl, ULPI_FUNC_CTRL); | 1031 | ulpi_write(phy, func_ctrl, ULPI_FUNC_CTRL); |
1032 | } | 1032 | } |
1033 | 1033 | ||
1034 | #define MSM_CHG_DCD_POLL_TIME (100 * HZ/1000) /* 100 msec */ | 1034 | #define MSM_CHG_DCD_POLL_TIME (100 * HZ/1000) /* 100 msec */ |
@@ -1038,14 +1038,14 @@ static void msm_chg_block_off(struct msm_otg *motg) | |||
1038 | static void msm_chg_detect_work(struct work_struct *w) | 1038 | static void msm_chg_detect_work(struct work_struct *w) |
1039 | { | 1039 | { |
1040 | struct msm_otg *motg = container_of(w, struct msm_otg, chg_work.work); | 1040 | struct msm_otg *motg = container_of(w, struct msm_otg, chg_work.work); |
1041 | struct otg_transceiver *otg = &motg->otg; | 1041 | struct usb_phy *phy = &motg->phy; |
1042 | bool is_dcd, tmout, vout; | 1042 | bool is_dcd, tmout, vout; |
1043 | unsigned long delay; | 1043 | unsigned long delay; |
1044 | 1044 | ||
1045 | dev_dbg(otg->dev, "chg detection work\n"); | 1045 | dev_dbg(phy->dev, "chg detection work\n"); |
1046 | switch (motg->chg_state) { | 1046 | switch (motg->chg_state) { |
1047 | case USB_CHG_STATE_UNDEFINED: | 1047 | case USB_CHG_STATE_UNDEFINED: |
1048 | pm_runtime_get_sync(otg->dev); | 1048 | pm_runtime_get_sync(phy->dev); |
1049 | msm_chg_block_on(motg); | 1049 | msm_chg_block_on(motg); |
1050 | msm_chg_enable_dcd(motg); | 1050 | msm_chg_enable_dcd(motg); |
1051 | motg->chg_state = USB_CHG_STATE_WAIT_FOR_DCD; | 1051 | motg->chg_state = USB_CHG_STATE_WAIT_FOR_DCD; |
@@ -1088,7 +1088,7 @@ static void msm_chg_detect_work(struct work_struct *w) | |||
1088 | motg->chg_state = USB_CHG_STATE_DETECTED; | 1088 | motg->chg_state = USB_CHG_STATE_DETECTED; |
1089 | case USB_CHG_STATE_DETECTED: | 1089 | case USB_CHG_STATE_DETECTED: |
1090 | msm_chg_block_off(motg); | 1090 | msm_chg_block_off(motg); |
1091 | dev_dbg(otg->dev, "charger = %d\n", motg->chg_type); | 1091 | dev_dbg(phy->dev, "charger = %d\n", motg->chg_type); |
1092 | schedule_work(&motg->sm_work); | 1092 | schedule_work(&motg->sm_work); |
1093 | return; | 1093 | return; |
1094 | default: | 1094 | default: |
@@ -1152,22 +1152,22 @@ static void msm_otg_init_sm(struct msm_otg *motg) | |||
1152 | static void msm_otg_sm_work(struct work_struct *w) | 1152 | static void msm_otg_sm_work(struct work_struct *w) |
1153 | { | 1153 | { |
1154 | struct msm_otg *motg = container_of(w, struct msm_otg, sm_work); | 1154 | struct msm_otg *motg = container_of(w, struct msm_otg, sm_work); |
1155 | struct otg_transceiver *otg = &motg->otg; | 1155 | struct usb_otg *otg = motg->phy.otg; |
1156 | 1156 | ||
1157 | switch (otg->state) { | 1157 | switch (otg->phy->state) { |
1158 | case OTG_STATE_UNDEFINED: | 1158 | case OTG_STATE_UNDEFINED: |
1159 | dev_dbg(otg->dev, "OTG_STATE_UNDEFINED state\n"); | 1159 | dev_dbg(otg->phy->dev, "OTG_STATE_UNDEFINED state\n"); |
1160 | msm_otg_reset(otg); | 1160 | msm_otg_reset(otg->phy); |
1161 | msm_otg_init_sm(motg); | 1161 | msm_otg_init_sm(motg); |
1162 | otg->state = OTG_STATE_B_IDLE; | 1162 | otg->phy->state = OTG_STATE_B_IDLE; |
1163 | /* FALL THROUGH */ | 1163 | /* FALL THROUGH */ |
1164 | case OTG_STATE_B_IDLE: | 1164 | case OTG_STATE_B_IDLE: |
1165 | dev_dbg(otg->dev, "OTG_STATE_B_IDLE state\n"); | 1165 | dev_dbg(otg->phy->dev, "OTG_STATE_B_IDLE state\n"); |
1166 | if (!test_bit(ID, &motg->inputs) && otg->host) { | 1166 | if (!test_bit(ID, &motg->inputs) && otg->host) { |
1167 | /* disable BSV bit */ | 1167 | /* disable BSV bit */ |
1168 | writel(readl(USB_OTGSC) & ~OTGSC_BSVIE, USB_OTGSC); | 1168 | writel(readl(USB_OTGSC) & ~OTGSC_BSVIE, USB_OTGSC); |
1169 | msm_otg_start_host(otg, 1); | 1169 | msm_otg_start_host(otg->phy, 1); |
1170 | otg->state = OTG_STATE_A_HOST; | 1170 | otg->phy->state = OTG_STATE_A_HOST; |
1171 | } else if (test_bit(B_SESS_VLD, &motg->inputs)) { | 1171 | } else if (test_bit(B_SESS_VLD, &motg->inputs)) { |
1172 | switch (motg->chg_state) { | 1172 | switch (motg->chg_state) { |
1173 | case USB_CHG_STATE_UNDEFINED: | 1173 | case USB_CHG_STATE_UNDEFINED: |
@@ -1182,13 +1182,15 @@ static void msm_otg_sm_work(struct work_struct *w) | |||
1182 | case USB_CDP_CHARGER: | 1182 | case USB_CDP_CHARGER: |
1183 | msm_otg_notify_charger(motg, | 1183 | msm_otg_notify_charger(motg, |
1184 | IDEV_CHG_MAX); | 1184 | IDEV_CHG_MAX); |
1185 | msm_otg_start_peripheral(otg, 1); | 1185 | msm_otg_start_peripheral(otg->phy, 1); |
1186 | otg->state = OTG_STATE_B_PERIPHERAL; | 1186 | otg->phy->state |
1187 | = OTG_STATE_B_PERIPHERAL; | ||
1187 | break; | 1188 | break; |
1188 | case USB_SDP_CHARGER: | 1189 | case USB_SDP_CHARGER: |
1189 | msm_otg_notify_charger(motg, IUNIT); | 1190 | msm_otg_notify_charger(motg, IUNIT); |
1190 | msm_otg_start_peripheral(otg, 1); | 1191 | msm_otg_start_peripheral(otg->phy, 1); |
1191 | otg->state = OTG_STATE_B_PERIPHERAL; | 1192 | otg->phy->state |
1193 | = OTG_STATE_B_PERIPHERAL; | ||
1192 | break; | 1194 | break; |
1193 | default: | 1195 | default: |
1194 | break; | 1196 | break; |
@@ -1204,34 +1206,34 @@ static void msm_otg_sm_work(struct work_struct *w) | |||
1204 | * is incremented in charger detection work. | 1206 | * is incremented in charger detection work. |
1205 | */ | 1207 | */ |
1206 | if (cancel_delayed_work_sync(&motg->chg_work)) { | 1208 | if (cancel_delayed_work_sync(&motg->chg_work)) { |
1207 | pm_runtime_put_sync(otg->dev); | 1209 | pm_runtime_put_sync(otg->phy->dev); |
1208 | msm_otg_reset(otg); | 1210 | msm_otg_reset(otg->phy); |
1209 | } | 1211 | } |
1210 | msm_otg_notify_charger(motg, 0); | 1212 | msm_otg_notify_charger(motg, 0); |
1211 | motg->chg_state = USB_CHG_STATE_UNDEFINED; | 1213 | motg->chg_state = USB_CHG_STATE_UNDEFINED; |
1212 | motg->chg_type = USB_INVALID_CHARGER; | 1214 | motg->chg_type = USB_INVALID_CHARGER; |
1213 | } | 1215 | } |
1214 | pm_runtime_put_sync(otg->dev); | 1216 | pm_runtime_put_sync(otg->phy->dev); |
1215 | break; | 1217 | break; |
1216 | case OTG_STATE_B_PERIPHERAL: | 1218 | case OTG_STATE_B_PERIPHERAL: |
1217 | dev_dbg(otg->dev, "OTG_STATE_B_PERIPHERAL state\n"); | 1219 | dev_dbg(otg->phy->dev, "OTG_STATE_B_PERIPHERAL state\n"); |
1218 | if (!test_bit(B_SESS_VLD, &motg->inputs) || | 1220 | if (!test_bit(B_SESS_VLD, &motg->inputs) || |
1219 | !test_bit(ID, &motg->inputs)) { | 1221 | !test_bit(ID, &motg->inputs)) { |
1220 | msm_otg_notify_charger(motg, 0); | 1222 | msm_otg_notify_charger(motg, 0); |
1221 | msm_otg_start_peripheral(otg, 0); | 1223 | msm_otg_start_peripheral(otg->phy, 0); |
1222 | motg->chg_state = USB_CHG_STATE_UNDEFINED; | 1224 | motg->chg_state = USB_CHG_STATE_UNDEFINED; |
1223 | motg->chg_type = USB_INVALID_CHARGER; | 1225 | motg->chg_type = USB_INVALID_CHARGER; |
1224 | otg->state = OTG_STATE_B_IDLE; | 1226 | otg->phy->state = OTG_STATE_B_IDLE; |
1225 | msm_otg_reset(otg); | 1227 | msm_otg_reset(otg->phy); |
1226 | schedule_work(w); | 1228 | schedule_work(w); |
1227 | } | 1229 | } |
1228 | break; | 1230 | break; |
1229 | case OTG_STATE_A_HOST: | 1231 | case OTG_STATE_A_HOST: |
1230 | dev_dbg(otg->dev, "OTG_STATE_A_HOST state\n"); | 1232 | dev_dbg(otg->phy->dev, "OTG_STATE_A_HOST state\n"); |
1231 | if (test_bit(ID, &motg->inputs)) { | 1233 | if (test_bit(ID, &motg->inputs)) { |
1232 | msm_otg_start_host(otg, 0); | 1234 | msm_otg_start_host(otg->phy, 0); |
1233 | otg->state = OTG_STATE_B_IDLE; | 1235 | otg->phy->state = OTG_STATE_B_IDLE; |
1234 | msm_otg_reset(otg); | 1236 | msm_otg_reset(otg->phy); |
1235 | schedule_work(w); | 1237 | schedule_work(w); |
1236 | } | 1238 | } |
1237 | break; | 1239 | break; |
@@ -1243,13 +1245,13 @@ static void msm_otg_sm_work(struct work_struct *w) | |||
1243 | static irqreturn_t msm_otg_irq(int irq, void *data) | 1245 | static irqreturn_t msm_otg_irq(int irq, void *data) |
1244 | { | 1246 | { |
1245 | struct msm_otg *motg = data; | 1247 | struct msm_otg *motg = data; |
1246 | struct otg_transceiver *otg = &motg->otg; | 1248 | struct usb_phy *phy = &motg->phy; |
1247 | u32 otgsc = 0; | 1249 | u32 otgsc = 0; |
1248 | 1250 | ||
1249 | if (atomic_read(&motg->in_lpm)) { | 1251 | if (atomic_read(&motg->in_lpm)) { |
1250 | disable_irq_nosync(irq); | 1252 | disable_irq_nosync(irq); |
1251 | motg->async_int = 1; | 1253 | motg->async_int = 1; |
1252 | pm_runtime_get(otg->dev); | 1254 | pm_runtime_get(phy->dev); |
1253 | return IRQ_HANDLED; | 1255 | return IRQ_HANDLED; |
1254 | } | 1256 | } |
1255 | 1257 | ||
@@ -1262,15 +1264,15 @@ static irqreturn_t msm_otg_irq(int irq, void *data) | |||
1262 | set_bit(ID, &motg->inputs); | 1264 | set_bit(ID, &motg->inputs); |
1263 | else | 1265 | else |
1264 | clear_bit(ID, &motg->inputs); | 1266 | clear_bit(ID, &motg->inputs); |
1265 | dev_dbg(otg->dev, "ID set/clear\n"); | 1267 | dev_dbg(phy->dev, "ID set/clear\n"); |
1266 | pm_runtime_get_noresume(otg->dev); | 1268 | pm_runtime_get_noresume(phy->dev); |
1267 | } else if ((otgsc & OTGSC_BSVIS) && (otgsc & OTGSC_BSVIE)) { | 1269 | } else if ((otgsc & OTGSC_BSVIS) && (otgsc & OTGSC_BSVIE)) { |
1268 | if (otgsc & OTGSC_BSV) | 1270 | if (otgsc & OTGSC_BSV) |
1269 | set_bit(B_SESS_VLD, &motg->inputs); | 1271 | set_bit(B_SESS_VLD, &motg->inputs); |
1270 | else | 1272 | else |
1271 | clear_bit(B_SESS_VLD, &motg->inputs); | 1273 | clear_bit(B_SESS_VLD, &motg->inputs); |
1272 | dev_dbg(otg->dev, "BSV set/clear\n"); | 1274 | dev_dbg(phy->dev, "BSV set/clear\n"); |
1273 | pm_runtime_get_noresume(otg->dev); | 1275 | pm_runtime_get_noresume(phy->dev); |
1274 | } | 1276 | } |
1275 | 1277 | ||
1276 | writel(otgsc, USB_OTGSC); | 1278 | writel(otgsc, USB_OTGSC); |
@@ -1281,9 +1283,9 @@ static irqreturn_t msm_otg_irq(int irq, void *data) | |||
1281 | static int msm_otg_mode_show(struct seq_file *s, void *unused) | 1283 | static int msm_otg_mode_show(struct seq_file *s, void *unused) |
1282 | { | 1284 | { |
1283 | struct msm_otg *motg = s->private; | 1285 | struct msm_otg *motg = s->private; |
1284 | struct otg_transceiver *otg = &motg->otg; | 1286 | struct usb_otg *otg = motg->phy.otg; |
1285 | 1287 | ||
1286 | switch (otg->state) { | 1288 | switch (otg->phy->state) { |
1287 | case OTG_STATE_A_HOST: | 1289 | case OTG_STATE_A_HOST: |
1288 | seq_printf(s, "host\n"); | 1290 | seq_printf(s, "host\n"); |
1289 | break; | 1291 | break; |
@@ -1309,7 +1311,7 @@ static ssize_t msm_otg_mode_write(struct file *file, const char __user *ubuf, | |||
1309 | struct seq_file *s = file->private_data; | 1311 | struct seq_file *s = file->private_data; |
1310 | struct msm_otg *motg = s->private; | 1312 | struct msm_otg *motg = s->private; |
1311 | char buf[16]; | 1313 | char buf[16]; |
1312 | struct otg_transceiver *otg = &motg->otg; | 1314 | struct usb_otg *otg = motg->phy.otg; |
1313 | int status = count; | 1315 | int status = count; |
1314 | enum usb_mode_type req_mode; | 1316 | enum usb_mode_type req_mode; |
1315 | 1317 | ||
@@ -1333,7 +1335,7 @@ static ssize_t msm_otg_mode_write(struct file *file, const char __user *ubuf, | |||
1333 | 1335 | ||
1334 | switch (req_mode) { | 1336 | switch (req_mode) { |
1335 | case USB_NONE: | 1337 | case USB_NONE: |
1336 | switch (otg->state) { | 1338 | switch (otg->phy->state) { |
1337 | case OTG_STATE_A_HOST: | 1339 | case OTG_STATE_A_HOST: |
1338 | case OTG_STATE_B_PERIPHERAL: | 1340 | case OTG_STATE_B_PERIPHERAL: |
1339 | set_bit(ID, &motg->inputs); | 1341 | set_bit(ID, &motg->inputs); |
@@ -1344,7 +1346,7 @@ static ssize_t msm_otg_mode_write(struct file *file, const char __user *ubuf, | |||
1344 | } | 1346 | } |
1345 | break; | 1347 | break; |
1346 | case USB_PERIPHERAL: | 1348 | case USB_PERIPHERAL: |
1347 | switch (otg->state) { | 1349 | switch (otg->phy->state) { |
1348 | case OTG_STATE_B_IDLE: | 1350 | case OTG_STATE_B_IDLE: |
1349 | case OTG_STATE_A_HOST: | 1351 | case OTG_STATE_A_HOST: |
1350 | set_bit(ID, &motg->inputs); | 1352 | set_bit(ID, &motg->inputs); |
@@ -1355,7 +1357,7 @@ static ssize_t msm_otg_mode_write(struct file *file, const char __user *ubuf, | |||
1355 | } | 1357 | } |
1356 | break; | 1358 | break; |
1357 | case USB_HOST: | 1359 | case USB_HOST: |
1358 | switch (otg->state) { | 1360 | switch (otg->phy->state) { |
1359 | case OTG_STATE_B_IDLE: | 1361 | case OTG_STATE_B_IDLE: |
1360 | case OTG_STATE_B_PERIPHERAL: | 1362 | case OTG_STATE_B_PERIPHERAL: |
1361 | clear_bit(ID, &motg->inputs); | 1363 | clear_bit(ID, &motg->inputs); |
@@ -1368,7 +1370,7 @@ static ssize_t msm_otg_mode_write(struct file *file, const char __user *ubuf, | |||
1368 | goto out; | 1370 | goto out; |
1369 | } | 1371 | } |
1370 | 1372 | ||
1371 | pm_runtime_get_sync(otg->dev); | 1373 | pm_runtime_get_sync(otg->phy->dev); |
1372 | schedule_work(&motg->sm_work); | 1374 | schedule_work(&motg->sm_work); |
1373 | out: | 1375 | out: |
1374 | return status; | 1376 | return status; |
@@ -1414,7 +1416,7 @@ static int __init msm_otg_probe(struct platform_device *pdev) | |||
1414 | int ret = 0; | 1416 | int ret = 0; |
1415 | struct resource *res; | 1417 | struct resource *res; |
1416 | struct msm_otg *motg; | 1418 | struct msm_otg *motg; |
1417 | struct otg_transceiver *otg; | 1419 | struct usb_phy *phy; |
1418 | 1420 | ||
1419 | dev_info(&pdev->dev, "msm_otg probe\n"); | 1421 | dev_info(&pdev->dev, "msm_otg probe\n"); |
1420 | if (!pdev->dev.platform_data) { | 1422 | if (!pdev->dev.platform_data) { |
@@ -1428,9 +1430,15 @@ static int __init msm_otg_probe(struct platform_device *pdev) | |||
1428 | return -ENOMEM; | 1430 | return -ENOMEM; |
1429 | } | 1431 | } |
1430 | 1432 | ||
1433 | motg->phy.otg = kzalloc(sizeof(struct usb_otg), GFP_KERNEL); | ||
1434 | if (!motg->phy.otg) { | ||
1435 | dev_err(&pdev->dev, "unable to allocate msm_otg\n"); | ||
1436 | return -ENOMEM; | ||
1437 | } | ||
1438 | |||
1431 | motg->pdata = pdev->dev.platform_data; | 1439 | motg->pdata = pdev->dev.platform_data; |
1432 | otg = &motg->otg; | 1440 | phy = &motg->phy; |
1433 | otg->dev = &pdev->dev; | 1441 | phy->dev = &pdev->dev; |
1434 | 1442 | ||
1435 | motg->phy_reset_clk = clk_get(&pdev->dev, "usb_phy_clk"); | 1443 | motg->phy_reset_clk = clk_get(&pdev->dev, "usb_phy_clk"); |
1436 | if (IS_ERR(motg->phy_reset_clk)) { | 1444 | if (IS_ERR(motg->phy_reset_clk)) { |
@@ -1538,16 +1546,18 @@ static int __init msm_otg_probe(struct platform_device *pdev) | |||
1538 | goto disable_clks; | 1546 | goto disable_clks; |
1539 | } | 1547 | } |
1540 | 1548 | ||
1541 | otg->init = msm_otg_reset; | 1549 | phy->init = msm_otg_reset; |
1542 | otg->set_host = msm_otg_set_host; | 1550 | phy->set_power = msm_otg_set_power; |
1543 | otg->set_peripheral = msm_otg_set_peripheral; | 1551 | |
1544 | otg->set_power = msm_otg_set_power; | 1552 | phy->io_ops = &msm_otg_io_ops; |
1545 | 1553 | ||
1546 | otg->io_ops = &msm_otg_io_ops; | 1554 | phy->otg->phy = &motg->phy; |
1555 | phy->otg->set_host = msm_otg_set_host; | ||
1556 | phy->otg->set_peripheral = msm_otg_set_peripheral; | ||
1547 | 1557 | ||
1548 | ret = otg_set_transceiver(&motg->otg); | 1558 | ret = usb_set_transceiver(&motg->phy); |
1549 | if (ret) { | 1559 | if (ret) { |
1550 | dev_err(&pdev->dev, "otg_set_transceiver failed\n"); | 1560 | dev_err(&pdev->dev, "usb_set_transceiver failed\n"); |
1551 | goto free_irq; | 1561 | goto free_irq; |
1552 | } | 1562 | } |
1553 | 1563 | ||
@@ -1591,6 +1601,7 @@ put_clk: | |||
1591 | put_phy_reset_clk: | 1601 | put_phy_reset_clk: |
1592 | clk_put(motg->phy_reset_clk); | 1602 | clk_put(motg->phy_reset_clk); |
1593 | free_motg: | 1603 | free_motg: |
1604 | kfree(motg->phy.otg); | ||
1594 | kfree(motg); | 1605 | kfree(motg); |
1595 | return ret; | 1606 | return ret; |
1596 | } | 1607 | } |
@@ -1598,10 +1609,10 @@ free_motg: | |||
1598 | static int __devexit msm_otg_remove(struct platform_device *pdev) | 1609 | static int __devexit msm_otg_remove(struct platform_device *pdev) |
1599 | { | 1610 | { |
1600 | struct msm_otg *motg = platform_get_drvdata(pdev); | 1611 | struct msm_otg *motg = platform_get_drvdata(pdev); |
1601 | struct otg_transceiver *otg = &motg->otg; | 1612 | struct usb_phy *phy = &motg->phy; |
1602 | int cnt = 0; | 1613 | int cnt = 0; |
1603 | 1614 | ||
1604 | if (otg->host || otg->gadget) | 1615 | if (phy->otg->host || phy->otg->gadget) |
1605 | return -EBUSY; | 1616 | return -EBUSY; |
1606 | 1617 | ||
1607 | msm_otg_debugfs_cleanup(); | 1618 | msm_otg_debugfs_cleanup(); |
@@ -1613,14 +1624,14 @@ static int __devexit msm_otg_remove(struct platform_device *pdev) | |||
1613 | device_init_wakeup(&pdev->dev, 0); | 1624 | device_init_wakeup(&pdev->dev, 0); |
1614 | pm_runtime_disable(&pdev->dev); | 1625 | pm_runtime_disable(&pdev->dev); |
1615 | 1626 | ||
1616 | otg_set_transceiver(NULL); | 1627 | usb_set_transceiver(NULL); |
1617 | free_irq(motg->irq, motg); | 1628 | free_irq(motg->irq, motg); |
1618 | 1629 | ||
1619 | /* | 1630 | /* |
1620 | * Put PHY in low power mode. | 1631 | * Put PHY in low power mode. |
1621 | */ | 1632 | */ |
1622 | ulpi_read(otg, 0x14); | 1633 | ulpi_read(phy, 0x14); |
1623 | ulpi_write(otg, 0x08, 0x09); | 1634 | ulpi_write(phy, 0x08, 0x09); |
1624 | 1635 | ||
1625 | writel(readl(USB_PORTSC) | PORTSC_PHCD, USB_PORTSC); | 1636 | writel(readl(USB_PORTSC) | PORTSC_PHCD, USB_PORTSC); |
1626 | while (cnt < PHY_SUSPEND_TIMEOUT_USEC) { | 1637 | while (cnt < PHY_SUSPEND_TIMEOUT_USEC) { |
@@ -1630,7 +1641,7 @@ static int __devexit msm_otg_remove(struct platform_device *pdev) | |||
1630 | cnt++; | 1641 | cnt++; |
1631 | } | 1642 | } |
1632 | if (cnt >= PHY_SUSPEND_TIMEOUT_USEC) | 1643 | if (cnt >= PHY_SUSPEND_TIMEOUT_USEC) |
1633 | dev_err(otg->dev, "Unable to suspend PHY\n"); | 1644 | dev_err(phy->dev, "Unable to suspend PHY\n"); |
1634 | 1645 | ||
1635 | clk_disable(motg->pclk); | 1646 | clk_disable(motg->pclk); |
1636 | clk_disable(motg->clk); | 1647 | clk_disable(motg->clk); |
@@ -1651,6 +1662,7 @@ static int __devexit msm_otg_remove(struct platform_device *pdev) | |||
1651 | if (motg->core_clk) | 1662 | if (motg->core_clk) |
1652 | clk_put(motg->core_clk); | 1663 | clk_put(motg->core_clk); |
1653 | 1664 | ||
1665 | kfree(motg->phy.otg); | ||
1654 | kfree(motg); | 1666 | kfree(motg); |
1655 | 1667 | ||
1656 | return 0; | 1668 | return 0; |
@@ -1660,7 +1672,7 @@ static int __devexit msm_otg_remove(struct platform_device *pdev) | |||
1660 | static int msm_otg_runtime_idle(struct device *dev) | 1672 | static int msm_otg_runtime_idle(struct device *dev) |
1661 | { | 1673 | { |
1662 | struct msm_otg *motg = dev_get_drvdata(dev); | 1674 | struct msm_otg *motg = dev_get_drvdata(dev); |
1663 | struct otg_transceiver *otg = &motg->otg; | 1675 | struct usb_otg *otg = motg->phy.otg; |
1664 | 1676 | ||
1665 | dev_dbg(dev, "OTG runtime idle\n"); | 1677 | dev_dbg(dev, "OTG runtime idle\n"); |
1666 | 1678 | ||
@@ -1670,7 +1682,7 @@ static int msm_otg_runtime_idle(struct device *dev) | |||
1670 | * This 1 sec delay also prevents entering into LPM immediately | 1682 | * This 1 sec delay also prevents entering into LPM immediately |
1671 | * after asynchronous interrupt. | 1683 | * after asynchronous interrupt. |
1672 | */ | 1684 | */ |
1673 | if (otg->state != OTG_STATE_UNDEFINED) | 1685 | if (otg->phy->state != OTG_STATE_UNDEFINED) |
1674 | pm_schedule_suspend(dev, 1000); | 1686 | pm_schedule_suspend(dev, 1000); |
1675 | 1687 | ||
1676 | return -EAGAIN; | 1688 | return -EAGAIN; |
diff --git a/drivers/usb/otg/mv_otg.c b/drivers/usb/otg/mv_otg.c index b5fbe1452ab0..6cc6c3ffbb83 100644 --- a/drivers/usb/otg/mv_otg.c +++ b/drivers/usb/otg/mv_otg.c | |||
@@ -55,16 +55,16 @@ static char *state_string[] = { | |||
55 | "a_vbus_err" | 55 | "a_vbus_err" |
56 | }; | 56 | }; |
57 | 57 | ||
58 | static int mv_otg_set_vbus(struct otg_transceiver *otg, bool on) | 58 | static int mv_otg_set_vbus(struct usb_otg *otg, bool on) |
59 | { | 59 | { |
60 | struct mv_otg *mvotg = container_of(otg, struct mv_otg, otg); | 60 | struct mv_otg *mvotg = container_of(otg->phy, struct mv_otg, phy); |
61 | if (mvotg->pdata->set_vbus == NULL) | 61 | if (mvotg->pdata->set_vbus == NULL) |
62 | return -ENODEV; | 62 | return -ENODEV; |
63 | 63 | ||
64 | return mvotg->pdata->set_vbus(on); | 64 | return mvotg->pdata->set_vbus(on); |
65 | } | 65 | } |
66 | 66 | ||
67 | static int mv_otg_set_host(struct otg_transceiver *otg, | 67 | static int mv_otg_set_host(struct usb_otg *otg, |
68 | struct usb_bus *host) | 68 | struct usb_bus *host) |
69 | { | 69 | { |
70 | otg->host = host; | 70 | otg->host = host; |
@@ -72,7 +72,7 @@ static int mv_otg_set_host(struct otg_transceiver *otg, | |||
72 | return 0; | 72 | return 0; |
73 | } | 73 | } |
74 | 74 | ||
75 | static int mv_otg_set_peripheral(struct otg_transceiver *otg, | 75 | static int mv_otg_set_peripheral(struct usb_otg *otg, |
76 | struct usb_gadget *gadget) | 76 | struct usb_gadget *gadget) |
77 | { | 77 | { |
78 | otg->gadget = gadget; | 78 | otg->gadget = gadget; |
@@ -203,7 +203,7 @@ static void mv_otg_init_irq(struct mv_otg *mvotg) | |||
203 | static void mv_otg_start_host(struct mv_otg *mvotg, int on) | 203 | static void mv_otg_start_host(struct mv_otg *mvotg, int on) |
204 | { | 204 | { |
205 | #ifdef CONFIG_USB | 205 | #ifdef CONFIG_USB |
206 | struct otg_transceiver *otg = &mvotg->otg; | 206 | struct usb_otg *otg = mvotg->phy.otg; |
207 | struct usb_hcd *hcd; | 207 | struct usb_hcd *hcd; |
208 | 208 | ||
209 | if (!otg->host) | 209 | if (!otg->host) |
@@ -222,12 +222,12 @@ static void mv_otg_start_host(struct mv_otg *mvotg, int on) | |||
222 | 222 | ||
223 | static void mv_otg_start_periphrals(struct mv_otg *mvotg, int on) | 223 | static void mv_otg_start_periphrals(struct mv_otg *mvotg, int on) |
224 | { | 224 | { |
225 | struct otg_transceiver *otg = &mvotg->otg; | 225 | struct usb_otg *otg = mvotg->phy.otg; |
226 | 226 | ||
227 | if (!otg->gadget) | 227 | if (!otg->gadget) |
228 | return; | 228 | return; |
229 | 229 | ||
230 | dev_info(otg->dev, "gadget %s\n", on ? "on" : "off"); | 230 | dev_info(mvotg->phy.dev, "gadget %s\n", on ? "on" : "off"); |
231 | 231 | ||
232 | if (on) | 232 | if (on) |
233 | usb_gadget_vbus_connect(otg->gadget); | 233 | usb_gadget_vbus_connect(otg->gadget); |
@@ -343,69 +343,69 @@ static void mv_otg_update_inputs(struct mv_otg *mvotg) | |||
343 | static void mv_otg_update_state(struct mv_otg *mvotg) | 343 | static void mv_otg_update_state(struct mv_otg *mvotg) |
344 | { | 344 | { |
345 | struct mv_otg_ctrl *otg_ctrl = &mvotg->otg_ctrl; | 345 | struct mv_otg_ctrl *otg_ctrl = &mvotg->otg_ctrl; |
346 | struct otg_transceiver *otg = &mvotg->otg; | 346 | struct usb_phy *phy = &mvotg->phy; |
347 | int old_state = otg->state; | 347 | int old_state = phy->state; |
348 | 348 | ||
349 | switch (old_state) { | 349 | switch (old_state) { |
350 | case OTG_STATE_UNDEFINED: | 350 | case OTG_STATE_UNDEFINED: |
351 | otg->state = OTG_STATE_B_IDLE; | 351 | phy->state = OTG_STATE_B_IDLE; |
352 | /* FALL THROUGH */ | 352 | /* FALL THROUGH */ |
353 | case OTG_STATE_B_IDLE: | 353 | case OTG_STATE_B_IDLE: |
354 | if (otg_ctrl->id == 0) | 354 | if (otg_ctrl->id == 0) |
355 | otg->state = OTG_STATE_A_IDLE; | 355 | phy->state = OTG_STATE_A_IDLE; |
356 | else if (otg_ctrl->b_sess_vld) | 356 | else if (otg_ctrl->b_sess_vld) |
357 | otg->state = OTG_STATE_B_PERIPHERAL; | 357 | phy->state = OTG_STATE_B_PERIPHERAL; |
358 | break; | 358 | break; |
359 | case OTG_STATE_B_PERIPHERAL: | 359 | case OTG_STATE_B_PERIPHERAL: |
360 | if (!otg_ctrl->b_sess_vld || otg_ctrl->id == 0) | 360 | if (!otg_ctrl->b_sess_vld || otg_ctrl->id == 0) |
361 | otg->state = OTG_STATE_B_IDLE; | 361 | phy->state = OTG_STATE_B_IDLE; |
362 | break; | 362 | break; |
363 | case OTG_STATE_A_IDLE: | 363 | case OTG_STATE_A_IDLE: |
364 | if (otg_ctrl->id) | 364 | if (otg_ctrl->id) |
365 | otg->state = OTG_STATE_B_IDLE; | 365 | phy->state = OTG_STATE_B_IDLE; |
366 | else if (!(otg_ctrl->a_bus_drop) && | 366 | else if (!(otg_ctrl->a_bus_drop) && |
367 | (otg_ctrl->a_bus_req || otg_ctrl->a_srp_det)) | 367 | (otg_ctrl->a_bus_req || otg_ctrl->a_srp_det)) |
368 | otg->state = OTG_STATE_A_WAIT_VRISE; | 368 | phy->state = OTG_STATE_A_WAIT_VRISE; |
369 | break; | 369 | break; |
370 | case OTG_STATE_A_WAIT_VRISE: | 370 | case OTG_STATE_A_WAIT_VRISE: |
371 | if (otg_ctrl->a_vbus_vld) | 371 | if (otg_ctrl->a_vbus_vld) |
372 | otg->state = OTG_STATE_A_WAIT_BCON; | 372 | phy->state = OTG_STATE_A_WAIT_BCON; |
373 | break; | 373 | break; |
374 | case OTG_STATE_A_WAIT_BCON: | 374 | case OTG_STATE_A_WAIT_BCON: |
375 | if (otg_ctrl->id || otg_ctrl->a_bus_drop | 375 | if (otg_ctrl->id || otg_ctrl->a_bus_drop |
376 | || otg_ctrl->a_wait_bcon_timeout) { | 376 | || otg_ctrl->a_wait_bcon_timeout) { |
377 | mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER); | 377 | mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER); |
378 | mvotg->otg_ctrl.a_wait_bcon_timeout = 0; | 378 | mvotg->otg_ctrl.a_wait_bcon_timeout = 0; |
379 | otg->state = OTG_STATE_A_WAIT_VFALL; | 379 | phy->state = OTG_STATE_A_WAIT_VFALL; |
380 | otg_ctrl->a_bus_req = 0; | 380 | otg_ctrl->a_bus_req = 0; |
381 | } else if (!otg_ctrl->a_vbus_vld) { | 381 | } else if (!otg_ctrl->a_vbus_vld) { |
382 | mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER); | 382 | mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER); |
383 | mvotg->otg_ctrl.a_wait_bcon_timeout = 0; | 383 | mvotg->otg_ctrl.a_wait_bcon_timeout = 0; |
384 | otg->state = OTG_STATE_A_VBUS_ERR; | 384 | phy->state = OTG_STATE_A_VBUS_ERR; |
385 | } else if (otg_ctrl->b_conn) { | 385 | } else if (otg_ctrl->b_conn) { |
386 | mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER); | 386 | mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER); |
387 | mvotg->otg_ctrl.a_wait_bcon_timeout = 0; | 387 | mvotg->otg_ctrl.a_wait_bcon_timeout = 0; |
388 | otg->state = OTG_STATE_A_HOST; | 388 | phy->state = OTG_STATE_A_HOST; |
389 | } | 389 | } |
390 | break; | 390 | break; |
391 | case OTG_STATE_A_HOST: | 391 | case OTG_STATE_A_HOST: |
392 | if (otg_ctrl->id || !otg_ctrl->b_conn | 392 | if (otg_ctrl->id || !otg_ctrl->b_conn |
393 | || otg_ctrl->a_bus_drop) | 393 | || otg_ctrl->a_bus_drop) |
394 | otg->state = OTG_STATE_A_WAIT_BCON; | 394 | phy->state = OTG_STATE_A_WAIT_BCON; |
395 | else if (!otg_ctrl->a_vbus_vld) | 395 | else if (!otg_ctrl->a_vbus_vld) |
396 | otg->state = OTG_STATE_A_VBUS_ERR; | 396 | phy->state = OTG_STATE_A_VBUS_ERR; |
397 | break; | 397 | break; |
398 | case OTG_STATE_A_WAIT_VFALL: | 398 | case OTG_STATE_A_WAIT_VFALL: |
399 | if (otg_ctrl->id | 399 | if (otg_ctrl->id |
400 | || (!otg_ctrl->b_conn && otg_ctrl->a_sess_vld) | 400 | || (!otg_ctrl->b_conn && otg_ctrl->a_sess_vld) |
401 | || otg_ctrl->a_bus_req) | 401 | || otg_ctrl->a_bus_req) |
402 | otg->state = OTG_STATE_A_IDLE; | 402 | phy->state = OTG_STATE_A_IDLE; |
403 | break; | 403 | break; |
404 | case OTG_STATE_A_VBUS_ERR: | 404 | case OTG_STATE_A_VBUS_ERR: |
405 | if (otg_ctrl->id || otg_ctrl->a_clr_err | 405 | if (otg_ctrl->id || otg_ctrl->a_clr_err |
406 | || otg_ctrl->a_bus_drop) { | 406 | || otg_ctrl->a_bus_drop) { |
407 | otg_ctrl->a_clr_err = 0; | 407 | otg_ctrl->a_clr_err = 0; |
408 | otg->state = OTG_STATE_A_WAIT_VFALL; | 408 | phy->state = OTG_STATE_A_WAIT_VFALL; |
409 | } | 409 | } |
410 | break; | 410 | break; |
411 | default: | 411 | default: |
@@ -416,15 +416,17 @@ static void mv_otg_update_state(struct mv_otg *mvotg) | |||
416 | static void mv_otg_work(struct work_struct *work) | 416 | static void mv_otg_work(struct work_struct *work) |
417 | { | 417 | { |
418 | struct mv_otg *mvotg; | 418 | struct mv_otg *mvotg; |
419 | struct otg_transceiver *otg; | 419 | struct usb_phy *phy; |
420 | struct usb_otg *otg; | ||
420 | int old_state; | 421 | int old_state; |
421 | 422 | ||
422 | mvotg = container_of((struct delayed_work *)work, struct mv_otg, work); | 423 | mvotg = container_of((struct delayed_work *)work, struct mv_otg, work); |
423 | 424 | ||
424 | run: | 425 | run: |
425 | /* work queue is single thread, or we need spin_lock to protect */ | 426 | /* work queue is single thread, or we need spin_lock to protect */ |
426 | otg = &mvotg->otg; | 427 | phy = &mvotg->phy; |
427 | old_state = otg->state; | 428 | otg = phy->otg; |
429 | old_state = phy->state; | ||
428 | 430 | ||
429 | if (!mvotg->active) | 431 | if (!mvotg->active) |
430 | return; | 432 | return; |
@@ -432,14 +434,14 @@ run: | |||
432 | mv_otg_update_inputs(mvotg); | 434 | mv_otg_update_inputs(mvotg); |
433 | mv_otg_update_state(mvotg); | 435 | mv_otg_update_state(mvotg); |
434 | 436 | ||
435 | if (old_state != otg->state) { | 437 | if (old_state != phy->state) { |
436 | dev_info(&mvotg->pdev->dev, "change from state %s to %s\n", | 438 | dev_info(&mvotg->pdev->dev, "change from state %s to %s\n", |
437 | state_string[old_state], | 439 | state_string[old_state], |
438 | state_string[otg->state]); | 440 | state_string[phy->state]); |
439 | 441 | ||
440 | switch (otg->state) { | 442 | switch (phy->state) { |
441 | case OTG_STATE_B_IDLE: | 443 | case OTG_STATE_B_IDLE: |
442 | mvotg->otg.default_a = 0; | 444 | otg->default_a = 0; |
443 | if (old_state == OTG_STATE_B_PERIPHERAL) | 445 | if (old_state == OTG_STATE_B_PERIPHERAL) |
444 | mv_otg_start_periphrals(mvotg, 0); | 446 | mv_otg_start_periphrals(mvotg, 0); |
445 | mv_otg_reset(mvotg); | 447 | mv_otg_reset(mvotg); |
@@ -450,14 +452,14 @@ run: | |||
450 | mv_otg_start_periphrals(mvotg, 1); | 452 | mv_otg_start_periphrals(mvotg, 1); |
451 | break; | 453 | break; |
452 | case OTG_STATE_A_IDLE: | 454 | case OTG_STATE_A_IDLE: |
453 | mvotg->otg.default_a = 1; | 455 | otg->default_a = 1; |
454 | mv_otg_enable(mvotg); | 456 | mv_otg_enable(mvotg); |
455 | if (old_state == OTG_STATE_A_WAIT_VFALL) | 457 | if (old_state == OTG_STATE_A_WAIT_VFALL) |
456 | mv_otg_start_host(mvotg, 0); | 458 | mv_otg_start_host(mvotg, 0); |
457 | mv_otg_reset(mvotg); | 459 | mv_otg_reset(mvotg); |
458 | break; | 460 | break; |
459 | case OTG_STATE_A_WAIT_VRISE: | 461 | case OTG_STATE_A_WAIT_VRISE: |
460 | mv_otg_set_vbus(&mvotg->otg, 1); | 462 | mv_otg_set_vbus(otg, 1); |
461 | break; | 463 | break; |
462 | case OTG_STATE_A_WAIT_BCON: | 464 | case OTG_STATE_A_WAIT_BCON: |
463 | if (old_state != OTG_STATE_A_HOST) | 465 | if (old_state != OTG_STATE_A_HOST) |
@@ -479,7 +481,7 @@ run: | |||
479 | * here. In fact, it need host driver to notify us. | 481 | * here. In fact, it need host driver to notify us. |
480 | */ | 482 | */ |
481 | mvotg->otg_ctrl.b_conn = 0; | 483 | mvotg->otg_ctrl.b_conn = 0; |
482 | mv_otg_set_vbus(&mvotg->otg, 0); | 484 | mv_otg_set_vbus(otg, 0); |
483 | break; | 485 | break; |
484 | case OTG_STATE_A_VBUS_ERR: | 486 | case OTG_STATE_A_VBUS_ERR: |
485 | break; | 487 | break; |
@@ -548,8 +550,8 @@ set_a_bus_req(struct device *dev, struct device_attribute *attr, | |||
548 | return -1; | 550 | return -1; |
549 | 551 | ||
550 | /* We will use this interface to change to A device */ | 552 | /* We will use this interface to change to A device */ |
551 | if (mvotg->otg.state != OTG_STATE_B_IDLE | 553 | if (mvotg->phy.state != OTG_STATE_B_IDLE |
552 | && mvotg->otg.state != OTG_STATE_A_IDLE) | 554 | && mvotg->phy.state != OTG_STATE_A_IDLE) |
553 | return -1; | 555 | return -1; |
554 | 556 | ||
555 | /* The clock may disabled and we need to set irq for ID detected */ | 557 | /* The clock may disabled and we need to set irq for ID detected */ |
@@ -579,7 +581,7 @@ set_a_clr_err(struct device *dev, struct device_attribute *attr, | |||
579 | const char *buf, size_t count) | 581 | const char *buf, size_t count) |
580 | { | 582 | { |
581 | struct mv_otg *mvotg = dev_get_drvdata(dev); | 583 | struct mv_otg *mvotg = dev_get_drvdata(dev); |
582 | if (!mvotg->otg.default_a) | 584 | if (!mvotg->phy.otg->default_a) |
583 | return -1; | 585 | return -1; |
584 | 586 | ||
585 | if (count > 2) | 587 | if (count > 2) |
@@ -615,7 +617,7 @@ set_a_bus_drop(struct device *dev, struct device_attribute *attr, | |||
615 | const char *buf, size_t count) | 617 | const char *buf, size_t count) |
616 | { | 618 | { |
617 | struct mv_otg *mvotg = dev_get_drvdata(dev); | 619 | struct mv_otg *mvotg = dev_get_drvdata(dev); |
618 | if (!mvotg->otg.default_a) | 620 | if (!mvotg->phy.otg->default_a) |
619 | return -1; | 621 | return -1; |
620 | 622 | ||
621 | if (count > 2) | 623 | if (count > 2) |
@@ -688,9 +690,10 @@ int mv_otg_remove(struct platform_device *pdev) | |||
688 | for (clk_i = 0; clk_i <= mvotg->clknum; clk_i++) | 690 | for (clk_i = 0; clk_i <= mvotg->clknum; clk_i++) |
689 | clk_put(mvotg->clk[clk_i]); | 691 | clk_put(mvotg->clk[clk_i]); |
690 | 692 | ||
691 | otg_set_transceiver(NULL); | 693 | usb_set_transceiver(NULL); |
692 | platform_set_drvdata(pdev, NULL); | 694 | platform_set_drvdata(pdev, NULL); |
693 | 695 | ||
696 | kfree(mvotg->phy.otg); | ||
694 | kfree(mvotg); | 697 | kfree(mvotg); |
695 | 698 | ||
696 | return 0; | 699 | return 0; |
@@ -700,6 +703,7 @@ static int mv_otg_probe(struct platform_device *pdev) | |||
700 | { | 703 | { |
701 | struct mv_usb_platform_data *pdata = pdev->dev.platform_data; | 704 | struct mv_usb_platform_data *pdata = pdev->dev.platform_data; |
702 | struct mv_otg *mvotg; | 705 | struct mv_otg *mvotg; |
706 | struct usb_otg *otg; | ||
703 | struct resource *r; | 707 | struct resource *r; |
704 | int retval = 0, clk_i, i; | 708 | int retval = 0, clk_i, i; |
705 | size_t size; | 709 | size_t size; |
@@ -716,6 +720,12 @@ static int mv_otg_probe(struct platform_device *pdev) | |||
716 | return -ENOMEM; | 720 | return -ENOMEM; |
717 | } | 721 | } |
718 | 722 | ||
723 | otg = kzalloc(sizeof *otg, GFP_KERNEL); | ||
724 | if (!otg) { | ||
725 | kfree(mvotg); | ||
726 | return -ENOMEM; | ||
727 | } | ||
728 | |||
719 | platform_set_drvdata(pdev, mvotg); | 729 | platform_set_drvdata(pdev, mvotg); |
720 | 730 | ||
721 | mvotg->pdev = pdev; | 731 | mvotg->pdev = pdev; |
@@ -741,12 +751,15 @@ static int mv_otg_probe(struct platform_device *pdev) | |||
741 | 751 | ||
742 | /* OTG common part */ | 752 | /* OTG common part */ |
743 | mvotg->pdev = pdev; | 753 | mvotg->pdev = pdev; |
744 | mvotg->otg.dev = &pdev->dev; | 754 | mvotg->phy.dev = &pdev->dev; |
745 | mvotg->otg.label = driver_name; | 755 | mvotg->phy.otg = otg; |
746 | mvotg->otg.set_host = mv_otg_set_host; | 756 | mvotg->phy.label = driver_name; |
747 | mvotg->otg.set_peripheral = mv_otg_set_peripheral; | 757 | mvotg->phy.state = OTG_STATE_UNDEFINED; |
748 | mvotg->otg.set_vbus = mv_otg_set_vbus; | 758 | |
749 | mvotg->otg.state = OTG_STATE_UNDEFINED; | 759 | otg->phy = &mvotg->phy; |
760 | otg->set_host = mv_otg_set_host; | ||
761 | otg->set_peripheral = mv_otg_set_peripheral; | ||
762 | otg->set_vbus = mv_otg_set_vbus; | ||
750 | 763 | ||
751 | for (i = 0; i < OTG_TIMER_NUM; i++) | 764 | for (i = 0; i < OTG_TIMER_NUM; i++) |
752 | init_timer(&mvotg->otg_ctrl.timer[i]); | 765 | init_timer(&mvotg->otg_ctrl.timer[i]); |
@@ -840,7 +853,7 @@ static int mv_otg_probe(struct platform_device *pdev) | |||
840 | goto err_disable_clk; | 853 | goto err_disable_clk; |
841 | } | 854 | } |
842 | 855 | ||
843 | retval = otg_set_transceiver(&mvotg->otg); | 856 | retval = usb_set_transceiver(&mvotg->phy); |
844 | if (retval < 0) { | 857 | if (retval < 0) { |
845 | dev_err(&pdev->dev, "can't register transceiver, %d\n", | 858 | dev_err(&pdev->dev, "can't register transceiver, %d\n", |
846 | retval); | 859 | retval); |
@@ -867,7 +880,7 @@ static int mv_otg_probe(struct platform_device *pdev) | |||
867 | return 0; | 880 | return 0; |
868 | 881 | ||
869 | err_set_transceiver: | 882 | err_set_transceiver: |
870 | otg_set_transceiver(NULL); | 883 | usb_set_transceiver(NULL); |
871 | err_free_irq: | 884 | err_free_irq: |
872 | free_irq(mvotg->irq, mvotg); | 885 | free_irq(mvotg->irq, mvotg); |
873 | err_disable_clk: | 886 | err_disable_clk: |
@@ -888,6 +901,7 @@ err_put_clk: | |||
888 | clk_put(mvotg->clk[clk_i]); | 901 | clk_put(mvotg->clk[clk_i]); |
889 | 902 | ||
890 | platform_set_drvdata(pdev, NULL); | 903 | platform_set_drvdata(pdev, NULL); |
904 | kfree(otg); | ||
891 | kfree(mvotg); | 905 | kfree(mvotg); |
892 | 906 | ||
893 | return retval; | 907 | return retval; |
@@ -898,10 +912,10 @@ static int mv_otg_suspend(struct platform_device *pdev, pm_message_t state) | |||
898 | { | 912 | { |
899 | struct mv_otg *mvotg = platform_get_drvdata(pdev); | 913 | struct mv_otg *mvotg = platform_get_drvdata(pdev); |
900 | 914 | ||
901 | if (mvotg->otg.state != OTG_STATE_B_IDLE) { | 915 | if (mvotg->phy.state != OTG_STATE_B_IDLE) { |
902 | dev_info(&pdev->dev, | 916 | dev_info(&pdev->dev, |
903 | "OTG state is not B_IDLE, it is %d!\n", | 917 | "OTG state is not B_IDLE, it is %d!\n", |
904 | mvotg->otg.state); | 918 | mvotg->phy.state); |
905 | return -EAGAIN; | 919 | return -EAGAIN; |
906 | } | 920 | } |
907 | 921 | ||
diff --git a/drivers/usb/otg/mv_otg.h b/drivers/usb/otg/mv_otg.h index be6ca1437645..8a9e351b36ba 100644 --- a/drivers/usb/otg/mv_otg.h +++ b/drivers/usb/otg/mv_otg.h | |||
@@ -136,7 +136,7 @@ struct mv_otg_regs { | |||
136 | }; | 136 | }; |
137 | 137 | ||
138 | struct mv_otg { | 138 | struct mv_otg { |
139 | struct otg_transceiver otg; | 139 | struct usb_phy phy; |
140 | struct mv_otg_ctrl otg_ctrl; | 140 | struct mv_otg_ctrl otg_ctrl; |
141 | 141 | ||
142 | /* base address */ | 142 | /* base address */ |
diff --git a/drivers/usb/otg/nop-usb-xceiv.c b/drivers/usb/otg/nop-usb-xceiv.c index c1e360046435..58b26df6afd1 100644 --- a/drivers/usb/otg/nop-usb-xceiv.c +++ b/drivers/usb/otg/nop-usb-xceiv.c | |||
@@ -33,7 +33,7 @@ | |||
33 | #include <linux/slab.h> | 33 | #include <linux/slab.h> |
34 | 34 | ||
35 | struct nop_usb_xceiv { | 35 | struct nop_usb_xceiv { |
36 | struct otg_transceiver otg; | 36 | struct usb_phy phy; |
37 | struct device *dev; | 37 | struct device *dev; |
38 | }; | 38 | }; |
39 | 39 | ||
@@ -58,51 +58,37 @@ void usb_nop_xceiv_unregister(void) | |||
58 | } | 58 | } |
59 | EXPORT_SYMBOL(usb_nop_xceiv_unregister); | 59 | EXPORT_SYMBOL(usb_nop_xceiv_unregister); |
60 | 60 | ||
61 | static inline struct nop_usb_xceiv *xceiv_to_nop(struct otg_transceiver *x) | 61 | static int nop_set_suspend(struct usb_phy *x, int suspend) |
62 | { | ||
63 | return container_of(x, struct nop_usb_xceiv, otg); | ||
64 | } | ||
65 | |||
66 | static int nop_set_suspend(struct otg_transceiver *x, int suspend) | ||
67 | { | 62 | { |
68 | return 0; | 63 | return 0; |
69 | } | 64 | } |
70 | 65 | ||
71 | static int nop_set_peripheral(struct otg_transceiver *x, | 66 | static int nop_set_peripheral(struct usb_otg *otg, struct usb_gadget *gadget) |
72 | struct usb_gadget *gadget) | ||
73 | { | 67 | { |
74 | struct nop_usb_xceiv *nop; | 68 | if (!otg) |
75 | |||
76 | if (!x) | ||
77 | return -ENODEV; | 69 | return -ENODEV; |
78 | 70 | ||
79 | nop = xceiv_to_nop(x); | ||
80 | |||
81 | if (!gadget) { | 71 | if (!gadget) { |
82 | nop->otg.gadget = NULL; | 72 | otg->gadget = NULL; |
83 | return -ENODEV; | 73 | return -ENODEV; |
84 | } | 74 | } |
85 | 75 | ||
86 | nop->otg.gadget = gadget; | 76 | otg->gadget = gadget; |
87 | nop->otg.state = OTG_STATE_B_IDLE; | 77 | otg->phy->state = OTG_STATE_B_IDLE; |
88 | return 0; | 78 | return 0; |
89 | } | 79 | } |
90 | 80 | ||
91 | static int nop_set_host(struct otg_transceiver *x, struct usb_bus *host) | 81 | static int nop_set_host(struct usb_otg *otg, struct usb_bus *host) |
92 | { | 82 | { |
93 | struct nop_usb_xceiv *nop; | 83 | if (!otg) |
94 | |||
95 | if (!x) | ||
96 | return -ENODEV; | 84 | return -ENODEV; |
97 | 85 | ||
98 | nop = xceiv_to_nop(x); | ||
99 | |||
100 | if (!host) { | 86 | if (!host) { |
101 | nop->otg.host = NULL; | 87 | otg->host = NULL; |
102 | return -ENODEV; | 88 | return -ENODEV; |
103 | } | 89 | } |
104 | 90 | ||
105 | nop->otg.host = host; | 91 | otg->host = host; |
106 | return 0; | 92 | return 0; |
107 | } | 93 | } |
108 | 94 | ||
@@ -115,15 +101,23 @@ static int __devinit nop_usb_xceiv_probe(struct platform_device *pdev) | |||
115 | if (!nop) | 101 | if (!nop) |
116 | return -ENOMEM; | 102 | return -ENOMEM; |
117 | 103 | ||
104 | nop->phy.otg = kzalloc(sizeof *nop->phy.otg, GFP_KERNEL); | ||
105 | if (!nop->phy.otg) { | ||
106 | kfree(nop); | ||
107 | return -ENOMEM; | ||
108 | } | ||
109 | |||
118 | nop->dev = &pdev->dev; | 110 | nop->dev = &pdev->dev; |
119 | nop->otg.dev = nop->dev; | 111 | nop->phy.dev = nop->dev; |
120 | nop->otg.label = "nop-xceiv"; | 112 | nop->phy.label = "nop-xceiv"; |
121 | nop->otg.state = OTG_STATE_UNDEFINED; | 113 | nop->phy.set_suspend = nop_set_suspend; |
122 | nop->otg.set_host = nop_set_host; | 114 | nop->phy.state = OTG_STATE_UNDEFINED; |
123 | nop->otg.set_peripheral = nop_set_peripheral; | 115 | |
124 | nop->otg.set_suspend = nop_set_suspend; | 116 | nop->phy.otg->phy = &nop->phy; |
125 | 117 | nop->phy.otg->set_host = nop_set_host; | |
126 | err = otg_set_transceiver(&nop->otg); | 118 | nop->phy.otg->set_peripheral = nop_set_peripheral; |
119 | |||
120 | err = usb_set_transceiver(&nop->phy); | ||
127 | if (err) { | 121 | if (err) { |
128 | dev_err(&pdev->dev, "can't register transceiver, err: %d\n", | 122 | dev_err(&pdev->dev, "can't register transceiver, err: %d\n", |
129 | err); | 123 | err); |
@@ -132,10 +126,11 @@ static int __devinit nop_usb_xceiv_probe(struct platform_device *pdev) | |||
132 | 126 | ||
133 | platform_set_drvdata(pdev, nop); | 127 | platform_set_drvdata(pdev, nop); |
134 | 128 | ||
135 | ATOMIC_INIT_NOTIFIER_HEAD(&nop->otg.notifier); | 129 | ATOMIC_INIT_NOTIFIER_HEAD(&nop->phy.notifier); |
136 | 130 | ||
137 | return 0; | 131 | return 0; |
138 | exit: | 132 | exit: |
133 | kfree(nop->phy.otg); | ||
139 | kfree(nop); | 134 | kfree(nop); |
140 | return err; | 135 | return err; |
141 | } | 136 | } |
@@ -144,9 +139,10 @@ static int __devexit nop_usb_xceiv_remove(struct platform_device *pdev) | |||
144 | { | 139 | { |
145 | struct nop_usb_xceiv *nop = platform_get_drvdata(pdev); | 140 | struct nop_usb_xceiv *nop = platform_get_drvdata(pdev); |
146 | 141 | ||
147 | otg_set_transceiver(NULL); | 142 | usb_set_transceiver(NULL); |
148 | 143 | ||
149 | platform_set_drvdata(pdev, NULL); | 144 | platform_set_drvdata(pdev, NULL); |
145 | kfree(nop->phy.otg); | ||
150 | kfree(nop); | 146 | kfree(nop); |
151 | 147 | ||
152 | return 0; | 148 | return 0; |
diff --git a/drivers/usb/otg/otg.c b/drivers/usb/otg/otg.c index 307c27bc51eb..801e597a1541 100644 --- a/drivers/usb/otg/otg.c +++ b/drivers/usb/otg/otg.c | |||
@@ -15,56 +15,56 @@ | |||
15 | 15 | ||
16 | #include <linux/usb/otg.h> | 16 | #include <linux/usb/otg.h> |
17 | 17 | ||
18 | static struct otg_transceiver *xceiv; | 18 | static struct usb_phy *phy; |
19 | 19 | ||
20 | /** | 20 | /** |
21 | * otg_get_transceiver - find the (single) OTG transceiver | 21 | * usb_get_transceiver - find the (single) USB transceiver |
22 | * | 22 | * |
23 | * Returns the transceiver driver, after getting a refcount to it; or | 23 | * Returns the transceiver driver, after getting a refcount to it; or |
24 | * null if there is no such transceiver. The caller is responsible for | 24 | * null if there is no such transceiver. The caller is responsible for |
25 | * calling otg_put_transceiver() to release that count. | 25 | * calling usb_put_transceiver() to release that count. |
26 | * | 26 | * |
27 | * For use by USB host and peripheral drivers. | 27 | * For use by USB host and peripheral drivers. |
28 | */ | 28 | */ |
29 | struct otg_transceiver *otg_get_transceiver(void) | 29 | struct usb_phy *usb_get_transceiver(void) |
30 | { | 30 | { |
31 | if (xceiv) | 31 | if (phy) |
32 | get_device(xceiv->dev); | 32 | get_device(phy->dev); |
33 | return xceiv; | 33 | return phy; |
34 | } | 34 | } |
35 | EXPORT_SYMBOL(otg_get_transceiver); | 35 | EXPORT_SYMBOL(usb_get_transceiver); |
36 | 36 | ||
37 | /** | 37 | /** |
38 | * otg_put_transceiver - release the (single) OTG transceiver | 38 | * usb_put_transceiver - release the (single) USB transceiver |
39 | * @x: the transceiver returned by otg_get_transceiver() | 39 | * @x: the transceiver returned by usb_get_transceiver() |
40 | * | 40 | * |
41 | * Releases a refcount the caller received from otg_get_transceiver(). | 41 | * Releases a refcount the caller received from usb_get_transceiver(). |
42 | * | 42 | * |
43 | * For use by USB host and peripheral drivers. | 43 | * For use by USB host and peripheral drivers. |
44 | */ | 44 | */ |
45 | void otg_put_transceiver(struct otg_transceiver *x) | 45 | void usb_put_transceiver(struct usb_phy *x) |
46 | { | 46 | { |
47 | if (x) | 47 | if (x) |
48 | put_device(x->dev); | 48 | put_device(x->dev); |
49 | } | 49 | } |
50 | EXPORT_SYMBOL(otg_put_transceiver); | 50 | EXPORT_SYMBOL(usb_put_transceiver); |
51 | 51 | ||
52 | /** | 52 | /** |
53 | * otg_set_transceiver - declare the (single) OTG transceiver | 53 | * usb_set_transceiver - declare the (single) USB transceiver |
54 | * @x: the USB OTG transceiver to be used; or NULL | 54 | * @x: the USB transceiver to be used; or NULL |
55 | * | 55 | * |
56 | * This call is exclusively for use by transceiver drivers, which | 56 | * This call is exclusively for use by transceiver drivers, which |
57 | * coordinate the activities of drivers for host and peripheral | 57 | * coordinate the activities of drivers for host and peripheral |
58 | * controllers, and in some cases for VBUS current regulation. | 58 | * controllers, and in some cases for VBUS current regulation. |
59 | */ | 59 | */ |
60 | int otg_set_transceiver(struct otg_transceiver *x) | 60 | int usb_set_transceiver(struct usb_phy *x) |
61 | { | 61 | { |
62 | if (xceiv && x) | 62 | if (phy && x) |
63 | return -EBUSY; | 63 | return -EBUSY; |
64 | xceiv = x; | 64 | phy = x; |
65 | return 0; | 65 | return 0; |
66 | } | 66 | } |
67 | EXPORT_SYMBOL(otg_set_transceiver); | 67 | EXPORT_SYMBOL(usb_set_transceiver); |
68 | 68 | ||
69 | const char *otg_state_string(enum usb_otg_state state) | 69 | const char *otg_state_string(enum usb_otg_state state) |
70 | { | 70 | { |
diff --git a/drivers/usb/otg/otg_fsm.c b/drivers/usb/otg/otg_fsm.c index 09117387d2a4..ade131a8ae5e 100644 --- a/drivers/usb/otg/otg_fsm.c +++ b/drivers/usb/otg/otg_fsm.c | |||
@@ -117,10 +117,10 @@ void otg_leave_state(struct otg_fsm *fsm, enum usb_otg_state old_state) | |||
117 | int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state) | 117 | int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state) |
118 | { | 118 | { |
119 | state_changed = 1; | 119 | state_changed = 1; |
120 | if (fsm->transceiver->state == new_state) | 120 | if (fsm->otg->phy->state == new_state) |
121 | return 0; | 121 | return 0; |
122 | VDBG("Set state: %s\n", otg_state_string(new_state)); | 122 | VDBG("Set state: %s\n", otg_state_string(new_state)); |
123 | otg_leave_state(fsm, fsm->transceiver->state); | 123 | otg_leave_state(fsm, fsm->otg->phy->state); |
124 | switch (new_state) { | 124 | switch (new_state) { |
125 | case OTG_STATE_B_IDLE: | 125 | case OTG_STATE_B_IDLE: |
126 | otg_drv_vbus(fsm, 0); | 126 | otg_drv_vbus(fsm, 0); |
@@ -155,8 +155,8 @@ int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state) | |||
155 | otg_loc_conn(fsm, 0); | 155 | otg_loc_conn(fsm, 0); |
156 | otg_loc_sof(fsm, 1); | 156 | otg_loc_sof(fsm, 1); |
157 | otg_set_protocol(fsm, PROTO_HOST); | 157 | otg_set_protocol(fsm, PROTO_HOST); |
158 | usb_bus_start_enum(fsm->transceiver->host, | 158 | usb_bus_start_enum(fsm->otg->host, |
159 | fsm->transceiver->host->otg_port); | 159 | fsm->otg->host->otg_port); |
160 | break; | 160 | break; |
161 | case OTG_STATE_A_IDLE: | 161 | case OTG_STATE_A_IDLE: |
162 | otg_drv_vbus(fsm, 0); | 162 | otg_drv_vbus(fsm, 0); |
@@ -221,7 +221,7 @@ int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state) | |||
221 | break; | 221 | break; |
222 | } | 222 | } |
223 | 223 | ||
224 | fsm->transceiver->state = new_state; | 224 | fsm->otg->phy->state = new_state; |
225 | return 0; | 225 | return 0; |
226 | } | 226 | } |
227 | 227 | ||
@@ -233,7 +233,7 @@ int otg_statemachine(struct otg_fsm *fsm) | |||
233 | 233 | ||
234 | spin_lock_irqsave(&fsm->lock, flags); | 234 | spin_lock_irqsave(&fsm->lock, flags); |
235 | 235 | ||
236 | state = fsm->transceiver->state; | 236 | state = fsm->otg->phy->state; |
237 | state_changed = 0; | 237 | state_changed = 0; |
238 | /* State machine state change judgement */ | 238 | /* State machine state change judgement */ |
239 | 239 | ||
@@ -248,7 +248,7 @@ int otg_statemachine(struct otg_fsm *fsm) | |||
248 | case OTG_STATE_B_IDLE: | 248 | case OTG_STATE_B_IDLE: |
249 | if (!fsm->id) | 249 | if (!fsm->id) |
250 | otg_set_state(fsm, OTG_STATE_A_IDLE); | 250 | otg_set_state(fsm, OTG_STATE_A_IDLE); |
251 | else if (fsm->b_sess_vld && fsm->transceiver->gadget) | 251 | else if (fsm->b_sess_vld && fsm->otg->gadget) |
252 | otg_set_state(fsm, OTG_STATE_B_PERIPHERAL); | 252 | otg_set_state(fsm, OTG_STATE_B_PERIPHERAL); |
253 | else if (fsm->b_bus_req && fsm->b_sess_end && fsm->b_se0_srp) | 253 | else if (fsm->b_bus_req && fsm->b_sess_end && fsm->b_se0_srp) |
254 | otg_set_state(fsm, OTG_STATE_B_SRP_INIT); | 254 | otg_set_state(fsm, OTG_STATE_B_SRP_INIT); |
@@ -260,7 +260,7 @@ int otg_statemachine(struct otg_fsm *fsm) | |||
260 | case OTG_STATE_B_PERIPHERAL: | 260 | case OTG_STATE_B_PERIPHERAL: |
261 | if (!fsm->id || !fsm->b_sess_vld) | 261 | if (!fsm->id || !fsm->b_sess_vld) |
262 | otg_set_state(fsm, OTG_STATE_B_IDLE); | 262 | otg_set_state(fsm, OTG_STATE_B_IDLE); |
263 | else if (fsm->b_bus_req && fsm->transceiver-> | 263 | else if (fsm->b_bus_req && fsm->otg-> |
264 | gadget->b_hnp_enable && fsm->a_bus_suspend) | 264 | gadget->b_hnp_enable && fsm->a_bus_suspend) |
265 | otg_set_state(fsm, OTG_STATE_B_WAIT_ACON); | 265 | otg_set_state(fsm, OTG_STATE_B_WAIT_ACON); |
266 | break; | 266 | break; |
@@ -302,7 +302,7 @@ int otg_statemachine(struct otg_fsm *fsm) | |||
302 | break; | 302 | break; |
303 | case OTG_STATE_A_HOST: | 303 | case OTG_STATE_A_HOST: |
304 | if ((!fsm->a_bus_req || fsm->a_suspend_req) && | 304 | if ((!fsm->a_bus_req || fsm->a_suspend_req) && |
305 | fsm->transceiver->host->b_hnp_enable) | 305 | fsm->otg->host->b_hnp_enable) |
306 | otg_set_state(fsm, OTG_STATE_A_SUSPEND); | 306 | otg_set_state(fsm, OTG_STATE_A_SUSPEND); |
307 | else if (fsm->id || !fsm->b_conn || fsm->a_bus_drop) | 307 | else if (fsm->id || !fsm->b_conn || fsm->a_bus_drop) |
308 | otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); | 308 | otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); |
@@ -310,9 +310,9 @@ int otg_statemachine(struct otg_fsm *fsm) | |||
310 | otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); | 310 | otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); |
311 | break; | 311 | break; |
312 | case OTG_STATE_A_SUSPEND: | 312 | case OTG_STATE_A_SUSPEND: |
313 | if (!fsm->b_conn && fsm->transceiver->host->b_hnp_enable) | 313 | if (!fsm->b_conn && fsm->otg->host->b_hnp_enable) |
314 | otg_set_state(fsm, OTG_STATE_A_PERIPHERAL); | 314 | otg_set_state(fsm, OTG_STATE_A_PERIPHERAL); |
315 | else if (!fsm->b_conn && !fsm->transceiver->host->b_hnp_enable) | 315 | else if (!fsm->b_conn && !fsm->otg->host->b_hnp_enable) |
316 | otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); | 316 | otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); |
317 | else if (fsm->a_bus_req || fsm->b_bus_resume) | 317 | else if (fsm->a_bus_req || fsm->b_bus_resume) |
318 | otg_set_state(fsm, OTG_STATE_A_HOST); | 318 | otg_set_state(fsm, OTG_STATE_A_HOST); |
diff --git a/drivers/usb/otg/otg_fsm.h b/drivers/usb/otg/otg_fsm.h index 0cecf1d593a0..c30a2e1d9e46 100644 --- a/drivers/usb/otg/otg_fsm.h +++ b/drivers/usb/otg/otg_fsm.h | |||
@@ -82,7 +82,7 @@ struct otg_fsm { | |||
82 | int loc_sof; | 82 | int loc_sof; |
83 | 83 | ||
84 | struct otg_fsm_ops *ops; | 84 | struct otg_fsm_ops *ops; |
85 | struct otg_transceiver *transceiver; | 85 | struct usb_otg *otg; |
86 | 86 | ||
87 | /* Current usb protocol used: 0:undefine; 1:host; 2:client */ | 87 | /* Current usb protocol used: 0:undefine; 1:host; 2:client */ |
88 | int protocol; | 88 | int protocol; |
diff --git a/drivers/usb/otg/twl4030-usb.c b/drivers/usb/otg/twl4030-usb.c index 14f66c358629..c4a86da858e2 100644 --- a/drivers/usb/otg/twl4030-usb.c +++ b/drivers/usb/otg/twl4030-usb.c | |||
@@ -144,7 +144,7 @@ | |||
144 | #define GPIO_USB_4PIN_ULPI_2430C (3 << 0) | 144 | #define GPIO_USB_4PIN_ULPI_2430C (3 << 0) |
145 | 145 | ||
146 | struct twl4030_usb { | 146 | struct twl4030_usb { |
147 | struct otg_transceiver otg; | 147 | struct usb_phy phy; |
148 | struct device *dev; | 148 | struct device *dev; |
149 | 149 | ||
150 | /* TWL4030 internal USB regulator supplies */ | 150 | /* TWL4030 internal USB regulator supplies */ |
@@ -166,7 +166,7 @@ struct twl4030_usb { | |||
166 | }; | 166 | }; |
167 | 167 | ||
168 | /* internal define on top of container_of */ | 168 | /* internal define on top of container_of */ |
169 | #define xceiv_to_twl(x) container_of((x), struct twl4030_usb, otg) | 169 | #define phy_to_twl(x) container_of((x), struct twl4030_usb, phy) |
170 | 170 | ||
171 | /*-------------------------------------------------------------------------*/ | 171 | /*-------------------------------------------------------------------------*/ |
172 | 172 | ||
@@ -246,10 +246,11 @@ twl4030_usb_clear_bits(struct twl4030_usb *twl, u8 reg, u8 bits) | |||
246 | 246 | ||
247 | /*-------------------------------------------------------------------------*/ | 247 | /*-------------------------------------------------------------------------*/ |
248 | 248 | ||
249 | static enum usb_xceiv_events twl4030_usb_linkstat(struct twl4030_usb *twl) | 249 | static enum usb_phy_events twl4030_usb_linkstat(struct twl4030_usb *twl) |
250 | { | 250 | { |
251 | int status; | 251 | int status; |
252 | int linkstat = USB_EVENT_NONE; | 252 | int linkstat = USB_EVENT_NONE; |
253 | struct usb_otg *otg = twl->phy.otg; | ||
253 | 254 | ||
254 | twl->vbus_supplied = false; | 255 | twl->vbus_supplied = false; |
255 | 256 | ||
@@ -281,7 +282,7 @@ static enum usb_xceiv_events twl4030_usb_linkstat(struct twl4030_usb *twl) | |||
281 | dev_dbg(twl->dev, "HW_CONDITIONS 0x%02x/%d; link %d\n", | 282 | dev_dbg(twl->dev, "HW_CONDITIONS 0x%02x/%d; link %d\n", |
282 | status, status, linkstat); | 283 | status, status, linkstat); |
283 | 284 | ||
284 | twl->otg.last_event = linkstat; | 285 | twl->phy.last_event = linkstat; |
285 | 286 | ||
286 | /* REVISIT this assumes host and peripheral controllers | 287 | /* REVISIT this assumes host and peripheral controllers |
287 | * are registered, and that both are active... | 288 | * are registered, and that both are active... |
@@ -290,11 +291,11 @@ static enum usb_xceiv_events twl4030_usb_linkstat(struct twl4030_usb *twl) | |||
290 | spin_lock_irq(&twl->lock); | 291 | spin_lock_irq(&twl->lock); |
291 | twl->linkstat = linkstat; | 292 | twl->linkstat = linkstat; |
292 | if (linkstat == USB_EVENT_ID) { | 293 | if (linkstat == USB_EVENT_ID) { |
293 | twl->otg.default_a = true; | 294 | otg->default_a = true; |
294 | twl->otg.state = OTG_STATE_A_IDLE; | 295 | twl->phy.state = OTG_STATE_A_IDLE; |
295 | } else { | 296 | } else { |
296 | twl->otg.default_a = false; | 297 | otg->default_a = false; |
297 | twl->otg.state = OTG_STATE_B_IDLE; | 298 | twl->phy.state = OTG_STATE_B_IDLE; |
298 | } | 299 | } |
299 | spin_unlock_irq(&twl->lock); | 300 | spin_unlock_irq(&twl->lock); |
300 | 301 | ||
@@ -520,8 +521,8 @@ static irqreturn_t twl4030_usb_irq(int irq, void *_twl) | |||
520 | else | 521 | else |
521 | twl4030_phy_resume(twl); | 522 | twl4030_phy_resume(twl); |
522 | 523 | ||
523 | atomic_notifier_call_chain(&twl->otg.notifier, status, | 524 | atomic_notifier_call_chain(&twl->phy.notifier, status, |
524 | twl->otg.gadget); | 525 | twl->phy.otg->gadget); |
525 | } | 526 | } |
526 | sysfs_notify(&twl->dev->kobj, NULL, "vbus"); | 527 | sysfs_notify(&twl->dev->kobj, NULL, "vbus"); |
527 | 528 | ||
@@ -542,15 +543,15 @@ static void twl4030_usb_phy_init(struct twl4030_usb *twl) | |||
542 | twl->asleep = 0; | 543 | twl->asleep = 0; |
543 | } | 544 | } |
544 | 545 | ||
545 | atomic_notifier_call_chain(&twl->otg.notifier, status, | 546 | atomic_notifier_call_chain(&twl->phy.notifier, status, |
546 | twl->otg.gadget); | 547 | twl->phy.otg->gadget); |
547 | } | 548 | } |
548 | sysfs_notify(&twl->dev->kobj, NULL, "vbus"); | 549 | sysfs_notify(&twl->dev->kobj, NULL, "vbus"); |
549 | } | 550 | } |
550 | 551 | ||
551 | static int twl4030_set_suspend(struct otg_transceiver *x, int suspend) | 552 | static int twl4030_set_suspend(struct usb_phy *x, int suspend) |
552 | { | 553 | { |
553 | struct twl4030_usb *twl = xceiv_to_twl(x); | 554 | struct twl4030_usb *twl = phy_to_twl(x); |
554 | 555 | ||
555 | if (suspend) | 556 | if (suspend) |
556 | twl4030_phy_suspend(twl, 1); | 557 | twl4030_phy_suspend(twl, 1); |
@@ -560,33 +561,27 @@ static int twl4030_set_suspend(struct otg_transceiver *x, int suspend) | |||
560 | return 0; | 561 | return 0; |
561 | } | 562 | } |
562 | 563 | ||
563 | static int twl4030_set_peripheral(struct otg_transceiver *x, | 564 | static int twl4030_set_peripheral(struct usb_otg *otg, |
564 | struct usb_gadget *gadget) | 565 | struct usb_gadget *gadget) |
565 | { | 566 | { |
566 | struct twl4030_usb *twl; | 567 | if (!otg) |
567 | |||
568 | if (!x) | ||
569 | return -ENODEV; | 568 | return -ENODEV; |
570 | 569 | ||
571 | twl = xceiv_to_twl(x); | 570 | otg->gadget = gadget; |
572 | twl->otg.gadget = gadget; | ||
573 | if (!gadget) | 571 | if (!gadget) |
574 | twl->otg.state = OTG_STATE_UNDEFINED; | 572 | otg->phy->state = OTG_STATE_UNDEFINED; |
575 | 573 | ||
576 | return 0; | 574 | return 0; |
577 | } | 575 | } |
578 | 576 | ||
579 | static int twl4030_set_host(struct otg_transceiver *x, struct usb_bus *host) | 577 | static int twl4030_set_host(struct usb_otg *otg, struct usb_bus *host) |
580 | { | 578 | { |
581 | struct twl4030_usb *twl; | 579 | if (!otg) |
582 | |||
583 | if (!x) | ||
584 | return -ENODEV; | 580 | return -ENODEV; |
585 | 581 | ||
586 | twl = xceiv_to_twl(x); | 582 | otg->host = host; |
587 | twl->otg.host = host; | ||
588 | if (!host) | 583 | if (!host) |
589 | twl->otg.state = OTG_STATE_UNDEFINED; | 584 | otg->phy->state = OTG_STATE_UNDEFINED; |
590 | 585 | ||
591 | return 0; | 586 | return 0; |
592 | } | 587 | } |
@@ -596,6 +591,7 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev) | |||
596 | struct twl4030_usb_data *pdata = pdev->dev.platform_data; | 591 | struct twl4030_usb_data *pdata = pdev->dev.platform_data; |
597 | struct twl4030_usb *twl; | 592 | struct twl4030_usb *twl; |
598 | int status, err; | 593 | int status, err; |
594 | struct usb_otg *otg; | ||
599 | 595 | ||
600 | if (!pdata) { | 596 | if (!pdata) { |
601 | dev_dbg(&pdev->dev, "platform_data not available\n"); | 597 | dev_dbg(&pdev->dev, "platform_data not available\n"); |
@@ -606,16 +602,26 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev) | |||
606 | if (!twl) | 602 | if (!twl) |
607 | return -ENOMEM; | 603 | return -ENOMEM; |
608 | 604 | ||
605 | otg = kzalloc(sizeof *otg, GFP_KERNEL); | ||
606 | if (!otg) { | ||
607 | kfree(twl); | ||
608 | return -ENOMEM; | ||
609 | } | ||
610 | |||
609 | twl->dev = &pdev->dev; | 611 | twl->dev = &pdev->dev; |
610 | twl->irq = platform_get_irq(pdev, 0); | 612 | twl->irq = platform_get_irq(pdev, 0); |
611 | twl->otg.dev = twl->dev; | ||
612 | twl->otg.label = "twl4030"; | ||
613 | twl->otg.set_host = twl4030_set_host; | ||
614 | twl->otg.set_peripheral = twl4030_set_peripheral; | ||
615 | twl->otg.set_suspend = twl4030_set_suspend; | ||
616 | twl->usb_mode = pdata->usb_mode; | 613 | twl->usb_mode = pdata->usb_mode; |
617 | twl->vbus_supplied = false; | 614 | twl->vbus_supplied = false; |
618 | twl->asleep = 1; | 615 | twl->asleep = 1; |
616 | |||
617 | twl->phy.dev = twl->dev; | ||
618 | twl->phy.label = "twl4030"; | ||
619 | twl->phy.otg = otg; | ||
620 | twl->phy.set_suspend = twl4030_set_suspend; | ||
621 | |||
622 | otg->phy = &twl->phy; | ||
623 | otg->set_host = twl4030_set_host; | ||
624 | otg->set_peripheral = twl4030_set_peripheral; | ||
619 | 625 | ||
620 | /* init spinlock for workqueue */ | 626 | /* init spinlock for workqueue */ |
621 | spin_lock_init(&twl->lock); | 627 | spin_lock_init(&twl->lock); |
@@ -623,16 +629,17 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev) | |||
623 | err = twl4030_usb_ldo_init(twl); | 629 | err = twl4030_usb_ldo_init(twl); |
624 | if (err) { | 630 | if (err) { |
625 | dev_err(&pdev->dev, "ldo init failed\n"); | 631 | dev_err(&pdev->dev, "ldo init failed\n"); |
632 | kfree(otg); | ||
626 | kfree(twl); | 633 | kfree(twl); |
627 | return err; | 634 | return err; |
628 | } | 635 | } |
629 | otg_set_transceiver(&twl->otg); | 636 | usb_set_transceiver(&twl->phy); |
630 | 637 | ||
631 | platform_set_drvdata(pdev, twl); | 638 | platform_set_drvdata(pdev, twl); |
632 | if (device_create_file(&pdev->dev, &dev_attr_vbus)) | 639 | if (device_create_file(&pdev->dev, &dev_attr_vbus)) |
633 | dev_warn(&pdev->dev, "could not create sysfs file\n"); | 640 | dev_warn(&pdev->dev, "could not create sysfs file\n"); |
634 | 641 | ||
635 | ATOMIC_INIT_NOTIFIER_HEAD(&twl->otg.notifier); | 642 | ATOMIC_INIT_NOTIFIER_HEAD(&twl->phy.notifier); |
636 | 643 | ||
637 | /* Our job is to use irqs and status from the power module | 644 | /* Our job is to use irqs and status from the power module |
638 | * to keep the transceiver disabled when nothing's connected. | 645 | * to keep the transceiver disabled when nothing's connected. |
@@ -649,6 +656,7 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev) | |||
649 | if (status < 0) { | 656 | if (status < 0) { |
650 | dev_dbg(&pdev->dev, "can't get IRQ %d, err %d\n", | 657 | dev_dbg(&pdev->dev, "can't get IRQ %d, err %d\n", |
651 | twl->irq, status); | 658 | twl->irq, status); |
659 | kfree(otg); | ||
652 | kfree(twl); | 660 | kfree(twl); |
653 | return status; | 661 | return status; |
654 | } | 662 | } |
@@ -693,6 +701,7 @@ static int __exit twl4030_usb_remove(struct platform_device *pdev) | |||
693 | regulator_put(twl->usb1v8); | 701 | regulator_put(twl->usb1v8); |
694 | regulator_put(twl->usb3v1); | 702 | regulator_put(twl->usb3v1); |
695 | 703 | ||
704 | kfree(twl->phy.otg); | ||
696 | kfree(twl); | 705 | kfree(twl); |
697 | 706 | ||
698 | return 0; | 707 | return 0; |
diff --git a/drivers/usb/otg/twl6030-usb.c b/drivers/usb/otg/twl6030-usb.c index ed2b26cfe814..e3fa387ca81e 100644 --- a/drivers/usb/otg/twl6030-usb.c +++ b/drivers/usb/otg/twl6030-usb.c | |||
@@ -87,7 +87,7 @@ | |||
87 | #define VBUS_DET BIT(2) | 87 | #define VBUS_DET BIT(2) |
88 | 88 | ||
89 | struct twl6030_usb { | 89 | struct twl6030_usb { |
90 | struct otg_transceiver otg; | 90 | struct usb_phy phy; |
91 | struct device *dev; | 91 | struct device *dev; |
92 | 92 | ||
93 | /* for vbus reporting with irqs disabled */ | 93 | /* for vbus reporting with irqs disabled */ |
@@ -107,7 +107,7 @@ struct twl6030_usb { | |||
107 | unsigned long features; | 107 | unsigned long features; |
108 | }; | 108 | }; |
109 | 109 | ||
110 | #define xceiv_to_twl(x) container_of((x), struct twl6030_usb, otg) | 110 | #define phy_to_twl(x) container_of((x), struct twl6030_usb, phy) |
111 | 111 | ||
112 | /*-------------------------------------------------------------------------*/ | 112 | /*-------------------------------------------------------------------------*/ |
113 | 113 | ||
@@ -137,13 +137,13 @@ static inline u8 twl6030_readb(struct twl6030_usb *twl, u8 module, u8 address) | |||
137 | return ret; | 137 | return ret; |
138 | } | 138 | } |
139 | 139 | ||
140 | static int twl6030_phy_init(struct otg_transceiver *x) | 140 | static int twl6030_phy_init(struct usb_phy *x) |
141 | { | 141 | { |
142 | struct twl6030_usb *twl; | 142 | struct twl6030_usb *twl; |
143 | struct device *dev; | 143 | struct device *dev; |
144 | struct twl4030_usb_data *pdata; | 144 | struct twl4030_usb_data *pdata; |
145 | 145 | ||
146 | twl = xceiv_to_twl(x); | 146 | twl = phy_to_twl(x); |
147 | dev = twl->dev; | 147 | dev = twl->dev; |
148 | pdata = dev->platform_data; | 148 | pdata = dev->platform_data; |
149 | 149 | ||
@@ -155,21 +155,21 @@ static int twl6030_phy_init(struct otg_transceiver *x) | |||
155 | return 0; | 155 | return 0; |
156 | } | 156 | } |
157 | 157 | ||
158 | static void twl6030_phy_shutdown(struct otg_transceiver *x) | 158 | static void twl6030_phy_shutdown(struct usb_phy *x) |
159 | { | 159 | { |
160 | struct twl6030_usb *twl; | 160 | struct twl6030_usb *twl; |
161 | struct device *dev; | 161 | struct device *dev; |
162 | struct twl4030_usb_data *pdata; | 162 | struct twl4030_usb_data *pdata; |
163 | 163 | ||
164 | twl = xceiv_to_twl(x); | 164 | twl = phy_to_twl(x); |
165 | dev = twl->dev; | 165 | dev = twl->dev; |
166 | pdata = dev->platform_data; | 166 | pdata = dev->platform_data; |
167 | pdata->phy_power(twl->dev, 0, 0); | 167 | pdata->phy_power(twl->dev, 0, 0); |
168 | } | 168 | } |
169 | 169 | ||
170 | static int twl6030_phy_suspend(struct otg_transceiver *x, int suspend) | 170 | static int twl6030_phy_suspend(struct usb_phy *x, int suspend) |
171 | { | 171 | { |
172 | struct twl6030_usb *twl = xceiv_to_twl(x); | 172 | struct twl6030_usb *twl = phy_to_twl(x); |
173 | struct device *dev = twl->dev; | 173 | struct device *dev = twl->dev; |
174 | struct twl4030_usb_data *pdata = dev->platform_data; | 174 | struct twl4030_usb_data *pdata = dev->platform_data; |
175 | 175 | ||
@@ -178,9 +178,9 @@ static int twl6030_phy_suspend(struct otg_transceiver *x, int suspend) | |||
178 | return 0; | 178 | return 0; |
179 | } | 179 | } |
180 | 180 | ||
181 | static int twl6030_start_srp(struct otg_transceiver *x) | 181 | static int twl6030_start_srp(struct usb_otg *otg) |
182 | { | 182 | { |
183 | struct twl6030_usb *twl = xceiv_to_twl(x); | 183 | struct twl6030_usb *twl = phy_to_twl(otg->phy); |
184 | 184 | ||
185 | twl6030_writeb(twl, TWL_MODULE_USB, 0x24, USB_VBUS_CTRL_SET); | 185 | twl6030_writeb(twl, TWL_MODULE_USB, 0x24, USB_VBUS_CTRL_SET); |
186 | twl6030_writeb(twl, TWL_MODULE_USB, 0x84, USB_VBUS_CTRL_SET); | 186 | twl6030_writeb(twl, TWL_MODULE_USB, 0x84, USB_VBUS_CTRL_SET); |
@@ -256,6 +256,7 @@ static DEVICE_ATTR(vbus, 0444, twl6030_usb_vbus_show, NULL); | |||
256 | static irqreturn_t twl6030_usb_irq(int irq, void *_twl) | 256 | static irqreturn_t twl6030_usb_irq(int irq, void *_twl) |
257 | { | 257 | { |
258 | struct twl6030_usb *twl = _twl; | 258 | struct twl6030_usb *twl = _twl; |
259 | struct usb_otg *otg = twl->phy.otg; | ||
259 | int status; | 260 | int status; |
260 | u8 vbus_state, hw_state; | 261 | u8 vbus_state, hw_state; |
261 | 262 | ||
@@ -268,18 +269,18 @@ static irqreturn_t twl6030_usb_irq(int irq, void *_twl) | |||
268 | regulator_enable(twl->usb3v3); | 269 | regulator_enable(twl->usb3v3); |
269 | twl->asleep = 1; | 270 | twl->asleep = 1; |
270 | status = USB_EVENT_VBUS; | 271 | status = USB_EVENT_VBUS; |
271 | twl->otg.default_a = false; | 272 | otg->default_a = false; |
272 | twl->otg.state = OTG_STATE_B_IDLE; | 273 | twl->phy.state = OTG_STATE_B_IDLE; |
273 | twl->linkstat = status; | 274 | twl->linkstat = status; |
274 | twl->otg.last_event = status; | 275 | twl->phy.last_event = status; |
275 | atomic_notifier_call_chain(&twl->otg.notifier, | 276 | atomic_notifier_call_chain(&twl->phy.notifier, |
276 | status, twl->otg.gadget); | 277 | status, otg->gadget); |
277 | } else { | 278 | } else { |
278 | status = USB_EVENT_NONE; | 279 | status = USB_EVENT_NONE; |
279 | twl->linkstat = status; | 280 | twl->linkstat = status; |
280 | twl->otg.last_event = status; | 281 | twl->phy.last_event = status; |
281 | atomic_notifier_call_chain(&twl->otg.notifier, | 282 | atomic_notifier_call_chain(&twl->phy.notifier, |
282 | status, twl->otg.gadget); | 283 | status, otg->gadget); |
283 | if (twl->asleep) { | 284 | if (twl->asleep) { |
284 | regulator_disable(twl->usb3v3); | 285 | regulator_disable(twl->usb3v3); |
285 | twl->asleep = 0; | 286 | twl->asleep = 0; |
@@ -294,6 +295,7 @@ static irqreturn_t twl6030_usb_irq(int irq, void *_twl) | |||
294 | static irqreturn_t twl6030_usbotg_irq(int irq, void *_twl) | 295 | static irqreturn_t twl6030_usbotg_irq(int irq, void *_twl) |
295 | { | 296 | { |
296 | struct twl6030_usb *twl = _twl; | 297 | struct twl6030_usb *twl = _twl; |
298 | struct usb_otg *otg = twl->phy.otg; | ||
297 | int status = USB_EVENT_NONE; | 299 | int status = USB_EVENT_NONE; |
298 | u8 hw_state; | 300 | u8 hw_state; |
299 | 301 | ||
@@ -307,12 +309,12 @@ static irqreturn_t twl6030_usbotg_irq(int irq, void *_twl) | |||
307 | twl6030_writeb(twl, TWL_MODULE_USB, USB_ID_INT_EN_HI_SET, | 309 | twl6030_writeb(twl, TWL_MODULE_USB, USB_ID_INT_EN_HI_SET, |
308 | 0x10); | 310 | 0x10); |
309 | status = USB_EVENT_ID; | 311 | status = USB_EVENT_ID; |
310 | twl->otg.default_a = true; | 312 | otg->default_a = true; |
311 | twl->otg.state = OTG_STATE_A_IDLE; | 313 | twl->phy.state = OTG_STATE_A_IDLE; |
312 | twl->linkstat = status; | 314 | twl->linkstat = status; |
313 | twl->otg.last_event = status; | 315 | twl->phy.last_event = status; |
314 | atomic_notifier_call_chain(&twl->otg.notifier, status, | 316 | atomic_notifier_call_chain(&twl->phy.notifier, status, |
315 | twl->otg.gadget); | 317 | otg->gadget); |
316 | } else { | 318 | } else { |
317 | twl6030_writeb(twl, TWL_MODULE_USB, USB_ID_INT_EN_HI_CLR, | 319 | twl6030_writeb(twl, TWL_MODULE_USB, USB_ID_INT_EN_HI_CLR, |
318 | 0x10); | 320 | 0x10); |
@@ -324,25 +326,22 @@ static irqreturn_t twl6030_usbotg_irq(int irq, void *_twl) | |||
324 | return IRQ_HANDLED; | 326 | return IRQ_HANDLED; |
325 | } | 327 | } |
326 | 328 | ||
327 | static int twl6030_set_peripheral(struct otg_transceiver *x, | 329 | static int twl6030_set_peripheral(struct usb_otg *otg, |
328 | struct usb_gadget *gadget) | 330 | struct usb_gadget *gadget) |
329 | { | 331 | { |
330 | struct twl6030_usb *twl; | 332 | if (!otg) |
331 | |||
332 | if (!x) | ||
333 | return -ENODEV; | 333 | return -ENODEV; |
334 | 334 | ||
335 | twl = xceiv_to_twl(x); | 335 | otg->gadget = gadget; |
336 | twl->otg.gadget = gadget; | ||
337 | if (!gadget) | 336 | if (!gadget) |
338 | twl->otg.state = OTG_STATE_UNDEFINED; | 337 | otg->phy->state = OTG_STATE_UNDEFINED; |
339 | 338 | ||
340 | return 0; | 339 | return 0; |
341 | } | 340 | } |
342 | 341 | ||
343 | static int twl6030_enable_irq(struct otg_transceiver *x) | 342 | static int twl6030_enable_irq(struct usb_phy *x) |
344 | { | 343 | { |
345 | struct twl6030_usb *twl = xceiv_to_twl(x); | 344 | struct twl6030_usb *twl = phy_to_twl(x); |
346 | 345 | ||
347 | twl6030_writeb(twl, TWL_MODULE_USB, USB_ID_INT_EN_HI_SET, 0x1); | 346 | twl6030_writeb(twl, TWL_MODULE_USB, USB_ID_INT_EN_HI_SET, 0x1); |
348 | twl6030_interrupt_unmask(0x05, REG_INT_MSK_LINE_C); | 347 | twl6030_interrupt_unmask(0x05, REG_INT_MSK_LINE_C); |
@@ -376,9 +375,9 @@ static void otg_set_vbus_work(struct work_struct *data) | |||
376 | CHARGERUSB_CTRL1); | 375 | CHARGERUSB_CTRL1); |
377 | } | 376 | } |
378 | 377 | ||
379 | static int twl6030_set_vbus(struct otg_transceiver *x, bool enabled) | 378 | static int twl6030_set_vbus(struct usb_otg *otg, bool enabled) |
380 | { | 379 | { |
381 | struct twl6030_usb *twl = xceiv_to_twl(x); | 380 | struct twl6030_usb *twl = phy_to_twl(otg->phy); |
382 | 381 | ||
383 | twl->vbus_enable = enabled; | 382 | twl->vbus_enable = enabled; |
384 | schedule_work(&twl->set_vbus_work); | 383 | schedule_work(&twl->set_vbus_work); |
@@ -386,17 +385,14 @@ static int twl6030_set_vbus(struct otg_transceiver *x, bool enabled) | |||
386 | return 0; | 385 | return 0; |
387 | } | 386 | } |
388 | 387 | ||
389 | static int twl6030_set_host(struct otg_transceiver *x, struct usb_bus *host) | 388 | static int twl6030_set_host(struct usb_otg *otg, struct usb_bus *host) |
390 | { | 389 | { |
391 | struct twl6030_usb *twl; | 390 | if (!otg) |
392 | |||
393 | if (!x) | ||
394 | return -ENODEV; | 391 | return -ENODEV; |
395 | 392 | ||
396 | twl = xceiv_to_twl(x); | 393 | otg->host = host; |
397 | twl->otg.host = host; | ||
398 | if (!host) | 394 | if (!host) |
399 | twl->otg.state = OTG_STATE_UNDEFINED; | 395 | otg->phy->state = OTG_STATE_UNDEFINED; |
400 | return 0; | 396 | return 0; |
401 | } | 397 | } |
402 | 398 | ||
@@ -405,6 +401,7 @@ static int __devinit twl6030_usb_probe(struct platform_device *pdev) | |||
405 | struct twl6030_usb *twl; | 401 | struct twl6030_usb *twl; |
406 | int status, err; | 402 | int status, err; |
407 | struct twl4030_usb_data *pdata; | 403 | struct twl4030_usb_data *pdata; |
404 | struct usb_otg *otg; | ||
408 | struct device *dev = &pdev->dev; | 405 | struct device *dev = &pdev->dev; |
409 | pdata = dev->platform_data; | 406 | pdata = dev->platform_data; |
410 | 407 | ||
@@ -412,19 +409,29 @@ static int __devinit twl6030_usb_probe(struct platform_device *pdev) | |||
412 | if (!twl) | 409 | if (!twl) |
413 | return -ENOMEM; | 410 | return -ENOMEM; |
414 | 411 | ||
412 | otg = kzalloc(sizeof *otg, GFP_KERNEL); | ||
413 | if (!otg) { | ||
414 | kfree(twl); | ||
415 | return -ENOMEM; | ||
416 | } | ||
417 | |||
415 | twl->dev = &pdev->dev; | 418 | twl->dev = &pdev->dev; |
416 | twl->irq1 = platform_get_irq(pdev, 0); | 419 | twl->irq1 = platform_get_irq(pdev, 0); |
417 | twl->irq2 = platform_get_irq(pdev, 1); | 420 | twl->irq2 = platform_get_irq(pdev, 1); |
418 | twl->features = pdata->features; | 421 | twl->features = pdata->features; |
419 | twl->otg.dev = twl->dev; | 422 | |
420 | twl->otg.label = "twl6030"; | 423 | twl->phy.dev = twl->dev; |
421 | twl->otg.set_host = twl6030_set_host; | 424 | twl->phy.label = "twl6030"; |
422 | twl->otg.set_peripheral = twl6030_set_peripheral; | 425 | twl->phy.otg = otg; |
423 | twl->otg.set_vbus = twl6030_set_vbus; | 426 | twl->phy.init = twl6030_phy_init; |
424 | twl->otg.init = twl6030_phy_init; | 427 | twl->phy.shutdown = twl6030_phy_shutdown; |
425 | twl->otg.shutdown = twl6030_phy_shutdown; | 428 | twl->phy.set_suspend = twl6030_phy_suspend; |
426 | twl->otg.set_suspend = twl6030_phy_suspend; | 429 | |
427 | twl->otg.start_srp = twl6030_start_srp; | 430 | otg->phy = &twl->phy; |
431 | otg->set_host = twl6030_set_host; | ||
432 | otg->set_peripheral = twl6030_set_peripheral; | ||
433 | otg->set_vbus = twl6030_set_vbus; | ||
434 | otg->start_srp = twl6030_start_srp; | ||
428 | 435 | ||
429 | /* init spinlock for workqueue */ | 436 | /* init spinlock for workqueue */ |
430 | spin_lock_init(&twl->lock); | 437 | spin_lock_init(&twl->lock); |
@@ -432,16 +439,17 @@ static int __devinit twl6030_usb_probe(struct platform_device *pdev) | |||
432 | err = twl6030_usb_ldo_init(twl); | 439 | err = twl6030_usb_ldo_init(twl); |
433 | if (err) { | 440 | if (err) { |
434 | dev_err(&pdev->dev, "ldo init failed\n"); | 441 | dev_err(&pdev->dev, "ldo init failed\n"); |
442 | kfree(otg); | ||
435 | kfree(twl); | 443 | kfree(twl); |
436 | return err; | 444 | return err; |
437 | } | 445 | } |
438 | otg_set_transceiver(&twl->otg); | 446 | usb_set_transceiver(&twl->phy); |
439 | 447 | ||
440 | platform_set_drvdata(pdev, twl); | 448 | platform_set_drvdata(pdev, twl); |
441 | if (device_create_file(&pdev->dev, &dev_attr_vbus)) | 449 | if (device_create_file(&pdev->dev, &dev_attr_vbus)) |
442 | dev_warn(&pdev->dev, "could not create sysfs file\n"); | 450 | dev_warn(&pdev->dev, "could not create sysfs file\n"); |
443 | 451 | ||
444 | ATOMIC_INIT_NOTIFIER_HEAD(&twl->otg.notifier); | 452 | ATOMIC_INIT_NOTIFIER_HEAD(&twl->phy.notifier); |
445 | 453 | ||
446 | INIT_WORK(&twl->set_vbus_work, otg_set_vbus_work); | 454 | INIT_WORK(&twl->set_vbus_work, otg_set_vbus_work); |
447 | 455 | ||
@@ -453,6 +461,7 @@ static int __devinit twl6030_usb_probe(struct platform_device *pdev) | |||
453 | dev_err(&pdev->dev, "can't get IRQ %d, err %d\n", | 461 | dev_err(&pdev->dev, "can't get IRQ %d, err %d\n", |
454 | twl->irq1, status); | 462 | twl->irq1, status); |
455 | device_remove_file(twl->dev, &dev_attr_vbus); | 463 | device_remove_file(twl->dev, &dev_attr_vbus); |
464 | kfree(otg); | ||
456 | kfree(twl); | 465 | kfree(twl); |
457 | return status; | 466 | return status; |
458 | } | 467 | } |
@@ -465,14 +474,15 @@ static int __devinit twl6030_usb_probe(struct platform_device *pdev) | |||
465 | twl->irq2, status); | 474 | twl->irq2, status); |
466 | free_irq(twl->irq1, twl); | 475 | free_irq(twl->irq1, twl); |
467 | device_remove_file(twl->dev, &dev_attr_vbus); | 476 | device_remove_file(twl->dev, &dev_attr_vbus); |
477 | kfree(otg); | ||
468 | kfree(twl); | 478 | kfree(twl); |
469 | return status; | 479 | return status; |
470 | } | 480 | } |
471 | 481 | ||
472 | twl->asleep = 0; | 482 | twl->asleep = 0; |
473 | pdata->phy_init(dev); | 483 | pdata->phy_init(dev); |
474 | twl6030_phy_suspend(&twl->otg, 0); | 484 | twl6030_phy_suspend(&twl->phy, 0); |
475 | twl6030_enable_irq(&twl->otg); | 485 | twl6030_enable_irq(&twl->phy); |
476 | dev_info(&pdev->dev, "Initialized TWL6030 USB module\n"); | 486 | dev_info(&pdev->dev, "Initialized TWL6030 USB module\n"); |
477 | 487 | ||
478 | return 0; | 488 | return 0; |
@@ -496,6 +506,7 @@ static int __exit twl6030_usb_remove(struct platform_device *pdev) | |||
496 | pdata->phy_exit(twl->dev); | 506 | pdata->phy_exit(twl->dev); |
497 | device_remove_file(twl->dev, &dev_attr_vbus); | 507 | device_remove_file(twl->dev, &dev_attr_vbus); |
498 | cancel_work_sync(&twl->set_vbus_work); | 508 | cancel_work_sync(&twl->set_vbus_work); |
509 | kfree(twl->phy.otg); | ||
499 | kfree(twl); | 510 | kfree(twl); |
500 | 511 | ||
501 | return 0; | 512 | return 0; |
diff --git a/drivers/usb/otg/ulpi.c b/drivers/usb/otg/ulpi.c index 0b0466728fdc..217339dd7a90 100644 --- a/drivers/usb/otg/ulpi.c +++ b/drivers/usb/otg/ulpi.c | |||
@@ -49,31 +49,31 @@ static struct ulpi_info ulpi_ids[] = { | |||
49 | ULPI_INFO(ULPI_ID(0x0424, 0x0006), "SMSC USB331x"), | 49 | ULPI_INFO(ULPI_ID(0x0424, 0x0006), "SMSC USB331x"), |
50 | }; | 50 | }; |
51 | 51 | ||
52 | static int ulpi_set_otg_flags(struct otg_transceiver *otg) | 52 | static int ulpi_set_otg_flags(struct usb_phy *phy) |
53 | { | 53 | { |
54 | unsigned int flags = ULPI_OTG_CTRL_DP_PULLDOWN | | 54 | unsigned int flags = ULPI_OTG_CTRL_DP_PULLDOWN | |
55 | ULPI_OTG_CTRL_DM_PULLDOWN; | 55 | ULPI_OTG_CTRL_DM_PULLDOWN; |
56 | 56 | ||
57 | if (otg->flags & ULPI_OTG_ID_PULLUP) | 57 | if (phy->flags & ULPI_OTG_ID_PULLUP) |
58 | flags |= ULPI_OTG_CTRL_ID_PULLUP; | 58 | flags |= ULPI_OTG_CTRL_ID_PULLUP; |
59 | 59 | ||
60 | /* | 60 | /* |
61 | * ULPI Specification rev.1.1 default | 61 | * ULPI Specification rev.1.1 default |
62 | * for Dp/DmPulldown is enabled. | 62 | * for Dp/DmPulldown is enabled. |
63 | */ | 63 | */ |
64 | if (otg->flags & ULPI_OTG_DP_PULLDOWN_DIS) | 64 | if (phy->flags & ULPI_OTG_DP_PULLDOWN_DIS) |
65 | flags &= ~ULPI_OTG_CTRL_DP_PULLDOWN; | 65 | flags &= ~ULPI_OTG_CTRL_DP_PULLDOWN; |
66 | 66 | ||
67 | if (otg->flags & ULPI_OTG_DM_PULLDOWN_DIS) | 67 | if (phy->flags & ULPI_OTG_DM_PULLDOWN_DIS) |
68 | flags &= ~ULPI_OTG_CTRL_DM_PULLDOWN; | 68 | flags &= ~ULPI_OTG_CTRL_DM_PULLDOWN; |
69 | 69 | ||
70 | if (otg->flags & ULPI_OTG_EXTVBUSIND) | 70 | if (phy->flags & ULPI_OTG_EXTVBUSIND) |
71 | flags |= ULPI_OTG_CTRL_EXTVBUSIND; | 71 | flags |= ULPI_OTG_CTRL_EXTVBUSIND; |
72 | 72 | ||
73 | return otg_io_write(otg, flags, ULPI_OTG_CTRL); | 73 | return usb_phy_io_write(phy, flags, ULPI_OTG_CTRL); |
74 | } | 74 | } |
75 | 75 | ||
76 | static int ulpi_set_fc_flags(struct otg_transceiver *otg) | 76 | static int ulpi_set_fc_flags(struct usb_phy *phy) |
77 | { | 77 | { |
78 | unsigned int flags = 0; | 78 | unsigned int flags = 0; |
79 | 79 | ||
@@ -81,27 +81,27 @@ static int ulpi_set_fc_flags(struct otg_transceiver *otg) | |||
81 | * ULPI Specification rev.1.1 default | 81 | * ULPI Specification rev.1.1 default |
82 | * for XcvrSelect is Full Speed. | 82 | * for XcvrSelect is Full Speed. |
83 | */ | 83 | */ |
84 | if (otg->flags & ULPI_FC_HS) | 84 | if (phy->flags & ULPI_FC_HS) |
85 | flags |= ULPI_FUNC_CTRL_HIGH_SPEED; | 85 | flags |= ULPI_FUNC_CTRL_HIGH_SPEED; |
86 | else if (otg->flags & ULPI_FC_LS) | 86 | else if (phy->flags & ULPI_FC_LS) |
87 | flags |= ULPI_FUNC_CTRL_LOW_SPEED; | 87 | flags |= ULPI_FUNC_CTRL_LOW_SPEED; |
88 | else if (otg->flags & ULPI_FC_FS4LS) | 88 | else if (phy->flags & ULPI_FC_FS4LS) |
89 | flags |= ULPI_FUNC_CTRL_FS4LS; | 89 | flags |= ULPI_FUNC_CTRL_FS4LS; |
90 | else | 90 | else |
91 | flags |= ULPI_FUNC_CTRL_FULL_SPEED; | 91 | flags |= ULPI_FUNC_CTRL_FULL_SPEED; |
92 | 92 | ||
93 | if (otg->flags & ULPI_FC_TERMSEL) | 93 | if (phy->flags & ULPI_FC_TERMSEL) |
94 | flags |= ULPI_FUNC_CTRL_TERMSELECT; | 94 | flags |= ULPI_FUNC_CTRL_TERMSELECT; |
95 | 95 | ||
96 | /* | 96 | /* |
97 | * ULPI Specification rev.1.1 default | 97 | * ULPI Specification rev.1.1 default |
98 | * for OpMode is Normal Operation. | 98 | * for OpMode is Normal Operation. |
99 | */ | 99 | */ |
100 | if (otg->flags & ULPI_FC_OP_NODRV) | 100 | if (phy->flags & ULPI_FC_OP_NODRV) |
101 | flags |= ULPI_FUNC_CTRL_OPMODE_NONDRIVING; | 101 | flags |= ULPI_FUNC_CTRL_OPMODE_NONDRIVING; |
102 | else if (otg->flags & ULPI_FC_OP_DIS_NRZI) | 102 | else if (phy->flags & ULPI_FC_OP_DIS_NRZI) |
103 | flags |= ULPI_FUNC_CTRL_OPMODE_DISABLE_NRZI; | 103 | flags |= ULPI_FUNC_CTRL_OPMODE_DISABLE_NRZI; |
104 | else if (otg->flags & ULPI_FC_OP_NSYNC_NEOP) | 104 | else if (phy->flags & ULPI_FC_OP_NSYNC_NEOP) |
105 | flags |= ULPI_FUNC_CTRL_OPMODE_NOSYNC_NOEOP; | 105 | flags |= ULPI_FUNC_CTRL_OPMODE_NOSYNC_NOEOP; |
106 | else | 106 | else |
107 | flags |= ULPI_FUNC_CTRL_OPMODE_NORMAL; | 107 | flags |= ULPI_FUNC_CTRL_OPMODE_NORMAL; |
@@ -112,54 +112,54 @@ static int ulpi_set_fc_flags(struct otg_transceiver *otg) | |||
112 | */ | 112 | */ |
113 | flags |= ULPI_FUNC_CTRL_SUSPENDM; | 113 | flags |= ULPI_FUNC_CTRL_SUSPENDM; |
114 | 114 | ||
115 | return otg_io_write(otg, flags, ULPI_FUNC_CTRL); | 115 | return usb_phy_io_write(phy, flags, ULPI_FUNC_CTRL); |
116 | } | 116 | } |
117 | 117 | ||
118 | static int ulpi_set_ic_flags(struct otg_transceiver *otg) | 118 | static int ulpi_set_ic_flags(struct usb_phy *phy) |
119 | { | 119 | { |
120 | unsigned int flags = 0; | 120 | unsigned int flags = 0; |
121 | 121 | ||
122 | if (otg->flags & ULPI_IC_AUTORESUME) | 122 | if (phy->flags & ULPI_IC_AUTORESUME) |
123 | flags |= ULPI_IFC_CTRL_AUTORESUME; | 123 | flags |= ULPI_IFC_CTRL_AUTORESUME; |
124 | 124 | ||
125 | if (otg->flags & ULPI_IC_EXTVBUS_INDINV) | 125 | if (phy->flags & ULPI_IC_EXTVBUS_INDINV) |
126 | flags |= ULPI_IFC_CTRL_EXTERNAL_VBUS; | 126 | flags |= ULPI_IFC_CTRL_EXTERNAL_VBUS; |
127 | 127 | ||
128 | if (otg->flags & ULPI_IC_IND_PASSTHRU) | 128 | if (phy->flags & ULPI_IC_IND_PASSTHRU) |
129 | flags |= ULPI_IFC_CTRL_PASSTHRU; | 129 | flags |= ULPI_IFC_CTRL_PASSTHRU; |
130 | 130 | ||
131 | if (otg->flags & ULPI_IC_PROTECT_DIS) | 131 | if (phy->flags & ULPI_IC_PROTECT_DIS) |
132 | flags |= ULPI_IFC_CTRL_PROTECT_IFC_DISABLE; | 132 | flags |= ULPI_IFC_CTRL_PROTECT_IFC_DISABLE; |
133 | 133 | ||
134 | return otg_io_write(otg, flags, ULPI_IFC_CTRL); | 134 | return usb_phy_io_write(phy, flags, ULPI_IFC_CTRL); |
135 | } | 135 | } |
136 | 136 | ||
137 | static int ulpi_set_flags(struct otg_transceiver *otg) | 137 | static int ulpi_set_flags(struct usb_phy *phy) |
138 | { | 138 | { |
139 | int ret; | 139 | int ret; |
140 | 140 | ||
141 | ret = ulpi_set_otg_flags(otg); | 141 | ret = ulpi_set_otg_flags(phy); |
142 | if (ret) | 142 | if (ret) |
143 | return ret; | 143 | return ret; |
144 | 144 | ||
145 | ret = ulpi_set_ic_flags(otg); | 145 | ret = ulpi_set_ic_flags(phy); |
146 | if (ret) | 146 | if (ret) |
147 | return ret; | 147 | return ret; |
148 | 148 | ||
149 | return ulpi_set_fc_flags(otg); | 149 | return ulpi_set_fc_flags(phy); |
150 | } | 150 | } |
151 | 151 | ||
152 | static int ulpi_check_integrity(struct otg_transceiver *otg) | 152 | static int ulpi_check_integrity(struct usb_phy *phy) |
153 | { | 153 | { |
154 | int ret, i; | 154 | int ret, i; |
155 | unsigned int val = 0x55; | 155 | unsigned int val = 0x55; |
156 | 156 | ||
157 | for (i = 0; i < 2; i++) { | 157 | for (i = 0; i < 2; i++) { |
158 | ret = otg_io_write(otg, val, ULPI_SCRATCH); | 158 | ret = usb_phy_io_write(phy, val, ULPI_SCRATCH); |
159 | if (ret < 0) | 159 | if (ret < 0) |
160 | return ret; | 160 | return ret; |
161 | 161 | ||
162 | ret = otg_io_read(otg, ULPI_SCRATCH); | 162 | ret = usb_phy_io_read(phy, ULPI_SCRATCH); |
163 | if (ret < 0) | 163 | if (ret < 0) |
164 | return ret; | 164 | return ret; |
165 | 165 | ||
@@ -175,13 +175,13 @@ static int ulpi_check_integrity(struct otg_transceiver *otg) | |||
175 | return 0; | 175 | return 0; |
176 | } | 176 | } |
177 | 177 | ||
178 | static int ulpi_init(struct otg_transceiver *otg) | 178 | static int ulpi_init(struct usb_phy *phy) |
179 | { | 179 | { |
180 | int i, vid, pid, ret; | 180 | int i, vid, pid, ret; |
181 | u32 ulpi_id = 0; | 181 | u32 ulpi_id = 0; |
182 | 182 | ||
183 | for (i = 0; i < 4; i++) { | 183 | for (i = 0; i < 4; i++) { |
184 | ret = otg_io_read(otg, ULPI_PRODUCT_ID_HIGH - i); | 184 | ret = usb_phy_io_read(phy, ULPI_PRODUCT_ID_HIGH - i); |
185 | if (ret < 0) | 185 | if (ret < 0) |
186 | return ret; | 186 | return ret; |
187 | ulpi_id = (ulpi_id << 8) | ret; | 187 | ulpi_id = (ulpi_id << 8) | ret; |
@@ -199,16 +199,17 @@ static int ulpi_init(struct otg_transceiver *otg) | |||
199 | } | 199 | } |
200 | } | 200 | } |
201 | 201 | ||
202 | ret = ulpi_check_integrity(otg); | 202 | ret = ulpi_check_integrity(phy); |
203 | if (ret) | 203 | if (ret) |
204 | return ret; | 204 | return ret; |
205 | 205 | ||
206 | return ulpi_set_flags(otg); | 206 | return ulpi_set_flags(phy); |
207 | } | 207 | } |
208 | 208 | ||
209 | static int ulpi_set_host(struct otg_transceiver *otg, struct usb_bus *host) | 209 | static int ulpi_set_host(struct usb_otg *otg, struct usb_bus *host) |
210 | { | 210 | { |
211 | unsigned int flags = otg_io_read(otg, ULPI_IFC_CTRL); | 211 | struct usb_phy *phy = otg->phy; |
212 | unsigned int flags = usb_phy_io_read(phy, ULPI_IFC_CTRL); | ||
212 | 213 | ||
213 | if (!host) { | 214 | if (!host) { |
214 | otg->host = NULL; | 215 | otg->host = NULL; |
@@ -221,51 +222,62 @@ static int ulpi_set_host(struct otg_transceiver *otg, struct usb_bus *host) | |||
221 | ULPI_IFC_CTRL_3_PIN_SERIAL_MODE | | 222 | ULPI_IFC_CTRL_3_PIN_SERIAL_MODE | |
222 | ULPI_IFC_CTRL_CARKITMODE); | 223 | ULPI_IFC_CTRL_CARKITMODE); |
223 | 224 | ||
224 | if (otg->flags & ULPI_IC_6PIN_SERIAL) | 225 | if (phy->flags & ULPI_IC_6PIN_SERIAL) |
225 | flags |= ULPI_IFC_CTRL_6_PIN_SERIAL_MODE; | 226 | flags |= ULPI_IFC_CTRL_6_PIN_SERIAL_MODE; |
226 | else if (otg->flags & ULPI_IC_3PIN_SERIAL) | 227 | else if (phy->flags & ULPI_IC_3PIN_SERIAL) |
227 | flags |= ULPI_IFC_CTRL_3_PIN_SERIAL_MODE; | 228 | flags |= ULPI_IFC_CTRL_3_PIN_SERIAL_MODE; |
228 | else if (otg->flags & ULPI_IC_CARKIT) | 229 | else if (phy->flags & ULPI_IC_CARKIT) |
229 | flags |= ULPI_IFC_CTRL_CARKITMODE; | 230 | flags |= ULPI_IFC_CTRL_CARKITMODE; |
230 | 231 | ||
231 | return otg_io_write(otg, flags, ULPI_IFC_CTRL); | 232 | return usb_phy_io_write(phy, flags, ULPI_IFC_CTRL); |
232 | } | 233 | } |
233 | 234 | ||
234 | static int ulpi_set_vbus(struct otg_transceiver *otg, bool on) | 235 | static int ulpi_set_vbus(struct usb_otg *otg, bool on) |
235 | { | 236 | { |
236 | unsigned int flags = otg_io_read(otg, ULPI_OTG_CTRL); | 237 | struct usb_phy *phy = otg->phy; |
238 | unsigned int flags = usb_phy_io_read(phy, ULPI_OTG_CTRL); | ||
237 | 239 | ||
238 | flags &= ~(ULPI_OTG_CTRL_DRVVBUS | ULPI_OTG_CTRL_DRVVBUS_EXT); | 240 | flags &= ~(ULPI_OTG_CTRL_DRVVBUS | ULPI_OTG_CTRL_DRVVBUS_EXT); |
239 | 241 | ||
240 | if (on) { | 242 | if (on) { |
241 | if (otg->flags & ULPI_OTG_DRVVBUS) | 243 | if (phy->flags & ULPI_OTG_DRVVBUS) |
242 | flags |= ULPI_OTG_CTRL_DRVVBUS; | 244 | flags |= ULPI_OTG_CTRL_DRVVBUS; |
243 | 245 | ||
244 | if (otg->flags & ULPI_OTG_DRVVBUS_EXT) | 246 | if (phy->flags & ULPI_OTG_DRVVBUS_EXT) |
245 | flags |= ULPI_OTG_CTRL_DRVVBUS_EXT; | 247 | flags |= ULPI_OTG_CTRL_DRVVBUS_EXT; |
246 | } | 248 | } |
247 | 249 | ||
248 | return otg_io_write(otg, flags, ULPI_OTG_CTRL); | 250 | return usb_phy_io_write(phy, flags, ULPI_OTG_CTRL); |
249 | } | 251 | } |
250 | 252 | ||
251 | struct otg_transceiver * | 253 | struct usb_phy * |
252 | otg_ulpi_create(struct otg_io_access_ops *ops, | 254 | otg_ulpi_create(struct usb_phy_io_ops *ops, |
253 | unsigned int flags) | 255 | unsigned int flags) |
254 | { | 256 | { |
255 | struct otg_transceiver *otg; | 257 | struct usb_phy *phy; |
258 | struct usb_otg *otg; | ||
259 | |||
260 | phy = kzalloc(sizeof(*phy), GFP_KERNEL); | ||
261 | if (!phy) | ||
262 | return NULL; | ||
256 | 263 | ||
257 | otg = kzalloc(sizeof(*otg), GFP_KERNEL); | 264 | otg = kzalloc(sizeof(*otg), GFP_KERNEL); |
258 | if (!otg) | 265 | if (!otg) { |
266 | kfree(phy); | ||
259 | return NULL; | 267 | return NULL; |
268 | } | ||
269 | |||
270 | phy->label = "ULPI"; | ||
271 | phy->flags = flags; | ||
272 | phy->io_ops = ops; | ||
273 | phy->otg = otg; | ||
274 | phy->init = ulpi_init; | ||
260 | 275 | ||
261 | otg->label = "ULPI"; | 276 | otg->phy = phy; |
262 | otg->flags = flags; | ||
263 | otg->io_ops = ops; | ||
264 | otg->init = ulpi_init; | ||
265 | otg->set_host = ulpi_set_host; | 277 | otg->set_host = ulpi_set_host; |
266 | otg->set_vbus = ulpi_set_vbus; | 278 | otg->set_vbus = ulpi_set_vbus; |
267 | 279 | ||
268 | return otg; | 280 | return phy; |
269 | } | 281 | } |
270 | EXPORT_SYMBOL_GPL(otg_ulpi_create); | 282 | EXPORT_SYMBOL_GPL(otg_ulpi_create); |
271 | 283 | ||
diff --git a/drivers/usb/otg/ulpi_viewport.c b/drivers/usb/otg/ulpi_viewport.c index e9a37f90994f..c5ba7e5423fc 100644 --- a/drivers/usb/otg/ulpi_viewport.c +++ b/drivers/usb/otg/ulpi_viewport.c | |||
@@ -40,7 +40,7 @@ static int ulpi_viewport_wait(void __iomem *view, u32 mask) | |||
40 | return -ETIMEDOUT; | 40 | return -ETIMEDOUT; |
41 | } | 41 | } |
42 | 42 | ||
43 | static int ulpi_viewport_read(struct otg_transceiver *otg, u32 reg) | 43 | static int ulpi_viewport_read(struct usb_phy *otg, u32 reg) |
44 | { | 44 | { |
45 | int ret; | 45 | int ret; |
46 | void __iomem *view = otg->io_priv; | 46 | void __iomem *view = otg->io_priv; |
@@ -58,7 +58,7 @@ static int ulpi_viewport_read(struct otg_transceiver *otg, u32 reg) | |||
58 | return ULPI_VIEW_DATA_READ(readl(view)); | 58 | return ULPI_VIEW_DATA_READ(readl(view)); |
59 | } | 59 | } |
60 | 60 | ||
61 | static int ulpi_viewport_write(struct otg_transceiver *otg, u32 val, u32 reg) | 61 | static int ulpi_viewport_write(struct usb_phy *otg, u32 val, u32 reg) |
62 | { | 62 | { |
63 | int ret; | 63 | int ret; |
64 | void __iomem *view = otg->io_priv; | 64 | void __iomem *view = otg->io_priv; |
@@ -74,7 +74,7 @@ static int ulpi_viewport_write(struct otg_transceiver *otg, u32 val, u32 reg) | |||
74 | return ulpi_viewport_wait(view, ULPI_VIEW_RUN); | 74 | return ulpi_viewport_wait(view, ULPI_VIEW_RUN); |
75 | } | 75 | } |
76 | 76 | ||
77 | struct otg_io_access_ops ulpi_viewport_access_ops = { | 77 | struct usb_phy_io_ops ulpi_viewport_access_ops = { |
78 | .read = ulpi_viewport_read, | 78 | .read = ulpi_viewport_read, |
79 | .write = ulpi_viewport_write, | 79 | .write = ulpi_viewport_write, |
80 | }; | 80 | }; |
diff --git a/drivers/usb/renesas_usbhs/common.c b/drivers/usb/renesas_usbhs/common.c index e9a5b1d2615e..a165490bae48 100644 --- a/drivers/usb/renesas_usbhs/common.c +++ b/drivers/usb/renesas_usbhs/common.c | |||
@@ -413,8 +413,7 @@ static int usbhs_probe(struct platform_device *pdev) | |||
413 | struct renesas_usbhs_platform_info *info = pdev->dev.platform_data; | 413 | struct renesas_usbhs_platform_info *info = pdev->dev.platform_data; |
414 | struct renesas_usbhs_driver_callback *dfunc; | 414 | struct renesas_usbhs_driver_callback *dfunc; |
415 | struct usbhs_priv *priv; | 415 | struct usbhs_priv *priv; |
416 | struct resource *res; | 416 | struct resource *res, *irq_res; |
417 | unsigned int irq; | ||
418 | int ret; | 417 | int ret; |
419 | 418 | ||
420 | /* check platform information */ | 419 | /* check platform information */ |
@@ -426,8 +425,8 @@ static int usbhs_probe(struct platform_device *pdev) | |||
426 | 425 | ||
427 | /* platform data */ | 426 | /* platform data */ |
428 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 427 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
429 | irq = platform_get_irq(pdev, 0); | 428 | irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
430 | if (!res || (int)irq <= 0) { | 429 | if (!res || !irq_res) { |
431 | dev_err(&pdev->dev, "Not enough Renesas USB platform resources.\n"); | 430 | dev_err(&pdev->dev, "Not enough Renesas USB platform resources.\n"); |
432 | return -ENODEV; | 431 | return -ENODEV; |
433 | } | 432 | } |
@@ -476,7 +475,9 @@ static int usbhs_probe(struct platform_device *pdev) | |||
476 | /* | 475 | /* |
477 | * priv settings | 476 | * priv settings |
478 | */ | 477 | */ |
479 | priv->irq = irq; | 478 | priv->irq = irq_res->start; |
479 | if (irq_res->flags & IORESOURCE_IRQ_SHAREABLE) | ||
480 | priv->irqflags = IRQF_SHARED; | ||
480 | priv->pdev = pdev; | 481 | priv->pdev = pdev; |
481 | INIT_DELAYED_WORK(&priv->notify_hotplug_work, usbhsc_notify_hotplug); | 482 | INIT_DELAYED_WORK(&priv->notify_hotplug_work, usbhsc_notify_hotplug); |
482 | spin_lock_init(usbhs_priv_to_lock(priv)); | 483 | spin_lock_init(usbhs_priv_to_lock(priv)); |
diff --git a/drivers/usb/renesas_usbhs/common.h b/drivers/usb/renesas_usbhs/common.h index d79b3e27db95..3f3ccd358753 100644 --- a/drivers/usb/renesas_usbhs/common.h +++ b/drivers/usb/renesas_usbhs/common.h | |||
@@ -242,6 +242,7 @@ struct usbhs_priv { | |||
242 | 242 | ||
243 | void __iomem *base; | 243 | void __iomem *base; |
244 | unsigned int irq; | 244 | unsigned int irq; |
245 | unsigned long irqflags; | ||
245 | 246 | ||
246 | struct renesas_usbhs_platform_callback pfunc; | 247 | struct renesas_usbhs_platform_callback pfunc; |
247 | struct renesas_usbhs_driver_param dparam; | 248 | struct renesas_usbhs_driver_param dparam; |
diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c index 72339bd6fcab..3648c82a17fe 100644 --- a/drivers/usb/renesas_usbhs/fifo.c +++ b/drivers/usb/renesas_usbhs/fifo.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #define usbhsf_get_cfifo(p) (&((p)->fifo_info.cfifo)) | 23 | #define usbhsf_get_cfifo(p) (&((p)->fifo_info.cfifo)) |
24 | #define usbhsf_get_d0fifo(p) (&((p)->fifo_info.d0fifo)) | 24 | #define usbhsf_get_d0fifo(p) (&((p)->fifo_info.d0fifo)) |
25 | #define usbhsf_get_d1fifo(p) (&((p)->fifo_info.d1fifo)) | 25 | #define usbhsf_get_d1fifo(p) (&((p)->fifo_info.d1fifo)) |
26 | #define usbhsf_is_cfifo(p, f) (usbhsf_get_cfifo(p) == f) | ||
26 | 27 | ||
27 | #define usbhsf_fifo_is_busy(f) ((f)->pipe) /* see usbhs_pipe_select_fifo */ | 28 | #define usbhsf_fifo_is_busy(f) ((f)->pipe) /* see usbhs_pipe_select_fifo */ |
28 | 29 | ||
@@ -75,8 +76,7 @@ void usbhs_pkt_push(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt, | |||
75 | pipe->handler = &usbhsf_null_handler; | 76 | pipe->handler = &usbhsf_null_handler; |
76 | } | 77 | } |
77 | 78 | ||
78 | list_del_init(&pkt->node); | 79 | list_move_tail(&pkt->node, &pipe->list); |
79 | list_add_tail(&pkt->node, &pipe->list); | ||
80 | 80 | ||
81 | /* | 81 | /* |
82 | * each pkt must hold own handler. | 82 | * each pkt must hold own handler. |
@@ -106,7 +106,7 @@ static struct usbhs_pkt *__usbhsf_pkt_get(struct usbhs_pipe *pipe) | |||
106 | if (list_empty(&pipe->list)) | 106 | if (list_empty(&pipe->list)) |
107 | return NULL; | 107 | return NULL; |
108 | 108 | ||
109 | return list_entry(pipe->list.next, struct usbhs_pkt, node); | 109 | return list_first_entry(&pipe->list, struct usbhs_pkt, node); |
110 | } | 110 | } |
111 | 111 | ||
112 | struct usbhs_pkt *usbhs_pkt_pop(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt) | 112 | struct usbhs_pkt *usbhs_pkt_pop(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt) |
@@ -305,7 +305,10 @@ static int usbhsf_fifo_select(struct usbhs_pipe *pipe, | |||
305 | } | 305 | } |
306 | 306 | ||
307 | /* "base" will be used below */ | 307 | /* "base" will be used below */ |
308 | usbhs_write(priv, fifo->sel, base | MBW_32); | 308 | if (usbhs_get_dparam(priv, has_sudmac) && !usbhsf_is_cfifo(priv, fifo)) |
309 | usbhs_write(priv, fifo->sel, base); | ||
310 | else | ||
311 | usbhs_write(priv, fifo->sel, base | MBW_32); | ||
309 | 312 | ||
310 | /* check ISEL and CURPIPE value */ | 313 | /* check ISEL and CURPIPE value */ |
311 | while (timeout--) { | 314 | while (timeout--) { |
@@ -762,9 +765,9 @@ static int __usbhsf_dma_map_ctrl(struct usbhs_pkt *pkt, int map) | |||
762 | } | 765 | } |
763 | 766 | ||
764 | static void usbhsf_dma_complete(void *arg); | 767 | static void usbhsf_dma_complete(void *arg); |
765 | static void usbhsf_dma_prepare_tasklet(unsigned long data) | 768 | static void xfer_work(struct work_struct *work) |
766 | { | 769 | { |
767 | struct usbhs_pkt *pkt = (struct usbhs_pkt *)data; | 770 | struct usbhs_pkt *pkt = container_of(work, struct usbhs_pkt, work); |
768 | struct usbhs_pipe *pipe = pkt->pipe; | 771 | struct usbhs_pipe *pipe = pkt->pipe; |
769 | struct usbhs_fifo *fifo = usbhs_pipe_to_fifo(pipe); | 772 | struct usbhs_fifo *fifo = usbhs_pipe_to_fifo(pipe); |
770 | struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); | 773 | struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); |
@@ -844,11 +847,8 @@ static int usbhsf_dma_prepare_push(struct usbhs_pkt *pkt, int *is_done) | |||
844 | 847 | ||
845 | pkt->trans = len; | 848 | pkt->trans = len; |
846 | 849 | ||
847 | tasklet_init(&fifo->tasklet, | 850 | INIT_WORK(&pkt->work, xfer_work); |
848 | usbhsf_dma_prepare_tasklet, | 851 | schedule_work(&pkt->work); |
849 | (unsigned long)pkt); | ||
850 | |||
851 | tasklet_schedule(&fifo->tasklet); | ||
852 | 852 | ||
853 | return 0; | 853 | return 0; |
854 | 854 | ||
@@ -938,11 +938,8 @@ static int usbhsf_dma_try_pop(struct usbhs_pkt *pkt, int *is_done) | |||
938 | 938 | ||
939 | pkt->trans = len; | 939 | pkt->trans = len; |
940 | 940 | ||
941 | tasklet_init(&fifo->tasklet, | 941 | INIT_WORK(&pkt->work, xfer_work); |
942 | usbhsf_dma_prepare_tasklet, | 942 | schedule_work(&pkt->work); |
943 | (unsigned long)pkt); | ||
944 | |||
945 | tasklet_schedule(&fifo->tasklet); | ||
946 | 943 | ||
947 | return 0; | 944 | return 0; |
948 | 945 | ||
diff --git a/drivers/usb/renesas_usbhs/fifo.h b/drivers/usb/renesas_usbhs/fifo.h index f68609c0f489..c31731a843d1 100644 --- a/drivers/usb/renesas_usbhs/fifo.h +++ b/drivers/usb/renesas_usbhs/fifo.h | |||
@@ -19,6 +19,7 @@ | |||
19 | 19 | ||
20 | #include <linux/interrupt.h> | 20 | #include <linux/interrupt.h> |
21 | #include <linux/sh_dma.h> | 21 | #include <linux/sh_dma.h> |
22 | #include <linux/workqueue.h> | ||
22 | #include <asm/dma.h> | 23 | #include <asm/dma.h> |
23 | #include "pipe.h" | 24 | #include "pipe.h" |
24 | 25 | ||
@@ -31,7 +32,6 @@ struct usbhs_fifo { | |||
31 | u32 ctr; /* xFIFOCTR */ | 32 | u32 ctr; /* xFIFOCTR */ |
32 | 33 | ||
33 | struct usbhs_pipe *pipe; | 34 | struct usbhs_pipe *pipe; |
34 | struct tasklet_struct tasklet; | ||
35 | 35 | ||
36 | struct dma_chan *tx_chan; | 36 | struct dma_chan *tx_chan; |
37 | struct dma_chan *rx_chan; | 37 | struct dma_chan *rx_chan; |
@@ -53,6 +53,7 @@ struct usbhs_pkt { | |||
53 | struct usbhs_pkt_handle *handler; | 53 | struct usbhs_pkt_handle *handler; |
54 | void (*done)(struct usbhs_priv *priv, | 54 | void (*done)(struct usbhs_priv *priv, |
55 | struct usbhs_pkt *pkt); | 55 | struct usbhs_pkt *pkt); |
56 | struct work_struct work; | ||
56 | dma_addr_t dma; | 57 | dma_addr_t dma; |
57 | void *buf; | 58 | void *buf; |
58 | int length; | 59 | int length; |
diff --git a/drivers/usb/renesas_usbhs/mod.c b/drivers/usb/renesas_usbhs/mod.c index 1b97fb12694b..0871e816df45 100644 --- a/drivers/usb/renesas_usbhs/mod.c +++ b/drivers/usb/renesas_usbhs/mod.c | |||
@@ -152,7 +152,7 @@ int usbhs_mod_probe(struct usbhs_priv *priv) | |||
152 | 152 | ||
153 | /* irq settings */ | 153 | /* irq settings */ |
154 | ret = request_irq(priv->irq, usbhs_interrupt, | 154 | ret = request_irq(priv->irq, usbhs_interrupt, |
155 | 0, dev_name(dev), priv); | 155 | priv->irqflags, dev_name(dev), priv); |
156 | if (ret) { | 156 | if (ret) { |
157 | dev_err(dev, "irq request err\n"); | 157 | dev_err(dev, "irq request err\n"); |
158 | goto mod_init_gadget_err; | 158 | goto mod_init_gadget_err; |
diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c index 7542aa94a462..00bd2a5e0362 100644 --- a/drivers/usb/renesas_usbhs/mod_gadget.c +++ b/drivers/usb/renesas_usbhs/mod_gadget.c | |||
@@ -165,69 +165,32 @@ static void usbhsg_queue_push(struct usbhsg_uep *uep, | |||
165 | /* | 165 | /* |
166 | * dma map/unmap | 166 | * dma map/unmap |
167 | */ | 167 | */ |
168 | static int usbhsg_dma_map(struct device *dev, | 168 | static int usbhsg_dma_map_ctrl(struct usbhs_pkt *pkt, int map) |
169 | struct usbhs_pkt *pkt, | ||
170 | enum dma_data_direction dir) | ||
171 | { | ||
172 | struct usbhsg_request *ureq = usbhsg_pkt_to_ureq(pkt); | ||
173 | struct usb_request *req = &ureq->req; | ||
174 | |||
175 | if (pkt->dma != DMA_ADDR_INVALID) { | ||
176 | dev_err(dev, "dma is already mapped\n"); | ||
177 | return -EIO; | ||
178 | } | ||
179 | |||
180 | if (req->dma == DMA_ADDR_INVALID) { | ||
181 | pkt->dma = dma_map_single(dev, pkt->buf, pkt->length, dir); | ||
182 | } else { | ||
183 | dma_sync_single_for_device(dev, req->dma, req->length, dir); | ||
184 | pkt->dma = req->dma; | ||
185 | } | ||
186 | |||
187 | if (dma_mapping_error(dev, pkt->dma)) { | ||
188 | dev_err(dev, "dma mapping error %llx\n", (u64)pkt->dma); | ||
189 | return -EIO; | ||
190 | } | ||
191 | |||
192 | return 0; | ||
193 | } | ||
194 | |||
195 | static int usbhsg_dma_unmap(struct device *dev, | ||
196 | struct usbhs_pkt *pkt, | ||
197 | enum dma_data_direction dir) | ||
198 | { | 169 | { |
199 | struct usbhsg_request *ureq = usbhsg_pkt_to_ureq(pkt); | 170 | struct usbhsg_request *ureq = usbhsg_pkt_to_ureq(pkt); |
200 | struct usb_request *req = &ureq->req; | 171 | struct usb_request *req = &ureq->req; |
201 | |||
202 | if (pkt->dma == DMA_ADDR_INVALID) { | ||
203 | dev_err(dev, "dma is not mapped\n"); | ||
204 | return -EIO; | ||
205 | } | ||
206 | |||
207 | if (req->dma == DMA_ADDR_INVALID) | ||
208 | dma_unmap_single(dev, pkt->dma, pkt->length, dir); | ||
209 | else | ||
210 | dma_sync_single_for_cpu(dev, req->dma, req->length, dir); | ||
211 | |||
212 | pkt->dma = DMA_ADDR_INVALID; | ||
213 | |||
214 | return 0; | ||
215 | } | ||
216 | |||
217 | static int usbhsg_dma_map_ctrl(struct usbhs_pkt *pkt, int map) | ||
218 | { | ||
219 | struct usbhs_pipe *pipe = pkt->pipe; | 172 | struct usbhs_pipe *pipe = pkt->pipe; |
220 | struct usbhsg_uep *uep = usbhsg_pipe_to_uep(pipe); | 173 | struct usbhsg_uep *uep = usbhsg_pipe_to_uep(pipe); |
221 | struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep); | 174 | struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep); |
222 | struct device *dev = usbhsg_gpriv_to_dev(gpriv); | ||
223 | enum dma_data_direction dir; | 175 | enum dma_data_direction dir; |
176 | int ret = 0; | ||
224 | 177 | ||
225 | dir = usbhs_pipe_is_dir_in(pipe) ? DMA_FROM_DEVICE : DMA_TO_DEVICE; | 178 | dir = usbhs_pipe_is_dir_host(pipe); |
226 | 179 | ||
227 | if (map) | 180 | if (map) { |
228 | return usbhsg_dma_map(dev, pkt, dir); | 181 | /* it can not use scatter/gather */ |
229 | else | 182 | WARN_ON(req->num_sgs); |
230 | return usbhsg_dma_unmap(dev, pkt, dir); | 183 | |
184 | ret = usb_gadget_map_request(&gpriv->gadget, req, dir); | ||
185 | if (ret < 0) | ||
186 | return ret; | ||
187 | |||
188 | pkt->dma = req->dma; | ||
189 | } else { | ||
190 | usb_gadget_unmap_request(&gpriv->gadget, req, dir); | ||
191 | } | ||
192 | |||
193 | return ret; | ||
231 | } | 194 | } |
232 | 195 | ||
233 | /* | 196 | /* |
@@ -657,8 +620,6 @@ static struct usb_request *usbhsg_ep_alloc_request(struct usb_ep *ep, | |||
657 | 620 | ||
658 | usbhs_pkt_init(usbhsg_ureq_to_pkt(ureq)); | 621 | usbhs_pkt_init(usbhsg_ureq_to_pkt(ureq)); |
659 | 622 | ||
660 | ureq->req.dma = DMA_ADDR_INVALID; | ||
661 | |||
662 | return &ureq->req; | 623 | return &ureq->req; |
663 | } | 624 | } |
664 | 625 | ||
@@ -941,6 +902,11 @@ static int usbhsg_stop(struct usbhs_priv *priv) | |||
941 | return usbhsg_try_stop(priv, USBHSG_STATUS_STARTED); | 902 | return usbhsg_try_stop(priv, USBHSG_STATUS_STARTED); |
942 | } | 903 | } |
943 | 904 | ||
905 | static void usbhs_mod_gadget_release(struct device *pdev) | ||
906 | { | ||
907 | /* do nothing */ | ||
908 | } | ||
909 | |||
944 | int usbhs_mod_gadget_probe(struct usbhs_priv *priv) | 910 | int usbhs_mod_gadget_probe(struct usbhs_priv *priv) |
945 | { | 911 | { |
946 | struct usbhsg_gpriv *gpriv; | 912 | struct usbhsg_gpriv *gpriv; |
@@ -989,6 +955,7 @@ int usbhs_mod_gadget_probe(struct usbhs_priv *priv) | |||
989 | */ | 955 | */ |
990 | dev_set_name(&gpriv->gadget.dev, "gadget"); | 956 | dev_set_name(&gpriv->gadget.dev, "gadget"); |
991 | gpriv->gadget.dev.parent = dev; | 957 | gpriv->gadget.dev.parent = dev; |
958 | gpriv->gadget.dev.release = usbhs_mod_gadget_release; | ||
992 | gpriv->gadget.name = "renesas_usbhs_udc"; | 959 | gpriv->gadget.name = "renesas_usbhs_udc"; |
993 | gpriv->gadget.ops = &usbhsg_gadget_ops; | 960 | gpriv->gadget.ops = &usbhsg_gadget_ops; |
994 | gpriv->gadget.max_speed = USB_SPEED_HIGH; | 961 | gpriv->gadget.max_speed = USB_SPEED_HIGH; |
diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig index 677f577c0243..7141d6599060 100644 --- a/drivers/usb/serial/Kconfig +++ b/drivers/usb/serial/Kconfig | |||
@@ -238,6 +238,15 @@ config USB_SERIAL_EDGEPORT_TI | |||
238 | To compile this driver as a module, choose M here: the | 238 | To compile this driver as a module, choose M here: the |
239 | module will be called io_ti. | 239 | module will be called io_ti. |
240 | 240 | ||
241 | config USB_SERIAL_F81232 | ||
242 | tristate "USB Fintek F81232 Single Port Serial Driver" | ||
243 | help | ||
244 | Say Y here if you want to use the Fintek F81232 single | ||
245 | port usb to serial adapter. | ||
246 | |||
247 | To compile this driver as a module, choose M here: the | ||
248 | module will be called f81232. | ||
249 | |||
241 | config USB_SERIAL_GARMIN | 250 | config USB_SERIAL_GARMIN |
242 | tristate "USB Garmin GPS driver" | 251 | tristate "USB Garmin GPS driver" |
243 | help | 252 | help |
@@ -417,6 +426,14 @@ config USB_SERIAL_MCT_U232 | |||
417 | To compile this driver as a module, choose M here: the | 426 | To compile this driver as a module, choose M here: the |
418 | module will be called mct_u232. | 427 | module will be called mct_u232. |
419 | 428 | ||
429 | config USB_SERIAL_METRO | ||
430 | tristate "USB Metrologic Instruments USB-POS Barcode Scanner Driver" | ||
431 | ---help--- | ||
432 | Say Y here if you want to use a USB POS Metrologic barcode scanner. | ||
433 | |||
434 | To compile this driver as a module, choose M here: the | ||
435 | module will be called metro-usb. | ||
436 | |||
420 | config USB_SERIAL_MOS7720 | 437 | config USB_SERIAL_MOS7720 |
421 | tristate "USB Moschip 7720 Serial Driver" | 438 | tristate "USB Moschip 7720 Serial Driver" |
422 | ---help--- | 439 | ---help--- |
diff --git a/drivers/usb/serial/Makefile b/drivers/usb/serial/Makefile index 9e536eefb32c..07f198ee0486 100644 --- a/drivers/usb/serial/Makefile +++ b/drivers/usb/serial/Makefile | |||
@@ -23,6 +23,7 @@ obj-$(CONFIG_USB_SERIAL_DIGI_ACCELEPORT) += digi_acceleport.o | |||
23 | obj-$(CONFIG_USB_SERIAL_EDGEPORT) += io_edgeport.o | 23 | obj-$(CONFIG_USB_SERIAL_EDGEPORT) += io_edgeport.o |
24 | obj-$(CONFIG_USB_SERIAL_EDGEPORT_TI) += io_ti.o | 24 | obj-$(CONFIG_USB_SERIAL_EDGEPORT_TI) += io_ti.o |
25 | obj-$(CONFIG_USB_SERIAL_EMPEG) += empeg.o | 25 | obj-$(CONFIG_USB_SERIAL_EMPEG) += empeg.o |
26 | obj-$(CONFIG_USB_SERIAL_F81232) += f81232.o | ||
26 | obj-$(CONFIG_USB_SERIAL_FTDI_SIO) += ftdi_sio.o | 27 | obj-$(CONFIG_USB_SERIAL_FTDI_SIO) += ftdi_sio.o |
27 | obj-$(CONFIG_USB_SERIAL_FUNSOFT) += funsoft.o | 28 | obj-$(CONFIG_USB_SERIAL_FUNSOFT) += funsoft.o |
28 | obj-$(CONFIG_USB_SERIAL_GARMIN) += garmin_gps.o | 29 | obj-$(CONFIG_USB_SERIAL_GARMIN) += garmin_gps.o |
@@ -36,6 +37,7 @@ obj-$(CONFIG_USB_SERIAL_KEYSPAN_PDA) += keyspan_pda.o | |||
36 | obj-$(CONFIG_USB_SERIAL_KLSI) += kl5kusb105.o | 37 | obj-$(CONFIG_USB_SERIAL_KLSI) += kl5kusb105.o |
37 | obj-$(CONFIG_USB_SERIAL_KOBIL_SCT) += kobil_sct.o | 38 | obj-$(CONFIG_USB_SERIAL_KOBIL_SCT) += kobil_sct.o |
38 | obj-$(CONFIG_USB_SERIAL_MCT_U232) += mct_u232.o | 39 | obj-$(CONFIG_USB_SERIAL_MCT_U232) += mct_u232.o |
40 | obj-$(CONFIG_USB_SERIAL_METRO) += metro-usb.o | ||
39 | obj-$(CONFIG_USB_SERIAL_MOS7720) += mos7720.o | 41 | obj-$(CONFIG_USB_SERIAL_MOS7720) += mos7720.o |
40 | obj-$(CONFIG_USB_SERIAL_MOS7840) += mos7840.o | 42 | obj-$(CONFIG_USB_SERIAL_MOS7840) += mos7840.o |
41 | obj-$(CONFIG_USB_SERIAL_MOTOROLA) += moto_modem.o | 43 | obj-$(CONFIG_USB_SERIAL_MOTOROLA) += moto_modem.o |
diff --git a/drivers/usb/serial/aircable.c b/drivers/usb/serial/aircable.c index 123bf9155339..eec4fb9a35c1 100644 --- a/drivers/usb/serial/aircable.c +++ b/drivers/usb/serial/aircable.c | |||
@@ -175,7 +175,6 @@ static struct usb_driver aircable_driver = { | |||
175 | .probe = usb_serial_probe, | 175 | .probe = usb_serial_probe, |
176 | .disconnect = usb_serial_disconnect, | 176 | .disconnect = usb_serial_disconnect, |
177 | .id_table = id_table, | 177 | .id_table = id_table, |
178 | .no_dynamic_id = 1, | ||
179 | }; | 178 | }; |
180 | 179 | ||
181 | static struct usb_serial_driver aircable_device = { | 180 | static struct usb_serial_driver aircable_device = { |
@@ -183,7 +182,6 @@ static struct usb_serial_driver aircable_device = { | |||
183 | .owner = THIS_MODULE, | 182 | .owner = THIS_MODULE, |
184 | .name = "aircable", | 183 | .name = "aircable", |
185 | }, | 184 | }, |
186 | .usb_driver = &aircable_driver, | ||
187 | .id_table = id_table, | 185 | .id_table = id_table, |
188 | .num_ports = 1, | 186 | .num_ports = 1, |
189 | .bulk_out_size = HCI_COMPLETE_FRAME, | 187 | .bulk_out_size = HCI_COMPLETE_FRAME, |
@@ -194,36 +192,16 @@ static struct usb_serial_driver aircable_device = { | |||
194 | .unthrottle = usb_serial_generic_unthrottle, | 192 | .unthrottle = usb_serial_generic_unthrottle, |
195 | }; | 193 | }; |
196 | 194 | ||
197 | static int __init aircable_init(void) | 195 | static struct usb_serial_driver * const serial_drivers[] = { |
198 | { | 196 | &aircable_device, NULL |
199 | int retval; | 197 | }; |
200 | retval = usb_serial_register(&aircable_device); | ||
201 | if (retval) | ||
202 | goto failed_serial_register; | ||
203 | retval = usb_register(&aircable_driver); | ||
204 | if (retval) | ||
205 | goto failed_usb_register; | ||
206 | return 0; | ||
207 | |||
208 | failed_usb_register: | ||
209 | usb_serial_deregister(&aircable_device); | ||
210 | failed_serial_register: | ||
211 | return retval; | ||
212 | } | ||
213 | 198 | ||
214 | static void __exit aircable_exit(void) | 199 | module_usb_serial_driver(aircable_driver, serial_drivers); |
215 | { | ||
216 | usb_deregister(&aircable_driver); | ||
217 | usb_serial_deregister(&aircable_device); | ||
218 | } | ||
219 | 200 | ||
220 | MODULE_AUTHOR(DRIVER_AUTHOR); | 201 | MODULE_AUTHOR(DRIVER_AUTHOR); |
221 | MODULE_DESCRIPTION(DRIVER_DESC); | 202 | MODULE_DESCRIPTION(DRIVER_DESC); |
222 | MODULE_VERSION(DRIVER_VERSION); | 203 | MODULE_VERSION(DRIVER_VERSION); |
223 | MODULE_LICENSE("GPL"); | 204 | MODULE_LICENSE("GPL"); |
224 | 205 | ||
225 | module_init(aircable_init); | ||
226 | module_exit(aircable_exit); | ||
227 | |||
228 | module_param(debug, bool, S_IRUGO | S_IWUSR); | 206 | module_param(debug, bool, S_IRUGO | S_IWUSR); |
229 | MODULE_PARM_DESC(debug, "Debug enabled or not"); | 207 | MODULE_PARM_DESC(debug, "Debug enabled or not"); |
diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c index 69328dcfd91a..f99f47100dd8 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c | |||
@@ -719,7 +719,6 @@ static struct usb_driver ark3116_driver = { | |||
719 | .probe = usb_serial_probe, | 719 | .probe = usb_serial_probe, |
720 | .disconnect = usb_serial_disconnect, | 720 | .disconnect = usb_serial_disconnect, |
721 | .id_table = id_table, | 721 | .id_table = id_table, |
722 | .no_dynamic_id = 1, | ||
723 | }; | 722 | }; |
724 | 723 | ||
725 | static struct usb_serial_driver ark3116_device = { | 724 | static struct usb_serial_driver ark3116_device = { |
@@ -728,7 +727,6 @@ static struct usb_serial_driver ark3116_device = { | |||
728 | .name = "ark3116", | 727 | .name = "ark3116", |
729 | }, | 728 | }, |
730 | .id_table = id_table, | 729 | .id_table = id_table, |
731 | .usb_driver = &ark3116_driver, | ||
732 | .num_ports = 1, | 730 | .num_ports = 1, |
733 | .attach = ark3116_attach, | 731 | .attach = ark3116_attach, |
734 | .release = ark3116_release, | 732 | .release = ark3116_release, |
@@ -745,32 +743,12 @@ static struct usb_serial_driver ark3116_device = { | |||
745 | .process_read_urb = ark3116_process_read_urb, | 743 | .process_read_urb = ark3116_process_read_urb, |
746 | }; | 744 | }; |
747 | 745 | ||
748 | static int __init ark3116_init(void) | 746 | static struct usb_serial_driver * const serial_drivers[] = { |
749 | { | 747 | &ark3116_device, NULL |
750 | int retval; | 748 | }; |
751 | |||
752 | retval = usb_serial_register(&ark3116_device); | ||
753 | if (retval) | ||
754 | return retval; | ||
755 | retval = usb_register(&ark3116_driver); | ||
756 | if (retval == 0) { | ||
757 | printk(KERN_INFO "%s:" | ||
758 | DRIVER_VERSION ":" | ||
759 | DRIVER_DESC "\n", | ||
760 | KBUILD_MODNAME); | ||
761 | } else | ||
762 | usb_serial_deregister(&ark3116_device); | ||
763 | return retval; | ||
764 | } | ||
765 | 749 | ||
766 | static void __exit ark3116_exit(void) | 750 | module_usb_serial_driver(ark3116_driver, serial_drivers); |
767 | { | ||
768 | usb_deregister(&ark3116_driver); | ||
769 | usb_serial_deregister(&ark3116_device); | ||
770 | } | ||
771 | 751 | ||
772 | module_init(ark3116_init); | ||
773 | module_exit(ark3116_exit); | ||
774 | MODULE_LICENSE("GPL"); | 752 | MODULE_LICENSE("GPL"); |
775 | 753 | ||
776 | MODULE_AUTHOR(DRIVER_AUTHOR); | 754 | MODULE_AUTHOR(DRIVER_AUTHOR); |
diff --git a/drivers/usb/serial/belkin_sa.c b/drivers/usb/serial/belkin_sa.c index 29ffeb6279c7..a52e0d2cec31 100644 --- a/drivers/usb/serial/belkin_sa.c +++ b/drivers/usb/serial/belkin_sa.c | |||
@@ -78,7 +78,6 @@ static struct usb_driver belkin_driver = { | |||
78 | .probe = usb_serial_probe, | 78 | .probe = usb_serial_probe, |
79 | .disconnect = usb_serial_disconnect, | 79 | .disconnect = usb_serial_disconnect, |
80 | .id_table = id_table_combined, | 80 | .id_table = id_table_combined, |
81 | .no_dynamic_id = 1, | ||
82 | }; | 81 | }; |
83 | 82 | ||
84 | /* All of the device info needed for the serial converters */ | 83 | /* All of the device info needed for the serial converters */ |
@@ -88,7 +87,6 @@ static struct usb_serial_driver belkin_device = { | |||
88 | .name = "belkin", | 87 | .name = "belkin", |
89 | }, | 88 | }, |
90 | .description = "Belkin / Peracom / GoHubs USB Serial Adapter", | 89 | .description = "Belkin / Peracom / GoHubs USB Serial Adapter", |
91 | .usb_driver = &belkin_driver, | ||
92 | .id_table = id_table_combined, | 90 | .id_table = id_table_combined, |
93 | .num_ports = 1, | 91 | .num_ports = 1, |
94 | .open = belkin_sa_open, | 92 | .open = belkin_sa_open, |
@@ -103,6 +101,10 @@ static struct usb_serial_driver belkin_device = { | |||
103 | .release = belkin_sa_release, | 101 | .release = belkin_sa_release, |
104 | }; | 102 | }; |
105 | 103 | ||
104 | static struct usb_serial_driver * const serial_drivers[] = { | ||
105 | &belkin_device, NULL | ||
106 | }; | ||
107 | |||
106 | struct belkin_sa_private { | 108 | struct belkin_sa_private { |
107 | spinlock_t lock; | 109 | spinlock_t lock; |
108 | unsigned long control_state; | 110 | unsigned long control_state; |
@@ -522,34 +524,7 @@ exit: | |||
522 | return retval; | 524 | return retval; |
523 | } | 525 | } |
524 | 526 | ||
525 | 527 | module_usb_serial_driver(belkin_driver, serial_drivers); | |
526 | static int __init belkin_sa_init(void) | ||
527 | { | ||
528 | int retval; | ||
529 | retval = usb_serial_register(&belkin_device); | ||
530 | if (retval) | ||
531 | goto failed_usb_serial_register; | ||
532 | retval = usb_register(&belkin_driver); | ||
533 | if (retval) | ||
534 | goto failed_usb_register; | ||
535 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
536 | DRIVER_DESC "\n"); | ||
537 | return 0; | ||
538 | failed_usb_register: | ||
539 | usb_serial_deregister(&belkin_device); | ||
540 | failed_usb_serial_register: | ||
541 | return retval; | ||
542 | } | ||
543 | |||
544 | static void __exit belkin_sa_exit (void) | ||
545 | { | ||
546 | usb_deregister(&belkin_driver); | ||
547 | usb_serial_deregister(&belkin_device); | ||
548 | } | ||
549 | |||
550 | |||
551 | module_init(belkin_sa_init); | ||
552 | module_exit(belkin_sa_exit); | ||
553 | 528 | ||
554 | MODULE_AUTHOR(DRIVER_AUTHOR); | 529 | MODULE_AUTHOR(DRIVER_AUTHOR); |
555 | MODULE_DESCRIPTION(DRIVER_DESC); | 530 | MODULE_DESCRIPTION(DRIVER_DESC); |
diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c index 5e53cc59e652..aaab32db31d0 100644 --- a/drivers/usb/serial/ch341.c +++ b/drivers/usb/serial/ch341.c | |||
@@ -625,7 +625,6 @@ static struct usb_driver ch341_driver = { | |||
625 | .resume = usb_serial_resume, | 625 | .resume = usb_serial_resume, |
626 | .reset_resume = ch341_reset_resume, | 626 | .reset_resume = ch341_reset_resume, |
627 | .id_table = id_table, | 627 | .id_table = id_table, |
628 | .no_dynamic_id = 1, | ||
629 | .supports_autosuspend = 1, | 628 | .supports_autosuspend = 1, |
630 | }; | 629 | }; |
631 | 630 | ||
@@ -635,7 +634,6 @@ static struct usb_serial_driver ch341_device = { | |||
635 | .name = "ch341-uart", | 634 | .name = "ch341-uart", |
636 | }, | 635 | }, |
637 | .id_table = id_table, | 636 | .id_table = id_table, |
638 | .usb_driver = &ch341_driver, | ||
639 | .num_ports = 1, | 637 | .num_ports = 1, |
640 | .open = ch341_open, | 638 | .open = ch341_open, |
641 | .dtr_rts = ch341_dtr_rts, | 639 | .dtr_rts = ch341_dtr_rts, |
@@ -650,30 +648,13 @@ static struct usb_serial_driver ch341_device = { | |||
650 | .attach = ch341_attach, | 648 | .attach = ch341_attach, |
651 | }; | 649 | }; |
652 | 650 | ||
653 | static int __init ch341_init(void) | 651 | static struct usb_serial_driver * const serial_drivers[] = { |
654 | { | 652 | &ch341_device, NULL |
655 | int retval; | 653 | }; |
656 | |||
657 | retval = usb_serial_register(&ch341_device); | ||
658 | if (retval) | ||
659 | return retval; | ||
660 | retval = usb_register(&ch341_driver); | ||
661 | if (retval) | ||
662 | usb_serial_deregister(&ch341_device); | ||
663 | return retval; | ||
664 | } | ||
665 | 654 | ||
666 | static void __exit ch341_exit(void) | 655 | module_usb_serial_driver(ch341_driver, serial_drivers); |
667 | { | ||
668 | usb_deregister(&ch341_driver); | ||
669 | usb_serial_deregister(&ch341_device); | ||
670 | } | ||
671 | 656 | ||
672 | module_init(ch341_init); | ||
673 | module_exit(ch341_exit); | ||
674 | MODULE_LICENSE("GPL"); | 657 | MODULE_LICENSE("GPL"); |
675 | 658 | ||
676 | module_param(debug, bool, S_IRUGO | S_IWUSR); | 659 | module_param(debug, bool, S_IRUGO | S_IWUSR); |
677 | MODULE_PARM_DESC(debug, "Debug enabled or not"); | 660 | MODULE_PARM_DESC(debug, "Debug enabled or not"); |
678 | |||
679 | /* EOF ch341.c */ | ||
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index 08a5575724cd..0310e2df59f5 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c | |||
@@ -49,6 +49,7 @@ static int cp210x_tiocmset_port(struct usb_serial_port *port, | |||
49 | unsigned int, unsigned int); | 49 | unsigned int, unsigned int); |
50 | static void cp210x_break_ctl(struct tty_struct *, int); | 50 | static void cp210x_break_ctl(struct tty_struct *, int); |
51 | static int cp210x_startup(struct usb_serial *); | 51 | static int cp210x_startup(struct usb_serial *); |
52 | static void cp210x_release(struct usb_serial *); | ||
52 | static void cp210x_dtr_rts(struct usb_serial_port *p, int on); | 53 | static void cp210x_dtr_rts(struct usb_serial_port *p, int on); |
53 | 54 | ||
54 | static bool debug; | 55 | static bool debug; |
@@ -121,6 +122,8 @@ static const struct usb_device_id id_table[] = { | |||
121 | { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ | 122 | { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ |
122 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ | 123 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ |
123 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ | 124 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ |
125 | { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */ | ||
126 | { USB_DEVICE(0x10C4, 0xEA80) }, /* Silicon Labs factory default */ | ||
124 | { USB_DEVICE(0x10C4, 0xEA71) }, /* Infinity GPS-MIC-1 Radio Monophone */ | 127 | { USB_DEVICE(0x10C4, 0xEA71) }, /* Infinity GPS-MIC-1 Radio Monophone */ |
125 | { USB_DEVICE(0x10C4, 0xF001) }, /* Elan Digital Systems USBscope50 */ | 128 | { USB_DEVICE(0x10C4, 0xF001) }, /* Elan Digital Systems USBscope50 */ |
126 | { USB_DEVICE(0x10C4, 0xF002) }, /* Elan Digital Systems USBwave12 */ | 129 | { USB_DEVICE(0x10C4, 0xF002) }, /* Elan Digital Systems USBwave12 */ |
@@ -149,12 +152,15 @@ static const struct usb_device_id id_table[] = { | |||
149 | 152 | ||
150 | MODULE_DEVICE_TABLE(usb, id_table); | 153 | MODULE_DEVICE_TABLE(usb, id_table); |
151 | 154 | ||
155 | struct cp210x_port_private { | ||
156 | __u8 bInterfaceNumber; | ||
157 | }; | ||
158 | |||
152 | static struct usb_driver cp210x_driver = { | 159 | static struct usb_driver cp210x_driver = { |
153 | .name = "cp210x", | 160 | .name = "cp210x", |
154 | .probe = usb_serial_probe, | 161 | .probe = usb_serial_probe, |
155 | .disconnect = usb_serial_disconnect, | 162 | .disconnect = usb_serial_disconnect, |
156 | .id_table = id_table, | 163 | .id_table = id_table, |
157 | .no_dynamic_id = 1, | ||
158 | }; | 164 | }; |
159 | 165 | ||
160 | static struct usb_serial_driver cp210x_device = { | 166 | static struct usb_serial_driver cp210x_device = { |
@@ -162,7 +168,6 @@ static struct usb_serial_driver cp210x_device = { | |||
162 | .owner = THIS_MODULE, | 168 | .owner = THIS_MODULE, |
163 | .name = "cp210x", | 169 | .name = "cp210x", |
164 | }, | 170 | }, |
165 | .usb_driver = &cp210x_driver, | ||
166 | .id_table = id_table, | 171 | .id_table = id_table, |
167 | .num_ports = 1, | 172 | .num_ports = 1, |
168 | .bulk_in_size = 256, | 173 | .bulk_in_size = 256, |
@@ -174,9 +179,14 @@ static struct usb_serial_driver cp210x_device = { | |||
174 | .tiocmget = cp210x_tiocmget, | 179 | .tiocmget = cp210x_tiocmget, |
175 | .tiocmset = cp210x_tiocmset, | 180 | .tiocmset = cp210x_tiocmset, |
176 | .attach = cp210x_startup, | 181 | .attach = cp210x_startup, |
182 | .release = cp210x_release, | ||
177 | .dtr_rts = cp210x_dtr_rts | 183 | .dtr_rts = cp210x_dtr_rts |
178 | }; | 184 | }; |
179 | 185 | ||
186 | static struct usb_serial_driver * const serial_drivers[] = { | ||
187 | &cp210x_device, NULL | ||
188 | }; | ||
189 | |||
180 | /* Config request types */ | 190 | /* Config request types */ |
181 | #define REQTYPE_HOST_TO_DEVICE 0x41 | 191 | #define REQTYPE_HOST_TO_DEVICE 0x41 |
182 | #define REQTYPE_DEVICE_TO_HOST 0xc1 | 192 | #define REQTYPE_DEVICE_TO_HOST 0xc1 |
@@ -261,6 +271,7 @@ static int cp210x_get_config(struct usb_serial_port *port, u8 request, | |||
261 | unsigned int *data, int size) | 271 | unsigned int *data, int size) |
262 | { | 272 | { |
263 | struct usb_serial *serial = port->serial; | 273 | struct usb_serial *serial = port->serial; |
274 | struct cp210x_port_private *port_priv = usb_get_serial_port_data(port); | ||
264 | __le32 *buf; | 275 | __le32 *buf; |
265 | int result, i, length; | 276 | int result, i, length; |
266 | 277 | ||
@@ -276,7 +287,7 @@ static int cp210x_get_config(struct usb_serial_port *port, u8 request, | |||
276 | /* Issue the request, attempting to read 'size' bytes */ | 287 | /* Issue the request, attempting to read 'size' bytes */ |
277 | result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), | 288 | result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), |
278 | request, REQTYPE_DEVICE_TO_HOST, 0x0000, | 289 | request, REQTYPE_DEVICE_TO_HOST, 0x0000, |
279 | 0, buf, size, 300); | 290 | port_priv->bInterfaceNumber, buf, size, 300); |
280 | 291 | ||
281 | /* Convert data into an array of integers */ | 292 | /* Convert data into an array of integers */ |
282 | for (i = 0; i < length; i++) | 293 | for (i = 0; i < length; i++) |
@@ -286,7 +297,7 @@ static int cp210x_get_config(struct usb_serial_port *port, u8 request, | |||
286 | 297 | ||
287 | if (result != size) { | 298 | if (result != size) { |
288 | dbg("%s - Unable to send config request, " | 299 | dbg("%s - Unable to send config request, " |
289 | "request=0x%x size=%d result=%d\n", | 300 | "request=0x%x size=%d result=%d", |
290 | __func__, request, size, result); | 301 | __func__, request, size, result); |
291 | if (result > 0) | 302 | if (result > 0) |
292 | result = -EPROTO; | 303 | result = -EPROTO; |
@@ -307,6 +318,7 @@ static int cp210x_set_config(struct usb_serial_port *port, u8 request, | |||
307 | unsigned int *data, int size) | 318 | unsigned int *data, int size) |
308 | { | 319 | { |
309 | struct usb_serial *serial = port->serial; | 320 | struct usb_serial *serial = port->serial; |
321 | struct cp210x_port_private *port_priv = usb_get_serial_port_data(port); | ||
310 | __le32 *buf; | 322 | __le32 *buf; |
311 | int result, i, length; | 323 | int result, i, length; |
312 | 324 | ||
@@ -328,19 +340,19 @@ static int cp210x_set_config(struct usb_serial_port *port, u8 request, | |||
328 | result = usb_control_msg(serial->dev, | 340 | result = usb_control_msg(serial->dev, |
329 | usb_sndctrlpipe(serial->dev, 0), | 341 | usb_sndctrlpipe(serial->dev, 0), |
330 | request, REQTYPE_HOST_TO_DEVICE, 0x0000, | 342 | request, REQTYPE_HOST_TO_DEVICE, 0x0000, |
331 | 0, buf, size, 300); | 343 | port_priv->bInterfaceNumber, buf, size, 300); |
332 | } else { | 344 | } else { |
333 | result = usb_control_msg(serial->dev, | 345 | result = usb_control_msg(serial->dev, |
334 | usb_sndctrlpipe(serial->dev, 0), | 346 | usb_sndctrlpipe(serial->dev, 0), |
335 | request, REQTYPE_HOST_TO_DEVICE, data[0], | 347 | request, REQTYPE_HOST_TO_DEVICE, data[0], |
336 | 0, NULL, 0, 300); | 348 | port_priv->bInterfaceNumber, NULL, 0, 300); |
337 | } | 349 | } |
338 | 350 | ||
339 | kfree(buf); | 351 | kfree(buf); |
340 | 352 | ||
341 | if ((size > 2 && result != size) || result < 0) { | 353 | if ((size > 2 && result != size) || result < 0) { |
342 | dbg("%s - Unable to send request, " | 354 | dbg("%s - Unable to send request, " |
343 | "request=0x%x size=%d result=%d\n", | 355 | "request=0x%x size=%d result=%d", |
344 | __func__, request, size, result); | 356 | __func__, request, size, result); |
345 | if (result > 0) | 357 | if (result > 0) |
346 | result = -EPROTO; | 358 | result = -EPROTO; |
@@ -683,13 +695,13 @@ static void cp210x_set_termios(struct tty_struct *tty, | |||
683 | default: | 695 | default: |
684 | dbg("cp210x driver does not " | 696 | dbg("cp210x driver does not " |
685 | "support the number of bits requested," | 697 | "support the number of bits requested," |
686 | " using 8 bit mode\n"); | 698 | " using 8 bit mode"); |
687 | bits |= BITS_DATA_8; | 699 | bits |= BITS_DATA_8; |
688 | break; | 700 | break; |
689 | } | 701 | } |
690 | if (cp210x_set_config(port, CP210X_SET_LINE_CTL, &bits, 2)) | 702 | if (cp210x_set_config(port, CP210X_SET_LINE_CTL, &bits, 2)) |
691 | dbg("Number of data bits requested " | 703 | dbg("Number of data bits requested " |
692 | "not supported by device\n"); | 704 | "not supported by device"); |
693 | } | 705 | } |
694 | 706 | ||
695 | if ((cflag & (PARENB|PARODD|CMSPAR)) != | 707 | if ((cflag & (PARENB|PARODD|CMSPAR)) != |
@@ -716,8 +728,7 @@ static void cp210x_set_termios(struct tty_struct *tty, | |||
716 | } | 728 | } |
717 | } | 729 | } |
718 | if (cp210x_set_config(port, CP210X_SET_LINE_CTL, &bits, 2)) | 730 | if (cp210x_set_config(port, CP210X_SET_LINE_CTL, &bits, 2)) |
719 | dbg("Parity mode not supported " | 731 | dbg("Parity mode not supported by device"); |
720 | "by device\n"); | ||
721 | } | 732 | } |
722 | 733 | ||
723 | if ((cflag & CSTOPB) != (old_cflag & CSTOPB)) { | 734 | if ((cflag & CSTOPB) != (old_cflag & CSTOPB)) { |
@@ -732,7 +743,7 @@ static void cp210x_set_termios(struct tty_struct *tty, | |||
732 | } | 743 | } |
733 | if (cp210x_set_config(port, CP210X_SET_LINE_CTL, &bits, 2)) | 744 | if (cp210x_set_config(port, CP210X_SET_LINE_CTL, &bits, 2)) |
734 | dbg("Number of stop bits requested " | 745 | dbg("Number of stop bits requested " |
735 | "not supported by device\n"); | 746 | "not supported by device"); |
736 | } | 747 | } |
737 | 748 | ||
738 | if ((cflag & CRTSCTS) != (old_cflag & CRTSCTS)) { | 749 | if ((cflag & CRTSCTS) != (old_cflag & CRTSCTS)) { |
@@ -844,40 +855,40 @@ static void cp210x_break_ctl (struct tty_struct *tty, int break_state) | |||
844 | 855 | ||
845 | static int cp210x_startup(struct usb_serial *serial) | 856 | static int cp210x_startup(struct usb_serial *serial) |
846 | { | 857 | { |
858 | struct cp210x_port_private *port_priv; | ||
859 | int i; | ||
860 | |||
847 | /* cp210x buffers behave strangely unless device is reset */ | 861 | /* cp210x buffers behave strangely unless device is reset */ |
848 | usb_reset_device(serial->dev); | 862 | usb_reset_device(serial->dev); |
849 | return 0; | ||
850 | } | ||
851 | 863 | ||
852 | static int __init cp210x_init(void) | 864 | for (i = 0; i < serial->num_ports; i++) { |
853 | { | 865 | port_priv = kzalloc(sizeof(*port_priv), GFP_KERNEL); |
854 | int retval; | 866 | if (!port_priv) |
867 | return -ENOMEM; | ||
855 | 868 | ||
856 | retval = usb_serial_register(&cp210x_device); | 869 | memset(port_priv, 0x00, sizeof(*port_priv)); |
857 | if (retval) | 870 | port_priv->bInterfaceNumber = |
858 | return retval; /* Failed to register */ | 871 | serial->interface->cur_altsetting->desc.bInterfaceNumber; |
859 | 872 | ||
860 | retval = usb_register(&cp210x_driver); | 873 | usb_set_serial_port_data(serial->port[i], port_priv); |
861 | if (retval) { | ||
862 | /* Failed to register */ | ||
863 | usb_serial_deregister(&cp210x_device); | ||
864 | return retval; | ||
865 | } | 874 | } |
866 | 875 | ||
867 | /* Success */ | ||
868 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
869 | DRIVER_DESC "\n"); | ||
870 | return 0; | 876 | return 0; |
871 | } | 877 | } |
872 | 878 | ||
873 | static void __exit cp210x_exit(void) | 879 | static void cp210x_release(struct usb_serial *serial) |
874 | { | 880 | { |
875 | usb_deregister(&cp210x_driver); | 881 | struct cp210x_port_private *port_priv; |
876 | usb_serial_deregister(&cp210x_device); | 882 | int i; |
883 | |||
884 | for (i = 0; i < serial->num_ports; i++) { | ||
885 | port_priv = usb_get_serial_port_data(serial->port[i]); | ||
886 | kfree(port_priv); | ||
887 | usb_set_serial_port_data(serial->port[i], NULL); | ||
888 | } | ||
877 | } | 889 | } |
878 | 890 | ||
879 | module_init(cp210x_init); | 891 | module_usb_serial_driver(cp210x_driver, serial_drivers); |
880 | module_exit(cp210x_exit); | ||
881 | 892 | ||
882 | MODULE_DESCRIPTION(DRIVER_DESC); | 893 | MODULE_DESCRIPTION(DRIVER_DESC); |
883 | MODULE_VERSION(DRIVER_VERSION); | 894 | MODULE_VERSION(DRIVER_VERSION); |
diff --git a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c index 6bc3802a581a..d39b9418f2fb 100644 --- a/drivers/usb/serial/cyberjack.c +++ b/drivers/usb/serial/cyberjack.c | |||
@@ -82,7 +82,6 @@ static struct usb_driver cyberjack_driver = { | |||
82 | .probe = usb_serial_probe, | 82 | .probe = usb_serial_probe, |
83 | .disconnect = usb_serial_disconnect, | 83 | .disconnect = usb_serial_disconnect, |
84 | .id_table = id_table, | 84 | .id_table = id_table, |
85 | .no_dynamic_id = 1, | ||
86 | }; | 85 | }; |
87 | 86 | ||
88 | static struct usb_serial_driver cyberjack_device = { | 87 | static struct usb_serial_driver cyberjack_device = { |
@@ -91,7 +90,6 @@ static struct usb_serial_driver cyberjack_device = { | |||
91 | .name = "cyberjack", | 90 | .name = "cyberjack", |
92 | }, | 91 | }, |
93 | .description = "Reiner SCT Cyberjack USB card reader", | 92 | .description = "Reiner SCT Cyberjack USB card reader", |
94 | .usb_driver = &cyberjack_driver, | ||
95 | .id_table = id_table, | 93 | .id_table = id_table, |
96 | .num_ports = 1, | 94 | .num_ports = 1, |
97 | .attach = cyberjack_startup, | 95 | .attach = cyberjack_startup, |
@@ -106,6 +104,10 @@ static struct usb_serial_driver cyberjack_device = { | |||
106 | .write_bulk_callback = cyberjack_write_bulk_callback, | 104 | .write_bulk_callback = cyberjack_write_bulk_callback, |
107 | }; | 105 | }; |
108 | 106 | ||
107 | static struct usb_serial_driver * const serial_drivers[] = { | ||
108 | &cyberjack_device, NULL | ||
109 | }; | ||
110 | |||
109 | struct cyberjack_private { | 111 | struct cyberjack_private { |
110 | spinlock_t lock; /* Lock for SMP */ | 112 | spinlock_t lock; /* Lock for SMP */ |
111 | short rdtodo; /* Bytes still to read */ | 113 | short rdtodo; /* Bytes still to read */ |
@@ -473,35 +475,7 @@ exit: | |||
473 | usb_serial_port_softint(port); | 475 | usb_serial_port_softint(port); |
474 | } | 476 | } |
475 | 477 | ||
476 | static int __init cyberjack_init(void) | 478 | module_usb_serial_driver(cyberjack_driver, serial_drivers); |
477 | { | ||
478 | int retval; | ||
479 | retval = usb_serial_register(&cyberjack_device); | ||
480 | if (retval) | ||
481 | goto failed_usb_serial_register; | ||
482 | retval = usb_register(&cyberjack_driver); | ||
483 | if (retval) | ||
484 | goto failed_usb_register; | ||
485 | |||
486 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION " " | ||
487 | DRIVER_AUTHOR "\n"); | ||
488 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n"); | ||
489 | |||
490 | return 0; | ||
491 | failed_usb_register: | ||
492 | usb_serial_deregister(&cyberjack_device); | ||
493 | failed_usb_serial_register: | ||
494 | return retval; | ||
495 | } | ||
496 | |||
497 | static void __exit cyberjack_exit(void) | ||
498 | { | ||
499 | usb_deregister(&cyberjack_driver); | ||
500 | usb_serial_deregister(&cyberjack_device); | ||
501 | } | ||
502 | |||
503 | module_init(cyberjack_init); | ||
504 | module_exit(cyberjack_exit); | ||
505 | 479 | ||
506 | MODULE_AUTHOR(DRIVER_AUTHOR); | 480 | MODULE_AUTHOR(DRIVER_AUTHOR); |
507 | MODULE_DESCRIPTION(DRIVER_DESC); | 481 | MODULE_DESCRIPTION(DRIVER_DESC); |
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index 3bdeafa29c24..afc886c75d2f 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c | |||
@@ -94,7 +94,6 @@ static struct usb_driver cypress_driver = { | |||
94 | .probe = usb_serial_probe, | 94 | .probe = usb_serial_probe, |
95 | .disconnect = usb_serial_disconnect, | 95 | .disconnect = usb_serial_disconnect, |
96 | .id_table = id_table_combined, | 96 | .id_table = id_table_combined, |
97 | .no_dynamic_id = 1, | ||
98 | }; | 97 | }; |
99 | 98 | ||
100 | enum packet_format { | 99 | enum packet_format { |
@@ -163,7 +162,6 @@ static struct usb_serial_driver cypress_earthmate_device = { | |||
163 | .name = "earthmate", | 162 | .name = "earthmate", |
164 | }, | 163 | }, |
165 | .description = "DeLorme Earthmate USB", | 164 | .description = "DeLorme Earthmate USB", |
166 | .usb_driver = &cypress_driver, | ||
167 | .id_table = id_table_earthmate, | 165 | .id_table = id_table_earthmate, |
168 | .num_ports = 1, | 166 | .num_ports = 1, |
169 | .attach = cypress_earthmate_startup, | 167 | .attach = cypress_earthmate_startup, |
@@ -190,7 +188,6 @@ static struct usb_serial_driver cypress_hidcom_device = { | |||
190 | .name = "cyphidcom", | 188 | .name = "cyphidcom", |
191 | }, | 189 | }, |
192 | .description = "HID->COM RS232 Adapter", | 190 | .description = "HID->COM RS232 Adapter", |
193 | .usb_driver = &cypress_driver, | ||
194 | .id_table = id_table_cyphidcomrs232, | 191 | .id_table = id_table_cyphidcomrs232, |
195 | .num_ports = 1, | 192 | .num_ports = 1, |
196 | .attach = cypress_hidcom_startup, | 193 | .attach = cypress_hidcom_startup, |
@@ -217,7 +214,6 @@ static struct usb_serial_driver cypress_ca42v2_device = { | |||
217 | .name = "nokiaca42v2", | 214 | .name = "nokiaca42v2", |
218 | }, | 215 | }, |
219 | .description = "Nokia CA-42 V2 Adapter", | 216 | .description = "Nokia CA-42 V2 Adapter", |
220 | .usb_driver = &cypress_driver, | ||
221 | .id_table = id_table_nokiaca42v2, | 217 | .id_table = id_table_nokiaca42v2, |
222 | .num_ports = 1, | 218 | .num_ports = 1, |
223 | .attach = cypress_ca42v2_startup, | 219 | .attach = cypress_ca42v2_startup, |
@@ -238,6 +234,11 @@ static struct usb_serial_driver cypress_ca42v2_device = { | |||
238 | .write_int_callback = cypress_write_int_callback, | 234 | .write_int_callback = cypress_write_int_callback, |
239 | }; | 235 | }; |
240 | 236 | ||
237 | static struct usb_serial_driver * const serial_drivers[] = { | ||
238 | &cypress_earthmate_device, &cypress_hidcom_device, | ||
239 | &cypress_ca42v2_device, NULL | ||
240 | }; | ||
241 | |||
241 | /***************************************************************************** | 242 | /***************************************************************************** |
242 | * Cypress serial helper functions | 243 | * Cypress serial helper functions |
243 | *****************************************************************************/ | 244 | *****************************************************************************/ |
@@ -800,7 +801,7 @@ send: | |||
800 | cypress_write_int_callback, port, priv->write_urb_interval); | 801 | cypress_write_int_callback, port, priv->write_urb_interval); |
801 | result = usb_submit_urb(port->interrupt_out_urb, GFP_ATOMIC); | 802 | result = usb_submit_urb(port->interrupt_out_urb, GFP_ATOMIC); |
802 | if (result) { | 803 | if (result) { |
803 | dev_err(&port->dev, | 804 | dev_err_console(port, |
804 | "%s - failed submitting write urb, error %d\n", | 805 | "%s - failed submitting write urb, error %d\n", |
805 | __func__, result); | 806 | __func__, result); |
806 | priv->write_urb_in_use = 0; | 807 | priv->write_urb_in_use = 0; |
@@ -1345,58 +1346,7 @@ static void cypress_write_int_callback(struct urb *urb) | |||
1345 | cypress_send(port); | 1346 | cypress_send(port); |
1346 | } | 1347 | } |
1347 | 1348 | ||
1348 | 1349 | module_usb_serial_driver(cypress_driver, serial_drivers); | |
1349 | /***************************************************************************** | ||
1350 | * Module functions | ||
1351 | *****************************************************************************/ | ||
1352 | |||
1353 | static int __init cypress_init(void) | ||
1354 | { | ||
1355 | int retval; | ||
1356 | |||
1357 | dbg("%s", __func__); | ||
1358 | |||
1359 | retval = usb_serial_register(&cypress_earthmate_device); | ||
1360 | if (retval) | ||
1361 | goto failed_em_register; | ||
1362 | retval = usb_serial_register(&cypress_hidcom_device); | ||
1363 | if (retval) | ||
1364 | goto failed_hidcom_register; | ||
1365 | retval = usb_serial_register(&cypress_ca42v2_device); | ||
1366 | if (retval) | ||
1367 | goto failed_ca42v2_register; | ||
1368 | retval = usb_register(&cypress_driver); | ||
1369 | if (retval) | ||
1370 | goto failed_usb_register; | ||
1371 | |||
1372 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
1373 | DRIVER_DESC "\n"); | ||
1374 | return 0; | ||
1375 | |||
1376 | failed_usb_register: | ||
1377 | usb_serial_deregister(&cypress_ca42v2_device); | ||
1378 | failed_ca42v2_register: | ||
1379 | usb_serial_deregister(&cypress_hidcom_device); | ||
1380 | failed_hidcom_register: | ||
1381 | usb_serial_deregister(&cypress_earthmate_device); | ||
1382 | failed_em_register: | ||
1383 | return retval; | ||
1384 | } | ||
1385 | |||
1386 | |||
1387 | static void __exit cypress_exit(void) | ||
1388 | { | ||
1389 | dbg("%s", __func__); | ||
1390 | |||
1391 | usb_deregister(&cypress_driver); | ||
1392 | usb_serial_deregister(&cypress_earthmate_device); | ||
1393 | usb_serial_deregister(&cypress_hidcom_device); | ||
1394 | usb_serial_deregister(&cypress_ca42v2_device); | ||
1395 | } | ||
1396 | |||
1397 | |||
1398 | module_init(cypress_init); | ||
1399 | module_exit(cypress_exit); | ||
1400 | 1350 | ||
1401 | MODULE_AUTHOR(DRIVER_AUTHOR); | 1351 | MODULE_AUTHOR(DRIVER_AUTHOR); |
1402 | MODULE_DESCRIPTION(DRIVER_DESC); | 1352 | MODULE_DESCRIPTION(DRIVER_DESC); |
diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c index b23bebd721a1..999f91bf70de 100644 --- a/drivers/usb/serial/digi_acceleport.c +++ b/drivers/usb/serial/digi_acceleport.c | |||
@@ -276,7 +276,6 @@ static struct usb_driver digi_driver = { | |||
276 | .probe = usb_serial_probe, | 276 | .probe = usb_serial_probe, |
277 | .disconnect = usb_serial_disconnect, | 277 | .disconnect = usb_serial_disconnect, |
278 | .id_table = id_table_combined, | 278 | .id_table = id_table_combined, |
279 | .no_dynamic_id = 1, | ||
280 | }; | 279 | }; |
281 | 280 | ||
282 | 281 | ||
@@ -288,7 +287,6 @@ static struct usb_serial_driver digi_acceleport_2_device = { | |||
288 | .name = "digi_2", | 287 | .name = "digi_2", |
289 | }, | 288 | }, |
290 | .description = "Digi 2 port USB adapter", | 289 | .description = "Digi 2 port USB adapter", |
291 | .usb_driver = &digi_driver, | ||
292 | .id_table = id_table_2, | 290 | .id_table = id_table_2, |
293 | .num_ports = 3, | 291 | .num_ports = 3, |
294 | .open = digi_open, | 292 | .open = digi_open, |
@@ -316,7 +314,6 @@ static struct usb_serial_driver digi_acceleport_4_device = { | |||
316 | .name = "digi_4", | 314 | .name = "digi_4", |
317 | }, | 315 | }, |
318 | .description = "Digi 4 port USB adapter", | 316 | .description = "Digi 4 port USB adapter", |
319 | .usb_driver = &digi_driver, | ||
320 | .id_table = id_table_4, | 317 | .id_table = id_table_4, |
321 | .num_ports = 4, | 318 | .num_ports = 4, |
322 | .open = digi_open, | 319 | .open = digi_open, |
@@ -337,6 +334,9 @@ static struct usb_serial_driver digi_acceleport_4_device = { | |||
337 | .release = digi_release, | 334 | .release = digi_release, |
338 | }; | 335 | }; |
339 | 336 | ||
337 | static struct usb_serial_driver * const serial_drivers[] = { | ||
338 | &digi_acceleport_2_device, &digi_acceleport_4_device, NULL | ||
339 | }; | ||
340 | 340 | ||
341 | /* Functions */ | 341 | /* Functions */ |
342 | 342 | ||
@@ -995,7 +995,7 @@ static int digi_write(struct tty_struct *tty, struct usb_serial_port *port, | |||
995 | /* return length of new data written, or error */ | 995 | /* return length of new data written, or error */ |
996 | spin_unlock_irqrestore(&priv->dp_port_lock, flags); | 996 | spin_unlock_irqrestore(&priv->dp_port_lock, flags); |
997 | if (ret < 0) | 997 | if (ret < 0) |
998 | dev_err(&port->dev, | 998 | dev_err_console(port, |
999 | "%s: usb_submit_urb failed, ret=%d, port=%d\n", | 999 | "%s: usb_submit_urb failed, ret=%d, port=%d\n", |
1000 | __func__, ret, priv->dp_port_num); | 1000 | __func__, ret, priv->dp_port_num); |
1001 | dbg("digi_write: returning %d", ret); | 1001 | dbg("digi_write: returning %d", ret); |
@@ -1065,7 +1065,7 @@ static void digi_write_bulk_callback(struct urb *urb) | |||
1065 | 1065 | ||
1066 | spin_unlock(&priv->dp_port_lock); | 1066 | spin_unlock(&priv->dp_port_lock); |
1067 | if (ret && ret != -EPERM) | 1067 | if (ret && ret != -EPERM) |
1068 | dev_err(&port->dev, | 1068 | dev_err_console(port, |
1069 | "%s: usb_submit_urb failed, ret=%d, port=%d\n", | 1069 | "%s: usb_submit_urb failed, ret=%d, port=%d\n", |
1070 | __func__, ret, priv->dp_port_num); | 1070 | __func__, ret, priv->dp_port_num); |
1071 | } | 1071 | } |
@@ -1580,40 +1580,7 @@ static int digi_read_oob_callback(struct urb *urb) | |||
1580 | 1580 | ||
1581 | } | 1581 | } |
1582 | 1582 | ||
1583 | static int __init digi_init(void) | 1583 | module_usb_serial_driver(digi_driver, serial_drivers); |
1584 | { | ||
1585 | int retval; | ||
1586 | retval = usb_serial_register(&digi_acceleport_2_device); | ||
1587 | if (retval) | ||
1588 | goto failed_acceleport_2_device; | ||
1589 | retval = usb_serial_register(&digi_acceleport_4_device); | ||
1590 | if (retval) | ||
1591 | goto failed_acceleport_4_device; | ||
1592 | retval = usb_register(&digi_driver); | ||
1593 | if (retval) | ||
1594 | goto failed_usb_register; | ||
1595 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
1596 | DRIVER_DESC "\n"); | ||
1597 | return 0; | ||
1598 | failed_usb_register: | ||
1599 | usb_serial_deregister(&digi_acceleport_4_device); | ||
1600 | failed_acceleport_4_device: | ||
1601 | usb_serial_deregister(&digi_acceleport_2_device); | ||
1602 | failed_acceleport_2_device: | ||
1603 | return retval; | ||
1604 | } | ||
1605 | |||
1606 | static void __exit digi_exit (void) | ||
1607 | { | ||
1608 | usb_deregister(&digi_driver); | ||
1609 | usb_serial_deregister(&digi_acceleport_2_device); | ||
1610 | usb_serial_deregister(&digi_acceleport_4_device); | ||
1611 | } | ||
1612 | |||
1613 | |||
1614 | module_init(digi_init); | ||
1615 | module_exit(digi_exit); | ||
1616 | |||
1617 | 1584 | ||
1618 | MODULE_AUTHOR(DRIVER_AUTHOR); | 1585 | MODULE_AUTHOR(DRIVER_AUTHOR); |
1619 | MODULE_DESCRIPTION(DRIVER_DESC); | 1586 | MODULE_DESCRIPTION(DRIVER_DESC); |
diff --git a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c index aced6817bf95..5b99fc09e327 100644 --- a/drivers/usb/serial/empeg.c +++ b/drivers/usb/serial/empeg.c | |||
@@ -56,7 +56,6 @@ static struct usb_driver empeg_driver = { | |||
56 | .probe = usb_serial_probe, | 56 | .probe = usb_serial_probe, |
57 | .disconnect = usb_serial_disconnect, | 57 | .disconnect = usb_serial_disconnect, |
58 | .id_table = id_table, | 58 | .id_table = id_table, |
59 | .no_dynamic_id = 1, | ||
60 | }; | 59 | }; |
61 | 60 | ||
62 | static struct usb_serial_driver empeg_device = { | 61 | static struct usb_serial_driver empeg_device = { |
@@ -65,7 +64,6 @@ static struct usb_serial_driver empeg_device = { | |||
65 | .name = "empeg", | 64 | .name = "empeg", |
66 | }, | 65 | }, |
67 | .id_table = id_table, | 66 | .id_table = id_table, |
68 | .usb_driver = &empeg_driver, | ||
69 | .num_ports = 1, | 67 | .num_ports = 1, |
70 | .bulk_out_size = 256, | 68 | .bulk_out_size = 256, |
71 | .throttle = usb_serial_generic_throttle, | 69 | .throttle = usb_serial_generic_throttle, |
@@ -74,6 +72,10 @@ static struct usb_serial_driver empeg_device = { | |||
74 | .init_termios = empeg_init_termios, | 72 | .init_termios = empeg_init_termios, |
75 | }; | 73 | }; |
76 | 74 | ||
75 | static struct usb_serial_driver * const serial_drivers[] = { | ||
76 | &empeg_device, NULL | ||
77 | }; | ||
78 | |||
77 | static int empeg_startup(struct usb_serial *serial) | 79 | static int empeg_startup(struct usb_serial *serial) |
78 | { | 80 | { |
79 | int r; | 81 | int r; |
@@ -136,33 +138,7 @@ static void empeg_init_termios(struct tty_struct *tty) | |||
136 | tty_encode_baud_rate(tty, 115200, 115200); | 138 | tty_encode_baud_rate(tty, 115200, 115200); |
137 | } | 139 | } |
138 | 140 | ||
139 | static int __init empeg_init(void) | 141 | module_usb_serial_driver(empeg_driver, serial_drivers); |
140 | { | ||
141 | int retval; | ||
142 | |||
143 | retval = usb_serial_register(&empeg_device); | ||
144 | if (retval) | ||
145 | return retval; | ||
146 | retval = usb_register(&empeg_driver); | ||
147 | if (retval) { | ||
148 | usb_serial_deregister(&empeg_device); | ||
149 | return retval; | ||
150 | } | ||
151 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
152 | DRIVER_DESC "\n"); | ||
153 | |||
154 | return 0; | ||
155 | } | ||
156 | |||
157 | static void __exit empeg_exit(void) | ||
158 | { | ||
159 | usb_deregister(&empeg_driver); | ||
160 | usb_serial_deregister(&empeg_device); | ||
161 | } | ||
162 | |||
163 | |||
164 | module_init(empeg_init); | ||
165 | module_exit(empeg_exit); | ||
166 | 142 | ||
167 | MODULE_AUTHOR(DRIVER_AUTHOR); | 143 | MODULE_AUTHOR(DRIVER_AUTHOR); |
168 | MODULE_DESCRIPTION(DRIVER_DESC); | 144 | MODULE_DESCRIPTION(DRIVER_DESC); |
diff --git a/drivers/usb/serial/f81232.c b/drivers/usb/serial/f81232.c new file mode 100644 index 000000000000..88c0b1963920 --- /dev/null +++ b/drivers/usb/serial/f81232.c | |||
@@ -0,0 +1,405 @@ | |||
1 | /* | ||
2 | * Fintek F81232 USB to serial adaptor driver | ||
3 | * | ||
4 | * Copyright (C) 2012 Greg Kroah-Hartman (gregkh@linuxfoundation.org) | ||
5 | * Copyright (C) 2012 Linux Foundation | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License version 2 as published by | ||
9 | * the Free Software Foundation. | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/errno.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/slab.h> | ||
17 | #include <linux/tty.h> | ||
18 | #include <linux/tty_driver.h> | ||
19 | #include <linux/tty_flip.h> | ||
20 | #include <linux/serial.h> | ||
21 | #include <linux/module.h> | ||
22 | #include <linux/moduleparam.h> | ||
23 | #include <linux/spinlock.h> | ||
24 | #include <linux/uaccess.h> | ||
25 | #include <linux/usb.h> | ||
26 | #include <linux/usb/serial.h> | ||
27 | |||
28 | static bool debug; | ||
29 | |||
30 | static const struct usb_device_id id_table[] = { | ||
31 | { USB_DEVICE(0x1934, 0x0706) }, | ||
32 | { } /* Terminating entry */ | ||
33 | }; | ||
34 | MODULE_DEVICE_TABLE(usb, id_table); | ||
35 | |||
36 | #define CONTROL_DTR 0x01 | ||
37 | #define CONTROL_RTS 0x02 | ||
38 | |||
39 | #define UART_STATE 0x08 | ||
40 | #define UART_STATE_TRANSIENT_MASK 0x74 | ||
41 | #define UART_DCD 0x01 | ||
42 | #define UART_DSR 0x02 | ||
43 | #define UART_BREAK_ERROR 0x04 | ||
44 | #define UART_RING 0x08 | ||
45 | #define UART_FRAME_ERROR 0x10 | ||
46 | #define UART_PARITY_ERROR 0x20 | ||
47 | #define UART_OVERRUN_ERROR 0x40 | ||
48 | #define UART_CTS 0x80 | ||
49 | |||
50 | struct f81232_private { | ||
51 | spinlock_t lock; | ||
52 | wait_queue_head_t delta_msr_wait; | ||
53 | u8 line_control; | ||
54 | u8 line_status; | ||
55 | }; | ||
56 | |||
57 | static void f81232_update_line_status(struct usb_serial_port *port, | ||
58 | unsigned char *data, | ||
59 | unsigned int actual_length) | ||
60 | { | ||
61 | } | ||
62 | |||
63 | static void f81232_read_int_callback(struct urb *urb) | ||
64 | { | ||
65 | struct usb_serial_port *port = urb->context; | ||
66 | unsigned char *data = urb->transfer_buffer; | ||
67 | unsigned int actual_length = urb->actual_length; | ||
68 | int status = urb->status; | ||
69 | int retval; | ||
70 | |||
71 | dbg("%s (%d)", __func__, port->number); | ||
72 | |||
73 | switch (status) { | ||
74 | case 0: | ||
75 | /* success */ | ||
76 | break; | ||
77 | case -ECONNRESET: | ||
78 | case -ENOENT: | ||
79 | case -ESHUTDOWN: | ||
80 | /* this urb is terminated, clean up */ | ||
81 | dbg("%s - urb shutting down with status: %d", __func__, | ||
82 | status); | ||
83 | return; | ||
84 | default: | ||
85 | dbg("%s - nonzero urb status received: %d", __func__, | ||
86 | status); | ||
87 | goto exit; | ||
88 | } | ||
89 | |||
90 | usb_serial_debug_data(debug, &port->dev, __func__, | ||
91 | urb->actual_length, urb->transfer_buffer); | ||
92 | |||
93 | f81232_update_line_status(port, data, actual_length); | ||
94 | |||
95 | exit: | ||
96 | retval = usb_submit_urb(urb, GFP_ATOMIC); | ||
97 | if (retval) | ||
98 | dev_err(&urb->dev->dev, | ||
99 | "%s - usb_submit_urb failed with result %d\n", | ||
100 | __func__, retval); | ||
101 | } | ||
102 | |||
103 | static void f81232_process_read_urb(struct urb *urb) | ||
104 | { | ||
105 | struct usb_serial_port *port = urb->context; | ||
106 | struct f81232_private *priv = usb_get_serial_port_data(port); | ||
107 | struct tty_struct *tty; | ||
108 | unsigned char *data = urb->transfer_buffer; | ||
109 | char tty_flag = TTY_NORMAL; | ||
110 | unsigned long flags; | ||
111 | u8 line_status; | ||
112 | int i; | ||
113 | |||
114 | /* update line status */ | ||
115 | spin_lock_irqsave(&priv->lock, flags); | ||
116 | line_status = priv->line_status; | ||
117 | priv->line_status &= ~UART_STATE_TRANSIENT_MASK; | ||
118 | spin_unlock_irqrestore(&priv->lock, flags); | ||
119 | wake_up_interruptible(&priv->delta_msr_wait); | ||
120 | |||
121 | if (!urb->actual_length) | ||
122 | return; | ||
123 | |||
124 | tty = tty_port_tty_get(&port->port); | ||
125 | if (!tty) | ||
126 | return; | ||
127 | |||
128 | /* break takes precedence over parity, */ | ||
129 | /* which takes precedence over framing errors */ | ||
130 | if (line_status & UART_BREAK_ERROR) | ||
131 | tty_flag = TTY_BREAK; | ||
132 | else if (line_status & UART_PARITY_ERROR) | ||
133 | tty_flag = TTY_PARITY; | ||
134 | else if (line_status & UART_FRAME_ERROR) | ||
135 | tty_flag = TTY_FRAME; | ||
136 | dbg("%s - tty_flag = %d", __func__, tty_flag); | ||
137 | |||
138 | /* overrun is special, not associated with a char */ | ||
139 | if (line_status & UART_OVERRUN_ERROR) | ||
140 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); | ||
141 | |||
142 | if (port->port.console && port->sysrq) { | ||
143 | for (i = 0; i < urb->actual_length; ++i) | ||
144 | if (!usb_serial_handle_sysrq_char(port, data[i])) | ||
145 | tty_insert_flip_char(tty, data[i], tty_flag); | ||
146 | } else { | ||
147 | tty_insert_flip_string_fixed_flag(tty, data, tty_flag, | ||
148 | urb->actual_length); | ||
149 | } | ||
150 | |||
151 | tty_flip_buffer_push(tty); | ||
152 | tty_kref_put(tty); | ||
153 | } | ||
154 | |||
155 | static int set_control_lines(struct usb_device *dev, u8 value) | ||
156 | { | ||
157 | /* FIXME - Stubbed out for now */ | ||
158 | return 0; | ||
159 | } | ||
160 | |||
161 | static void f81232_break_ctl(struct tty_struct *tty, int break_state) | ||
162 | { | ||
163 | /* FIXME - Stubbed out for now */ | ||
164 | |||
165 | /* | ||
166 | * break_state = -1 to turn on break, and 0 to turn off break | ||
167 | * see drivers/char/tty_io.c to see it used. | ||
168 | * last_set_data_urb_value NEVER has the break bit set in it. | ||
169 | */ | ||
170 | } | ||
171 | |||
172 | static void f81232_set_termios(struct tty_struct *tty, | ||
173 | struct usb_serial_port *port, struct ktermios *old_termios) | ||
174 | { | ||
175 | /* FIXME - Stubbed out for now */ | ||
176 | |||
177 | /* Don't change anything if nothing has changed */ | ||
178 | if (!tty_termios_hw_change(tty->termios, old_termios)) | ||
179 | return; | ||
180 | |||
181 | /* Do the real work here... */ | ||
182 | } | ||
183 | |||
184 | static int f81232_tiocmget(struct tty_struct *tty) | ||
185 | { | ||
186 | /* FIXME - Stubbed out for now */ | ||
187 | return 0; | ||
188 | } | ||
189 | |||
190 | static int f81232_tiocmset(struct tty_struct *tty, | ||
191 | unsigned int set, unsigned int clear) | ||
192 | { | ||
193 | /* FIXME - Stubbed out for now */ | ||
194 | return 0; | ||
195 | } | ||
196 | |||
197 | static int f81232_open(struct tty_struct *tty, struct usb_serial_port *port) | ||
198 | { | ||
199 | struct ktermios tmp_termios; | ||
200 | int result; | ||
201 | |||
202 | /* Setup termios */ | ||
203 | if (tty) | ||
204 | f81232_set_termios(tty, port, &tmp_termios); | ||
205 | |||
206 | dbg("%s - submitting interrupt urb", __func__); | ||
207 | result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); | ||
208 | if (result) { | ||
209 | dev_err(&port->dev, "%s - failed submitting interrupt urb," | ||
210 | " error %d\n", __func__, result); | ||
211 | return result; | ||
212 | } | ||
213 | |||
214 | result = usb_serial_generic_open(tty, port); | ||
215 | if (result) { | ||
216 | usb_kill_urb(port->interrupt_in_urb); | ||
217 | return result; | ||
218 | } | ||
219 | |||
220 | port->port.drain_delay = 256; | ||
221 | return 0; | ||
222 | } | ||
223 | |||
224 | static void f81232_close(struct usb_serial_port *port) | ||
225 | { | ||
226 | usb_serial_generic_close(port); | ||
227 | usb_kill_urb(port->interrupt_in_urb); | ||
228 | } | ||
229 | |||
230 | static void f81232_dtr_rts(struct usb_serial_port *port, int on) | ||
231 | { | ||
232 | struct f81232_private *priv = usb_get_serial_port_data(port); | ||
233 | unsigned long flags; | ||
234 | u8 control; | ||
235 | |||
236 | spin_lock_irqsave(&priv->lock, flags); | ||
237 | /* Change DTR and RTS */ | ||
238 | if (on) | ||
239 | priv->line_control |= (CONTROL_DTR | CONTROL_RTS); | ||
240 | else | ||
241 | priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS); | ||
242 | control = priv->line_control; | ||
243 | spin_unlock_irqrestore(&priv->lock, flags); | ||
244 | set_control_lines(port->serial->dev, control); | ||
245 | } | ||
246 | |||
247 | static int f81232_carrier_raised(struct usb_serial_port *port) | ||
248 | { | ||
249 | struct f81232_private *priv = usb_get_serial_port_data(port); | ||
250 | if (priv->line_status & UART_DCD) | ||
251 | return 1; | ||
252 | return 0; | ||
253 | } | ||
254 | |||
255 | static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) | ||
256 | { | ||
257 | struct f81232_private *priv = usb_get_serial_port_data(port); | ||
258 | unsigned long flags; | ||
259 | unsigned int prevstatus; | ||
260 | unsigned int status; | ||
261 | unsigned int changed; | ||
262 | |||
263 | spin_lock_irqsave(&priv->lock, flags); | ||
264 | prevstatus = priv->line_status; | ||
265 | spin_unlock_irqrestore(&priv->lock, flags); | ||
266 | |||
267 | while (1) { | ||
268 | interruptible_sleep_on(&priv->delta_msr_wait); | ||
269 | /* see if a signal did it */ | ||
270 | if (signal_pending(current)) | ||
271 | return -ERESTARTSYS; | ||
272 | |||
273 | spin_lock_irqsave(&priv->lock, flags); | ||
274 | status = priv->line_status; | ||
275 | spin_unlock_irqrestore(&priv->lock, flags); | ||
276 | |||
277 | changed = prevstatus ^ status; | ||
278 | |||
279 | if (((arg & TIOCM_RNG) && (changed & UART_RING)) || | ||
280 | ((arg & TIOCM_DSR) && (changed & UART_DSR)) || | ||
281 | ((arg & TIOCM_CD) && (changed & UART_DCD)) || | ||
282 | ((arg & TIOCM_CTS) && (changed & UART_CTS))) { | ||
283 | return 0; | ||
284 | } | ||
285 | prevstatus = status; | ||
286 | } | ||
287 | /* NOTREACHED */ | ||
288 | return 0; | ||
289 | } | ||
290 | |||
291 | static int f81232_ioctl(struct tty_struct *tty, | ||
292 | unsigned int cmd, unsigned long arg) | ||
293 | { | ||
294 | struct serial_struct ser; | ||
295 | struct usb_serial_port *port = tty->driver_data; | ||
296 | dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd); | ||
297 | |||
298 | switch (cmd) { | ||
299 | case TIOCGSERIAL: | ||
300 | memset(&ser, 0, sizeof ser); | ||
301 | ser.type = PORT_16654; | ||
302 | ser.line = port->serial->minor; | ||
303 | ser.port = port->number; | ||
304 | ser.baud_base = 460800; | ||
305 | |||
306 | if (copy_to_user((void __user *)arg, &ser, sizeof ser)) | ||
307 | return -EFAULT; | ||
308 | |||
309 | return 0; | ||
310 | |||
311 | case TIOCMIWAIT: | ||
312 | dbg("%s (%d) TIOCMIWAIT", __func__, port->number); | ||
313 | return wait_modem_info(port, arg); | ||
314 | default: | ||
315 | dbg("%s not supported = 0x%04x", __func__, cmd); | ||
316 | break; | ||
317 | } | ||
318 | return -ENOIOCTLCMD; | ||
319 | } | ||
320 | |||
321 | static int f81232_startup(struct usb_serial *serial) | ||
322 | { | ||
323 | struct f81232_private *priv; | ||
324 | int i; | ||
325 | |||
326 | for (i = 0; i < serial->num_ports; ++i) { | ||
327 | priv = kzalloc(sizeof(struct f81232_private), GFP_KERNEL); | ||
328 | if (!priv) | ||
329 | goto cleanup; | ||
330 | spin_lock_init(&priv->lock); | ||
331 | init_waitqueue_head(&priv->delta_msr_wait); | ||
332 | usb_set_serial_port_data(serial->port[i], priv); | ||
333 | } | ||
334 | return 0; | ||
335 | |||
336 | cleanup: | ||
337 | for (--i; i >= 0; --i) { | ||
338 | priv = usb_get_serial_port_data(serial->port[i]); | ||
339 | kfree(priv); | ||
340 | usb_set_serial_port_data(serial->port[i], NULL); | ||
341 | } | ||
342 | return -ENOMEM; | ||
343 | } | ||
344 | |||
345 | static void f81232_release(struct usb_serial *serial) | ||
346 | { | ||
347 | int i; | ||
348 | struct f81232_private *priv; | ||
349 | |||
350 | for (i = 0; i < serial->num_ports; ++i) { | ||
351 | priv = usb_get_serial_port_data(serial->port[i]); | ||
352 | kfree(priv); | ||
353 | } | ||
354 | } | ||
355 | |||
356 | static struct usb_driver f81232_driver = { | ||
357 | .name = "f81232", | ||
358 | .probe = usb_serial_probe, | ||
359 | .disconnect = usb_serial_disconnect, | ||
360 | .id_table = id_table, | ||
361 | .suspend = usb_serial_suspend, | ||
362 | .resume = usb_serial_resume, | ||
363 | .no_dynamic_id = 1, | ||
364 | .supports_autosuspend = 1, | ||
365 | }; | ||
366 | |||
367 | static struct usb_serial_driver f81232_device = { | ||
368 | .driver = { | ||
369 | .owner = THIS_MODULE, | ||
370 | .name = "f81232", | ||
371 | }, | ||
372 | .id_table = id_table, | ||
373 | .usb_driver = &f81232_driver, | ||
374 | .num_ports = 1, | ||
375 | .bulk_in_size = 256, | ||
376 | .bulk_out_size = 256, | ||
377 | .open = f81232_open, | ||
378 | .close = f81232_close, | ||
379 | .dtr_rts = f81232_dtr_rts, | ||
380 | .carrier_raised = f81232_carrier_raised, | ||
381 | .ioctl = f81232_ioctl, | ||
382 | .break_ctl = f81232_break_ctl, | ||
383 | .set_termios = f81232_set_termios, | ||
384 | .tiocmget = f81232_tiocmget, | ||
385 | .tiocmset = f81232_tiocmset, | ||
386 | .process_read_urb = f81232_process_read_urb, | ||
387 | .read_int_callback = f81232_read_int_callback, | ||
388 | .attach = f81232_startup, | ||
389 | .release = f81232_release, | ||
390 | }; | ||
391 | |||
392 | static struct usb_serial_driver * const serial_drivers[] = { | ||
393 | &f81232_device, | ||
394 | NULL, | ||
395 | }; | ||
396 | |||
397 | module_usb_serial_driver(f81232_driver, serial_drivers); | ||
398 | |||
399 | MODULE_DESCRIPTION("Fintek F81232 USB to serial adaptor driver"); | ||
400 | MODULE_AUTHOR("Greg Kroah-Hartman <gregkh@linuxfoundation.org"); | ||
401 | MODULE_LICENSE("GPL v2"); | ||
402 | |||
403 | module_param(debug, bool, S_IRUGO | S_IWUSR); | ||
404 | MODULE_PARM_DESC(debug, "Debug enabled or not"); | ||
405 | |||
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index f770415305f8..7c229d304684 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -188,6 +188,7 @@ static struct usb_device_id id_table_combined [] = { | |||
188 | .driver_info = (kernel_ulong_t)&ftdi_8u2232c_quirk }, | 188 | .driver_info = (kernel_ulong_t)&ftdi_8u2232c_quirk }, |
189 | { USB_DEVICE(FTDI_VID, FTDI_4232H_PID) }, | 189 | { USB_DEVICE(FTDI_VID, FTDI_4232H_PID) }, |
190 | { USB_DEVICE(FTDI_VID, FTDI_232H_PID) }, | 190 | { USB_DEVICE(FTDI_VID, FTDI_232H_PID) }, |
191 | { USB_DEVICE(FTDI_VID, FTDI_FTX_PID) }, | ||
191 | { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, | 192 | { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, |
192 | { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, | 193 | { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, |
193 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) }, | 194 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) }, |
@@ -536,6 +537,10 @@ static struct usb_device_id id_table_combined [] = { | |||
536 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_6_PID) }, | 537 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_6_PID) }, |
537 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_7_PID) }, | 538 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_7_PID) }, |
538 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_8_PID) }, | 539 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_8_PID) }, |
540 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_1_PID) }, | ||
541 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_2_PID) }, | ||
542 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_3_PID) }, | ||
543 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_4_PID) }, | ||
539 | { USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) }, | 544 | { USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) }, |
540 | { USB_DEVICE(OCT_VID, OCT_US101_PID) }, | 545 | { USB_DEVICE(OCT_VID, OCT_US101_PID) }, |
541 | { USB_DEVICE(OCT_VID, OCT_DK201_PID) }, | 546 | { USB_DEVICE(OCT_VID, OCT_DK201_PID) }, |
@@ -797,7 +802,7 @@ static struct usb_device_id id_table_combined [] = { | |||
797 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 802 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
798 | { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID), | 803 | { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID), |
799 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 804 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
800 | { USB_DEVICE(HORNBY_VID, HORNBY_ELITE_PID) }, | 805 | { USB_DEVICE(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID) }, |
801 | { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) }, | 806 | { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) }, |
802 | { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID), | 807 | { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID), |
803 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 808 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
@@ -846,6 +851,9 @@ static struct usb_device_id id_table_combined [] = { | |||
846 | { USB_DEVICE(ST_VID, ST_STMCLT1030_PID), | 851 | { USB_DEVICE(ST_VID, ST_STMCLT1030_PID), |
847 | .driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk }, | 852 | .driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk }, |
848 | { USB_DEVICE(FTDI_VID, FTDI_RF_R106) }, | 853 | { USB_DEVICE(FTDI_VID, FTDI_RF_R106) }, |
854 | { USB_DEVICE(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID), | ||
855 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
856 | { USB_DEVICE(FTDI_VID, FTDI_LUMEL_PD12_PID) }, | ||
849 | { }, /* Optional parameter entry */ | 857 | { }, /* Optional parameter entry */ |
850 | { } /* Terminating entry */ | 858 | { } /* Terminating entry */ |
851 | }; | 859 | }; |
@@ -857,7 +865,6 @@ static struct usb_driver ftdi_driver = { | |||
857 | .probe = usb_serial_probe, | 865 | .probe = usb_serial_probe, |
858 | .disconnect = usb_serial_disconnect, | 866 | .disconnect = usb_serial_disconnect, |
859 | .id_table = id_table_combined, | 867 | .id_table = id_table_combined, |
860 | .no_dynamic_id = 1, | ||
861 | }; | 868 | }; |
862 | 869 | ||
863 | static const char *ftdi_chip_name[] = { | 870 | static const char *ftdi_chip_name[] = { |
@@ -868,7 +875,8 @@ static const char *ftdi_chip_name[] = { | |||
868 | [FT232RL] = "FT232RL", | 875 | [FT232RL] = "FT232RL", |
869 | [FT2232H] = "FT2232H", | 876 | [FT2232H] = "FT2232H", |
870 | [FT4232H] = "FT4232H", | 877 | [FT4232H] = "FT4232H", |
871 | [FT232H] = "FT232H" | 878 | [FT232H] = "FT232H", |
879 | [FTX] = "FT-X" | ||
872 | }; | 880 | }; |
873 | 881 | ||
874 | 882 | ||
@@ -915,7 +923,6 @@ static struct usb_serial_driver ftdi_sio_device = { | |||
915 | .name = "ftdi_sio", | 923 | .name = "ftdi_sio", |
916 | }, | 924 | }, |
917 | .description = "FTDI USB Serial Device", | 925 | .description = "FTDI USB Serial Device", |
918 | .usb_driver = &ftdi_driver, | ||
919 | .id_table = id_table_combined, | 926 | .id_table = id_table_combined, |
920 | .num_ports = 1, | 927 | .num_ports = 1, |
921 | .bulk_in_size = 512, | 928 | .bulk_in_size = 512, |
@@ -938,6 +945,10 @@ static struct usb_serial_driver ftdi_sio_device = { | |||
938 | .break_ctl = ftdi_break_ctl, | 945 | .break_ctl = ftdi_break_ctl, |
939 | }; | 946 | }; |
940 | 947 | ||
948 | static struct usb_serial_driver * const serial_drivers[] = { | ||
949 | &ftdi_sio_device, NULL | ||
950 | }; | ||
951 | |||
941 | 952 | ||
942 | #define WDR_TIMEOUT 5000 /* default urb timeout */ | 953 | #define WDR_TIMEOUT 5000 /* default urb timeout */ |
943 | #define WDR_SHORT_TIMEOUT 1000 /* shorter urb timeout */ | 954 | #define WDR_SHORT_TIMEOUT 1000 /* shorter urb timeout */ |
@@ -1169,7 +1180,8 @@ static __u32 get_ftdi_divisor(struct tty_struct *tty, | |||
1169 | break; | 1180 | break; |
1170 | case FT232BM: /* FT232BM chip */ | 1181 | case FT232BM: /* FT232BM chip */ |
1171 | case FT2232C: /* FT2232C chip */ | 1182 | case FT2232C: /* FT2232C chip */ |
1172 | case FT232RL: | 1183 | case FT232RL: /* FT232RL chip */ |
1184 | case FTX: /* FT-X series */ | ||
1173 | if (baud <= 3000000) { | 1185 | if (baud <= 3000000) { |
1174 | __u16 product_id = le16_to_cpu( | 1186 | __u16 product_id = le16_to_cpu( |
1175 | port->serial->dev->descriptor.idProduct); | 1187 | port->serial->dev->descriptor.idProduct); |
@@ -1458,10 +1470,14 @@ static void ftdi_determine_type(struct usb_serial_port *port) | |||
1458 | } else if (version < 0x900) { | 1470 | } else if (version < 0x900) { |
1459 | /* Assume it's an FT232RL */ | 1471 | /* Assume it's an FT232RL */ |
1460 | priv->chip_type = FT232RL; | 1472 | priv->chip_type = FT232RL; |
1461 | } else { | 1473 | } else if (version < 0x1000) { |
1462 | /* Assume it's an FT232H */ | 1474 | /* Assume it's an FT232H */ |
1463 | priv->chip_type = FT232H; | 1475 | priv->chip_type = FT232H; |
1476 | } else { | ||
1477 | /* Assume it's an FT-X series device */ | ||
1478 | priv->chip_type = FTX; | ||
1464 | } | 1479 | } |
1480 | |||
1465 | dev_info(&udev->dev, "Detected %s\n", ftdi_chip_name[priv->chip_type]); | 1481 | dev_info(&udev->dev, "Detected %s\n", ftdi_chip_name[priv->chip_type]); |
1466 | } | 1482 | } |
1467 | 1483 | ||
@@ -1589,7 +1605,8 @@ static int create_sysfs_attrs(struct usb_serial_port *port) | |||
1589 | priv->chip_type == FT232RL || | 1605 | priv->chip_type == FT232RL || |
1590 | priv->chip_type == FT2232H || | 1606 | priv->chip_type == FT2232H || |
1591 | priv->chip_type == FT4232H || | 1607 | priv->chip_type == FT4232H || |
1592 | priv->chip_type == FT232H)) { | 1608 | priv->chip_type == FT232H || |
1609 | priv->chip_type == FTX)) { | ||
1593 | retval = device_create_file(&port->dev, | 1610 | retval = device_create_file(&port->dev, |
1594 | &dev_attr_latency_timer); | 1611 | &dev_attr_latency_timer); |
1595 | } | 1612 | } |
@@ -1611,7 +1628,8 @@ static void remove_sysfs_attrs(struct usb_serial_port *port) | |||
1611 | priv->chip_type == FT232RL || | 1628 | priv->chip_type == FT232RL || |
1612 | priv->chip_type == FT2232H || | 1629 | priv->chip_type == FT2232H || |
1613 | priv->chip_type == FT4232H || | 1630 | priv->chip_type == FT4232H || |
1614 | priv->chip_type == FT232H) { | 1631 | priv->chip_type == FT232H || |
1632 | priv->chip_type == FTX) { | ||
1615 | device_remove_file(&port->dev, &dev_attr_latency_timer); | 1633 | device_remove_file(&port->dev, &dev_attr_latency_timer); |
1616 | } | 1634 | } |
1617 | } | 1635 | } |
@@ -1763,7 +1781,8 @@ static int ftdi_8u2232c_probe(struct usb_serial *serial) | |||
1763 | 1781 | ||
1764 | dbg("%s", __func__); | 1782 | dbg("%s", __func__); |
1765 | 1783 | ||
1766 | if (strcmp(udev->manufacturer, "CALAO Systems") == 0) | 1784 | if ((udev->manufacturer && !strcmp(udev->manufacturer, "CALAO Systems")) || |
1785 | (udev->product && !strcmp(udev->product, "BeagleBone/XDS100"))) | ||
1767 | return ftdi_jtag_probe(serial); | 1786 | return ftdi_jtag_probe(serial); |
1768 | 1787 | ||
1769 | return 0; | 1788 | return 0; |
@@ -2288,6 +2307,7 @@ static int ftdi_tiocmget(struct tty_struct *tty) | |||
2288 | case FT2232H: | 2307 | case FT2232H: |
2289 | case FT4232H: | 2308 | case FT4232H: |
2290 | case FT232H: | 2309 | case FT232H: |
2310 | case FTX: | ||
2291 | len = 2; | 2311 | len = 2; |
2292 | break; | 2312 | break; |
2293 | default: | 2313 | default: |
@@ -2420,19 +2440,10 @@ static int __init ftdi_init(void) | |||
2420 | id_table_combined[i].idVendor = vendor; | 2440 | id_table_combined[i].idVendor = vendor; |
2421 | id_table_combined[i].idProduct = product; | 2441 | id_table_combined[i].idProduct = product; |
2422 | } | 2442 | } |
2423 | retval = usb_serial_register(&ftdi_sio_device); | 2443 | retval = usb_serial_register_drivers(&ftdi_driver, serial_drivers); |
2424 | if (retval) | 2444 | if (retval == 0) |
2425 | goto failed_sio_register; | 2445 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" |
2426 | retval = usb_register(&ftdi_driver); | 2446 | DRIVER_DESC "\n"); |
2427 | if (retval) | ||
2428 | goto failed_usb_register; | ||
2429 | |||
2430 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
2431 | DRIVER_DESC "\n"); | ||
2432 | return 0; | ||
2433 | failed_usb_register: | ||
2434 | usb_serial_deregister(&ftdi_sio_device); | ||
2435 | failed_sio_register: | ||
2436 | return retval; | 2447 | return retval; |
2437 | } | 2448 | } |
2438 | 2449 | ||
@@ -2440,8 +2451,7 @@ static void __exit ftdi_exit(void) | |||
2440 | { | 2451 | { |
2441 | dbg("%s", __func__); | 2452 | dbg("%s", __func__); |
2442 | 2453 | ||
2443 | usb_deregister(&ftdi_driver); | 2454 | usb_serial_deregister_drivers(&ftdi_driver, serial_drivers); |
2444 | usb_serial_deregister(&ftdi_sio_device); | ||
2445 | } | 2455 | } |
2446 | 2456 | ||
2447 | 2457 | ||
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index 19584faa86f9..ed58c6fa8dbe 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h | |||
@@ -157,7 +157,8 @@ enum ftdi_chip_type { | |||
157 | FT232RL = 5, | 157 | FT232RL = 5, |
158 | FT2232H = 6, | 158 | FT2232H = 6, |
159 | FT4232H = 7, | 159 | FT4232H = 7, |
160 | FT232H = 8 | 160 | FT232H = 8, |
161 | FTX = 9, | ||
161 | }; | 162 | }; |
162 | 163 | ||
163 | enum ftdi_sio_baudrate { | 164 | enum ftdi_sio_baudrate { |
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index 6f6058f0db1b..0838baf892f3 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h | |||
@@ -23,12 +23,15 @@ | |||
23 | #define FTDI_8U2232C_PID 0x6010 /* Dual channel device */ | 23 | #define FTDI_8U2232C_PID 0x6010 /* Dual channel device */ |
24 | #define FTDI_4232H_PID 0x6011 /* Quad channel hi-speed device */ | 24 | #define FTDI_4232H_PID 0x6011 /* Quad channel hi-speed device */ |
25 | #define FTDI_232H_PID 0x6014 /* Single channel hi-speed device */ | 25 | #define FTDI_232H_PID 0x6014 /* Single channel hi-speed device */ |
26 | #define FTDI_FTX_PID 0x6015 /* FT-X series (FT201X, FT230X, FT231X, etc) */ | ||
26 | #define FTDI_SIO_PID 0x8372 /* Product Id SIO application of 8U100AX */ | 27 | #define FTDI_SIO_PID 0x8372 /* Product Id SIO application of 8U100AX */ |
27 | #define FTDI_232RL_PID 0xFBFA /* Product ID for FT232RL */ | 28 | #define FTDI_232RL_PID 0xFBFA /* Product ID for FT232RL */ |
28 | 29 | ||
29 | 30 | ||
30 | /*** third-party PIDs (using FTDI_VID) ***/ | 31 | /*** third-party PIDs (using FTDI_VID) ***/ |
31 | 32 | ||
33 | #define FTDI_LUMEL_PD12_PID 0x6002 | ||
34 | |||
32 | /* | 35 | /* |
33 | * Marvell OpenRD Base, Client | 36 | * Marvell OpenRD Base, Client |
34 | * http://www.open-rd.org | 37 | * http://www.open-rd.org |
@@ -97,6 +100,8 @@ | |||
97 | #define FTDI_TACTRIX_OPENPORT_13S_PID 0xCC49 /* OpenPort 1.3 Subaru */ | 100 | #define FTDI_TACTRIX_OPENPORT_13S_PID 0xCC49 /* OpenPort 1.3 Subaru */ |
98 | #define FTDI_TACTRIX_OPENPORT_13U_PID 0xCC4A /* OpenPort 1.3 Universal */ | 101 | #define FTDI_TACTRIX_OPENPORT_13U_PID 0xCC4A /* OpenPort 1.3 Universal */ |
99 | 102 | ||
103 | #define FTDI_DISTORTEC_JTAG_LOCK_PICK_PID 0xCFF8 | ||
104 | |||
100 | /* SCS HF Radio Modems PID's (http://www.scs-ptc.com) */ | 105 | /* SCS HF Radio Modems PID's (http://www.scs-ptc.com) */ |
101 | /* the VID is the standard ftdi vid (FTDI_VID) */ | 106 | /* the VID is the standard ftdi vid (FTDI_VID) */ |
102 | #define FTDI_SCS_DEVICE_0_PID 0xD010 /* SCS PTC-IIusb */ | 107 | #define FTDI_SCS_DEVICE_0_PID 0xD010 /* SCS PTC-IIusb */ |
@@ -532,10 +537,14 @@ | |||
532 | #define ADI_GNICEPLUS_PID 0xF001 | 537 | #define ADI_GNICEPLUS_PID 0xF001 |
533 | 538 | ||
534 | /* | 539 | /* |
535 | * Hornby Elite | 540 | * Microchip Technology, Inc. |
541 | * | ||
542 | * MICROCHIP_VID (0x04D8) and MICROCHIP_USB_BOARD_PID (0x000A) are also used by: | ||
543 | * Hornby Elite - Digital Command Control Console | ||
544 | * http://www.hornby.com/hornby-dcc/controllers/ | ||
536 | */ | 545 | */ |
537 | #define HORNBY_VID 0x04D8 | 546 | #define MICROCHIP_VID 0x04D8 |
538 | #define HORNBY_ELITE_PID 0x000A | 547 | #define MICROCHIP_USB_BOARD_PID 0x000A /* CDC RS-232 Emulation Demo */ |
539 | 548 | ||
540 | /* | 549 | /* |
541 | * RATOC REX-USB60F | 550 | * RATOC REX-USB60F |
@@ -680,6 +689,10 @@ | |||
680 | #define SEALEVEL_2803_6_PID 0X2863 /* SeaLINK+8 (2803) Port 6 */ | 689 | #define SEALEVEL_2803_6_PID 0X2863 /* SeaLINK+8 (2803) Port 6 */ |
681 | #define SEALEVEL_2803_7_PID 0X2873 /* SeaLINK+8 (2803) Port 7 */ | 690 | #define SEALEVEL_2803_7_PID 0X2873 /* SeaLINK+8 (2803) Port 7 */ |
682 | #define SEALEVEL_2803_8_PID 0X2883 /* SeaLINK+8 (2803) Port 8 */ | 691 | #define SEALEVEL_2803_8_PID 0X2883 /* SeaLINK+8 (2803) Port 8 */ |
692 | #define SEALEVEL_2803R_1_PID 0Xa02a /* SeaLINK+8 (2803-ROHS) Port 1+2 */ | ||
693 | #define SEALEVEL_2803R_2_PID 0Xa02b /* SeaLINK+8 (2803-ROHS) Port 3+4 */ | ||
694 | #define SEALEVEL_2803R_3_PID 0Xa02c /* SeaLINK+8 (2803-ROHS) Port 5+6 */ | ||
695 | #define SEALEVEL_2803R_4_PID 0Xa02d /* SeaLINK+8 (2803-ROHS) Port 7+8 */ | ||
683 | 696 | ||
684 | /* | 697 | /* |
685 | * JETI SPECTROMETER SPECBOS 1201 | 698 | * JETI SPECTROMETER SPECBOS 1201 |
diff --git a/drivers/usb/serial/funsoft.c b/drivers/usb/serial/funsoft.c index 5d4b099dcf8b..4577b3607922 100644 --- a/drivers/usb/serial/funsoft.c +++ b/drivers/usb/serial/funsoft.c | |||
@@ -29,7 +29,6 @@ static struct usb_driver funsoft_driver = { | |||
29 | .probe = usb_serial_probe, | 29 | .probe = usb_serial_probe, |
30 | .disconnect = usb_serial_disconnect, | 30 | .disconnect = usb_serial_disconnect, |
31 | .id_table = id_table, | 31 | .id_table = id_table, |
32 | .no_dynamic_id = 1, | ||
33 | }; | 32 | }; |
34 | 33 | ||
35 | static struct usb_serial_driver funsoft_device = { | 34 | static struct usb_serial_driver funsoft_device = { |
@@ -38,31 +37,15 @@ static struct usb_serial_driver funsoft_device = { | |||
38 | .name = "funsoft", | 37 | .name = "funsoft", |
39 | }, | 38 | }, |
40 | .id_table = id_table, | 39 | .id_table = id_table, |
41 | .usb_driver = &funsoft_driver, | ||
42 | .num_ports = 1, | 40 | .num_ports = 1, |
43 | }; | 41 | }; |
44 | 42 | ||
45 | static int __init funsoft_init(void) | 43 | static struct usb_serial_driver * const serial_drivers[] = { |
46 | { | 44 | &funsoft_device, NULL |
47 | int retval; | 45 | }; |
48 | |||
49 | retval = usb_serial_register(&funsoft_device); | ||
50 | if (retval) | ||
51 | return retval; | ||
52 | retval = usb_register(&funsoft_driver); | ||
53 | if (retval) | ||
54 | usb_serial_deregister(&funsoft_device); | ||
55 | return retval; | ||
56 | } | ||
57 | 46 | ||
58 | static void __exit funsoft_exit(void) | 47 | module_usb_serial_driver(funsoft_driver, serial_drivers); |
59 | { | ||
60 | usb_deregister(&funsoft_driver); | ||
61 | usb_serial_deregister(&funsoft_device); | ||
62 | } | ||
63 | 48 | ||
64 | module_init(funsoft_init); | ||
65 | module_exit(funsoft_exit); | ||
66 | MODULE_LICENSE("GPL"); | 49 | MODULE_LICENSE("GPL"); |
67 | 50 | ||
68 | module_param(debug, bool, S_IRUGO | S_IWUSR); | 51 | module_param(debug, bool, S_IRUGO | S_IWUSR); |
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c index 21343378c322..e8eb6347bf3a 100644 --- a/drivers/usb/serial/garmin_gps.c +++ b/drivers/usb/serial/garmin_gps.c | |||
@@ -224,7 +224,6 @@ static struct usb_driver garmin_driver = { | |||
224 | .probe = usb_serial_probe, | 224 | .probe = usb_serial_probe, |
225 | .disconnect = usb_serial_disconnect, | 225 | .disconnect = usb_serial_disconnect, |
226 | .id_table = id_table, | 226 | .id_table = id_table, |
227 | .no_dynamic_id = 1, | ||
228 | }; | 227 | }; |
229 | 228 | ||
230 | 229 | ||
@@ -1497,7 +1496,6 @@ static struct usb_serial_driver garmin_device = { | |||
1497 | .name = "garmin_gps", | 1496 | .name = "garmin_gps", |
1498 | }, | 1497 | }, |
1499 | .description = "Garmin GPS usb/tty", | 1498 | .description = "Garmin GPS usb/tty", |
1500 | .usb_driver = &garmin_driver, | ||
1501 | .id_table = id_table, | 1499 | .id_table = id_table, |
1502 | .num_ports = 1, | 1500 | .num_ports = 1, |
1503 | .open = garmin_open, | 1501 | .open = garmin_open, |
@@ -1514,40 +1512,11 @@ static struct usb_serial_driver garmin_device = { | |||
1514 | .read_int_callback = garmin_read_int_callback, | 1512 | .read_int_callback = garmin_read_int_callback, |
1515 | }; | 1513 | }; |
1516 | 1514 | ||
1515 | static struct usb_serial_driver * const serial_drivers[] = { | ||
1516 | &garmin_device, NULL | ||
1517 | }; | ||
1517 | 1518 | ||
1518 | 1519 | module_usb_serial_driver(garmin_driver, serial_drivers); | |
1519 | static int __init garmin_init(void) | ||
1520 | { | ||
1521 | int retval; | ||
1522 | |||
1523 | retval = usb_serial_register(&garmin_device); | ||
1524 | if (retval) | ||
1525 | goto failed_garmin_register; | ||
1526 | retval = usb_register(&garmin_driver); | ||
1527 | if (retval) | ||
1528 | goto failed_usb_register; | ||
1529 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
1530 | DRIVER_DESC "\n"); | ||
1531 | |||
1532 | return 0; | ||
1533 | failed_usb_register: | ||
1534 | usb_serial_deregister(&garmin_device); | ||
1535 | failed_garmin_register: | ||
1536 | return retval; | ||
1537 | } | ||
1538 | |||
1539 | |||
1540 | static void __exit garmin_exit(void) | ||
1541 | { | ||
1542 | usb_deregister(&garmin_driver); | ||
1543 | usb_serial_deregister(&garmin_device); | ||
1544 | } | ||
1545 | |||
1546 | |||
1547 | |||
1548 | |||
1549 | module_init(garmin_init); | ||
1550 | module_exit(garmin_exit); | ||
1551 | 1520 | ||
1552 | MODULE_AUTHOR(DRIVER_AUTHOR); | 1521 | MODULE_AUTHOR(DRIVER_AUTHOR); |
1553 | MODULE_DESCRIPTION(DRIVER_DESC); | 1522 | MODULE_DESCRIPTION(DRIVER_DESC); |
@@ -1557,4 +1526,3 @@ module_param(debug, bool, S_IWUSR | S_IRUGO); | |||
1557 | MODULE_PARM_DESC(debug, "Debug enabled or not"); | 1526 | MODULE_PARM_DESC(debug, "Debug enabled or not"); |
1558 | module_param(initial_mode, int, S_IRUGO); | 1527 | module_param(initial_mode, int, S_IRUGO); |
1559 | MODULE_PARM_DESC(initial_mode, "Initial mode"); | 1528 | MODULE_PARM_DESC(initial_mode, "Initial mode"); |
1560 | |||
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c index f7403576f99f..664deb63807c 100644 --- a/drivers/usb/serial/generic.c +++ b/drivers/usb/serial/generic.c | |||
@@ -54,7 +54,6 @@ static struct usb_driver generic_driver = { | |||
54 | .probe = generic_probe, | 54 | .probe = generic_probe, |
55 | .disconnect = usb_serial_disconnect, | 55 | .disconnect = usb_serial_disconnect, |
56 | .id_table = generic_serial_ids, | 56 | .id_table = generic_serial_ids, |
57 | .no_dynamic_id = 1, | ||
58 | }; | 57 | }; |
59 | 58 | ||
60 | /* All of the device info needed for the Generic Serial Converter */ | 59 | /* All of the device info needed for the Generic Serial Converter */ |
@@ -64,7 +63,6 @@ struct usb_serial_driver usb_serial_generic_device = { | |||
64 | .name = "generic", | 63 | .name = "generic", |
65 | }, | 64 | }, |
66 | .id_table = generic_device_ids, | 65 | .id_table = generic_device_ids, |
67 | .usb_driver = &generic_driver, | ||
68 | .num_ports = 1, | 66 | .num_ports = 1, |
69 | .disconnect = usb_serial_generic_disconnect, | 67 | .disconnect = usb_serial_generic_disconnect, |
70 | .release = usb_serial_generic_release, | 68 | .release = usb_serial_generic_release, |
@@ -73,6 +71,10 @@ struct usb_serial_driver usb_serial_generic_device = { | |||
73 | .resume = usb_serial_generic_resume, | 71 | .resume = usb_serial_generic_resume, |
74 | }; | 72 | }; |
75 | 73 | ||
74 | static struct usb_serial_driver * const serial_drivers[] = { | ||
75 | &usb_serial_generic_device, NULL | ||
76 | }; | ||
77 | |||
76 | static int generic_probe(struct usb_interface *interface, | 78 | static int generic_probe(struct usb_interface *interface, |
77 | const struct usb_device_id *id) | 79 | const struct usb_device_id *id) |
78 | { | 80 | { |
@@ -97,13 +99,7 @@ int usb_serial_generic_register(int _debug) | |||
97 | USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT; | 99 | USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT; |
98 | 100 | ||
99 | /* register our generic driver with ourselves */ | 101 | /* register our generic driver with ourselves */ |
100 | retval = usb_serial_register(&usb_serial_generic_device); | 102 | retval = usb_serial_register_drivers(&generic_driver, serial_drivers); |
101 | if (retval) | ||
102 | goto exit; | ||
103 | retval = usb_register(&generic_driver); | ||
104 | if (retval) | ||
105 | usb_serial_deregister(&usb_serial_generic_device); | ||
106 | exit: | ||
107 | #endif | 103 | #endif |
108 | return retval; | 104 | return retval; |
109 | } | 105 | } |
@@ -112,8 +108,7 @@ void usb_serial_generic_deregister(void) | |||
112 | { | 108 | { |
113 | #ifdef CONFIG_USB_SERIAL_GENERIC | 109 | #ifdef CONFIG_USB_SERIAL_GENERIC |
114 | /* remove our generic driver */ | 110 | /* remove our generic driver */ |
115 | usb_deregister(&generic_driver); | 111 | usb_serial_deregister_drivers(&generic_driver, serial_drivers); |
116 | usb_serial_deregister(&usb_serial_generic_device); | ||
117 | #endif | 112 | #endif |
118 | } | 113 | } |
119 | 114 | ||
@@ -217,7 +212,7 @@ retry: | |||
217 | clear_bit(i, &port->write_urbs_free); | 212 | clear_bit(i, &port->write_urbs_free); |
218 | result = usb_submit_urb(urb, GFP_ATOMIC); | 213 | result = usb_submit_urb(urb, GFP_ATOMIC); |
219 | if (result) { | 214 | if (result) { |
220 | dev_err(&port->dev, "%s - error submitting urb: %d\n", | 215 | dev_err_console(port, "%s - error submitting urb: %d\n", |
221 | __func__, result); | 216 | __func__, result); |
222 | set_bit(i, &port->write_urbs_free); | 217 | set_bit(i, &port->write_urbs_free); |
223 | spin_lock_irqsave(&port->lock, flags); | 218 | spin_lock_irqsave(&port->lock, flags); |
diff --git a/drivers/usb/serial/hp4x.c b/drivers/usb/serial/hp4x.c index 809379159b0e..2563e788c9b3 100644 --- a/drivers/usb/serial/hp4x.c +++ b/drivers/usb/serial/hp4x.c | |||
@@ -41,7 +41,6 @@ static struct usb_driver hp49gp_driver = { | |||
41 | .probe = usb_serial_probe, | 41 | .probe = usb_serial_probe, |
42 | .disconnect = usb_serial_disconnect, | 42 | .disconnect = usb_serial_disconnect, |
43 | .id_table = id_table, | 43 | .id_table = id_table, |
44 | .no_dynamic_id = 1, | ||
45 | }; | 44 | }; |
46 | 45 | ||
47 | static struct usb_serial_driver hp49gp_device = { | 46 | static struct usb_serial_driver hp49gp_device = { |
@@ -50,36 +49,14 @@ static struct usb_serial_driver hp49gp_device = { | |||
50 | .name = "hp4X", | 49 | .name = "hp4X", |
51 | }, | 50 | }, |
52 | .id_table = id_table, | 51 | .id_table = id_table, |
53 | .usb_driver = &hp49gp_driver, | ||
54 | .num_ports = 1, | 52 | .num_ports = 1, |
55 | }; | 53 | }; |
56 | 54 | ||
57 | static int __init hp49gp_init(void) | 55 | static struct usb_serial_driver * const serial_drivers[] = { |
58 | { | 56 | &hp49gp_device, NULL |
59 | int retval; | 57 | }; |
60 | retval = usb_serial_register(&hp49gp_device); | ||
61 | if (retval) | ||
62 | goto failed_usb_serial_register; | ||
63 | retval = usb_register(&hp49gp_driver); | ||
64 | if (retval) | ||
65 | goto failed_usb_register; | ||
66 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
67 | DRIVER_DESC "\n"); | ||
68 | return 0; | ||
69 | failed_usb_register: | ||
70 | usb_serial_deregister(&hp49gp_device); | ||
71 | failed_usb_serial_register: | ||
72 | return retval; | ||
73 | } | ||
74 | |||
75 | static void __exit hp49gp_exit(void) | ||
76 | { | ||
77 | usb_deregister(&hp49gp_driver); | ||
78 | usb_serial_deregister(&hp49gp_device); | ||
79 | } | ||
80 | 58 | ||
81 | module_init(hp49gp_init); | 59 | module_usb_serial_driver(hp49gp_driver, serial_drivers); |
82 | module_exit(hp49gp_exit); | ||
83 | 60 | ||
84 | MODULE_DESCRIPTION(DRIVER_DESC); | 61 | MODULE_DESCRIPTION(DRIVER_DESC); |
85 | MODULE_VERSION(DRIVER_VERSION); | 62 | MODULE_VERSION(DRIVER_VERSION); |
diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c index 0497575e4799..323e87235711 100644 --- a/drivers/usb/serial/io_edgeport.c +++ b/drivers/usb/serial/io_edgeport.c | |||
@@ -193,7 +193,8 @@ static const struct divisor_table_entry divisor_table[] = { | |||
193 | /* local variables */ | 193 | /* local variables */ |
194 | static bool debug; | 194 | static bool debug; |
195 | 195 | ||
196 | static atomic_t CmdUrbs; /* Number of outstanding Command Write Urbs */ | 196 | /* Number of outstanding Command Write Urbs */ |
197 | static atomic_t CmdUrbs = ATOMIC_INIT(0); | ||
197 | 198 | ||
198 | 199 | ||
199 | /* local function prototypes */ | 200 | /* local function prototypes */ |
@@ -1286,7 +1287,7 @@ static void send_more_port_data(struct edgeport_serial *edge_serial, | |||
1286 | count = fifo->count; | 1287 | count = fifo->count; |
1287 | buffer = kmalloc(count+2, GFP_ATOMIC); | 1288 | buffer = kmalloc(count+2, GFP_ATOMIC); |
1288 | if (buffer == NULL) { | 1289 | if (buffer == NULL) { |
1289 | dev_err(&edge_port->port->dev, | 1290 | dev_err_console(edge_port->port, |
1290 | "%s - no more kernel memory...\n", __func__); | 1291 | "%s - no more kernel memory...\n", __func__); |
1291 | edge_port->write_in_progress = false; | 1292 | edge_port->write_in_progress = false; |
1292 | goto exit_send; | 1293 | goto exit_send; |
@@ -1331,7 +1332,7 @@ static void send_more_port_data(struct edgeport_serial *edge_serial, | |||
1331 | status = usb_submit_urb(urb, GFP_ATOMIC); | 1332 | status = usb_submit_urb(urb, GFP_ATOMIC); |
1332 | if (status) { | 1333 | if (status) { |
1333 | /* something went wrong */ | 1334 | /* something went wrong */ |
1334 | dev_err(&edge_port->port->dev, | 1335 | dev_err_console(edge_port->port, |
1335 | "%s - usb_submit_urb(write bulk) failed, status = %d, data lost\n", | 1336 | "%s - usb_submit_urb(write bulk) failed, status = %d, data lost\n", |
1336 | __func__, status); | 1337 | __func__, status); |
1337 | edge_port->write_in_progress = false; | 1338 | edge_port->write_in_progress = false; |
@@ -3180,65 +3181,8 @@ static void edge_release(struct usb_serial *serial) | |||
3180 | kfree(edge_serial); | 3181 | kfree(edge_serial); |
3181 | } | 3182 | } |
3182 | 3183 | ||
3184 | module_usb_serial_driver(io_driver, serial_drivers); | ||
3183 | 3185 | ||
3184 | /**************************************************************************** | ||
3185 | * edgeport_init | ||
3186 | * This is called by the module subsystem, or on startup to initialize us | ||
3187 | ****************************************************************************/ | ||
3188 | static int __init edgeport_init(void) | ||
3189 | { | ||
3190 | int retval; | ||
3191 | |||
3192 | retval = usb_serial_register(&edgeport_2port_device); | ||
3193 | if (retval) | ||
3194 | goto failed_2port_device_register; | ||
3195 | retval = usb_serial_register(&edgeport_4port_device); | ||
3196 | if (retval) | ||
3197 | goto failed_4port_device_register; | ||
3198 | retval = usb_serial_register(&edgeport_8port_device); | ||
3199 | if (retval) | ||
3200 | goto failed_8port_device_register; | ||
3201 | retval = usb_serial_register(&epic_device); | ||
3202 | if (retval) | ||
3203 | goto failed_epic_device_register; | ||
3204 | retval = usb_register(&io_driver); | ||
3205 | if (retval) | ||
3206 | goto failed_usb_register; | ||
3207 | atomic_set(&CmdUrbs, 0); | ||
3208 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
3209 | DRIVER_DESC "\n"); | ||
3210 | return 0; | ||
3211 | |||
3212 | failed_usb_register: | ||
3213 | usb_serial_deregister(&epic_device); | ||
3214 | failed_epic_device_register: | ||
3215 | usb_serial_deregister(&edgeport_8port_device); | ||
3216 | failed_8port_device_register: | ||
3217 | usb_serial_deregister(&edgeport_4port_device); | ||
3218 | failed_4port_device_register: | ||
3219 | usb_serial_deregister(&edgeport_2port_device); | ||
3220 | failed_2port_device_register: | ||
3221 | return retval; | ||
3222 | } | ||
3223 | |||
3224 | |||
3225 | /**************************************************************************** | ||
3226 | * edgeport_exit | ||
3227 | * Called when the driver is about to be unloaded. | ||
3228 | ****************************************************************************/ | ||
3229 | static void __exit edgeport_exit (void) | ||
3230 | { | ||
3231 | usb_deregister(&io_driver); | ||
3232 | usb_serial_deregister(&edgeport_2port_device); | ||
3233 | usb_serial_deregister(&edgeport_4port_device); | ||
3234 | usb_serial_deregister(&edgeport_8port_device); | ||
3235 | usb_serial_deregister(&epic_device); | ||
3236 | } | ||
3237 | |||
3238 | module_init(edgeport_init); | ||
3239 | module_exit(edgeport_exit); | ||
3240 | |||
3241 | /* Module information */ | ||
3242 | MODULE_AUTHOR(DRIVER_AUTHOR); | 3186 | MODULE_AUTHOR(DRIVER_AUTHOR); |
3243 | MODULE_DESCRIPTION(DRIVER_DESC); | 3187 | MODULE_DESCRIPTION(DRIVER_DESC); |
3244 | MODULE_LICENSE("GPL"); | 3188 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/serial/io_tables.h b/drivers/usb/serial/io_tables.h index 178b22eb32b1..d0e7c9affb6f 100644 --- a/drivers/usb/serial/io_tables.h +++ b/drivers/usb/serial/io_tables.h | |||
@@ -100,7 +100,6 @@ static struct usb_driver io_driver = { | |||
100 | .probe = usb_serial_probe, | 100 | .probe = usb_serial_probe, |
101 | .disconnect = usb_serial_disconnect, | 101 | .disconnect = usb_serial_disconnect, |
102 | .id_table = id_table_combined, | 102 | .id_table = id_table_combined, |
103 | .no_dynamic_id = 1, | ||
104 | }; | 103 | }; |
105 | 104 | ||
106 | static struct usb_serial_driver edgeport_2port_device = { | 105 | static struct usb_serial_driver edgeport_2port_device = { |
@@ -109,7 +108,6 @@ static struct usb_serial_driver edgeport_2port_device = { | |||
109 | .name = "edgeport_2", | 108 | .name = "edgeport_2", |
110 | }, | 109 | }, |
111 | .description = "Edgeport 2 port adapter", | 110 | .description = "Edgeport 2 port adapter", |
112 | .usb_driver = &io_driver, | ||
113 | .id_table = edgeport_2port_id_table, | 111 | .id_table = edgeport_2port_id_table, |
114 | .num_ports = 2, | 112 | .num_ports = 2, |
115 | .open = edge_open, | 113 | .open = edge_open, |
@@ -139,7 +137,6 @@ static struct usb_serial_driver edgeport_4port_device = { | |||
139 | .name = "edgeport_4", | 137 | .name = "edgeport_4", |
140 | }, | 138 | }, |
141 | .description = "Edgeport 4 port adapter", | 139 | .description = "Edgeport 4 port adapter", |
142 | .usb_driver = &io_driver, | ||
143 | .id_table = edgeport_4port_id_table, | 140 | .id_table = edgeport_4port_id_table, |
144 | .num_ports = 4, | 141 | .num_ports = 4, |
145 | .open = edge_open, | 142 | .open = edge_open, |
@@ -169,7 +166,6 @@ static struct usb_serial_driver edgeport_8port_device = { | |||
169 | .name = "edgeport_8", | 166 | .name = "edgeport_8", |
170 | }, | 167 | }, |
171 | .description = "Edgeport 8 port adapter", | 168 | .description = "Edgeport 8 port adapter", |
172 | .usb_driver = &io_driver, | ||
173 | .id_table = edgeport_8port_id_table, | 169 | .id_table = edgeport_8port_id_table, |
174 | .num_ports = 8, | 170 | .num_ports = 8, |
175 | .open = edge_open, | 171 | .open = edge_open, |
@@ -199,7 +195,6 @@ static struct usb_serial_driver epic_device = { | |||
199 | .name = "epic", | 195 | .name = "epic", |
200 | }, | 196 | }, |
201 | .description = "EPiC device", | 197 | .description = "EPiC device", |
202 | .usb_driver = &io_driver, | ||
203 | .id_table = Epic_port_id_table, | 198 | .id_table = Epic_port_id_table, |
204 | .num_ports = 1, | 199 | .num_ports = 1, |
205 | .open = edge_open, | 200 | .open = edge_open, |
@@ -223,5 +218,10 @@ static struct usb_serial_driver epic_device = { | |||
223 | .write_bulk_callback = edge_bulk_out_data_callback, | 218 | .write_bulk_callback = edge_bulk_out_data_callback, |
224 | }; | 219 | }; |
225 | 220 | ||
221 | static struct usb_serial_driver * const serial_drivers[] = { | ||
222 | &edgeport_2port_device, &edgeport_4port_device, | ||
223 | &edgeport_8port_device, &epic_device, NULL | ||
224 | }; | ||
225 | |||
226 | #endif | 226 | #endif |
227 | 227 | ||
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c index 5818bfc3261e..40a95a7fe383 100644 --- a/drivers/usb/serial/io_ti.c +++ b/drivers/usb/serial/io_ti.c | |||
@@ -202,7 +202,6 @@ static struct usb_driver io_driver = { | |||
202 | .probe = usb_serial_probe, | 202 | .probe = usb_serial_probe, |
203 | .disconnect = usb_serial_disconnect, | 203 | .disconnect = usb_serial_disconnect, |
204 | .id_table = id_table_combined, | 204 | .id_table = id_table_combined, |
205 | .no_dynamic_id = 1, | ||
206 | }; | 205 | }; |
207 | 206 | ||
208 | 207 | ||
@@ -1817,7 +1816,7 @@ static void edge_bulk_out_callback(struct urb *urb) | |||
1817 | __func__, status); | 1816 | __func__, status); |
1818 | return; | 1817 | return; |
1819 | default: | 1818 | default: |
1820 | dev_err(&urb->dev->dev, "%s - nonzero write bulk status " | 1819 | dev_err_console(port, "%s - nonzero write bulk status " |
1821 | "received: %d\n", __func__, status); | 1820 | "received: %d\n", __func__, status); |
1822 | } | 1821 | } |
1823 | 1822 | ||
@@ -2111,7 +2110,7 @@ static void edge_send(struct tty_struct *tty) | |||
2111 | /* send the data out the bulk port */ | 2110 | /* send the data out the bulk port */ |
2112 | result = usb_submit_urb(port->write_urb, GFP_ATOMIC); | 2111 | result = usb_submit_urb(port->write_urb, GFP_ATOMIC); |
2113 | if (result) { | 2112 | if (result) { |
2114 | dev_err(&port->dev, | 2113 | dev_err_console(port, |
2115 | "%s - failed submitting write urb, error %d\n", | 2114 | "%s - failed submitting write urb, error %d\n", |
2116 | __func__, result); | 2115 | __func__, result); |
2117 | edge_port->ep_write_urb_in_use = 0; | 2116 | edge_port->ep_write_urb_in_use = 0; |
@@ -2725,7 +2724,6 @@ static struct usb_serial_driver edgeport_1port_device = { | |||
2725 | .name = "edgeport_ti_1", | 2724 | .name = "edgeport_ti_1", |
2726 | }, | 2725 | }, |
2727 | .description = "Edgeport TI 1 port adapter", | 2726 | .description = "Edgeport TI 1 port adapter", |
2728 | .usb_driver = &io_driver, | ||
2729 | .id_table = edgeport_1port_id_table, | 2727 | .id_table = edgeport_1port_id_table, |
2730 | .num_ports = 1, | 2728 | .num_ports = 1, |
2731 | .open = edge_open, | 2729 | .open = edge_open, |
@@ -2757,7 +2755,6 @@ static struct usb_serial_driver edgeport_2port_device = { | |||
2757 | .name = "edgeport_ti_2", | 2755 | .name = "edgeport_ti_2", |
2758 | }, | 2756 | }, |
2759 | .description = "Edgeport TI 2 port adapter", | 2757 | .description = "Edgeport TI 2 port adapter", |
2760 | .usb_driver = &io_driver, | ||
2761 | .id_table = edgeport_2port_id_table, | 2758 | .id_table = edgeport_2port_id_table, |
2762 | .num_ports = 2, | 2759 | .num_ports = 2, |
2763 | .open = edge_open, | 2760 | .open = edge_open, |
@@ -2782,41 +2779,12 @@ static struct usb_serial_driver edgeport_2port_device = { | |||
2782 | .write_bulk_callback = edge_bulk_out_callback, | 2779 | .write_bulk_callback = edge_bulk_out_callback, |
2783 | }; | 2780 | }; |
2784 | 2781 | ||
2782 | static struct usb_serial_driver * const serial_drivers[] = { | ||
2783 | &edgeport_1port_device, &edgeport_2port_device, NULL | ||
2784 | }; | ||
2785 | 2785 | ||
2786 | static int __init edgeport_init(void) | 2786 | module_usb_serial_driver(io_driver, serial_drivers); |
2787 | { | ||
2788 | int retval; | ||
2789 | retval = usb_serial_register(&edgeport_1port_device); | ||
2790 | if (retval) | ||
2791 | goto failed_1port_device_register; | ||
2792 | retval = usb_serial_register(&edgeport_2port_device); | ||
2793 | if (retval) | ||
2794 | goto failed_2port_device_register; | ||
2795 | retval = usb_register(&io_driver); | ||
2796 | if (retval) | ||
2797 | goto failed_usb_register; | ||
2798 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
2799 | DRIVER_DESC "\n"); | ||
2800 | return 0; | ||
2801 | failed_usb_register: | ||
2802 | usb_serial_deregister(&edgeport_2port_device); | ||
2803 | failed_2port_device_register: | ||
2804 | usb_serial_deregister(&edgeport_1port_device); | ||
2805 | failed_1port_device_register: | ||
2806 | return retval; | ||
2807 | } | ||
2808 | |||
2809 | static void __exit edgeport_exit(void) | ||
2810 | { | ||
2811 | usb_deregister(&io_driver); | ||
2812 | usb_serial_deregister(&edgeport_1port_device); | ||
2813 | usb_serial_deregister(&edgeport_2port_device); | ||
2814 | } | ||
2815 | |||
2816 | module_init(edgeport_init); | ||
2817 | module_exit(edgeport_exit); | ||
2818 | 2787 | ||
2819 | /* Module information */ | ||
2820 | MODULE_AUTHOR(DRIVER_AUTHOR); | 2788 | MODULE_AUTHOR(DRIVER_AUTHOR); |
2821 | MODULE_DESCRIPTION(DRIVER_DESC); | 2789 | MODULE_DESCRIPTION(DRIVER_DESC); |
2822 | MODULE_LICENSE("GPL"); | 2790 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c index 06053a920dd8..10c02b8b5664 100644 --- a/drivers/usb/serial/ipaq.c +++ b/drivers/usb/serial/ipaq.c | |||
@@ -510,7 +510,6 @@ static struct usb_driver ipaq_driver = { | |||
510 | .probe = usb_serial_probe, | 510 | .probe = usb_serial_probe, |
511 | .disconnect = usb_serial_disconnect, | 511 | .disconnect = usb_serial_disconnect, |
512 | .id_table = ipaq_id_table, | 512 | .id_table = ipaq_id_table, |
513 | .no_dynamic_id = 1, | ||
514 | }; | 513 | }; |
515 | 514 | ||
516 | 515 | ||
@@ -521,7 +520,6 @@ static struct usb_serial_driver ipaq_device = { | |||
521 | .name = "ipaq", | 520 | .name = "ipaq", |
522 | }, | 521 | }, |
523 | .description = "PocketPC PDA", | 522 | .description = "PocketPC PDA", |
524 | .usb_driver = &ipaq_driver, | ||
525 | .id_table = ipaq_id_table, | 523 | .id_table = ipaq_id_table, |
526 | .bulk_in_size = 256, | 524 | .bulk_in_size = 256, |
527 | .bulk_out_size = 256, | 525 | .bulk_out_size = 256, |
@@ -530,6 +528,10 @@ static struct usb_serial_driver ipaq_device = { | |||
530 | .calc_num_ports = ipaq_calc_num_ports, | 528 | .calc_num_ports = ipaq_calc_num_ports, |
531 | }; | 529 | }; |
532 | 530 | ||
531 | static struct usb_serial_driver * const serial_drivers[] = { | ||
532 | &ipaq_device, NULL | ||
533 | }; | ||
534 | |||
533 | static int ipaq_open(struct tty_struct *tty, | 535 | static int ipaq_open(struct tty_struct *tty, |
534 | struct usb_serial_port *port) | 536 | struct usb_serial_port *port) |
535 | { | 537 | { |
@@ -624,30 +626,22 @@ static int ipaq_startup(struct usb_serial *serial) | |||
624 | static int __init ipaq_init(void) | 626 | static int __init ipaq_init(void) |
625 | { | 627 | { |
626 | int retval; | 628 | int retval; |
627 | retval = usb_serial_register(&ipaq_device); | 629 | |
628 | if (retval) | ||
629 | goto failed_usb_serial_register; | ||
630 | if (vendor) { | 630 | if (vendor) { |
631 | ipaq_id_table[0].idVendor = vendor; | 631 | ipaq_id_table[0].idVendor = vendor; |
632 | ipaq_id_table[0].idProduct = product; | 632 | ipaq_id_table[0].idProduct = product; |
633 | } | 633 | } |
634 | retval = usb_register(&ipaq_driver); | 634 | |
635 | if (retval) | 635 | retval = usb_serial_register_drivers(&ipaq_driver, serial_drivers); |
636 | goto failed_usb_register; | 636 | if (retval == 0) |
637 | 637 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | |
638 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | 638 | DRIVER_DESC "\n"); |
639 | DRIVER_DESC "\n"); | ||
640 | return 0; | ||
641 | failed_usb_register: | ||
642 | usb_serial_deregister(&ipaq_device); | ||
643 | failed_usb_serial_register: | ||
644 | return retval; | 639 | return retval; |
645 | } | 640 | } |
646 | 641 | ||
647 | static void __exit ipaq_exit(void) | 642 | static void __exit ipaq_exit(void) |
648 | { | 643 | { |
649 | usb_deregister(&ipaq_driver); | 644 | usb_serial_deregister_drivers(&ipaq_driver, serial_drivers); |
650 | usb_serial_deregister(&ipaq_device); | ||
651 | } | 645 | } |
652 | 646 | ||
653 | 647 | ||
diff --git a/drivers/usb/serial/ipw.c b/drivers/usb/serial/ipw.c index 6f9356f3f99e..76a06406e26a 100644 --- a/drivers/usb/serial/ipw.c +++ b/drivers/usb/serial/ipw.c | |||
@@ -144,7 +144,6 @@ static struct usb_driver usb_ipw_driver = { | |||
144 | .probe = usb_serial_probe, | 144 | .probe = usb_serial_probe, |
145 | .disconnect = usb_serial_disconnect, | 145 | .disconnect = usb_serial_disconnect, |
146 | .id_table = usb_ipw_ids, | 146 | .id_table = usb_ipw_ids, |
147 | .no_dynamic_id = 1, | ||
148 | }; | 147 | }; |
149 | 148 | ||
150 | static bool debug; | 149 | static bool debug; |
@@ -318,7 +317,6 @@ static struct usb_serial_driver ipw_device = { | |||
318 | .name = "ipw", | 317 | .name = "ipw", |
319 | }, | 318 | }, |
320 | .description = "IPWireless converter", | 319 | .description = "IPWireless converter", |
321 | .usb_driver = &usb_ipw_driver, | ||
322 | .id_table = usb_ipw_ids, | 320 | .id_table = usb_ipw_ids, |
323 | .num_ports = 1, | 321 | .num_ports = 1, |
324 | .disconnect = usb_wwan_disconnect, | 322 | .disconnect = usb_wwan_disconnect, |
@@ -331,33 +329,11 @@ static struct usb_serial_driver ipw_device = { | |||
331 | .write = usb_wwan_write, | 329 | .write = usb_wwan_write, |
332 | }; | 330 | }; |
333 | 331 | ||
332 | static struct usb_serial_driver * const serial_drivers[] = { | ||
333 | &ipw_device, NULL | ||
334 | }; | ||
334 | 335 | ||
335 | 336 | module_usb_serial_driver(usb_ipw_driver, serial_drivers); | |
336 | static int __init usb_ipw_init(void) | ||
337 | { | ||
338 | int retval; | ||
339 | |||
340 | retval = usb_serial_register(&ipw_device); | ||
341 | if (retval) | ||
342 | return retval; | ||
343 | retval = usb_register(&usb_ipw_driver); | ||
344 | if (retval) { | ||
345 | usb_serial_deregister(&ipw_device); | ||
346 | return retval; | ||
347 | } | ||
348 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
349 | DRIVER_DESC "\n"); | ||
350 | return 0; | ||
351 | } | ||
352 | |||
353 | static void __exit usb_ipw_exit(void) | ||
354 | { | ||
355 | usb_deregister(&usb_ipw_driver); | ||
356 | usb_serial_deregister(&ipw_device); | ||
357 | } | ||
358 | |||
359 | module_init(usb_ipw_init); | ||
360 | module_exit(usb_ipw_exit); | ||
361 | 337 | ||
362 | /* Module information */ | 338 | /* Module information */ |
363 | MODULE_AUTHOR(DRIVER_AUTHOR); | 339 | MODULE_AUTHOR(DRIVER_AUTHOR); |
diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c index 84a396e83671..84965cd65c76 100644 --- a/drivers/usb/serial/ir-usb.c +++ b/drivers/usb/serial/ir-usb.c | |||
@@ -82,7 +82,6 @@ static struct usb_driver ir_driver = { | |||
82 | .probe = usb_serial_probe, | 82 | .probe = usb_serial_probe, |
83 | .disconnect = usb_serial_disconnect, | 83 | .disconnect = usb_serial_disconnect, |
84 | .id_table = ir_id_table, | 84 | .id_table = ir_id_table, |
85 | .no_dynamic_id = 1, | ||
86 | }; | 85 | }; |
87 | 86 | ||
88 | static struct usb_serial_driver ir_device = { | 87 | static struct usb_serial_driver ir_device = { |
@@ -91,7 +90,6 @@ static struct usb_serial_driver ir_device = { | |||
91 | .name = "ir-usb", | 90 | .name = "ir-usb", |
92 | }, | 91 | }, |
93 | .description = "IR Dongle", | 92 | .description = "IR Dongle", |
94 | .usb_driver = &ir_driver, | ||
95 | .id_table = ir_id_table, | 93 | .id_table = ir_id_table, |
96 | .num_ports = 1, | 94 | .num_ports = 1, |
97 | .set_termios = ir_set_termios, | 95 | .set_termios = ir_set_termios, |
@@ -101,6 +99,10 @@ static struct usb_serial_driver ir_device = { | |||
101 | .process_read_urb = ir_process_read_urb, | 99 | .process_read_urb = ir_process_read_urb, |
102 | }; | 100 | }; |
103 | 101 | ||
102 | static struct usb_serial_driver * const serial_drivers[] = { | ||
103 | &ir_device, NULL | ||
104 | }; | ||
105 | |||
104 | static inline void irda_usb_dump_class_desc(struct usb_irda_cs_descriptor *desc) | 106 | static inline void irda_usb_dump_class_desc(struct usb_irda_cs_descriptor *desc) |
105 | { | 107 | { |
106 | dbg("bLength=%x", desc->bLength); | 108 | dbg("bLength=%x", desc->bLength); |
@@ -445,30 +447,16 @@ static int __init ir_init(void) | |||
445 | ir_device.bulk_out_size = buffer_size; | 447 | ir_device.bulk_out_size = buffer_size; |
446 | } | 448 | } |
447 | 449 | ||
448 | retval = usb_serial_register(&ir_device); | 450 | retval = usb_serial_register_drivers(&ir_driver, serial_drivers); |
449 | if (retval) | 451 | if (retval == 0) |
450 | goto failed_usb_serial_register; | 452 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" |
451 | 453 | DRIVER_DESC "\n"); | |
452 | retval = usb_register(&ir_driver); | ||
453 | if (retval) | ||
454 | goto failed_usb_register; | ||
455 | |||
456 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
457 | DRIVER_DESC "\n"); | ||
458 | |||
459 | return 0; | ||
460 | |||
461 | failed_usb_register: | ||
462 | usb_serial_deregister(&ir_device); | ||
463 | |||
464 | failed_usb_serial_register: | ||
465 | return retval; | 454 | return retval; |
466 | } | 455 | } |
467 | 456 | ||
468 | static void __exit ir_exit(void) | 457 | static void __exit ir_exit(void) |
469 | { | 458 | { |
470 | usb_deregister(&ir_driver); | 459 | usb_serial_deregister_drivers(&ir_driver, serial_drivers); |
471 | usb_serial_deregister(&ir_device); | ||
472 | } | 460 | } |
473 | 461 | ||
474 | 462 | ||
diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c index 3077a4436976..f2192d527db0 100644 --- a/drivers/usb/serial/iuu_phoenix.c +++ b/drivers/usb/serial/iuu_phoenix.c | |||
@@ -56,7 +56,6 @@ static struct usb_driver iuu_driver = { | |||
56 | .probe = usb_serial_probe, | 56 | .probe = usb_serial_probe, |
57 | .disconnect = usb_serial_disconnect, | 57 | .disconnect = usb_serial_disconnect, |
58 | .id_table = id_table, | 58 | .id_table = id_table, |
59 | .no_dynamic_id = 1, | ||
60 | }; | 59 | }; |
61 | 60 | ||
62 | /* turbo parameter */ | 61 | /* turbo parameter */ |
@@ -1274,7 +1273,6 @@ static struct usb_serial_driver iuu_device = { | |||
1274 | .name = "iuu_phoenix", | 1273 | .name = "iuu_phoenix", |
1275 | }, | 1274 | }, |
1276 | .id_table = id_table, | 1275 | .id_table = id_table, |
1277 | .usb_driver = &iuu_driver, | ||
1278 | .num_ports = 1, | 1276 | .num_ports = 1, |
1279 | .bulk_in_size = 512, | 1277 | .bulk_in_size = 512, |
1280 | .bulk_out_size = 512, | 1278 | .bulk_out_size = 512, |
@@ -1292,32 +1290,11 @@ static struct usb_serial_driver iuu_device = { | |||
1292 | .release = iuu_release, | 1290 | .release = iuu_release, |
1293 | }; | 1291 | }; |
1294 | 1292 | ||
1295 | static int __init iuu_init(void) | 1293 | static struct usb_serial_driver * const serial_drivers[] = { |
1296 | { | 1294 | &iuu_device, NULL |
1297 | int retval; | 1295 | }; |
1298 | retval = usb_serial_register(&iuu_device); | ||
1299 | if (retval) | ||
1300 | goto failed_usb_serial_register; | ||
1301 | retval = usb_register(&iuu_driver); | ||
1302 | if (retval) | ||
1303 | goto failed_usb_register; | ||
1304 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
1305 | DRIVER_DESC "\n"); | ||
1306 | return 0; | ||
1307 | failed_usb_register: | ||
1308 | usb_serial_deregister(&iuu_device); | ||
1309 | failed_usb_serial_register: | ||
1310 | return retval; | ||
1311 | } | ||
1312 | |||
1313 | static void __exit iuu_exit(void) | ||
1314 | { | ||
1315 | usb_deregister(&iuu_driver); | ||
1316 | usb_serial_deregister(&iuu_device); | ||
1317 | } | ||
1318 | 1296 | ||
1319 | module_init(iuu_init); | 1297 | module_usb_serial_driver(iuu_driver, serial_drivers); |
1320 | module_exit(iuu_exit); | ||
1321 | 1298 | ||
1322 | MODULE_AUTHOR("Alain Degreffe eczema@ecze.com"); | 1299 | MODULE_AUTHOR("Alain Degreffe eczema@ecze.com"); |
1323 | 1300 | ||
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index 4cc36c761801..a39ddd1b0dca 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c | |||
@@ -130,53 +130,7 @@ struct keyspan_port_private { | |||
130 | #include "keyspan_usa67msg.h" | 130 | #include "keyspan_usa67msg.h" |
131 | 131 | ||
132 | 132 | ||
133 | /* Functions used by new usb-serial code. */ | 133 | module_usb_serial_driver(keyspan_driver, serial_drivers); |
134 | static int __init keyspan_init(void) | ||
135 | { | ||
136 | int retval; | ||
137 | retval = usb_serial_register(&keyspan_pre_device); | ||
138 | if (retval) | ||
139 | goto failed_pre_device_register; | ||
140 | retval = usb_serial_register(&keyspan_1port_device); | ||
141 | if (retval) | ||
142 | goto failed_1port_device_register; | ||
143 | retval = usb_serial_register(&keyspan_2port_device); | ||
144 | if (retval) | ||
145 | goto failed_2port_device_register; | ||
146 | retval = usb_serial_register(&keyspan_4port_device); | ||
147 | if (retval) | ||
148 | goto failed_4port_device_register; | ||
149 | retval = usb_register(&keyspan_driver); | ||
150 | if (retval) | ||
151 | goto failed_usb_register; | ||
152 | |||
153 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
154 | DRIVER_DESC "\n"); | ||
155 | |||
156 | return 0; | ||
157 | failed_usb_register: | ||
158 | usb_serial_deregister(&keyspan_4port_device); | ||
159 | failed_4port_device_register: | ||
160 | usb_serial_deregister(&keyspan_2port_device); | ||
161 | failed_2port_device_register: | ||
162 | usb_serial_deregister(&keyspan_1port_device); | ||
163 | failed_1port_device_register: | ||
164 | usb_serial_deregister(&keyspan_pre_device); | ||
165 | failed_pre_device_register: | ||
166 | return retval; | ||
167 | } | ||
168 | |||
169 | static void __exit keyspan_exit(void) | ||
170 | { | ||
171 | usb_deregister(&keyspan_driver); | ||
172 | usb_serial_deregister(&keyspan_pre_device); | ||
173 | usb_serial_deregister(&keyspan_1port_device); | ||
174 | usb_serial_deregister(&keyspan_2port_device); | ||
175 | usb_serial_deregister(&keyspan_4port_device); | ||
176 | } | ||
177 | |||
178 | module_init(keyspan_init); | ||
179 | module_exit(keyspan_exit); | ||
180 | 134 | ||
181 | static void keyspan_break_ctl(struct tty_struct *tty, int break_state) | 135 | static void keyspan_break_ctl(struct tty_struct *tty, int break_state) |
182 | { | 136 | { |
diff --git a/drivers/usb/serial/keyspan.h b/drivers/usb/serial/keyspan.h index 13fa1d1cc900..622853c9e384 100644 --- a/drivers/usb/serial/keyspan.h +++ b/drivers/usb/serial/keyspan.h | |||
@@ -492,7 +492,6 @@ static struct usb_driver keyspan_driver = { | |||
492 | .probe = usb_serial_probe, | 492 | .probe = usb_serial_probe, |
493 | .disconnect = usb_serial_disconnect, | 493 | .disconnect = usb_serial_disconnect, |
494 | .id_table = keyspan_ids_combined, | 494 | .id_table = keyspan_ids_combined, |
495 | .no_dynamic_id = 1, | ||
496 | }; | 495 | }; |
497 | 496 | ||
498 | /* usb_device_id table for the pre-firmware download keyspan devices */ | 497 | /* usb_device_id table for the pre-firmware download keyspan devices */ |
@@ -545,7 +544,6 @@ static struct usb_serial_driver keyspan_pre_device = { | |||
545 | .name = "keyspan_no_firm", | 544 | .name = "keyspan_no_firm", |
546 | }, | 545 | }, |
547 | .description = "Keyspan - (without firmware)", | 546 | .description = "Keyspan - (without firmware)", |
548 | .usb_driver = &keyspan_driver, | ||
549 | .id_table = keyspan_pre_ids, | 547 | .id_table = keyspan_pre_ids, |
550 | .num_ports = 1, | 548 | .num_ports = 1, |
551 | .attach = keyspan_fake_startup, | 549 | .attach = keyspan_fake_startup, |
@@ -557,7 +555,6 @@ static struct usb_serial_driver keyspan_1port_device = { | |||
557 | .name = "keyspan_1", | 555 | .name = "keyspan_1", |
558 | }, | 556 | }, |
559 | .description = "Keyspan 1 port adapter", | 557 | .description = "Keyspan 1 port adapter", |
560 | .usb_driver = &keyspan_driver, | ||
561 | .id_table = keyspan_1port_ids, | 558 | .id_table = keyspan_1port_ids, |
562 | .num_ports = 1, | 559 | .num_ports = 1, |
563 | .open = keyspan_open, | 560 | .open = keyspan_open, |
@@ -580,7 +577,6 @@ static struct usb_serial_driver keyspan_2port_device = { | |||
580 | .name = "keyspan_2", | 577 | .name = "keyspan_2", |
581 | }, | 578 | }, |
582 | .description = "Keyspan 2 port adapter", | 579 | .description = "Keyspan 2 port adapter", |
583 | .usb_driver = &keyspan_driver, | ||
584 | .id_table = keyspan_2port_ids, | 580 | .id_table = keyspan_2port_ids, |
585 | .num_ports = 2, | 581 | .num_ports = 2, |
586 | .open = keyspan_open, | 582 | .open = keyspan_open, |
@@ -603,7 +599,6 @@ static struct usb_serial_driver keyspan_4port_device = { | |||
603 | .name = "keyspan_4", | 599 | .name = "keyspan_4", |
604 | }, | 600 | }, |
605 | .description = "Keyspan 4 port adapter", | 601 | .description = "Keyspan 4 port adapter", |
606 | .usb_driver = &keyspan_driver, | ||
607 | .id_table = keyspan_4port_ids, | 602 | .id_table = keyspan_4port_ids, |
608 | .num_ports = 4, | 603 | .num_ports = 4, |
609 | .open = keyspan_open, | 604 | .open = keyspan_open, |
@@ -620,4 +615,9 @@ static struct usb_serial_driver keyspan_4port_device = { | |||
620 | .release = keyspan_release, | 615 | .release = keyspan_release, |
621 | }; | 616 | }; |
622 | 617 | ||
618 | static struct usb_serial_driver * const serial_drivers[] = { | ||
619 | &keyspan_pre_device, &keyspan_1port_device, | ||
620 | &keyspan_2port_device, &keyspan_4port_device, NULL | ||
621 | }; | ||
622 | |||
623 | #endif | 623 | #endif |
diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c index 7c62a7048302..693bcdfcb3d5 100644 --- a/drivers/usb/serial/keyspan_pda.c +++ b/drivers/usb/serial/keyspan_pda.c | |||
@@ -91,7 +91,6 @@ static struct usb_driver keyspan_pda_driver = { | |||
91 | .probe = usb_serial_probe, | 91 | .probe = usb_serial_probe, |
92 | .disconnect = usb_serial_disconnect, | 92 | .disconnect = usb_serial_disconnect, |
93 | .id_table = id_table_combined, | 93 | .id_table = id_table_combined, |
94 | .no_dynamic_id = 1, | ||
95 | }; | 94 | }; |
96 | 95 | ||
97 | static const struct usb_device_id id_table_std[] = { | 96 | static const struct usb_device_id id_table_std[] = { |
@@ -779,7 +778,6 @@ static struct usb_serial_driver keyspan_pda_fake_device = { | |||
779 | .name = "keyspan_pda_pre", | 778 | .name = "keyspan_pda_pre", |
780 | }, | 779 | }, |
781 | .description = "Keyspan PDA - (prerenumeration)", | 780 | .description = "Keyspan PDA - (prerenumeration)", |
782 | .usb_driver = &keyspan_pda_driver, | ||
783 | .id_table = id_table_fake, | 781 | .id_table = id_table_fake, |
784 | .num_ports = 1, | 782 | .num_ports = 1, |
785 | .attach = keyspan_pda_fake_startup, | 783 | .attach = keyspan_pda_fake_startup, |
@@ -793,7 +791,6 @@ static struct usb_serial_driver xircom_pgs_fake_device = { | |||
793 | .name = "xircom_no_firm", | 791 | .name = "xircom_no_firm", |
794 | }, | 792 | }, |
795 | .description = "Xircom / Entregra PGS - (prerenumeration)", | 793 | .description = "Xircom / Entregra PGS - (prerenumeration)", |
796 | .usb_driver = &keyspan_pda_driver, | ||
797 | .id_table = id_table_fake_xircom, | 794 | .id_table = id_table_fake_xircom, |
798 | .num_ports = 1, | 795 | .num_ports = 1, |
799 | .attach = keyspan_pda_fake_startup, | 796 | .attach = keyspan_pda_fake_startup, |
@@ -806,7 +803,6 @@ static struct usb_serial_driver keyspan_pda_device = { | |||
806 | .name = "keyspan_pda", | 803 | .name = "keyspan_pda", |
807 | }, | 804 | }, |
808 | .description = "Keyspan PDA", | 805 | .description = "Keyspan PDA", |
809 | .usb_driver = &keyspan_pda_driver, | ||
810 | .id_table = id_table_std, | 806 | .id_table = id_table_std, |
811 | .num_ports = 1, | 807 | .num_ports = 1, |
812 | .dtr_rts = keyspan_pda_dtr_rts, | 808 | .dtr_rts = keyspan_pda_dtr_rts, |
@@ -827,61 +823,18 @@ static struct usb_serial_driver keyspan_pda_device = { | |||
827 | .release = keyspan_pda_release, | 823 | .release = keyspan_pda_release, |
828 | }; | 824 | }; |
829 | 825 | ||
830 | 826 | static struct usb_serial_driver * const serial_drivers[] = { | |
831 | static int __init keyspan_pda_init(void) | 827 | &keyspan_pda_device, |
832 | { | ||
833 | int retval; | ||
834 | retval = usb_serial_register(&keyspan_pda_device); | ||
835 | if (retval) | ||
836 | goto failed_pda_register; | ||
837 | #ifdef KEYSPAN | 828 | #ifdef KEYSPAN |
838 | retval = usb_serial_register(&keyspan_pda_fake_device); | 829 | &keyspan_pda_fake_device, |
839 | if (retval) | ||
840 | goto failed_pda_fake_register; | ||
841 | #endif | 830 | #endif |
842 | #ifdef XIRCOM | 831 | #ifdef XIRCOM |
843 | retval = usb_serial_register(&xircom_pgs_fake_device); | 832 | &xircom_pgs_fake_device, |
844 | if (retval) | ||
845 | goto failed_xircom_register; | ||
846 | #endif | ||
847 | retval = usb_register(&keyspan_pda_driver); | ||
848 | if (retval) | ||
849 | goto failed_usb_register; | ||
850 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
851 | DRIVER_DESC "\n"); | ||
852 | return 0; | ||
853 | failed_usb_register: | ||
854 | #ifdef XIRCOM | ||
855 | usb_serial_deregister(&xircom_pgs_fake_device); | ||
856 | failed_xircom_register: | ||
857 | #endif /* XIRCOM */ | ||
858 | #ifdef KEYSPAN | ||
859 | usb_serial_deregister(&keyspan_pda_fake_device); | ||
860 | #endif | ||
861 | #ifdef KEYSPAN | ||
862 | failed_pda_fake_register: | ||
863 | #endif | 833 | #endif |
864 | usb_serial_deregister(&keyspan_pda_device); | 834 | NULL |
865 | failed_pda_register: | 835 | }; |
866 | return retval; | ||
867 | } | ||
868 | |||
869 | |||
870 | static void __exit keyspan_pda_exit(void) | ||
871 | { | ||
872 | usb_deregister(&keyspan_pda_driver); | ||
873 | usb_serial_deregister(&keyspan_pda_device); | ||
874 | #ifdef KEYSPAN | ||
875 | usb_serial_deregister(&keyspan_pda_fake_device); | ||
876 | #endif | ||
877 | #ifdef XIRCOM | ||
878 | usb_serial_deregister(&xircom_pgs_fake_device); | ||
879 | #endif | ||
880 | } | ||
881 | |||
882 | 836 | ||
883 | module_init(keyspan_pda_init); | 837 | module_usb_serial_driver(keyspan_pda_driver, serial_drivers); |
884 | module_exit(keyspan_pda_exit); | ||
885 | 838 | ||
886 | MODULE_AUTHOR(DRIVER_AUTHOR); | 839 | MODULE_AUTHOR(DRIVER_AUTHOR); |
887 | MODULE_DESCRIPTION(DRIVER_DESC); | 840 | MODULE_DESCRIPTION(DRIVER_DESC); |
@@ -889,4 +842,3 @@ MODULE_LICENSE("GPL"); | |||
889 | 842 | ||
890 | module_param(debug, bool, S_IRUGO | S_IWUSR); | 843 | module_param(debug, bool, S_IRUGO | S_IWUSR); |
891 | MODULE_PARM_DESC(debug, "Debug enabled or not"); | 844 | MODULE_PARM_DESC(debug, "Debug enabled or not"); |
892 | |||
diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c index fc064e1442ca..10f05407e535 100644 --- a/drivers/usb/serial/kl5kusb105.c +++ b/drivers/usb/serial/kl5kusb105.c | |||
@@ -91,7 +91,6 @@ static struct usb_driver kl5kusb105d_driver = { | |||
91 | .probe = usb_serial_probe, | 91 | .probe = usb_serial_probe, |
92 | .disconnect = usb_serial_disconnect, | 92 | .disconnect = usb_serial_disconnect, |
93 | .id_table = id_table, | 93 | .id_table = id_table, |
94 | .no_dynamic_id = 1, | ||
95 | }; | 94 | }; |
96 | 95 | ||
97 | static struct usb_serial_driver kl5kusb105d_device = { | 96 | static struct usb_serial_driver kl5kusb105d_device = { |
@@ -100,7 +99,6 @@ static struct usb_serial_driver kl5kusb105d_device = { | |||
100 | .name = "kl5kusb105d", | 99 | .name = "kl5kusb105d", |
101 | }, | 100 | }, |
102 | .description = "KL5KUSB105D / PalmConnect", | 101 | .description = "KL5KUSB105D / PalmConnect", |
103 | .usb_driver = &kl5kusb105d_driver, | ||
104 | .id_table = id_table, | 102 | .id_table = id_table, |
105 | .num_ports = 1, | 103 | .num_ports = 1, |
106 | .bulk_out_size = 64, | 104 | .bulk_out_size = 64, |
@@ -118,6 +116,10 @@ static struct usb_serial_driver kl5kusb105d_device = { | |||
118 | .prepare_write_buffer = klsi_105_prepare_write_buffer, | 116 | .prepare_write_buffer = klsi_105_prepare_write_buffer, |
119 | }; | 117 | }; |
120 | 118 | ||
119 | static struct usb_serial_driver * const serial_drivers[] = { | ||
120 | &kl5kusb105d_device, NULL | ||
121 | }; | ||
122 | |||
121 | struct klsi_105_port_settings { | 123 | struct klsi_105_port_settings { |
122 | __u8 pktlen; /* always 5, it seems */ | 124 | __u8 pktlen; /* always 5, it seems */ |
123 | __u8 baudrate; | 125 | __u8 baudrate; |
@@ -690,40 +692,11 @@ static int klsi_105_tiocmset(struct tty_struct *tty, | |||
690 | return retval; | 692 | return retval; |
691 | } | 693 | } |
692 | 694 | ||
693 | 695 | module_usb_serial_driver(kl5kusb105d_driver, serial_drivers); | |
694 | static int __init klsi_105_init(void) | ||
695 | { | ||
696 | int retval; | ||
697 | retval = usb_serial_register(&kl5kusb105d_device); | ||
698 | if (retval) | ||
699 | goto failed_usb_serial_register; | ||
700 | retval = usb_register(&kl5kusb105d_driver); | ||
701 | if (retval) | ||
702 | goto failed_usb_register; | ||
703 | |||
704 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
705 | DRIVER_DESC "\n"); | ||
706 | return 0; | ||
707 | failed_usb_register: | ||
708 | usb_serial_deregister(&kl5kusb105d_device); | ||
709 | failed_usb_serial_register: | ||
710 | return retval; | ||
711 | } | ||
712 | |||
713 | static void __exit klsi_105_exit(void) | ||
714 | { | ||
715 | usb_deregister(&kl5kusb105d_driver); | ||
716 | usb_serial_deregister(&kl5kusb105d_device); | ||
717 | } | ||
718 | |||
719 | |||
720 | module_init(klsi_105_init); | ||
721 | module_exit(klsi_105_exit); | ||
722 | 696 | ||
723 | MODULE_AUTHOR(DRIVER_AUTHOR); | 697 | MODULE_AUTHOR(DRIVER_AUTHOR); |
724 | MODULE_DESCRIPTION(DRIVER_DESC); | 698 | MODULE_DESCRIPTION(DRIVER_DESC); |
725 | MODULE_LICENSE("GPL"); | 699 | MODULE_LICENSE("GPL"); |
726 | 700 | ||
727 | |||
728 | module_param(debug, bool, S_IRUGO | S_IWUSR); | 701 | module_param(debug, bool, S_IRUGO | S_IWUSR); |
729 | MODULE_PARM_DESC(debug, "enable extensive debugging messages"); | 702 | MODULE_PARM_DESC(debug, "enable extensive debugging messages"); |
diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c index a92a3efb507b..4a9a75eb9b95 100644 --- a/drivers/usb/serial/kobil_sct.c +++ b/drivers/usb/serial/kobil_sct.c | |||
@@ -90,7 +90,6 @@ static struct usb_driver kobil_driver = { | |||
90 | .probe = usb_serial_probe, | 90 | .probe = usb_serial_probe, |
91 | .disconnect = usb_serial_disconnect, | 91 | .disconnect = usb_serial_disconnect, |
92 | .id_table = id_table, | 92 | .id_table = id_table, |
93 | .no_dynamic_id = 1, | ||
94 | }; | 93 | }; |
95 | 94 | ||
96 | 95 | ||
@@ -100,7 +99,6 @@ static struct usb_serial_driver kobil_device = { | |||
100 | .name = "kobil", | 99 | .name = "kobil", |
101 | }, | 100 | }, |
102 | .description = "KOBIL USB smart card terminal", | 101 | .description = "KOBIL USB smart card terminal", |
103 | .usb_driver = &kobil_driver, | ||
104 | .id_table = id_table, | 102 | .id_table = id_table, |
105 | .num_ports = 1, | 103 | .num_ports = 1, |
106 | .attach = kobil_startup, | 104 | .attach = kobil_startup, |
@@ -117,6 +115,9 @@ static struct usb_serial_driver kobil_device = { | |||
117 | .read_int_callback = kobil_read_int_callback, | 115 | .read_int_callback = kobil_read_int_callback, |
118 | }; | 116 | }; |
119 | 117 | ||
118 | static struct usb_serial_driver * const serial_drivers[] = { | ||
119 | &kobil_device, NULL | ||
120 | }; | ||
120 | 121 | ||
121 | struct kobil_private { | 122 | struct kobil_private { |
122 | int write_int_endpoint_address; | 123 | int write_int_endpoint_address; |
@@ -682,35 +683,7 @@ static int kobil_ioctl(struct tty_struct *tty, | |||
682 | } | 683 | } |
683 | } | 684 | } |
684 | 685 | ||
685 | static int __init kobil_init(void) | 686 | module_usb_serial_driver(kobil_driver, serial_drivers); |
686 | { | ||
687 | int retval; | ||
688 | retval = usb_serial_register(&kobil_device); | ||
689 | if (retval) | ||
690 | goto failed_usb_serial_register; | ||
691 | retval = usb_register(&kobil_driver); | ||
692 | if (retval) | ||
693 | goto failed_usb_register; | ||
694 | |||
695 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
696 | DRIVER_DESC "\n"); | ||
697 | |||
698 | return 0; | ||
699 | failed_usb_register: | ||
700 | usb_serial_deregister(&kobil_device); | ||
701 | failed_usb_serial_register: | ||
702 | return retval; | ||
703 | } | ||
704 | |||
705 | |||
706 | static void __exit kobil_exit(void) | ||
707 | { | ||
708 | usb_deregister(&kobil_driver); | ||
709 | usb_serial_deregister(&kobil_device); | ||
710 | } | ||
711 | |||
712 | module_init(kobil_init); | ||
713 | module_exit(kobil_exit); | ||
714 | 687 | ||
715 | MODULE_AUTHOR(DRIVER_AUTHOR); | 688 | MODULE_AUTHOR(DRIVER_AUTHOR); |
716 | MODULE_DESCRIPTION(DRIVER_DESC); | 689 | MODULE_DESCRIPTION(DRIVER_DESC); |
diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c index 27fa9c8a77b0..6edd26130e25 100644 --- a/drivers/usb/serial/mct_u232.c +++ b/drivers/usb/serial/mct_u232.c | |||
@@ -88,7 +88,6 @@ static struct usb_driver mct_u232_driver = { | |||
88 | .probe = usb_serial_probe, | 88 | .probe = usb_serial_probe, |
89 | .disconnect = usb_serial_disconnect, | 89 | .disconnect = usb_serial_disconnect, |
90 | .id_table = id_table_combined, | 90 | .id_table = id_table_combined, |
91 | .no_dynamic_id = 1, | ||
92 | }; | 91 | }; |
93 | 92 | ||
94 | static struct usb_serial_driver mct_u232_device = { | 93 | static struct usb_serial_driver mct_u232_device = { |
@@ -97,7 +96,6 @@ static struct usb_serial_driver mct_u232_device = { | |||
97 | .name = "mct_u232", | 96 | .name = "mct_u232", |
98 | }, | 97 | }, |
99 | .description = "MCT U232", | 98 | .description = "MCT U232", |
100 | .usb_driver = &mct_u232_driver, | ||
101 | .id_table = id_table_combined, | 99 | .id_table = id_table_combined, |
102 | .num_ports = 1, | 100 | .num_ports = 1, |
103 | .open = mct_u232_open, | 101 | .open = mct_u232_open, |
@@ -116,6 +114,10 @@ static struct usb_serial_driver mct_u232_device = { | |||
116 | .get_icount = mct_u232_get_icount, | 114 | .get_icount = mct_u232_get_icount, |
117 | }; | 115 | }; |
118 | 116 | ||
117 | static struct usb_serial_driver * const serial_drivers[] = { | ||
118 | &mct_u232_device, NULL | ||
119 | }; | ||
120 | |||
119 | struct mct_u232_private { | 121 | struct mct_u232_private { |
120 | spinlock_t lock; | 122 | spinlock_t lock; |
121 | unsigned int control_state; /* Modem Line Setting (TIOCM) */ | 123 | unsigned int control_state; /* Modem Line Setting (TIOCM) */ |
@@ -904,33 +906,7 @@ static int mct_u232_get_icount(struct tty_struct *tty, | |||
904 | return 0; | 906 | return 0; |
905 | } | 907 | } |
906 | 908 | ||
907 | static int __init mct_u232_init(void) | 909 | module_usb_serial_driver(mct_u232_driver, serial_drivers); |
908 | { | ||
909 | int retval; | ||
910 | retval = usb_serial_register(&mct_u232_device); | ||
911 | if (retval) | ||
912 | goto failed_usb_serial_register; | ||
913 | retval = usb_register(&mct_u232_driver); | ||
914 | if (retval) | ||
915 | goto failed_usb_register; | ||
916 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
917 | DRIVER_DESC "\n"); | ||
918 | return 0; | ||
919 | failed_usb_register: | ||
920 | usb_serial_deregister(&mct_u232_device); | ||
921 | failed_usb_serial_register: | ||
922 | return retval; | ||
923 | } | ||
924 | |||
925 | |||
926 | static void __exit mct_u232_exit(void) | ||
927 | { | ||
928 | usb_deregister(&mct_u232_driver); | ||
929 | usb_serial_deregister(&mct_u232_device); | ||
930 | } | ||
931 | |||
932 | module_init(mct_u232_init); | ||
933 | module_exit(mct_u232_exit); | ||
934 | 910 | ||
935 | MODULE_AUTHOR(DRIVER_AUTHOR); | 911 | MODULE_AUTHOR(DRIVER_AUTHOR); |
936 | MODULE_DESCRIPTION(DRIVER_DESC); | 912 | MODULE_DESCRIPTION(DRIVER_DESC); |
diff --git a/drivers/usb/serial/metro-usb.c b/drivers/usb/serial/metro-usb.c new file mode 100644 index 000000000000..6e1622f2a297 --- /dev/null +++ b/drivers/usb/serial/metro-usb.c | |||
@@ -0,0 +1,402 @@ | |||
1 | /* | ||
2 | Some of this code is credited to Linux USB open source files that are | ||
3 | distributed with Linux. | ||
4 | |||
5 | Copyright: 2007 Metrologic Instruments. All rights reserved. | ||
6 | Copyright: 2011 Azimut Ltd. <http://azimutrzn.ru/> | ||
7 | */ | ||
8 | |||
9 | #include <linux/kernel.h> | ||
10 | #include <linux/init.h> | ||
11 | #include <linux/tty.h> | ||
12 | #include <linux/module.h> | ||
13 | #include <linux/usb.h> | ||
14 | #include <linux/errno.h> | ||
15 | #include <linux/slab.h> | ||
16 | #include <linux/tty_driver.h> | ||
17 | #include <linux/tty_flip.h> | ||
18 | #include <linux/moduleparam.h> | ||
19 | #include <linux/spinlock.h> | ||
20 | #include <linux/errno.h> | ||
21 | #include <linux/uaccess.h> | ||
22 | #include <linux/usb/serial.h> | ||
23 | |||
24 | /* Version Information */ | ||
25 | #define DRIVER_VERSION "v1.2.0.0" | ||
26 | #define DRIVER_DESC "Metrologic Instruments Inc. - USB-POS driver" | ||
27 | |||
28 | /* Product information. */ | ||
29 | #define FOCUS_VENDOR_ID 0x0C2E | ||
30 | #define FOCUS_PRODUCT_ID 0x0720 | ||
31 | #define FOCUS_PRODUCT_ID_UNI 0x0710 | ||
32 | |||
33 | #define METROUSB_SET_REQUEST_TYPE 0x40 | ||
34 | #define METROUSB_SET_MODEM_CTRL_REQUEST 10 | ||
35 | #define METROUSB_SET_BREAK_REQUEST 0x40 | ||
36 | #define METROUSB_MCR_NONE 0x08 /* Deactivate DTR and RTS. */ | ||
37 | #define METROUSB_MCR_RTS 0x0a /* Activate RTS. */ | ||
38 | #define METROUSB_MCR_DTR 0x09 /* Activate DTR. */ | ||
39 | #define WDR_TIMEOUT 5000 /* default urb timeout. */ | ||
40 | |||
41 | /* Private data structure. */ | ||
42 | struct metrousb_private { | ||
43 | spinlock_t lock; | ||
44 | int throttled; | ||
45 | unsigned long control_state; | ||
46 | }; | ||
47 | |||
48 | /* Device table list. */ | ||
49 | static struct usb_device_id id_table[] = { | ||
50 | { USB_DEVICE(FOCUS_VENDOR_ID, FOCUS_PRODUCT_ID) }, | ||
51 | { USB_DEVICE(FOCUS_VENDOR_ID, FOCUS_PRODUCT_ID_UNI) }, | ||
52 | { }, /* Terminating entry. */ | ||
53 | }; | ||
54 | MODULE_DEVICE_TABLE(usb, id_table); | ||
55 | |||
56 | /* Input parameter constants. */ | ||
57 | static bool debug; | ||
58 | |||
59 | static void metrousb_read_int_callback(struct urb *urb) | ||
60 | { | ||
61 | struct usb_serial_port *port = urb->context; | ||
62 | struct metrousb_private *metro_priv = usb_get_serial_port_data(port); | ||
63 | struct tty_struct *tty; | ||
64 | unsigned char *data = urb->transfer_buffer; | ||
65 | int throttled = 0; | ||
66 | int result = 0; | ||
67 | unsigned long flags = 0; | ||
68 | |||
69 | dev_dbg(&port->dev, "%s\n", __func__); | ||
70 | |||
71 | switch (urb->status) { | ||
72 | case 0: | ||
73 | /* Success status, read from the port. */ | ||
74 | break; | ||
75 | case -ECONNRESET: | ||
76 | case -ENOENT: | ||
77 | case -ESHUTDOWN: | ||
78 | /* urb has been terminated. */ | ||
79 | dev_dbg(&port->dev, | ||
80 | "%s - urb shutting down, error code=%d\n", | ||
81 | __func__, result); | ||
82 | return; | ||
83 | default: | ||
84 | dev_dbg(&port->dev, | ||
85 | "%s - non-zero urb received, error code=%d\n", | ||
86 | __func__, result); | ||
87 | goto exit; | ||
88 | } | ||
89 | |||
90 | |||
91 | /* Set the data read from the usb port into the serial port buffer. */ | ||
92 | tty = tty_port_tty_get(&port->port); | ||
93 | if (!tty) { | ||
94 | dev_dbg(&port->dev, "%s - bad tty pointer - exiting\n", | ||
95 | __func__); | ||
96 | return; | ||
97 | } | ||
98 | |||
99 | if (tty && urb->actual_length) { | ||
100 | /* Loop through the data copying each byte to the tty layer. */ | ||
101 | tty_insert_flip_string(tty, data, urb->actual_length); | ||
102 | |||
103 | /* Force the data to the tty layer. */ | ||
104 | tty_flip_buffer_push(tty); | ||
105 | } | ||
106 | tty_kref_put(tty); | ||
107 | |||
108 | /* Set any port variables. */ | ||
109 | spin_lock_irqsave(&metro_priv->lock, flags); | ||
110 | throttled = metro_priv->throttled; | ||
111 | spin_unlock_irqrestore(&metro_priv->lock, flags); | ||
112 | |||
113 | /* Continue trying to read if set. */ | ||
114 | if (!throttled) { | ||
115 | usb_fill_int_urb(port->interrupt_in_urb, port->serial->dev, | ||
116 | usb_rcvintpipe(port->serial->dev, port->interrupt_in_endpointAddress), | ||
117 | port->interrupt_in_urb->transfer_buffer, | ||
118 | port->interrupt_in_urb->transfer_buffer_length, | ||
119 | metrousb_read_int_callback, port, 1); | ||
120 | |||
121 | result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); | ||
122 | |||
123 | if (result) | ||
124 | dev_dbg(&port->dev, | ||
125 | "%s - failed submitting interrupt in urb, error code=%d\n", | ||
126 | __func__, result); | ||
127 | } | ||
128 | return; | ||
129 | |||
130 | exit: | ||
131 | /* Try to resubmit the urb. */ | ||
132 | result = usb_submit_urb(urb, GFP_ATOMIC); | ||
133 | if (result) | ||
134 | dev_dbg(&port->dev, | ||
135 | "%s - failed submitting interrupt in urb, error code=%d\n", | ||
136 | __func__, result); | ||
137 | } | ||
138 | |||
139 | static void metrousb_cleanup(struct usb_serial_port *port) | ||
140 | { | ||
141 | dev_dbg(&port->dev, "%s\n", __func__); | ||
142 | |||
143 | if (port->serial->dev) { | ||
144 | /* Shutdown any interrupt in urbs. */ | ||
145 | if (port->interrupt_in_urb) { | ||
146 | usb_unlink_urb(port->interrupt_in_urb); | ||
147 | usb_kill_urb(port->interrupt_in_urb); | ||
148 | } | ||
149 | } | ||
150 | } | ||
151 | |||
152 | static int metrousb_open(struct tty_struct *tty, struct usb_serial_port *port) | ||
153 | { | ||
154 | struct usb_serial *serial = port->serial; | ||
155 | struct metrousb_private *metro_priv = usb_get_serial_port_data(port); | ||
156 | unsigned long flags = 0; | ||
157 | int result = 0; | ||
158 | |||
159 | dev_dbg(&port->dev, "%s\n", __func__); | ||
160 | |||
161 | /* Make sure the urb is initialized. */ | ||
162 | if (!port->interrupt_in_urb) { | ||
163 | dev_dbg(&port->dev, "%s - interrupt urb not initialized\n", | ||
164 | __func__); | ||
165 | return -ENODEV; | ||
166 | } | ||
167 | |||
168 | /* Set the private data information for the port. */ | ||
169 | spin_lock_irqsave(&metro_priv->lock, flags); | ||
170 | metro_priv->control_state = 0; | ||
171 | metro_priv->throttled = 0; | ||
172 | spin_unlock_irqrestore(&metro_priv->lock, flags); | ||
173 | |||
174 | /* | ||
175 | * Force low_latency on so that our tty_push actually forces the data | ||
176 | * through, otherwise it is scheduled, and with high data rates (like | ||
177 | * with OHCI) data can get lost. | ||
178 | */ | ||
179 | if (tty) | ||
180 | tty->low_latency = 1; | ||
181 | |||
182 | /* Clear the urb pipe. */ | ||
183 | usb_clear_halt(serial->dev, port->interrupt_in_urb->pipe); | ||
184 | |||
185 | /* Start reading from the device */ | ||
186 | usb_fill_int_urb(port->interrupt_in_urb, serial->dev, | ||
187 | usb_rcvintpipe(serial->dev, port->interrupt_in_endpointAddress), | ||
188 | port->interrupt_in_urb->transfer_buffer, | ||
189 | port->interrupt_in_urb->transfer_buffer_length, | ||
190 | metrousb_read_int_callback, port, 1); | ||
191 | result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); | ||
192 | |||
193 | if (result) { | ||
194 | dev_dbg(&port->dev, | ||
195 | "%s - failed submitting interrupt in urb, error code=%d\n", | ||
196 | __func__, result); | ||
197 | goto exit; | ||
198 | } | ||
199 | |||
200 | dev_dbg(&port->dev, "%s - port open\n", __func__); | ||
201 | exit: | ||
202 | return result; | ||
203 | } | ||
204 | |||
205 | static int metrousb_set_modem_ctrl(struct usb_serial *serial, unsigned int control_state) | ||
206 | { | ||
207 | int retval = 0; | ||
208 | unsigned char mcr = METROUSB_MCR_NONE; | ||
209 | |||
210 | dev_dbg(&serial->dev->dev, "%s - control state = %d\n", | ||
211 | __func__, control_state); | ||
212 | |||
213 | /* Set the modem control value. */ | ||
214 | if (control_state & TIOCM_DTR) | ||
215 | mcr |= METROUSB_MCR_DTR; | ||
216 | if (control_state & TIOCM_RTS) | ||
217 | mcr |= METROUSB_MCR_RTS; | ||
218 | |||
219 | /* Send the command to the usb port. */ | ||
220 | retval = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), | ||
221 | METROUSB_SET_REQUEST_TYPE, METROUSB_SET_MODEM_CTRL_REQUEST, | ||
222 | control_state, 0, NULL, 0, WDR_TIMEOUT); | ||
223 | if (retval < 0) | ||
224 | dev_dbg(&serial->dev->dev, | ||
225 | "%s - set modem ctrl=0x%x failed, error code=%d\n", | ||
226 | __func__, mcr, retval); | ||
227 | |||
228 | return retval; | ||
229 | } | ||
230 | |||
231 | static void metrousb_shutdown(struct usb_serial *serial) | ||
232 | { | ||
233 | int i = 0; | ||
234 | |||
235 | dev_dbg(&serial->dev->dev, "%s\n", __func__); | ||
236 | |||
237 | /* Stop reading and writing on all ports. */ | ||
238 | for (i = 0; i < serial->num_ports; ++i) { | ||
239 | /* Close any open urbs. */ | ||
240 | metrousb_cleanup(serial->port[i]); | ||
241 | |||
242 | /* Free memory. */ | ||
243 | kfree(usb_get_serial_port_data(serial->port[i])); | ||
244 | usb_set_serial_port_data(serial->port[i], NULL); | ||
245 | |||
246 | dev_dbg(&serial->dev->dev, "%s - freed port number=%d\n", | ||
247 | __func__, serial->port[i]->number); | ||
248 | } | ||
249 | } | ||
250 | |||
251 | static int metrousb_startup(struct usb_serial *serial) | ||
252 | { | ||
253 | struct metrousb_private *metro_priv; | ||
254 | struct usb_serial_port *port; | ||
255 | int i = 0; | ||
256 | |||
257 | dev_dbg(&serial->dev->dev, "%s\n", __func__); | ||
258 | |||
259 | /* Loop through the serial ports setting up the private structures. | ||
260 | * Currently we only use one port. */ | ||
261 | for (i = 0; i < serial->num_ports; ++i) { | ||
262 | port = serial->port[i]; | ||
263 | |||
264 | /* Declare memory. */ | ||
265 | metro_priv = kzalloc(sizeof(struct metrousb_private), GFP_KERNEL); | ||
266 | if (!metro_priv) | ||
267 | return -ENOMEM; | ||
268 | |||
269 | /* Initialize memory. */ | ||
270 | spin_lock_init(&metro_priv->lock); | ||
271 | usb_set_serial_port_data(port, metro_priv); | ||
272 | |||
273 | dev_dbg(&serial->dev->dev, "%s - port number=%d\n ", | ||
274 | __func__, port->number); | ||
275 | } | ||
276 | |||
277 | return 0; | ||
278 | } | ||
279 | |||
280 | static void metrousb_throttle(struct tty_struct *tty) | ||
281 | { | ||
282 | struct usb_serial_port *port = tty->driver_data; | ||
283 | struct metrousb_private *metro_priv = usb_get_serial_port_data(port); | ||
284 | unsigned long flags = 0; | ||
285 | |||
286 | dev_dbg(tty->dev, "%s\n", __func__); | ||
287 | |||
288 | /* Set the private information for the port to stop reading data. */ | ||
289 | spin_lock_irqsave(&metro_priv->lock, flags); | ||
290 | metro_priv->throttled = 1; | ||
291 | spin_unlock_irqrestore(&metro_priv->lock, flags); | ||
292 | } | ||
293 | |||
294 | static int metrousb_tiocmget(struct tty_struct *tty) | ||
295 | { | ||
296 | unsigned long control_state = 0; | ||
297 | struct usb_serial_port *port = tty->driver_data; | ||
298 | struct metrousb_private *metro_priv = usb_get_serial_port_data(port); | ||
299 | unsigned long flags = 0; | ||
300 | |||
301 | dev_dbg(tty->dev, "%s\n", __func__); | ||
302 | |||
303 | spin_lock_irqsave(&metro_priv->lock, flags); | ||
304 | control_state = metro_priv->control_state; | ||
305 | spin_unlock_irqrestore(&metro_priv->lock, flags); | ||
306 | |||
307 | return control_state; | ||
308 | } | ||
309 | |||
310 | static int metrousb_tiocmset(struct tty_struct *tty, | ||
311 | unsigned int set, unsigned int clear) | ||
312 | { | ||
313 | struct usb_serial_port *port = tty->driver_data; | ||
314 | struct usb_serial *serial = port->serial; | ||
315 | struct metrousb_private *metro_priv = usb_get_serial_port_data(port); | ||
316 | unsigned long flags = 0; | ||
317 | unsigned long control_state = 0; | ||
318 | |||
319 | dev_dbg(tty->dev, "%s - set=%d, clear=%d\n", __func__, set, clear); | ||
320 | |||
321 | spin_lock_irqsave(&metro_priv->lock, flags); | ||
322 | control_state = metro_priv->control_state; | ||
323 | |||
324 | /* Set the RTS and DTR values. */ | ||
325 | if (set & TIOCM_RTS) | ||
326 | control_state |= TIOCM_RTS; | ||
327 | if (set & TIOCM_DTR) | ||
328 | control_state |= TIOCM_DTR; | ||
329 | if (clear & TIOCM_RTS) | ||
330 | control_state &= ~TIOCM_RTS; | ||
331 | if (clear & TIOCM_DTR) | ||
332 | control_state &= ~TIOCM_DTR; | ||
333 | |||
334 | metro_priv->control_state = control_state; | ||
335 | spin_unlock_irqrestore(&metro_priv->lock, flags); | ||
336 | return metrousb_set_modem_ctrl(serial, control_state); | ||
337 | } | ||
338 | |||
339 | static void metrousb_unthrottle(struct tty_struct *tty) | ||
340 | { | ||
341 | struct usb_serial_port *port = tty->driver_data; | ||
342 | struct metrousb_private *metro_priv = usb_get_serial_port_data(port); | ||
343 | unsigned long flags = 0; | ||
344 | int result = 0; | ||
345 | |||
346 | dev_dbg(tty->dev, "%s\n", __func__); | ||
347 | |||
348 | /* Set the private information for the port to resume reading data. */ | ||
349 | spin_lock_irqsave(&metro_priv->lock, flags); | ||
350 | metro_priv->throttled = 0; | ||
351 | spin_unlock_irqrestore(&metro_priv->lock, flags); | ||
352 | |||
353 | /* Submit the urb to read from the port. */ | ||
354 | port->interrupt_in_urb->dev = port->serial->dev; | ||
355 | result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); | ||
356 | if (result) | ||
357 | dev_dbg(tty->dev, | ||
358 | "failed submitting interrupt in urb error code=%d\n", | ||
359 | result); | ||
360 | } | ||
361 | |||
362 | static struct usb_driver metrousb_driver = { | ||
363 | .name = "metro-usb", | ||
364 | .probe = usb_serial_probe, | ||
365 | .disconnect = usb_serial_disconnect, | ||
366 | .id_table = id_table | ||
367 | }; | ||
368 | |||
369 | static struct usb_serial_driver metrousb_device = { | ||
370 | .driver = { | ||
371 | .owner = THIS_MODULE, | ||
372 | .name = "metro-usb", | ||
373 | }, | ||
374 | .description = "Metrologic USB to serial converter.", | ||
375 | .id_table = id_table, | ||
376 | .num_ports = 1, | ||
377 | .open = metrousb_open, | ||
378 | .close = metrousb_cleanup, | ||
379 | .read_int_callback = metrousb_read_int_callback, | ||
380 | .attach = metrousb_startup, | ||
381 | .release = metrousb_shutdown, | ||
382 | .throttle = metrousb_throttle, | ||
383 | .unthrottle = metrousb_unthrottle, | ||
384 | .tiocmget = metrousb_tiocmget, | ||
385 | .tiocmset = metrousb_tiocmset, | ||
386 | }; | ||
387 | |||
388 | static struct usb_serial_driver * const serial_drivers[] = { | ||
389 | &metrousb_device, | ||
390 | NULL, | ||
391 | }; | ||
392 | |||
393 | module_usb_serial_driver(metrousb_driver, serial_drivers); | ||
394 | |||
395 | MODULE_LICENSE("GPL"); | ||
396 | MODULE_AUTHOR("Philip Nicastro"); | ||
397 | MODULE_AUTHOR("Aleksey Babahin <tamerlan311@gmail.com>"); | ||
398 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
399 | |||
400 | /* Module input parameters */ | ||
401 | module_param(debug, bool, S_IRUGO | S_IWUSR); | ||
402 | MODULE_PARM_DESC(debug, "Print debug info (bool 1=on, 0=off)"); | ||
diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c index 4554ee49e635..bdce82034122 100644 --- a/drivers/usb/serial/mos7720.c +++ b/drivers/usb/serial/mos7720.c | |||
@@ -1294,7 +1294,7 @@ static int mos7720_write(struct tty_struct *tty, struct usb_serial_port *port, | |||
1294 | urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, | 1294 | urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, |
1295 | GFP_KERNEL); | 1295 | GFP_KERNEL); |
1296 | if (urb->transfer_buffer == NULL) { | 1296 | if (urb->transfer_buffer == NULL) { |
1297 | dev_err(&port->dev, "%s no more kernel memory...\n", | 1297 | dev_err_console(port, "%s no more kernel memory...\n", |
1298 | __func__); | 1298 | __func__); |
1299 | goto exit; | 1299 | goto exit; |
1300 | } | 1300 | } |
@@ -1315,7 +1315,7 @@ static int mos7720_write(struct tty_struct *tty, struct usb_serial_port *port, | |||
1315 | /* send it down the pipe */ | 1315 | /* send it down the pipe */ |
1316 | status = usb_submit_urb(urb, GFP_ATOMIC); | 1316 | status = usb_submit_urb(urb, GFP_ATOMIC); |
1317 | if (status) { | 1317 | if (status) { |
1318 | dev_err(&port->dev, "%s - usb_submit_urb(write bulk) failed " | 1318 | dev_err_console(port, "%s - usb_submit_urb(write bulk) failed " |
1319 | "with status = %d\n", __func__, status); | 1319 | "with status = %d\n", __func__, status); |
1320 | bytes_sent = status; | 1320 | bytes_sent = status; |
1321 | goto exit; | 1321 | goto exit; |
@@ -2169,7 +2169,6 @@ static struct usb_driver usb_driver = { | |||
2169 | .probe = usb_serial_probe, | 2169 | .probe = usb_serial_probe, |
2170 | .disconnect = usb_serial_disconnect, | 2170 | .disconnect = usb_serial_disconnect, |
2171 | .id_table = moschip_port_id_table, | 2171 | .id_table = moschip_port_id_table, |
2172 | .no_dynamic_id = 1, | ||
2173 | }; | 2172 | }; |
2174 | 2173 | ||
2175 | static struct usb_serial_driver moschip7720_2port_driver = { | 2174 | static struct usb_serial_driver moschip7720_2port_driver = { |
@@ -2178,7 +2177,6 @@ static struct usb_serial_driver moschip7720_2port_driver = { | |||
2178 | .name = "moschip7720", | 2177 | .name = "moschip7720", |
2179 | }, | 2178 | }, |
2180 | .description = "Moschip 2 port adapter", | 2179 | .description = "Moschip 2 port adapter", |
2181 | .usb_driver = &usb_driver, | ||
2182 | .id_table = moschip_port_id_table, | 2180 | .id_table = moschip_port_id_table, |
2183 | .calc_num_ports = mos77xx_calc_num_ports, | 2181 | .calc_num_ports = mos77xx_calc_num_ports, |
2184 | .open = mos7720_open, | 2182 | .open = mos7720_open, |
@@ -2201,44 +2199,12 @@ static struct usb_serial_driver moschip7720_2port_driver = { | |||
2201 | .read_int_callback = NULL /* dynamically assigned in probe() */ | 2199 | .read_int_callback = NULL /* dynamically assigned in probe() */ |
2202 | }; | 2200 | }; |
2203 | 2201 | ||
2204 | static int __init moschip7720_init(void) | 2202 | static struct usb_serial_driver * const serial_drivers[] = { |
2205 | { | 2203 | &moschip7720_2port_driver, NULL |
2206 | int retval; | 2204 | }; |
2207 | |||
2208 | dbg("%s: Entering ..........", __func__); | ||
2209 | |||
2210 | /* Register with the usb serial */ | ||
2211 | retval = usb_serial_register(&moschip7720_2port_driver); | ||
2212 | if (retval) | ||
2213 | goto failed_port_device_register; | ||
2214 | |||
2215 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
2216 | DRIVER_DESC "\n"); | ||
2217 | |||
2218 | /* Register with the usb */ | ||
2219 | retval = usb_register(&usb_driver); | ||
2220 | if (retval) | ||
2221 | goto failed_usb_register; | ||
2222 | |||
2223 | return 0; | ||
2224 | |||
2225 | failed_usb_register: | ||
2226 | usb_serial_deregister(&moschip7720_2port_driver); | ||
2227 | |||
2228 | failed_port_device_register: | ||
2229 | return retval; | ||
2230 | } | ||
2231 | |||
2232 | static void __exit moschip7720_exit(void) | ||
2233 | { | ||
2234 | usb_deregister(&usb_driver); | ||
2235 | usb_serial_deregister(&moschip7720_2port_driver); | ||
2236 | } | ||
2237 | 2205 | ||
2238 | module_init(moschip7720_init); | 2206 | module_usb_serial_driver(usb_driver, serial_drivers); |
2239 | module_exit(moschip7720_exit); | ||
2240 | 2207 | ||
2241 | /* Module information */ | ||
2242 | MODULE_AUTHOR(DRIVER_AUTHOR); | 2208 | MODULE_AUTHOR(DRIVER_AUTHOR); |
2243 | MODULE_DESCRIPTION(DRIVER_DESC); | 2209 | MODULE_DESCRIPTION(DRIVER_DESC); |
2244 | MODULE_LICENSE("GPL"); | 2210 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index 03b5e249e95e..c526550694a0 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c | |||
@@ -174,6 +174,7 @@ | |||
174 | 174 | ||
175 | #define CLK_MULTI_REGISTER ((__u16)(0x02)) | 175 | #define CLK_MULTI_REGISTER ((__u16)(0x02)) |
176 | #define CLK_START_VALUE_REGISTER ((__u16)(0x03)) | 176 | #define CLK_START_VALUE_REGISTER ((__u16)(0x03)) |
177 | #define GPIO_REGISTER ((__u16)(0x07)) | ||
177 | 178 | ||
178 | #define SERIAL_LCR_DLAB ((__u16)(0x0080)) | 179 | #define SERIAL_LCR_DLAB ((__u16)(0x0080)) |
179 | 180 | ||
@@ -1101,14 +1102,25 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
1101 | mos7840_port->read_urb = port->read_urb; | 1102 | mos7840_port->read_urb = port->read_urb; |
1102 | 1103 | ||
1103 | /* set up our bulk in urb */ | 1104 | /* set up our bulk in urb */ |
1104 | 1105 | if ((serial->num_ports == 2) | |
1105 | usb_fill_bulk_urb(mos7840_port->read_urb, | 1106 | && ((((__u16)port->number - |
1106 | serial->dev, | 1107 | (__u16)(port->serial->minor)) % 2) != 0)) { |
1107 | usb_rcvbulkpipe(serial->dev, | 1108 | usb_fill_bulk_urb(mos7840_port->read_urb, |
1108 | port->bulk_in_endpointAddress), | 1109 | serial->dev, |
1109 | port->bulk_in_buffer, | 1110 | usb_rcvbulkpipe(serial->dev, |
1110 | mos7840_port->read_urb->transfer_buffer_length, | 1111 | (port->bulk_in_endpointAddress) + 2), |
1111 | mos7840_bulk_in_callback, mos7840_port); | 1112 | port->bulk_in_buffer, |
1113 | mos7840_port->read_urb->transfer_buffer_length, | ||
1114 | mos7840_bulk_in_callback, mos7840_port); | ||
1115 | } else { | ||
1116 | usb_fill_bulk_urb(mos7840_port->read_urb, | ||
1117 | serial->dev, | ||
1118 | usb_rcvbulkpipe(serial->dev, | ||
1119 | port->bulk_in_endpointAddress), | ||
1120 | port->bulk_in_buffer, | ||
1121 | mos7840_port->read_urb->transfer_buffer_length, | ||
1122 | mos7840_bulk_in_callback, mos7840_port); | ||
1123 | } | ||
1112 | 1124 | ||
1113 | dbg("mos7840_open: bulkin endpoint is %d", | 1125 | dbg("mos7840_open: bulkin endpoint is %d", |
1114 | port->bulk_in_endpointAddress); | 1126 | port->bulk_in_endpointAddress); |
@@ -1509,7 +1521,7 @@ static int mos7840_write(struct tty_struct *tty, struct usb_serial_port *port, | |||
1509 | kmalloc(URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL); | 1521 | kmalloc(URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL); |
1510 | 1522 | ||
1511 | if (urb->transfer_buffer == NULL) { | 1523 | if (urb->transfer_buffer == NULL) { |
1512 | dev_err(&port->dev, "%s no more kernel memory...\n", | 1524 | dev_err_console(port, "%s no more kernel memory...\n", |
1513 | __func__); | 1525 | __func__); |
1514 | goto exit; | 1526 | goto exit; |
1515 | } | 1527 | } |
@@ -1519,13 +1531,25 @@ static int mos7840_write(struct tty_struct *tty, struct usb_serial_port *port, | |||
1519 | memcpy(urb->transfer_buffer, current_position, transfer_size); | 1531 | memcpy(urb->transfer_buffer, current_position, transfer_size); |
1520 | 1532 | ||
1521 | /* fill urb with data and submit */ | 1533 | /* fill urb with data and submit */ |
1522 | usb_fill_bulk_urb(urb, | 1534 | if ((serial->num_ports == 2) |
1523 | serial->dev, | 1535 | && ((((__u16)port->number - |
1524 | usb_sndbulkpipe(serial->dev, | 1536 | (__u16)(port->serial->minor)) % 2) != 0)) { |
1525 | port->bulk_out_endpointAddress), | 1537 | usb_fill_bulk_urb(urb, |
1526 | urb->transfer_buffer, | 1538 | serial->dev, |
1527 | transfer_size, | 1539 | usb_sndbulkpipe(serial->dev, |
1528 | mos7840_bulk_out_data_callback, mos7840_port); | 1540 | (port->bulk_out_endpointAddress) + 2), |
1541 | urb->transfer_buffer, | ||
1542 | transfer_size, | ||
1543 | mos7840_bulk_out_data_callback, mos7840_port); | ||
1544 | } else { | ||
1545 | usb_fill_bulk_urb(urb, | ||
1546 | serial->dev, | ||
1547 | usb_sndbulkpipe(serial->dev, | ||
1548 | port->bulk_out_endpointAddress), | ||
1549 | urb->transfer_buffer, | ||
1550 | transfer_size, | ||
1551 | mos7840_bulk_out_data_callback, mos7840_port); | ||
1552 | } | ||
1529 | 1553 | ||
1530 | data1 = urb->transfer_buffer; | 1554 | data1 = urb->transfer_buffer; |
1531 | dbg("bulkout endpoint is %d", port->bulk_out_endpointAddress); | 1555 | dbg("bulkout endpoint is %d", port->bulk_out_endpointAddress); |
@@ -1535,7 +1559,7 @@ static int mos7840_write(struct tty_struct *tty, struct usb_serial_port *port, | |||
1535 | 1559 | ||
1536 | if (status) { | 1560 | if (status) { |
1537 | mos7840_port->busy[i] = 0; | 1561 | mos7840_port->busy[i] = 0; |
1538 | dev_err(&port->dev, "%s - usb_submit_urb(write bulk) failed " | 1562 | dev_err_console(port, "%s - usb_submit_urb(write bulk) failed " |
1539 | "with status = %d\n", __func__, status); | 1563 | "with status = %d\n", __func__, status); |
1540 | bytes_sent = status; | 1564 | bytes_sent = status; |
1541 | goto exit; | 1565 | goto exit; |
@@ -1838,7 +1862,7 @@ static int mos7840_send_cmd_write_baud_rate(struct moschip_port *mos7840_port, | |||
1838 | 1862 | ||
1839 | } else { | 1863 | } else { |
1840 | #ifdef HW_flow_control | 1864 | #ifdef HW_flow_control |
1841 | / *setting h/w flow control bit to 0 */ | 1865 | /* setting h/w flow control bit to 0 */ |
1842 | Data = 0xb; | 1866 | Data = 0xb; |
1843 | mos7840_port->shadowMCR = Data; | 1867 | mos7840_port->shadowMCR = Data; |
1844 | status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, | 1868 | status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, |
@@ -2305,19 +2329,26 @@ static int mos7840_ioctl(struct tty_struct *tty, | |||
2305 | 2329 | ||
2306 | static int mos7840_calc_num_ports(struct usb_serial *serial) | 2330 | static int mos7840_calc_num_ports(struct usb_serial *serial) |
2307 | { | 2331 | { |
2308 | int mos7840_num_ports = 0; | 2332 | __u16 Data = 0x00; |
2309 | 2333 | int ret = 0; | |
2310 | dbg("numberofendpoints: cur %d, alt %d", | 2334 | int mos7840_num_ports; |
2311 | (int)serial->interface->cur_altsetting->desc.bNumEndpoints, | 2335 | |
2312 | (int)serial->interface->altsetting->desc.bNumEndpoints); | 2336 | ret = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), |
2313 | if (serial->interface->cur_altsetting->desc.bNumEndpoints == 5) { | 2337 | MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, &Data, |
2314 | mos7840_num_ports = serial->num_ports = 2; | 2338 | VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); |
2315 | } else if (serial->interface->cur_altsetting->desc.bNumEndpoints == 9) { | 2339 | |
2340 | if ((Data & 0x01) == 0) { | ||
2341 | mos7840_num_ports = 2; | ||
2342 | serial->num_bulk_in = 2; | ||
2343 | serial->num_bulk_out = 2; | ||
2344 | serial->num_ports = 2; | ||
2345 | } else { | ||
2346 | mos7840_num_ports = 4; | ||
2316 | serial->num_bulk_in = 4; | 2347 | serial->num_bulk_in = 4; |
2317 | serial->num_bulk_out = 4; | 2348 | serial->num_bulk_out = 4; |
2318 | mos7840_num_ports = serial->num_ports = 4; | 2349 | serial->num_ports = 4; |
2319 | } | 2350 | } |
2320 | dbg ("mos7840_num_ports = %d", mos7840_num_ports); | 2351 | |
2321 | return mos7840_num_ports; | 2352 | return mos7840_num_ports; |
2322 | } | 2353 | } |
2323 | 2354 | ||
@@ -2638,7 +2669,6 @@ static struct usb_driver io_driver = { | |||
2638 | .probe = usb_serial_probe, | 2669 | .probe = usb_serial_probe, |
2639 | .disconnect = usb_serial_disconnect, | 2670 | .disconnect = usb_serial_disconnect, |
2640 | .id_table = moschip_id_table_combined, | 2671 | .id_table = moschip_id_table_combined, |
2641 | .no_dynamic_id = 1, | ||
2642 | }; | 2672 | }; |
2643 | 2673 | ||
2644 | static struct usb_serial_driver moschip7840_4port_device = { | 2674 | static struct usb_serial_driver moschip7840_4port_device = { |
@@ -2647,7 +2677,6 @@ static struct usb_serial_driver moschip7840_4port_device = { | |||
2647 | .name = "mos7840", | 2677 | .name = "mos7840", |
2648 | }, | 2678 | }, |
2649 | .description = DRIVER_DESC, | 2679 | .description = DRIVER_DESC, |
2650 | .usb_driver = &io_driver, | ||
2651 | .id_table = moschip_port_id_table, | 2680 | .id_table = moschip_port_id_table, |
2652 | .num_ports = 4, | 2681 | .num_ports = 4, |
2653 | .open = mos7840_open, | 2682 | .open = mos7840_open, |
@@ -2674,57 +2703,12 @@ static struct usb_serial_driver moschip7840_4port_device = { | |||
2674 | .read_int_callback = mos7840_interrupt_callback, | 2703 | .read_int_callback = mos7840_interrupt_callback, |
2675 | }; | 2704 | }; |
2676 | 2705 | ||
2677 | /**************************************************************************** | 2706 | static struct usb_serial_driver * const serial_drivers[] = { |
2678 | * moschip7840_init | 2707 | &moschip7840_4port_device, NULL |
2679 | * This is called by the module subsystem, or on startup to initialize us | 2708 | }; |
2680 | ****************************************************************************/ | ||
2681 | static int __init moschip7840_init(void) | ||
2682 | { | ||
2683 | int retval; | ||
2684 | |||
2685 | dbg("%s", " mos7840_init :entering.........."); | ||
2686 | |||
2687 | /* Register with the usb serial */ | ||
2688 | retval = usb_serial_register(&moschip7840_4port_device); | ||
2689 | |||
2690 | if (retval) | ||
2691 | goto failed_port_device_register; | ||
2692 | |||
2693 | dbg("%s", "Entering..."); | ||
2694 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
2695 | DRIVER_DESC "\n"); | ||
2696 | |||
2697 | /* Register with the usb */ | ||
2698 | retval = usb_register(&io_driver); | ||
2699 | if (retval == 0) { | ||
2700 | dbg("%s", "Leaving..."); | ||
2701 | return 0; | ||
2702 | } | ||
2703 | usb_serial_deregister(&moschip7840_4port_device); | ||
2704 | failed_port_device_register: | ||
2705 | return retval; | ||
2706 | } | ||
2707 | |||
2708 | /**************************************************************************** | ||
2709 | * moschip7840_exit | ||
2710 | * Called when the driver is about to be unloaded. | ||
2711 | ****************************************************************************/ | ||
2712 | static void __exit moschip7840_exit(void) | ||
2713 | { | ||
2714 | |||
2715 | dbg("%s", " mos7840_exit :entering.........."); | ||
2716 | |||
2717 | usb_deregister(&io_driver); | ||
2718 | |||
2719 | usb_serial_deregister(&moschip7840_4port_device); | ||
2720 | |||
2721 | dbg("%s", "Entering..."); | ||
2722 | } | ||
2723 | 2709 | ||
2724 | module_init(moschip7840_init); | 2710 | module_usb_serial_driver(io_driver, serial_drivers); |
2725 | module_exit(moschip7840_exit); | ||
2726 | 2711 | ||
2727 | /* Module information */ | ||
2728 | MODULE_DESCRIPTION(DRIVER_DESC); | 2712 | MODULE_DESCRIPTION(DRIVER_DESC); |
2729 | MODULE_LICENSE("GPL"); | 2713 | MODULE_LICENSE("GPL"); |
2730 | 2714 | ||
diff --git a/drivers/usb/serial/moto_modem.c b/drivers/usb/serial/moto_modem.c index e2bfecc46402..3ab6214b4bbf 100644 --- a/drivers/usb/serial/moto_modem.c +++ b/drivers/usb/serial/moto_modem.c | |||
@@ -36,7 +36,6 @@ static struct usb_driver moto_driver = { | |||
36 | .probe = usb_serial_probe, | 36 | .probe = usb_serial_probe, |
37 | .disconnect = usb_serial_disconnect, | 37 | .disconnect = usb_serial_disconnect, |
38 | .id_table = id_table, | 38 | .id_table = id_table, |
39 | .no_dynamic_id = 1, | ||
40 | }; | 39 | }; |
41 | 40 | ||
42 | static struct usb_serial_driver moto_device = { | 41 | static struct usb_serial_driver moto_device = { |
@@ -45,29 +44,12 @@ static struct usb_serial_driver moto_device = { | |||
45 | .name = "moto-modem", | 44 | .name = "moto-modem", |
46 | }, | 45 | }, |
47 | .id_table = id_table, | 46 | .id_table = id_table, |
48 | .usb_driver = &moto_driver, | ||
49 | .num_ports = 1, | 47 | .num_ports = 1, |
50 | }; | 48 | }; |
51 | 49 | ||
52 | static int __init moto_init(void) | 50 | static struct usb_serial_driver * const serial_drivers[] = { |
53 | { | 51 | &moto_device, NULL |
54 | int retval; | 52 | }; |
55 | |||
56 | retval = usb_serial_register(&moto_device); | ||
57 | if (retval) | ||
58 | return retval; | ||
59 | retval = usb_register(&moto_driver); | ||
60 | if (retval) | ||
61 | usb_serial_deregister(&moto_device); | ||
62 | return retval; | ||
63 | } | ||
64 | |||
65 | static void __exit moto_exit(void) | ||
66 | { | ||
67 | usb_deregister(&moto_driver); | ||
68 | usb_serial_deregister(&moto_device); | ||
69 | } | ||
70 | 53 | ||
71 | module_init(moto_init); | 54 | module_usb_serial_driver(moto_driver, serial_drivers); |
72 | module_exit(moto_exit); | ||
73 | MODULE_LICENSE("GPL"); | 55 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/serial/navman.c b/drivers/usb/serial/navman.c index b28f1db0195f..29ab6eb5b536 100644 --- a/drivers/usb/serial/navman.c +++ b/drivers/usb/serial/navman.c | |||
@@ -35,7 +35,6 @@ static struct usb_driver navman_driver = { | |||
35 | .probe = usb_serial_probe, | 35 | .probe = usb_serial_probe, |
36 | .disconnect = usb_serial_disconnect, | 36 | .disconnect = usb_serial_disconnect, |
37 | .id_table = id_table, | 37 | .id_table = id_table, |
38 | .no_dynamic_id = 1, | ||
39 | }; | 38 | }; |
40 | 39 | ||
41 | static void navman_read_int_callback(struct urb *urb) | 40 | static void navman_read_int_callback(struct urb *urb) |
@@ -122,7 +121,6 @@ static struct usb_serial_driver navman_device = { | |||
122 | .name = "navman", | 121 | .name = "navman", |
123 | }, | 122 | }, |
124 | .id_table = id_table, | 123 | .id_table = id_table, |
125 | .usb_driver = &navman_driver, | ||
126 | .num_ports = 1, | 124 | .num_ports = 1, |
127 | .open = navman_open, | 125 | .open = navman_open, |
128 | .close = navman_close, | 126 | .close = navman_close, |
@@ -130,27 +128,12 @@ static struct usb_serial_driver navman_device = { | |||
130 | .read_int_callback = navman_read_int_callback, | 128 | .read_int_callback = navman_read_int_callback, |
131 | }; | 129 | }; |
132 | 130 | ||
133 | static int __init navman_init(void) | 131 | static struct usb_serial_driver * const serial_drivers[] = { |
134 | { | 132 | &navman_device, NULL |
135 | int retval; | 133 | }; |
136 | |||
137 | retval = usb_serial_register(&navman_device); | ||
138 | if (retval) | ||
139 | return retval; | ||
140 | retval = usb_register(&navman_driver); | ||
141 | if (retval) | ||
142 | usb_serial_deregister(&navman_device); | ||
143 | return retval; | ||
144 | } | ||
145 | 134 | ||
146 | static void __exit navman_exit(void) | 135 | module_usb_serial_driver(navman_driver, serial_drivers); |
147 | { | ||
148 | usb_deregister(&navman_driver); | ||
149 | usb_serial_deregister(&navman_device); | ||
150 | } | ||
151 | 136 | ||
152 | module_init(navman_init); | ||
153 | module_exit(navman_exit); | ||
154 | MODULE_LICENSE("GPL"); | 137 | MODULE_LICENSE("GPL"); |
155 | 138 | ||
156 | module_param(debug, bool, S_IRUGO | S_IWUSR); | 139 | module_param(debug, bool, S_IRUGO | S_IWUSR); |
diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c index 8b8d58a2ac12..88dc785bb298 100644 --- a/drivers/usb/serial/omninet.c +++ b/drivers/usb/serial/omninet.c | |||
@@ -62,7 +62,6 @@ static struct usb_driver omninet_driver = { | |||
62 | .probe = usb_serial_probe, | 62 | .probe = usb_serial_probe, |
63 | .disconnect = usb_serial_disconnect, | 63 | .disconnect = usb_serial_disconnect, |
64 | .id_table = id_table, | 64 | .id_table = id_table, |
65 | .no_dynamic_id = 1, | ||
66 | }; | 65 | }; |
67 | 66 | ||
68 | 67 | ||
@@ -72,7 +71,6 @@ static struct usb_serial_driver zyxel_omninet_device = { | |||
72 | .name = "omninet", | 71 | .name = "omninet", |
73 | }, | 72 | }, |
74 | .description = "ZyXEL - omni.net lcd plus usb", | 73 | .description = "ZyXEL - omni.net lcd plus usb", |
75 | .usb_driver = &omninet_driver, | ||
76 | .id_table = id_table, | 74 | .id_table = id_table, |
77 | .num_ports = 1, | 75 | .num_ports = 1, |
78 | .attach = omninet_attach, | 76 | .attach = omninet_attach, |
@@ -86,6 +84,10 @@ static struct usb_serial_driver zyxel_omninet_device = { | |||
86 | .release = omninet_release, | 84 | .release = omninet_release, |
87 | }; | 85 | }; |
88 | 86 | ||
87 | static struct usb_serial_driver * const serial_drivers[] = { | ||
88 | &zyxel_omninet_device, NULL | ||
89 | }; | ||
90 | |||
89 | 91 | ||
90 | /* The protocol. | 92 | /* The protocol. |
91 | * | 93 | * |
@@ -254,7 +256,7 @@ static int omninet_write(struct tty_struct *tty, struct usb_serial_port *port, | |||
254 | result = usb_submit_urb(wport->write_urb, GFP_ATOMIC); | 256 | result = usb_submit_urb(wport->write_urb, GFP_ATOMIC); |
255 | if (result) { | 257 | if (result) { |
256 | set_bit(0, &wport->write_urbs_free); | 258 | set_bit(0, &wport->write_urbs_free); |
257 | dev_err(&port->dev, | 259 | dev_err_console(port, |
258 | "%s - failed submitting write urb, error %d\n", | 260 | "%s - failed submitting write urb, error %d\n", |
259 | __func__, result); | 261 | __func__, result); |
260 | } else | 262 | } else |
@@ -319,35 +321,7 @@ static void omninet_release(struct usb_serial *serial) | |||
319 | kfree(usb_get_serial_port_data(port)); | 321 | kfree(usb_get_serial_port_data(port)); |
320 | } | 322 | } |
321 | 323 | ||
322 | 324 | module_usb_serial_driver(omninet_driver, serial_drivers); | |
323 | static int __init omninet_init(void) | ||
324 | { | ||
325 | int retval; | ||
326 | retval = usb_serial_register(&zyxel_omninet_device); | ||
327 | if (retval) | ||
328 | goto failed_usb_serial_register; | ||
329 | retval = usb_register(&omninet_driver); | ||
330 | if (retval) | ||
331 | goto failed_usb_register; | ||
332 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
333 | DRIVER_DESC "\n"); | ||
334 | return 0; | ||
335 | failed_usb_register: | ||
336 | usb_serial_deregister(&zyxel_omninet_device); | ||
337 | failed_usb_serial_register: | ||
338 | return retval; | ||
339 | } | ||
340 | |||
341 | |||
342 | static void __exit omninet_exit(void) | ||
343 | { | ||
344 | usb_deregister(&omninet_driver); | ||
345 | usb_serial_deregister(&zyxel_omninet_device); | ||
346 | } | ||
347 | |||
348 | |||
349 | module_init(omninet_init); | ||
350 | module_exit(omninet_exit); | ||
351 | 325 | ||
352 | MODULE_AUTHOR(DRIVER_AUTHOR); | 326 | MODULE_AUTHOR(DRIVER_AUTHOR); |
353 | MODULE_DESCRIPTION(DRIVER_DESC); | 327 | MODULE_DESCRIPTION(DRIVER_DESC); |
diff --git a/drivers/usb/serial/opticon.c b/drivers/usb/serial/opticon.c index 262ded9e076b..82cc9d202b83 100644 --- a/drivers/usb/serial/opticon.c +++ b/drivers/usb/serial/opticon.c | |||
@@ -604,7 +604,6 @@ static struct usb_driver opticon_driver = { | |||
604 | .suspend = opticon_suspend, | 604 | .suspend = opticon_suspend, |
605 | .resume = opticon_resume, | 605 | .resume = opticon_resume, |
606 | .id_table = id_table, | 606 | .id_table = id_table, |
607 | .no_dynamic_id = 1, | ||
608 | }; | 607 | }; |
609 | 608 | ||
610 | static struct usb_serial_driver opticon_device = { | 609 | static struct usb_serial_driver opticon_device = { |
@@ -613,7 +612,6 @@ static struct usb_serial_driver opticon_device = { | |||
613 | .name = "opticon", | 612 | .name = "opticon", |
614 | }, | 613 | }, |
615 | .id_table = id_table, | 614 | .id_table = id_table, |
616 | .usb_driver = &opticon_driver, | ||
617 | .num_ports = 1, | 615 | .num_ports = 1, |
618 | .attach = opticon_startup, | 616 | .attach = opticon_startup, |
619 | .open = opticon_open, | 617 | .open = opticon_open, |
@@ -629,27 +627,12 @@ static struct usb_serial_driver opticon_device = { | |||
629 | .tiocmset = opticon_tiocmset, | 627 | .tiocmset = opticon_tiocmset, |
630 | }; | 628 | }; |
631 | 629 | ||
632 | static int __init opticon_init(void) | 630 | static struct usb_serial_driver * const serial_drivers[] = { |
633 | { | 631 | &opticon_device, NULL |
634 | int retval; | 632 | }; |
635 | |||
636 | retval = usb_serial_register(&opticon_device); | ||
637 | if (retval) | ||
638 | return retval; | ||
639 | retval = usb_register(&opticon_driver); | ||
640 | if (retval) | ||
641 | usb_serial_deregister(&opticon_device); | ||
642 | return retval; | ||
643 | } | ||
644 | 633 | ||
645 | static void __exit opticon_exit(void) | 634 | module_usb_serial_driver(opticon_driver, serial_drivers); |
646 | { | ||
647 | usb_deregister(&opticon_driver); | ||
648 | usb_serial_deregister(&opticon_device); | ||
649 | } | ||
650 | 635 | ||
651 | module_init(opticon_init); | ||
652 | module_exit(opticon_exit); | ||
653 | MODULE_DESCRIPTION(DRIVER_DESC); | 636 | MODULE_DESCRIPTION(DRIVER_DESC); |
654 | MODULE_LICENSE("GPL"); | 637 | MODULE_LICENSE("GPL"); |
655 | 638 | ||
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index b54afceb9611..6815701cf656 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -307,6 +307,9 @@ static void option_instat_callback(struct urb *urb); | |||
307 | #define TELIT_VENDOR_ID 0x1bc7 | 307 | #define TELIT_VENDOR_ID 0x1bc7 |
308 | #define TELIT_PRODUCT_UC864E 0x1003 | 308 | #define TELIT_PRODUCT_UC864E 0x1003 |
309 | #define TELIT_PRODUCT_UC864G 0x1004 | 309 | #define TELIT_PRODUCT_UC864G 0x1004 |
310 | #define TELIT_PRODUCT_CC864_DUAL 0x1005 | ||
311 | #define TELIT_PRODUCT_CC864_SINGLE 0x1006 | ||
312 | #define TELIT_PRODUCT_DE910_DUAL 0x1010 | ||
310 | 313 | ||
311 | /* ZTE PRODUCTS */ | 314 | /* ZTE PRODUCTS */ |
312 | #define ZTE_VENDOR_ID 0x19d2 | 315 | #define ZTE_VENDOR_ID 0x19d2 |
@@ -484,6 +487,9 @@ static void option_instat_callback(struct urb *urb); | |||
484 | #define LG_VENDOR_ID 0x1004 | 487 | #define LG_VENDOR_ID 0x1004 |
485 | #define LG_PRODUCT_L02C 0x618f | 488 | #define LG_PRODUCT_L02C 0x618f |
486 | 489 | ||
490 | /* MediaTek products */ | ||
491 | #define MEDIATEK_VENDOR_ID 0x0e8d | ||
492 | |||
487 | /* some devices interfaces need special handling due to a number of reasons */ | 493 | /* some devices interfaces need special handling due to a number of reasons */ |
488 | enum option_blacklist_reason { | 494 | enum option_blacklist_reason { |
489 | OPTION_BLACKLIST_NONE = 0, | 495 | OPTION_BLACKLIST_NONE = 0, |
@@ -768,6 +774,9 @@ static const struct usb_device_id option_ids[] = { | |||
768 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6008) }, | 774 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6008) }, |
769 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, | 775 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, |
770 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) }, | 776 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) }, |
777 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_DUAL) }, | ||
778 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_SINGLE) }, | ||
779 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_DE910_DUAL) }, | ||
771 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ | 780 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ |
772 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff), | 781 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff), |
773 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, | 782 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, |
@@ -892,6 +901,8 @@ static const struct usb_device_id option_ids[] = { | |||
892 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0162, 0xff, 0xff, 0xff) }, | 901 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0162, 0xff, 0xff, 0xff) }, |
893 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0164, 0xff, 0xff, 0xff) }, | 902 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0164, 0xff, 0xff, 0xff) }, |
894 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0165, 0xff, 0xff, 0xff) }, | 903 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0165, 0xff, 0xff, 0xff) }, |
904 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0167, 0xff, 0xff, 0xff), | ||
905 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
895 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff) }, | 906 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff) }, |
896 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff) }, | 907 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff) }, |
897 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff) }, | 908 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff) }, |
@@ -1198,6 +1209,10 @@ static const struct usb_device_id option_ids[] = { | |||
1198 | { USB_DEVICE_AND_INTERFACE_INFO(VIETTEL_VENDOR_ID, VIETTEL_PRODUCT_VT1000, 0xff, 0xff, 0xff) }, | 1209 | { USB_DEVICE_AND_INTERFACE_INFO(VIETTEL_VENDOR_ID, VIETTEL_PRODUCT_VT1000, 0xff, 0xff, 0xff) }, |
1199 | { USB_DEVICE_AND_INTERFACE_INFO(ZD_VENDOR_ID, ZD_PRODUCT_7000, 0xff, 0xff, 0xff) }, | 1210 | { USB_DEVICE_AND_INTERFACE_INFO(ZD_VENDOR_ID, ZD_PRODUCT_7000, 0xff, 0xff, 0xff) }, |
1200 | { USB_DEVICE(LG_VENDOR_ID, LG_PRODUCT_L02C) }, /* docomo L-02C modem */ | 1211 | { USB_DEVICE(LG_VENDOR_ID, LG_PRODUCT_L02C) }, /* docomo L-02C modem */ |
1212 | { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, 0x00a1, 0xff, 0x00, 0x00) }, | ||
1213 | { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, 0x00a1, 0xff, 0x02, 0x01) }, | ||
1214 | { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, 0x00a2, 0xff, 0x00, 0x00) }, | ||
1215 | { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, 0x00a2, 0xff, 0x02, 0x01) }, /* MediaTek MT6276M modem & app port */ | ||
1201 | { } /* Terminating entry */ | 1216 | { } /* Terminating entry */ |
1202 | }; | 1217 | }; |
1203 | MODULE_DEVICE_TABLE(usb, option_ids); | 1218 | MODULE_DEVICE_TABLE(usb, option_ids); |
@@ -1212,7 +1227,6 @@ static struct usb_driver option_driver = { | |||
1212 | .supports_autosuspend = 1, | 1227 | .supports_autosuspend = 1, |
1213 | #endif | 1228 | #endif |
1214 | .id_table = option_ids, | 1229 | .id_table = option_ids, |
1215 | .no_dynamic_id = 1, | ||
1216 | }; | 1230 | }; |
1217 | 1231 | ||
1218 | /* The card has three separate interfaces, which the serial driver | 1232 | /* The card has three separate interfaces, which the serial driver |
@@ -1225,7 +1239,6 @@ static struct usb_serial_driver option_1port_device = { | |||
1225 | .name = "option1", | 1239 | .name = "option1", |
1226 | }, | 1240 | }, |
1227 | .description = "GSM modem (1-port)", | 1241 | .description = "GSM modem (1-port)", |
1228 | .usb_driver = &option_driver, | ||
1229 | .id_table = option_ids, | 1242 | .id_table = option_ids, |
1230 | .num_ports = 1, | 1243 | .num_ports = 1, |
1231 | .probe = option_probe, | 1244 | .probe = option_probe, |
@@ -1249,6 +1262,10 @@ static struct usb_serial_driver option_1port_device = { | |||
1249 | #endif | 1262 | #endif |
1250 | }; | 1263 | }; |
1251 | 1264 | ||
1265 | static struct usb_serial_driver * const serial_drivers[] = { | ||
1266 | &option_1port_device, NULL | ||
1267 | }; | ||
1268 | |||
1252 | static bool debug; | 1269 | static bool debug; |
1253 | 1270 | ||
1254 | /* per port private data */ | 1271 | /* per port private data */ |
@@ -1280,36 +1297,7 @@ struct option_port_private { | |||
1280 | unsigned long tx_start_time[N_OUT_URB]; | 1297 | unsigned long tx_start_time[N_OUT_URB]; |
1281 | }; | 1298 | }; |
1282 | 1299 | ||
1283 | /* Functions used by new usb-serial code. */ | 1300 | module_usb_serial_driver(option_driver, serial_drivers); |
1284 | static int __init option_init(void) | ||
1285 | { | ||
1286 | int retval; | ||
1287 | retval = usb_serial_register(&option_1port_device); | ||
1288 | if (retval) | ||
1289 | goto failed_1port_device_register; | ||
1290 | retval = usb_register(&option_driver); | ||
1291 | if (retval) | ||
1292 | goto failed_driver_register; | ||
1293 | |||
1294 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
1295 | DRIVER_DESC "\n"); | ||
1296 | |||
1297 | return 0; | ||
1298 | |||
1299 | failed_driver_register: | ||
1300 | usb_serial_deregister(&option_1port_device); | ||
1301 | failed_1port_device_register: | ||
1302 | return retval; | ||
1303 | } | ||
1304 | |||
1305 | static void __exit option_exit(void) | ||
1306 | { | ||
1307 | usb_deregister(&option_driver); | ||
1308 | usb_serial_deregister(&option_1port_device); | ||
1309 | } | ||
1310 | |||
1311 | module_init(option_init); | ||
1312 | module_exit(option_exit); | ||
1313 | 1301 | ||
1314 | static bool is_blacklisted(const u8 ifnum, enum option_blacklist_reason reason, | 1302 | static bool is_blacklisted(const u8 ifnum, enum option_blacklist_reason reason, |
1315 | const struct option_blacklist_info *blacklist) | 1303 | const struct option_blacklist_info *blacklist) |
@@ -1360,6 +1348,7 @@ static int option_probe(struct usb_serial *serial, | |||
1360 | serial->interface->cur_altsetting->desc.bInterfaceNumber, | 1348 | serial->interface->cur_altsetting->desc.bInterfaceNumber, |
1361 | OPTION_BLACKLIST_RESERVED_IF, | 1349 | OPTION_BLACKLIST_RESERVED_IF, |
1362 | (const struct option_blacklist_info *) id->driver_info)) | 1350 | (const struct option_blacklist_info *) id->driver_info)) |
1351 | return -ENODEV; | ||
1363 | 1352 | ||
1364 | /* Don't bind network interface on Samsung GT-B3730, it is handled by a separate module */ | 1353 | /* Don't bind network interface on Samsung GT-B3730, it is handled by a separate module */ |
1365 | if (serial->dev->descriptor.idVendor == SAMSUNG_VENDOR_ID && | 1354 | if (serial->dev->descriptor.idVendor == SAMSUNG_VENDOR_ID && |
diff --git a/drivers/usb/serial/oti6858.c b/drivers/usb/serial/oti6858.c index e287fd32682c..5fdc33c6a3c0 100644 --- a/drivers/usb/serial/oti6858.c +++ b/drivers/usb/serial/oti6858.c | |||
@@ -71,7 +71,6 @@ static struct usb_driver oti6858_driver = { | |||
71 | .probe = usb_serial_probe, | 71 | .probe = usb_serial_probe, |
72 | .disconnect = usb_serial_disconnect, | 72 | .disconnect = usb_serial_disconnect, |
73 | .id_table = id_table, | 73 | .id_table = id_table, |
74 | .no_dynamic_id = 1, | ||
75 | }; | 74 | }; |
76 | 75 | ||
77 | static bool debug; | 76 | static bool debug; |
@@ -157,7 +156,6 @@ static struct usb_serial_driver oti6858_device = { | |||
157 | .name = "oti6858", | 156 | .name = "oti6858", |
158 | }, | 157 | }, |
159 | .id_table = id_table, | 158 | .id_table = id_table, |
160 | .usb_driver = &oti6858_driver, | ||
161 | .num_ports = 1, | 159 | .num_ports = 1, |
162 | .open = oti6858_open, | 160 | .open = oti6858_open, |
163 | .close = oti6858_close, | 161 | .close = oti6858_close, |
@@ -176,6 +174,10 @@ static struct usb_serial_driver oti6858_device = { | |||
176 | .release = oti6858_release, | 174 | .release = oti6858_release, |
177 | }; | 175 | }; |
178 | 176 | ||
177 | static struct usb_serial_driver * const serial_drivers[] = { | ||
178 | &oti6858_device, NULL | ||
179 | }; | ||
180 | |||
179 | struct oti6858_private { | 181 | struct oti6858_private { |
180 | spinlock_t lock; | 182 | spinlock_t lock; |
181 | 183 | ||
@@ -302,7 +304,7 @@ static void send_data(struct work_struct *work) | |||
302 | if (count != 0) { | 304 | if (count != 0) { |
303 | allow = kmalloc(1, GFP_KERNEL); | 305 | allow = kmalloc(1, GFP_KERNEL); |
304 | if (!allow) { | 306 | if (!allow) { |
305 | dev_err(&port->dev, "%s(): kmalloc failed\n", | 307 | dev_err_console(port, "%s(): kmalloc failed\n", |
306 | __func__); | 308 | __func__); |
307 | return; | 309 | return; |
308 | } | 310 | } |
@@ -334,7 +336,7 @@ static void send_data(struct work_struct *work) | |||
334 | port->write_urb->transfer_buffer_length = count; | 336 | port->write_urb->transfer_buffer_length = count; |
335 | result = usb_submit_urb(port->write_urb, GFP_NOIO); | 337 | result = usb_submit_urb(port->write_urb, GFP_NOIO); |
336 | if (result != 0) { | 338 | if (result != 0) { |
337 | dev_err(&port->dev, "%s(): usb_submit_urb() failed" | 339 | dev_err_console(port, "%s(): usb_submit_urb() failed" |
338 | " with error %d\n", __func__, result); | 340 | " with error %d\n", __func__, result); |
339 | priv->flags.write_urb_in_use = 0; | 341 | priv->flags.write_urb_in_use = 0; |
340 | } | 342 | } |
@@ -938,7 +940,7 @@ static void oti6858_write_bulk_callback(struct urb *urb) | |||
938 | port->write_urb->transfer_buffer_length = 1; | 940 | port->write_urb->transfer_buffer_length = 1; |
939 | result = usb_submit_urb(port->write_urb, GFP_ATOMIC); | 941 | result = usb_submit_urb(port->write_urb, GFP_ATOMIC); |
940 | if (result) { | 942 | if (result) { |
941 | dev_err(&port->dev, "%s(): usb_submit_urb() failed," | 943 | dev_err_console(port, "%s(): usb_submit_urb() failed," |
942 | " error %d\n", __func__, result); | 944 | " error %d\n", __func__, result); |
943 | } else { | 945 | } else { |
944 | return; | 946 | return; |
@@ -956,29 +958,7 @@ static void oti6858_write_bulk_callback(struct urb *urb) | |||
956 | } | 958 | } |
957 | } | 959 | } |
958 | 960 | ||
959 | /* module description and (de)initialization */ | 961 | module_usb_serial_driver(oti6858_driver, serial_drivers); |
960 | |||
961 | static int __init oti6858_init(void) | ||
962 | { | ||
963 | int retval; | ||
964 | |||
965 | retval = usb_serial_register(&oti6858_device); | ||
966 | if (retval == 0) { | ||
967 | retval = usb_register(&oti6858_driver); | ||
968 | if (retval) | ||
969 | usb_serial_deregister(&oti6858_device); | ||
970 | } | ||
971 | return retval; | ||
972 | } | ||
973 | |||
974 | static void __exit oti6858_exit(void) | ||
975 | { | ||
976 | usb_deregister(&oti6858_driver); | ||
977 | usb_serial_deregister(&oti6858_device); | ||
978 | } | ||
979 | |||
980 | module_init(oti6858_init); | ||
981 | module_exit(oti6858_exit); | ||
982 | 962 | ||
983 | MODULE_DESCRIPTION(OTI6858_DESCRIPTION); | 963 | MODULE_DESCRIPTION(OTI6858_DESCRIPTION); |
984 | MODULE_AUTHOR(OTI6858_AUTHOR); | 964 | MODULE_AUTHOR(OTI6858_AUTHOR); |
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index 3d8cda57ce7a..ff4a174fa5de 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c | |||
@@ -104,7 +104,6 @@ static struct usb_driver pl2303_driver = { | |||
104 | .id_table = id_table, | 104 | .id_table = id_table, |
105 | .suspend = usb_serial_suspend, | 105 | .suspend = usb_serial_suspend, |
106 | .resume = usb_serial_resume, | 106 | .resume = usb_serial_resume, |
107 | .no_dynamic_id = 1, | ||
108 | .supports_autosuspend = 1, | 107 | .supports_autosuspend = 1, |
109 | }; | 108 | }; |
110 | 109 | ||
@@ -834,7 +833,6 @@ static struct usb_serial_driver pl2303_device = { | |||
834 | .name = "pl2303", | 833 | .name = "pl2303", |
835 | }, | 834 | }, |
836 | .id_table = id_table, | 835 | .id_table = id_table, |
837 | .usb_driver = &pl2303_driver, | ||
838 | .num_ports = 1, | 836 | .num_ports = 1, |
839 | .bulk_in_size = 256, | 837 | .bulk_in_size = 256, |
840 | .bulk_out_size = 256, | 838 | .bulk_out_size = 256, |
@@ -853,32 +851,11 @@ static struct usb_serial_driver pl2303_device = { | |||
853 | .release = pl2303_release, | 851 | .release = pl2303_release, |
854 | }; | 852 | }; |
855 | 853 | ||
856 | static int __init pl2303_init(void) | 854 | static struct usb_serial_driver * const serial_drivers[] = { |
857 | { | 855 | &pl2303_device, NULL |
858 | int retval; | 856 | }; |
859 | |||
860 | retval = usb_serial_register(&pl2303_device); | ||
861 | if (retval) | ||
862 | goto failed_usb_serial_register; | ||
863 | retval = usb_register(&pl2303_driver); | ||
864 | if (retval) | ||
865 | goto failed_usb_register; | ||
866 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n"); | ||
867 | return 0; | ||
868 | failed_usb_register: | ||
869 | usb_serial_deregister(&pl2303_device); | ||
870 | failed_usb_serial_register: | ||
871 | return retval; | ||
872 | } | ||
873 | |||
874 | static void __exit pl2303_exit(void) | ||
875 | { | ||
876 | usb_deregister(&pl2303_driver); | ||
877 | usb_serial_deregister(&pl2303_device); | ||
878 | } | ||
879 | 857 | ||
880 | module_init(pl2303_init); | 858 | module_usb_serial_driver(pl2303_driver, serial_drivers); |
881 | module_exit(pl2303_exit); | ||
882 | 859 | ||
883 | MODULE_DESCRIPTION(DRIVER_DESC); | 860 | MODULE_DESCRIPTION(DRIVER_DESC); |
884 | MODULE_LICENSE("GPL"); | 861 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/serial/qcaux.c b/drivers/usb/serial/qcaux.c index a34819884c1a..966245680f55 100644 --- a/drivers/usb/serial/qcaux.c +++ b/drivers/usb/serial/qcaux.c | |||
@@ -82,7 +82,6 @@ static struct usb_driver qcaux_driver = { | |||
82 | .probe = usb_serial_probe, | 82 | .probe = usb_serial_probe, |
83 | .disconnect = usb_serial_disconnect, | 83 | .disconnect = usb_serial_disconnect, |
84 | .id_table = id_table, | 84 | .id_table = id_table, |
85 | .no_dynamic_id = 1, | ||
86 | }; | 85 | }; |
87 | 86 | ||
88 | static struct usb_serial_driver qcaux_device = { | 87 | static struct usb_serial_driver qcaux_device = { |
@@ -91,29 +90,12 @@ static struct usb_serial_driver qcaux_device = { | |||
91 | .name = "qcaux", | 90 | .name = "qcaux", |
92 | }, | 91 | }, |
93 | .id_table = id_table, | 92 | .id_table = id_table, |
94 | .usb_driver = &qcaux_driver, | ||
95 | .num_ports = 1, | 93 | .num_ports = 1, |
96 | }; | 94 | }; |
97 | 95 | ||
98 | static int __init qcaux_init(void) | 96 | static struct usb_serial_driver * const serial_drivers[] = { |
99 | { | 97 | &qcaux_device, NULL |
100 | int retval; | 98 | }; |
101 | |||
102 | retval = usb_serial_register(&qcaux_device); | ||
103 | if (retval) | ||
104 | return retval; | ||
105 | retval = usb_register(&qcaux_driver); | ||
106 | if (retval) | ||
107 | usb_serial_deregister(&qcaux_device); | ||
108 | return retval; | ||
109 | } | ||
110 | |||
111 | static void __exit qcaux_exit(void) | ||
112 | { | ||
113 | usb_deregister(&qcaux_driver); | ||
114 | usb_serial_deregister(&qcaux_device); | ||
115 | } | ||
116 | 99 | ||
117 | module_init(qcaux_init); | 100 | module_usb_serial_driver(qcaux_driver, serial_drivers); |
118 | module_exit(qcaux_exit); | ||
119 | MODULE_LICENSE("GPL"); | 101 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c index f98800f2324c..0206b10c9e6e 100644 --- a/drivers/usb/serial/qcserial.c +++ b/drivers/usb/serial/qcserial.c | |||
@@ -24,39 +24,44 @@ | |||
24 | 24 | ||
25 | static bool debug; | 25 | static bool debug; |
26 | 26 | ||
27 | #define DEVICE_G1K(v, p) \ | ||
28 | USB_DEVICE(v, p), .driver_info = 1 | ||
29 | |||
27 | static const struct usb_device_id id_table[] = { | 30 | static const struct usb_device_id id_table[] = { |
28 | {USB_DEVICE(0x05c6, 0x9211)}, /* Acer Gobi QDL device */ | 31 | /* Gobi 1000 devices */ |
29 | {USB_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ | 32 | {DEVICE_G1K(0x05c6, 0x9211)}, /* Acer Gobi QDL device */ |
30 | {USB_DEVICE(0x03f0, 0x1f1d)}, /* HP un2400 Gobi Modem Device */ | 33 | {DEVICE_G1K(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ |
31 | {USB_DEVICE(0x03f0, 0x201d)}, /* HP un2400 Gobi QDL Device */ | 34 | {DEVICE_G1K(0x03f0, 0x1f1d)}, /* HP un2400 Gobi Modem Device */ |
32 | {USB_DEVICE(0x03f0, 0x371d)}, /* HP un2430 Mobile Broadband Module */ | 35 | {DEVICE_G1K(0x03f0, 0x201d)}, /* HP un2400 Gobi QDL Device */ |
33 | {USB_DEVICE(0x04da, 0x250d)}, /* Panasonic Gobi Modem device */ | 36 | {DEVICE_G1K(0x04da, 0x250d)}, /* Panasonic Gobi Modem device */ |
34 | {USB_DEVICE(0x04da, 0x250c)}, /* Panasonic Gobi QDL device */ | 37 | {DEVICE_G1K(0x04da, 0x250c)}, /* Panasonic Gobi QDL device */ |
35 | {USB_DEVICE(0x413c, 0x8172)}, /* Dell Gobi Modem device */ | 38 | {DEVICE_G1K(0x413c, 0x8172)}, /* Dell Gobi Modem device */ |
36 | {USB_DEVICE(0x413c, 0x8171)}, /* Dell Gobi QDL device */ | 39 | {DEVICE_G1K(0x413c, 0x8171)}, /* Dell Gobi QDL device */ |
37 | {USB_DEVICE(0x1410, 0xa001)}, /* Novatel Gobi Modem device */ | 40 | {DEVICE_G1K(0x1410, 0xa001)}, /* Novatel Gobi Modem device */ |
38 | {USB_DEVICE(0x1410, 0xa008)}, /* Novatel Gobi QDL device */ | 41 | {DEVICE_G1K(0x1410, 0xa008)}, /* Novatel Gobi QDL device */ |
39 | {USB_DEVICE(0x1410, 0xa010)}, /* Novatel Gobi QDL device */ | 42 | {DEVICE_G1K(0x0b05, 0x1776)}, /* Asus Gobi Modem device */ |
40 | {USB_DEVICE(0x1410, 0xa011)}, /* Novatel Gobi QDL device */ | 43 | {DEVICE_G1K(0x0b05, 0x1774)}, /* Asus Gobi QDL device */ |
41 | {USB_DEVICE(0x1410, 0xa012)}, /* Novatel Gobi QDL device */ | 44 | {DEVICE_G1K(0x19d2, 0xfff3)}, /* ONDA Gobi Modem device */ |
42 | {USB_DEVICE(0x1410, 0xa013)}, /* Novatel Gobi QDL device */ | 45 | {DEVICE_G1K(0x19d2, 0xfff2)}, /* ONDA Gobi QDL device */ |
43 | {USB_DEVICE(0x1410, 0xa014)}, /* Novatel Gobi QDL device */ | 46 | {DEVICE_G1K(0x1557, 0x0a80)}, /* OQO Gobi QDL device */ |
44 | {USB_DEVICE(0x0b05, 0x1776)}, /* Asus Gobi Modem device */ | 47 | {DEVICE_G1K(0x05c6, 0x9001)}, /* Generic Gobi Modem device */ |
45 | {USB_DEVICE(0x0b05, 0x1774)}, /* Asus Gobi QDL device */ | 48 | {DEVICE_G1K(0x05c6, 0x9002)}, /* Generic Gobi Modem device */ |
46 | {USB_DEVICE(0x19d2, 0xfff3)}, /* ONDA Gobi Modem device */ | 49 | {DEVICE_G1K(0x05c6, 0x9202)}, /* Generic Gobi Modem device */ |
47 | {USB_DEVICE(0x19d2, 0xfff2)}, /* ONDA Gobi QDL device */ | 50 | {DEVICE_G1K(0x05c6, 0x9203)}, /* Generic Gobi Modem device */ |
48 | {USB_DEVICE(0x1557, 0x0a80)}, /* OQO Gobi QDL device */ | 51 | {DEVICE_G1K(0x05c6, 0x9222)}, /* Generic Gobi Modem device */ |
49 | {USB_DEVICE(0x05c6, 0x9001)}, /* Generic Gobi Modem device */ | 52 | {DEVICE_G1K(0x05c6, 0x9008)}, /* Generic Gobi QDL device */ |
50 | {USB_DEVICE(0x05c6, 0x9002)}, /* Generic Gobi Modem device */ | 53 | {DEVICE_G1K(0x05c6, 0x9009)}, /* Generic Gobi Modem device */ |
51 | {USB_DEVICE(0x05c6, 0x9202)}, /* Generic Gobi Modem device */ | 54 | {DEVICE_G1K(0x05c6, 0x9201)}, /* Generic Gobi QDL device */ |
52 | {USB_DEVICE(0x05c6, 0x9203)}, /* Generic Gobi Modem device */ | 55 | {DEVICE_G1K(0x05c6, 0x9221)}, /* Generic Gobi QDL device */ |
53 | {USB_DEVICE(0x05c6, 0x9222)}, /* Generic Gobi Modem device */ | 56 | {DEVICE_G1K(0x05c6, 0x9231)}, /* Generic Gobi QDL device */ |
54 | {USB_DEVICE(0x05c6, 0x9008)}, /* Generic Gobi QDL device */ | 57 | {DEVICE_G1K(0x1f45, 0x0001)}, /* Unknown Gobi QDL device */ |
55 | {USB_DEVICE(0x05c6, 0x9009)}, /* Generic Gobi Modem device */ | 58 | |
56 | {USB_DEVICE(0x05c6, 0x9201)}, /* Generic Gobi QDL device */ | 59 | /* Gobi 2000 devices */ |
57 | {USB_DEVICE(0x05c6, 0x9221)}, /* Generic Gobi QDL device */ | 60 | {USB_DEVICE(0x1410, 0xa010)}, /* Novatel Gobi 2000 QDL device */ |
58 | {USB_DEVICE(0x05c6, 0x9231)}, /* Generic Gobi QDL device */ | 61 | {USB_DEVICE(0x1410, 0xa011)}, /* Novatel Gobi 2000 QDL device */ |
59 | {USB_DEVICE(0x1f45, 0x0001)}, /* Unknown Gobi QDL device */ | 62 | {USB_DEVICE(0x1410, 0xa012)}, /* Novatel Gobi 2000 QDL device */ |
63 | {USB_DEVICE(0x1410, 0xa013)}, /* Novatel Gobi 2000 QDL device */ | ||
64 | {USB_DEVICE(0x1410, 0xa014)}, /* Novatel Gobi 2000 QDL device */ | ||
60 | {USB_DEVICE(0x413c, 0x8185)}, /* Dell Gobi 2000 QDL device (N0218, VU936) */ | 65 | {USB_DEVICE(0x413c, 0x8185)}, /* Dell Gobi 2000 QDL device (N0218, VU936) */ |
61 | {USB_DEVICE(0x413c, 0x8186)}, /* Dell Gobi 2000 Modem device (N0218, VU936) */ | 66 | {USB_DEVICE(0x413c, 0x8186)}, /* Dell Gobi 2000 Modem device (N0218, VU936) */ |
62 | {USB_DEVICE(0x05c6, 0x9208)}, /* Generic Gobi 2000 QDL device */ | 67 | {USB_DEVICE(0x05c6, 0x9208)}, /* Generic Gobi 2000 QDL device */ |
@@ -92,6 +97,8 @@ static const struct usb_device_id id_table[] = { | |||
92 | {USB_DEVICE(0x05c6, 0x9204)}, /* Gobi 2000 QDL device */ | 97 | {USB_DEVICE(0x05c6, 0x9204)}, /* Gobi 2000 QDL device */ |
93 | {USB_DEVICE(0x05c6, 0x9205)}, /* Gobi 2000 Modem device */ | 98 | {USB_DEVICE(0x05c6, 0x9205)}, /* Gobi 2000 Modem device */ |
94 | 99 | ||
100 | /* Gobi 3000 devices */ | ||
101 | {USB_DEVICE(0x03f0, 0x371d)}, /* HP un2430 Gobi 3000 QDL */ | ||
95 | {USB_DEVICE(0x05c6, 0x920c)}, /* Gobi 3000 QDL */ | 102 | {USB_DEVICE(0x05c6, 0x920c)}, /* Gobi 3000 QDL */ |
96 | {USB_DEVICE(0x05c6, 0x920d)}, /* Gobi 3000 Composite */ | 103 | {USB_DEVICE(0x05c6, 0x920d)}, /* Gobi 3000 Composite */ |
97 | {USB_DEVICE(0x1410, 0xa020)}, /* Novatel Gobi 3000 QDL */ | 104 | {USB_DEVICE(0x1410, 0xa020)}, /* Novatel Gobi 3000 QDL */ |
@@ -122,8 +129,10 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) | |||
122 | int retval = -ENODEV; | 129 | int retval = -ENODEV; |
123 | __u8 nintf; | 130 | __u8 nintf; |
124 | __u8 ifnum; | 131 | __u8 ifnum; |
132 | bool is_gobi1k = id->driver_info ? true : false; | ||
125 | 133 | ||
126 | dbg("%s", __func__); | 134 | dbg("%s", __func__); |
135 | dbg("Is Gobi 1000 = %d", is_gobi1k); | ||
127 | 136 | ||
128 | nintf = serial->dev->actconfig->desc.bNumInterfaces; | 137 | nintf = serial->dev->actconfig->desc.bNumInterfaces; |
129 | dbg("Num Interfaces = %d", nintf); | 138 | dbg("Num Interfaces = %d", nintf); |
@@ -169,15 +178,25 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) | |||
169 | 178 | ||
170 | case 3: | 179 | case 3: |
171 | case 4: | 180 | case 4: |
172 | /* Composite mode */ | 181 | /* Composite mode; don't bind to the QMI/net interface as that |
173 | /* ifnum == 0 is a broadband network adapter */ | 182 | * gets handled by other drivers. |
174 | if (ifnum == 1) { | 183 | */ |
175 | /* | 184 | |
176 | * Diagnostics Monitor (serial line 9600 8N1) | 185 | /* Gobi 1K USB layout: |
177 | * Qualcomm DM protocol | 186 | * 0: serial port (doesn't respond) |
178 | * use "libqcdm" (ModemManager) for communication | 187 | * 1: serial port (doesn't respond) |
179 | */ | 188 | * 2: AT-capable modem port |
180 | dbg("Diagnostics Monitor found"); | 189 | * 3: QMI/net |
190 | * | ||
191 | * Gobi 2K+ USB layout: | ||
192 | * 0: QMI/net | ||
193 | * 1: DM/DIAG (use libqcdm from ModemManager for communication) | ||
194 | * 2: AT-capable modem port | ||
195 | * 3: NMEA | ||
196 | */ | ||
197 | |||
198 | if (ifnum == 1 && !is_gobi1k) { | ||
199 | dbg("Gobi 2K+ DM/DIAG interface found"); | ||
181 | retval = usb_set_interface(serial->dev, ifnum, 0); | 200 | retval = usb_set_interface(serial->dev, ifnum, 0); |
182 | if (retval < 0) { | 201 | if (retval < 0) { |
183 | dev_err(&serial->dev->dev, | 202 | dev_err(&serial->dev->dev, |
@@ -196,13 +215,13 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) | |||
196 | retval = -ENODEV; | 215 | retval = -ENODEV; |
197 | kfree(data); | 216 | kfree(data); |
198 | } | 217 | } |
199 | } else if (ifnum==3) { | 218 | } else if (ifnum==3 && !is_gobi1k) { |
200 | /* | 219 | /* |
201 | * NMEA (serial line 9600 8N1) | 220 | * NMEA (serial line 9600 8N1) |
202 | * # echo "\$GPS_START" > /dev/ttyUSBx | 221 | * # echo "\$GPS_START" > /dev/ttyUSBx |
203 | * # echo "\$GPS_STOP" > /dev/ttyUSBx | 222 | * # echo "\$GPS_STOP" > /dev/ttyUSBx |
204 | */ | 223 | */ |
205 | dbg("NMEA GPS interface found"); | 224 | dbg("Gobi 2K+ NMEA GPS interface found"); |
206 | retval = usb_set_interface(serial->dev, ifnum, 0); | 225 | retval = usb_set_interface(serial->dev, ifnum, 0); |
207 | if (retval < 0) { | 226 | if (retval < 0) { |
208 | dev_err(&serial->dev->dev, | 227 | dev_err(&serial->dev->dev, |
@@ -246,7 +265,6 @@ static struct usb_serial_driver qcdevice = { | |||
246 | }, | 265 | }, |
247 | .description = "Qualcomm USB modem", | 266 | .description = "Qualcomm USB modem", |
248 | .id_table = id_table, | 267 | .id_table = id_table, |
249 | .usb_driver = &qcdriver, | ||
250 | .num_ports = 1, | 268 | .num_ports = 1, |
251 | .probe = qcprobe, | 269 | .probe = qcprobe, |
252 | .open = usb_wwan_open, | 270 | .open = usb_wwan_open, |
@@ -263,31 +281,11 @@ static struct usb_serial_driver qcdevice = { | |||
263 | #endif | 281 | #endif |
264 | }; | 282 | }; |
265 | 283 | ||
266 | static int __init qcinit(void) | 284 | static struct usb_serial_driver * const serial_drivers[] = { |
267 | { | 285 | &qcdevice, NULL |
268 | int retval; | 286 | }; |
269 | |||
270 | retval = usb_serial_register(&qcdevice); | ||
271 | if (retval) | ||
272 | return retval; | ||
273 | |||
274 | retval = usb_register(&qcdriver); | ||
275 | if (retval) { | ||
276 | usb_serial_deregister(&qcdevice); | ||
277 | return retval; | ||
278 | } | ||
279 | |||
280 | return 0; | ||
281 | } | ||
282 | |||
283 | static void __exit qcexit(void) | ||
284 | { | ||
285 | usb_deregister(&qcdriver); | ||
286 | usb_serial_deregister(&qcdevice); | ||
287 | } | ||
288 | 287 | ||
289 | module_init(qcinit); | 288 | module_usb_serial_driver(qcdriver, serial_drivers); |
290 | module_exit(qcexit); | ||
291 | 289 | ||
292 | MODULE_AUTHOR(DRIVER_AUTHOR); | 290 | MODULE_AUTHOR(DRIVER_AUTHOR); |
293 | MODULE_DESCRIPTION(DRIVER_DESC); | 291 | MODULE_DESCRIPTION(DRIVER_DESC); |
diff --git a/drivers/usb/serial/safe_serial.c b/drivers/usb/serial/safe_serial.c index d074b3740dcb..ae4ee30c7411 100644 --- a/drivers/usb/serial/safe_serial.c +++ b/drivers/usb/serial/safe_serial.c | |||
@@ -156,7 +156,6 @@ static struct usb_driver safe_driver = { | |||
156 | .probe = usb_serial_probe, | 156 | .probe = usb_serial_probe, |
157 | .disconnect = usb_serial_disconnect, | 157 | .disconnect = usb_serial_disconnect, |
158 | .id_table = id_table, | 158 | .id_table = id_table, |
159 | .no_dynamic_id = 1, | ||
160 | }; | 159 | }; |
161 | 160 | ||
162 | static const __u16 crc10_table[256] = { | 161 | static const __u16 crc10_table[256] = { |
@@ -309,16 +308,19 @@ static struct usb_serial_driver safe_device = { | |||
309 | .name = "safe_serial", | 308 | .name = "safe_serial", |
310 | }, | 309 | }, |
311 | .id_table = id_table, | 310 | .id_table = id_table, |
312 | .usb_driver = &safe_driver, | ||
313 | .num_ports = 1, | 311 | .num_ports = 1, |
314 | .process_read_urb = safe_process_read_urb, | 312 | .process_read_urb = safe_process_read_urb, |
315 | .prepare_write_buffer = safe_prepare_write_buffer, | 313 | .prepare_write_buffer = safe_prepare_write_buffer, |
316 | .attach = safe_startup, | 314 | .attach = safe_startup, |
317 | }; | 315 | }; |
318 | 316 | ||
317 | static struct usb_serial_driver * const serial_drivers[] = { | ||
318 | &safe_device, NULL | ||
319 | }; | ||
320 | |||
319 | static int __init safe_init(void) | 321 | static int __init safe_init(void) |
320 | { | 322 | { |
321 | int i, retval; | 323 | int i; |
322 | 324 | ||
323 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | 325 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" |
324 | DRIVER_DESC "\n"); | 326 | DRIVER_DESC "\n"); |
@@ -337,24 +339,12 @@ static int __init safe_init(void) | |||
337 | } | 339 | } |
338 | } | 340 | } |
339 | 341 | ||
340 | retval = usb_serial_register(&safe_device); | 342 | return usb_serial_register_drivers(&safe_driver, serial_drivers); |
341 | if (retval) | ||
342 | goto failed_usb_serial_register; | ||
343 | retval = usb_register(&safe_driver); | ||
344 | if (retval) | ||
345 | goto failed_usb_register; | ||
346 | |||
347 | return 0; | ||
348 | failed_usb_register: | ||
349 | usb_serial_deregister(&safe_device); | ||
350 | failed_usb_serial_register: | ||
351 | return retval; | ||
352 | } | 343 | } |
353 | 344 | ||
354 | static void __exit safe_exit(void) | 345 | static void __exit safe_exit(void) |
355 | { | 346 | { |
356 | usb_deregister(&safe_driver); | 347 | usb_serial_deregister_drivers(&safe_driver, serial_drivers); |
357 | usb_serial_deregister(&safe_device); | ||
358 | } | 348 | } |
359 | 349 | ||
360 | module_init(safe_init); | 350 | module_init(safe_init); |
diff --git a/drivers/usb/serial/siemens_mpi.c b/drivers/usb/serial/siemens_mpi.c index 74cd4ccdb3fc..46c0430fd38b 100644 --- a/drivers/usb/serial/siemens_mpi.c +++ b/drivers/usb/serial/siemens_mpi.c | |||
@@ -42,37 +42,15 @@ static struct usb_serial_driver siemens_usb_mpi_device = { | |||
42 | .name = "siemens_mpi", | 42 | .name = "siemens_mpi", |
43 | }, | 43 | }, |
44 | .id_table = id_table, | 44 | .id_table = id_table, |
45 | .usb_driver = &siemens_usb_mpi_driver, | ||
46 | .num_ports = 1, | 45 | .num_ports = 1, |
47 | }; | 46 | }; |
48 | 47 | ||
49 | static int __init siemens_usb_mpi_init(void) | 48 | static struct usb_serial_driver * const serial_drivers[] = { |
50 | { | 49 | &siemens_usb_mpi_device, NULL |
51 | int retval; | 50 | }; |
52 | |||
53 | retval = usb_serial_register(&siemens_usb_mpi_device); | ||
54 | if (retval) | ||
55 | goto failed_usb_serial_register; | ||
56 | retval = usb_register(&siemens_usb_mpi_driver); | ||
57 | if (retval) | ||
58 | goto failed_usb_register; | ||
59 | printk(KERN_INFO DRIVER_DESC "\n"); | ||
60 | printk(KERN_INFO DRIVER_VERSION " " DRIVER_AUTHOR "\n"); | ||
61 | return retval; | ||
62 | failed_usb_register: | ||
63 | usb_serial_deregister(&siemens_usb_mpi_device); | ||
64 | failed_usb_serial_register: | ||
65 | return retval; | ||
66 | } | ||
67 | 51 | ||
68 | static void __exit siemens_usb_mpi_exit(void) | 52 | module_usb_serial_driver(siemens_usb_mpi_driver, serial_drivers); |
69 | { | ||
70 | usb_deregister(&siemens_usb_mpi_driver); | ||
71 | usb_serial_deregister(&siemens_usb_mpi_device); | ||
72 | } | ||
73 | 53 | ||
74 | module_init(siemens_usb_mpi_init); | ||
75 | module_exit(siemens_usb_mpi_exit); | ||
76 | MODULE_AUTHOR(DRIVER_AUTHOR); | 54 | MODULE_AUTHOR(DRIVER_AUTHOR); |
77 | MODULE_DESCRIPTION(DRIVER_DESC); | 55 | MODULE_DESCRIPTION(DRIVER_DESC); |
78 | MODULE_LICENSE("GPL"); | 56 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c index fdae0a4407cb..f14465a83dd1 100644 --- a/drivers/usb/serial/sierra.c +++ b/drivers/usb/serial/sierra.c | |||
@@ -1084,7 +1084,6 @@ static struct usb_driver sierra_driver = { | |||
1084 | .resume = usb_serial_resume, | 1084 | .resume = usb_serial_resume, |
1085 | .reset_resume = sierra_reset_resume, | 1085 | .reset_resume = sierra_reset_resume, |
1086 | .id_table = id_table, | 1086 | .id_table = id_table, |
1087 | .no_dynamic_id = 1, | ||
1088 | .supports_autosuspend = 1, | 1087 | .supports_autosuspend = 1, |
1089 | }; | 1088 | }; |
1090 | 1089 | ||
@@ -1095,7 +1094,6 @@ static struct usb_serial_driver sierra_device = { | |||
1095 | }, | 1094 | }, |
1096 | .description = "Sierra USB modem", | 1095 | .description = "Sierra USB modem", |
1097 | .id_table = id_table, | 1096 | .id_table = id_table, |
1098 | .usb_driver = &sierra_driver, | ||
1099 | .calc_num_ports = sierra_calc_num_ports, | 1097 | .calc_num_ports = sierra_calc_num_ports, |
1100 | .probe = sierra_probe, | 1098 | .probe = sierra_probe, |
1101 | .open = sierra_open, | 1099 | .open = sierra_open, |
@@ -1113,38 +1111,11 @@ static struct usb_serial_driver sierra_device = { | |||
1113 | .read_int_callback = sierra_instat_callback, | 1111 | .read_int_callback = sierra_instat_callback, |
1114 | }; | 1112 | }; |
1115 | 1113 | ||
1116 | /* Functions used by new usb-serial code. */ | 1114 | static struct usb_serial_driver * const serial_drivers[] = { |
1117 | static int __init sierra_init(void) | 1115 | &sierra_device, NULL |
1118 | { | 1116 | }; |
1119 | int retval; | ||
1120 | retval = usb_serial_register(&sierra_device); | ||
1121 | if (retval) | ||
1122 | goto failed_device_register; | ||
1123 | |||
1124 | |||
1125 | retval = usb_register(&sierra_driver); | ||
1126 | if (retval) | ||
1127 | goto failed_driver_register; | ||
1128 | |||
1129 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
1130 | DRIVER_DESC "\n"); | ||
1131 | |||
1132 | return 0; | ||
1133 | |||
1134 | failed_driver_register: | ||
1135 | usb_serial_deregister(&sierra_device); | ||
1136 | failed_device_register: | ||
1137 | return retval; | ||
1138 | } | ||
1139 | |||
1140 | static void __exit sierra_exit(void) | ||
1141 | { | ||
1142 | usb_deregister(&sierra_driver); | ||
1143 | usb_serial_deregister(&sierra_device); | ||
1144 | } | ||
1145 | 1117 | ||
1146 | module_init(sierra_init); | 1118 | module_usb_serial_driver(sierra_driver, serial_drivers); |
1147 | module_exit(sierra_exit); | ||
1148 | 1119 | ||
1149 | MODULE_AUTHOR(DRIVER_AUTHOR); | 1120 | MODULE_AUTHOR(DRIVER_AUTHOR); |
1150 | MODULE_DESCRIPTION(DRIVER_DESC); | 1121 | MODULE_DESCRIPTION(DRIVER_DESC); |
diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c index d7f5eee18f00..f06c9a8f3d37 100644 --- a/drivers/usb/serial/spcp8x5.c +++ b/drivers/usb/serial/spcp8x5.c | |||
@@ -156,7 +156,6 @@ static struct usb_driver spcp8x5_driver = { | |||
156 | .probe = usb_serial_probe, | 156 | .probe = usb_serial_probe, |
157 | .disconnect = usb_serial_disconnect, | 157 | .disconnect = usb_serial_disconnect, |
158 | .id_table = id_table, | 158 | .id_table = id_table, |
159 | .no_dynamic_id = 1, | ||
160 | }; | 159 | }; |
161 | 160 | ||
162 | 161 | ||
@@ -649,7 +648,6 @@ static struct usb_serial_driver spcp8x5_device = { | |||
649 | .name = "SPCP8x5", | 648 | .name = "SPCP8x5", |
650 | }, | 649 | }, |
651 | .id_table = id_table, | 650 | .id_table = id_table, |
652 | .usb_driver = &spcp8x5_driver, | ||
653 | .num_ports = 1, | 651 | .num_ports = 1, |
654 | .open = spcp8x5_open, | 652 | .open = spcp8x5_open, |
655 | .dtr_rts = spcp8x5_dtr_rts, | 653 | .dtr_rts = spcp8x5_dtr_rts, |
@@ -664,32 +662,11 @@ static struct usb_serial_driver spcp8x5_device = { | |||
664 | .process_read_urb = spcp8x5_process_read_urb, | 662 | .process_read_urb = spcp8x5_process_read_urb, |
665 | }; | 663 | }; |
666 | 664 | ||
667 | static int __init spcp8x5_init(void) | 665 | static struct usb_serial_driver * const serial_drivers[] = { |
668 | { | 666 | &spcp8x5_device, NULL |
669 | int retval; | 667 | }; |
670 | retval = usb_serial_register(&spcp8x5_device); | ||
671 | if (retval) | ||
672 | goto failed_usb_serial_register; | ||
673 | retval = usb_register(&spcp8x5_driver); | ||
674 | if (retval) | ||
675 | goto failed_usb_register; | ||
676 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
677 | DRIVER_DESC "\n"); | ||
678 | return 0; | ||
679 | failed_usb_register: | ||
680 | usb_serial_deregister(&spcp8x5_device); | ||
681 | failed_usb_serial_register: | ||
682 | return retval; | ||
683 | } | ||
684 | |||
685 | static void __exit spcp8x5_exit(void) | ||
686 | { | ||
687 | usb_deregister(&spcp8x5_driver); | ||
688 | usb_serial_deregister(&spcp8x5_device); | ||
689 | } | ||
690 | 668 | ||
691 | module_init(spcp8x5_init); | 669 | module_usb_serial_driver(spcp8x5_driver, serial_drivers); |
692 | module_exit(spcp8x5_exit); | ||
693 | 670 | ||
694 | MODULE_DESCRIPTION(DRIVER_DESC); | 671 | MODULE_DESCRIPTION(DRIVER_DESC); |
695 | MODULE_VERSION(DRIVER_VERSION); | 672 | MODULE_VERSION(DRIVER_VERSION); |
diff --git a/drivers/usb/serial/ssu100.c b/drivers/usb/serial/ssu100.c index 7697858d8858..3cdc8a52de44 100644 --- a/drivers/usb/serial/ssu100.c +++ b/drivers/usb/serial/ssu100.c | |||
@@ -70,7 +70,6 @@ static struct usb_driver ssu100_driver = { | |||
70 | .id_table = id_table, | 70 | .id_table = id_table, |
71 | .suspend = usb_serial_suspend, | 71 | .suspend = usb_serial_suspend, |
72 | .resume = usb_serial_resume, | 72 | .resume = usb_serial_resume, |
73 | .no_dynamic_id = 1, | ||
74 | .supports_autosuspend = 1, | 73 | .supports_autosuspend = 1, |
75 | }; | 74 | }; |
76 | 75 | ||
@@ -677,7 +676,6 @@ static struct usb_serial_driver ssu100_device = { | |||
677 | }, | 676 | }, |
678 | .description = DRIVER_DESC, | 677 | .description = DRIVER_DESC, |
679 | .id_table = id_table, | 678 | .id_table = id_table, |
680 | .usb_driver = &ssu100_driver, | ||
681 | .num_ports = 1, | 679 | .num_ports = 1, |
682 | .open = ssu100_open, | 680 | .open = ssu100_open, |
683 | .close = ssu100_close, | 681 | .close = ssu100_close, |
@@ -693,41 +691,11 @@ static struct usb_serial_driver ssu100_device = { | |||
693 | .disconnect = usb_serial_generic_disconnect, | 691 | .disconnect = usb_serial_generic_disconnect, |
694 | }; | 692 | }; |
695 | 693 | ||
696 | static int __init ssu100_init(void) | 694 | static struct usb_serial_driver * const serial_drivers[] = { |
697 | { | 695 | &ssu100_device, NULL |
698 | int retval; | 696 | }; |
699 | |||
700 | dbg("%s", __func__); | ||
701 | |||
702 | /* register with usb-serial */ | ||
703 | retval = usb_serial_register(&ssu100_device); | ||
704 | |||
705 | if (retval) | ||
706 | goto failed_usb_sio_register; | ||
707 | |||
708 | retval = usb_register(&ssu100_driver); | ||
709 | if (retval) | ||
710 | goto failed_usb_register; | ||
711 | |||
712 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
713 | DRIVER_DESC "\n"); | ||
714 | |||
715 | return 0; | ||
716 | |||
717 | failed_usb_register: | ||
718 | usb_serial_deregister(&ssu100_device); | ||
719 | failed_usb_sio_register: | ||
720 | return retval; | ||
721 | } | ||
722 | |||
723 | static void __exit ssu100_exit(void) | ||
724 | { | ||
725 | usb_deregister(&ssu100_driver); | ||
726 | usb_serial_deregister(&ssu100_device); | ||
727 | } | ||
728 | 697 | ||
729 | module_init(ssu100_init); | 698 | module_usb_serial_driver(ssu100_driver, serial_drivers); |
730 | module_exit(ssu100_exit); | ||
731 | 699 | ||
732 | MODULE_DESCRIPTION(DRIVER_DESC); | 700 | MODULE_DESCRIPTION(DRIVER_DESC); |
733 | MODULE_LICENSE("GPL"); | 701 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/serial/symbolserial.c b/drivers/usb/serial/symbolserial.c index 50651cf4fc61..1a5be136e6cf 100644 --- a/drivers/usb/serial/symbolserial.c +++ b/drivers/usb/serial/symbolserial.c | |||
@@ -287,7 +287,6 @@ static struct usb_driver symbol_driver = { | |||
287 | .probe = usb_serial_probe, | 287 | .probe = usb_serial_probe, |
288 | .disconnect = usb_serial_disconnect, | 288 | .disconnect = usb_serial_disconnect, |
289 | .id_table = id_table, | 289 | .id_table = id_table, |
290 | .no_dynamic_id = 1, | ||
291 | }; | 290 | }; |
292 | 291 | ||
293 | static struct usb_serial_driver symbol_device = { | 292 | static struct usb_serial_driver symbol_device = { |
@@ -296,7 +295,6 @@ static struct usb_serial_driver symbol_device = { | |||
296 | .name = "symbol", | 295 | .name = "symbol", |
297 | }, | 296 | }, |
298 | .id_table = id_table, | 297 | .id_table = id_table, |
299 | .usb_driver = &symbol_driver, | ||
300 | .num_ports = 1, | 298 | .num_ports = 1, |
301 | .attach = symbol_startup, | 299 | .attach = symbol_startup, |
302 | .open = symbol_open, | 300 | .open = symbol_open, |
@@ -307,27 +305,12 @@ static struct usb_serial_driver symbol_device = { | |||
307 | .unthrottle = symbol_unthrottle, | 305 | .unthrottle = symbol_unthrottle, |
308 | }; | 306 | }; |
309 | 307 | ||
310 | static int __init symbol_init(void) | 308 | static struct usb_serial_driver * const serial_drivers[] = { |
311 | { | 309 | &symbol_device, NULL |
312 | int retval; | 310 | }; |
313 | |||
314 | retval = usb_serial_register(&symbol_device); | ||
315 | if (retval) | ||
316 | return retval; | ||
317 | retval = usb_register(&symbol_driver); | ||
318 | if (retval) | ||
319 | usb_serial_deregister(&symbol_device); | ||
320 | return retval; | ||
321 | } | ||
322 | 311 | ||
323 | static void __exit symbol_exit(void) | 312 | module_usb_serial_driver(symbol_driver, serial_drivers); |
324 | { | ||
325 | usb_deregister(&symbol_driver); | ||
326 | usb_serial_deregister(&symbol_device); | ||
327 | } | ||
328 | 313 | ||
329 | module_init(symbol_init); | ||
330 | module_exit(symbol_exit); | ||
331 | MODULE_LICENSE("GPL"); | 314 | MODULE_LICENSE("GPL"); |
332 | 315 | ||
333 | module_param(debug, bool, S_IRUGO | S_IWUSR); | 316 | module_param(debug, bool, S_IRUGO | S_IWUSR); |
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c index 75b838eff178..ab74123d658e 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c | |||
@@ -216,7 +216,6 @@ static struct usb_driver ti_usb_driver = { | |||
216 | .probe = usb_serial_probe, | 216 | .probe = usb_serial_probe, |
217 | .disconnect = usb_serial_disconnect, | 217 | .disconnect = usb_serial_disconnect, |
218 | .id_table = ti_id_table_combined, | 218 | .id_table = ti_id_table_combined, |
219 | .no_dynamic_id = 1, | ||
220 | }; | 219 | }; |
221 | 220 | ||
222 | static struct usb_serial_driver ti_1port_device = { | 221 | static struct usb_serial_driver ti_1port_device = { |
@@ -225,7 +224,6 @@ static struct usb_serial_driver ti_1port_device = { | |||
225 | .name = "ti_usb_3410_5052_1", | 224 | .name = "ti_usb_3410_5052_1", |
226 | }, | 225 | }, |
227 | .description = "TI USB 3410 1 port adapter", | 226 | .description = "TI USB 3410 1 port adapter", |
228 | .usb_driver = &ti_usb_driver, | ||
229 | .id_table = ti_id_table_3410, | 227 | .id_table = ti_id_table_3410, |
230 | .num_ports = 1, | 228 | .num_ports = 1, |
231 | .attach = ti_startup, | 229 | .attach = ti_startup, |
@@ -254,7 +252,6 @@ static struct usb_serial_driver ti_2port_device = { | |||
254 | .name = "ti_usb_3410_5052_2", | 252 | .name = "ti_usb_3410_5052_2", |
255 | }, | 253 | }, |
256 | .description = "TI USB 5052 2 port adapter", | 254 | .description = "TI USB 5052 2 port adapter", |
257 | .usb_driver = &ti_usb_driver, | ||
258 | .id_table = ti_id_table_5052, | 255 | .id_table = ti_id_table_5052, |
259 | .num_ports = 2, | 256 | .num_ports = 2, |
260 | .attach = ti_startup, | 257 | .attach = ti_startup, |
@@ -277,6 +274,9 @@ static struct usb_serial_driver ti_2port_device = { | |||
277 | .write_bulk_callback = ti_bulk_out_callback, | 274 | .write_bulk_callback = ti_bulk_out_callback, |
278 | }; | 275 | }; |
279 | 276 | ||
277 | static struct usb_serial_driver * const serial_drivers[] = { | ||
278 | &ti_1port_device, &ti_2port_device, NULL | ||
279 | }; | ||
280 | 280 | ||
281 | /* Module */ | 281 | /* Module */ |
282 | 282 | ||
@@ -344,36 +344,17 @@ static int __init ti_init(void) | |||
344 | ti_id_table_combined[c].match_flags = USB_DEVICE_ID_MATCH_DEVICE; | 344 | ti_id_table_combined[c].match_flags = USB_DEVICE_ID_MATCH_DEVICE; |
345 | } | 345 | } |
346 | 346 | ||
347 | ret = usb_serial_register(&ti_1port_device); | 347 | ret = usb_serial_register_drivers(&ti_usb_driver, serial_drivers); |
348 | if (ret) | 348 | if (ret == 0) |
349 | goto failed_1port; | 349 | printk(KERN_INFO KBUILD_MODNAME ": " TI_DRIVER_VERSION ":" |
350 | ret = usb_serial_register(&ti_2port_device); | 350 | TI_DRIVER_DESC "\n"); |
351 | if (ret) | ||
352 | goto failed_2port; | ||
353 | |||
354 | ret = usb_register(&ti_usb_driver); | ||
355 | if (ret) | ||
356 | goto failed_usb; | ||
357 | |||
358 | printk(KERN_INFO KBUILD_MODNAME ": " TI_DRIVER_VERSION ":" | ||
359 | TI_DRIVER_DESC "\n"); | ||
360 | |||
361 | return 0; | ||
362 | |||
363 | failed_usb: | ||
364 | usb_serial_deregister(&ti_2port_device); | ||
365 | failed_2port: | ||
366 | usb_serial_deregister(&ti_1port_device); | ||
367 | failed_1port: | ||
368 | return ret; | 351 | return ret; |
369 | } | 352 | } |
370 | 353 | ||
371 | 354 | ||
372 | static void __exit ti_exit(void) | 355 | static void __exit ti_exit(void) |
373 | { | 356 | { |
374 | usb_deregister(&ti_usb_driver); | 357 | usb_serial_deregister_drivers(&ti_usb_driver, serial_drivers); |
375 | usb_serial_deregister(&ti_1port_device); | ||
376 | usb_serial_deregister(&ti_2port_device); | ||
377 | } | 358 | } |
378 | 359 | ||
379 | 360 | ||
@@ -1250,7 +1231,6 @@ static void ti_bulk_out_callback(struct urb *urb) | |||
1250 | { | 1231 | { |
1251 | struct ti_port *tport = urb->context; | 1232 | struct ti_port *tport = urb->context; |
1252 | struct usb_serial_port *port = tport->tp_port; | 1233 | struct usb_serial_port *port = tport->tp_port; |
1253 | struct device *dev = &urb->dev->dev; | ||
1254 | int status = urb->status; | 1234 | int status = urb->status; |
1255 | 1235 | ||
1256 | dbg("%s - port %d", __func__, port->number); | 1236 | dbg("%s - port %d", __func__, port->number); |
@@ -1268,7 +1248,7 @@ static void ti_bulk_out_callback(struct urb *urb) | |||
1268 | wake_up_interruptible(&tport->tp_write_wait); | 1248 | wake_up_interruptible(&tport->tp_write_wait); |
1269 | return; | 1249 | return; |
1270 | default: | 1250 | default: |
1271 | dev_err(dev, "%s - nonzero urb status, %d\n", | 1251 | dev_err_console(port, "%s - nonzero urb status, %d\n", |
1272 | __func__, status); | 1252 | __func__, status); |
1273 | tport->tp_tdev->td_urb_error = 1; | 1253 | tport->tp_tdev->td_urb_error = 1; |
1274 | wake_up_interruptible(&tport->tp_write_wait); | 1254 | wake_up_interruptible(&tport->tp_write_wait); |
@@ -1337,7 +1317,7 @@ static void ti_send(struct ti_port *tport) | |||
1337 | 1317 | ||
1338 | result = usb_submit_urb(port->write_urb, GFP_ATOMIC); | 1318 | result = usb_submit_urb(port->write_urb, GFP_ATOMIC); |
1339 | if (result) { | 1319 | if (result) { |
1340 | dev_err(&port->dev, "%s - submit write urb failed, %d\n", | 1320 | dev_err_console(port, "%s - submit write urb failed, %d\n", |
1341 | __func__, result); | 1321 | __func__, result); |
1342 | tport->tp_write_urb_in_use = 0; | 1322 | tport->tp_write_urb_in_use = 0; |
1343 | /* TODO: reschedule ti_send */ | 1323 | /* TODO: reschedule ti_send */ |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index d4e724d9b1f4..69230f01056a 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
@@ -1333,7 +1333,7 @@ static void fixup_generic(struct usb_serial_driver *device) | |||
1333 | set_to_generic_if_null(device, prepare_write_buffer); | 1333 | set_to_generic_if_null(device, prepare_write_buffer); |
1334 | } | 1334 | } |
1335 | 1335 | ||
1336 | int usb_serial_register(struct usb_serial_driver *driver) | 1336 | static int usb_serial_register(struct usb_serial_driver *driver) |
1337 | { | 1337 | { |
1338 | int retval; | 1338 | int retval; |
1339 | 1339 | ||
@@ -1367,10 +1367,8 @@ int usb_serial_register(struct usb_serial_driver *driver) | |||
1367 | mutex_unlock(&table_lock); | 1367 | mutex_unlock(&table_lock); |
1368 | return retval; | 1368 | return retval; |
1369 | } | 1369 | } |
1370 | EXPORT_SYMBOL_GPL(usb_serial_register); | ||
1371 | 1370 | ||
1372 | 1371 | static void usb_serial_deregister(struct usb_serial_driver *device) | |
1373 | void usb_serial_deregister(struct usb_serial_driver *device) | ||
1374 | { | 1372 | { |
1375 | printk(KERN_INFO "USB Serial deregistering driver %s\n", | 1373 | printk(KERN_INFO "USB Serial deregistering driver %s\n", |
1376 | device->description); | 1374 | device->description); |
@@ -1379,7 +1377,76 @@ void usb_serial_deregister(struct usb_serial_driver *device) | |||
1379 | usb_serial_bus_deregister(device); | 1377 | usb_serial_bus_deregister(device); |
1380 | mutex_unlock(&table_lock); | 1378 | mutex_unlock(&table_lock); |
1381 | } | 1379 | } |
1382 | EXPORT_SYMBOL_GPL(usb_serial_deregister); | 1380 | |
1381 | /** | ||
1382 | * usb_serial_register_drivers - register drivers for a usb-serial module | ||
1383 | * @udriver: usb_driver used for matching devices/interfaces | ||
1384 | * @serial_drivers: NULL-terminated array of pointers to drivers to be registered | ||
1385 | * | ||
1386 | * Registers @udriver and all the drivers in the @serial_drivers array. | ||
1387 | * Automatically fills in the .no_dynamic_id field in @udriver and | ||
1388 | * the .usb_driver field in each serial driver. | ||
1389 | */ | ||
1390 | int usb_serial_register_drivers(struct usb_driver *udriver, | ||
1391 | struct usb_serial_driver * const serial_drivers[]) | ||
1392 | { | ||
1393 | int rc; | ||
1394 | const struct usb_device_id *saved_id_table; | ||
1395 | struct usb_serial_driver * const *sd; | ||
1396 | |||
1397 | /* | ||
1398 | * udriver must be registered before any of the serial drivers, | ||
1399 | * because the store_new_id() routine for the serial drivers (in | ||
1400 | * bus.c) probes udriver. | ||
1401 | * | ||
1402 | * Performance hack: We don't want udriver to be probed until | ||
1403 | * the serial drivers are registered, because the probe would | ||
1404 | * simply fail for lack of a matching serial driver. | ||
1405 | * Therefore save off udriver's id_table until we are all set. | ||
1406 | */ | ||
1407 | saved_id_table = udriver->id_table; | ||
1408 | udriver->id_table = NULL; | ||
1409 | |||
1410 | udriver->no_dynamic_id = 1; | ||
1411 | rc = usb_register(udriver); | ||
1412 | if (rc) | ||
1413 | return rc; | ||
1414 | |||
1415 | for (sd = serial_drivers; *sd; ++sd) { | ||
1416 | (*sd)->usb_driver = udriver; | ||
1417 | rc = usb_serial_register(*sd); | ||
1418 | if (rc) | ||
1419 | goto failed; | ||
1420 | } | ||
1421 | |||
1422 | /* Now restore udriver's id_table and look for matches */ | ||
1423 | udriver->id_table = saved_id_table; | ||
1424 | rc = driver_attach(&udriver->drvwrap.driver); | ||
1425 | return 0; | ||
1426 | |||
1427 | failed: | ||
1428 | while (sd-- > serial_drivers) | ||
1429 | usb_serial_deregister(*sd); | ||
1430 | usb_deregister(udriver); | ||
1431 | return rc; | ||
1432 | } | ||
1433 | EXPORT_SYMBOL_GPL(usb_serial_register_drivers); | ||
1434 | |||
1435 | /** | ||
1436 | * usb_serial_deregister_drivers - deregister drivers for a usb-serial module | ||
1437 | * @udriver: usb_driver to unregister | ||
1438 | * @serial_drivers: NULL-terminated array of pointers to drivers to be deregistered | ||
1439 | * | ||
1440 | * Deregisters @udriver and all the drivers in the @serial_drivers array. | ||
1441 | */ | ||
1442 | void usb_serial_deregister_drivers(struct usb_driver *udriver, | ||
1443 | struct usb_serial_driver * const serial_drivers[]) | ||
1444 | { | ||
1445 | for (; *serial_drivers; ++serial_drivers) | ||
1446 | usb_serial_deregister(*serial_drivers); | ||
1447 | usb_deregister(udriver); | ||
1448 | } | ||
1449 | EXPORT_SYMBOL_GPL(usb_serial_deregister_drivers); | ||
1383 | 1450 | ||
1384 | /* Module information */ | 1451 | /* Module information */ |
1385 | MODULE_AUTHOR(DRIVER_AUTHOR); | 1452 | MODULE_AUTHOR(DRIVER_AUTHOR); |
diff --git a/drivers/usb/serial/usb_debug.c b/drivers/usb/serial/usb_debug.c index 9b632e753210..e3e8995a4739 100644 --- a/drivers/usb/serial/usb_debug.c +++ b/drivers/usb/serial/usb_debug.c | |||
@@ -40,7 +40,6 @@ static struct usb_driver debug_driver = { | |||
40 | .probe = usb_serial_probe, | 40 | .probe = usb_serial_probe, |
41 | .disconnect = usb_serial_disconnect, | 41 | .disconnect = usb_serial_disconnect, |
42 | .id_table = id_table, | 42 | .id_table = id_table, |
43 | .no_dynamic_id = 1, | ||
44 | }; | 43 | }; |
45 | 44 | ||
46 | /* This HW really does not support a serial break, so one will be | 45 | /* This HW really does not support a serial break, so one will be |
@@ -74,32 +73,15 @@ static struct usb_serial_driver debug_device = { | |||
74 | .name = "debug", | 73 | .name = "debug", |
75 | }, | 74 | }, |
76 | .id_table = id_table, | 75 | .id_table = id_table, |
77 | .usb_driver = &debug_driver, | ||
78 | .num_ports = 1, | 76 | .num_ports = 1, |
79 | .bulk_out_size = USB_DEBUG_MAX_PACKET_SIZE, | 77 | .bulk_out_size = USB_DEBUG_MAX_PACKET_SIZE, |
80 | .break_ctl = usb_debug_break_ctl, | 78 | .break_ctl = usb_debug_break_ctl, |
81 | .process_read_urb = usb_debug_process_read_urb, | 79 | .process_read_urb = usb_debug_process_read_urb, |
82 | }; | 80 | }; |
83 | 81 | ||
84 | static int __init debug_init(void) | 82 | static struct usb_serial_driver * const serial_drivers[] = { |
85 | { | 83 | &debug_device, NULL |
86 | int retval; | 84 | }; |
87 | |||
88 | retval = usb_serial_register(&debug_device); | ||
89 | if (retval) | ||
90 | return retval; | ||
91 | retval = usb_register(&debug_driver); | ||
92 | if (retval) | ||
93 | usb_serial_deregister(&debug_device); | ||
94 | return retval; | ||
95 | } | ||
96 | |||
97 | static void __exit debug_exit(void) | ||
98 | { | ||
99 | usb_deregister(&debug_driver); | ||
100 | usb_serial_deregister(&debug_device); | ||
101 | } | ||
102 | 85 | ||
103 | module_init(debug_init); | 86 | module_usb_serial_driver(debug_driver, serial_drivers); |
104 | module_exit(debug_exit); | ||
105 | MODULE_LICENSE("GPL"); | 87 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c index 210e4b10dc11..71d696474f24 100644 --- a/drivers/usb/serial/visor.c +++ b/drivers/usb/serial/visor.c | |||
@@ -173,7 +173,6 @@ static struct usb_driver visor_driver = { | |||
173 | .probe = usb_serial_probe, | 173 | .probe = usb_serial_probe, |
174 | .disconnect = usb_serial_disconnect, | 174 | .disconnect = usb_serial_disconnect, |
175 | .id_table = id_table_combined, | 175 | .id_table = id_table_combined, |
176 | .no_dynamic_id = 1, | ||
177 | }; | 176 | }; |
178 | 177 | ||
179 | /* All of the device info needed for the Handspring Visor, | 178 | /* All of the device info needed for the Handspring Visor, |
@@ -184,7 +183,6 @@ static struct usb_serial_driver handspring_device = { | |||
184 | .name = "visor", | 183 | .name = "visor", |
185 | }, | 184 | }, |
186 | .description = "Handspring Visor / Palm OS", | 185 | .description = "Handspring Visor / Palm OS", |
187 | .usb_driver = &visor_driver, | ||
188 | .id_table = id_table, | 186 | .id_table = id_table, |
189 | .num_ports = 2, | 187 | .num_ports = 2, |
190 | .bulk_out_size = 256, | 188 | .bulk_out_size = 256, |
@@ -205,7 +203,6 @@ static struct usb_serial_driver clie_5_device = { | |||
205 | .name = "clie_5", | 203 | .name = "clie_5", |
206 | }, | 204 | }, |
207 | .description = "Sony Clie 5.0", | 205 | .description = "Sony Clie 5.0", |
208 | .usb_driver = &visor_driver, | ||
209 | .id_table = clie_id_5_table, | 206 | .id_table = clie_id_5_table, |
210 | .num_ports = 2, | 207 | .num_ports = 2, |
211 | .bulk_out_size = 256, | 208 | .bulk_out_size = 256, |
@@ -226,7 +223,6 @@ static struct usb_serial_driver clie_3_5_device = { | |||
226 | .name = "clie_3.5", | 223 | .name = "clie_3.5", |
227 | }, | 224 | }, |
228 | .description = "Sony Clie 3.5", | 225 | .description = "Sony Clie 3.5", |
229 | .usb_driver = &visor_driver, | ||
230 | .id_table = clie_id_3_5_table, | 226 | .id_table = clie_id_3_5_table, |
231 | .num_ports = 1, | 227 | .num_ports = 1, |
232 | .bulk_out_size = 256, | 228 | .bulk_out_size = 256, |
@@ -237,6 +233,10 @@ static struct usb_serial_driver clie_3_5_device = { | |||
237 | .attach = clie_3_5_startup, | 233 | .attach = clie_3_5_startup, |
238 | }; | 234 | }; |
239 | 235 | ||
236 | static struct usb_serial_driver * const serial_drivers[] = { | ||
237 | &handspring_device, &clie_5_device, &clie_3_5_device, NULL | ||
238 | }; | ||
239 | |||
240 | /****************************************************************************** | 240 | /****************************************************************************** |
241 | * Handspring Visor specific driver functions | 241 | * Handspring Visor specific driver functions |
242 | ******************************************************************************/ | 242 | ******************************************************************************/ |
@@ -685,38 +685,17 @@ static int __init visor_init(void) | |||
685 | ": Adding Palm OS protocol 4.x support for unknown device: 0x%x/0x%x\n", | 685 | ": Adding Palm OS protocol 4.x support for unknown device: 0x%x/0x%x\n", |
686 | vendor, product); | 686 | vendor, product); |
687 | } | 687 | } |
688 | retval = usb_serial_register(&handspring_device); | ||
689 | if (retval) | ||
690 | goto failed_handspring_register; | ||
691 | retval = usb_serial_register(&clie_3_5_device); | ||
692 | if (retval) | ||
693 | goto failed_clie_3_5_register; | ||
694 | retval = usb_serial_register(&clie_5_device); | ||
695 | if (retval) | ||
696 | goto failed_clie_5_register; | ||
697 | retval = usb_register(&visor_driver); | ||
698 | if (retval) | ||
699 | goto failed_usb_register; | ||
700 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n"); | ||
701 | 688 | ||
702 | return 0; | 689 | retval = usb_serial_register_drivers(&visor_driver, serial_drivers); |
703 | failed_usb_register: | 690 | if (retval == 0) |
704 | usb_serial_deregister(&clie_5_device); | 691 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n"); |
705 | failed_clie_5_register: | ||
706 | usb_serial_deregister(&clie_3_5_device); | ||
707 | failed_clie_3_5_register: | ||
708 | usb_serial_deregister(&handspring_device); | ||
709 | failed_handspring_register: | ||
710 | return retval; | 692 | return retval; |
711 | } | 693 | } |
712 | 694 | ||
713 | 695 | ||
714 | static void __exit visor_exit (void) | 696 | static void __exit visor_exit (void) |
715 | { | 697 | { |
716 | usb_deregister(&visor_driver); | 698 | usb_serial_deregister_drivers(&visor_driver, serial_drivers); |
717 | usb_serial_deregister(&handspring_device); | ||
718 | usb_serial_deregister(&clie_3_5_device); | ||
719 | usb_serial_deregister(&clie_5_device); | ||
720 | } | 699 | } |
721 | 700 | ||
722 | 701 | ||
diff --git a/drivers/usb/serial/vivopay-serial.c b/drivers/usb/serial/vivopay-serial.c index f719d00972fc..078f338b5feb 100644 --- a/drivers/usb/serial/vivopay-serial.c +++ b/drivers/usb/serial/vivopay-serial.c | |||
@@ -30,7 +30,6 @@ static struct usb_driver vivopay_serial_driver = { | |||
30 | .probe = usb_serial_probe, | 30 | .probe = usb_serial_probe, |
31 | .disconnect = usb_serial_disconnect, | 31 | .disconnect = usb_serial_disconnect, |
32 | .id_table = id_table, | 32 | .id_table = id_table, |
33 | .no_dynamic_id = 1, | ||
34 | }; | 33 | }; |
35 | 34 | ||
36 | static struct usb_serial_driver vivopay_serial_device = { | 35 | static struct usb_serial_driver vivopay_serial_device = { |
@@ -39,36 +38,14 @@ static struct usb_serial_driver vivopay_serial_device = { | |||
39 | .name = "vivopay-serial", | 38 | .name = "vivopay-serial", |
40 | }, | 39 | }, |
41 | .id_table = id_table, | 40 | .id_table = id_table, |
42 | .usb_driver = &vivopay_serial_driver, | ||
43 | .num_ports = 1, | 41 | .num_ports = 1, |
44 | }; | 42 | }; |
45 | 43 | ||
46 | static int __init vivopay_serial_init(void) | 44 | static struct usb_serial_driver * const serial_drivers[] = { |
47 | { | 45 | &vivopay_serial_device, NULL |
48 | int retval; | 46 | }; |
49 | retval = usb_serial_register(&vivopay_serial_device); | ||
50 | if (retval) | ||
51 | goto failed_usb_serial_register; | ||
52 | retval = usb_register(&vivopay_serial_driver); | ||
53 | if (retval) | ||
54 | goto failed_usb_register; | ||
55 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
56 | DRIVER_DESC "\n"); | ||
57 | return 0; | ||
58 | failed_usb_register: | ||
59 | usb_serial_deregister(&vivopay_serial_device); | ||
60 | failed_usb_serial_register: | ||
61 | return retval; | ||
62 | } | ||
63 | |||
64 | static void __exit vivopay_serial_exit(void) | ||
65 | { | ||
66 | usb_deregister(&vivopay_serial_driver); | ||
67 | usb_serial_deregister(&vivopay_serial_device); | ||
68 | } | ||
69 | 47 | ||
70 | module_init(vivopay_serial_init); | 48 | module_usb_serial_driver(vivopay_serial_driver, serial_drivers); |
71 | module_exit(vivopay_serial_exit); | ||
72 | 49 | ||
73 | MODULE_AUTHOR("Forest Bond <forest.bond@outpostembedded.com>"); | 50 | MODULE_AUTHOR("Forest Bond <forest.bond@outpostembedded.com>"); |
74 | MODULE_DESCRIPTION(DRIVER_DESC); | 51 | MODULE_DESCRIPTION(DRIVER_DESC); |
diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c index 7e0acf5c8e38..407e23c87946 100644 --- a/drivers/usb/serial/whiteheat.c +++ b/drivers/usb/serial/whiteheat.c | |||
@@ -83,7 +83,6 @@ static struct usb_driver whiteheat_driver = { | |||
83 | .probe = usb_serial_probe, | 83 | .probe = usb_serial_probe, |
84 | .disconnect = usb_serial_disconnect, | 84 | .disconnect = usb_serial_disconnect, |
85 | .id_table = id_table_combined, | 85 | .id_table = id_table_combined, |
86 | .no_dynamic_id = 1, | ||
87 | }; | 86 | }; |
88 | 87 | ||
89 | /* function prototypes for the Connect Tech WhiteHEAT prerenumeration device */ | 88 | /* function prototypes for the Connect Tech WhiteHEAT prerenumeration device */ |
@@ -121,7 +120,6 @@ static struct usb_serial_driver whiteheat_fake_device = { | |||
121 | .name = "whiteheatnofirm", | 120 | .name = "whiteheatnofirm", |
122 | }, | 121 | }, |
123 | .description = "Connect Tech - WhiteHEAT - (prerenumeration)", | 122 | .description = "Connect Tech - WhiteHEAT - (prerenumeration)", |
124 | .usb_driver = &whiteheat_driver, | ||
125 | .id_table = id_table_prerenumeration, | 123 | .id_table = id_table_prerenumeration, |
126 | .num_ports = 1, | 124 | .num_ports = 1, |
127 | .probe = whiteheat_firmware_download, | 125 | .probe = whiteheat_firmware_download, |
@@ -134,7 +132,6 @@ static struct usb_serial_driver whiteheat_device = { | |||
134 | .name = "whiteheat", | 132 | .name = "whiteheat", |
135 | }, | 133 | }, |
136 | .description = "Connect Tech - WhiteHEAT", | 134 | .description = "Connect Tech - WhiteHEAT", |
137 | .usb_driver = &whiteheat_driver, | ||
138 | .id_table = id_table_std, | 135 | .id_table = id_table_std, |
139 | .num_ports = 4, | 136 | .num_ports = 4, |
140 | .attach = whiteheat_attach, | 137 | .attach = whiteheat_attach, |
@@ -155,6 +152,9 @@ static struct usb_serial_driver whiteheat_device = { | |||
155 | .write_bulk_callback = whiteheat_write_callback, | 152 | .write_bulk_callback = whiteheat_write_callback, |
156 | }; | 153 | }; |
157 | 154 | ||
155 | static struct usb_serial_driver * const serial_drivers[] = { | ||
156 | &whiteheat_fake_device, &whiteheat_device, NULL | ||
157 | }; | ||
158 | 158 | ||
159 | struct whiteheat_command_private { | 159 | struct whiteheat_command_private { |
160 | struct mutex mutex; | 160 | struct mutex mutex; |
@@ -740,7 +740,7 @@ static int whiteheat_write(struct tty_struct *tty, | |||
740 | urb->transfer_buffer_length = bytes; | 740 | urb->transfer_buffer_length = bytes; |
741 | result = usb_submit_urb(urb, GFP_ATOMIC); | 741 | result = usb_submit_urb(urb, GFP_ATOMIC); |
742 | if (result) { | 742 | if (result) { |
743 | dev_err(&port->dev, | 743 | dev_err_console(port, |
744 | "%s - failed submitting write urb, error %d\n", | 744 | "%s - failed submitting write urb, error %d\n", |
745 | __func__, result); | 745 | __func__, result); |
746 | sent = result; | 746 | sent = result; |
@@ -1454,44 +1454,7 @@ out: | |||
1454 | tty_kref_put(tty); | 1454 | tty_kref_put(tty); |
1455 | } | 1455 | } |
1456 | 1456 | ||
1457 | 1457 | module_usb_serial_driver(whiteheat_driver, serial_drivers); | |
1458 | /***************************************************************************** | ||
1459 | * Connect Tech's White Heat module functions | ||
1460 | *****************************************************************************/ | ||
1461 | static int __init whiteheat_init(void) | ||
1462 | { | ||
1463 | int retval; | ||
1464 | retval = usb_serial_register(&whiteheat_fake_device); | ||
1465 | if (retval) | ||
1466 | goto failed_fake_register; | ||
1467 | retval = usb_serial_register(&whiteheat_device); | ||
1468 | if (retval) | ||
1469 | goto failed_device_register; | ||
1470 | retval = usb_register(&whiteheat_driver); | ||
1471 | if (retval) | ||
1472 | goto failed_usb_register; | ||
1473 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | ||
1474 | DRIVER_DESC "\n"); | ||
1475 | return 0; | ||
1476 | failed_usb_register: | ||
1477 | usb_serial_deregister(&whiteheat_device); | ||
1478 | failed_device_register: | ||
1479 | usb_serial_deregister(&whiteheat_fake_device); | ||
1480 | failed_fake_register: | ||
1481 | return retval; | ||
1482 | } | ||
1483 | |||
1484 | |||
1485 | static void __exit whiteheat_exit(void) | ||
1486 | { | ||
1487 | usb_deregister(&whiteheat_driver); | ||
1488 | usb_serial_deregister(&whiteheat_fake_device); | ||
1489 | usb_serial_deregister(&whiteheat_device); | ||
1490 | } | ||
1491 | |||
1492 | |||
1493 | module_init(whiteheat_init); | ||
1494 | module_exit(whiteheat_exit); | ||
1495 | 1458 | ||
1496 | MODULE_AUTHOR(DRIVER_AUTHOR); | 1459 | MODULE_AUTHOR(DRIVER_AUTHOR); |
1497 | MODULE_DESCRIPTION(DRIVER_DESC); | 1460 | MODULE_DESCRIPTION(DRIVER_DESC); |
diff --git a/drivers/usb/serial/zio.c b/drivers/usb/serial/zio.c index f57967278833..9d0bb3752cd4 100644 --- a/drivers/usb/serial/zio.c +++ b/drivers/usb/serial/zio.c | |||
@@ -27,7 +27,6 @@ static struct usb_driver zio_driver = { | |||
27 | .probe = usb_serial_probe, | 27 | .probe = usb_serial_probe, |
28 | .disconnect = usb_serial_disconnect, | 28 | .disconnect = usb_serial_disconnect, |
29 | .id_table = id_table, | 29 | .id_table = id_table, |
30 | .no_dynamic_id = 1, | ||
31 | }; | 30 | }; |
32 | 31 | ||
33 | static struct usb_serial_driver zio_device = { | 32 | static struct usb_serial_driver zio_device = { |
@@ -36,29 +35,12 @@ static struct usb_serial_driver zio_device = { | |||
36 | .name = "zio", | 35 | .name = "zio", |
37 | }, | 36 | }, |
38 | .id_table = id_table, | 37 | .id_table = id_table, |
39 | .usb_driver = &zio_driver, | ||
40 | .num_ports = 1, | 38 | .num_ports = 1, |
41 | }; | 39 | }; |
42 | 40 | ||
43 | static int __init zio_init(void) | 41 | static struct usb_serial_driver * const serial_drivers[] = { |
44 | { | 42 | &zio_device, NULL |
45 | int retval; | 43 | }; |
46 | |||
47 | retval = usb_serial_register(&zio_device); | ||
48 | if (retval) | ||
49 | return retval; | ||
50 | retval = usb_register(&zio_driver); | ||
51 | if (retval) | ||
52 | usb_serial_deregister(&zio_device); | ||
53 | return retval; | ||
54 | } | ||
55 | |||
56 | static void __exit zio_exit(void) | ||
57 | { | ||
58 | usb_deregister(&zio_driver); | ||
59 | usb_serial_deregister(&zio_device); | ||
60 | } | ||
61 | 44 | ||
62 | module_init(zio_init); | 45 | module_usb_serial_driver(zio_driver, serial_drivers); |
63 | module_exit(zio_exit); | ||
64 | MODULE_LICENSE("GPL"); | 46 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/storage/alauda.c b/drivers/usb/storage/alauda.c index 51af2fee2efd..bab8c8fe8290 100644 --- a/drivers/usb/storage/alauda.c +++ b/drivers/usb/storage/alauda.c | |||
@@ -1276,6 +1276,7 @@ static struct usb_driver alauda_driver = { | |||
1276 | .post_reset = usb_stor_post_reset, | 1276 | .post_reset = usb_stor_post_reset, |
1277 | .id_table = alauda_usb_ids, | 1277 | .id_table = alauda_usb_ids, |
1278 | .soft_unbind = 1, | 1278 | .soft_unbind = 1, |
1279 | .no_dynamic_id = 1, | ||
1279 | }; | 1280 | }; |
1280 | 1281 | ||
1281 | module_usb_driver(alauda_driver); | 1282 | module_usb_driver(alauda_driver); |
diff --git a/drivers/usb/storage/cypress_atacb.c b/drivers/usb/storage/cypress_atacb.c index 387cbd47acc9..5fe451d16e68 100644 --- a/drivers/usb/storage/cypress_atacb.c +++ b/drivers/usb/storage/cypress_atacb.c | |||
@@ -272,6 +272,7 @@ static struct usb_driver cypress_driver = { | |||
272 | .post_reset = usb_stor_post_reset, | 272 | .post_reset = usb_stor_post_reset, |
273 | .id_table = cypress_usb_ids, | 273 | .id_table = cypress_usb_ids, |
274 | .soft_unbind = 1, | 274 | .soft_unbind = 1, |
275 | .no_dynamic_id = 1, | ||
275 | }; | 276 | }; |
276 | 277 | ||
277 | module_usb_driver(cypress_driver); | 278 | module_usb_driver(cypress_driver); |
diff --git a/drivers/usb/storage/datafab.c b/drivers/usb/storage/datafab.c index 15d41f2b3d6f..35e9c51e6696 100644 --- a/drivers/usb/storage/datafab.c +++ b/drivers/usb/storage/datafab.c | |||
@@ -751,6 +751,7 @@ static struct usb_driver datafab_driver = { | |||
751 | .post_reset = usb_stor_post_reset, | 751 | .post_reset = usb_stor_post_reset, |
752 | .id_table = datafab_usb_ids, | 752 | .id_table = datafab_usb_ids, |
753 | .soft_unbind = 1, | 753 | .soft_unbind = 1, |
754 | .no_dynamic_id = 1, | ||
754 | }; | 755 | }; |
755 | 756 | ||
756 | module_usb_driver(datafab_driver); | 757 | module_usb_driver(datafab_driver); |
diff --git a/drivers/usb/storage/ene_ub6250.c b/drivers/usb/storage/ene_ub6250.c index a6ade4071a9a..e7e678109500 100644 --- a/drivers/usb/storage/ene_ub6250.c +++ b/drivers/usb/storage/ene_ub6250.c | |||
@@ -674,7 +674,7 @@ static int sd_scsi_read(struct us_data *us, struct scsi_cmnd *srb) | |||
674 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); | 674 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); |
675 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); | 675 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); |
676 | bcb->DataTransferLength = blenByte; | 676 | bcb->DataTransferLength = blenByte; |
677 | bcb->Flags = 0x80; | 677 | bcb->Flags = US_BULK_FLAG_IN; |
678 | bcb->CDB[0] = 0xF1; | 678 | bcb->CDB[0] = 0xF1; |
679 | bcb->CDB[5] = (unsigned char)(bnByte); | 679 | bcb->CDB[5] = (unsigned char)(bnByte); |
680 | bcb->CDB[4] = (unsigned char)(bnByte>>8); | 680 | bcb->CDB[4] = (unsigned char)(bnByte>>8); |
@@ -858,7 +858,7 @@ static int ms_read_readpage(struct us_data *us, u32 PhyBlockAddr, | |||
858 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); | 858 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); |
859 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); | 859 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); |
860 | bcb->DataTransferLength = 0x200; | 860 | bcb->DataTransferLength = 0x200; |
861 | bcb->Flags = 0x80; | 861 | bcb->Flags = US_BULK_FLAG_IN; |
862 | bcb->CDB[0] = 0xF1; | 862 | bcb->CDB[0] = 0xF1; |
863 | 863 | ||
864 | bcb->CDB[1] = 0x02; /* in init.c ENE_MSInit() is 0x01 */ | 864 | bcb->CDB[1] = 0x02; /* in init.c ENE_MSInit() is 0x01 */ |
@@ -877,7 +877,7 @@ static int ms_read_readpage(struct us_data *us, u32 PhyBlockAddr, | |||
877 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); | 877 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); |
878 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); | 878 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); |
879 | bcb->DataTransferLength = 0x4; | 879 | bcb->DataTransferLength = 0x4; |
880 | bcb->Flags = 0x80; | 880 | bcb->Flags = US_BULK_FLAG_IN; |
881 | bcb->CDB[0] = 0xF1; | 881 | bcb->CDB[0] = 0xF1; |
882 | bcb->CDB[1] = 0x03; | 882 | bcb->CDB[1] = 0x03; |
883 | 883 | ||
@@ -1170,7 +1170,7 @@ static int ms_read_eraseblock(struct us_data *us, u32 PhyBlockAddr) | |||
1170 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); | 1170 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); |
1171 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); | 1171 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); |
1172 | bcb->DataTransferLength = 0x200; | 1172 | bcb->DataTransferLength = 0x200; |
1173 | bcb->Flags = 0x80; | 1173 | bcb->Flags = US_BULK_FLAG_IN; |
1174 | bcb->CDB[0] = 0xF2; | 1174 | bcb->CDB[0] = 0xF2; |
1175 | bcb->CDB[1] = 0x06; | 1175 | bcb->CDB[1] = 0x06; |
1176 | bcb->CDB[4] = (unsigned char)(bn); | 1176 | bcb->CDB[4] = (unsigned char)(bn); |
@@ -1249,7 +1249,7 @@ static int ms_lib_overwrite_extra(struct us_data *us, u32 PhyBlockAddr, | |||
1249 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); | 1249 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); |
1250 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); | 1250 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); |
1251 | bcb->DataTransferLength = 0x4; | 1251 | bcb->DataTransferLength = 0x4; |
1252 | bcb->Flags = 0x80; | 1252 | bcb->Flags = US_BULK_FLAG_IN; |
1253 | bcb->CDB[0] = 0xF2; | 1253 | bcb->CDB[0] = 0xF2; |
1254 | bcb->CDB[1] = 0x05; | 1254 | bcb->CDB[1] = 0x05; |
1255 | bcb->CDB[5] = (unsigned char)(PageNum); | 1255 | bcb->CDB[5] = (unsigned char)(PageNum); |
@@ -1331,7 +1331,7 @@ static int ms_lib_read_extra(struct us_data *us, u32 PhyBlock, | |||
1331 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); | 1331 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); |
1332 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); | 1332 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); |
1333 | bcb->DataTransferLength = 0x4; | 1333 | bcb->DataTransferLength = 0x4; |
1334 | bcb->Flags = 0x80; | 1334 | bcb->Flags = US_BULK_FLAG_IN; |
1335 | bcb->CDB[0] = 0xF1; | 1335 | bcb->CDB[0] = 0xF1; |
1336 | bcb->CDB[1] = 0x03; | 1336 | bcb->CDB[1] = 0x03; |
1337 | bcb->CDB[5] = (unsigned char)(PageNum); | 1337 | bcb->CDB[5] = (unsigned char)(PageNum); |
@@ -1533,7 +1533,7 @@ static int ms_lib_read_extrablock(struct us_data *us, u32 PhyBlock, | |||
1533 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); | 1533 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); |
1534 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); | 1534 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); |
1535 | bcb->DataTransferLength = 0x4 * blen; | 1535 | bcb->DataTransferLength = 0x4 * blen; |
1536 | bcb->Flags = 0x80; | 1536 | bcb->Flags = US_BULK_FLAG_IN; |
1537 | bcb->CDB[0] = 0xF1; | 1537 | bcb->CDB[0] = 0xF1; |
1538 | bcb->CDB[1] = 0x03; | 1538 | bcb->CDB[1] = 0x03; |
1539 | bcb->CDB[5] = (unsigned char)(PageNum); | 1539 | bcb->CDB[5] = (unsigned char)(PageNum); |
@@ -1650,7 +1650,7 @@ static int ms_scsi_read(struct us_data *us, struct scsi_cmnd *srb) | |||
1650 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); | 1650 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); |
1651 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); | 1651 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); |
1652 | bcb->DataTransferLength = blenByte; | 1652 | bcb->DataTransferLength = blenByte; |
1653 | bcb->Flags = 0x80; | 1653 | bcb->Flags = US_BULK_FLAG_IN; |
1654 | bcb->CDB[0] = 0xF1; | 1654 | bcb->CDB[0] = 0xF1; |
1655 | bcb->CDB[1] = 0x02; | 1655 | bcb->CDB[1] = 0x02; |
1656 | bcb->CDB[5] = (unsigned char)(bn); | 1656 | bcb->CDB[5] = (unsigned char)(bn); |
@@ -1694,7 +1694,7 @@ static int ms_scsi_read(struct us_data *us, struct scsi_cmnd *srb) | |||
1694 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); | 1694 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); |
1695 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); | 1695 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); |
1696 | bcb->DataTransferLength = 0x200 * len; | 1696 | bcb->DataTransferLength = 0x200 * len; |
1697 | bcb->Flags = 0x80; | 1697 | bcb->Flags = US_BULK_FLAG_IN; |
1698 | bcb->CDB[0] = 0xF1; | 1698 | bcb->CDB[0] = 0xF1; |
1699 | bcb->CDB[1] = 0x02; | 1699 | bcb->CDB[1] = 0x02; |
1700 | bcb->CDB[5] = (unsigned char)(blkno); | 1700 | bcb->CDB[5] = (unsigned char)(blkno); |
@@ -1827,7 +1827,7 @@ static int ene_get_card_type(struct us_data *us, u16 index, void *buf) | |||
1827 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); | 1827 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); |
1828 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); | 1828 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); |
1829 | bcb->DataTransferLength = 0x01; | 1829 | bcb->DataTransferLength = 0x01; |
1830 | bcb->Flags = 0x80; | 1830 | bcb->Flags = US_BULK_FLAG_IN; |
1831 | bcb->CDB[0] = 0xED; | 1831 | bcb->CDB[0] = 0xED; |
1832 | bcb->CDB[2] = (unsigned char)(index>>8); | 1832 | bcb->CDB[2] = (unsigned char)(index>>8); |
1833 | bcb->CDB[3] = (unsigned char)index; | 1833 | bcb->CDB[3] = (unsigned char)index; |
@@ -2083,7 +2083,7 @@ static int ene_ms_init(struct us_data *us) | |||
2083 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); | 2083 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); |
2084 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); | 2084 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); |
2085 | bcb->DataTransferLength = 0x200; | 2085 | bcb->DataTransferLength = 0x200; |
2086 | bcb->Flags = 0x80; | 2086 | bcb->Flags = US_BULK_FLAG_IN; |
2087 | bcb->CDB[0] = 0xF1; | 2087 | bcb->CDB[0] = 0xF1; |
2088 | bcb->CDB[1] = 0x01; | 2088 | bcb->CDB[1] = 0x01; |
2089 | 2089 | ||
@@ -2134,7 +2134,7 @@ static int ene_sd_init(struct us_data *us) | |||
2134 | 2134 | ||
2135 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); | 2135 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); |
2136 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); | 2136 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); |
2137 | bcb->Flags = 0x80; | 2137 | bcb->Flags = US_BULK_FLAG_IN; |
2138 | bcb->CDB[0] = 0xF2; | 2138 | bcb->CDB[0] = 0xF2; |
2139 | 2139 | ||
2140 | result = ene_send_scsi_cmd(us, FDIR_READ, NULL, 0); | 2140 | result = ene_send_scsi_cmd(us, FDIR_READ, NULL, 0); |
@@ -2153,7 +2153,7 @@ static int ene_sd_init(struct us_data *us) | |||
2153 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); | 2153 | memset(bcb, 0, sizeof(struct bulk_cb_wrap)); |
2154 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); | 2154 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); |
2155 | bcb->DataTransferLength = 0x200; | 2155 | bcb->DataTransferLength = 0x200; |
2156 | bcb->Flags = 0x80; | 2156 | bcb->Flags = US_BULK_FLAG_IN; |
2157 | bcb->CDB[0] = 0xF1; | 2157 | bcb->CDB[0] = 0xF1; |
2158 | 2158 | ||
2159 | result = ene_send_scsi_cmd(us, FDIR_READ, &buf, 0); | 2159 | result = ene_send_scsi_cmd(us, FDIR_READ, &buf, 0); |
@@ -2407,6 +2407,7 @@ static struct usb_driver ene_ub6250_driver = { | |||
2407 | .post_reset = usb_stor_post_reset, | 2407 | .post_reset = usb_stor_post_reset, |
2408 | .id_table = ene_ub6250_usb_ids, | 2408 | .id_table = ene_ub6250_usb_ids, |
2409 | .soft_unbind = 1, | 2409 | .soft_unbind = 1, |
2410 | .no_dynamic_id = 1, | ||
2410 | }; | 2411 | }; |
2411 | 2412 | ||
2412 | module_usb_driver(ene_ub6250_driver); | 2413 | module_usb_driver(ene_ub6250_driver); |
diff --git a/drivers/usb/storage/freecom.c b/drivers/usb/storage/freecom.c index fa1615748475..042cf9ef3153 100644 --- a/drivers/usb/storage/freecom.c +++ b/drivers/usb/storage/freecom.c | |||
@@ -553,6 +553,7 @@ static struct usb_driver freecom_driver = { | |||
553 | .post_reset = usb_stor_post_reset, | 553 | .post_reset = usb_stor_post_reset, |
554 | .id_table = freecom_usb_ids, | 554 | .id_table = freecom_usb_ids, |
555 | .soft_unbind = 1, | 555 | .soft_unbind = 1, |
556 | .no_dynamic_id = 1, | ||
556 | }; | 557 | }; |
557 | 558 | ||
558 | module_usb_driver(freecom_driver); | 559 | module_usb_driver(freecom_driver); |
diff --git a/drivers/usb/storage/isd200.c b/drivers/usb/storage/isd200.c index bd5502700831..31fa24e7e68a 100644 --- a/drivers/usb/storage/isd200.c +++ b/drivers/usb/storage/isd200.c | |||
@@ -1566,6 +1566,7 @@ static struct usb_driver isd200_driver = { | |||
1566 | .post_reset = usb_stor_post_reset, | 1566 | .post_reset = usb_stor_post_reset, |
1567 | .id_table = isd200_usb_ids, | 1567 | .id_table = isd200_usb_ids, |
1568 | .soft_unbind = 1, | 1568 | .soft_unbind = 1, |
1569 | .no_dynamic_id = 1, | ||
1569 | }; | 1570 | }; |
1570 | 1571 | ||
1571 | module_usb_driver(isd200_driver); | 1572 | module_usb_driver(isd200_driver); |
diff --git a/drivers/usb/storage/jumpshot.c b/drivers/usb/storage/jumpshot.c index a19211b5c265..e3b97383186a 100644 --- a/drivers/usb/storage/jumpshot.c +++ b/drivers/usb/storage/jumpshot.c | |||
@@ -677,6 +677,7 @@ static struct usb_driver jumpshot_driver = { | |||
677 | .post_reset = usb_stor_post_reset, | 677 | .post_reset = usb_stor_post_reset, |
678 | .id_table = jumpshot_usb_ids, | 678 | .id_table = jumpshot_usb_ids, |
679 | .soft_unbind = 1, | 679 | .soft_unbind = 1, |
680 | .no_dynamic_id = 1, | ||
680 | }; | 681 | }; |
681 | 682 | ||
682 | module_usb_driver(jumpshot_driver); | 683 | module_usb_driver(jumpshot_driver); |
diff --git a/drivers/usb/storage/karma.c b/drivers/usb/storage/karma.c index e720f8ebdf9f..a8708eae9788 100644 --- a/drivers/usb/storage/karma.c +++ b/drivers/usb/storage/karma.c | |||
@@ -230,6 +230,7 @@ static struct usb_driver karma_driver = { | |||
230 | .post_reset = usb_stor_post_reset, | 230 | .post_reset = usb_stor_post_reset, |
231 | .id_table = karma_usb_ids, | 231 | .id_table = karma_usb_ids, |
232 | .soft_unbind = 1, | 232 | .soft_unbind = 1, |
233 | .no_dynamic_id = 1, | ||
233 | }; | 234 | }; |
234 | 235 | ||
235 | module_usb_driver(karma_driver); | 236 | module_usb_driver(karma_driver); |
diff --git a/drivers/usb/storage/onetouch.c b/drivers/usb/storage/onetouch.c index d75155c38200..886567a3806d 100644 --- a/drivers/usb/storage/onetouch.c +++ b/drivers/usb/storage/onetouch.c | |||
@@ -312,6 +312,7 @@ static struct usb_driver onetouch_driver = { | |||
312 | .post_reset = usb_stor_post_reset, | 312 | .post_reset = usb_stor_post_reset, |
313 | .id_table = onetouch_usb_ids, | 313 | .id_table = onetouch_usb_ids, |
314 | .soft_unbind = 1, | 314 | .soft_unbind = 1, |
315 | .no_dynamic_id = 1, | ||
315 | }; | 316 | }; |
316 | 317 | ||
317 | module_usb_driver(onetouch_driver); | 318 | module_usb_driver(onetouch_driver); |
diff --git a/drivers/usb/storage/realtek_cr.c b/drivers/usb/storage/realtek_cr.c index d32f72061c09..63cf2822e299 100644 --- a/drivers/usb/storage/realtek_cr.c +++ b/drivers/usb/storage/realtek_cr.c | |||
@@ -219,7 +219,7 @@ static int rts51x_bulk_transport(struct us_data *us, u8 lun, | |||
219 | /* set up the command wrapper */ | 219 | /* set up the command wrapper */ |
220 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); | 220 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); |
221 | bcb->DataTransferLength = cpu_to_le32(buf_len); | 221 | bcb->DataTransferLength = cpu_to_le32(buf_len); |
222 | bcb->Flags = (dir == DMA_FROM_DEVICE) ? 1 << 7 : 0; | 222 | bcb->Flags = (dir == DMA_FROM_DEVICE) ? US_BULK_FLAG_IN : 0; |
223 | bcb->Tag = ++us->tag; | 223 | bcb->Tag = ++us->tag; |
224 | bcb->Lun = lun; | 224 | bcb->Lun = lun; |
225 | bcb->Length = cmd_len; | 225 | bcb->Length = cmd_len; |
@@ -305,7 +305,7 @@ static int rts51x_bulk_transport_special(struct us_data *us, u8 lun, | |||
305 | /* set up the command wrapper */ | 305 | /* set up the command wrapper */ |
306 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); | 306 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); |
307 | bcb->DataTransferLength = cpu_to_le32(buf_len); | 307 | bcb->DataTransferLength = cpu_to_le32(buf_len); |
308 | bcb->Flags = (dir == DMA_FROM_DEVICE) ? 1 << 7 : 0; | 308 | bcb->Flags = (dir == DMA_FROM_DEVICE) ? US_BULK_FLAG_IN : 0; |
309 | bcb->Tag = ++us->tag; | 309 | bcb->Tag = ++us->tag; |
310 | bcb->Lun = lun; | 310 | bcb->Lun = lun; |
311 | bcb->Length = cmd_len; | 311 | bcb->Length = cmd_len; |
@@ -507,9 +507,14 @@ static int __do_config_autodelink(struct us_data *us, u8 *data, u16 len) | |||
507 | { | 507 | { |
508 | int retval; | 508 | int retval; |
509 | u8 cmnd[12] = {0}; | 509 | u8 cmnd[12] = {0}; |
510 | u8 *buf; | ||
510 | 511 | ||
511 | US_DEBUGP("%s, addr = 0xfe47, len = %d\n", __FUNCTION__, len); | 512 | US_DEBUGP("%s, addr = 0xfe47, len = %d\n", __FUNCTION__, len); |
512 | 513 | ||
514 | buf = kmemdup(data, len, GFP_NOIO); | ||
515 | if (!buf) | ||
516 | return USB_STOR_TRANSPORT_ERROR; | ||
517 | |||
513 | cmnd[0] = 0xF0; | 518 | cmnd[0] = 0xF0; |
514 | cmnd[1] = 0x0E; | 519 | cmnd[1] = 0x0E; |
515 | cmnd[2] = 0xfe; | 520 | cmnd[2] = 0xfe; |
@@ -517,7 +522,8 @@ static int __do_config_autodelink(struct us_data *us, u8 *data, u16 len) | |||
517 | cmnd[4] = (u8)(len >> 8); | 522 | cmnd[4] = (u8)(len >> 8); |
518 | cmnd[5] = (u8)len; | 523 | cmnd[5] = (u8)len; |
519 | 524 | ||
520 | retval = rts51x_bulk_transport_special(us, 0, cmnd, 12, data, len, DMA_TO_DEVICE, NULL); | 525 | retval = rts51x_bulk_transport_special(us, 0, cmnd, 12, buf, len, DMA_TO_DEVICE, NULL); |
526 | kfree(buf); | ||
521 | if (retval != USB_STOR_TRANSPORT_GOOD) { | 527 | if (retval != USB_STOR_TRANSPORT_GOOD) { |
522 | return -EIO; | 528 | return -EIO; |
523 | } | 529 | } |
@@ -1100,6 +1106,7 @@ static struct usb_driver realtek_cr_driver = { | |||
1100 | .id_table = realtek_cr_ids, | 1106 | .id_table = realtek_cr_ids, |
1101 | .soft_unbind = 1, | 1107 | .soft_unbind = 1, |
1102 | .supports_autosuspend = 1, | 1108 | .supports_autosuspend = 1, |
1109 | .no_dynamic_id = 1, | ||
1103 | }; | 1110 | }; |
1104 | 1111 | ||
1105 | module_usb_driver(realtek_cr_driver); | 1112 | module_usb_driver(realtek_cr_driver); |
diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c index 13b8bcdf3dba..a324a5d21e99 100644 --- a/drivers/usb/storage/scsiglue.c +++ b/drivers/usb/storage/scsiglue.c | |||
@@ -78,8 +78,6 @@ static const char* host_info(struct Scsi_Host *host) | |||
78 | 78 | ||
79 | static int slave_alloc (struct scsi_device *sdev) | 79 | static int slave_alloc (struct scsi_device *sdev) |
80 | { | 80 | { |
81 | struct us_data *us = host_to_us(sdev->host); | ||
82 | |||
83 | /* | 81 | /* |
84 | * Set the INQUIRY transfer length to 36. We don't use any of | 82 | * Set the INQUIRY transfer length to 36. We don't use any of |
85 | * the extra data and many devices choke if asked for more or | 83 | * the extra data and many devices choke if asked for more or |
@@ -104,18 +102,6 @@ static int slave_alloc (struct scsi_device *sdev) | |||
104 | */ | 102 | */ |
105 | blk_queue_update_dma_alignment(sdev->request_queue, (512 - 1)); | 103 | blk_queue_update_dma_alignment(sdev->request_queue, (512 - 1)); |
106 | 104 | ||
107 | /* | ||
108 | * The UFI spec treates the Peripheral Qualifier bits in an | ||
109 | * INQUIRY result as reserved and requires devices to set them | ||
110 | * to 0. However the SCSI spec requires these bits to be set | ||
111 | * to 3 to indicate when a LUN is not present. | ||
112 | * | ||
113 | * Let the scanning code know if this target merely sets | ||
114 | * Peripheral Device Type to 0x1f to indicate no LUN. | ||
115 | */ | ||
116 | if (us->subclass == USB_SC_UFI) | ||
117 | sdev->sdev_target->pdt_1f_for_no_lun = 1; | ||
118 | |||
119 | return 0; | 105 | return 0; |
120 | } | 106 | } |
121 | 107 | ||
@@ -197,6 +183,9 @@ static int slave_configure(struct scsi_device *sdev) | |||
197 | * page x08, so we will skip it. */ | 183 | * page x08, so we will skip it. */ |
198 | sdev->skip_ms_page_8 = 1; | 184 | sdev->skip_ms_page_8 = 1; |
199 | 185 | ||
186 | /* Some devices don't handle VPD pages correctly */ | ||
187 | sdev->skip_vpd_pages = 1; | ||
188 | |||
200 | /* Some disks return the total number of blocks in response | 189 | /* Some disks return the total number of blocks in response |
201 | * to READ CAPACITY rather than the highest block number. | 190 | * to READ CAPACITY rather than the highest block number. |
202 | * If this device makes that mistake, tell the sd driver. */ | 191 | * If this device makes that mistake, tell the sd driver. */ |
@@ -217,16 +206,6 @@ static int slave_configure(struct scsi_device *sdev) | |||
217 | if (sdev->scsi_level > SCSI_SPC_2) | 206 | if (sdev->scsi_level > SCSI_SPC_2) |
218 | us->fflags |= US_FL_SANE_SENSE; | 207 | us->fflags |= US_FL_SANE_SENSE; |
219 | 208 | ||
220 | /* Some devices report a SCSI revision level above 2 but are | ||
221 | * unable to handle the REPORT LUNS command (for which | ||
222 | * support is mandatory at level 3). Since we already have | ||
223 | * a Get-Max-LUN request, we won't lose much by setting the | ||
224 | * revision level down to 2. The only devices that would be | ||
225 | * affected are those with sparse LUNs. */ | ||
226 | if (sdev->scsi_level > SCSI_2) | ||
227 | sdev->sdev_target->scsi_level = | ||
228 | sdev->scsi_level = SCSI_2; | ||
229 | |||
230 | /* USB-IDE bridges tend to report SK = 0x04 (Non-recoverable | 209 | /* USB-IDE bridges tend to report SK = 0x04 (Non-recoverable |
231 | * Hardware Error) when any low-level error occurs, | 210 | * Hardware Error) when any low-level error occurs, |
232 | * recoverable or not. Setting this flag tells the SCSI | 211 | * recoverable or not. Setting this flag tells the SCSI |
@@ -283,6 +262,33 @@ static int slave_configure(struct scsi_device *sdev) | |||
283 | return 0; | 262 | return 0; |
284 | } | 263 | } |
285 | 264 | ||
265 | static int target_alloc(struct scsi_target *starget) | ||
266 | { | ||
267 | struct us_data *us = host_to_us(dev_to_shost(starget->dev.parent)); | ||
268 | |||
269 | /* | ||
270 | * Some USB drives don't support REPORT LUNS, even though they | ||
271 | * report a SCSI revision level above 2. Tell the SCSI layer | ||
272 | * not to issue that command; it will perform a normal sequential | ||
273 | * scan instead. | ||
274 | */ | ||
275 | starget->no_report_luns = 1; | ||
276 | |||
277 | /* | ||
278 | * The UFI spec treats the Peripheral Qualifier bits in an | ||
279 | * INQUIRY result as reserved and requires devices to set them | ||
280 | * to 0. However the SCSI spec requires these bits to be set | ||
281 | * to 3 to indicate when a LUN is not present. | ||
282 | * | ||
283 | * Let the scanning code know if this target merely sets | ||
284 | * Peripheral Device Type to 0x1f to indicate no LUN. | ||
285 | */ | ||
286 | if (us->subclass == USB_SC_UFI) | ||
287 | starget->pdt_1f_for_no_lun = 1; | ||
288 | |||
289 | return 0; | ||
290 | } | ||
291 | |||
286 | /* queue a command */ | 292 | /* queue a command */ |
287 | /* This is always called with scsi_lock(host) held */ | 293 | /* This is always called with scsi_lock(host) held */ |
288 | static int queuecommand_lck(struct scsi_cmnd *srb, | 294 | static int queuecommand_lck(struct scsi_cmnd *srb, |
@@ -546,6 +552,7 @@ struct scsi_host_template usb_stor_host_template = { | |||
546 | 552 | ||
547 | .slave_alloc = slave_alloc, | 553 | .slave_alloc = slave_alloc, |
548 | .slave_configure = slave_configure, | 554 | .slave_configure = slave_configure, |
555 | .target_alloc = target_alloc, | ||
549 | 556 | ||
550 | /* lots of sg segments can be handled */ | 557 | /* lots of sg segments can be handled */ |
551 | .sg_tablesize = SCSI_MAX_SG_CHAIN_SEGMENTS, | 558 | .sg_tablesize = SCSI_MAX_SG_CHAIN_SEGMENTS, |
diff --git a/drivers/usb/storage/sddr09.c b/drivers/usb/storage/sddr09.c index 425df7df2e56..3252a62b31bc 100644 --- a/drivers/usb/storage/sddr09.c +++ b/drivers/usb/storage/sddr09.c | |||
@@ -1787,6 +1787,7 @@ static struct usb_driver sddr09_driver = { | |||
1787 | .post_reset = usb_stor_post_reset, | 1787 | .post_reset = usb_stor_post_reset, |
1788 | .id_table = sddr09_usb_ids, | 1788 | .id_table = sddr09_usb_ids, |
1789 | .soft_unbind = 1, | 1789 | .soft_unbind = 1, |
1790 | .no_dynamic_id = 1, | ||
1790 | }; | 1791 | }; |
1791 | 1792 | ||
1792 | module_usb_driver(sddr09_driver); | 1793 | module_usb_driver(sddr09_driver); |
diff --git a/drivers/usb/storage/sddr55.c b/drivers/usb/storage/sddr55.c index e4ca5fcb7cc3..c144078065a7 100644 --- a/drivers/usb/storage/sddr55.c +++ b/drivers/usb/storage/sddr55.c | |||
@@ -1006,6 +1006,7 @@ static struct usb_driver sddr55_driver = { | |||
1006 | .post_reset = usb_stor_post_reset, | 1006 | .post_reset = usb_stor_post_reset, |
1007 | .id_table = sddr55_usb_ids, | 1007 | .id_table = sddr55_usb_ids, |
1008 | .soft_unbind = 1, | 1008 | .soft_unbind = 1, |
1009 | .no_dynamic_id = 1, | ||
1009 | }; | 1010 | }; |
1010 | 1011 | ||
1011 | module_usb_driver(sddr55_driver); | 1012 | module_usb_driver(sddr55_driver); |
diff --git a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c index 1369d2590616..fa1ceebc465c 100644 --- a/drivers/usb/storage/shuttle_usbat.c +++ b/drivers/usb/storage/shuttle_usbat.c | |||
@@ -1863,6 +1863,7 @@ static struct usb_driver usbat_driver = { | |||
1863 | .post_reset = usb_stor_post_reset, | 1863 | .post_reset = usb_stor_post_reset, |
1864 | .id_table = usbat_usb_ids, | 1864 | .id_table = usbat_usb_ids, |
1865 | .soft_unbind = 1, | 1865 | .soft_unbind = 1, |
1866 | .no_dynamic_id = 1, | ||
1866 | }; | 1867 | }; |
1867 | 1868 | ||
1868 | module_usb_driver(usbat_driver); | 1869 | module_usb_driver(usbat_driver); |
diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c index 0e5c91c6187f..c70109e5d60b 100644 --- a/drivers/usb/storage/transport.c +++ b/drivers/usb/storage/transport.c | |||
@@ -1071,7 +1071,8 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us) | |||
1071 | /* set up the command wrapper */ | 1071 | /* set up the command wrapper */ |
1072 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); | 1072 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); |
1073 | bcb->DataTransferLength = cpu_to_le32(transfer_length); | 1073 | bcb->DataTransferLength = cpu_to_le32(transfer_length); |
1074 | bcb->Flags = srb->sc_data_direction == DMA_FROM_DEVICE ? 1 << 7 : 0; | 1074 | bcb->Flags = srb->sc_data_direction == DMA_FROM_DEVICE ? |
1075 | US_BULK_FLAG_IN : 0; | ||
1075 | bcb->Tag = ++us->tag; | 1076 | bcb->Tag = ++us->tag; |
1076 | bcb->Lun = srb->device->lun; | 1077 | bcb->Lun = srb->device->lun; |
1077 | if (us->fflags & US_FL_SCM_MULT_TARG) | 1078 | if (us->fflags & US_FL_SCM_MULT_TARG) |
diff --git a/drivers/usb/storage/transport.h b/drivers/usb/storage/transport.h index 242ff5e791a5..9369d752d419 100644 --- a/drivers/usb/storage/transport.h +++ b/drivers/usb/storage/transport.h | |||
@@ -42,45 +42,6 @@ | |||
42 | #include <linux/blkdev.h> | 42 | #include <linux/blkdev.h> |
43 | 43 | ||
44 | /* | 44 | /* |
45 | * Bulk only data structures | ||
46 | */ | ||
47 | |||
48 | /* command block wrapper */ | ||
49 | struct bulk_cb_wrap { | ||
50 | __le32 Signature; /* contains 'USBC' */ | ||
51 | __u32 Tag; /* unique per command id */ | ||
52 | __le32 DataTransferLength; /* size of data */ | ||
53 | __u8 Flags; /* direction in bit 0 */ | ||
54 | __u8 Lun; /* LUN normally 0 */ | ||
55 | __u8 Length; /* of of the CDB */ | ||
56 | __u8 CDB[16]; /* max command */ | ||
57 | }; | ||
58 | |||
59 | #define US_BULK_CB_WRAP_LEN 31 | ||
60 | #define US_BULK_CB_SIGN 0x43425355 /*spells out USBC */ | ||
61 | #define US_BULK_FLAG_IN 1 | ||
62 | #define US_BULK_FLAG_OUT 0 | ||
63 | |||
64 | /* command status wrapper */ | ||
65 | struct bulk_cs_wrap { | ||
66 | __le32 Signature; /* should = 'USBS' */ | ||
67 | __u32 Tag; /* same as original command */ | ||
68 | __le32 Residue; /* amount not transferred */ | ||
69 | __u8 Status; /* see below */ | ||
70 | __u8 Filler[18]; | ||
71 | }; | ||
72 | |||
73 | #define US_BULK_CS_WRAP_LEN 13 | ||
74 | #define US_BULK_CS_SIGN 0x53425355 /* spells out 'USBS' */ | ||
75 | #define US_BULK_STAT_OK 0 | ||
76 | #define US_BULK_STAT_FAIL 1 | ||
77 | #define US_BULK_STAT_PHASE 2 | ||
78 | |||
79 | /* bulk-only class specific requests */ | ||
80 | #define US_BULK_RESET_REQUEST 0xff | ||
81 | #define US_BULK_GET_MAX_LUN 0xfe | ||
82 | |||
83 | /* | ||
84 | * usb_stor_bulk_transfer_xxx() return codes, in order of severity | 45 | * usb_stor_bulk_transfer_xxx() return codes, in order of severity |
85 | */ | 46 | */ |
86 | 47 | ||
diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c index a33ead5dce20..8ec8a6e66f50 100644 --- a/drivers/usb/storage/uas.c +++ b/drivers/usb/storage/uas.c | |||
@@ -13,7 +13,9 @@ | |||
13 | #include <linux/types.h> | 13 | #include <linux/types.h> |
14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
15 | #include <linux/usb.h> | 15 | #include <linux/usb.h> |
16 | #include <linux/usb/hcd.h> | ||
16 | #include <linux/usb/storage.h> | 17 | #include <linux/usb/storage.h> |
18 | #include <linux/usb/uas.h> | ||
17 | 19 | ||
18 | #include <scsi/scsi.h> | 20 | #include <scsi/scsi.h> |
19 | #include <scsi/scsi_dbg.h> | 21 | #include <scsi/scsi_dbg.h> |
@@ -22,49 +24,6 @@ | |||
22 | #include <scsi/scsi_host.h> | 24 | #include <scsi/scsi_host.h> |
23 | #include <scsi/scsi_tcq.h> | 25 | #include <scsi/scsi_tcq.h> |
24 | 26 | ||
25 | /* Common header for all IUs */ | ||
26 | struct iu { | ||
27 | __u8 iu_id; | ||
28 | __u8 rsvd1; | ||
29 | __be16 tag; | ||
30 | }; | ||
31 | |||
32 | enum { | ||
33 | IU_ID_COMMAND = 0x01, | ||
34 | IU_ID_STATUS = 0x03, | ||
35 | IU_ID_RESPONSE = 0x04, | ||
36 | IU_ID_TASK_MGMT = 0x05, | ||
37 | IU_ID_READ_READY = 0x06, | ||
38 | IU_ID_WRITE_READY = 0x07, | ||
39 | }; | ||
40 | |||
41 | struct command_iu { | ||
42 | __u8 iu_id; | ||
43 | __u8 rsvd1; | ||
44 | __be16 tag; | ||
45 | __u8 prio_attr; | ||
46 | __u8 rsvd5; | ||
47 | __u8 len; | ||
48 | __u8 rsvd7; | ||
49 | struct scsi_lun lun; | ||
50 | __u8 cdb[16]; /* XXX: Overflow-checking tools may misunderstand */ | ||
51 | }; | ||
52 | |||
53 | /* | ||
54 | * Also used for the Read Ready and Write Ready IUs since they have the | ||
55 | * same first four bytes | ||
56 | */ | ||
57 | struct sense_iu { | ||
58 | __u8 iu_id; | ||
59 | __u8 rsvd1; | ||
60 | __be16 tag; | ||
61 | __be16 status_qual; | ||
62 | __u8 status; | ||
63 | __u8 rsvd7[7]; | ||
64 | __be16 len; | ||
65 | __u8 sense[SCSI_SENSE_BUFFERSIZE]; | ||
66 | }; | ||
67 | |||
68 | /* | 27 | /* |
69 | * The r00-r01c specs define this version of the SENSE IU data structure. | 28 | * The r00-r01c specs define this version of the SENSE IU data structure. |
70 | * It's still in use by several different firmware releases. | 29 | * It's still in use by several different firmware releases. |
@@ -79,18 +38,6 @@ struct sense_iu_old { | |||
79 | __u8 sense[SCSI_SENSE_BUFFERSIZE]; | 38 | __u8 sense[SCSI_SENSE_BUFFERSIZE]; |
80 | }; | 39 | }; |
81 | 40 | ||
82 | enum { | ||
83 | CMD_PIPE_ID = 1, | ||
84 | STATUS_PIPE_ID = 2, | ||
85 | DATA_IN_PIPE_ID = 3, | ||
86 | DATA_OUT_PIPE_ID = 4, | ||
87 | |||
88 | UAS_SIMPLE_TAG = 0, | ||
89 | UAS_HEAD_TAG = 1, | ||
90 | UAS_ORDERED_TAG = 2, | ||
91 | UAS_ACA = 4, | ||
92 | }; | ||
93 | |||
94 | struct uas_dev_info { | 41 | struct uas_dev_info { |
95 | struct usb_interface *intf; | 42 | struct usb_interface *intf; |
96 | struct usb_device *udev; | 43 | struct usb_device *udev; |
@@ -98,6 +45,8 @@ struct uas_dev_info { | |||
98 | unsigned cmd_pipe, status_pipe, data_in_pipe, data_out_pipe; | 45 | unsigned cmd_pipe, status_pipe, data_in_pipe, data_out_pipe; |
99 | unsigned use_streams:1; | 46 | unsigned use_streams:1; |
100 | unsigned uas_sense_old:1; | 47 | unsigned uas_sense_old:1; |
48 | struct scsi_cmnd *cmnd; | ||
49 | struct urb *status_urb; /* used only if stream support is available */ | ||
101 | }; | 50 | }; |
102 | 51 | ||
103 | enum { | 52 | enum { |
@@ -109,6 +58,9 @@ enum { | |||
109 | SUBMIT_DATA_OUT_URB = (1 << 5), | 58 | SUBMIT_DATA_OUT_URB = (1 << 5), |
110 | ALLOC_CMD_URB = (1 << 6), | 59 | ALLOC_CMD_URB = (1 << 6), |
111 | SUBMIT_CMD_URB = (1 << 7), | 60 | SUBMIT_CMD_URB = (1 << 7), |
61 | COMPLETED_DATA_IN = (1 << 8), | ||
62 | COMPLETED_DATA_OUT = (1 << 9), | ||
63 | DATA_COMPLETES_CMD = (1 << 10), | ||
112 | }; | 64 | }; |
113 | 65 | ||
114 | /* Overrides scsi_pointer */ | 66 | /* Overrides scsi_pointer */ |
@@ -116,6 +68,7 @@ struct uas_cmd_info { | |||
116 | unsigned int state; | 68 | unsigned int state; |
117 | unsigned int stream; | 69 | unsigned int stream; |
118 | struct urb *cmd_urb; | 70 | struct urb *cmd_urb; |
71 | /* status_urb is used only if stream support isn't available */ | ||
119 | struct urb *status_urb; | 72 | struct urb *status_urb; |
120 | struct urb *data_in_urb; | 73 | struct urb *data_in_urb; |
121 | struct urb *data_out_urb; | 74 | struct urb *data_out_urb; |
@@ -125,33 +78,43 @@ struct uas_cmd_info { | |||
125 | /* I hate forward declarations, but I actually have a loop */ | 78 | /* I hate forward declarations, but I actually have a loop */ |
126 | static int uas_submit_urbs(struct scsi_cmnd *cmnd, | 79 | static int uas_submit_urbs(struct scsi_cmnd *cmnd, |
127 | struct uas_dev_info *devinfo, gfp_t gfp); | 80 | struct uas_dev_info *devinfo, gfp_t gfp); |
81 | static void uas_do_work(struct work_struct *work); | ||
128 | 82 | ||
83 | static DECLARE_WORK(uas_work, uas_do_work); | ||
129 | static DEFINE_SPINLOCK(uas_work_lock); | 84 | static DEFINE_SPINLOCK(uas_work_lock); |
130 | static LIST_HEAD(uas_work_list); | 85 | static LIST_HEAD(uas_work_list); |
131 | 86 | ||
132 | static void uas_do_work(struct work_struct *work) | 87 | static void uas_do_work(struct work_struct *work) |
133 | { | 88 | { |
134 | struct uas_cmd_info *cmdinfo; | 89 | struct uas_cmd_info *cmdinfo; |
90 | struct uas_cmd_info *temp; | ||
135 | struct list_head list; | 91 | struct list_head list; |
92 | int err; | ||
136 | 93 | ||
137 | spin_lock_irq(&uas_work_lock); | 94 | spin_lock_irq(&uas_work_lock); |
138 | list_replace_init(&uas_work_list, &list); | 95 | list_replace_init(&uas_work_list, &list); |
139 | spin_unlock_irq(&uas_work_lock); | 96 | spin_unlock_irq(&uas_work_lock); |
140 | 97 | ||
141 | list_for_each_entry(cmdinfo, &list, list) { | 98 | list_for_each_entry_safe(cmdinfo, temp, &list, list) { |
142 | struct scsi_pointer *scp = (void *)cmdinfo; | 99 | struct scsi_pointer *scp = (void *)cmdinfo; |
143 | struct scsi_cmnd *cmnd = container_of(scp, | 100 | struct scsi_cmnd *cmnd = container_of(scp, |
144 | struct scsi_cmnd, SCp); | 101 | struct scsi_cmnd, SCp); |
145 | uas_submit_urbs(cmnd, cmnd->device->hostdata, GFP_NOIO); | 102 | err = uas_submit_urbs(cmnd, cmnd->device->hostdata, GFP_NOIO); |
103 | if (err) { | ||
104 | list_del(&cmdinfo->list); | ||
105 | spin_lock_irq(&uas_work_lock); | ||
106 | list_add_tail(&cmdinfo->list, &uas_work_list); | ||
107 | spin_unlock_irq(&uas_work_lock); | ||
108 | schedule_work(&uas_work); | ||
109 | } | ||
146 | } | 110 | } |
147 | } | 111 | } |
148 | 112 | ||
149 | static DECLARE_WORK(uas_work, uas_do_work); | ||
150 | |||
151 | static void uas_sense(struct urb *urb, struct scsi_cmnd *cmnd) | 113 | static void uas_sense(struct urb *urb, struct scsi_cmnd *cmnd) |
152 | { | 114 | { |
153 | struct sense_iu *sense_iu = urb->transfer_buffer; | 115 | struct sense_iu *sense_iu = urb->transfer_buffer; |
154 | struct scsi_device *sdev = cmnd->device; | 116 | struct scsi_device *sdev = cmnd->device; |
117 | struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; | ||
155 | 118 | ||
156 | if (urb->actual_length > 16) { | 119 | if (urb->actual_length > 16) { |
157 | unsigned len = be16_to_cpup(&sense_iu->len); | 120 | unsigned len = be16_to_cpup(&sense_iu->len); |
@@ -169,16 +132,15 @@ static void uas_sense(struct urb *urb, struct scsi_cmnd *cmnd) | |||
169 | } | 132 | } |
170 | 133 | ||
171 | cmnd->result = sense_iu->status; | 134 | cmnd->result = sense_iu->status; |
172 | if (sdev->current_cmnd) | 135 | if (!(cmdinfo->state & DATA_COMPLETES_CMD)) |
173 | sdev->current_cmnd = NULL; | 136 | cmnd->scsi_done(cmnd); |
174 | cmnd->scsi_done(cmnd); | ||
175 | usb_free_urb(urb); | ||
176 | } | 137 | } |
177 | 138 | ||
178 | static void uas_sense_old(struct urb *urb, struct scsi_cmnd *cmnd) | 139 | static void uas_sense_old(struct urb *urb, struct scsi_cmnd *cmnd) |
179 | { | 140 | { |
180 | struct sense_iu_old *sense_iu = urb->transfer_buffer; | 141 | struct sense_iu_old *sense_iu = urb->transfer_buffer; |
181 | struct scsi_device *sdev = cmnd->device; | 142 | struct scsi_device *sdev = cmnd->device; |
143 | struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; | ||
182 | 144 | ||
183 | if (urb->actual_length > 8) { | 145 | if (urb->actual_length > 8) { |
184 | unsigned len = be16_to_cpup(&sense_iu->len) - 2; | 146 | unsigned len = be16_to_cpup(&sense_iu->len) - 2; |
@@ -196,10 +158,8 @@ static void uas_sense_old(struct urb *urb, struct scsi_cmnd *cmnd) | |||
196 | } | 158 | } |
197 | 159 | ||
198 | cmnd->result = sense_iu->status; | 160 | cmnd->result = sense_iu->status; |
199 | if (sdev->current_cmnd) | 161 | if (!(cmdinfo->state & DATA_COMPLETES_CMD)) |
200 | sdev->current_cmnd = NULL; | 162 | cmnd->scsi_done(cmnd); |
201 | cmnd->scsi_done(cmnd); | ||
202 | usb_free_urb(urb); | ||
203 | } | 163 | } |
204 | 164 | ||
205 | static void uas_xfer_data(struct urb *urb, struct scsi_cmnd *cmnd, | 165 | static void uas_xfer_data(struct urb *urb, struct scsi_cmnd *cmnd, |
@@ -208,7 +168,7 @@ static void uas_xfer_data(struct urb *urb, struct scsi_cmnd *cmnd, | |||
208 | struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; | 168 | struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; |
209 | int err; | 169 | int err; |
210 | 170 | ||
211 | cmdinfo->state = direction | SUBMIT_STATUS_URB; | 171 | cmdinfo->state = direction; |
212 | err = uas_submit_urbs(cmnd, cmnd->device->hostdata, GFP_ATOMIC); | 172 | err = uas_submit_urbs(cmnd, cmnd->device->hostdata, GFP_ATOMIC); |
213 | if (err) { | 173 | if (err) { |
214 | spin_lock(&uas_work_lock); | 174 | spin_lock(&uas_work_lock); |
@@ -221,27 +181,61 @@ static void uas_xfer_data(struct urb *urb, struct scsi_cmnd *cmnd, | |||
221 | static void uas_stat_cmplt(struct urb *urb) | 181 | static void uas_stat_cmplt(struct urb *urb) |
222 | { | 182 | { |
223 | struct iu *iu = urb->transfer_buffer; | 183 | struct iu *iu = urb->transfer_buffer; |
224 | struct scsi_device *sdev = urb->context; | 184 | struct Scsi_Host *shost = urb->context; |
225 | struct uas_dev_info *devinfo = sdev->hostdata; | 185 | struct uas_dev_info *devinfo = (void *)shost->hostdata[0]; |
226 | struct scsi_cmnd *cmnd; | 186 | struct scsi_cmnd *cmnd; |
187 | struct uas_cmd_info *cmdinfo; | ||
227 | u16 tag; | 188 | u16 tag; |
189 | int ret; | ||
228 | 190 | ||
229 | if (urb->status) { | 191 | if (urb->status) { |
230 | dev_err(&urb->dev->dev, "URB BAD STATUS %d\n", urb->status); | 192 | dev_err(&urb->dev->dev, "URB BAD STATUS %d\n", urb->status); |
231 | usb_free_urb(urb); | 193 | if (devinfo->use_streams) |
194 | usb_free_urb(urb); | ||
232 | return; | 195 | return; |
233 | } | 196 | } |
234 | 197 | ||
235 | tag = be16_to_cpup(&iu->tag) - 1; | 198 | tag = be16_to_cpup(&iu->tag) - 1; |
236 | if (sdev->current_cmnd) | 199 | if (tag == 0) |
237 | cmnd = sdev->current_cmnd; | 200 | cmnd = devinfo->cmnd; |
238 | else | 201 | else |
239 | cmnd = scsi_find_tag(sdev, tag); | 202 | cmnd = scsi_host_find_tag(shost, tag - 1); |
240 | if (!cmnd) | 203 | if (!cmnd) { |
204 | if (devinfo->use_streams) { | ||
205 | usb_free_urb(urb); | ||
206 | return; | ||
207 | } | ||
208 | ret = usb_submit_urb(urb, GFP_ATOMIC); | ||
209 | if (ret) | ||
210 | dev_err(&urb->dev->dev, "failed submit status urb\n"); | ||
241 | return; | 211 | return; |
212 | } | ||
213 | cmdinfo = (void *)&cmnd->SCp; | ||
242 | 214 | ||
243 | switch (iu->iu_id) { | 215 | switch (iu->iu_id) { |
244 | case IU_ID_STATUS: | 216 | case IU_ID_STATUS: |
217 | if (devinfo->cmnd == cmnd) | ||
218 | devinfo->cmnd = NULL; | ||
219 | |||
220 | if (!(cmdinfo->state & COMPLETED_DATA_IN) && | ||
221 | cmdinfo->data_in_urb) { | ||
222 | if (devinfo->use_streams) { | ||
223 | cmdinfo->state |= DATA_COMPLETES_CMD; | ||
224 | usb_unlink_urb(cmdinfo->data_in_urb); | ||
225 | } else { | ||
226 | usb_free_urb(cmdinfo->data_in_urb); | ||
227 | } | ||
228 | } | ||
229 | if (!(cmdinfo->state & COMPLETED_DATA_OUT) && | ||
230 | cmdinfo->data_out_urb) { | ||
231 | if (devinfo->use_streams) { | ||
232 | cmdinfo->state |= DATA_COMPLETES_CMD; | ||
233 | usb_unlink_urb(cmdinfo->data_in_urb); | ||
234 | } else { | ||
235 | usb_free_urb(cmdinfo->data_out_urb); | ||
236 | } | ||
237 | } | ||
238 | |||
245 | if (urb->actual_length < 16) | 239 | if (urb->actual_length < 16) |
246 | devinfo->uas_sense_old = 1; | 240 | devinfo->uas_sense_old = 1; |
247 | if (devinfo->uas_sense_old) | 241 | if (devinfo->uas_sense_old) |
@@ -259,29 +253,70 @@ static void uas_stat_cmplt(struct urb *urb) | |||
259 | scmd_printk(KERN_ERR, cmnd, | 253 | scmd_printk(KERN_ERR, cmnd, |
260 | "Bogus IU (%d) received on status pipe\n", iu->iu_id); | 254 | "Bogus IU (%d) received on status pipe\n", iu->iu_id); |
261 | } | 255 | } |
256 | |||
257 | if (devinfo->use_streams) { | ||
258 | usb_free_urb(urb); | ||
259 | return; | ||
260 | } | ||
261 | |||
262 | ret = usb_submit_urb(urb, GFP_ATOMIC); | ||
263 | if (ret) | ||
264 | dev_err(&urb->dev->dev, "failed submit status urb\n"); | ||
262 | } | 265 | } |
263 | 266 | ||
264 | static void uas_data_cmplt(struct urb *urb) | 267 | static void uas_data_out_cmplt(struct urb *urb) |
265 | { | 268 | { |
266 | struct scsi_data_buffer *sdb = urb->context; | 269 | struct scsi_cmnd *cmnd = urb->context; |
270 | struct scsi_data_buffer *sdb = scsi_out(cmnd); | ||
271 | struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; | ||
272 | |||
273 | cmdinfo->state |= COMPLETED_DATA_OUT; | ||
274 | |||
267 | sdb->resid = sdb->length - urb->actual_length; | 275 | sdb->resid = sdb->length - urb->actual_length; |
268 | usb_free_urb(urb); | 276 | usb_free_urb(urb); |
277 | |||
278 | if (cmdinfo->state & DATA_COMPLETES_CMD) | ||
279 | cmnd->scsi_done(cmnd); | ||
280 | } | ||
281 | |||
282 | static void uas_data_in_cmplt(struct urb *urb) | ||
283 | { | ||
284 | struct scsi_cmnd *cmnd = urb->context; | ||
285 | struct scsi_data_buffer *sdb = scsi_in(cmnd); | ||
286 | struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; | ||
287 | |||
288 | cmdinfo->state |= COMPLETED_DATA_IN; | ||
289 | |||
290 | sdb->resid = sdb->length - urb->actual_length; | ||
291 | usb_free_urb(urb); | ||
292 | |||
293 | if (cmdinfo->state & DATA_COMPLETES_CMD) | ||
294 | cmnd->scsi_done(cmnd); | ||
269 | } | 295 | } |
270 | 296 | ||
271 | static struct urb *uas_alloc_data_urb(struct uas_dev_info *devinfo, gfp_t gfp, | 297 | static struct urb *uas_alloc_data_urb(struct uas_dev_info *devinfo, gfp_t gfp, |
272 | unsigned int pipe, u16 stream_id, | 298 | unsigned int pipe, struct scsi_cmnd *cmnd, |
273 | struct scsi_data_buffer *sdb, | 299 | enum dma_data_direction dir) |
274 | enum dma_data_direction dir) | ||
275 | { | 300 | { |
301 | struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; | ||
276 | struct usb_device *udev = devinfo->udev; | 302 | struct usb_device *udev = devinfo->udev; |
277 | struct urb *urb = usb_alloc_urb(0, gfp); | 303 | struct urb *urb = usb_alloc_urb(0, gfp); |
304 | struct scsi_data_buffer *sdb; | ||
305 | usb_complete_t complete_fn; | ||
306 | u16 stream_id = cmdinfo->stream; | ||
278 | 307 | ||
279 | if (!urb) | 308 | if (!urb) |
280 | goto out; | 309 | goto out; |
281 | usb_fill_bulk_urb(urb, udev, pipe, NULL, sdb->length, uas_data_cmplt, | 310 | if (dir == DMA_FROM_DEVICE) { |
282 | sdb); | 311 | sdb = scsi_in(cmnd); |
283 | if (devinfo->use_streams) | 312 | complete_fn = uas_data_in_cmplt; |
284 | urb->stream_id = stream_id; | 313 | } else { |
314 | sdb = scsi_out(cmnd); | ||
315 | complete_fn = uas_data_out_cmplt; | ||
316 | } | ||
317 | usb_fill_bulk_urb(urb, udev, pipe, NULL, sdb->length, | ||
318 | complete_fn, cmnd); | ||
319 | urb->stream_id = stream_id; | ||
285 | urb->num_sgs = udev->bus->sg_tablesize ? sdb->table.nents : 0; | 320 | urb->num_sgs = udev->bus->sg_tablesize ? sdb->table.nents : 0; |
286 | urb->sg = sdb->table.sgl; | 321 | urb->sg = sdb->table.sgl; |
287 | out: | 322 | out: |
@@ -289,7 +324,7 @@ static struct urb *uas_alloc_data_urb(struct uas_dev_info *devinfo, gfp_t gfp, | |||
289 | } | 324 | } |
290 | 325 | ||
291 | static struct urb *uas_alloc_sense_urb(struct uas_dev_info *devinfo, gfp_t gfp, | 326 | static struct urb *uas_alloc_sense_urb(struct uas_dev_info *devinfo, gfp_t gfp, |
292 | struct scsi_cmnd *cmnd, u16 stream_id) | 327 | struct Scsi_Host *shost, u16 stream_id) |
293 | { | 328 | { |
294 | struct usb_device *udev = devinfo->udev; | 329 | struct usb_device *udev = devinfo->udev; |
295 | struct urb *urb = usb_alloc_urb(0, gfp); | 330 | struct urb *urb = usb_alloc_urb(0, gfp); |
@@ -303,7 +338,7 @@ static struct urb *uas_alloc_sense_urb(struct uas_dev_info *devinfo, gfp_t gfp, | |||
303 | goto free; | 338 | goto free; |
304 | 339 | ||
305 | usb_fill_bulk_urb(urb, udev, devinfo->status_pipe, iu, sizeof(*iu), | 340 | usb_fill_bulk_urb(urb, udev, devinfo->status_pipe, iu, sizeof(*iu), |
306 | uas_stat_cmplt, cmnd->device); | 341 | uas_stat_cmplt, shost); |
307 | urb->stream_id = stream_id; | 342 | urb->stream_id = stream_id; |
308 | urb->transfer_flags |= URB_FREE_BUFFER; | 343 | urb->transfer_flags |= URB_FREE_BUFFER; |
309 | out: | 344 | out: |
@@ -334,7 +369,10 @@ static struct urb *uas_alloc_cmd_urb(struct uas_dev_info *devinfo, gfp_t gfp, | |||
334 | goto free; | 369 | goto free; |
335 | 370 | ||
336 | iu->iu_id = IU_ID_COMMAND; | 371 | iu->iu_id = IU_ID_COMMAND; |
337 | iu->tag = cpu_to_be16(stream_id); | 372 | if (blk_rq_tagged(cmnd->request)) |
373 | iu->tag = cpu_to_be16(cmnd->request->tag + 2); | ||
374 | else | ||
375 | iu->tag = cpu_to_be16(1); | ||
338 | iu->prio_attr = UAS_SIMPLE_TAG; | 376 | iu->prio_attr = UAS_SIMPLE_TAG; |
339 | iu->len = len; | 377 | iu->len = len; |
340 | int_to_scsilun(sdev->lun, &iu->lun); | 378 | int_to_scsilun(sdev->lun, &iu->lun); |
@@ -362,8 +400,8 @@ static int uas_submit_urbs(struct scsi_cmnd *cmnd, | |||
362 | struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; | 400 | struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; |
363 | 401 | ||
364 | if (cmdinfo->state & ALLOC_STATUS_URB) { | 402 | if (cmdinfo->state & ALLOC_STATUS_URB) { |
365 | cmdinfo->status_urb = uas_alloc_sense_urb(devinfo, gfp, cmnd, | 403 | cmdinfo->status_urb = uas_alloc_sense_urb(devinfo, gfp, |
366 | cmdinfo->stream); | 404 | cmnd->device->host, cmdinfo->stream); |
367 | if (!cmdinfo->status_urb) | 405 | if (!cmdinfo->status_urb) |
368 | return SCSI_MLQUEUE_DEVICE_BUSY; | 406 | return SCSI_MLQUEUE_DEVICE_BUSY; |
369 | cmdinfo->state &= ~ALLOC_STATUS_URB; | 407 | cmdinfo->state &= ~ALLOC_STATUS_URB; |
@@ -380,8 +418,8 @@ static int uas_submit_urbs(struct scsi_cmnd *cmnd, | |||
380 | 418 | ||
381 | if (cmdinfo->state & ALLOC_DATA_IN_URB) { | 419 | if (cmdinfo->state & ALLOC_DATA_IN_URB) { |
382 | cmdinfo->data_in_urb = uas_alloc_data_urb(devinfo, gfp, | 420 | cmdinfo->data_in_urb = uas_alloc_data_urb(devinfo, gfp, |
383 | devinfo->data_in_pipe, cmdinfo->stream, | 421 | devinfo->data_in_pipe, cmnd, |
384 | scsi_in(cmnd), DMA_FROM_DEVICE); | 422 | DMA_FROM_DEVICE); |
385 | if (!cmdinfo->data_in_urb) | 423 | if (!cmdinfo->data_in_urb) |
386 | return SCSI_MLQUEUE_DEVICE_BUSY; | 424 | return SCSI_MLQUEUE_DEVICE_BUSY; |
387 | cmdinfo->state &= ~ALLOC_DATA_IN_URB; | 425 | cmdinfo->state &= ~ALLOC_DATA_IN_URB; |
@@ -398,8 +436,8 @@ static int uas_submit_urbs(struct scsi_cmnd *cmnd, | |||
398 | 436 | ||
399 | if (cmdinfo->state & ALLOC_DATA_OUT_URB) { | 437 | if (cmdinfo->state & ALLOC_DATA_OUT_URB) { |
400 | cmdinfo->data_out_urb = uas_alloc_data_urb(devinfo, gfp, | 438 | cmdinfo->data_out_urb = uas_alloc_data_urb(devinfo, gfp, |
401 | devinfo->data_out_pipe, cmdinfo->stream, | 439 | devinfo->data_out_pipe, cmnd, |
402 | scsi_out(cmnd), DMA_TO_DEVICE); | 440 | DMA_TO_DEVICE); |
403 | if (!cmdinfo->data_out_urb) | 441 | if (!cmdinfo->data_out_urb) |
404 | return SCSI_MLQUEUE_DEVICE_BUSY; | 442 | return SCSI_MLQUEUE_DEVICE_BUSY; |
405 | cmdinfo->state &= ~ALLOC_DATA_OUT_URB; | 443 | cmdinfo->state &= ~ALLOC_DATA_OUT_URB; |
@@ -444,13 +482,13 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd, | |||
444 | 482 | ||
445 | BUILD_BUG_ON(sizeof(struct uas_cmd_info) > sizeof(struct scsi_pointer)); | 483 | BUILD_BUG_ON(sizeof(struct uas_cmd_info) > sizeof(struct scsi_pointer)); |
446 | 484 | ||
447 | if (!cmdinfo->status_urb && sdev->current_cmnd) | 485 | if (devinfo->cmnd) |
448 | return SCSI_MLQUEUE_DEVICE_BUSY; | 486 | return SCSI_MLQUEUE_DEVICE_BUSY; |
449 | 487 | ||
450 | if (blk_rq_tagged(cmnd->request)) { | 488 | if (blk_rq_tagged(cmnd->request)) { |
451 | cmdinfo->stream = cmnd->request->tag + 1; | 489 | cmdinfo->stream = cmnd->request->tag + 2; |
452 | } else { | 490 | } else { |
453 | sdev->current_cmnd = cmnd; | 491 | devinfo->cmnd = cmnd; |
454 | cmdinfo->stream = 1; | 492 | cmdinfo->stream = 1; |
455 | } | 493 | } |
456 | 494 | ||
@@ -472,7 +510,8 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd, | |||
472 | } | 510 | } |
473 | 511 | ||
474 | if (!devinfo->use_streams) { | 512 | if (!devinfo->use_streams) { |
475 | cmdinfo->state &= ~(SUBMIT_DATA_IN_URB | SUBMIT_DATA_OUT_URB); | 513 | cmdinfo->state &= ~(SUBMIT_DATA_IN_URB | SUBMIT_DATA_OUT_URB | |
514 | ALLOC_STATUS_URB | SUBMIT_STATUS_URB); | ||
476 | cmdinfo->stream = 0; | 515 | cmdinfo->stream = 0; |
477 | } | 516 | } |
478 | 517 | ||
@@ -551,7 +590,7 @@ static int uas_slave_configure(struct scsi_device *sdev) | |||
551 | { | 590 | { |
552 | struct uas_dev_info *devinfo = sdev->hostdata; | 591 | struct uas_dev_info *devinfo = sdev->hostdata; |
553 | scsi_set_tag_type(sdev, MSG_ORDERED_TAG); | 592 | scsi_set_tag_type(sdev, MSG_ORDERED_TAG); |
554 | scsi_activate_tcq(sdev, devinfo->qdepth - 1); | 593 | scsi_activate_tcq(sdev, devinfo->qdepth - 2); |
555 | return 0; | 594 | return 0; |
556 | } | 595 | } |
557 | 596 | ||
@@ -589,22 +628,34 @@ static int uas_is_interface(struct usb_host_interface *intf) | |||
589 | intf->desc.bInterfaceProtocol == USB_PR_UAS); | 628 | intf->desc.bInterfaceProtocol == USB_PR_UAS); |
590 | } | 629 | } |
591 | 630 | ||
631 | static int uas_isnt_supported(struct usb_device *udev) | ||
632 | { | ||
633 | struct usb_hcd *hcd = bus_to_hcd(udev->bus); | ||
634 | |||
635 | dev_warn(&udev->dev, "The driver for the USB controller %s does not " | ||
636 | "support scatter-gather which is\n", | ||
637 | hcd->driver->description); | ||
638 | dev_warn(&udev->dev, "required by the UAS driver. Please try an" | ||
639 | "alternative USB controller if you wish to use UAS.\n"); | ||
640 | return -ENODEV; | ||
641 | } | ||
642 | |||
592 | static int uas_switch_interface(struct usb_device *udev, | 643 | static int uas_switch_interface(struct usb_device *udev, |
593 | struct usb_interface *intf) | 644 | struct usb_interface *intf) |
594 | { | 645 | { |
595 | int i; | 646 | int i; |
596 | 647 | int sg_supported = udev->bus->sg_tablesize != 0; | |
597 | if (uas_is_interface(intf->cur_altsetting)) | ||
598 | return 0; | ||
599 | 648 | ||
600 | for (i = 0; i < intf->num_altsetting; i++) { | 649 | for (i = 0; i < intf->num_altsetting; i++) { |
601 | struct usb_host_interface *alt = &intf->altsetting[i]; | 650 | struct usb_host_interface *alt = &intf->altsetting[i]; |
602 | if (alt == intf->cur_altsetting) | 651 | |
603 | continue; | 652 | if (uas_is_interface(alt)) { |
604 | if (uas_is_interface(alt)) | 653 | if (!sg_supported) |
654 | return uas_isnt_supported(udev); | ||
605 | return usb_set_interface(udev, | 655 | return usb_set_interface(udev, |
606 | alt->desc.bInterfaceNumber, | 656 | alt->desc.bInterfaceNumber, |
607 | alt->desc.bAlternateSetting); | 657 | alt->desc.bAlternateSetting); |
658 | } | ||
608 | } | 659 | } |
609 | 660 | ||
610 | return -ENODEV; | 661 | return -ENODEV; |
@@ -619,6 +670,7 @@ static void uas_configure_endpoints(struct uas_dev_info *devinfo) | |||
619 | unsigned i, n_endpoints = intf->cur_altsetting->desc.bNumEndpoints; | 670 | unsigned i, n_endpoints = intf->cur_altsetting->desc.bNumEndpoints; |
620 | 671 | ||
621 | devinfo->uas_sense_old = 0; | 672 | devinfo->uas_sense_old = 0; |
673 | devinfo->cmnd = NULL; | ||
622 | 674 | ||
623 | for (i = 0; i < n_endpoints; i++) { | 675 | for (i = 0; i < n_endpoints; i++) { |
624 | unsigned char *extra = endpoint[i].extra; | 676 | unsigned char *extra = endpoint[i].extra; |
@@ -670,6 +722,40 @@ static void uas_configure_endpoints(struct uas_dev_info *devinfo) | |||
670 | } | 722 | } |
671 | } | 723 | } |
672 | 724 | ||
725 | static int uas_alloc_status_urb(struct uas_dev_info *devinfo, | ||
726 | struct Scsi_Host *shost) | ||
727 | { | ||
728 | if (devinfo->use_streams) { | ||
729 | devinfo->status_urb = NULL; | ||
730 | return 0; | ||
731 | } | ||
732 | |||
733 | devinfo->status_urb = uas_alloc_sense_urb(devinfo, GFP_KERNEL, | ||
734 | shost, 0); | ||
735 | if (!devinfo->status_urb) | ||
736 | goto err_s_urb; | ||
737 | |||
738 | if (usb_submit_urb(devinfo->status_urb, GFP_KERNEL)) | ||
739 | goto err_submit_urb; | ||
740 | |||
741 | return 0; | ||
742 | err_submit_urb: | ||
743 | usb_free_urb(devinfo->status_urb); | ||
744 | err_s_urb: | ||
745 | return -ENOMEM; | ||
746 | } | ||
747 | |||
748 | static void uas_free_streams(struct uas_dev_info *devinfo) | ||
749 | { | ||
750 | struct usb_device *udev = devinfo->udev; | ||
751 | struct usb_host_endpoint *eps[3]; | ||
752 | |||
753 | eps[0] = usb_pipe_endpoint(udev, devinfo->status_pipe); | ||
754 | eps[1] = usb_pipe_endpoint(udev, devinfo->data_in_pipe); | ||
755 | eps[2] = usb_pipe_endpoint(udev, devinfo->data_out_pipe); | ||
756 | usb_free_streams(devinfo->intf, eps, 3, GFP_KERNEL); | ||
757 | } | ||
758 | |||
673 | /* | 759 | /* |
674 | * XXX: What I'd like to do here is register a SCSI host for each USB host in | 760 | * XXX: What I'd like to do here is register a SCSI host for each USB host in |
675 | * the system. Follow usb-storage's design of registering a SCSI host for | 761 | * the system. Follow usb-storage's design of registering a SCSI host for |
@@ -699,18 +785,33 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
699 | shost->max_id = 1; | 785 | shost->max_id = 1; |
700 | shost->sg_tablesize = udev->bus->sg_tablesize; | 786 | shost->sg_tablesize = udev->bus->sg_tablesize; |
701 | 787 | ||
702 | result = scsi_add_host(shost, &intf->dev); | 788 | devinfo->intf = intf; |
789 | devinfo->udev = udev; | ||
790 | uas_configure_endpoints(devinfo); | ||
791 | |||
792 | result = scsi_init_shared_tag_map(shost, devinfo->qdepth - 2); | ||
703 | if (result) | 793 | if (result) |
704 | goto free; | 794 | goto free; |
795 | |||
796 | result = scsi_add_host(shost, &intf->dev); | ||
797 | if (result) | ||
798 | goto deconfig_eps; | ||
799 | |||
705 | shost->hostdata[0] = (unsigned long)devinfo; | 800 | shost->hostdata[0] = (unsigned long)devinfo; |
706 | 801 | ||
707 | devinfo->intf = intf; | 802 | result = uas_alloc_status_urb(devinfo, shost); |
708 | devinfo->udev = udev; | 803 | if (result) |
709 | uas_configure_endpoints(devinfo); | 804 | goto err_alloc_status; |
710 | 805 | ||
711 | scsi_scan_host(shost); | 806 | scsi_scan_host(shost); |
712 | usb_set_intfdata(intf, shost); | 807 | usb_set_intfdata(intf, shost); |
713 | return result; | 808 | return result; |
809 | |||
810 | err_alloc_status: | ||
811 | scsi_remove_host(shost); | ||
812 | shost = NULL; | ||
813 | deconfig_eps: | ||
814 | uas_free_streams(devinfo); | ||
714 | free: | 815 | free: |
715 | kfree(devinfo); | 816 | kfree(devinfo); |
716 | if (shost) | 817 | if (shost) |
@@ -732,18 +833,13 @@ static int uas_post_reset(struct usb_interface *intf) | |||
732 | 833 | ||
733 | static void uas_disconnect(struct usb_interface *intf) | 834 | static void uas_disconnect(struct usb_interface *intf) |
734 | { | 835 | { |
735 | struct usb_device *udev = interface_to_usbdev(intf); | ||
736 | struct usb_host_endpoint *eps[3]; | ||
737 | struct Scsi_Host *shost = usb_get_intfdata(intf); | 836 | struct Scsi_Host *shost = usb_get_intfdata(intf); |
738 | struct uas_dev_info *devinfo = (void *)shost->hostdata[0]; | 837 | struct uas_dev_info *devinfo = (void *)shost->hostdata[0]; |
739 | 838 | ||
740 | scsi_remove_host(shost); | 839 | scsi_remove_host(shost); |
741 | 840 | usb_kill_urb(devinfo->status_urb); | |
742 | eps[0] = usb_pipe_endpoint(udev, devinfo->status_pipe); | 841 | usb_free_urb(devinfo->status_urb); |
743 | eps[1] = usb_pipe_endpoint(udev, devinfo->data_in_pipe); | 842 | uas_free_streams(devinfo); |
744 | eps[2] = usb_pipe_endpoint(udev, devinfo->data_out_pipe); | ||
745 | usb_free_streams(intf, eps, 3, GFP_KERNEL); | ||
746 | |||
747 | kfree(devinfo); | 843 | kfree(devinfo); |
748 | } | 844 | } |
749 | 845 | ||
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index db51ba16dc07..c18538e4a6db 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c | |||
@@ -125,6 +125,9 @@ static struct us_unusual_dev us_unusual_dev_list[] = { | |||
125 | { } /* Terminating entry */ | 125 | { } /* Terminating entry */ |
126 | }; | 126 | }; |
127 | 127 | ||
128 | static struct us_unusual_dev for_dynamic_ids = | ||
129 | USUAL_DEV(USB_SC_SCSI, USB_PR_BULK, 0); | ||
130 | |||
128 | #undef UNUSUAL_DEV | 131 | #undef UNUSUAL_DEV |
129 | #undef COMPLIANT_DEV | 132 | #undef COMPLIANT_DEV |
130 | #undef USUAL_DEV | 133 | #undef USUAL_DEV |
@@ -999,8 +1002,10 @@ EXPORT_SYMBOL_GPL(usb_stor_disconnect); | |||
999 | static int storage_probe(struct usb_interface *intf, | 1002 | static int storage_probe(struct usb_interface *intf, |
1000 | const struct usb_device_id *id) | 1003 | const struct usb_device_id *id) |
1001 | { | 1004 | { |
1005 | struct us_unusual_dev *unusual_dev; | ||
1002 | struct us_data *us; | 1006 | struct us_data *us; |
1003 | int result; | 1007 | int result; |
1008 | int size; | ||
1004 | 1009 | ||
1005 | /* | 1010 | /* |
1006 | * If libusual is configured, let it decide whether a standard | 1011 | * If libusual is configured, let it decide whether a standard |
@@ -1019,8 +1024,19 @@ static int storage_probe(struct usb_interface *intf, | |||
1019 | * table, so we use the index of the id entry to find the | 1024 | * table, so we use the index of the id entry to find the |
1020 | * corresponding unusual_devs entry. | 1025 | * corresponding unusual_devs entry. |
1021 | */ | 1026 | */ |
1022 | result = usb_stor_probe1(&us, intf, id, | 1027 | |
1023 | (id - usb_storage_usb_ids) + us_unusual_dev_list); | 1028 | size = ARRAY_SIZE(us_unusual_dev_list); |
1029 | if (id >= usb_storage_usb_ids && id < usb_storage_usb_ids + size) { | ||
1030 | unusual_dev = (id - usb_storage_usb_ids) + us_unusual_dev_list; | ||
1031 | } else { | ||
1032 | unusual_dev = &for_dynamic_ids; | ||
1033 | |||
1034 | US_DEBUGP("%s %s 0x%04x 0x%04x\n", "Use Bulk-Only transport", | ||
1035 | "with the Transparent SCSI protocol for dynamic id:", | ||
1036 | id->idVendor, id->idProduct); | ||
1037 | } | ||
1038 | |||
1039 | result = usb_stor_probe1(&us, intf, id, unusual_dev); | ||
1024 | if (result) | 1040 | if (result) |
1025 | return result; | 1041 | return result; |
1026 | 1042 | ||
@@ -1046,7 +1062,6 @@ static struct usb_driver usb_storage_driver = { | |||
1046 | .id_table = usb_storage_usb_ids, | 1062 | .id_table = usb_storage_usb_ids, |
1047 | .supports_autosuspend = 1, | 1063 | .supports_autosuspend = 1, |
1048 | .soft_unbind = 1, | 1064 | .soft_unbind = 1, |
1049 | .no_dynamic_id = 1, | ||
1050 | }; | 1065 | }; |
1051 | 1066 | ||
1052 | static int __init usb_stor_init(void) | 1067 | static int __init usb_stor_init(void) |