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