1 // SPDX-License-Identifier: GPL-2.0
3 * Provides code common for host and device side USB.
5 * If either host side (ie. CONFIG_USB=y) or device side USB stack
6 * (ie. CONFIG_USB_GADGET=y) is compiled in the kernel, this module is
7 * compiled-in as well. Otherwise, if either of the two stacks is
8 * compiled as module, this file is compiled as module as well.
11 #include <linux/kernel.h>
12 #include <linux/module.h>
14 #include <linux/platform_device.h>
15 #include <linux/usb/ch9.h>
16 #include <linux/usb/of.h>
17 #include <linux/usb/otg.h>
18 #include <linux/of_platform.h>
19 #include <linux/debugfs.h>
22 static const char *const ep_type_names
[] = {
23 [USB_ENDPOINT_XFER_CONTROL
] = "ctrl",
24 [USB_ENDPOINT_XFER_ISOC
] = "isoc",
25 [USB_ENDPOINT_XFER_BULK
] = "bulk",
26 [USB_ENDPOINT_XFER_INT
] = "intr",
30 * usb_ep_type_string() - Returns human readable-name of the endpoint type.
31 * @ep_type: The endpoint type to return human-readable name for. If it's not
32 * any of the types: USB_ENDPOINT_XFER_{CONTROL, ISOC, BULK, INT},
33 * usually got by usb_endpoint_type(), the string 'unknown' will be returned.
35 const char *usb_ep_type_string(int ep_type
)
37 if (ep_type
< 0 || ep_type
>= ARRAY_SIZE(ep_type_names
))
40 return ep_type_names
[ep_type
];
42 EXPORT_SYMBOL_GPL(usb_ep_type_string
);
44 const char *usb_otg_state_string(enum usb_otg_state state
)
46 static const char *const names
[] = {
47 [OTG_STATE_A_IDLE
] = "a_idle",
48 [OTG_STATE_A_WAIT_VRISE
] = "a_wait_vrise",
49 [OTG_STATE_A_WAIT_BCON
] = "a_wait_bcon",
50 [OTG_STATE_A_HOST
] = "a_host",
51 [OTG_STATE_A_SUSPEND
] = "a_suspend",
52 [OTG_STATE_A_PERIPHERAL
] = "a_peripheral",
53 [OTG_STATE_A_WAIT_VFALL
] = "a_wait_vfall",
54 [OTG_STATE_A_VBUS_ERR
] = "a_vbus_err",
55 [OTG_STATE_B_IDLE
] = "b_idle",
56 [OTG_STATE_B_SRP_INIT
] = "b_srp_init",
57 [OTG_STATE_B_PERIPHERAL
] = "b_peripheral",
58 [OTG_STATE_B_WAIT_ACON
] = "b_wait_acon",
59 [OTG_STATE_B_HOST
] = "b_host",
62 if (state
< 0 || state
>= ARRAY_SIZE(names
))
67 EXPORT_SYMBOL_GPL(usb_otg_state_string
);
69 static const char *const speed_names
[] = {
70 [USB_SPEED_UNKNOWN
] = "UNKNOWN",
71 [USB_SPEED_LOW
] = "low-speed",
72 [USB_SPEED_FULL
] = "full-speed",
73 [USB_SPEED_HIGH
] = "high-speed",
74 [USB_SPEED_WIRELESS
] = "wireless",
75 [USB_SPEED_SUPER
] = "super-speed",
76 [USB_SPEED_SUPER_PLUS
] = "super-speed-plus",
79 static const char *const ssp_rate
[] = {
80 [USB_SSP_GEN_UNKNOWN
] = "UNKNOWN",
81 [USB_SSP_GEN_2x1
] = "super-speed-plus-gen2x1",
82 [USB_SSP_GEN_1x2
] = "super-speed-plus-gen1x2",
83 [USB_SSP_GEN_2x2
] = "super-speed-plus-gen2x2",
87 * usb_speed_string() - Returns human readable-name of the speed.
88 * @speed: The speed to return human-readable name for. If it's not
89 * any of the speeds defined in usb_device_speed enum, string for
90 * USB_SPEED_UNKNOWN will be returned.
92 const char *usb_speed_string(enum usb_device_speed speed
)
94 if (speed
< 0 || speed
>= ARRAY_SIZE(speed_names
))
95 speed
= USB_SPEED_UNKNOWN
;
96 return speed_names
[speed
];
98 EXPORT_SYMBOL_GPL(usb_speed_string
);
101 * usb_get_maximum_speed - Get maximum requested speed for a given USB
103 * @dev: Pointer to the given USB controller device
105 * The function gets the maximum speed string from property "maximum-speed",
106 * and returns the corresponding enum usb_device_speed.
108 enum usb_device_speed
usb_get_maximum_speed(struct device
*dev
)
110 const char *p
= "maximum-speed";
113 ret
= device_property_match_property_string(dev
, p
, ssp_rate
, ARRAY_SIZE(ssp_rate
));
115 return USB_SPEED_SUPER_PLUS
;
117 ret
= device_property_match_property_string(dev
, p
, speed_names
, ARRAY_SIZE(speed_names
));
121 return USB_SPEED_UNKNOWN
;
123 EXPORT_SYMBOL_GPL(usb_get_maximum_speed
);
126 * usb_get_maximum_ssp_rate - Get the signaling rate generation and lane count
127 * of a SuperSpeed Plus capable device.
128 * @dev: Pointer to the given USB controller device
130 * If the string from "maximum-speed" property is super-speed-plus-genXxY where
131 * 'X' is the generation number and 'Y' is the number of lanes, then this
132 * function returns the corresponding enum usb_ssp_rate.
134 enum usb_ssp_rate
usb_get_maximum_ssp_rate(struct device
*dev
)
136 const char *maximum_speed
;
139 ret
= device_property_read_string(dev
, "maximum-speed", &maximum_speed
);
141 return USB_SSP_GEN_UNKNOWN
;
143 ret
= match_string(ssp_rate
, ARRAY_SIZE(ssp_rate
), maximum_speed
);
144 return (ret
< 0) ? USB_SSP_GEN_UNKNOWN
: ret
;
146 EXPORT_SYMBOL_GPL(usb_get_maximum_ssp_rate
);
149 * usb_state_string - Returns human readable name for the state.
150 * @state: The state to return a human-readable name for. If it's not
151 * any of the states devices in usb_device_state_string enum,
152 * the string UNKNOWN will be returned.
154 const char *usb_state_string(enum usb_device_state state
)
156 static const char *const names
[] = {
157 [USB_STATE_NOTATTACHED
] = "not attached",
158 [USB_STATE_ATTACHED
] = "attached",
159 [USB_STATE_POWERED
] = "powered",
160 [USB_STATE_RECONNECTING
] = "reconnecting",
161 [USB_STATE_UNAUTHENTICATED
] = "unauthenticated",
162 [USB_STATE_DEFAULT
] = "default",
163 [USB_STATE_ADDRESS
] = "addressed",
164 [USB_STATE_CONFIGURED
] = "configured",
165 [USB_STATE_SUSPENDED
] = "suspended",
168 if (state
< 0 || state
>= ARRAY_SIZE(names
))
173 EXPORT_SYMBOL_GPL(usb_state_string
);
175 static const char *const usb_dr_modes
[] = {
176 [USB_DR_MODE_UNKNOWN
] = "",
177 [USB_DR_MODE_HOST
] = "host",
178 [USB_DR_MODE_PERIPHERAL
] = "peripheral",
179 [USB_DR_MODE_OTG
] = "otg",
182 static enum usb_dr_mode
usb_get_dr_mode_from_string(const char *str
)
186 ret
= match_string(usb_dr_modes
, ARRAY_SIZE(usb_dr_modes
), str
);
187 return (ret
< 0) ? USB_DR_MODE_UNKNOWN
: ret
;
190 enum usb_dr_mode
usb_get_dr_mode(struct device
*dev
)
195 err
= device_property_read_string(dev
, "dr_mode", &dr_mode
);
197 return USB_DR_MODE_UNKNOWN
;
199 return usb_get_dr_mode_from_string(dr_mode
);
201 EXPORT_SYMBOL_GPL(usb_get_dr_mode
);
204 * usb_get_role_switch_default_mode - Get default mode for given device
205 * @dev: Pointer to the given device
207 * The function gets string from property 'role-switch-default-mode',
208 * and returns the corresponding enum usb_dr_mode.
210 enum usb_dr_mode
usb_get_role_switch_default_mode(struct device
*dev
)
215 ret
= device_property_read_string(dev
, "role-switch-default-mode", &str
);
217 return USB_DR_MODE_UNKNOWN
;
219 return usb_get_dr_mode_from_string(str
);
221 EXPORT_SYMBOL_GPL(usb_get_role_switch_default_mode
);
224 * usb_decode_interval - Decode bInterval into the time expressed in 1us unit
225 * @epd: The descriptor of the endpoint
226 * @speed: The speed that the endpoint works as
228 * Function returns the interval expressed in 1us unit for servicing
229 * endpoint for data transfers.
231 unsigned int usb_decode_interval(const struct usb_endpoint_descriptor
*epd
,
232 enum usb_device_speed speed
)
234 unsigned int interval
= 0;
236 switch (usb_endpoint_type(epd
)) {
237 case USB_ENDPOINT_XFER_CONTROL
:
238 /* uframes per NAK */
239 if (speed
== USB_SPEED_HIGH
)
240 interval
= epd
->bInterval
;
242 case USB_ENDPOINT_XFER_ISOC
:
243 interval
= 1 << (epd
->bInterval
- 1);
245 case USB_ENDPOINT_XFER_BULK
:
246 /* uframes per NAK */
247 if (speed
== USB_SPEED_HIGH
&& usb_endpoint_dir_out(epd
))
248 interval
= epd
->bInterval
;
250 case USB_ENDPOINT_XFER_INT
:
251 if (speed
>= USB_SPEED_HIGH
)
252 interval
= 1 << (epd
->bInterval
- 1);
254 interval
= epd
->bInterval
;
258 interval
*= (speed
>= USB_SPEED_HIGH
) ? 125 : 1000;
262 EXPORT_SYMBOL_GPL(usb_decode_interval
);
266 * of_usb_get_dr_mode_by_phy - Get dual role mode for the controller device
267 * which is associated with the given phy device_node
268 * @np: Pointer to the given phy device_node
269 * @arg0: phandle args[0] for phy's with #phy-cells >= 1, or -1 for
270 * phys which do not have phy-cells
272 * In dts a usb controller associates with phy devices. The function gets
273 * the string from property 'dr_mode' of the controller associated with the
274 * given phy device node, and returns the correspondig enum usb_dr_mode.
276 enum usb_dr_mode
of_usb_get_dr_mode_by_phy(struct device_node
*np
, int arg0
)
278 struct device_node
*controller
;
279 struct of_phandle_args args
;
284 for_each_node_with_property(controller
, "phys") {
285 if (!of_device_is_available(controller
))
290 args
.np
= of_parse_phandle(controller
, "phys",
294 err
= of_parse_phandle_with_args(controller
,
295 "phys", "#phy-cells",
301 of_node_put(args
.np
);
302 if (args
.np
== np
&& (args
.args_count
== 0 ||
303 args
.args
[0] == arg0
))
310 err
= of_property_read_string(controller
, "dr_mode", &dr_mode
);
311 of_node_put(controller
);
314 return USB_DR_MODE_UNKNOWN
;
316 return usb_get_dr_mode_from_string(dr_mode
);
318 EXPORT_SYMBOL_GPL(of_usb_get_dr_mode_by_phy
);
321 * of_usb_host_tpl_support - to get if Targeted Peripheral List is supported
322 * for given targeted hosts (non-PC hosts)
323 * @np: Pointer to the given device_node
325 * The function gets if the targeted hosts support TPL or not
327 bool of_usb_host_tpl_support(struct device_node
*np
)
329 return of_property_read_bool(np
, "tpl-support");
331 EXPORT_SYMBOL_GPL(of_usb_host_tpl_support
);
334 * of_usb_update_otg_caps - to update usb otg capabilities according to
335 * the passed properties in DT.
336 * @np: Pointer to the given device_node
337 * @otg_caps: Pointer to the target usb_otg_caps to be set
339 * The function updates the otg capabilities
341 int of_usb_update_otg_caps(struct device_node
*np
,
342 struct usb_otg_caps
*otg_caps
)
349 if (!of_property_read_u32(np
, "otg-rev", &otg_rev
)) {
355 /* Choose the lesser one if it's already been set */
356 if (otg_caps
->otg_rev
)
357 otg_caps
->otg_rev
= min_t(u16
, otg_rev
,
360 otg_caps
->otg_rev
= otg_rev
;
363 pr_err("%pOF: unsupported otg-rev: 0x%x\n",
369 * otg-rev is mandatory for otg properties, if not passed
370 * we set it to be 0 and assume it's a legacy otg device.
371 * Non-dt platform can set it afterwards.
373 otg_caps
->otg_rev
= 0;
376 if (of_property_read_bool(np
, "hnp-disable"))
377 otg_caps
->hnp_support
= false;
378 if (of_property_read_bool(np
, "srp-disable"))
379 otg_caps
->srp_support
= false;
380 if (of_property_read_bool(np
, "adp-disable") ||
381 (otg_caps
->otg_rev
< 0x0200))
382 otg_caps
->adp_support
= false;
386 EXPORT_SYMBOL_GPL(of_usb_update_otg_caps
);
389 * usb_of_get_companion_dev - Find the companion device
390 * @dev: the device pointer to find a companion
392 * Find the companion device from platform bus.
394 * Takes a reference to the returned struct device which needs to be dropped
397 * Return: On success, a pointer to the companion device, %NULL on failure.
399 struct device
*usb_of_get_companion_dev(struct device
*dev
)
401 struct device_node
*node
;
402 struct platform_device
*pdev
= NULL
;
404 node
= of_parse_phandle(dev
->of_node
, "companion", 0);
406 pdev
= of_find_device_by_node(node
);
410 return pdev
? &pdev
->dev
: NULL
;
412 EXPORT_SYMBOL_GPL(usb_of_get_companion_dev
);
415 struct dentry
*usb_debug_root
;
416 EXPORT_SYMBOL_GPL(usb_debug_root
);
418 DEFINE_MUTEX(usb_dynids_lock
);
419 EXPORT_SYMBOL_GPL(usb_dynids_lock
);
421 static int __init
usb_common_init(void)
423 usb_debug_root
= debugfs_create_dir("usb", NULL
);
428 static void __exit
usb_common_exit(void)
431 debugfs_remove_recursive(usb_debug_root
);
434 subsys_initcall(usb_common_init
);
435 module_exit(usb_common_exit
);
437 MODULE_DESCRIPTION("Common code for host and device side USB");
438 MODULE_LICENSE("GPL");