1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * board/renesas/blanche/blanche.c
3*4882a593Smuzhiyun * This file is blanche board support.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2016 Renesas Electronics Corporation
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0
8*4882a593Smuzhiyun */
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include <common.h>
11*4882a593Smuzhiyun #include <malloc.h>
12*4882a593Smuzhiyun #include <netdev.h>
13*4882a593Smuzhiyun #include <dm.h>
14*4882a593Smuzhiyun #include <dm/platform_data/serial_sh.h>
15*4882a593Smuzhiyun #include <asm/processor.h>
16*4882a593Smuzhiyun #include <asm/mach-types.h>
17*4882a593Smuzhiyun #include <asm/io.h>
18*4882a593Smuzhiyun #include <linux/errno.h>
19*4882a593Smuzhiyun #include <asm/arch/sys_proto.h>
20*4882a593Smuzhiyun #include <asm/gpio.h>
21*4882a593Smuzhiyun #include <asm/arch/rmobile.h>
22*4882a593Smuzhiyun #include <asm/arch/rcar-mstp.h>
23*4882a593Smuzhiyun #include <asm/arch/mmc.h>
24*4882a593Smuzhiyun #include <asm/arch/sh_sdhi.h>
25*4882a593Smuzhiyun #include <miiphy.h>
26*4882a593Smuzhiyun #include <i2c.h>
27*4882a593Smuzhiyun #include <mmc.h>
28*4882a593Smuzhiyun #include "qos.h"
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun struct pin_db {
33*4882a593Smuzhiyun u32 addr; /* register address */
34*4882a593Smuzhiyun u32 mask; /* mask value */
35*4882a593Smuzhiyun u32 val; /* setting value */
36*4882a593Smuzhiyun };
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun #define PMMR 0xE6060000
39*4882a593Smuzhiyun #define GPSR0 0xE6060004
40*4882a593Smuzhiyun #define GPSR1 0xE6060008
41*4882a593Smuzhiyun #define GPSR4 0xE6060014
42*4882a593Smuzhiyun #define GPSR5 0xE6060018
43*4882a593Smuzhiyun #define GPSR6 0xE606001C
44*4882a593Smuzhiyun #define GPSR7 0xE6060020
45*4882a593Smuzhiyun #define GPSR8 0xE6060024
46*4882a593Smuzhiyun #define GPSR9 0xE6060028
47*4882a593Smuzhiyun #define GPSR10 0xE606002C
48*4882a593Smuzhiyun #define GPSR11 0xE6060030
49*4882a593Smuzhiyun #define IPSR6 0xE6060058
50*4882a593Smuzhiyun #define PUPR2 0xE6060108
51*4882a593Smuzhiyun #define PUPR3 0xE606010C
52*4882a593Smuzhiyun #define PUPR4 0xE6060110
53*4882a593Smuzhiyun #define PUPR5 0xE6060114
54*4882a593Smuzhiyun #define PUPR7 0xE606011C
55*4882a593Smuzhiyun #define PUPR9 0xE6060124
56*4882a593Smuzhiyun #define PUPR10 0xE6060128
57*4882a593Smuzhiyun #define PUPR11 0xE606012C
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun #define CPG_PLL1CR 0xE6150028
60*4882a593Smuzhiyun #define CPG_PLL3CR 0xE61500DC
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun #define SetREG(x) \
63*4882a593Smuzhiyun writel((readl((x)->addr) & ~((x)->mask)) | ((x)->val), (x)->addr)
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun #define SetGuardREG(x) \
66*4882a593Smuzhiyun { \
67*4882a593Smuzhiyun u32 val; \
68*4882a593Smuzhiyun val = (readl((x)->addr) & ~((x)->mask)) | ((x)->val); \
69*4882a593Smuzhiyun writel(~val, PMMR); \
70*4882a593Smuzhiyun writel(val, (x)->addr); \
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun struct pin_db pin_guard[] = {
74*4882a593Smuzhiyun { GPSR0, 0xFFFFFFFF, 0x0BFFFFFF },
75*4882a593Smuzhiyun { GPSR1, 0xFFFFFFFF, 0x002FFFFF },
76*4882a593Smuzhiyun { GPSR4, 0xFFFFFFFF, 0x00000FFF },
77*4882a593Smuzhiyun { GPSR5, 0xFFFFFFFF, 0x00010FFF },
78*4882a593Smuzhiyun { GPSR6, 0xFFFFFFFF, 0x00010FFF },
79*4882a593Smuzhiyun { GPSR7, 0xFFFFFFFF, 0x00010FFF },
80*4882a593Smuzhiyun { GPSR8, 0xFFFFFFFF, 0x00010FFF },
81*4882a593Smuzhiyun { GPSR9, 0xFFFFFFFF, 0x00010FFF },
82*4882a593Smuzhiyun { GPSR10, 0xFFFFFFFF, 0x04006000 },
83*4882a593Smuzhiyun { GPSR11, 0xFFFFFFFF, 0x303FEFE0 },
84*4882a593Smuzhiyun { IPSR6, 0xFFFFFFFF, 0x0002000E },
85*4882a593Smuzhiyun };
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun struct pin_db pin_tbl[] = {
88*4882a593Smuzhiyun { PUPR2, 0xFFFFFFFF, 0x00000000 },
89*4882a593Smuzhiyun { PUPR3, 0xFFFFFFFF, 0x0803FF40 },
90*4882a593Smuzhiyun { PUPR4, 0xFFFFFFFF, 0x0000FFFF },
91*4882a593Smuzhiyun { PUPR5, 0xFFFFFFFF, 0x00010FFF },
92*4882a593Smuzhiyun { PUPR7, 0xFFFFFFFF, 0x0001AFFF },
93*4882a593Smuzhiyun { PUPR9, 0xFFFFFFFF, 0x0001CFFF },
94*4882a593Smuzhiyun { PUPR10, 0xFFFFFFFF, 0xC0438001 },
95*4882a593Smuzhiyun { PUPR11, 0xFFFFFFFF, 0x0FC00007 },
96*4882a593Smuzhiyun };
97*4882a593Smuzhiyun
pin_init(void)98*4882a593Smuzhiyun void pin_init(void)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun struct pin_db *db;
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun for (db = pin_guard; db < &pin_guard[sizeof(pin_guard)/sizeof(struct pin_db)]; db++) {
103*4882a593Smuzhiyun SetGuardREG(db);
104*4882a593Smuzhiyun }
105*4882a593Smuzhiyun for (db = pin_tbl; db < &pin_tbl[sizeof(pin_tbl) /sizeof(struct pin_db)]; db++) {
106*4882a593Smuzhiyun SetREG(db);
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun #define s_init_wait(cnt) \
111*4882a593Smuzhiyun ({ \
112*4882a593Smuzhiyun volatile u32 i = 0x10000 * cnt; \
113*4882a593Smuzhiyun while (i > 0) \
114*4882a593Smuzhiyun i--; \
115*4882a593Smuzhiyun })
116*4882a593Smuzhiyun
s_init(void)117*4882a593Smuzhiyun void s_init(void)
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun struct rcar_rwdt *rwdt = (struct rcar_rwdt *)RWDT_BASE;
120*4882a593Smuzhiyun struct rcar_swdt *swdt = (struct rcar_swdt *)SWDT_BASE;
121*4882a593Smuzhiyun u32 cpu_type;
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun cpu_type = rmobile_get_cpu_type();
124*4882a593Smuzhiyun if (cpu_type == 0x4A) {
125*4882a593Smuzhiyun writel(0x4D000000, CPG_PLL1CR);
126*4882a593Smuzhiyun writel(0x4F000000, CPG_PLL3CR);
127*4882a593Smuzhiyun }
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun /* Watchdog init */
130*4882a593Smuzhiyun writel(0xA5A5A500, &rwdt->rwtcsra);
131*4882a593Smuzhiyun writel(0xA5A5A500, &swdt->swtcsra);
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun /* QoS(Quality-of-Service) Init */
134*4882a593Smuzhiyun qos_init();
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun /* SCIF Init */
137*4882a593Smuzhiyun pin_init();
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun #if defined(CONFIG_MTD_NOR_FLASH)
140*4882a593Smuzhiyun struct rcar_lbsc *lbsc = (struct rcar_lbsc *)LBSC_BASE;
141*4882a593Smuzhiyun struct rcar_dbsc3 *dbsc3_0 = (struct rcar_dbsc3 *)DBSC3_0_BASE;
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun /* LBSC */
144*4882a593Smuzhiyun writel(0x00000020, &lbsc->cs0ctrl);
145*4882a593Smuzhiyun writel(0x00000020, &lbsc->cs1ctrl);
146*4882a593Smuzhiyun writel(0x00002020, &lbsc->ecs0ctrl);
147*4882a593Smuzhiyun writel(0x00002020, &lbsc->ecs1ctrl);
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun writel(0x2A103320, &lbsc->cswcr0);
150*4882a593Smuzhiyun writel(0x2A103320, &lbsc->cswcr1);
151*4882a593Smuzhiyun writel(0x19102110, &lbsc->ecswcr0);
152*4882a593Smuzhiyun writel(0x19102110, &lbsc->ecswcr1);
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun /* DBSC3 */
155*4882a593Smuzhiyun s_init_wait(10);
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun writel(0x0000A55A, &dbsc3_0->dbpdlck);
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun writel(0x21000000, &dbsc3_0->dbcmd); /* opc=RstH (RESET => H) */
160*4882a593Smuzhiyun writel(0x11000000, &dbsc3_0->dbcmd); /* opc=PDXt(CKE=H) */
161*4882a593Smuzhiyun writel(0x10000000, &dbsc3_0->dbcmd); /* opc=PDEn(CKE=L) */
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun /* Stop Auto-Calibration */
164*4882a593Smuzhiyun writel(0x00000001, &dbsc3_0->dbpdrga);
165*4882a593Smuzhiyun writel(0x80000000, &dbsc3_0->dbpdrgd);
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun writel(0x00000004, &dbsc3_0->dbpdrga);
168*4882a593Smuzhiyun while ((readl(&dbsc3_0->dbpdrgd) & 0x00000001) != 0x00000001);
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun /* PLLCR: PLL Control Register */
171*4882a593Smuzhiyun writel(0x00000006, &dbsc3_0->dbpdrga);
172*4882a593Smuzhiyun writel(0x0001C000, &dbsc3_0->dbpdrgd); // > DDR1440
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun /* DXCCR: DATX8 Common Configuration Register */
175*4882a593Smuzhiyun writel(0x0000000F, &dbsc3_0->dbpdrga);
176*4882a593Smuzhiyun writel(0x00181EE4, &dbsc3_0->dbpdrgd);
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun /* DSGCR :DDR System General Configuration Register */
179*4882a593Smuzhiyun writel(0x00000010, &dbsc3_0->dbpdrga);
180*4882a593Smuzhiyun writel(0xF00464DB, &dbsc3_0->dbpdrgd);
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun writel(0x00000061, &dbsc3_0->dbpdrga);
183*4882a593Smuzhiyun writel(0x0000008D, &dbsc3_0->dbpdrgd);
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun /* Re-Execute ZQ calibration */
186*4882a593Smuzhiyun writel(0x00000001, &dbsc3_0->dbpdrga);
187*4882a593Smuzhiyun writel(0x00000073, &dbsc3_0->dbpdrgd);
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun writel(0x00000007, &dbsc3_0->dbkind);
190*4882a593Smuzhiyun writel(0x0F030A02, &dbsc3_0->dbconf0);
191*4882a593Smuzhiyun writel(0x00000001, &dbsc3_0->dbphytype);
192*4882a593Smuzhiyun writel(0x00000000, &dbsc3_0->dbbl);
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun writel(0x0000000B, &dbsc3_0->dbtr0); // tCL=11
195*4882a593Smuzhiyun writel(0x00000008, &dbsc3_0->dbtr1); // tCWL=8
196*4882a593Smuzhiyun writel(0x00000000, &dbsc3_0->dbtr2); // tAL=0
197*4882a593Smuzhiyun writel(0x0000000B, &dbsc3_0->dbtr3); // tRCD=11
198*4882a593Smuzhiyun writel(0x000C000B, &dbsc3_0->dbtr4); // tRPA=12,tRP=11
199*4882a593Smuzhiyun writel(0x00000027, &dbsc3_0->dbtr5); // tRC = 39
200*4882a593Smuzhiyun writel(0x0000001C, &dbsc3_0->dbtr6); // tRAS = 28
201*4882a593Smuzhiyun writel(0x00000006, &dbsc3_0->dbtr7); // tRRD = 6
202*4882a593Smuzhiyun writel(0x00000020, &dbsc3_0->dbtr8); // tRFAW = 32
203*4882a593Smuzhiyun writel(0x00000008, &dbsc3_0->dbtr9); // tRDPR = 8
204*4882a593Smuzhiyun writel(0x0000000C, &dbsc3_0->dbtr10); // tWR = 12
205*4882a593Smuzhiyun writel(0x00000009, &dbsc3_0->dbtr11); // tRDWR = 9
206*4882a593Smuzhiyun writel(0x00000012, &dbsc3_0->dbtr12); // tWRRD = 18
207*4882a593Smuzhiyun writel(0x000000D0, &dbsc3_0->dbtr13); // tRFC = 208
208*4882a593Smuzhiyun writel(0x00140005, &dbsc3_0->dbtr14);
209*4882a593Smuzhiyun writel(0x00050004, &dbsc3_0->dbtr15);
210*4882a593Smuzhiyun writel(0x70233005, &dbsc3_0->dbtr16); /* DQL = 35, WDQL = 5 */
211*4882a593Smuzhiyun writel(0x000C0000, &dbsc3_0->dbtr17);
212*4882a593Smuzhiyun writel(0x00000300, &dbsc3_0->dbtr18);
213*4882a593Smuzhiyun writel(0x00000040, &dbsc3_0->dbtr19);
214*4882a593Smuzhiyun writel(0x00000001, &dbsc3_0->dbrnk0);
215*4882a593Smuzhiyun writel(0x00020001, &dbsc3_0->dbadj0);
216*4882a593Smuzhiyun writel(0x20082004, &dbsc3_0->dbadj2); /* blanche QoS rev0.1 */
217*4882a593Smuzhiyun writel(0x00020002, &dbsc3_0->dbwt0cnf0); /* 1600 */
218*4882a593Smuzhiyun writel(0x0000001F, &dbsc3_0->dbwt0cnf4);
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun while ((readl(&dbsc3_0->dbdfistat) & 0x00000001) != 0x00000001);
221*4882a593Smuzhiyun writel(0x00000011, &dbsc3_0->dbdficnt);
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun /* PGCR1 :PHY General Configuration Register 1 */
224*4882a593Smuzhiyun writel(0x00000003, &dbsc3_0->dbpdrga);
225*4882a593Smuzhiyun writel(0x0300C4E1, &dbsc3_0->dbpdrgd); /* DDR3 */
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun /* PGCR2: PHY General Configuration Registers 2 */
228*4882a593Smuzhiyun writel(0x00000023, &dbsc3_0->dbpdrga);
229*4882a593Smuzhiyun writel(0x00FCDB60, &dbsc3_0->dbpdrgd);
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun writel(0x00000011, &dbsc3_0->dbpdrga);
232*4882a593Smuzhiyun writel(0x1000040B, &dbsc3_0->dbpdrgd);
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun /* DTPR0 :DRAM Timing Parameters Register 0 */
235*4882a593Smuzhiyun writel(0x00000012, &dbsc3_0->dbpdrga);
236*4882a593Smuzhiyun writel(0x9D9CBB66, &dbsc3_0->dbpdrgd);
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun /* DTPR1 :DRAM Timing Parameters Register 1 */
239*4882a593Smuzhiyun writel(0x00000013, &dbsc3_0->dbpdrga);
240*4882a593Smuzhiyun writel(0x1A868400, &dbsc3_0->dbpdrgd);
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun /* DTPR2 ::DRAM Timing Parameters Register 2 */
243*4882a593Smuzhiyun writel(0x00000014, &dbsc3_0->dbpdrga);
244*4882a593Smuzhiyun writel(0x300214D8, &dbsc3_0->dbpdrgd);
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun /* MR0 :Mode Register 0 */
247*4882a593Smuzhiyun writel(0x00000015, &dbsc3_0->dbpdrga);
248*4882a593Smuzhiyun writel(0x00000D70, &dbsc3_0->dbpdrgd);
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun /* MR1 :Mode Register 1 */
251*4882a593Smuzhiyun writel(0x00000016, &dbsc3_0->dbpdrga);
252*4882a593Smuzhiyun writel(0x00000004, &dbsc3_0->dbpdrgd); /* DRAM Drv 40ohm */
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun /* MR2 :Mode Register 2 */
255*4882a593Smuzhiyun writel(0x00000017, &dbsc3_0->dbpdrga);
256*4882a593Smuzhiyun writel(0x00000018, &dbsc3_0->dbpdrgd); /* CWL=8 */
257*4882a593Smuzhiyun
258*4882a593Smuzhiyun /* VREF(ZQCAL) */
259*4882a593Smuzhiyun writel(0x0000001A, &dbsc3_0->dbpdrga);
260*4882a593Smuzhiyun writel(0x910035C7, &dbsc3_0->dbpdrgd);
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun /* PGSR0 :PHY General Status Registers 0 */
263*4882a593Smuzhiyun writel(0x00000004, &dbsc3_0->dbpdrga);
264*4882a593Smuzhiyun while ((readl(&dbsc3_0->dbpdrgd) & 0x00000001) != 0x00000001);
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun /* DRAM Init (set MRx etc) */
267*4882a593Smuzhiyun writel(0x00000001, &dbsc3_0->dbpdrga);
268*4882a593Smuzhiyun writel(0x00000181, &dbsc3_0->dbpdrgd);
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun /* CKE = H */
271*4882a593Smuzhiyun writel(0x11000000, &dbsc3_0->dbcmd); /* opc=PDXt(CKE=H) */
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun /* PGSR0 :PHY General Status Registers 0 */
274*4882a593Smuzhiyun writel(0x00000004, &dbsc3_0->dbpdrga);
275*4882a593Smuzhiyun while ((readl(&dbsc3_0->dbpdrgd) & 0x00000001) != 0x00000001);
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun /* RAM ACC Training */
278*4882a593Smuzhiyun writel(0x00000001, &dbsc3_0->dbpdrga);
279*4882a593Smuzhiyun writel(0x0000FE01, &dbsc3_0->dbpdrgd);
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun /* Bus control 0 */
282*4882a593Smuzhiyun writel(0x00000000, &dbsc3_0->dbbs0cnt1);
283*4882a593Smuzhiyun /* DDR3 Calibration set */
284*4882a593Smuzhiyun writel(0x01004C20, &dbsc3_0->dbcalcnf);
285*4882a593Smuzhiyun /* DDR3 Calibration timing */
286*4882a593Smuzhiyun writel(0x014000AA, &dbsc3_0->dbcaltr);
287*4882a593Smuzhiyun /* Refresh */
288*4882a593Smuzhiyun writel(0x00000140, &dbsc3_0->dbrfcnf0);
289*4882a593Smuzhiyun writel(0x00081860, &dbsc3_0->dbrfcnf1);
290*4882a593Smuzhiyun writel(0x00010000, &dbsc3_0->dbrfcnf2);
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun /* PGSR0 :PHY General Status Registers 0 */
293*4882a593Smuzhiyun writel(0x00000004, &dbsc3_0->dbpdrga);
294*4882a593Smuzhiyun while ((readl(&dbsc3_0->dbpdrgd) & 0x00000001) != 0x00000001);
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun /* Enable Auto-Refresh */
297*4882a593Smuzhiyun writel(0x00000001, &dbsc3_0->dbrfen);
298*4882a593Smuzhiyun /* Permit DDR-Access */
299*4882a593Smuzhiyun writel(0x00000001, &dbsc3_0->dbacen);
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun /* This locks the access to the PHY unit registers */
302*4882a593Smuzhiyun writel(0x00000000, &dbsc3_0->dbpdlck);
303*4882a593Smuzhiyun #endif /* CONFIG_MTD_NOR_FLASH */
304*4882a593Smuzhiyun
305*4882a593Smuzhiyun }
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun #define TMU0_MSTP125 (1 << 25)
308*4882a593Smuzhiyun #define SCIF0_MSTP721 (1 << 21)
309*4882a593Smuzhiyun #define SDHI0_MSTP314 (1 << 14)
310*4882a593Smuzhiyun #define QSPI_MSTP917 (1 << 17)
311*4882a593Smuzhiyun
board_early_init_f(void)312*4882a593Smuzhiyun int board_early_init_f(void)
313*4882a593Smuzhiyun {
314*4882a593Smuzhiyun /* TMU0 */
315*4882a593Smuzhiyun mstp_clrbits_le32(MSTPSR1, SMSTPCR1, TMU0_MSTP125);
316*4882a593Smuzhiyun /* SCIF0 */
317*4882a593Smuzhiyun mstp_clrbits_le32(MSTPSR7, SMSTPCR7, SCIF0_MSTP721);
318*4882a593Smuzhiyun /* SDHI0 */
319*4882a593Smuzhiyun mstp_clrbits_le32(MSTPSR3, SMSTPCR3, SDHI0_MSTP314);
320*4882a593Smuzhiyun /* QSPI */
321*4882a593Smuzhiyun mstp_clrbits_le32(MSTPSR9, SMSTPCR9, QSPI_MSTP917);
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun return 0;
324*4882a593Smuzhiyun }
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
board_init(void)327*4882a593Smuzhiyun int board_init(void)
328*4882a593Smuzhiyun {
329*4882a593Smuzhiyun /* adress of boot parameters */
330*4882a593Smuzhiyun gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
331*4882a593Smuzhiyun
332*4882a593Smuzhiyun /* Init PFC controller */
333*4882a593Smuzhiyun r8a7792_pinmux_init();
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun gpio_request(GPIO_FN_D0, NULL);
336*4882a593Smuzhiyun gpio_request(GPIO_FN_D1, NULL);
337*4882a593Smuzhiyun gpio_request(GPIO_FN_D2, NULL);
338*4882a593Smuzhiyun gpio_request(GPIO_FN_D3, NULL);
339*4882a593Smuzhiyun gpio_request(GPIO_FN_D4, NULL);
340*4882a593Smuzhiyun gpio_request(GPIO_FN_D5, NULL);
341*4882a593Smuzhiyun gpio_request(GPIO_FN_D6, NULL);
342*4882a593Smuzhiyun gpio_request(GPIO_FN_D7, NULL);
343*4882a593Smuzhiyun gpio_request(GPIO_FN_D8, NULL);
344*4882a593Smuzhiyun gpio_request(GPIO_FN_D9, NULL);
345*4882a593Smuzhiyun gpio_request(GPIO_FN_D10, NULL);
346*4882a593Smuzhiyun gpio_request(GPIO_FN_D11, NULL);
347*4882a593Smuzhiyun gpio_request(GPIO_FN_D12, NULL);
348*4882a593Smuzhiyun gpio_request(GPIO_FN_D13, NULL);
349*4882a593Smuzhiyun gpio_request(GPIO_FN_D14, NULL);
350*4882a593Smuzhiyun gpio_request(GPIO_FN_D15, NULL);
351*4882a593Smuzhiyun gpio_request(GPIO_FN_A0, NULL);
352*4882a593Smuzhiyun gpio_request(GPIO_FN_A1, NULL);
353*4882a593Smuzhiyun gpio_request(GPIO_FN_A2, NULL);
354*4882a593Smuzhiyun gpio_request(GPIO_FN_A3, NULL);
355*4882a593Smuzhiyun gpio_request(GPIO_FN_A4, NULL);
356*4882a593Smuzhiyun gpio_request(GPIO_FN_A5, NULL);
357*4882a593Smuzhiyun gpio_request(GPIO_FN_A6, NULL);
358*4882a593Smuzhiyun gpio_request(GPIO_FN_A7, NULL);
359*4882a593Smuzhiyun gpio_request(GPIO_FN_A8, NULL);
360*4882a593Smuzhiyun gpio_request(GPIO_FN_A9, NULL);
361*4882a593Smuzhiyun gpio_request(GPIO_FN_A10, NULL);
362*4882a593Smuzhiyun gpio_request(GPIO_FN_A11, NULL);
363*4882a593Smuzhiyun gpio_request(GPIO_FN_A12, NULL);
364*4882a593Smuzhiyun gpio_request(GPIO_FN_A13, NULL);
365*4882a593Smuzhiyun gpio_request(GPIO_FN_A14, NULL);
366*4882a593Smuzhiyun gpio_request(GPIO_FN_A15, NULL);
367*4882a593Smuzhiyun gpio_request(GPIO_FN_A16, NULL);
368*4882a593Smuzhiyun gpio_request(GPIO_FN_A17, NULL);
369*4882a593Smuzhiyun gpio_request(GPIO_FN_A18, NULL);
370*4882a593Smuzhiyun gpio_request(GPIO_FN_A19, NULL);
371*4882a593Smuzhiyun #if !defined(CONFIG_MTD_NOR_FLASH)
372*4882a593Smuzhiyun gpio_request(GPIO_FN_MOSI_IO0, NULL);
373*4882a593Smuzhiyun gpio_request(GPIO_FN_MISO_IO1, NULL);
374*4882a593Smuzhiyun gpio_request(GPIO_FN_IO2, NULL);
375*4882a593Smuzhiyun gpio_request(GPIO_FN_IO3, NULL);
376*4882a593Smuzhiyun gpio_request(GPIO_FN_SPCLK, NULL);
377*4882a593Smuzhiyun gpio_request(GPIO_FN_SSL, NULL);
378*4882a593Smuzhiyun #else /* CONFIG_MTD_NOR_FLASH */
379*4882a593Smuzhiyun gpio_request(GPIO_FN_A20, NULL);
380*4882a593Smuzhiyun gpio_request(GPIO_FN_A21, NULL);
381*4882a593Smuzhiyun gpio_request(GPIO_FN_A22, NULL);
382*4882a593Smuzhiyun gpio_request(GPIO_FN_A23, NULL);
383*4882a593Smuzhiyun gpio_request(GPIO_FN_A24, NULL);
384*4882a593Smuzhiyun gpio_request(GPIO_FN_A25, NULL);
385*4882a593Smuzhiyun #endif /* CONFIG_MTD_NOR_FLASH */
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun gpio_request(GPIO_FN_CS1_A26, NULL);
388*4882a593Smuzhiyun gpio_request(GPIO_FN_EX_CS0, NULL);
389*4882a593Smuzhiyun gpio_request(GPIO_FN_EX_CS1, NULL);
390*4882a593Smuzhiyun gpio_request(GPIO_FN_BS, NULL);
391*4882a593Smuzhiyun gpio_request(GPIO_FN_RD, NULL);
392*4882a593Smuzhiyun gpio_request(GPIO_FN_WE0, NULL);
393*4882a593Smuzhiyun gpio_request(GPIO_FN_WE1, NULL);
394*4882a593Smuzhiyun gpio_request(GPIO_FN_EX_WAIT0, NULL);
395*4882a593Smuzhiyun gpio_request(GPIO_FN_IRQ0, NULL);
396*4882a593Smuzhiyun gpio_request(GPIO_FN_IRQ2, NULL);
397*4882a593Smuzhiyun gpio_request(GPIO_FN_IRQ3, NULL);
398*4882a593Smuzhiyun gpio_request(GPIO_FN_CS0, NULL);
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun /* Init timer */
401*4882a593Smuzhiyun timer_init();
402*4882a593Smuzhiyun
403*4882a593Smuzhiyun return 0;
404*4882a593Smuzhiyun }
405*4882a593Smuzhiyun
406*4882a593Smuzhiyun /*
407*4882a593Smuzhiyun Added for BLANCHE(R-CarV2H board)
408*4882a593Smuzhiyun */
board_eth_init(bd_t * bis)409*4882a593Smuzhiyun int board_eth_init(bd_t *bis)
410*4882a593Smuzhiyun {
411*4882a593Smuzhiyun int rc = 0;
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun #ifdef CONFIG_SMC911X
414*4882a593Smuzhiyun #define STR_ENV_ETHADDR "ethaddr"
415*4882a593Smuzhiyun
416*4882a593Smuzhiyun struct eth_device *dev;
417*4882a593Smuzhiyun uchar eth_addr[6];
418*4882a593Smuzhiyun
419*4882a593Smuzhiyun rc = smc911x_initialize(0, CONFIG_SMC911X_BASE);
420*4882a593Smuzhiyun
421*4882a593Smuzhiyun if (!eth_env_get_enetaddr(STR_ENV_ETHADDR, eth_addr)) {
422*4882a593Smuzhiyun dev = eth_get_dev_by_index(0);
423*4882a593Smuzhiyun if (dev) {
424*4882a593Smuzhiyun eth_env_set_enetaddr(STR_ENV_ETHADDR, dev->enetaddr);
425*4882a593Smuzhiyun } else {
426*4882a593Smuzhiyun printf("blanche: Couldn't get eth device\n");
427*4882a593Smuzhiyun rc = -1;
428*4882a593Smuzhiyun }
429*4882a593Smuzhiyun }
430*4882a593Smuzhiyun
431*4882a593Smuzhiyun #endif
432*4882a593Smuzhiyun
433*4882a593Smuzhiyun return rc;
434*4882a593Smuzhiyun }
435*4882a593Smuzhiyun
board_mmc_init(bd_t * bis)436*4882a593Smuzhiyun int board_mmc_init(bd_t *bis)
437*4882a593Smuzhiyun {
438*4882a593Smuzhiyun int ret = -ENODEV;
439*4882a593Smuzhiyun
440*4882a593Smuzhiyun #ifdef CONFIG_SH_SDHI
441*4882a593Smuzhiyun gpio_request(GPIO_FN_SD0_DAT0, NULL);
442*4882a593Smuzhiyun gpio_request(GPIO_FN_SD0_DAT1, NULL);
443*4882a593Smuzhiyun gpio_request(GPIO_FN_SD0_DAT2, NULL);
444*4882a593Smuzhiyun gpio_request(GPIO_FN_SD0_DAT3, NULL);
445*4882a593Smuzhiyun gpio_request(GPIO_FN_SD0_CLK, NULL);
446*4882a593Smuzhiyun gpio_request(GPIO_FN_SD0_CMD, NULL);
447*4882a593Smuzhiyun gpio_request(GPIO_FN_SD0_CD, NULL);
448*4882a593Smuzhiyun
449*4882a593Smuzhiyun gpio_request(GPIO_GP_11_12, NULL);
450*4882a593Smuzhiyun gpio_direction_output(GPIO_GP_11_12, 1); /* power on */
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun ret = sh_sdhi_init(CONFIG_SYS_SH_SDHI0_BASE, 0,
454*4882a593Smuzhiyun SH_SDHI_QUIRK_16BIT_BUF);
455*4882a593Smuzhiyun
456*4882a593Smuzhiyun if (ret)
457*4882a593Smuzhiyun return ret;
458*4882a593Smuzhiyun #endif
459*4882a593Smuzhiyun return ret;
460*4882a593Smuzhiyun }
461*4882a593Smuzhiyun
dram_init(void)462*4882a593Smuzhiyun int dram_init(void)
463*4882a593Smuzhiyun {
464*4882a593Smuzhiyun gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
465*4882a593Smuzhiyun gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
466*4882a593Smuzhiyun
467*4882a593Smuzhiyun return 0;
468*4882a593Smuzhiyun }
469*4882a593Smuzhiyun
470*4882a593Smuzhiyun const struct rmobile_sysinfo sysinfo = {
471*4882a593Smuzhiyun CONFIG_RMOBILE_BOARD_STRING
472*4882a593Smuzhiyun };
473*4882a593Smuzhiyun
reset_cpu(ulong addr)474*4882a593Smuzhiyun void reset_cpu(ulong addr)
475*4882a593Smuzhiyun {
476*4882a593Smuzhiyun }
477*4882a593Smuzhiyun
478*4882a593Smuzhiyun static const struct sh_serial_platdata serial_platdata = {
479*4882a593Smuzhiyun .base = SCIF0_BASE,
480*4882a593Smuzhiyun .type = PORT_SCIF,
481*4882a593Smuzhiyun .clk = 14745600,
482*4882a593Smuzhiyun .clk_mode = EXT_CLK,
483*4882a593Smuzhiyun };
484*4882a593Smuzhiyun
485*4882a593Smuzhiyun U_BOOT_DEVICE(blanche_serials) = {
486*4882a593Smuzhiyun .name = "serial_sh",
487*4882a593Smuzhiyun .platdata = &serial_platdata,
488*4882a593Smuzhiyun };
489