Commit | Line | Data |
---|---|---|
3cb22d65 TL |
1 | /* |
2 | * otg.c -- USB OTG utility code | |
3 | * | |
4 | * Copyright (C) 2004 Texas Instruments | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or modify | |
7 | * it under the terms of the GNU General Public License as published by | |
8 | * the Free Software Foundation; either version 2 of the License, or | |
9 | * (at your option) any later version. | |
10 | */ | |
11 | ||
12 | #include <linux/kernel.h> | |
f940fcd8 | 13 | #include <linux/export.h> |
3cb22d65 TL |
14 | #include <linux/device.h> |
15 | ||
16 | #include <linux/usb/otg.h> | |
17 | ||
7a8a3a9b | 18 | static struct usb_phy *phy; |
3cb22d65 TL |
19 | |
20 | /** | |
7a8a3a9b | 21 | * usb_get_transceiver - find the (single) USB transceiver |
3cb22d65 TL |
22 | * |
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 | |
7a8a3a9b | 25 | * calling usb_put_transceiver() to release that count. |
3cb22d65 TL |
26 | * |
27 | * For use by USB host and peripheral drivers. | |
28 | */ | |
7a8a3a9b | 29 | struct usb_phy *usb_get_transceiver(void) |
3cb22d65 | 30 | { |
7a8a3a9b HK |
31 | if (phy) |
32 | get_device(phy->dev); | |
33 | return phy; | |
3cb22d65 | 34 | } |
7a8a3a9b | 35 | EXPORT_SYMBOL(usb_get_transceiver); |
3cb22d65 TL |
36 | |
37 | /** | |
7a8a3a9b HK |
38 | * usb_put_transceiver - release the (single) USB transceiver |
39 | * @x: the transceiver returned by usb_get_transceiver() | |
3cb22d65 | 40 | * |
7a8a3a9b | 41 | * Releases a refcount the caller received from usb_get_transceiver(). |
3cb22d65 TL |
42 | * |
43 | * For use by USB host and peripheral drivers. | |
44 | */ | |
7a8a3a9b | 45 | void usb_put_transceiver(struct usb_phy *x) |
3cb22d65 | 46 | { |
ecf85e48 RJ |
47 | if (x) |
48 | put_device(x->dev); | |
3cb22d65 | 49 | } |
7a8a3a9b | 50 | EXPORT_SYMBOL(usb_put_transceiver); |
3cb22d65 TL |
51 | |
52 | /** | |
7a8a3a9b HK |
53 | * usb_set_transceiver - declare the (single) USB transceiver |
54 | * @x: the USB transceiver to be used; or NULL | |
3cb22d65 TL |
55 | * |
56 | * This call is exclusively for use by transceiver drivers, which | |
57 | * coordinate the activities of drivers for host and peripheral | |
58 | * controllers, and in some cases for VBUS current regulation. | |
59 | */ | |
7a8a3a9b | 60 | int usb_set_transceiver(struct usb_phy *x) |
3cb22d65 | 61 | { |
7a8a3a9b | 62 | if (phy && x) |
3cb22d65 | 63 | return -EBUSY; |
7a8a3a9b | 64 | phy = x; |
3cb22d65 TL |
65 | return 0; |
66 | } | |
7a8a3a9b | 67 | EXPORT_SYMBOL(usb_set_transceiver); |
3dacdf11 AG |
68 | |
69 | const char *otg_state_string(enum usb_otg_state state) | |
70 | { | |
71 | switch (state) { | |
72 | case OTG_STATE_A_IDLE: | |
73 | return "a_idle"; | |
74 | case OTG_STATE_A_WAIT_VRISE: | |
75 | return "a_wait_vrise"; | |
76 | case OTG_STATE_A_WAIT_BCON: | |
77 | return "a_wait_bcon"; | |
78 | case OTG_STATE_A_HOST: | |
79 | return "a_host"; | |
80 | case OTG_STATE_A_SUSPEND: | |
81 | return "a_suspend"; | |
82 | case OTG_STATE_A_PERIPHERAL: | |
83 | return "a_peripheral"; | |
84 | case OTG_STATE_A_WAIT_VFALL: | |
85 | return "a_wait_vfall"; | |
86 | case OTG_STATE_A_VBUS_ERR: | |
87 | return "a_vbus_err"; | |
88 | case OTG_STATE_B_IDLE: | |
89 | return "b_idle"; | |
90 | case OTG_STATE_B_SRP_INIT: | |
91 | return "b_srp_init"; | |
92 | case OTG_STATE_B_PERIPHERAL: | |
93 | return "b_peripheral"; | |
94 | case OTG_STATE_B_WAIT_ACON: | |
95 | return "b_wait_acon"; | |
96 | case OTG_STATE_B_HOST: | |
97 | return "b_host"; | |
98 | default: | |
99 | return "UNDEFINED"; | |
100 | } | |
101 | } | |
102 | EXPORT_SYMBOL(otg_state_string); |