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>
12457e51cfSSimon Glass #if defined(CONFIG_FSL_LSCH2) || defined(CONFIG_FSL_LSCH3) || \
13457e51cfSSimon 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)
has_dual_phy(void)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
has_erratum_a006261(void)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
has_erratum_a007075(void)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
has_erratum_a007798(void)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
has_erratum_a007792(void)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
has_erratum_a005697(void)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
has_erratum_a004477(void)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
has_erratum_a008751(void)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
has_erratum_a010151(void)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
201*739cab17SWenbin song #ifdef CONFIG_ARM64
202*739cab17SWenbin song if (IS_SVR_DEV(svr, SVR_DEV(SVR_LS1043A)))
203*739cab17SWenbin song return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1);
204*739cab17SWenbin song #endif
205*739cab17SWenbin song
2064c043712SSriram Dash switch (soc) {
2074c043712SSriram Dash #ifdef CONFIG_ARM64
2084c043712SSriram Dash case SVR_LS2080A:
2094c043712SSriram Dash case SVR_LS2085A:
210e4783079SSantan Kumar /* fallthrough */
211e4783079SSantan Kumar case SVR_LS2088A:
212e4783079SSantan Kumar /* fallthrough */
213e4783079SSantan Kumar case SVR_LS2081A:
2144c043712SSriram Dash case SVR_LS1046A:
2154c043712SSriram Dash case SVR_LS1012A:
2164c043712SSriram Dash return IS_SVR_REV(svr, 1, 0);
2174c043712SSriram Dash #endif
21873fb5838SYork Sun #ifdef CONFIG_ARCH_LS1021A
2194c043712SSriram Dash case SOC_VER_LS1020:
2204c043712SSriram Dash case SOC_VER_LS1021:
2214c043712SSriram Dash case SOC_VER_LS1022:
2224c043712SSriram Dash case SOC_VER_SLS1020:
2234c043712SSriram Dash return IS_SVR_REV(svr, 2, 0);
2244c043712SSriram Dash #endif
2254c043712SSriram Dash }
2264c043712SSriram Dash return false;
2274c043712SSriram Dash }
2284c043712SSriram Dash
22992623672SSriram Dash #endif
230