1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (C) 2016 NXP Semiconductors
3*4882a593Smuzhiyun * Author: Fabio Estevam <fabio.estevam@nxp.com>
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #include <asm/arch/clock.h>
9*4882a593Smuzhiyun #include <asm/arch/imx-regs.h>
10*4882a593Smuzhiyun #include <asm/arch/mx7-pins.h>
11*4882a593Smuzhiyun #include <asm/arch/sys_proto.h>
12*4882a593Smuzhiyun #include <asm/gpio.h>
13*4882a593Smuzhiyun #include <asm/mach-imx/iomux-v3.h>
14*4882a593Smuzhiyun #include <asm/mach-imx/mxc_i2c.h>
15*4882a593Smuzhiyun #include <asm/io.h>
16*4882a593Smuzhiyun #include <common.h>
17*4882a593Smuzhiyun #include <fsl_esdhc.h>
18*4882a593Smuzhiyun #include <i2c.h>
19*4882a593Smuzhiyun #include <mmc.h>
20*4882a593Smuzhiyun #include <asm/arch/crm_regs.h>
21*4882a593Smuzhiyun #include <usb.h>
22*4882a593Smuzhiyun #include <netdev.h>
23*4882a593Smuzhiyun #include <power/pmic.h>
24*4882a593Smuzhiyun #include <power/pfuze3000_pmic.h>
25*4882a593Smuzhiyun #include "../freescale/common/pfuze.h"
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun #define UART_PAD_CTRL (PAD_CTL_DSE_3P3V_49OHM | PAD_CTL_PUS_PU100KOHM | \
30*4882a593Smuzhiyun PAD_CTL_HYS)
31*4882a593Smuzhiyun #define USDHC_PAD_CTRL (PAD_CTL_DSE_3P3V_32OHM | PAD_CTL_SRE_SLOW | \
32*4882a593Smuzhiyun PAD_CTL_HYS | PAD_CTL_PUE | PAD_CTL_PUS_PU47KOHM)
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun #define I2C_PAD_CTRL (PAD_CTL_DSE_3P3V_32OHM | PAD_CTL_SRE_SLOW | \
35*4882a593Smuzhiyun PAD_CTL_HYS | PAD_CTL_PUE | PAD_CTL_PUS_PU100KOHM)
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun #ifdef CONFIG_SYS_I2C_MXC
38*4882a593Smuzhiyun #define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
39*4882a593Smuzhiyun /* I2C1 for PMIC */
40*4882a593Smuzhiyun static struct i2c_pads_info i2c_pad_info1 = {
41*4882a593Smuzhiyun .scl = {
42*4882a593Smuzhiyun .i2c_mode = MX7D_PAD_I2C1_SCL__I2C1_SCL | PC,
43*4882a593Smuzhiyun .gpio_mode = MX7D_PAD_I2C1_SCL__GPIO4_IO8 | PC,
44*4882a593Smuzhiyun .gp = IMX_GPIO_NR(4, 8),
45*4882a593Smuzhiyun },
46*4882a593Smuzhiyun .sda = {
47*4882a593Smuzhiyun .i2c_mode = MX7D_PAD_I2C1_SDA__I2C1_SDA | PC,
48*4882a593Smuzhiyun .gpio_mode = MX7D_PAD_I2C1_SDA__GPIO4_IO9 | PC,
49*4882a593Smuzhiyun .gp = IMX_GPIO_NR(4, 9),
50*4882a593Smuzhiyun },
51*4882a593Smuzhiyun };
52*4882a593Smuzhiyun #endif
53*4882a593Smuzhiyun
dram_init(void)54*4882a593Smuzhiyun int dram_init(void)
55*4882a593Smuzhiyun {
56*4882a593Smuzhiyun gd->ram_size = PHYS_SDRAM_SIZE;
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun return 0;
59*4882a593Smuzhiyun }
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun static iomux_v3_cfg_t const wdog_pads[] = {
62*4882a593Smuzhiyun MX7D_PAD_GPIO1_IO00__WDOG1_WDOG_B | MUX_PAD_CTRL(NO_PAD_CTRL),
63*4882a593Smuzhiyun };
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun static iomux_v3_cfg_t const uart1_pads[] = {
66*4882a593Smuzhiyun MX7D_PAD_UART1_TX_DATA__UART1_DCE_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
67*4882a593Smuzhiyun MX7D_PAD_UART1_RX_DATA__UART1_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun static iomux_v3_cfg_t const usdhc3_pads[] = {
71*4882a593Smuzhiyun MX7D_PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
72*4882a593Smuzhiyun MX7D_PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
73*4882a593Smuzhiyun MX7D_PAD_SD3_DATA0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
74*4882a593Smuzhiyun MX7D_PAD_SD3_DATA1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
75*4882a593Smuzhiyun MX7D_PAD_SD3_DATA2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
76*4882a593Smuzhiyun MX7D_PAD_SD3_DATA3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
77*4882a593Smuzhiyun MX7D_PAD_SD3_DATA4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
78*4882a593Smuzhiyun MX7D_PAD_SD3_DATA5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
79*4882a593Smuzhiyun MX7D_PAD_SD3_DATA6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
80*4882a593Smuzhiyun MX7D_PAD_SD3_DATA7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
81*4882a593Smuzhiyun MX7D_PAD_SD3_RESET_B__SD3_RESET_B | MUX_PAD_CTRL(USDHC_PAD_CTRL),
82*4882a593Smuzhiyun };
83*4882a593Smuzhiyun
setup_iomux_uart(void)84*4882a593Smuzhiyun static void setup_iomux_uart(void)
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
87*4882a593Smuzhiyun };
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun static struct fsl_esdhc_cfg usdhc_cfg[1] = {
90*4882a593Smuzhiyun {USDHC3_BASE_ADDR},
91*4882a593Smuzhiyun };
92*4882a593Smuzhiyun
board_mmc_getcd(struct mmc * mmc)93*4882a593Smuzhiyun int board_mmc_getcd(struct mmc *mmc)
94*4882a593Smuzhiyun {
95*4882a593Smuzhiyun /* Assume uSDHC3 emmc is always present */
96*4882a593Smuzhiyun return 1;
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun
board_mmc_init(bd_t * bis)99*4882a593Smuzhiyun int board_mmc_init(bd_t *bis)
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun imx_iomux_v3_setup_multiple_pads(usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
102*4882a593Smuzhiyun usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
105*4882a593Smuzhiyun }
106*4882a593Smuzhiyun
board_early_init_f(void)107*4882a593Smuzhiyun int board_early_init_f(void)
108*4882a593Smuzhiyun {
109*4882a593Smuzhiyun setup_iomux_uart();
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun return 0;
112*4882a593Smuzhiyun }
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun #ifdef CONFIG_POWER
115*4882a593Smuzhiyun #define I2C_PMIC 0
116*4882a593Smuzhiyun static struct pmic *pfuze;
power_init_board(void)117*4882a593Smuzhiyun int power_init_board(void)
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun int ret;
120*4882a593Smuzhiyun unsigned int reg, rev_id;
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun ret = power_pfuze3000_init(I2C_PMIC);
123*4882a593Smuzhiyun if (ret)
124*4882a593Smuzhiyun return ret;
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun pfuze = pmic_get("PFUZE3000");
127*4882a593Smuzhiyun ret = pmic_probe(pfuze);
128*4882a593Smuzhiyun if (ret)
129*4882a593Smuzhiyun return ret;
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun pmic_reg_read(pfuze, PFUZE3000_DEVICEID, ®);
132*4882a593Smuzhiyun pmic_reg_read(pfuze, PFUZE3000_REVID, &rev_id);
133*4882a593Smuzhiyun printf("PMIC: PFUZE3000 DEV_ID=0x%x REV_ID=0x%x\n", reg, rev_id);
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun /* disable Low Power Mode during standby mode */
136*4882a593Smuzhiyun pmic_reg_write(pfuze, PFUZE3000_LDOGCTL, 0x1);
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun return 0;
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun #endif
141*4882a593Smuzhiyun
board_eth_init(bd_t * bis)142*4882a593Smuzhiyun int board_eth_init(bd_t *bis)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun int ret = 0;
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun #ifdef CONFIG_USB_ETHER
147*4882a593Smuzhiyun ret = usb_eth_initialize(bis);
148*4882a593Smuzhiyun if (ret < 0)
149*4882a593Smuzhiyun printf("Error %d registering USB ether.\n", ret);
150*4882a593Smuzhiyun #endif
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun return ret;
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun
board_init(void)155*4882a593Smuzhiyun int board_init(void)
156*4882a593Smuzhiyun {
157*4882a593Smuzhiyun /* address of boot parameters */
158*4882a593Smuzhiyun gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun #ifdef CONFIG_SYS_I2C_MXC
161*4882a593Smuzhiyun setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
162*4882a593Smuzhiyun #endif
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun return 0;
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun
checkboard(void)167*4882a593Smuzhiyun int checkboard(void)
168*4882a593Smuzhiyun {
169*4882a593Smuzhiyun char *mode;
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun if (IS_ENABLED(CONFIG_ARMV7_BOOT_SEC_DEFAULT))
172*4882a593Smuzhiyun mode = "secure";
173*4882a593Smuzhiyun else
174*4882a593Smuzhiyun mode = "non-secure";
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun printf("Board: WARP7 in %s mode\n", mode);
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun return 0;
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun
board_usb_phy_mode(int port)181*4882a593Smuzhiyun int board_usb_phy_mode(int port)
182*4882a593Smuzhiyun {
183*4882a593Smuzhiyun return USB_INIT_DEVICE;
184*4882a593Smuzhiyun }
185*4882a593Smuzhiyun
board_late_init(void)186*4882a593Smuzhiyun int board_late_init(void)
187*4882a593Smuzhiyun {
188*4882a593Smuzhiyun struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun imx_iomux_v3_setup_multiple_pads(wdog_pads, ARRAY_SIZE(wdog_pads));
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun set_wdog_reset(wdog);
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun /*
195*4882a593Smuzhiyun * Do not assert internal WDOG_RESET_B_DEB(controlled by bit 4),
196*4882a593Smuzhiyun * since we use PMIC_PWRON to reset the board.
197*4882a593Smuzhiyun */
198*4882a593Smuzhiyun clrsetbits_le16(&wdog->wcr, 0, 0x10);
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun return 0;
201*4882a593Smuzhiyun }
202