1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+ 250dcf89dSDirk Eibach /* 350dcf89dSDirk Eibach * (C) Copyright 2014 4d38826a3SMario Six * Dirk Eibach, Guntermann & Drunck GmbH, dirk.eibach@gdsys.cc 550dcf89dSDirk Eibach */ 650dcf89dSDirk Eibach 750dcf89dSDirk Eibach #include <common.h> 850dcf89dSDirk Eibach #include <command.h> 950dcf89dSDirk Eibach #include <asm/processor.h> 1050dcf89dSDirk Eibach #include <asm/io.h> 1150dcf89dSDirk Eibach #include <asm/global_data.h> 1250dcf89dSDirk Eibach 1350dcf89dSDirk Eibach #include "mpc8308.h" 1450dcf89dSDirk Eibach #include <gdsys_fpga.h> 1550dcf89dSDirk Eibach 1650dcf89dSDirk Eibach #define REFLECTION_TESTPATTERN 0xdede 1750dcf89dSDirk Eibach #define REFLECTION_TESTPATTERN_INV (~REFLECTION_TESTPATTERN & 0xffff) 1850dcf89dSDirk Eibach 1950dcf89dSDirk Eibach #ifdef CONFIG_SYS_FPGA_NO_RFL_HI 2050dcf89dSDirk Eibach #define REFLECTION_TESTREG reflection_low 2150dcf89dSDirk Eibach #else 2250dcf89dSDirk Eibach #define REFLECTION_TESTREG reflection_high 2350dcf89dSDirk Eibach #endif 2450dcf89dSDirk Eibach 2550dcf89dSDirk Eibach DECLARE_GLOBAL_DATA_PTR; 2650dcf89dSDirk Eibach get_fpga_state(unsigned dev)2750dcf89dSDirk Eibachint get_fpga_state(unsigned dev) 2850dcf89dSDirk Eibach { 2950dcf89dSDirk Eibach return gd->arch.fpga_state[dev]; 3050dcf89dSDirk Eibach } 3150dcf89dSDirk Eibach board_early_init_f(void)3250dcf89dSDirk Eibachint board_early_init_f(void) 3350dcf89dSDirk Eibach { 3450dcf89dSDirk Eibach unsigned k; 3550dcf89dSDirk Eibach 3650dcf89dSDirk Eibach for (k = 0; k < CONFIG_SYS_FPGA_COUNT; ++k) 3750dcf89dSDirk Eibach gd->arch.fpga_state[k] = 0; 3850dcf89dSDirk Eibach 3950dcf89dSDirk Eibach return 0; 4050dcf89dSDirk Eibach } 4150dcf89dSDirk Eibach board_early_init_r(void)4250dcf89dSDirk Eibachint board_early_init_r(void) 4350dcf89dSDirk Eibach { 4450dcf89dSDirk Eibach unsigned k; 4550dcf89dSDirk Eibach unsigned ctr; 4650dcf89dSDirk Eibach 4750dcf89dSDirk Eibach for (k = 0; k < CONFIG_SYS_FPGA_COUNT; ++k) 4850dcf89dSDirk Eibach gd->arch.fpga_state[k] = 0; 4950dcf89dSDirk Eibach 5050dcf89dSDirk Eibach /* 5150dcf89dSDirk Eibach * reset FPGA 5250dcf89dSDirk Eibach */ 5350dcf89dSDirk Eibach mpc8308_init(); 5450dcf89dSDirk Eibach 5550dcf89dSDirk Eibach mpc8308_set_fpga_reset(1); 5650dcf89dSDirk Eibach 5750dcf89dSDirk Eibach mpc8308_setup_hw(); 5850dcf89dSDirk Eibach 5950dcf89dSDirk Eibach for (k = 0; k < CONFIG_SYS_FPGA_COUNT; ++k) { 6050dcf89dSDirk Eibach ctr = 0; 6150dcf89dSDirk Eibach while (!mpc8308_get_fpga_done(k)) { 6250dcf89dSDirk Eibach udelay(100000); 6350dcf89dSDirk Eibach if (ctr++ > 5) { 6450dcf89dSDirk Eibach gd->arch.fpga_state[k] |= 6550dcf89dSDirk Eibach FPGA_STATE_DONE_FAILED; 6650dcf89dSDirk Eibach break; 6750dcf89dSDirk Eibach } 6850dcf89dSDirk Eibach } 6950dcf89dSDirk Eibach } 7050dcf89dSDirk Eibach 7150dcf89dSDirk Eibach udelay(10); 7250dcf89dSDirk Eibach 7350dcf89dSDirk Eibach mpc8308_set_fpga_reset(0); 7450dcf89dSDirk Eibach 7550dcf89dSDirk Eibach for (k = 0; k < CONFIG_SYS_FPGA_COUNT; ++k) { 7650dcf89dSDirk Eibach /* 7750dcf89dSDirk Eibach * wait for fpga out of reset 7850dcf89dSDirk Eibach */ 7950dcf89dSDirk Eibach ctr = 0; 8050dcf89dSDirk Eibach while (1) { 8150dcf89dSDirk Eibach u16 val; 8250dcf89dSDirk Eibach 8350dcf89dSDirk Eibach FPGA_SET_REG(k, reflection_low, REFLECTION_TESTPATTERN); 8450dcf89dSDirk Eibach 8550dcf89dSDirk Eibach FPGA_GET_REG(k, REFLECTION_TESTREG, &val); 8650dcf89dSDirk Eibach if (val == REFLECTION_TESTPATTERN_INV) 8750dcf89dSDirk Eibach break; 8850dcf89dSDirk Eibach 8950dcf89dSDirk Eibach udelay(100000); 9050dcf89dSDirk Eibach if (ctr++ > 5) { 9150dcf89dSDirk Eibach gd->arch.fpga_state[k] |= 9250dcf89dSDirk Eibach FPGA_STATE_REFLECTION_FAILED; 9350dcf89dSDirk Eibach break; 9450dcf89dSDirk Eibach } 9550dcf89dSDirk Eibach } 9650dcf89dSDirk Eibach } 9750dcf89dSDirk Eibach 9850dcf89dSDirk Eibach return 0; 9950dcf89dSDirk Eibach } 100