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