xref: /rk3399_rockchip-uboot/drivers/usb/common/common.c (revision d164f686d669ddcb77c0b083da584efcaf888e4b)
1c0c62d92SMugunthan V N /*
2c0c62d92SMugunthan V N  * Provides code common for host and device side USB.
3c0c62d92SMugunthan V N  *
4c0c62d92SMugunthan V N  * (C) Copyright 2016
5c0c62d92SMugunthan V N  *     Texas Instruments Incorporated, <www.ti.com>
6c0c62d92SMugunthan V N  *
7c0c62d92SMugunthan V N  * SPDX-License-Identifier:     GPL-2.0+
8c0c62d92SMugunthan V N  */
9c0c62d92SMugunthan V N 
10c0c62d92SMugunthan V N #include <common.h>
11ef78966dSKever Yang #include <dm.h>
12c0c62d92SMugunthan V N #include <linux/usb/otg.h>
1381cd8855SMugunthan V N #include <linux/usb/ch9.h>
1473d7b075SFrank Wang #include <linux/usb/phy.h>
15c0c62d92SMugunthan V N 
16c0c62d92SMugunthan V N DECLARE_GLOBAL_DATA_PTR;
17c0c62d92SMugunthan V N 
18c0c62d92SMugunthan V N static const char *const usb_dr_modes[] = {
19c0c62d92SMugunthan V N 	[USB_DR_MODE_UNKNOWN]		= "",
20c0c62d92SMugunthan V N 	[USB_DR_MODE_HOST]		= "host",
21c0c62d92SMugunthan V N 	[USB_DR_MODE_PERIPHERAL]	= "peripheral",
22c0c62d92SMugunthan V N 	[USB_DR_MODE_OTG]		= "otg",
23c0c62d92SMugunthan V N };
24c0c62d92SMugunthan V N 
usb_get_dr_mode(ofnode node)25ef78966dSKever Yang enum usb_dr_mode usb_get_dr_mode(ofnode node)
26c0c62d92SMugunthan V N {
27c0c62d92SMugunthan V N 	const char *dr_mode;
28c0c62d92SMugunthan V N 	int i;
29c0c62d92SMugunthan V N 
30ef78966dSKever Yang 	dr_mode = ofnode_read_string(node, "dr_mode");
31c0c62d92SMugunthan V N 	if (!dr_mode) {
3290aa625cSMasahiro Yamada 		pr_err("usb dr_mode not found\n");
33c0c62d92SMugunthan V N 		return USB_DR_MODE_UNKNOWN;
34c0c62d92SMugunthan V N 	}
35c0c62d92SMugunthan V N 
36c0c62d92SMugunthan V N 	for (i = 0; i < ARRAY_SIZE(usb_dr_modes); i++)
37c0c62d92SMugunthan V N 		if (!strcmp(dr_mode, usb_dr_modes[i]))
38c0c62d92SMugunthan V N 			return i;
39c0c62d92SMugunthan V N 
40c0c62d92SMugunthan V N 	return USB_DR_MODE_UNKNOWN;
41c0c62d92SMugunthan V N }
4281cd8855SMugunthan V N 
4381cd8855SMugunthan V N static const char *const speed_names[] = {
4481cd8855SMugunthan V N 	[USB_SPEED_UNKNOWN] = "UNKNOWN",
4581cd8855SMugunthan V N 	[USB_SPEED_LOW] = "low-speed",
4681cd8855SMugunthan V N 	[USB_SPEED_FULL] = "full-speed",
4781cd8855SMugunthan V N 	[USB_SPEED_HIGH] = "high-speed",
4881cd8855SMugunthan V N 	[USB_SPEED_WIRELESS] = "wireless",
4981cd8855SMugunthan V N 	[USB_SPEED_SUPER] = "super-speed",
5081cd8855SMugunthan V N };
5181cd8855SMugunthan V N 
usb_speed_string(enum usb_device_speed speed)52*d164f686SChunfeng Yun const char *usb_speed_string(enum usb_device_speed speed)
53*d164f686SChunfeng Yun {
54*d164f686SChunfeng Yun 	if (speed < 0 || speed >= ARRAY_SIZE(speed_names))
55*d164f686SChunfeng Yun 		speed = USB_SPEED_UNKNOWN;
56*d164f686SChunfeng Yun 	return speed_names[speed];
57*d164f686SChunfeng Yun }
58*d164f686SChunfeng Yun 
usb_get_maximum_speed(ofnode node)59ef78966dSKever Yang enum usb_device_speed usb_get_maximum_speed(ofnode node)
6081cd8855SMugunthan V N {
6181cd8855SMugunthan V N 	const char *max_speed;
6281cd8855SMugunthan V N 	int i;
6381cd8855SMugunthan V N 
64ef78966dSKever Yang 	max_speed = ofnode_read_string(node, "maximum-speed");
6581cd8855SMugunthan V N 	if (!max_speed) {
6681cd8855SMugunthan V N 		pr_err("usb maximum-speed not found\n");
6781cd8855SMugunthan V N 		return USB_SPEED_UNKNOWN;
6881cd8855SMugunthan V N 	}
6981cd8855SMugunthan V N 
7081cd8855SMugunthan V N 	for (i = 0; i < ARRAY_SIZE(speed_names); i++)
7181cd8855SMugunthan V N 		if (!strcmp(max_speed, speed_names[i]))
7281cd8855SMugunthan V N 			return i;
7381cd8855SMugunthan V N 
7481cd8855SMugunthan V N 	return USB_SPEED_UNKNOWN;
7581cd8855SMugunthan V N }
7673d7b075SFrank Wang 
7773d7b075SFrank Wang #if CONFIG_IS_ENABLED(OF_LIVE) && CONFIG_IS_ENABLED(DM_USB)
7873d7b075SFrank Wang static const char *const usbphy_modes[] = {
7973d7b075SFrank Wang 	[USBPHY_INTERFACE_MODE_UNKNOWN]	= "",
8073d7b075SFrank Wang 	[USBPHY_INTERFACE_MODE_UTMI]	= "utmi",
8173d7b075SFrank Wang 	[USBPHY_INTERFACE_MODE_UTMIW]	= "utmi_wide",
8273d7b075SFrank Wang };
8373d7b075SFrank Wang 
usb_get_phy_mode(ofnode node)8473d7b075SFrank Wang enum usb_phy_interface usb_get_phy_mode(ofnode node)
8573d7b075SFrank Wang {
8673d7b075SFrank Wang 	const char *phy_type;
8773d7b075SFrank Wang 	int i;
8873d7b075SFrank Wang 
8973d7b075SFrank Wang 	phy_type = ofnode_get_property(node, "phy_type", NULL);
9073d7b075SFrank Wang 	if (!phy_type)
9173d7b075SFrank Wang 		return USBPHY_INTERFACE_MODE_UNKNOWN;
9273d7b075SFrank Wang 
9373d7b075SFrank Wang 	for (i = 0; i < ARRAY_SIZE(usbphy_modes); i++)
9473d7b075SFrank Wang 		if (!strcmp(phy_type, usbphy_modes[i]))
9573d7b075SFrank Wang 			return i;
9673d7b075SFrank Wang 
9773d7b075SFrank Wang 	return USBPHY_INTERFACE_MODE_UNKNOWN;
9873d7b075SFrank Wang }
9973d7b075SFrank Wang #endif
100