coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
usb.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <device/mmio.h>
4 #include <console/console.h>
5 #include <soc/addressmap.h>
6 #include <soc/usb.h>
7 #include <timer.h>
8 
9 #define USBTAG "[SSUSB] "
10 #define u3p_msg(fmt, arg...) printk(BIOS_INFO, USBTAG fmt, ##arg)
11 #define u3p_err(fmt, arg...) printk(BIOS_ERR, USBTAG fmt, ##arg)
12 
13 static struct ssusb_ippc_regs *ippc_regs = (void *)(SSUSB_IPPC_BASE);
14 static struct ssusb_sif_port *phy_ports = (void *)(SSUSB_SIF_BASE);
15 
16 static void phy_index_power_on(int index)
17 {
18  struct ssusb_sif_port *phy = phy_ports + index;
19 
20  if (!index) {
21  /* Set RG_SSUSB_VUSB10_ON as 1 after VUSB10 ready */
23  /* Disable power domain ISO */
25  }
26  /* Switch system IP to USB mode */
29  if (!index)
31 
32  /* Disable force settings */
35 
37  /* Improve Rx sensitivity */
40 
42 
45 
48 
49  if (!index)
51 
54 
59 
62 
63  /* Set USB 2.0 slew rate value */
66 
67  /* Set USB 2.0 disconnect threshold */
70 }
71 
72 static void u3phy_power_on(void)
73 {
74  for (int i = 0; i < USB_PORT_NUMBER; i++)
76 }
77 
78 static int check_ip_clk_status(void)
79 {
80  int u3_port_num;
81  u32 check_bits;
82  u32 sts1, sts2;
83  struct stopwatch sw;
84 
85  u3_port_num = CAP_U3_PORT_NUM(read32(&ippc_regs->ip_xhci_cap));
86 
88  check_bits |= (u3_port_num ? STS1_U3_MAC_RST : 0);
89 
90  stopwatch_init_usecs_expire(&sw, 50000);
91 
92  do {
93  if (stopwatch_expired(&sw)) {
94  u3p_err("USB clocks are not stable!!!\n");
95  return -1;
96  }
97 
98  sts1 = read32(&ippc_regs->ip_pw_sts1) & check_bits;
100  } while ((sts1 != check_bits) || !sts2);
101 
102  return 0;
103 }
104 
105 static int u3phy_ports_enable(void)
106 {
107  int i;
108  u32 value;
109  int u3_port_num;
110  int u2_port_num;
111 
113  u3_port_num = CAP_U3_PORT_NUM(value);
114  u2_port_num = CAP_U2_PORT_NUM(value);
115  u3p_msg("%s u2p:%d, u3p:%d\n", __func__, u2_port_num, u3_port_num);
116 
117  /* Power on host ip */
119 
120  /* Power on and enable all u3 ports */
121  for (i = 0; i < u3_port_num; i++) {
125  }
126 
127  /* Power on and enable all u2 ports */
128  for (i = 0; i < u2_port_num; i++) {
132  }
133  return check_ip_clk_status();
134 }
135 
136 static inline void ssusb_soft_reset(void)
137 {
138  /* Reset whole ip */
141 }
142 
144 {
145  /* do nothing */
146 }
147 
149 {
150  /* do nothing */
151 }
152 
153 void setup_usb_host(void)
154 {
155  u3p_msg("Setting up USB HOST controller...\n");
156 
157  mtk_usb_prepare();
159  if (u3phy_ports_enable()) {
160  u3p_err("%s fail to enable ports\n", __func__);
161  return;
162  }
163  u3phy_power_on();
165  u3p_msg("phy power-on done.\n");
166 }
pte_t value
Definition: mmu.c:91
static uint32_t read32(const void *addr)
Definition: mmio.h:22
#define setbits32(addr, set)
Definition: mmio.h:21
#define clrsetbits32(addr, clear, set)
Definition: mmio.h:16
#define clrbits32(addr, clear)
Definition: mmio.h:26
static int stopwatch_expired(struct stopwatch *sw)
Definition: timer.h:152
static void stopwatch_init_usecs_expire(struct stopwatch *sw, long us)
Definition: timer.h:127
#define CTRL_U3_PORT_PDN
Definition: usb_common.h:29
#define PA6_RG_U2_DISCTH_VAL(x)
Definition: usb_common.h:61
#define CTRL1_IP_HOST_PDN
Definition: usb_common.h:12
#define PA6_RG_U2_SQTH_VAL(x)
Definition: usb_common.h:63
#define P2C_RG_DATAIN
Definition: usb_common.h:78
#define P3A_RG_U3_VUSB10_ON
Definition: usb_common.h:99
#define STS1_SYS125_RST
Definition: usb_common.h:16
#define STS1_SYSPLL_STABLE
Definition: usb_common.h:18
#define PA6_RG_U2_DISCTH
Definition: usb_common.h:60
#define CTRL_U2_PORT_DIS
Definition: usb_common.h:35
#define P3A_RG_TX_EIDLE_CM_VAL(x)
Definition: usb_common.h:103
#define PA6_RG_U2_SQTH
Definition: usb_common.h:62
#define P3A_RG_XTAL_EXT_EN_U3
Definition: usb_common.h:110
#define P2C_RG_SESSEND
Definition: usb_common.h:95
#define P3D_RG_CDR_BIR_LTD1
Definition: usb_common.h:114
#define P2C_DTM0_PART_MASK
Definition: usb_common.h:86
#define STS1_REF_RST
Definition: usb_common.h:17
#define PA6_RG_U2_OTG_VBUSCMP_EN
Definition: usb_common.h:59
#define PA5_RG_U2_HSTX_SRCTRL
Definition: usb_common.h:52
#define P2C_FORCE_SUSPENDM
Definition: usb_common.h:76
#define P3A_RG_TX_EIDLE_CM
Definition: usb_common.h:102
#define CTRL0_IP_SW_RST
Definition: usb_common.h:9
#define CTRL_U3_PORT_DIS
Definition: usb_common.h:30
#define P2C_RG_XCVRSEL
Definition: usb_common.h:82
#define CAP_U3_PORT_NUM(p)
Definition: usb_common.h:24
#define P3A_RG_XTAL_EXT_EN_U3_VAL(x)
Definition: usb_common.h:111
#define P2C_U2_GPIO_CTR_MSK
Definition: usb_common.h:68
#define CTRL_U2_PORT_PDN
Definition: usb_common.h:34
#define STS2_U2_MAC_RST
Definition: usb_common.h:21
#define CTRL_U3_PORT_HOST_SEL
Definition: usb_common.h:28
#define P3A_RG_RX_DAC_MUX
Definition: usb_common.h:106
#define PA5_RG_U2_HS_100U_U3_EN
Definition: usb_common.h:54
#define PA6_RG_U2_ISO_EN
Definition: usb_common.h:57
#define P2C_FORCE_UART_EN
Definition: usb_common.h:71
#define PA5_RG_U2_HSTX_SRCTRL_VAL(x)
Definition: usb_common.h:53
#define P3D_RG_CDR_BIR_LTD1_VAL(x)
Definition: usb_common.h:115
#define P3D_RG_CDR_BIR_LTD0_VAL(x)
Definition: usb_common.h:117
#define P2C_RG_AVALID
Definition: usb_common.h:96
#define P3A_RG_RX_DAC_MUX_VAL(x)
Definition: usb_common.h:107
#define P2C_RG_VBUSVALID
Definition: usb_common.h:94
#define STS1_U3_MAC_RST
Definition: usb_common.h:15
#define P2C_RG_UART_EN
Definition: usb_common.h:93
#define CAP_U2_PORT_NUM(p)
Definition: usb_common.h:25
#define CTRL_U2_PORT_HOST_SEL
Definition: usb_common.h:33
#define P3D_RG_CDR_BIR_LTD0
Definition: usb_common.h:116
#define PA6_RG_U2_BC11_SW_EN
Definition: usb_common.h:58
const struct smm_save_state_ops *legacy_ops __weak
Definition: save_state.c:8
#define u3p_msg(fmt, arg...)
Definition: usb.c:10
static void u3phy_power_on(void)
Definition: usb.c:72
void setup_usb_host(void)
Definition: usb.c:153
static struct ssusb_ippc_regs * ippc_regs
Definition: usb.c:13
__weak void mtk_usb_adjust_phy_shift(void)
Definition: usb.c:148
static int u3phy_ports_enable(void)
Definition: usb.c:105
static void phy_index_power_on(int index)
Definition: usb.c:16
static struct ssusb_sif_port * phy_ports
Definition: usb.c:14
__weak void mtk_usb_prepare(void)
Definition: usb.c:143
#define u3p_err(fmt, arg...)
Definition: usb.c:11
static int check_ip_clk_status(void)
Definition: usb.c:78
static void ssusb_soft_reset(void)
Definition: usb.c:136
@ SSUSB_IPPC_BASE
Definition: addressmap.h:42
@ SSUSB_SIF_BASE
Definition: addressmap.h:43
#define USB_PORT_NUMBER
Definition: usb.h:21
uint32_t u32
Definition: stdint.h:51
u32 phya_reg0
Definition: usb_common.h:143
u32 phya_reg6
Definition: usb_common.h:145
u32 phya_reg9
Definition: usb_common.h:147
u32 phyd_cdr1
Definition: usb_common.h:138
u64 u2_ctrl_p[6]
Definition: usb_common.h:48
u64 u3_ctrl_p[4]
Definition: usb_common.h:47
struct sif_u3phya_da u3phya_da
Definition: usb.h:13
struct sif_u3phyd u3phyd
Definition: usb.h:10
struct sif_u2_phy_com u2phy
Definition: usb.h:9
struct sif_u3phya u3phya
Definition: usb.h:12