xref: /rk3399_rockchip-uboot/board/gdsys/mpc8308/mpc8308.c (revision 98f705c9cefdfdba62c069821bbba10273a0a8ed)
1*50dcf89dSDirk Eibach /*
2*50dcf89dSDirk Eibach  * (C) Copyright 2014
3*50dcf89dSDirk Eibach  * Dirk Eibach,  Guntermann & Drunck GmbH, eibach@gdsys.de
4*50dcf89dSDirk Eibach  *
5*50dcf89dSDirk Eibach  * SPDX-License-Identifier:	GPL-2.0+
6*50dcf89dSDirk Eibach  */
7*50dcf89dSDirk Eibach 
8*50dcf89dSDirk Eibach #include <common.h>
9*50dcf89dSDirk Eibach #include <command.h>
10*50dcf89dSDirk Eibach #include <asm/processor.h>
11*50dcf89dSDirk Eibach #include <asm/io.h>
12*50dcf89dSDirk Eibach #include <asm/global_data.h>
13*50dcf89dSDirk Eibach 
14*50dcf89dSDirk Eibach #include "mpc8308.h"
15*50dcf89dSDirk Eibach #include <gdsys_fpga.h>
16*50dcf89dSDirk Eibach 
17*50dcf89dSDirk Eibach #define REFLECTION_TESTPATTERN 0xdede
18*50dcf89dSDirk Eibach #define REFLECTION_TESTPATTERN_INV (~REFLECTION_TESTPATTERN & 0xffff)
19*50dcf89dSDirk Eibach 
20*50dcf89dSDirk Eibach #ifdef CONFIG_SYS_FPGA_NO_RFL_HI
21*50dcf89dSDirk Eibach #define REFLECTION_TESTREG reflection_low
22*50dcf89dSDirk Eibach #else
23*50dcf89dSDirk Eibach #define REFLECTION_TESTREG reflection_high
24*50dcf89dSDirk Eibach #endif
25*50dcf89dSDirk Eibach 
26*50dcf89dSDirk Eibach DECLARE_GLOBAL_DATA_PTR;
27*50dcf89dSDirk Eibach 
get_fpga_state(unsigned dev)28*50dcf89dSDirk Eibach int get_fpga_state(unsigned dev)
29*50dcf89dSDirk Eibach {
30*50dcf89dSDirk Eibach 	return gd->arch.fpga_state[dev];
31*50dcf89dSDirk Eibach }
32*50dcf89dSDirk Eibach 
board_early_init_f(void)33*50dcf89dSDirk Eibach int board_early_init_f(void)
34*50dcf89dSDirk Eibach {
35*50dcf89dSDirk Eibach 	unsigned k;
36*50dcf89dSDirk Eibach 
37*50dcf89dSDirk Eibach 	for (k = 0; k < CONFIG_SYS_FPGA_COUNT; ++k)
38*50dcf89dSDirk Eibach 		gd->arch.fpga_state[k] = 0;
39*50dcf89dSDirk Eibach 
40*50dcf89dSDirk Eibach 	return 0;
41*50dcf89dSDirk Eibach }
42*50dcf89dSDirk Eibach 
board_early_init_r(void)43*50dcf89dSDirk Eibach int board_early_init_r(void)
44*50dcf89dSDirk Eibach {
45*50dcf89dSDirk Eibach 	unsigned k;
46*50dcf89dSDirk Eibach 	unsigned ctr;
47*50dcf89dSDirk Eibach 
48*50dcf89dSDirk Eibach 	for (k = 0; k < CONFIG_SYS_FPGA_COUNT; ++k)
49*50dcf89dSDirk Eibach 		gd->arch.fpga_state[k] = 0;
50*50dcf89dSDirk Eibach 
51*50dcf89dSDirk Eibach 	/*
52*50dcf89dSDirk Eibach 	 * reset FPGA
53*50dcf89dSDirk Eibach 	 */
54*50dcf89dSDirk Eibach 	mpc8308_init();
55*50dcf89dSDirk Eibach 
56*50dcf89dSDirk Eibach 	mpc8308_set_fpga_reset(1);
57*50dcf89dSDirk Eibach 
58*50dcf89dSDirk Eibach 	mpc8308_setup_hw();
59*50dcf89dSDirk Eibach 
60*50dcf89dSDirk Eibach 	for (k = 0; k < CONFIG_SYS_FPGA_COUNT; ++k) {
61*50dcf89dSDirk Eibach 		ctr = 0;
62*50dcf89dSDirk Eibach 		while (!mpc8308_get_fpga_done(k)) {
63*50dcf89dSDirk Eibach 			udelay(100000);
64*50dcf89dSDirk Eibach 			if (ctr++ > 5) {
65*50dcf89dSDirk Eibach 				gd->arch.fpga_state[k] |=
66*50dcf89dSDirk Eibach 					FPGA_STATE_DONE_FAILED;
67*50dcf89dSDirk Eibach 				break;
68*50dcf89dSDirk Eibach 			}
69*50dcf89dSDirk Eibach 		}
70*50dcf89dSDirk Eibach 	}
71*50dcf89dSDirk Eibach 
72*50dcf89dSDirk Eibach 	udelay(10);
73*50dcf89dSDirk Eibach 
74*50dcf89dSDirk Eibach 	mpc8308_set_fpga_reset(0);
75*50dcf89dSDirk Eibach 
76*50dcf89dSDirk Eibach 	for (k = 0; k < CONFIG_SYS_FPGA_COUNT; ++k) {
77*50dcf89dSDirk Eibach 		/*
78*50dcf89dSDirk Eibach 		 * wait for fpga out of reset
79*50dcf89dSDirk Eibach 		 */
80*50dcf89dSDirk Eibach 		ctr = 0;
81*50dcf89dSDirk Eibach 		while (1) {
82*50dcf89dSDirk Eibach 			u16 val;
83*50dcf89dSDirk Eibach 
84*50dcf89dSDirk Eibach 			FPGA_SET_REG(k, reflection_low, REFLECTION_TESTPATTERN);
85*50dcf89dSDirk Eibach 
86*50dcf89dSDirk Eibach 			FPGA_GET_REG(k, REFLECTION_TESTREG, &val);
87*50dcf89dSDirk Eibach 			if (val == REFLECTION_TESTPATTERN_INV)
88*50dcf89dSDirk Eibach 				break;
89*50dcf89dSDirk Eibach 
90*50dcf89dSDirk Eibach 			udelay(100000);
91*50dcf89dSDirk Eibach 			if (ctr++ > 5) {
92*50dcf89dSDirk Eibach 				gd->arch.fpga_state[k] |=
93*50dcf89dSDirk Eibach 					FPGA_STATE_REFLECTION_FAILED;
94*50dcf89dSDirk Eibach 				break;
95*50dcf89dSDirk Eibach 			}
96*50dcf89dSDirk Eibach 		}
97*50dcf89dSDirk Eibach 	}
98*50dcf89dSDirk Eibach 
99*50dcf89dSDirk Eibach 	return 0;
100*50dcf89dSDirk Eibach }
101