xref: /openbmc/u-boot/drivers/usb/common/fsl-errata.c (revision ae485b54)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Freescale USB Controller
4  *
5  * Copyright 2013 Freescale Semiconductor, Inc.
6  */
7 
8 #include <common.h>
9 #include <fsl_errata.h>
10 #include<fsl_usb.h>
11 #if defined(CONFIG_FSL_LSCH2) || defined(CONFIG_FSL_LSCH3) || \
12 	defined(CONFIG_ARM)
13 #include <asm/arch/clock.h>
14 #endif
15 
16 /* USB Erratum Checking code */
17 #if defined(CONFIG_PPC) || defined(CONFIG_ARM)
18 bool has_dual_phy(void)
19 {
20 	u32 svr = get_svr();
21 	u32 soc = SVR_SOC_VER(svr);
22 
23 	switch (soc) {
24 #ifdef CONFIG_PPC
25 	case SVR_T1023:
26 	case SVR_T1024:
27 	case SVR_T1013:
28 	case SVR_T1014:
29 		return IS_SVR_REV(svr, 1, 0);
30 	case SVR_T1040:
31 	case SVR_T1042:
32 	case SVR_T1020:
33 	case SVR_T1022:
34 	case SVR_T2080:
35 	case SVR_T2081:
36 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1);
37 	case SVR_T4240:
38 	case SVR_T4160:
39 	case SVR_T4080:
40 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0);
41 #endif
42 	}
43 
44 	return false;
45 }
46 
47 bool has_erratum_a006261(void)
48 {
49 	u32 svr = get_svr();
50 	u32 soc = SVR_SOC_VER(svr);
51 
52 	switch (soc) {
53 #ifdef CONFIG_PPC
54 	case SVR_P1010:
55 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0);
56 	case SVR_P2041:
57 	case SVR_P2040:
58 		return IS_SVR_REV(svr, 1, 0) ||
59 			IS_SVR_REV(svr, 1, 1) ||
60 			IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 2, 1);
61 	case SVR_P3041:
62 		return IS_SVR_REV(svr, 1, 0) ||
63 			IS_SVR_REV(svr, 1, 1) ||
64 			IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 2, 1);
65 	case SVR_P5010:
66 	case SVR_P5020:
67 	case SVR_P5021:
68 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0);
69 	case SVR_T4240:
70 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0);
71 	case SVR_P5040:
72 		return IS_SVR_REV(svr, 1, 0) ||
73 			IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 2, 1);
74 #endif
75 	}
76 
77 	return false;
78 }
79 
80 bool has_erratum_a007075(void)
81 {
82 	u32 svr = get_svr();
83 	u32 soc = SVR_SOC_VER(svr);
84 
85 	switch (soc) {
86 #ifdef CONFIG_PPC
87 	case SVR_B4860:
88 	case SVR_B4420:
89 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0);
90 	case SVR_P1010:
91 		return IS_SVR_REV(svr, 1, 0);
92 	case SVR_P4080:
93 		return IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 3, 0);
94 #endif
95 	}
96 	return false;
97 }
98 
99 bool has_erratum_a007798(void)
100 {
101 #ifdef CONFIG_PPC
102 	return SVR_SOC_VER(get_svr()) == SVR_T4240 &&
103 		IS_SVR_REV(get_svr(), 2, 0);
104 #endif
105 	return false;
106 }
107 
108 bool has_erratum_a007792(void)
109 {
110 	u32 svr = get_svr();
111 	u32 soc = SVR_SOC_VER(svr);
112 
113 	switch (soc) {
114 #ifdef CONFIG_PPC
115 	case SVR_T4240:
116 	case SVR_T4160:
117 	case SVR_T4080:
118 		return IS_SVR_REV(svr, 2, 0);
119 	case SVR_T1024:
120 	case SVR_T1023:
121 		return IS_SVR_REV(svr, 1, 0);
122 	case SVR_T1040:
123 	case SVR_T1042:
124 	case SVR_T1020:
125 	case SVR_T1022:
126 	case SVR_T2080:
127 	case SVR_T2081:
128 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1);
129 #endif
130 	}
131 	return false;
132 }
133 
134 bool has_erratum_a005697(void)
135 {
136 	u32 svr = get_svr();
137 	u32 soc = SVR_SOC_VER(svr);
138 
139 	switch (soc) {
140 #ifdef CONFIG_PPC
141 	case SVR_9131:
142 	case SVR_9132:
143 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1);
144 #endif
145 #ifdef ONFIG_ARM64
146 	case SVR_LS1012A:
147 		return IS_SVR_REV(svr, 1, 0);
148 #endif
149 	}
150 	return false;
151 }
152 
153 bool has_erratum_a004477(void)
154 {
155 	u32 svr = get_svr();
156 	u32 soc = SVR_SOC_VER(svr);
157 
158 	switch (soc) {
159 #ifdef CONFIG_PPC
160 	case SVR_P1010:
161 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0);
162 	case SVR_P1022:
163 	case SVR_9131:
164 	case SVR_9132:
165 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1);
166 	case SVR_P2020:
167 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0) ||
168 			IS_SVR_REV(svr, 2, 1);
169 	case SVR_B4860:
170 	case SVR_B4420:
171 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0);
172 	case SVR_P4080:
173 		return IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 3, 0);
174 #endif
175 	}
176 
177 	return false;
178 }
179 
180 bool has_erratum_a008751(void)
181 {
182 	u32 svr = get_svr();
183 	u32 soc = SVR_SOC_VER(svr);
184 
185 	switch (soc) {
186 #ifdef CONFIG_ARM64
187 	case SVR_LS2080A:
188 	case SVR_LS2085A:
189 		return IS_SVR_REV(svr, 1, 0);
190 #endif
191 	}
192 	return false;
193 }
194 
195 bool has_erratum_a010151(void)
196 {
197 	u32 svr = get_svr();
198 	u32 soc = SVR_SOC_VER(svr);
199 
200 #ifdef CONFIG_ARM64
201 	if (IS_SVR_DEV(svr, SVR_DEV(SVR_LS1043A)))
202 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1);
203 #endif
204 
205 	switch (soc) {
206 #ifdef CONFIG_ARM64
207 	case SVR_LS2080A:
208 	case SVR_LS2085A:
209 			/* fallthrough */
210 	case SVR_LS2088A:
211 			/* fallthrough */
212 	case SVR_LS2081A:
213 	case SVR_LS1046A:
214 	case SVR_LS1012A:
215 		return IS_SVR_REV(svr, 1, 0);
216 #endif
217 #ifdef CONFIG_ARCH_LS1021A
218 	case SOC_VER_LS1020:
219 	case SOC_VER_LS1021:
220 	case SOC_VER_LS1022:
221 	case SOC_VER_SLS1020:
222 		return IS_SVR_REV(svr, 2, 0);
223 #endif
224 	}
225 	return false;
226 }
227 
228 #endif
229