blob: f20e8b0b556cb9ca94d8cf43a6638868c0a780b8 [file] [log] [blame]
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001/*
2 * Copyright (c) 2015-2018, Renesas Electronics Corporation. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <stdint.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +00008
9#include <common/debug.h>
10#include <lib/mmio.h>
11
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020012#include "rcar_def.h"
13#if RCAR_LSI == RCAR_AUTO
14#include "H3/pfc_init_h3_v1.h"
15#include "H3/pfc_init_h3_v2.h"
16#include "M3/pfc_init_m3.h"
17#include "M3N/pfc_init_m3n.h"
18#endif
19#if (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N) /* H3 */
20#include "H3/pfc_init_h3_v1.h"
21#include "H3/pfc_init_h3_v2.h"
22#endif
23#if RCAR_LSI == RCAR_M3 /* M3 */
24#include "M3/pfc_init_m3.h"
25#endif
26#if RCAR_LSI == RCAR_M3N /* M3N */
27#include "M3N/pfc_init_m3n.h"
28#endif
29#if RCAR_LSI == RCAR_E3 /* E3 */
30#include "E3/pfc_init_e3.h"
31#endif
32
33 /* Product Register */
34#define PRR (0xFFF00044U)
35#define PRR_PRODUCT_MASK (0x00007F00U)
36#define PRR_CUT_MASK (0x000000FFU)
37#define PRR_PRODUCT_H3 (0x00004F00U) /* R-Car H3 */
38#define PRR_PRODUCT_M3 (0x00005200U) /* R-Car M3 */
39#define PRR_PRODUCT_M3N (0x00005500U) /* R-Car M3N */
40#define PRR_PRODUCT_E3 (0x00005700U) /* R-Car E3 */
41#define PRR_PRODUCT_10 (0x00U)
42#define PRR_PRODUCT_11 (0x01U)
43#define PRR_PRODUCT_20 (0x10U)
44
45#define PRR_PRODUCT_ERR(reg) do{\
46 ERROR("LSI Product ID(PRR=0x%x) PFC "\
47 "initialize not supported.\n",reg);\
48 panic();\
49 }while(0)
50#define PRR_CUT_ERR(reg) do{\
51 ERROR("LSI Cut ID(PRR=0x%x) PFC "\
52 "initialize not supported.\n",reg);\
53 panic();\
54 }while(0)
55
56void rcar_pfc_init(void)
57{
58 uint32_t reg;
59
60 reg = mmio_read_32(RCAR_PRR);
61#if RCAR_LSI == RCAR_AUTO
62 switch (reg & RCAR_PRODUCT_MASK) {
63 case RCAR_PRODUCT_H3:
64 switch (reg & PRR_CUT_MASK) {
65 case PRR_PRODUCT_10: /* H3 Ver.1.0 */
66 pfc_init_h3_v1();
67 break;
68 case PRR_PRODUCT_11: /* H3 Ver.1.1 */
69 pfc_init_h3_v1();
70 break;
71 default: /* H3 Ver.2.0 or later */
72 pfc_init_h3_v2();
73 break;
74 }
75 break;
76 case RCAR_PRODUCT_M3:
77 pfc_init_m3();
78 break;
79 case RCAR_PRODUCT_M3N:
80 pfc_init_m3n();
81 break;
82 default:
83 PRR_PRODUCT_ERR(reg);
84 break;
85 }
86
87#elif RCAR_LSI_CUT_COMPAT
88 switch (reg & PRR_PRODUCT_MASK) {
89 case PRR_PRODUCT_H3:
90#if (RCAR_LSI != RCAR_H3) && (RCAR_LSI != RCAR_H3N)
91 PRR_PRODUCT_ERR(reg);
92#else
93 switch (reg & PRR_CUT_MASK) {
94 case PRR_PRODUCT_10: /* H3 Ver.1.0 */
95 pfc_init_h3_v1();
96 break;
97 case PRR_PRODUCT_11: /* H3 Ver.1.1 */
98 pfc_init_h3_v1();
99 break;
100 default: /* H3 Ver.2.0 or later */
101 pfc_init_h3_v2();
102 break;
103 }
104#endif
105 break;
106 case PRR_PRODUCT_M3:
107#if RCAR_LSI != RCAR_M3
108 PRR_PRODUCT_ERR(reg);
109#else
110 pfc_init_m3();
111#endif
112 break;
113 case PRR_PRODUCT_M3N:
114#if RCAR_LSI != RCAR_M3N
115 PRR_PRODUCT_ERR(reg);
116#else
117 pfc_init_m3n();
118#endif
119 break;
120 case PRR_PRODUCT_E3:
121#if RCAR_LSI != RCAR_E3
122 PRR_PRODUCT_ERR(reg);
123#else
124 pfc_init_e3();
125#endif
126 break;
127 default:
128 PRR_PRODUCT_ERR(reg);
129 break;
130 }
131
132#else
133#if (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N) /* H3 */
134#if RCAR_LSI_CUT == RCAR_CUT_10
135 /* H3 Ver.1.0 */
136 if ((PRR_PRODUCT_H3 | PRR_PRODUCT_10)
137 != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
138 PRR_PRODUCT_ERR(reg);
139 }
140 pfc_init_h3_v1();
141#elif RCAR_LSI_CUT == RCAR_CUT_11
142 /* H3 Ver.1.1 */
143 if ((PRR_PRODUCT_H3 | PRR_PRODUCT_11)
144 != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
145 PRR_PRODUCT_ERR(reg);
146 }
147 pfc_init_h3_v1();
148#else
149 /* H3 Ver.2.0 or later */
150 if (PRR_PRODUCT_H3 != (reg & PRR_PRODUCT_MASK)) {
151 PRR_PRODUCT_ERR(reg);
152 }
153 pfc_init_h3_v2();
154#endif
155#elif RCAR_LSI == RCAR_M3 /* M3 */
156 if ((PRR_PRODUCT_M3) != (reg & PRR_PRODUCT_MASK)) {
157 PRR_PRODUCT_ERR(reg);
158 }
159 pfc_init_m3();
160#elif RCAR_LSI == RCAR_M3N /* M3N */
161 if ((PRR_PRODUCT_M3N) != (reg & PRR_PRODUCT_MASK)) {
162 PRR_PRODUCT_ERR(reg);
163 }
164 pfc_init_m3n();
165#elif RCAR_LSI == RCAR_E3 /* E3 */
166 if ((PRR_PRODUCT_E3) != (reg & PRR_PRODUCT_MASK)) {
167 PRR_PRODUCT_ERR(reg);
168 }
169 pfc_init_e3();
170#else
171#error "Don't have PFC initialize routine(unknown)."
172#endif
173#endif
174}