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 Eibachint 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 Eibachint 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 Eibachint 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