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