xref: /OK3568_Linux_fs/u-boot/board/gdsys/mpc8308/strider.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * (C) Copyright 2014
3*4882a593Smuzhiyun  * Dirk Eibach,  Guntermann & Drunck GmbH, eibach@gdsys.de
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <common.h>
9*4882a593Smuzhiyun #include <hwconfig.h>
10*4882a593Smuzhiyun #include <i2c.h>
11*4882a593Smuzhiyun #include <spi.h>
12*4882a593Smuzhiyun #include <linux/libfdt.h>
13*4882a593Smuzhiyun #include <fdt_support.h>
14*4882a593Smuzhiyun #include <pci.h>
15*4882a593Smuzhiyun #include <mpc83xx.h>
16*4882a593Smuzhiyun #include <fsl_esdhc.h>
17*4882a593Smuzhiyun #include <asm/io.h>
18*4882a593Smuzhiyun #include <asm/fsl_serdes.h>
19*4882a593Smuzhiyun #include <asm/fsl_mpc83xx_serdes.h>
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #include "mpc8308.h"
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #include <gdsys_fpga.h>
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #include "../common/adv7611.h"
26*4882a593Smuzhiyun #include "../common/ch7301.h"
27*4882a593Smuzhiyun #include "../common/dp501.h"
28*4882a593Smuzhiyun #include "../common/ioep-fpga.h"
29*4882a593Smuzhiyun #include "../common/mclink.h"
30*4882a593Smuzhiyun #include "../common/osd.h"
31*4882a593Smuzhiyun #include "../common/phy.h"
32*4882a593Smuzhiyun #include "../common/fanctrl.h"
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #include <pca953x.h>
35*4882a593Smuzhiyun #include <pca9698.h>
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #include <miiphy.h>
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun #define MAX_MUX_CHANNELS 2
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun enum {
44*4882a593Smuzhiyun 	MCFPGA_DONE = 1 << 0,
45*4882a593Smuzhiyun 	MCFPGA_INIT_N = 1 << 1,
46*4882a593Smuzhiyun 	MCFPGA_PROGRAM_N = 1 << 2,
47*4882a593Smuzhiyun 	MCFPGA_UPDATE_ENABLE_N = 1 << 3,
48*4882a593Smuzhiyun 	MCFPGA_RESET_N = 1 << 4,
49*4882a593Smuzhiyun };
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun enum {
52*4882a593Smuzhiyun 	GPIO_MDC = 1 << 14,
53*4882a593Smuzhiyun 	GPIO_MDIO = 1 << 15,
54*4882a593Smuzhiyun };
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun unsigned int mclink_fpgacount;
57*4882a593Smuzhiyun struct ihs_fpga *fpga_ptr[] = CONFIG_SYS_FPGA_PTR;
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun struct {
60*4882a593Smuzhiyun 	u8 bus;
61*4882a593Smuzhiyun 	u8 addr;
62*4882a593Smuzhiyun } strider_fans[] = CONFIG_STRIDER_FANS;
63*4882a593Smuzhiyun 
fpga_set_reg(u32 fpga,u16 * reg,off_t regoff,u16 data)64*4882a593Smuzhiyun int fpga_set_reg(u32 fpga, u16 *reg, off_t regoff, u16 data)
65*4882a593Smuzhiyun {
66*4882a593Smuzhiyun 	int res;
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 	switch (fpga) {
69*4882a593Smuzhiyun 	case 0:
70*4882a593Smuzhiyun 		out_le16(reg, data);
71*4882a593Smuzhiyun 		break;
72*4882a593Smuzhiyun 	default:
73*4882a593Smuzhiyun 		res = mclink_send(fpga - 1, regoff, data);
74*4882a593Smuzhiyun 		if (res < 0) {
75*4882a593Smuzhiyun 			printf("mclink_send reg %02lx data %04x returned %d\n",
76*4882a593Smuzhiyun 			       regoff, data, res);
77*4882a593Smuzhiyun 			return res;
78*4882a593Smuzhiyun 		}
79*4882a593Smuzhiyun 		break;
80*4882a593Smuzhiyun 	}
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun 	return 0;
83*4882a593Smuzhiyun }
84*4882a593Smuzhiyun 
fpga_get_reg(u32 fpga,u16 * reg,off_t regoff,u16 * data)85*4882a593Smuzhiyun int fpga_get_reg(u32 fpga, u16 *reg, off_t regoff, u16 *data)
86*4882a593Smuzhiyun {
87*4882a593Smuzhiyun 	int res;
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun 	switch (fpga) {
90*4882a593Smuzhiyun 	case 0:
91*4882a593Smuzhiyun 		*data = in_le16(reg);
92*4882a593Smuzhiyun 		break;
93*4882a593Smuzhiyun 	default:
94*4882a593Smuzhiyun 		if (fpga > mclink_fpgacount)
95*4882a593Smuzhiyun 			return -EINVAL;
96*4882a593Smuzhiyun 		res = mclink_receive(fpga - 1, regoff, data);
97*4882a593Smuzhiyun 		if (res < 0) {
98*4882a593Smuzhiyun 			printf("mclink_receive reg %02lx returned %d\n",
99*4882a593Smuzhiyun 			       regoff, res);
100*4882a593Smuzhiyun 			return res;
101*4882a593Smuzhiyun 		}
102*4882a593Smuzhiyun 	}
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 	return 0;
105*4882a593Smuzhiyun }
106*4882a593Smuzhiyun 
checkboard(void)107*4882a593Smuzhiyun int checkboard(void)
108*4882a593Smuzhiyun {
109*4882a593Smuzhiyun 	char *s = env_get("serial#");
110*4882a593Smuzhiyun 	bool hw_type_cat = pca9698_get_value(0x20, 18);
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun 	puts("Board: ");
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	printf("Strider %s", hw_type_cat ? "CAT" : "Fiber");
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 	if (s != NULL) {
117*4882a593Smuzhiyun 		puts(", serial# ");
118*4882a593Smuzhiyun 		puts(s);
119*4882a593Smuzhiyun 	}
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun 	puts("\n");
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun 	return 0;
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun 
last_stage_init(void)126*4882a593Smuzhiyun int last_stage_init(void)
127*4882a593Smuzhiyun {
128*4882a593Smuzhiyun 	int slaves;
129*4882a593Smuzhiyun 	unsigned int k;
130*4882a593Smuzhiyun 	unsigned int mux_ch;
131*4882a593Smuzhiyun 	unsigned char mclink_controllers_dvi[] = { 0x3c, 0x3d, 0x3e };
132*4882a593Smuzhiyun #ifdef CONFIG_STRIDER_CPU
133*4882a593Smuzhiyun 	unsigned char mclink_controllers_dp[] = { 0x24, 0x25, 0x26 };
134*4882a593Smuzhiyun #endif
135*4882a593Smuzhiyun 	bool hw_type_cat = pca9698_get_value(0x20, 18);
136*4882a593Smuzhiyun #ifdef CONFIG_STRIDER_CON_DP
137*4882a593Smuzhiyun 	bool is_dh = pca9698_get_value(0x20, 25);
138*4882a593Smuzhiyun #endif
139*4882a593Smuzhiyun 	bool ch0_sgmii2_present = false;
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun 	/* Turn on Analog Devices ADV7611 */
142*4882a593Smuzhiyun 	pca9698_direction_output(0x20, 8, 0);
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 	/* Turn on Parade DP501 */
145*4882a593Smuzhiyun 	pca9698_direction_output(0x20, 10, 1);
146*4882a593Smuzhiyun 	pca9698_direction_output(0x20, 11, 1);
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun 	ch0_sgmii2_present = !pca9698_get_value(0x20, 37);
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	/* wait for FPGA done, then reset FPGA */
151*4882a593Smuzhiyun 	for (k = 0; k < ARRAY_SIZE(mclink_controllers_dvi); ++k) {
152*4882a593Smuzhiyun 		unsigned int ctr = 0;
153*4882a593Smuzhiyun 		unsigned char *mclink_controllers = mclink_controllers_dvi;
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun #ifdef CONFIG_STRIDER_CPU
156*4882a593Smuzhiyun 		if (i2c_probe(mclink_controllers[k])) {
157*4882a593Smuzhiyun 			mclink_controllers = mclink_controllers_dp;
158*4882a593Smuzhiyun 			if (i2c_probe(mclink_controllers[k]))
159*4882a593Smuzhiyun 				continue;
160*4882a593Smuzhiyun 		}
161*4882a593Smuzhiyun #else
162*4882a593Smuzhiyun 		if (i2c_probe(mclink_controllers[k]))
163*4882a593Smuzhiyun 			continue;
164*4882a593Smuzhiyun #endif
165*4882a593Smuzhiyun 		while (!(pca953x_get_val(mclink_controllers[k])
166*4882a593Smuzhiyun 		       & MCFPGA_DONE)) {
167*4882a593Smuzhiyun 			udelay(100000);
168*4882a593Smuzhiyun 			if (ctr++ > 5) {
169*4882a593Smuzhiyun 				printf("no done for mclink_controller %d\n", k);
170*4882a593Smuzhiyun 				break;
171*4882a593Smuzhiyun 			}
172*4882a593Smuzhiyun 		}
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 		pca953x_set_dir(mclink_controllers[k], MCFPGA_RESET_N, 0);
175*4882a593Smuzhiyun 		pca953x_set_val(mclink_controllers[k], MCFPGA_RESET_N, 0);
176*4882a593Smuzhiyun 		udelay(10);
177*4882a593Smuzhiyun 		pca953x_set_val(mclink_controllers[k], MCFPGA_RESET_N,
178*4882a593Smuzhiyun 				MCFPGA_RESET_N);
179*4882a593Smuzhiyun 	}
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun 	if (hw_type_cat) {
182*4882a593Smuzhiyun 		int retval;
183*4882a593Smuzhiyun 		struct mii_dev *mdiodev = mdio_alloc();
184*4882a593Smuzhiyun 		if (!mdiodev)
185*4882a593Smuzhiyun 			return -ENOMEM;
186*4882a593Smuzhiyun 		strncpy(mdiodev->name, bb_miiphy_buses[0].name, MDIO_NAME_LEN);
187*4882a593Smuzhiyun 		mdiodev->read = bb_miiphy_read;
188*4882a593Smuzhiyun 		mdiodev->write = bb_miiphy_write;
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 		retval = mdio_register(mdiodev);
191*4882a593Smuzhiyun 		if (retval < 0)
192*4882a593Smuzhiyun 			return retval;
193*4882a593Smuzhiyun 		for (mux_ch = 0; mux_ch < MAX_MUX_CHANNELS; ++mux_ch) {
194*4882a593Smuzhiyun 			if ((mux_ch == 1) && !ch0_sgmii2_present)
195*4882a593Smuzhiyun 				continue;
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 			setup_88e1514(bb_miiphy_buses[0].name, mux_ch);
198*4882a593Smuzhiyun 		}
199*4882a593Smuzhiyun 	}
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 	/* give slave-PLLs and Parade DP501 some time to be up and running */
202*4882a593Smuzhiyun 	udelay(500000);
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun 	mclink_fpgacount = CONFIG_SYS_MCLINK_MAX;
205*4882a593Smuzhiyun 	slaves = mclink_probe();
206*4882a593Smuzhiyun 	mclink_fpgacount = 0;
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun 	ioep_fpga_print_info(0);
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	if (!adv7611_probe(0))
211*4882a593Smuzhiyun 		printf("       Advantiv ADV7611 HDMI Receiver\n");
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun #ifdef CONFIG_STRIDER_CON
214*4882a593Smuzhiyun 	if (ioep_fpga_has_osd(0))
215*4882a593Smuzhiyun 		osd_probe(0);
216*4882a593Smuzhiyun #endif
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun #ifdef CONFIG_STRIDER_CON_DP
219*4882a593Smuzhiyun 	if (ioep_fpga_has_osd(0)) {
220*4882a593Smuzhiyun 		osd_probe(0);
221*4882a593Smuzhiyun 		if (is_dh)
222*4882a593Smuzhiyun 			osd_probe(4);
223*4882a593Smuzhiyun 	}
224*4882a593Smuzhiyun #endif
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun #ifdef CONFIG_STRIDER_CPU
227*4882a593Smuzhiyun 	ch7301_probe(0, false);
228*4882a593Smuzhiyun 	dp501_probe(0, false);
229*4882a593Smuzhiyun #endif
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun 	if (slaves <= 0)
232*4882a593Smuzhiyun 		return 0;
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun 	mclink_fpgacount = slaves;
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun #ifdef CONFIG_STRIDER_CPU
237*4882a593Smuzhiyun 	/* get ADV7611 out of reset, power up DP501, give some time to wakeup */
238*4882a593Smuzhiyun 	for (k = 1; k <= slaves; ++k)
239*4882a593Smuzhiyun 		FPGA_SET_REG(k, extended_control, 0x10); /* enable video */
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun 	udelay(500000);
242*4882a593Smuzhiyun #endif
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun 	for (k = 1; k <= slaves; ++k) {
245*4882a593Smuzhiyun 		ioep_fpga_print_info(k);
246*4882a593Smuzhiyun #ifdef CONFIG_STRIDER_CON
247*4882a593Smuzhiyun 		if (ioep_fpga_has_osd(k))
248*4882a593Smuzhiyun 			osd_probe(k);
249*4882a593Smuzhiyun #endif
250*4882a593Smuzhiyun #ifdef CONFIG_STRIDER_CON_DP
251*4882a593Smuzhiyun 		if (ioep_fpga_has_osd(k)) {
252*4882a593Smuzhiyun 			osd_probe(k);
253*4882a593Smuzhiyun 			if (is_dh)
254*4882a593Smuzhiyun 				osd_probe(k + 4);
255*4882a593Smuzhiyun 		}
256*4882a593Smuzhiyun #endif
257*4882a593Smuzhiyun #ifdef CONFIG_STRIDER_CPU
258*4882a593Smuzhiyun 		if (!adv7611_probe(k))
259*4882a593Smuzhiyun 			printf("       Advantiv ADV7611 HDMI Receiver\n");
260*4882a593Smuzhiyun 		ch7301_probe(k, false);
261*4882a593Smuzhiyun 		dp501_probe(k, false);
262*4882a593Smuzhiyun #endif
263*4882a593Smuzhiyun 		if (hw_type_cat) {
264*4882a593Smuzhiyun 			int retval;
265*4882a593Smuzhiyun 			struct mii_dev *mdiodev = mdio_alloc();
266*4882a593Smuzhiyun 			if (!mdiodev)
267*4882a593Smuzhiyun 				return -ENOMEM;
268*4882a593Smuzhiyun 			strncpy(mdiodev->name, bb_miiphy_buses[k].name,
269*4882a593Smuzhiyun 				MDIO_NAME_LEN);
270*4882a593Smuzhiyun 			mdiodev->read = bb_miiphy_read;
271*4882a593Smuzhiyun 			mdiodev->write = bb_miiphy_write;
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun 			retval = mdio_register(mdiodev);
274*4882a593Smuzhiyun 			if (retval < 0)
275*4882a593Smuzhiyun 				return retval;
276*4882a593Smuzhiyun 			setup_88e1514(bb_miiphy_buses[k].name, 0);
277*4882a593Smuzhiyun 		}
278*4882a593Smuzhiyun 	}
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 	for (k = 0; k < ARRAY_SIZE(strider_fans); ++k) {
281*4882a593Smuzhiyun 		i2c_set_bus_num(strider_fans[k].bus);
282*4882a593Smuzhiyun 		init_fan_controller(strider_fans[k].addr);
283*4882a593Smuzhiyun 	}
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun 	return 0;
286*4882a593Smuzhiyun }
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun /*
289*4882a593Smuzhiyun  * provide access to fpga gpios (for I2C bitbang)
290*4882a593Smuzhiyun  * (these may look all too simple but make iocon.h much more readable)
291*4882a593Smuzhiyun  */
fpga_gpio_set(unsigned int bus,int pin)292*4882a593Smuzhiyun void fpga_gpio_set(unsigned int bus, int pin)
293*4882a593Smuzhiyun {
294*4882a593Smuzhiyun 	FPGA_SET_REG(bus, gpio.set, pin);
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun 
fpga_gpio_clear(unsigned int bus,int pin)297*4882a593Smuzhiyun void fpga_gpio_clear(unsigned int bus, int pin)
298*4882a593Smuzhiyun {
299*4882a593Smuzhiyun 	FPGA_SET_REG(bus, gpio.clear, pin);
300*4882a593Smuzhiyun }
301*4882a593Smuzhiyun 
fpga_gpio_get(unsigned int bus,int pin)302*4882a593Smuzhiyun int fpga_gpio_get(unsigned int bus, int pin)
303*4882a593Smuzhiyun {
304*4882a593Smuzhiyun 	u16 val;
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun 	FPGA_GET_REG(bus, gpio.read, &val);
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun 	return val & pin;
309*4882a593Smuzhiyun }
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun #ifdef CONFIG_STRIDER_CON_DP
fpga_control_set(unsigned int bus,int pin)312*4882a593Smuzhiyun void fpga_control_set(unsigned int bus, int pin)
313*4882a593Smuzhiyun {
314*4882a593Smuzhiyun 	u16 val;
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun 	FPGA_GET_REG(bus, control, &val);
317*4882a593Smuzhiyun 	FPGA_SET_REG(bus, control, val | pin);
318*4882a593Smuzhiyun }
319*4882a593Smuzhiyun 
fpga_control_clear(unsigned int bus,int pin)320*4882a593Smuzhiyun void fpga_control_clear(unsigned int bus, int pin)
321*4882a593Smuzhiyun {
322*4882a593Smuzhiyun 	u16 val;
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun 	FPGA_GET_REG(bus, control, &val);
325*4882a593Smuzhiyun 	FPGA_SET_REG(bus, control, val & ~pin);
326*4882a593Smuzhiyun }
327*4882a593Smuzhiyun #endif
328*4882a593Smuzhiyun 
mpc8308_init(void)329*4882a593Smuzhiyun void mpc8308_init(void)
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun 	pca9698_direction_output(0x20, 26, 1);
332*4882a593Smuzhiyun }
333*4882a593Smuzhiyun 
mpc8308_set_fpga_reset(unsigned state)334*4882a593Smuzhiyun void mpc8308_set_fpga_reset(unsigned state)
335*4882a593Smuzhiyun {
336*4882a593Smuzhiyun 	pca9698_set_value(0x20, 26, state ? 0 : 1);
337*4882a593Smuzhiyun }
338*4882a593Smuzhiyun 
mpc8308_setup_hw(void)339*4882a593Smuzhiyun void mpc8308_setup_hw(void)
340*4882a593Smuzhiyun {
341*4882a593Smuzhiyun 	immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun 	/*
344*4882a593Smuzhiyun 	 * set "startup-finished"-gpios
345*4882a593Smuzhiyun 	 */
346*4882a593Smuzhiyun 	setbits_be32(&immr->gpio[0].dir, (1 << (31-11)) | (1 << (31-12)));
347*4882a593Smuzhiyun 	setbits_be32(&immr->gpio[0].dat, 1 << (31-12));
348*4882a593Smuzhiyun }
349*4882a593Smuzhiyun 
mpc8308_get_fpga_done(unsigned fpga)350*4882a593Smuzhiyun int mpc8308_get_fpga_done(unsigned fpga)
351*4882a593Smuzhiyun {
352*4882a593Smuzhiyun 	return pca9698_get_value(0x20, 20);
353*4882a593Smuzhiyun }
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun #ifdef CONFIG_FSL_ESDHC
board_mmc_init(bd_t * bd)356*4882a593Smuzhiyun int board_mmc_init(bd_t *bd)
357*4882a593Smuzhiyun {
358*4882a593Smuzhiyun 	immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
359*4882a593Smuzhiyun 	sysconf83xx_t *sysconf = &immr->sysconf;
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun 	/* Enable cache snooping in eSDHC system configuration register */
362*4882a593Smuzhiyun 	out_be32(&sysconf->sdhccr, 0x02000000);
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun 	return fsl_esdhc_mmc_init(bd);
365*4882a593Smuzhiyun }
366*4882a593Smuzhiyun #endif
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun static struct pci_region pcie_regions_0[] = {
369*4882a593Smuzhiyun 	{
370*4882a593Smuzhiyun 		.bus_start = CONFIG_SYS_PCIE1_MEM_BASE,
371*4882a593Smuzhiyun 		.phys_start = CONFIG_SYS_PCIE1_MEM_PHYS,
372*4882a593Smuzhiyun 		.size = CONFIG_SYS_PCIE1_MEM_SIZE,
373*4882a593Smuzhiyun 		.flags = PCI_REGION_MEM,
374*4882a593Smuzhiyun 	},
375*4882a593Smuzhiyun 	{
376*4882a593Smuzhiyun 		.bus_start = CONFIG_SYS_PCIE1_IO_BASE,
377*4882a593Smuzhiyun 		.phys_start = CONFIG_SYS_PCIE1_IO_PHYS,
378*4882a593Smuzhiyun 		.size = CONFIG_SYS_PCIE1_IO_SIZE,
379*4882a593Smuzhiyun 		.flags = PCI_REGION_IO,
380*4882a593Smuzhiyun 	},
381*4882a593Smuzhiyun };
382*4882a593Smuzhiyun 
pci_init_board(void)383*4882a593Smuzhiyun void pci_init_board(void)
384*4882a593Smuzhiyun {
385*4882a593Smuzhiyun 	immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
386*4882a593Smuzhiyun 	sysconf83xx_t *sysconf = &immr->sysconf;
387*4882a593Smuzhiyun 	law83xx_t *pcie_law = sysconf->pcielaw;
388*4882a593Smuzhiyun 	struct pci_region *pcie_reg[] = { pcie_regions_0 };
389*4882a593Smuzhiyun 
390*4882a593Smuzhiyun 	fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_PEX,
391*4882a593Smuzhiyun 			 FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V);
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun 	/* Deassert the resets in the control register */
394*4882a593Smuzhiyun 	out_be32(&sysconf->pecr1, 0xE0008000);
395*4882a593Smuzhiyun 	udelay(2000);
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun 	/* Configure PCI Express Local Access Windows */
398*4882a593Smuzhiyun 	out_be32(&pcie_law[0].bar, CONFIG_SYS_PCIE1_BASE & LAWBAR_BAR);
399*4882a593Smuzhiyun 	out_be32(&pcie_law[0].ar, LBLAWAR_EN | LBLAWAR_512MB);
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun 	mpc83xx_pcie_init(1, pcie_reg);
402*4882a593Smuzhiyun }
403*4882a593Smuzhiyun 
board_flash_get_legacy(ulong base,int banknum,flash_info_t * info)404*4882a593Smuzhiyun ulong board_flash_get_legacy(ulong base, int banknum, flash_info_t *info)
405*4882a593Smuzhiyun {
406*4882a593Smuzhiyun 	info->portwidth = FLASH_CFI_16BIT;
407*4882a593Smuzhiyun 	info->chipwidth = FLASH_CFI_BY16;
408*4882a593Smuzhiyun 	info->interface = FLASH_CFI_X16;
409*4882a593Smuzhiyun 	return 1;
410*4882a593Smuzhiyun }
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun #if defined(CONFIG_OF_BOARD_SETUP)
ft_board_setup(void * blob,bd_t * bd)413*4882a593Smuzhiyun int ft_board_setup(void *blob, bd_t *bd)
414*4882a593Smuzhiyun {
415*4882a593Smuzhiyun 	ft_cpu_setup(blob, bd);
416*4882a593Smuzhiyun 	fsl_fdt_fixup_dr_usb(blob, bd);
417*4882a593Smuzhiyun 	fdt_fixup_esdhc(blob, bd);
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 	return 0;
420*4882a593Smuzhiyun }
421*4882a593Smuzhiyun #endif
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun /*
424*4882a593Smuzhiyun  * FPGA MII bitbang implementation
425*4882a593Smuzhiyun  */
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun struct fpga_mii {
428*4882a593Smuzhiyun 	unsigned fpga;
429*4882a593Smuzhiyun 	int mdio;
430*4882a593Smuzhiyun } fpga_mii[] = {
431*4882a593Smuzhiyun 	{ 0, 1},
432*4882a593Smuzhiyun 	{ 1, 1},
433*4882a593Smuzhiyun 	{ 2, 1},
434*4882a593Smuzhiyun 	{ 3, 1},
435*4882a593Smuzhiyun };
436*4882a593Smuzhiyun 
mii_dummy_init(struct bb_miiphy_bus * bus)437*4882a593Smuzhiyun static int mii_dummy_init(struct bb_miiphy_bus *bus)
438*4882a593Smuzhiyun {
439*4882a593Smuzhiyun 	return 0;
440*4882a593Smuzhiyun }
441*4882a593Smuzhiyun 
mii_mdio_active(struct bb_miiphy_bus * bus)442*4882a593Smuzhiyun static int mii_mdio_active(struct bb_miiphy_bus *bus)
443*4882a593Smuzhiyun {
444*4882a593Smuzhiyun 	struct fpga_mii *fpga_mii = bus->priv;
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun 	if (fpga_mii->mdio)
447*4882a593Smuzhiyun 		FPGA_SET_REG(fpga_mii->fpga, gpio.set, GPIO_MDIO);
448*4882a593Smuzhiyun 	else
449*4882a593Smuzhiyun 		FPGA_SET_REG(fpga_mii->fpga, gpio.clear, GPIO_MDIO);
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun 	return 0;
452*4882a593Smuzhiyun }
453*4882a593Smuzhiyun 
mii_mdio_tristate(struct bb_miiphy_bus * bus)454*4882a593Smuzhiyun static int mii_mdio_tristate(struct bb_miiphy_bus *bus)
455*4882a593Smuzhiyun {
456*4882a593Smuzhiyun 	struct fpga_mii *fpga_mii = bus->priv;
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun 	FPGA_SET_REG(fpga_mii->fpga, gpio.set, GPIO_MDIO);
459*4882a593Smuzhiyun 
460*4882a593Smuzhiyun 	return 0;
461*4882a593Smuzhiyun }
462*4882a593Smuzhiyun 
mii_set_mdio(struct bb_miiphy_bus * bus,int v)463*4882a593Smuzhiyun static int mii_set_mdio(struct bb_miiphy_bus *bus, int v)
464*4882a593Smuzhiyun {
465*4882a593Smuzhiyun 	struct fpga_mii *fpga_mii = bus->priv;
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun 	if (v)
468*4882a593Smuzhiyun 		FPGA_SET_REG(fpga_mii->fpga, gpio.set, GPIO_MDIO);
469*4882a593Smuzhiyun 	else
470*4882a593Smuzhiyun 		FPGA_SET_REG(fpga_mii->fpga, gpio.clear, GPIO_MDIO);
471*4882a593Smuzhiyun 
472*4882a593Smuzhiyun 	fpga_mii->mdio = v;
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun 	return 0;
475*4882a593Smuzhiyun }
476*4882a593Smuzhiyun 
mii_get_mdio(struct bb_miiphy_bus * bus,int * v)477*4882a593Smuzhiyun static int mii_get_mdio(struct bb_miiphy_bus *bus, int *v)
478*4882a593Smuzhiyun {
479*4882a593Smuzhiyun 	u16 gpio;
480*4882a593Smuzhiyun 	struct fpga_mii *fpga_mii = bus->priv;
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 	FPGA_GET_REG(fpga_mii->fpga, gpio.read, &gpio);
483*4882a593Smuzhiyun 
484*4882a593Smuzhiyun 	*v = ((gpio & GPIO_MDIO) != 0);
485*4882a593Smuzhiyun 
486*4882a593Smuzhiyun 	return 0;
487*4882a593Smuzhiyun }
488*4882a593Smuzhiyun 
mii_set_mdc(struct bb_miiphy_bus * bus,int v)489*4882a593Smuzhiyun static int mii_set_mdc(struct bb_miiphy_bus *bus, int v)
490*4882a593Smuzhiyun {
491*4882a593Smuzhiyun 	struct fpga_mii *fpga_mii = bus->priv;
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun 	if (v)
494*4882a593Smuzhiyun 		FPGA_SET_REG(fpga_mii->fpga, gpio.set, GPIO_MDC);
495*4882a593Smuzhiyun 	else
496*4882a593Smuzhiyun 		FPGA_SET_REG(fpga_mii->fpga, gpio.clear, GPIO_MDC);
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun 	return 0;
499*4882a593Smuzhiyun }
500*4882a593Smuzhiyun 
mii_delay(struct bb_miiphy_bus * bus)501*4882a593Smuzhiyun static int mii_delay(struct bb_miiphy_bus *bus)
502*4882a593Smuzhiyun {
503*4882a593Smuzhiyun 	udelay(1);
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun 	return 0;
506*4882a593Smuzhiyun }
507*4882a593Smuzhiyun 
508*4882a593Smuzhiyun struct bb_miiphy_bus bb_miiphy_buses[] = {
509*4882a593Smuzhiyun 	{
510*4882a593Smuzhiyun 		.name = "board0",
511*4882a593Smuzhiyun 		.init = mii_dummy_init,
512*4882a593Smuzhiyun 		.mdio_active = mii_mdio_active,
513*4882a593Smuzhiyun 		.mdio_tristate = mii_mdio_tristate,
514*4882a593Smuzhiyun 		.set_mdio = mii_set_mdio,
515*4882a593Smuzhiyun 		.get_mdio = mii_get_mdio,
516*4882a593Smuzhiyun 		.set_mdc = mii_set_mdc,
517*4882a593Smuzhiyun 		.delay = mii_delay,
518*4882a593Smuzhiyun 		.priv = &fpga_mii[0],
519*4882a593Smuzhiyun 	},
520*4882a593Smuzhiyun 	{
521*4882a593Smuzhiyun 		.name = "board1",
522*4882a593Smuzhiyun 		.init = mii_dummy_init,
523*4882a593Smuzhiyun 		.mdio_active = mii_mdio_active,
524*4882a593Smuzhiyun 		.mdio_tristate = mii_mdio_tristate,
525*4882a593Smuzhiyun 		.set_mdio = mii_set_mdio,
526*4882a593Smuzhiyun 		.get_mdio = mii_get_mdio,
527*4882a593Smuzhiyun 		.set_mdc = mii_set_mdc,
528*4882a593Smuzhiyun 		.delay = mii_delay,
529*4882a593Smuzhiyun 		.priv = &fpga_mii[1],
530*4882a593Smuzhiyun 	},
531*4882a593Smuzhiyun 	{
532*4882a593Smuzhiyun 		.name = "board2",
533*4882a593Smuzhiyun 		.init = mii_dummy_init,
534*4882a593Smuzhiyun 		.mdio_active = mii_mdio_active,
535*4882a593Smuzhiyun 		.mdio_tristate = mii_mdio_tristate,
536*4882a593Smuzhiyun 		.set_mdio = mii_set_mdio,
537*4882a593Smuzhiyun 		.get_mdio = mii_get_mdio,
538*4882a593Smuzhiyun 		.set_mdc = mii_set_mdc,
539*4882a593Smuzhiyun 		.delay = mii_delay,
540*4882a593Smuzhiyun 		.priv = &fpga_mii[2],
541*4882a593Smuzhiyun 	},
542*4882a593Smuzhiyun 	{
543*4882a593Smuzhiyun 		.name = "board3",
544*4882a593Smuzhiyun 		.init = mii_dummy_init,
545*4882a593Smuzhiyun 		.mdio_active = mii_mdio_active,
546*4882a593Smuzhiyun 		.mdio_tristate = mii_mdio_tristate,
547*4882a593Smuzhiyun 		.set_mdio = mii_set_mdio,
548*4882a593Smuzhiyun 		.get_mdio = mii_get_mdio,
549*4882a593Smuzhiyun 		.set_mdc = mii_set_mdc,
550*4882a593Smuzhiyun 		.delay = mii_delay,
551*4882a593Smuzhiyun 		.priv = &fpga_mii[3],
552*4882a593Smuzhiyun 	},
553*4882a593Smuzhiyun };
554*4882a593Smuzhiyun 
555*4882a593Smuzhiyun int bb_miiphy_buses_num = sizeof(bb_miiphy_buses) /
556*4882a593Smuzhiyun 			  sizeof(bb_miiphy_buses[0]);
557