1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
211bd5e7bSLukasz Majewski /*
311bd5e7bSLukasz Majewski * Copyright (C) 2016-2017
411bd5e7bSLukasz Majewski * Lukasz Majewski, DENX Software Engineering, lukma@denx.de
511bd5e7bSLukasz Majewski */
611bd5e7bSLukasz Majewski
711bd5e7bSLukasz Majewski #include <common.h>
811bd5e7bSLukasz Majewski #include <asm/arch/clock.h>
911bd5e7bSLukasz Majewski #include <asm/arch/iomux.h>
1011bd5e7bSLukasz Majewski #include <asm/arch/imx-regs.h>
1111bd5e7bSLukasz Majewski #include <asm/arch/mx6-pins.h>
1211bd5e7bSLukasz Majewski #include <asm/arch/sys_proto.h>
1311bd5e7bSLukasz Majewski #include <asm/gpio.h>
14552a848eSStefano Babic #include <asm/mach-imx/iomux-v3.h>
15552a848eSStefano Babic #include <asm/mach-imx/mxc_i2c.h>
16552a848eSStefano Babic #include <asm/mach-imx/spi.h>
17552a848eSStefano Babic #include <asm/mach-imx/boot_mode.h>
1811bd5e7bSLukasz Majewski #include <asm/io.h>
1911bd5e7bSLukasz Majewski #include <fsl_esdhc.h>
2011bd5e7bSLukasz Majewski #include <mmc.h>
2111bd5e7bSLukasz Majewski #include <netdev.h>
2211bd5e7bSLukasz Majewski #include <micrel.h>
2311bd5e7bSLukasz Majewski #include <phy.h>
2411bd5e7bSLukasz Majewski #include <input.h>
2511bd5e7bSLukasz Majewski #include <i2c.h>
2611bd5e7bSLukasz Majewski #include <spl.h>
2711bd5e7bSLukasz Majewski
2811bd5e7bSLukasz Majewski DECLARE_GLOBAL_DATA_PTR;
2911bd5e7bSLukasz Majewski
3011bd5e7bSLukasz Majewski #define UART_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
3111bd5e7bSLukasz Majewski PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | \
3211bd5e7bSLukasz Majewski PAD_CTL_SRE_FAST | PAD_CTL_HYS)
3311bd5e7bSLukasz Majewski
3411bd5e7bSLukasz Majewski #define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP | \
3511bd5e7bSLukasz Majewski PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm | \
3611bd5e7bSLukasz Majewski PAD_CTL_SRE_FAST | PAD_CTL_HYS)
3711bd5e7bSLukasz Majewski
3811bd5e7bSLukasz Majewski #define ENET_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
3911bd5e7bSLukasz Majewski PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
4011bd5e7bSLukasz Majewski
4111bd5e7bSLukasz Majewski #define SPI_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_SPEED_MED | \
4211bd5e7bSLukasz Majewski PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST)
4311bd5e7bSLukasz Majewski
4411bd5e7bSLukasz Majewski #define I2C_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
4511bd5e7bSLukasz Majewski PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS | \
4611bd5e7bSLukasz Majewski PAD_CTL_ODE | PAD_CTL_SRE_FAST)
4711bd5e7bSLukasz Majewski
4811bd5e7bSLukasz Majewski #define WEIM_NOR_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
4911bd5e7bSLukasz Majewski PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
5011bd5e7bSLukasz Majewski PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST)
5111bd5e7bSLukasz Majewski
5211bd5e7bSLukasz Majewski #define USDHC2_CD_GPIO IMX_GPIO_NR(1, 4)
5311bd5e7bSLukasz Majewski #define ETH_PHY_RESET IMX_GPIO_NR(1, 27)
5411bd5e7bSLukasz Majewski #define ECSPI3_CS0 IMX_GPIO_NR(4, 24)
5511bd5e7bSLukasz Majewski #define ECSPI3_FLWP IMX_GPIO_NR(4, 27)
5611bd5e7bSLukasz Majewski #define NOR_WP IMX_GPIO_NR(1, 1)
5711bd5e7bSLukasz Majewski #define DISPLAY_EN IMX_GPIO_NR(1, 2)
5811bd5e7bSLukasz Majewski
dram_init(void)5911bd5e7bSLukasz Majewski int dram_init(void)
6011bd5e7bSLukasz Majewski {
6111bd5e7bSLukasz Majewski gd->ram_size = imx_ddr_size();
6211bd5e7bSLukasz Majewski
6311bd5e7bSLukasz Majewski return 0;
6411bd5e7bSLukasz Majewski }
6511bd5e7bSLukasz Majewski
6611bd5e7bSLukasz Majewski static iomux_v3_cfg_t const uart1_pads[] = {
6711bd5e7bSLukasz Majewski IOMUX_PADS(PAD_CSI0_DAT10__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
6811bd5e7bSLukasz Majewski IOMUX_PADS(PAD_CSI0_DAT11__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
6911bd5e7bSLukasz Majewski };
7011bd5e7bSLukasz Majewski
7111bd5e7bSLukasz Majewski static iomux_v3_cfg_t const usdhc2_pads[] = {
7211bd5e7bSLukasz Majewski IOMUX_PADS(PAD_SD2_CLK__SD2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
7311bd5e7bSLukasz Majewski IOMUX_PADS(PAD_SD2_CMD__SD2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
7411bd5e7bSLukasz Majewski IOMUX_PADS(PAD_SD2_DAT0__SD2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
7511bd5e7bSLukasz Majewski IOMUX_PADS(PAD_SD2_DAT1__SD2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
7611bd5e7bSLukasz Majewski IOMUX_PADS(PAD_SD2_DAT2__SD2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
7711bd5e7bSLukasz Majewski IOMUX_PADS(PAD_SD2_DAT3__SD2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
7811bd5e7bSLukasz Majewski /* Carrier MicroSD Card Detect */
7911bd5e7bSLukasz Majewski IOMUX_PADS(PAD_GPIO_4__GPIO1_IO04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
8011bd5e7bSLukasz Majewski };
8111bd5e7bSLukasz Majewski
8211bd5e7bSLukasz Majewski static iomux_v3_cfg_t const usdhc3_pads[] = {
8311bd5e7bSLukasz Majewski IOMUX_PADS(PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
8411bd5e7bSLukasz Majewski IOMUX_PADS(PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
8511bd5e7bSLukasz Majewski IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
8611bd5e7bSLukasz Majewski IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
8711bd5e7bSLukasz Majewski IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
8811bd5e7bSLukasz Majewski IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
8911bd5e7bSLukasz Majewski IOMUX_PADS(PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
9011bd5e7bSLukasz Majewski IOMUX_PADS(PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
9111bd5e7bSLukasz Majewski IOMUX_PADS(PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
9211bd5e7bSLukasz Majewski IOMUX_PADS(PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
9311bd5e7bSLukasz Majewski IOMUX_PADS(PAD_SD3_RST__SD3_RESET | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
9411bd5e7bSLukasz Majewski };
9511bd5e7bSLukasz Majewski
9611bd5e7bSLukasz Majewski static iomux_v3_cfg_t const enet_pads[] = {
9711bd5e7bSLukasz Majewski IOMUX_PADS(PAD_ENET_MDIO__ENET_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL)),
9811bd5e7bSLukasz Majewski IOMUX_PADS(PAD_ENET_MDC__ENET_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
9911bd5e7bSLukasz Majewski IOMUX_PADS(PAD_RGMII_TXC__RGMII_TXC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
10011bd5e7bSLukasz Majewski IOMUX_PADS(PAD_RGMII_TD0__RGMII_TD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
10111bd5e7bSLukasz Majewski IOMUX_PADS(PAD_RGMII_TD1__RGMII_TD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
10211bd5e7bSLukasz Majewski IOMUX_PADS(PAD_RGMII_TD2__RGMII_TD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
10311bd5e7bSLukasz Majewski IOMUX_PADS(PAD_RGMII_TD3__RGMII_TD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
10411bd5e7bSLukasz Majewski IOMUX_PADS(PAD_RGMII_TX_CTL__RGMII_TX_CTL
10511bd5e7bSLukasz Majewski | MUX_PAD_CTRL(ENET_PAD_CTRL)),
10611bd5e7bSLukasz Majewski IOMUX_PADS(PAD_ENET_REF_CLK__ENET_TX_CLK
10711bd5e7bSLukasz Majewski | MUX_PAD_CTRL(ENET_PAD_CTRL)),
10811bd5e7bSLukasz Majewski IOMUX_PADS(PAD_RGMII_RXC__RGMII_RXC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
10911bd5e7bSLukasz Majewski IOMUX_PADS(PAD_RGMII_RD0__RGMII_RD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
11011bd5e7bSLukasz Majewski IOMUX_PADS(PAD_RGMII_RD1__RGMII_RD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
11111bd5e7bSLukasz Majewski IOMUX_PADS(PAD_RGMII_RD2__RGMII_RD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
11211bd5e7bSLukasz Majewski IOMUX_PADS(PAD_RGMII_RD3__RGMII_RD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
11311bd5e7bSLukasz Majewski IOMUX_PADS(PAD_RGMII_RX_CTL__RGMII_RX_CTL
11411bd5e7bSLukasz Majewski | MUX_PAD_CTRL(ENET_PAD_CTRL)),
11511bd5e7bSLukasz Majewski /* KSZ9031 PHY Reset */
11611bd5e7bSLukasz Majewski IOMUX_PADS(PAD_ENET_RXD0__GPIO1_IO27 | MUX_PAD_CTRL(NO_PAD_CTRL)),
11711bd5e7bSLukasz Majewski };
11811bd5e7bSLukasz Majewski
setup_iomux_uart(void)11911bd5e7bSLukasz Majewski static void setup_iomux_uart(void)
12011bd5e7bSLukasz Majewski {
12111bd5e7bSLukasz Majewski SETUP_IOMUX_PADS(uart1_pads);
12211bd5e7bSLukasz Majewski }
12311bd5e7bSLukasz Majewski
setup_iomux_enet(void)12411bd5e7bSLukasz Majewski static void setup_iomux_enet(void)
12511bd5e7bSLukasz Majewski {
12611bd5e7bSLukasz Majewski SETUP_IOMUX_PADS(enet_pads);
12711bd5e7bSLukasz Majewski
12811bd5e7bSLukasz Majewski /* Reset KSZ9031 PHY */
12911bd5e7bSLukasz Majewski gpio_direction_output(ETH_PHY_RESET, 0);
13011bd5e7bSLukasz Majewski mdelay(10);
13111bd5e7bSLukasz Majewski gpio_set_value(ETH_PHY_RESET, 1);
13211bd5e7bSLukasz Majewski udelay(100);
13311bd5e7bSLukasz Majewski }
13411bd5e7bSLukasz Majewski
13511bd5e7bSLukasz Majewski static struct fsl_esdhc_cfg usdhc_cfg[2] = {
13611bd5e7bSLukasz Majewski {USDHC3_BASE_ADDR},
13711bd5e7bSLukasz Majewski {USDHC2_BASE_ADDR},
13811bd5e7bSLukasz Majewski };
13911bd5e7bSLukasz Majewski
board_mmc_getcd(struct mmc * mmc)14011bd5e7bSLukasz Majewski int board_mmc_getcd(struct mmc *mmc)
14111bd5e7bSLukasz Majewski {
14211bd5e7bSLukasz Majewski struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
14311bd5e7bSLukasz Majewski int ret = 0;
14411bd5e7bSLukasz Majewski
14511bd5e7bSLukasz Majewski switch (cfg->esdhc_base) {
14611bd5e7bSLukasz Majewski case USDHC2_BASE_ADDR:
14711bd5e7bSLukasz Majewski ret = !gpio_get_value(USDHC2_CD_GPIO);
14811bd5e7bSLukasz Majewski break;
14911bd5e7bSLukasz Majewski case USDHC3_BASE_ADDR:
15011bd5e7bSLukasz Majewski /*
15111bd5e7bSLukasz Majewski * eMMC don't have card detect pin - since it is soldered to the
15211bd5e7bSLukasz Majewski * PCB board
15311bd5e7bSLukasz Majewski */
15411bd5e7bSLukasz Majewski ret = 1;
15511bd5e7bSLukasz Majewski break;
15611bd5e7bSLukasz Majewski }
15711bd5e7bSLukasz Majewski return ret;
15811bd5e7bSLukasz Majewski }
15911bd5e7bSLukasz Majewski
board_mmc_init(bd_t * bis)16011bd5e7bSLukasz Majewski int board_mmc_init(bd_t *bis)
16111bd5e7bSLukasz Majewski {
16211bd5e7bSLukasz Majewski int ret;
16311bd5e7bSLukasz Majewski u32 index = 0;
16411bd5e7bSLukasz Majewski
16511bd5e7bSLukasz Majewski /*
16611bd5e7bSLukasz Majewski * MMC MAP
16711bd5e7bSLukasz Majewski * (U-Boot device node) (Physical Port)
16811bd5e7bSLukasz Majewski * mmc0 Soldered on board eMMC device
16911bd5e7bSLukasz Majewski * mmc1 MicroSD card
17011bd5e7bSLukasz Majewski */
17111bd5e7bSLukasz Majewski for (index = 0; index < CONFIG_SYS_FSL_USDHC_NUM; ++index) {
17211bd5e7bSLukasz Majewski switch (index) {
17311bd5e7bSLukasz Majewski case 0:
17411bd5e7bSLukasz Majewski SETUP_IOMUX_PADS(usdhc3_pads);
17511bd5e7bSLukasz Majewski usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
17611bd5e7bSLukasz Majewski usdhc_cfg[0].max_bus_width = 8;
17711bd5e7bSLukasz Majewski break;
17811bd5e7bSLukasz Majewski case 1:
17911bd5e7bSLukasz Majewski SETUP_IOMUX_PADS(usdhc2_pads);
18011bd5e7bSLukasz Majewski usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
18111bd5e7bSLukasz Majewski usdhc_cfg[1].max_bus_width = 4;
18211bd5e7bSLukasz Majewski gpio_direction_input(USDHC2_CD_GPIO);
18311bd5e7bSLukasz Majewski break;
18411bd5e7bSLukasz Majewski default:
18511bd5e7bSLukasz Majewski printf("Warning: More USDHC controllers (%d) than supported (%d)\n",
18611bd5e7bSLukasz Majewski index + 1, CONFIG_SYS_FSL_USDHC_NUM);
18711bd5e7bSLukasz Majewski return -EINVAL;
18811bd5e7bSLukasz Majewski }
18911bd5e7bSLukasz Majewski
19011bd5e7bSLukasz Majewski ret = fsl_esdhc_initialize(bis, &usdhc_cfg[index]);
19111bd5e7bSLukasz Majewski if (ret)
19211bd5e7bSLukasz Majewski return ret;
19311bd5e7bSLukasz Majewski }
19411bd5e7bSLukasz Majewski
19511bd5e7bSLukasz Majewski return 0;
19611bd5e7bSLukasz Majewski }
19711bd5e7bSLukasz Majewski
19811bd5e7bSLukasz Majewski static iomux_v3_cfg_t const eimnor_pads[] = {
19911bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_D16__EIM_DATA16 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
20011bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_D17__EIM_DATA17 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
20111bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_D18__EIM_DATA18 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
20211bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_D19__EIM_DATA19 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
20311bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_D20__EIM_DATA20 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
20411bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_D21__EIM_DATA21 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
20511bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_D22__EIM_DATA22 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
20611bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_D23__EIM_DATA23 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
20711bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_D24__EIM_DATA24 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
20811bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_D25__EIM_DATA25 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
20911bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_D26__EIM_DATA26 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
21011bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_D27__EIM_DATA27 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
21111bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_D28__EIM_DATA28 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
21211bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_D29__EIM_DATA29 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
21311bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_D30__EIM_DATA30 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
21411bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_D31__EIM_DATA31 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
21511bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_DA0__EIM_AD00 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
21611bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_DA1__EIM_AD01 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
21711bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_DA2__EIM_AD02 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
21811bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_DA3__EIM_AD03 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
21911bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_DA4__EIM_AD04 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
22011bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_DA5__EIM_AD05 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
22111bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_DA6__EIM_AD06 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
22211bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_DA7__EIM_AD07 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
22311bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_DA8__EIM_AD08 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
22411bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_DA9__EIM_AD09 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
22511bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_DA10__EIM_AD10 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
22611bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_DA11__EIM_AD11 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
22711bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_DA12__EIM_AD12 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
22811bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_DA13__EIM_AD13 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
22911bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_DA14__EIM_AD14 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
23011bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_DA15__EIM_AD15 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
23111bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_A16__EIM_ADDR16 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
23211bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_A17__EIM_ADDR17 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
23311bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_A18__EIM_ADDR18 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
23411bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_A19__EIM_ADDR19 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
23511bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_A20__EIM_ADDR20 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
23611bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_A21__EIM_ADDR21 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
23711bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_A22__EIM_ADDR22 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
23811bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_A23__EIM_ADDR23 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
23911bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_A24__EIM_ADDR24 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
24011bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_A25__EIM_ADDR25 | MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
24111bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_OE__EIM_OE_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
24211bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_RW__EIM_RW | MUX_PAD_CTRL(NO_PAD_CTRL)),
24311bd5e7bSLukasz Majewski IOMUX_PADS(PAD_EIM_CS0__EIM_CS0_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
24411bd5e7bSLukasz Majewski IOMUX_PADS(PAD_GPIO_1__GPIO1_IO01 | MUX_PAD_CTRL(NO_PAD_CTRL)),
24511bd5e7bSLukasz Majewski };
24611bd5e7bSLukasz Majewski
eimnor_cs_setup(void)24711bd5e7bSLukasz Majewski static void eimnor_cs_setup(void)
24811bd5e7bSLukasz Majewski {
24911bd5e7bSLukasz Majewski struct weim *weim_regs = (struct weim *)WEIM_BASE_ADDR;
25011bd5e7bSLukasz Majewski
25111bd5e7bSLukasz Majewski
25211bd5e7bSLukasz Majewski /* NOR configuration */
25311bd5e7bSLukasz Majewski writel(0x00620181, &weim_regs->cs0gcr1);
25411bd5e7bSLukasz Majewski writel(0x00000001, &weim_regs->cs0gcr2);
25511bd5e7bSLukasz Majewski writel(0x0b020000, &weim_regs->cs0rcr1);
25611bd5e7bSLukasz Majewski writel(0x0000b000, &weim_regs->cs0rcr2);
25711bd5e7bSLukasz Majewski writel(0x0804a240, &weim_regs->cs0wcr1);
25811bd5e7bSLukasz Majewski writel(0x00000000, &weim_regs->cs0wcr2);
25911bd5e7bSLukasz Majewski
26011bd5e7bSLukasz Majewski writel(0x00000120, &weim_regs->wcr);
26111bd5e7bSLukasz Majewski writel(0x00000010, &weim_regs->wiar);
26211bd5e7bSLukasz Majewski writel(0x00000000, &weim_regs->ear);
26311bd5e7bSLukasz Majewski
26411bd5e7bSLukasz Majewski set_chipselect_size(CS0_128);
26511bd5e7bSLukasz Majewski }
26611bd5e7bSLukasz Majewski
setup_eimnor(void)26711bd5e7bSLukasz Majewski static void setup_eimnor(void)
26811bd5e7bSLukasz Majewski {
26911bd5e7bSLukasz Majewski SETUP_IOMUX_PADS(eimnor_pads);
27011bd5e7bSLukasz Majewski gpio_direction_output(NOR_WP, 1);
27111bd5e7bSLukasz Majewski
27211bd5e7bSLukasz Majewski enable_eim_clk(1);
27311bd5e7bSLukasz Majewski eimnor_cs_setup();
27411bd5e7bSLukasz Majewski }
27511bd5e7bSLukasz Majewski
27611bd5e7bSLukasz Majewski /* mccmon6 board has SPI Flash is connected to SPI3 */
board_spi_cs_gpio(unsigned bus,unsigned cs)27711bd5e7bSLukasz Majewski int board_spi_cs_gpio(unsigned bus, unsigned cs)
27811bd5e7bSLukasz Majewski {
27911bd5e7bSLukasz Majewski return (bus == 2 && cs == 0) ? ECSPI3_CS0 : -1;
28011bd5e7bSLukasz Majewski }
28111bd5e7bSLukasz Majewski
28211bd5e7bSLukasz Majewski static iomux_v3_cfg_t const ecspi3_pads[] = {
28311bd5e7bSLukasz Majewski /* SPI3 */
28411bd5e7bSLukasz Majewski IOMUX_PADS(PAD_DISP0_DAT3__GPIO4_IO24 | MUX_PAD_CTRL(NO_PAD_CTRL)),
28511bd5e7bSLukasz Majewski IOMUX_PADS(PAD_DISP0_DAT2__ECSPI3_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL)),
28611bd5e7bSLukasz Majewski IOMUX_PADS(PAD_DISP0_DAT1__ECSPI3_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL)),
28711bd5e7bSLukasz Majewski IOMUX_PADS(PAD_DISP0_DAT0__ECSPI3_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL)),
28811bd5e7bSLukasz Majewski };
28911bd5e7bSLukasz Majewski
setup_spi(void)29011bd5e7bSLukasz Majewski void setup_spi(void)
29111bd5e7bSLukasz Majewski {
29211bd5e7bSLukasz Majewski SETUP_IOMUX_PADS(ecspi3_pads);
29311bd5e7bSLukasz Majewski
29411bd5e7bSLukasz Majewski enable_spi_clk(true, 2);
29511bd5e7bSLukasz Majewski
29611bd5e7bSLukasz Majewski /* set cs0 to high */
29711bd5e7bSLukasz Majewski gpio_direction_output(ECSPI3_CS0, 1);
29811bd5e7bSLukasz Majewski
29911bd5e7bSLukasz Majewski /* set flwp to high */
30011bd5e7bSLukasz Majewski gpio_direction_output(ECSPI3_FLWP, 1);
30111bd5e7bSLukasz Majewski }
30211bd5e7bSLukasz Majewski
30311bd5e7bSLukasz Majewski struct i2c_pads_info mx6q_i2c1_pad_info = {
30411bd5e7bSLukasz Majewski .scl = {
30511bd5e7bSLukasz Majewski .i2c_mode = MX6Q_PAD_CSI0_DAT9__I2C1_SCL
30611bd5e7bSLukasz Majewski | MUX_PAD_CTRL(I2C_PAD_CTRL),
30711bd5e7bSLukasz Majewski .gpio_mode = MX6Q_PAD_CSI0_DAT9__GPIO5_IO27
30811bd5e7bSLukasz Majewski | MUX_PAD_CTRL(I2C_PAD_CTRL),
30911bd5e7bSLukasz Majewski .gp = IMX_GPIO_NR(5, 27)
31011bd5e7bSLukasz Majewski },
31111bd5e7bSLukasz Majewski .sda = {
31211bd5e7bSLukasz Majewski .i2c_mode = MX6Q_PAD_CSI0_DAT8__I2C1_SDA
31311bd5e7bSLukasz Majewski | MUX_PAD_CTRL(I2C_PAD_CTRL),
31411bd5e7bSLukasz Majewski .gpio_mode = MX6Q_PAD_CSI0_DAT8__GPIO5_IO26
31511bd5e7bSLukasz Majewski | MUX_PAD_CTRL(I2C_PAD_CTRL),
31611bd5e7bSLukasz Majewski .gp = IMX_GPIO_NR(5, 26)
31711bd5e7bSLukasz Majewski }
31811bd5e7bSLukasz Majewski };
31911bd5e7bSLukasz Majewski
32011bd5e7bSLukasz Majewski struct i2c_pads_info mx6q_i2c2_pad_info = {
32111bd5e7bSLukasz Majewski .scl = {
32211bd5e7bSLukasz Majewski .i2c_mode = MX6Q_PAD_KEY_COL3__I2C2_SCL
32311bd5e7bSLukasz Majewski | MUX_PAD_CTRL(I2C_PAD_CTRL),
32411bd5e7bSLukasz Majewski .gpio_mode = MX6Q_PAD_KEY_COL3__GPIO4_IO12
32511bd5e7bSLukasz Majewski | MUX_PAD_CTRL(I2C_PAD_CTRL),
32611bd5e7bSLukasz Majewski .gp = IMX_GPIO_NR(4, 12)
32711bd5e7bSLukasz Majewski },
32811bd5e7bSLukasz Majewski .sda = {
32911bd5e7bSLukasz Majewski .i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA
33011bd5e7bSLukasz Majewski | MUX_PAD_CTRL(I2C_PAD_CTRL),
33111bd5e7bSLukasz Majewski .gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO4_IO13
33211bd5e7bSLukasz Majewski | MUX_PAD_CTRL(I2C_PAD_CTRL),
33311bd5e7bSLukasz Majewski .gp = IMX_GPIO_NR(4, 13)
33411bd5e7bSLukasz Majewski }
33511bd5e7bSLukasz Majewski };
33611bd5e7bSLukasz Majewski
board_eth_init(bd_t * bis)33711bd5e7bSLukasz Majewski int board_eth_init(bd_t *bis)
33811bd5e7bSLukasz Majewski {
33911bd5e7bSLukasz Majewski setup_iomux_enet();
34011bd5e7bSLukasz Majewski
34111bd5e7bSLukasz Majewski return cpu_eth_init(bis);
34211bd5e7bSLukasz Majewski }
34311bd5e7bSLukasz Majewski
board_early_init_f(void)34411bd5e7bSLukasz Majewski int board_early_init_f(void)
34511bd5e7bSLukasz Majewski {
34611bd5e7bSLukasz Majewski setup_iomux_uart();
34711bd5e7bSLukasz Majewski
34811bd5e7bSLukasz Majewski return 0;
34911bd5e7bSLukasz Majewski }
35011bd5e7bSLukasz Majewski
board_init(void)35111bd5e7bSLukasz Majewski int board_init(void)
35211bd5e7bSLukasz Majewski {
35311bd5e7bSLukasz Majewski /* address of boot parameters */
35411bd5e7bSLukasz Majewski gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
35511bd5e7bSLukasz Majewski
35611bd5e7bSLukasz Majewski gpio_direction_output(DISPLAY_EN, 1);
35711bd5e7bSLukasz Majewski
35811bd5e7bSLukasz Majewski setup_eimnor();
35911bd5e7bSLukasz Majewski setup_spi();
36011bd5e7bSLukasz Majewski
36111bd5e7bSLukasz Majewski setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c1_pad_info);
36211bd5e7bSLukasz Majewski setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c2_pad_info);
36311bd5e7bSLukasz Majewski
36411bd5e7bSLukasz Majewski return 0;
36511bd5e7bSLukasz Majewski }
36611bd5e7bSLukasz Majewski
board_late_init(void)36711bd5e7bSLukasz Majewski int board_late_init(void)
36811bd5e7bSLukasz Majewski {
369382bee57SSimon Glass env_set("board_name", "mccmon6");
37011bd5e7bSLukasz Majewski
37111bd5e7bSLukasz Majewski return 0;
37211bd5e7bSLukasz Majewski }
37311bd5e7bSLukasz Majewski
checkboard(void)37411bd5e7bSLukasz Majewski int checkboard(void)
37511bd5e7bSLukasz Majewski {
37611bd5e7bSLukasz Majewski puts("Board: MCCMON6\n");
37711bd5e7bSLukasz Majewski
37811bd5e7bSLukasz Majewski return 0;
37911bd5e7bSLukasz Majewski }
38011bd5e7bSLukasz Majewski
board_phy_config(struct phy_device * phydev)38111bd5e7bSLukasz Majewski int board_phy_config(struct phy_device *phydev)
38211bd5e7bSLukasz Majewski {
38311bd5e7bSLukasz Majewski /*
38411bd5e7bSLukasz Majewski * Default setting for GMII Clock Pad Skew Register 0x1EF:
38511bd5e7bSLukasz Majewski * MMD Address 0x2h, Register 0x8h
38611bd5e7bSLukasz Majewski *
38711bd5e7bSLukasz Majewski * GTX_CLK Pad Skew 0xF -> 0.9 nsec skew
38811bd5e7bSLukasz Majewski * RX_CLK Pad Skew 0xF -> 0.9 nsec skew
38911bd5e7bSLukasz Majewski *
39011bd5e7bSLukasz Majewski * Adjustment -> write 0x3FF:
39111bd5e7bSLukasz Majewski * GTX_CLK Pad Skew 0x1F -> 1.8 nsec skew
39211bd5e7bSLukasz Majewski * RX_CLK Pad Skew 0x1F -> 1.8 nsec skew
39311bd5e7bSLukasz Majewski *
39411bd5e7bSLukasz Majewski */
39511bd5e7bSLukasz Majewski ksz9031_phy_extended_write(phydev, 0x2,
39611bd5e7bSLukasz Majewski MII_KSZ9031_EXT_RGMII_CLOCK_SKEW,
39711bd5e7bSLukasz Majewski MII_KSZ9031_MOD_DATA_NO_POST_INC, 0x3FF);
39811bd5e7bSLukasz Majewski
39911bd5e7bSLukasz Majewski ksz9031_phy_extended_write(phydev, 0x02,
40011bd5e7bSLukasz Majewski MII_KSZ9031_EXT_RGMII_CTRL_SIG_SKEW,
40111bd5e7bSLukasz Majewski MII_KSZ9031_MOD_DATA_NO_POST_INC, 0x00FF);
40211bd5e7bSLukasz Majewski
40311bd5e7bSLukasz Majewski ksz9031_phy_extended_write(phydev, 0x2,
40411bd5e7bSLukasz Majewski MII_KSZ9031_EXT_RGMII_RX_DATA_SKEW,
40511bd5e7bSLukasz Majewski MII_KSZ9031_MOD_DATA_NO_POST_INC,
40611bd5e7bSLukasz Majewski 0x3333);
40711bd5e7bSLukasz Majewski
40811bd5e7bSLukasz Majewski ksz9031_phy_extended_write(phydev, 0x2,
40911bd5e7bSLukasz Majewski MII_KSZ9031_EXT_RGMII_TX_DATA_SKEW,
41011bd5e7bSLukasz Majewski MII_KSZ9031_MOD_DATA_NO_POST_INC,
41111bd5e7bSLukasz Majewski 0x2052);
41211bd5e7bSLukasz Majewski
41311bd5e7bSLukasz Majewski if (phydev->drv->config)
41411bd5e7bSLukasz Majewski phydev->drv->config(phydev);
41511bd5e7bSLukasz Majewski
41611bd5e7bSLukasz Majewski return 0;
41711bd5e7bSLukasz Majewski }
41811bd5e7bSLukasz Majewski
41911bd5e7bSLukasz Majewski #ifdef CONFIG_SPL_BOARD_INIT
spl_board_init(void)42011bd5e7bSLukasz Majewski void spl_board_init(void)
42111bd5e7bSLukasz Majewski {
42211bd5e7bSLukasz Majewski setup_eimnor();
42311bd5e7bSLukasz Majewski
42411bd5e7bSLukasz Majewski gpio_direction_output(DISPLAY_EN, 1);
42511bd5e7bSLukasz Majewski }
42611bd5e7bSLukasz Majewski #endif /* CONFIG_SPL_BOARD_INIT */
42711bd5e7bSLukasz Majewski
42811bd5e7bSLukasz Majewski #ifdef CONFIG_SPL_BUILD
board_boot_order(u32 * spl_boot_list)42911bd5e7bSLukasz Majewski void board_boot_order(u32 *spl_boot_list)
43011bd5e7bSLukasz Majewski {
43111bd5e7bSLukasz Majewski switch (spl_boot_device()) {
43211bd5e7bSLukasz Majewski case BOOT_DEVICE_MMC2:
43311bd5e7bSLukasz Majewski case BOOT_DEVICE_MMC1:
43411bd5e7bSLukasz Majewski spl_boot_list[0] = BOOT_DEVICE_MMC2;
43511bd5e7bSLukasz Majewski spl_boot_list[1] = BOOT_DEVICE_MMC1;
43611bd5e7bSLukasz Majewski break;
43711bd5e7bSLukasz Majewski
43811bd5e7bSLukasz Majewski case BOOT_DEVICE_NOR:
43911bd5e7bSLukasz Majewski spl_boot_list[0] = BOOT_DEVICE_NOR;
44011bd5e7bSLukasz Majewski break;
44111bd5e7bSLukasz Majewski }
44211bd5e7bSLukasz Majewski }
44311bd5e7bSLukasz Majewski #endif /* CONFIG_SPL_BUILD */
44411bd5e7bSLukasz Majewski
44511bd5e7bSLukasz Majewski #ifdef CONFIG_SPL_OS_BOOT
spl_start_uboot(void)44611bd5e7bSLukasz Majewski int spl_start_uboot(void)
44711bd5e7bSLukasz Majewski {
44811bd5e7bSLukasz Majewski char s[16];
44911bd5e7bSLukasz Majewski int ret;
45011bd5e7bSLukasz Majewski /*
45111bd5e7bSLukasz Majewski * We use BOOT_DEVICE_MMC1, but SD card is connected
45211bd5e7bSLukasz Majewski * to MMC2
45311bd5e7bSLukasz Majewski *
45411bd5e7bSLukasz Majewski * Correct "mapping" is delivered in board defined
45511bd5e7bSLukasz Majewski * board_boot_order() function.
45611bd5e7bSLukasz Majewski *
45711bd5e7bSLukasz Majewski * SD card boot is regarded as a "development" one,
45811bd5e7bSLukasz Majewski * hence we _always_ go through the u-boot.
45911bd5e7bSLukasz Majewski *
46011bd5e7bSLukasz Majewski */
46111bd5e7bSLukasz Majewski if (spl_boot_device() == BOOT_DEVICE_MMC1)
46211bd5e7bSLukasz Majewski return 1;
46311bd5e7bSLukasz Majewski
46411bd5e7bSLukasz Majewski /* break into full u-boot on 'c' */
46511bd5e7bSLukasz Majewski if (serial_tstc() && serial_getc() == 'c')
46611bd5e7bSLukasz Majewski return 1;
46711bd5e7bSLukasz Majewski
46811bd5e7bSLukasz Majewski env_init();
46900caae6dSSimon Glass ret = env_get_f("boot_os", s, sizeof(s));
47011bd5e7bSLukasz Majewski if ((ret != -1) && (strcmp(s, "no") == 0))
47111bd5e7bSLukasz Majewski return 1;
47211bd5e7bSLukasz Majewski
47311bd5e7bSLukasz Majewski /*
47411bd5e7bSLukasz Majewski * Check if SWUpdate recovery needs to be started
47511bd5e7bSLukasz Majewski *
47611bd5e7bSLukasz Majewski * recovery_status = NULL (not set - ret == -1) -> normal operation
47711bd5e7bSLukasz Majewski *
47811bd5e7bSLukasz Majewski * recovery_status = progress or
47911bd5e7bSLukasz Majewski * recovery_status = failed or
48011bd5e7bSLukasz Majewski * recovery_status = <any value> -> start SWUpdate
48111bd5e7bSLukasz Majewski *
48211bd5e7bSLukasz Majewski */
48300caae6dSSimon Glass ret = env_get_f("recovery_status", s, sizeof(s));
48411bd5e7bSLukasz Majewski if (ret != -1)
48511bd5e7bSLukasz Majewski return 1;
48611bd5e7bSLukasz Majewski
48711bd5e7bSLukasz Majewski return 0;
48811bd5e7bSLukasz Majewski }
48911bd5e7bSLukasz Majewski #endif /* CONFIG_SPL_OS_BOOT */
490