blob: 35fa06a2ee97825f0aea09b1b724477357376858 [file] [log] [blame]
Dirk Eibacha605ea72010-10-21 10:50:05 +02001/*
2 * (C) Copyright 2010
3 * Dirk Eibach, Guntermann & Drunck GmbH, eibach@gdsys.de
4 *
Wolfgang Denk1a459662013-07-08 09:37:19 +02005 * SPDX-License-Identifier: GPL-2.0+
Dirk Eibacha605ea72010-10-21 10:50:05 +02006 */
7
8#include <common.h>
9#include <command.h>
10#include <asm/processor.h>
11#include <asm/io.h>
12#include <asm/ppc4xx-gpio.h>
Dirk Eibach2da0fc02011-01-21 09:31:21 +010013#include <asm/global_data.h>
Dirk Eibacha605ea72010-10-21 10:50:05 +020014
Dirk Eibach6e9e6c32012-04-26 03:54:22 +000015#include "405ep.h"
Dirk Eibach2da0fc02011-01-21 09:31:21 +010016#include <gdsys_fpga.h>
Dirk Eibacha605ea72010-10-21 10:50:05 +020017
Dirk Eibacha605ea72010-10-21 10:50:05 +020018#define REFLECTION_TESTPATTERN 0xdede
19#define REFLECTION_TESTPATTERN_INV (~REFLECTION_TESTPATTERN & 0xffff)
20
Dirk Eibachaba27ac2013-06-26 16:04:26 +020021#ifdef CONFIG_SYS_FPGA_NO_RFL_HI
22#define REFLECTION_TESTREG reflection_low
23#else
24#define REFLECTION_TESTREG reflection_high
25#endif
26
Dirk Eibach2da0fc02011-01-21 09:31:21 +010027DECLARE_GLOBAL_DATA_PTR;
28
29int get_fpga_state(unsigned dev)
30{
Simon Glass923a6622012-12-13 20:49:02 +000031 return gd->arch.fpga_state[dev];
Dirk Eibach2da0fc02011-01-21 09:31:21 +010032}
33
Dirk Eibacha605ea72010-10-21 10:50:05 +020034int board_early_init_f(void)
35{
Dirk Eibach2da0fc02011-01-21 09:31:21 +010036 unsigned k;
Dirk Eibach2da0fc02011-01-21 09:31:21 +010037
38 for (k = 0; k < CONFIG_SYS_FPGA_COUNT; ++k)
Simon Glass923a6622012-12-13 20:49:02 +000039 gd->arch.fpga_state[k] = 0;
Dirk Eibach2da0fc02011-01-21 09:31:21 +010040
Dirk Eibacha605ea72010-10-21 10:50:05 +020041 mtdcr(UIC0SR, 0xFFFFFFFF); /* clear all ints */
42 mtdcr(UIC0ER, 0x00000000); /* disable all ints */
43 mtdcr(UIC0CR, 0x00000000); /* set all to be non-critical */
44 mtdcr(UIC0PR, 0xFFFFFF80); /* set int polarities */
45 mtdcr(UIC0TR, 0x10000000); /* set int trigger levels */
46 mtdcr(UIC0VCR, 0x00000001); /* set vect base=0,INT0 highest prio */
47 mtdcr(UIC0SR, 0xFFFFFFFF); /* clear all ints */
48
49 /*
50 * EBC Configuration Register: set ready timeout to 512 ebc-clks
51 * -> ca. 15 us
52 */
53 mtebc(EBC0_CFG, 0xa8400000); /* ebc always driven */
Dirk Eibach6e9e6c32012-04-26 03:54:22 +000054 return 0;
55}
56
57int board_early_init_r(void)
58{
59 unsigned k;
60 unsigned ctr;
61
62 for (k = 0; k < CONFIG_SYS_FPGA_COUNT; ++k)
Simon Glass923a6622012-12-13 20:49:02 +000063 gd->arch.fpga_state[k] = 0;
Dirk Eibacha605ea72010-10-21 10:50:05 +020064
65 /*
Dirk Eibach6e9e6c32012-04-26 03:54:22 +000066 * reset FPGA
Dirk Eibacha605ea72010-10-21 10:50:05 +020067 */
Dirk Eibach6e9e6c32012-04-26 03:54:22 +000068 gd405ep_init();
Dirk Eibacha605ea72010-10-21 10:50:05 +020069
Dirk Eibach6e9e6c32012-04-26 03:54:22 +000070 gd405ep_set_fpga_reset(1);
Dirk Eibacha605ea72010-10-21 10:50:05 +020071
Dirk Eibach6e9e6c32012-04-26 03:54:22 +000072 gd405ep_setup_hw();
73
Dirk Eibach2da0fc02011-01-21 09:31:21 +010074 for (k = 0; k < CONFIG_SYS_FPGA_COUNT; ++k) {
75 ctr = 0;
Dirk Eibach6e9e6c32012-04-26 03:54:22 +000076 while (!gd405ep_get_fpga_done(k)) {
Dirk Eibach2da0fc02011-01-21 09:31:21 +010077 udelay(100000);
78 if (ctr++ > 5) {
Simon Glass923a6622012-12-13 20:49:02 +000079 gd->arch.fpga_state[k] |=
80 FPGA_STATE_DONE_FAILED;
Dirk Eibach2da0fc02011-01-21 09:31:21 +010081 break;
82 }
83 }
84 }
Dirk Eibacha605ea72010-10-21 10:50:05 +020085
Dirk Eibacha605ea72010-10-21 10:50:05 +020086 udelay(10);
Dirk Eibach6e9e6c32012-04-26 03:54:22 +000087
88 gd405ep_set_fpga_reset(0);
Dirk Eibacha605ea72010-10-21 10:50:05 +020089
Dirk Eibach2da0fc02011-01-21 09:31:21 +010090 for (k = 0; k < CONFIG_SYS_FPGA_COUNT; ++k) {
Dirk Eibach2da0fc02011-01-21 09:31:21 +010091 /*
92 * wait for fpga out of reset
93 */
94 ctr = 0;
95 while (1) {
Dirk Eibachaba27ac2013-06-26 16:04:26 +020096 u16 val;
Dirk Eibach5cb41002011-04-06 13:53:46 +020097
Dirk Eibachaba27ac2013-06-26 16:04:26 +020098 FPGA_SET_REG(k, reflection_low, REFLECTION_TESTPATTERN);
99
100 FPGA_GET_REG(k, REFLECTION_TESTREG, &val);
101 if (val == REFLECTION_TESTPATTERN_INV)
Dirk Eibach2da0fc02011-01-21 09:31:21 +0100102 break;
Dirk Eibach5cb41002011-04-06 13:53:46 +0200103
Dirk Eibach2da0fc02011-01-21 09:31:21 +0100104 udelay(100000);
105 if (ctr++ > 5) {
Simon Glass923a6622012-12-13 20:49:02 +0000106 gd->arch.fpga_state[k] |=
Dirk Eibach2da0fc02011-01-21 09:31:21 +0100107 FPGA_STATE_REFLECTION_FAILED;
108 break;
109 }
110 }
Dirk Eibacha605ea72010-10-21 10:50:05 +0200111 }
112
113 return 0;
114}