blob: 7137a569d97c83a8f84c7c7ac2f45227e931eb9a [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Mugunthan V Nc0c62d92016-04-12 16:01:19 +05302/*
3 * Provides code common for host and device side USB.
4 *
5 * (C) Copyright 2016
6 * Texas Instruments Incorporated, <www.ti.com>
Mugunthan V Nc0c62d92016-04-12 16:01:19 +05307 */
8
9#include <common.h>
Kever Yangac28e592020-03-04 08:59:50 +080010#include <dm.h>
Simon Glass401d1c42020-10-30 21:38:53 -060011#include <asm/global_data.h>
Simon Glass1e94b462023-09-14 18:21:46 -060012#include <linux/printk.h>
Mugunthan V Nc0c62d92016-04-12 16:01:19 +053013#include <linux/usb/otg.h>
Mugunthan V N59592b92018-05-18 13:15:05 +020014#include <linux/usb/ch9.h>
Frank Wang64697942020-05-26 11:34:30 +080015#include <linux/usb/phy.h>
Mugunthan V Nc0c62d92016-04-12 16:01:19 +053016
17DECLARE_GLOBAL_DATA_PTR;
18
19static const char *const usb_dr_modes[] = {
20 [USB_DR_MODE_UNKNOWN] = "",
21 [USB_DR_MODE_HOST] = "host",
22 [USB_DR_MODE_PERIPHERAL] = "peripheral",
23 [USB_DR_MODE_OTG] = "otg",
24};
25
Kever Yangac28e592020-03-04 08:59:50 +080026enum usb_dr_mode usb_get_dr_mode(ofnode node)
Mugunthan V Nc0c62d92016-04-12 16:01:19 +053027{
Mugunthan V Nc0c62d92016-04-12 16:01:19 +053028 const char *dr_mode;
29 int i;
30
Kever Yangac28e592020-03-04 08:59:50 +080031 dr_mode = ofnode_read_string(node, "dr_mode");
Mugunthan V Nc0c62d92016-04-12 16:01:19 +053032 if (!dr_mode) {
Michael Walle7f79a2c2021-10-15 15:15:20 +020033 pr_debug("usb dr_mode not found\n");
Mugunthan V Nc0c62d92016-04-12 16:01:19 +053034 return USB_DR_MODE_UNKNOWN;
35 }
36
37 for (i = 0; i < ARRAY_SIZE(usb_dr_modes); i++)
38 if (!strcmp(dr_mode, usb_dr_modes[i]))
39 return i;
40
41 return USB_DR_MODE_UNKNOWN;
42}
Mugunthan V N59592b92018-05-18 13:15:05 +020043
Mark Kettenis6a6468f2022-04-19 21:06:33 +020044enum usb_dr_mode usb_get_role_switch_default_mode(ofnode node)
45{
46 const char *dr_mode;
47 int i;
48
49 dr_mode = ofnode_read_string(node, "role-switch-default-mode");
50 if (!dr_mode)
51 return USB_DR_MODE_UNKNOWN;
52
53 for (i = 0; i < ARRAY_SIZE(usb_dr_modes); i++)
54 if (!strcmp(dr_mode, usb_dr_modes[i]))
55 return i;
56
57 return USB_DR_MODE_UNKNOWN;
58}
59
Mugunthan V N59592b92018-05-18 13:15:05 +020060static const char *const speed_names[] = {
61 [USB_SPEED_UNKNOWN] = "UNKNOWN",
62 [USB_SPEED_LOW] = "low-speed",
63 [USB_SPEED_FULL] = "full-speed",
64 [USB_SPEED_HIGH] = "high-speed",
65 [USB_SPEED_WIRELESS] = "wireless",
66 [USB_SPEED_SUPER] = "super-speed",
Chunfeng Yuna4de6e32020-10-14 15:08:27 +080067 [USB_SPEED_SUPER_PLUS] = "super-speed-plus",
Mugunthan V N59592b92018-05-18 13:15:05 +020068};
69
Chunfeng Yund92e8662020-10-14 15:08:28 +080070const char *usb_speed_string(enum usb_device_speed speed)
71{
72 if (speed < 0 || speed >= ARRAY_SIZE(speed_names))
73 speed = USB_SPEED_UNKNOWN;
74 return speed_names[speed];
75}
76
Kever Yangac28e592020-03-04 08:59:50 +080077enum usb_device_speed usb_get_maximum_speed(ofnode node)
Mugunthan V N59592b92018-05-18 13:15:05 +020078{
Mugunthan V N59592b92018-05-18 13:15:05 +020079 const char *max_speed;
80 int i;
81
Kever Yangac28e592020-03-04 08:59:50 +080082 max_speed = ofnode_read_string(node, "maximum-speed");
Mugunthan V N59592b92018-05-18 13:15:05 +020083 if (!max_speed) {
Michael Walle7f79a2c2021-10-15 15:15:20 +020084 pr_debug("usb maximum-speed not found\n");
Mugunthan V N59592b92018-05-18 13:15:05 +020085 return USB_SPEED_UNKNOWN;
86 }
87
88 for (i = 0; i < ARRAY_SIZE(speed_names); i++)
89 if (!strcmp(max_speed, speed_names[i]))
90 return i;
91
92 return USB_SPEED_UNKNOWN;
93}
Frank Wang64697942020-05-26 11:34:30 +080094
95#if CONFIG_IS_ENABLED(DM_USB)
96static const char *const usbphy_modes[] = {
97 [USBPHY_INTERFACE_MODE_UNKNOWN] = "",
98 [USBPHY_INTERFACE_MODE_UTMI] = "utmi",
99 [USBPHY_INTERFACE_MODE_UTMIW] = "utmi_wide",
Matthias Schiffer950cb1f2021-09-20 15:37:22 +0200100 [USBPHY_INTERFACE_MODE_ULPI] = "ulpi",
101 [USBPHY_INTERFACE_MODE_SERIAL] = "serial",
102 [USBPHY_INTERFACE_MODE_HSIC] = "hsic",
Frank Wang64697942020-05-26 11:34:30 +0800103};
104
105enum usb_phy_interface usb_get_phy_mode(ofnode node)
106{
107 const char *phy_type;
108 int i;
109
110 phy_type = ofnode_get_property(node, "phy_type", NULL);
111 if (!phy_type)
112 return USBPHY_INTERFACE_MODE_UNKNOWN;
113
114 for (i = 0; i < ARRAY_SIZE(usbphy_modes); i++)
115 if (!strcmp(phy_type, usbphy_modes[i]))
116 return i;
117
118 return USBPHY_INTERFACE_MODE_UNKNOWN;
119}
120#endif