1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Freescale USB Controller
4  *
5  * Copyright 2013 Freescale Semiconductor, Inc.
6  */
7 
8 #include <hwconfig.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)
has_dual_phy(void)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 
has_erratum_a005275(void)47 bool has_erratum_a005275(void)
48 {
49 	u32 svr = get_svr();
50 	u32 soc = SVR_SOC_VER(svr);
51 
52 	if (hwconfig("no_erratum_a005275"))
53 		return false;
54 
55 	switch (soc) {
56 #ifdef CONFIG_PPC
57 	case SVR_P3041:
58 	case SVR_P2041:
59 	case SVR_P2040:
60 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1);
61 	case SVR_P5010:
62 	case SVR_P5020:
63 	case SVR_P5021:
64 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0);
65 	case SVR_P5040:
66 	case SVR_P1010:
67 		return IS_SVR_REV(svr, 1, 0);
68 #endif
69 	}
70 
71 	return false;
72 }
73 
has_erratum_a006261(void)74 bool has_erratum_a006261(void)
75 {
76 	u32 svr = get_svr();
77 	u32 soc = SVR_SOC_VER(svr);
78 
79 	switch (soc) {
80 #ifdef CONFIG_PPC
81 	case SVR_P1010:
82 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0);
83 	case SVR_P2041:
84 	case SVR_P2040:
85 		return IS_SVR_REV(svr, 1, 0) ||
86 			IS_SVR_REV(svr, 1, 1) ||
87 			IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 2, 1);
88 	case SVR_P3041:
89 		return IS_SVR_REV(svr, 1, 0) ||
90 			IS_SVR_REV(svr, 1, 1) ||
91 			IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 2, 1);
92 	case SVR_P5010:
93 	case SVR_P5020:
94 	case SVR_P5021:
95 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0);
96 	case SVR_T4240:
97 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0);
98 	case SVR_P5040:
99 		return IS_SVR_REV(svr, 1, 0) ||
100 			IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 2, 1);
101 #endif
102 	}
103 
104 	return false;
105 }
106 
has_erratum_a007075(void)107 bool has_erratum_a007075(void)
108 {
109 	u32 svr = get_svr();
110 	u32 soc = SVR_SOC_VER(svr);
111 
112 	switch (soc) {
113 #ifdef CONFIG_PPC
114 	case SVR_B4860:
115 	case SVR_B4420:
116 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0);
117 	case SVR_P1010:
118 		return IS_SVR_REV(svr, 1, 0);
119 	case SVR_P4080:
120 		return IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 3, 0);
121 #endif
122 	}
123 	return false;
124 }
125 
has_erratum_a007798(void)126 bool has_erratum_a007798(void)
127 {
128 #ifdef CONFIG_PPC
129 	return SVR_SOC_VER(get_svr()) == SVR_T4240 &&
130 		IS_SVR_REV(get_svr(), 2, 0);
131 #endif
132 	return false;
133 }
134 
has_erratum_a007792(void)135 bool has_erratum_a007792(void)
136 {
137 	u32 svr = get_svr();
138 	u32 soc = SVR_SOC_VER(svr);
139 
140 	switch (soc) {
141 #ifdef CONFIG_PPC
142 	case SVR_T4240:
143 	case SVR_T4160:
144 	case SVR_T4080:
145 		return IS_SVR_REV(svr, 2, 0);
146 	case SVR_T1024:
147 	case SVR_T1023:
148 		return IS_SVR_REV(svr, 1, 0);
149 	case SVR_T1040:
150 	case SVR_T1042:
151 	case SVR_T1020:
152 	case SVR_T1022:
153 	case SVR_T2080:
154 	case SVR_T2081:
155 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1);
156 #endif
157 	}
158 	return false;
159 }
160 
has_erratum_a005697(void)161 bool has_erratum_a005697(void)
162 {
163 	u32 svr = get_svr();
164 	u32 soc = SVR_SOC_VER(svr);
165 
166 	switch (soc) {
167 #ifdef CONFIG_PPC
168 	case SVR_9131:
169 	case SVR_9132:
170 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1);
171 #endif
172 #ifdef ONFIG_ARM64
173 	case SVR_LS1012A:
174 		return IS_SVR_REV(svr, 1, 0);
175 #endif
176 	}
177 	return false;
178 }
179 
has_erratum_a004477(void)180 bool has_erratum_a004477(void)
181 {
182 	u32 svr = get_svr();
183 	u32 soc = SVR_SOC_VER(svr);
184 
185 	switch (soc) {
186 #ifdef CONFIG_PPC
187 	case SVR_P1010:
188 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0);
189 	case SVR_P1022:
190 	case SVR_9131:
191 	case SVR_9132:
192 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1);
193 	case SVR_P2020:
194 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0) ||
195 			IS_SVR_REV(svr, 2, 1);
196 	case SVR_B4860:
197 	case SVR_B4420:
198 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0);
199 	case SVR_P4080:
200 		return IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 3, 0);
201 #endif
202 	}
203 
204 	return false;
205 }
206 
has_erratum_a008751(void)207 bool has_erratum_a008751(void)
208 {
209 	u32 svr = get_svr();
210 	u32 soc = SVR_SOC_VER(svr);
211 
212 	switch (soc) {
213 #ifdef CONFIG_ARM64
214 	case SVR_LS2080A:
215 	case SVR_LS2085A:
216 		return IS_SVR_REV(svr, 1, 0);
217 #endif
218 	}
219 	return false;
220 }
221 
has_erratum_a010151(void)222 bool has_erratum_a010151(void)
223 {
224 	u32 svr = get_svr();
225 	u32 soc = SVR_SOC_VER(svr);
226 
227 #ifdef CONFIG_ARM64
228 	if (IS_SVR_DEV(svr, SVR_DEV(SVR_LS1043A)))
229 		return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1);
230 #endif
231 
232 	switch (soc) {
233 #ifdef CONFIG_ARM64
234 	case SVR_LS2080A:
235 	case SVR_LS2085A:
236 			/* fallthrough */
237 	case SVR_LS2088A:
238 			/* fallthrough */
239 	case SVR_LS2081A:
240 	case SVR_LS1046A:
241 	case SVR_LS1012A:
242 		return IS_SVR_REV(svr, 1, 0);
243 #endif
244 #ifdef CONFIG_ARCH_LS1021A
245 	case SOC_VER_LS1020:
246 	case SOC_VER_LS1021:
247 	case SOC_VER_LS1022:
248 	case SOC_VER_SLS1020:
249 		return IS_SVR_REV(svr, 2, 0);
250 #endif
251 	}
252 	return false;
253 }
254 
255 #endif
256