192623672SSriram Dash /* 292623672SSriram Dash * Freescale USB Controller 392623672SSriram Dash * 492623672SSriram Dash * Copyright 2013 Freescale Semiconductor, Inc. 592623672SSriram Dash * 692623672SSriram Dash * SPDX-License-Identifier: GPL-2.0+ 792623672SSriram Dash */ 892623672SSriram Dash 992623672SSriram Dash #include <common.h> 1092623672SSriram Dash #include <fsl_errata.h> 1192623672SSriram Dash #include<fsl_usb.h> 12*457e51cfSSimon Glass #if defined(CONFIG_FSL_LSCH2) || defined(CONFIG_FSL_LSCH3) || \ 13*457e51cfSSimon Glass defined(CONFIG_ARM) 146e2941d7SSimon Glass #include <asm/arch/clock.h> 156e2941d7SSimon Glass #endif 1692623672SSriram Dash 1792623672SSriram Dash /* USB Erratum Checking code */ 1892623672SSriram Dash #if defined(CONFIG_PPC) || defined(CONFIG_ARM) 1992623672SSriram Dash bool has_dual_phy(void) 2092623672SSriram Dash { 2192623672SSriram Dash u32 svr = get_svr(); 2292623672SSriram Dash u32 soc = SVR_SOC_VER(svr); 2392623672SSriram Dash 2492623672SSriram Dash switch (soc) { 2592623672SSriram Dash #ifdef CONFIG_PPC 2692623672SSriram Dash case SVR_T1023: 2792623672SSriram Dash case SVR_T1024: 2892623672SSriram Dash case SVR_T1013: 2992623672SSriram Dash case SVR_T1014: 3092623672SSriram Dash return IS_SVR_REV(svr, 1, 0); 3192623672SSriram Dash case SVR_T1040: 3292623672SSriram Dash case SVR_T1042: 3392623672SSriram Dash case SVR_T1020: 3492623672SSriram Dash case SVR_T1022: 3592623672SSriram Dash case SVR_T2080: 3692623672SSriram Dash case SVR_T2081: 3792623672SSriram Dash return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1); 3892623672SSriram Dash case SVR_T4240: 3992623672SSriram Dash case SVR_T4160: 4092623672SSriram Dash case SVR_T4080: 4192623672SSriram Dash return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0); 4292623672SSriram Dash #endif 4392623672SSriram Dash } 4492623672SSriram Dash 4592623672SSriram Dash return false; 4692623672SSriram Dash } 4792623672SSriram Dash 4892623672SSriram Dash bool has_erratum_a006261(void) 4992623672SSriram Dash { 5092623672SSriram Dash u32 svr = get_svr(); 5192623672SSriram Dash u32 soc = SVR_SOC_VER(svr); 5292623672SSriram Dash 5392623672SSriram Dash switch (soc) { 5492623672SSriram Dash #ifdef CONFIG_PPC 5592623672SSriram Dash case SVR_P1010: 5692623672SSriram Dash return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0); 5792623672SSriram Dash case SVR_P2041: 5892623672SSriram Dash case SVR_P2040: 5992623672SSriram Dash return IS_SVR_REV(svr, 1, 0) || 60f413d1caSSriram Dash IS_SVR_REV(svr, 1, 1) || 61f413d1caSSriram Dash IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 2, 1); 6292623672SSriram Dash case SVR_P3041: 6392623672SSriram Dash return IS_SVR_REV(svr, 1, 0) || 6492623672SSriram Dash IS_SVR_REV(svr, 1, 1) || 6592623672SSriram Dash IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 2, 1); 6692623672SSriram Dash case SVR_P5010: 6792623672SSriram Dash case SVR_P5020: 6892623672SSriram Dash case SVR_P5021: 6992623672SSriram Dash return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0); 7092623672SSriram Dash case SVR_T4240: 7192623672SSriram Dash return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0); 7292623672SSriram Dash case SVR_P5040: 73f413d1caSSriram Dash return IS_SVR_REV(svr, 1, 0) || 74f413d1caSSriram Dash IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 2, 1); 7592623672SSriram Dash #endif 7692623672SSriram Dash } 7792623672SSriram Dash 7892623672SSriram Dash return false; 7992623672SSriram Dash } 8092623672SSriram Dash 8192623672SSriram Dash bool has_erratum_a007075(void) 8292623672SSriram Dash { 8392623672SSriram Dash u32 svr = get_svr(); 8492623672SSriram Dash u32 soc = SVR_SOC_VER(svr); 8592623672SSriram Dash 8692623672SSriram Dash switch (soc) { 8792623672SSriram Dash #ifdef CONFIG_PPC 8892623672SSriram Dash case SVR_B4860: 8992623672SSriram Dash case SVR_B4420: 9092623672SSriram Dash return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0); 9192623672SSriram Dash case SVR_P1010: 9292623672SSriram Dash return IS_SVR_REV(svr, 1, 0); 9392623672SSriram Dash case SVR_P4080: 9492623672SSriram Dash return IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 3, 0); 9592623672SSriram Dash #endif 9692623672SSriram Dash } 9792623672SSriram Dash return false; 9892623672SSriram Dash } 9992623672SSriram Dash 10092623672SSriram Dash bool has_erratum_a007798(void) 10192623672SSriram Dash { 10292623672SSriram Dash #ifdef CONFIG_PPC 10392623672SSriram Dash return SVR_SOC_VER(get_svr()) == SVR_T4240 && 10492623672SSriram Dash IS_SVR_REV(get_svr(), 2, 0); 10592623672SSriram Dash #endif 10692623672SSriram Dash return false; 10792623672SSriram Dash } 10892623672SSriram Dash 10992623672SSriram Dash bool has_erratum_a007792(void) 11092623672SSriram Dash { 11192623672SSriram Dash u32 svr = get_svr(); 11292623672SSriram Dash u32 soc = SVR_SOC_VER(svr); 11392623672SSriram Dash 11492623672SSriram Dash switch (soc) { 11592623672SSriram Dash #ifdef CONFIG_PPC 11692623672SSriram Dash case SVR_T4240: 11792623672SSriram Dash case SVR_T4160: 11892623672SSriram Dash case SVR_T4080: 11992623672SSriram Dash return IS_SVR_REV(svr, 2, 0); 12092623672SSriram Dash case SVR_T1024: 12192623672SSriram Dash case SVR_T1023: 12292623672SSriram Dash return IS_SVR_REV(svr, 1, 0); 12392623672SSriram Dash case SVR_T1040: 12492623672SSriram Dash case SVR_T1042: 12592623672SSriram Dash case SVR_T1020: 12692623672SSriram Dash case SVR_T1022: 12792623672SSriram Dash case SVR_T2080: 12892623672SSriram Dash case SVR_T2081: 12992623672SSriram Dash return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1); 13092623672SSriram Dash #endif 13192623672SSriram Dash } 13292623672SSriram Dash return false; 13392623672SSriram Dash } 13492623672SSriram Dash 13592623672SSriram Dash bool has_erratum_a005697(void) 13692623672SSriram Dash { 13792623672SSriram Dash u32 svr = get_svr(); 13892623672SSriram Dash u32 soc = SVR_SOC_VER(svr); 13992623672SSriram Dash 14092623672SSriram Dash switch (soc) { 14192623672SSriram Dash #ifdef CONFIG_PPC 14292623672SSriram Dash case SVR_9131: 14392623672SSriram Dash case SVR_9132: 14492623672SSriram Dash return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1); 14592623672SSriram Dash #endif 1468545c541Sjerry.huang@nxp.com #ifdef ONFIG_ARM64 1478545c541Sjerry.huang@nxp.com case SVR_LS1012A: 1488545c541Sjerry.huang@nxp.com return IS_SVR_REV(svr, 1, 0); 1498545c541Sjerry.huang@nxp.com #endif 15092623672SSriram Dash } 15192623672SSriram Dash return false; 15292623672SSriram Dash } 15392623672SSriram Dash 15492623672SSriram Dash bool has_erratum_a004477(void) 15592623672SSriram Dash { 15692623672SSriram Dash u32 svr = get_svr(); 15792623672SSriram Dash u32 soc = SVR_SOC_VER(svr); 15892623672SSriram Dash 15992623672SSriram Dash switch (soc) { 16092623672SSriram Dash #ifdef CONFIG_PPC 16192623672SSriram Dash case SVR_P1010: 16292623672SSriram Dash return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0); 16392623672SSriram Dash case SVR_P1022: 16492623672SSriram Dash case SVR_9131: 16592623672SSriram Dash case SVR_9132: 16692623672SSriram Dash return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1); 16792623672SSriram Dash case SVR_P2020: 16892623672SSriram Dash return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0) || 16992623672SSriram Dash IS_SVR_REV(svr, 2, 1); 17092623672SSriram Dash case SVR_B4860: 17192623672SSriram Dash case SVR_B4420: 17292623672SSriram Dash return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0); 17392623672SSriram Dash case SVR_P4080: 17492623672SSriram Dash return IS_SVR_REV(svr, 2, 0) || IS_SVR_REV(svr, 3, 0); 17592623672SSriram Dash #endif 17692623672SSriram Dash } 17792623672SSriram Dash 17892623672SSriram Dash return false; 17992623672SSriram Dash } 18092623672SSriram Dash 181ef53b8c4SSriram Dash bool has_erratum_a008751(void) 182ef53b8c4SSriram Dash { 183ef53b8c4SSriram Dash u32 svr = get_svr(); 184ef53b8c4SSriram Dash u32 soc = SVR_SOC_VER(svr); 185ef53b8c4SSriram Dash 186ef53b8c4SSriram Dash switch (soc) { 187ef53b8c4SSriram Dash #ifdef CONFIG_ARM64 18849cdce16SPrabhakar Kushwaha case SVR_LS2080A: 18949cdce16SPrabhakar Kushwaha case SVR_LS2085A: 190ef53b8c4SSriram Dash return IS_SVR_REV(svr, 1, 0); 191ef53b8c4SSriram Dash #endif 192ef53b8c4SSriram Dash } 193ef53b8c4SSriram Dash return false; 194ef53b8c4SSriram Dash } 195ef53b8c4SSriram Dash 1964c043712SSriram Dash bool has_erratum_a010151(void) 1974c043712SSriram Dash { 1984c043712SSriram Dash u32 svr = get_svr(); 1994c043712SSriram Dash u32 soc = SVR_SOC_VER(svr); 2004c043712SSriram Dash 2014c043712SSriram Dash switch (soc) { 2024c043712SSriram Dash #ifdef CONFIG_ARM64 2034c043712SSriram Dash case SVR_LS2080A: 2044c043712SSriram Dash case SVR_LS2085A: 2054c043712SSriram Dash case SVR_LS1046A: 2064c043712SSriram Dash case SVR_LS1012A: 2074c043712SSriram Dash return IS_SVR_REV(svr, 1, 0); 2084c043712SSriram Dash case SVR_LS1043A: 2094c043712SSriram Dash return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1); 2104c043712SSriram Dash #endif 21173fb5838SYork Sun #ifdef CONFIG_ARCH_LS1021A 2124c043712SSriram Dash case SOC_VER_LS1020: 2134c043712SSriram Dash case SOC_VER_LS1021: 2144c043712SSriram Dash case SOC_VER_LS1022: 2154c043712SSriram Dash case SOC_VER_SLS1020: 2164c043712SSriram Dash return IS_SVR_REV(svr, 2, 0); 2174c043712SSriram Dash #endif 2184c043712SSriram Dash } 2194c043712SSriram Dash return false; 2204c043712SSriram Dash } 2214c043712SSriram Dash 22292623672SSriram Dash #endif 223