xref: /rk3399_rockchip-uboot/board/bluegiga/apx4devkit/apx4devkit.c (revision c1393bb3def33b8ec154e4b6f06ed1ad81e052a1)
1*c1393bb3SVeli-Pekka Peltola /*
2*c1393bb3SVeli-Pekka Peltola  * Bluegiga APX4 Development Kit
3*c1393bb3SVeli-Pekka Peltola  *
4*c1393bb3SVeli-Pekka Peltola  * Copyright (C) 2012 Bluegiga Technologies Oy
5*c1393bb3SVeli-Pekka Peltola  *
6*c1393bb3SVeli-Pekka Peltola  * Authors:
7*c1393bb3SVeli-Pekka Peltola  * Veli-Pekka Peltola <veli-pekka.peltola@bluegiga.com>
8*c1393bb3SVeli-Pekka Peltola  * Lauri Hintsala <lauri.hintsala@bluegiga.com>
9*c1393bb3SVeli-Pekka Peltola  *
10*c1393bb3SVeli-Pekka Peltola  * Based on m28evk.c:
11*c1393bb3SVeli-Pekka Peltola  * Copyright (C) 2011 Marek Vasut <marek.vasut@gmail.com>
12*c1393bb3SVeli-Pekka Peltola  * on behalf of DENX Software Engineering GmbH
13*c1393bb3SVeli-Pekka Peltola  *
14*c1393bb3SVeli-Pekka Peltola  * See file CREDITS for list of people who contributed to this
15*c1393bb3SVeli-Pekka Peltola  * project.
16*c1393bb3SVeli-Pekka Peltola  *
17*c1393bb3SVeli-Pekka Peltola  * This program is free software; you can redistribute it and/or
18*c1393bb3SVeli-Pekka Peltola  * modify it under the terms of the GNU General Public License as
19*c1393bb3SVeli-Pekka Peltola  * published by the Free Software Foundation; either version 2 of
20*c1393bb3SVeli-Pekka Peltola  * the License, or (at your option) any later version.
21*c1393bb3SVeli-Pekka Peltola  *
22*c1393bb3SVeli-Pekka Peltola  * This program is distributed in the hope that it will be useful,
23*c1393bb3SVeli-Pekka Peltola  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24*c1393bb3SVeli-Pekka Peltola  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25*c1393bb3SVeli-Pekka Peltola  * GNU General Public License for more details.
26*c1393bb3SVeli-Pekka Peltola  */
27*c1393bb3SVeli-Pekka Peltola 
28*c1393bb3SVeli-Pekka Peltola #include <common.h>
29*c1393bb3SVeli-Pekka Peltola #include <asm/gpio.h>
30*c1393bb3SVeli-Pekka Peltola #include <asm/io.h>
31*c1393bb3SVeli-Pekka Peltola #include <asm/arch/imx-regs.h>
32*c1393bb3SVeli-Pekka Peltola #include <asm/arch/iomux-mx28.h>
33*c1393bb3SVeli-Pekka Peltola #include <asm/arch/clock.h>
34*c1393bb3SVeli-Pekka Peltola #include <asm/arch/sys_proto.h>
35*c1393bb3SVeli-Pekka Peltola #include <linux/mii.h>
36*c1393bb3SVeli-Pekka Peltola #include <miiphy.h>
37*c1393bb3SVeli-Pekka Peltola #include <netdev.h>
38*c1393bb3SVeli-Pekka Peltola #include <errno.h>
39*c1393bb3SVeli-Pekka Peltola 
40*c1393bb3SVeli-Pekka Peltola DECLARE_GLOBAL_DATA_PTR;
41*c1393bb3SVeli-Pekka Peltola 
42*c1393bb3SVeli-Pekka Peltola /* Functions */
43*c1393bb3SVeli-Pekka Peltola int board_early_init_f(void)
44*c1393bb3SVeli-Pekka Peltola {
45*c1393bb3SVeli-Pekka Peltola 	/* IO0 clock at 480MHz */
46*c1393bb3SVeli-Pekka Peltola 	mx28_set_ioclk(MXC_IOCLK0, 480000);
47*c1393bb3SVeli-Pekka Peltola 	/* IO1 clock at 480MHz */
48*c1393bb3SVeli-Pekka Peltola 	mx28_set_ioclk(MXC_IOCLK1, 480000);
49*c1393bb3SVeli-Pekka Peltola 
50*c1393bb3SVeli-Pekka Peltola 	/* SSP0 clock at 96MHz */
51*c1393bb3SVeli-Pekka Peltola 	mx28_set_sspclk(MXC_SSPCLK0, 96000, 0);
52*c1393bb3SVeli-Pekka Peltola 
53*c1393bb3SVeli-Pekka Peltola 	return 0;
54*c1393bb3SVeli-Pekka Peltola }
55*c1393bb3SVeli-Pekka Peltola 
56*c1393bb3SVeli-Pekka Peltola int dram_init(void)
57*c1393bb3SVeli-Pekka Peltola {
58*c1393bb3SVeli-Pekka Peltola 	return mx28_dram_init();
59*c1393bb3SVeli-Pekka Peltola }
60*c1393bb3SVeli-Pekka Peltola 
61*c1393bb3SVeli-Pekka Peltola int board_init(void)
62*c1393bb3SVeli-Pekka Peltola {
63*c1393bb3SVeli-Pekka Peltola 	/* Adress of boot parameters */
64*c1393bb3SVeli-Pekka Peltola 	gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
65*c1393bb3SVeli-Pekka Peltola 
66*c1393bb3SVeli-Pekka Peltola 	return 0;
67*c1393bb3SVeli-Pekka Peltola }
68*c1393bb3SVeli-Pekka Peltola 
69*c1393bb3SVeli-Pekka Peltola #ifdef CONFIG_CMD_MMC
70*c1393bb3SVeli-Pekka Peltola int board_mmc_init(bd_t *bis)
71*c1393bb3SVeli-Pekka Peltola {
72*c1393bb3SVeli-Pekka Peltola 	return mxsmmc_initialize(bis, 0, NULL);
73*c1393bb3SVeli-Pekka Peltola }
74*c1393bb3SVeli-Pekka Peltola #endif
75*c1393bb3SVeli-Pekka Peltola 
76*c1393bb3SVeli-Pekka Peltola 
77*c1393bb3SVeli-Pekka Peltola #ifdef CONFIG_CMD_NET
78*c1393bb3SVeli-Pekka Peltola 
79*c1393bb3SVeli-Pekka Peltola #define MII_PHY_CTRL2 0x1f
80*c1393bb3SVeli-Pekka Peltola int fecmxc_mii_postcall(int phy)
81*c1393bb3SVeli-Pekka Peltola {
82*c1393bb3SVeli-Pekka Peltola 	/* change PHY RMII clock to 50MHz */
83*c1393bb3SVeli-Pekka Peltola 	miiphy_write("FEC", 0, MII_PHY_CTRL2, 0x8180);
84*c1393bb3SVeli-Pekka Peltola 
85*c1393bb3SVeli-Pekka Peltola 	return 0;
86*c1393bb3SVeli-Pekka Peltola }
87*c1393bb3SVeli-Pekka Peltola 
88*c1393bb3SVeli-Pekka Peltola int board_eth_init(bd_t *bis)
89*c1393bb3SVeli-Pekka Peltola {
90*c1393bb3SVeli-Pekka Peltola 	int ret;
91*c1393bb3SVeli-Pekka Peltola 	struct eth_device *dev;
92*c1393bb3SVeli-Pekka Peltola 
93*c1393bb3SVeli-Pekka Peltola 	ret = cpu_eth_init(bis);
94*c1393bb3SVeli-Pekka Peltola 	if (ret) {
95*c1393bb3SVeli-Pekka Peltola 		printf("FEC MXS: Unable to init FEC clocks\n");
96*c1393bb3SVeli-Pekka Peltola 		return ret;
97*c1393bb3SVeli-Pekka Peltola 	}
98*c1393bb3SVeli-Pekka Peltola 
99*c1393bb3SVeli-Pekka Peltola 	ret = fecmxc_initialize(bis);
100*c1393bb3SVeli-Pekka Peltola 	if (ret) {
101*c1393bb3SVeli-Pekka Peltola 		printf("FEC MXS: Unable to init FEC\n");
102*c1393bb3SVeli-Pekka Peltola 		return ret;
103*c1393bb3SVeli-Pekka Peltola 	}
104*c1393bb3SVeli-Pekka Peltola 
105*c1393bb3SVeli-Pekka Peltola 	dev = eth_get_dev_by_name("FEC");
106*c1393bb3SVeli-Pekka Peltola 	if (!dev) {
107*c1393bb3SVeli-Pekka Peltola 		printf("FEC MXS: Unable to get FEC device entry\n");
108*c1393bb3SVeli-Pekka Peltola 		return -EINVAL;
109*c1393bb3SVeli-Pekka Peltola 	}
110*c1393bb3SVeli-Pekka Peltola 
111*c1393bb3SVeli-Pekka Peltola 	ret = fecmxc_register_mii_postcall(dev, fecmxc_mii_postcall);
112*c1393bb3SVeli-Pekka Peltola 	if (ret) {
113*c1393bb3SVeli-Pekka Peltola 		printf("FEC MXS: Unable to register FEC MII postcall\n");
114*c1393bb3SVeli-Pekka Peltola 		return ret;
115*c1393bb3SVeli-Pekka Peltola 	}
116*c1393bb3SVeli-Pekka Peltola 
117*c1393bb3SVeli-Pekka Peltola 	return ret;
118*c1393bb3SVeli-Pekka Peltola }
119*c1393bb3SVeli-Pekka Peltola #endif
120*c1393bb3SVeli-Pekka Peltola 
121*c1393bb3SVeli-Pekka Peltola #ifdef CONFIG_SERIAL_TAG
122*c1393bb3SVeli-Pekka Peltola #define MXS_OCOTP_MAX_TIMEOUT 1000000
123*c1393bb3SVeli-Pekka Peltola void get_board_serial(struct tag_serialnr *serialnr)
124*c1393bb3SVeli-Pekka Peltola {
125*c1393bb3SVeli-Pekka Peltola 	struct mx28_ocotp_regs *ocotp_regs =
126*c1393bb3SVeli-Pekka Peltola 		(struct mx28_ocotp_regs *)MXS_OCOTP_BASE;
127*c1393bb3SVeli-Pekka Peltola 
128*c1393bb3SVeli-Pekka Peltola 	serialnr->high = 0;
129*c1393bb3SVeli-Pekka Peltola 	serialnr->low = 0;
130*c1393bb3SVeli-Pekka Peltola 
131*c1393bb3SVeli-Pekka Peltola 	writel(OCOTP_CTRL_RD_BANK_OPEN, &ocotp_regs->hw_ocotp_ctrl_set);
132*c1393bb3SVeli-Pekka Peltola 
133*c1393bb3SVeli-Pekka Peltola 	if (mx28_wait_mask_clr(&ocotp_regs->hw_ocotp_ctrl_reg, OCOTP_CTRL_BUSY,
134*c1393bb3SVeli-Pekka Peltola 		MXS_OCOTP_MAX_TIMEOUT)) {
135*c1393bb3SVeli-Pekka Peltola 		printf("MXS: Can't get serial number from OCOTP\n");
136*c1393bb3SVeli-Pekka Peltola 		return;
137*c1393bb3SVeli-Pekka Peltola 	}
138*c1393bb3SVeli-Pekka Peltola 
139*c1393bb3SVeli-Pekka Peltola 	serialnr->low = readl(&ocotp_regs->hw_ocotp_cust3);
140*c1393bb3SVeli-Pekka Peltola }
141*c1393bb3SVeli-Pekka Peltola #endif
142*c1393bb3SVeli-Pekka Peltola 
143*c1393bb3SVeli-Pekka Peltola #ifdef CONFIG_REVISION_TAG
144*c1393bb3SVeli-Pekka Peltola u32 get_board_rev(void)
145*c1393bb3SVeli-Pekka Peltola {
146*c1393bb3SVeli-Pekka Peltola 	if (getenv("revision#") != NULL)
147*c1393bb3SVeli-Pekka Peltola 		return simple_strtoul(getenv("revision#"), NULL, 10);
148*c1393bb3SVeli-Pekka Peltola 	return 0;
149*c1393bb3SVeli-Pekka Peltola }
150*c1393bb3SVeli-Pekka Peltola #endif
151