Blame view
board/freescale/mx7dsabresd/mx7dsabresd.c
8.58 KB
83d290c56
|
1 |
// SPDX-License-Identifier: GPL-2.0+ |
1a8150d4b
|
2 3 |
/* * Copyright (C) 2015 Freescale Semiconductor, Inc. |
1a8150d4b
|
4 |
*/ |
5255932f0
|
5 |
#include <init.h> |
1a8150d4b
|
6 7 8 9 10 |
#include <asm/arch/clock.h> #include <asm/arch/imx-regs.h> #include <asm/arch/mx7-pins.h> #include <asm/arch/sys_proto.h> #include <asm/gpio.h> |
552a848e4
|
11 |
#include <asm/mach-imx/iomux-v3.h> |
1a8150d4b
|
12 13 14 |
#include <asm/io.h> #include <linux/sizes.h> #include <common.h> |
e37ac717d
|
15 |
#include <fsl_esdhc_imx.h> |
1a8150d4b
|
16 17 |
#include <mmc.h> #include <miiphy.h> |
1a8150d4b
|
18 19 20 21 |
#include <power/pmic.h> #include <power/pfuze3000_pmic.h> #include "../common/pfuze.h" #include <i2c.h> |
552a848e4
|
22 |
#include <asm/mach-imx/mxc_i2c.h> |
1a8150d4b
|
23 24 25 26 27 28 |
#include <asm/arch/crm_regs.h> DECLARE_GLOBAL_DATA_PTR; #define UART_PAD_CTRL (PAD_CTL_DSE_3P3V_49OHM | \ PAD_CTL_PUS_PU100KOHM | PAD_CTL_HYS) |
ebe517b63
|
29 30 |
#define LCD_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_PUS_PU100KOHM | \ PAD_CTL_DSE_3P3V_49OHM) |
6e1a41cd6
|
31 |
#define NAND_PAD_CTRL (PAD_CTL_DSE_3P3V_49OHM | PAD_CTL_SRE_SLOW | PAD_CTL_HYS) |
9cd37b02a
|
32 33 |
#define SPI_PAD_CTRL \ (PAD_CTL_HYS | PAD_CTL_DSE_3P3V_49OHM | PAD_CTL_SRE_FAST) |
6e1a41cd6
|
34 |
#define NAND_PAD_READY0_CTRL (PAD_CTL_DSE_3P3V_49OHM | PAD_CTL_PUS_PU5KOHM) |
1a8150d4b
|
35 |
|
6fbbcfdf0
|
36 |
#ifdef CONFIG_MXC_SPI |
9cd37b02a
|
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
static iomux_v3_cfg_t const ecspi3_pads[] = { MX7D_PAD_SAI2_RX_DATA__ECSPI3_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL), MX7D_PAD_SAI2_TX_SYNC__ECSPI3_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL), MX7D_PAD_SAI2_TX_BCLK__ECSPI3_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL), MX7D_PAD_SAI2_TX_DATA__GPIO6_IO22 | MUX_PAD_CTRL(NO_PAD_CTRL), }; int board_spi_cs_gpio(unsigned bus, unsigned cs) { return (bus == 2 && cs == 0) ? (IMX_GPIO_NR(6, 22)) : -1; } static void setup_spi(void) { imx_iomux_v3_setup_multiple_pads(ecspi3_pads, ARRAY_SIZE(ecspi3_pads)); } |
6fbbcfdf0
|
53 |
#endif |
9cd37b02a
|
54 |
|
1a8150d4b
|
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
int dram_init(void) { gd->ram_size = PHYS_SDRAM_SIZE; return 0; } static iomux_v3_cfg_t const wdog_pads[] = { MX7D_PAD_GPIO1_IO00__WDOG1_WDOG_B | MUX_PAD_CTRL(NO_PAD_CTRL), }; static iomux_v3_cfg_t const uart1_pads[] = { MX7D_PAD_UART1_TX_DATA__UART1_DCE_TX | MUX_PAD_CTRL(UART_PAD_CTRL), MX7D_PAD_UART1_RX_DATA__UART1_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL), }; |
6e1a41cd6
|
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
#ifdef CONFIG_NAND_MXS static iomux_v3_cfg_t const gpmi_pads[] = { MX7D_PAD_SD3_DATA0__NAND_DATA00 | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SD3_DATA1__NAND_DATA01 | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SD3_DATA2__NAND_DATA02 | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SD3_DATA3__NAND_DATA03 | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SD3_DATA4__NAND_DATA04 | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SD3_DATA5__NAND_DATA05 | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SD3_DATA6__NAND_DATA06 | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SD3_DATA7__NAND_DATA07 | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SD3_CLK__NAND_CLE | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SD3_CMD__NAND_ALE | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SD3_STROBE__NAND_RE_B | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SD3_RESET_B__NAND_WE_B | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SAI1_MCLK__NAND_WP_B | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SAI1_RX_BCLK__NAND_CE3_B | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SAI1_RX_SYNC__NAND_CE2_B | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SAI1_RX_DATA__NAND_CE1_B | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SAI1_TX_BCLK__NAND_CE0_B | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SAI1_TX_SYNC__NAND_DQS | MUX_PAD_CTRL(NAND_PAD_CTRL), MX7D_PAD_SAI1_TX_DATA__NAND_READY_B | MUX_PAD_CTRL(NAND_PAD_READY0_CTRL), }; static void setup_gpmi_nand(void) { imx_iomux_v3_setup_multiple_pads(gpmi_pads, ARRAY_SIZE(gpmi_pads)); /* NAND_USDHC_BUS_CLK is set in rom */ set_clk_nand(); } #endif |
ebe517b63
|
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
#ifdef CONFIG_VIDEO_MXS static iomux_v3_cfg_t const lcd_pads[] = { MX7D_PAD_LCD_CLK__LCD_CLK | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_ENABLE__LCD_ENABLE | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_HSYNC__LCD_HSYNC | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_VSYNC__LCD_VSYNC | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA00__LCD_DATA0 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA01__LCD_DATA1 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA02__LCD_DATA2 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA03__LCD_DATA3 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA04__LCD_DATA4 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA05__LCD_DATA5 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA06__LCD_DATA6 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA07__LCD_DATA7 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA08__LCD_DATA8 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA09__LCD_DATA9 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA10__LCD_DATA10 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA11__LCD_DATA11 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA12__LCD_DATA12 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA13__LCD_DATA13 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA14__LCD_DATA14 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA15__LCD_DATA15 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA16__LCD_DATA16 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA17__LCD_DATA17 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA18__LCD_DATA18 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA19__LCD_DATA19 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA20__LCD_DATA20 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA21__LCD_DATA21 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA22__LCD_DATA22 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_DATA23__LCD_DATA23 | MUX_PAD_CTRL(LCD_PAD_CTRL), MX7D_PAD_LCD_RESET__GPIO3_IO4 | MUX_PAD_CTRL(LCD_PAD_CTRL), }; static iomux_v3_cfg_t const pwm_pads[] = { /* Use GPIO for Brightness adjustment, duty cycle = period */ MX7D_PAD_GPIO1_IO01__GPIO1_IO1 | MUX_PAD_CTRL(NO_PAD_CTRL), }; static int setup_lcd(void) { imx_iomux_v3_setup_multiple_pads(lcd_pads, ARRAY_SIZE(lcd_pads)); imx_iomux_v3_setup_multiple_pads(pwm_pads, ARRAY_SIZE(pwm_pads)); /* Reset LCD */ |
6fbbcfdf0
|
147 |
gpio_request(IMX_GPIO_NR(3, 4), "lcd reset"); |
ebe517b63
|
148 149 150 151 152 |
gpio_direction_output(IMX_GPIO_NR(3, 4) , 0); udelay(500); gpio_direction_output(IMX_GPIO_NR(3, 4) , 1); /* Set Brightness to high */ |
6fbbcfdf0
|
153 |
gpio_request(IMX_GPIO_NR(1, 1), "lcd backlight"); |
ebe517b63
|
154 155 156 157 158 |
gpio_direction_output(IMX_GPIO_NR(1, 1) , 1); return 0; } #endif |
1a8150d4b
|
159 160 161 162 |
static void setup_iomux_uart(void) { imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads)); } |
62d8cce9f
|
163 |
int board_mmc_get_env_dev(int devno) |
1a8150d4b
|
164 |
{ |
62d8cce9f
|
165 166 |
if (devno == 2) devno--; |
1a8150d4b
|
167 |
|
62d8cce9f
|
168 |
return devno; |
1a8150d4b
|
169 |
} |
6fbbcfdf0
|
170 |
int mmc_map_to_kernel_blk(int dev_no) |
1a8150d4b
|
171 172 173 174 175 176 |
{ if (dev_no == 1) dev_no++; return dev_no; } |
1a8150d4b
|
177 |
#ifdef CONFIG_FEC_MXC |
1a8150d4b
|
178 179 180 181 182 183 184 185 186 |
static int setup_fec(void) { struct iomuxc_gpr_base_regs *const iomuxc_gpr_regs = (struct iomuxc_gpr_base_regs *) IOMUXC_GPR_BASE_ADDR; /* Use 125M anatop REF_CLK1 for ENET1, clear gpr1[13], gpr1[17]*/ clrsetbits_le32(&iomuxc_gpr_regs->gpr[1], (IOMUXC_GPR_GPR1_GPR_ENET1_TX_CLK_SEL_MASK | IOMUXC_GPR_GPR1_GPR_ENET1_CLK_DIR_MASK), 0); |
8590786ac
|
187 |
return set_clk_enet(ENET_125MHZ); |
1a8150d4b
|
188 |
} |
1a8150d4b
|
189 190 191 192 193 194 195 196 197 198 199 200 201 |
int board_phy_config(struct phy_device *phydev) { /* enable rgmii rxc skew and phy mode select to RGMII copper */ phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x21); phy_write(phydev, MDIO_DEVAD_NONE, 0x1f, 0x7ea8); phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x2f); phy_write(phydev, MDIO_DEVAD_NONE, 0x1f, 0x71b7); if (phydev->drv->config) phydev->drv->config(phydev); return 0; } #endif |
53cc647dc
|
202 |
#ifdef CONFIG_FSL_QSPI |
53cc647dc
|
203 204 |
int board_qspi_init(void) { |
53cc647dc
|
205 206 207 208 209 210 |
/* Set the clock */ set_clk_qspi(); return 0; } #endif |
1a8150d4b
|
211 212 213 |
int board_early_init_f(void) { setup_iomux_uart(); |
1a8150d4b
|
214 215 216 217 218 219 220 |
return 0; } int board_init(void) { /* address of boot parameters */ gd->bd->bi_boot_params = PHYS_SDRAM + 0x100; |
1a8150d4b
|
221 222 223 |
#ifdef CONFIG_FEC_MXC setup_fec(); #endif |
6e1a41cd6
|
224 225 226 |
#ifdef CONFIG_NAND_MXS setup_gpmi_nand(); #endif |
ebe517b63
|
227 228 229 |
#ifdef CONFIG_VIDEO_MXS setup_lcd(); #endif |
53cc647dc
|
230 231 232 |
#ifdef CONFIG_FSL_QSPI board_qspi_init(); #endif |
9cd37b02a
|
233 234 235 |
#ifdef CONFIG_MXC_SPI setup_spi(); #endif |
1a8150d4b
|
236 237 |
return 0; } |
6fbbcfdf0
|
238 |
#ifdef CONFIG_DM_PMIC |
1a8150d4b
|
239 240 |
int power_init_board(void) { |
6fbbcfdf0
|
241 242 |
struct udevice *dev; int ret, dev_id, rev_id; |
1a8150d4b
|
243 |
|
e2b14bf4b
|
244 |
ret = pmic_get("pfuze3000@8", &dev); |
6fbbcfdf0
|
245 246 247 |
if (ret == -ENODEV) return 0; if (ret != 0) |
1a8150d4b
|
248 |
return ret; |
6fbbcfdf0
|
249 250 251 252 |
dev_id = pmic_reg_read(dev, PFUZE3000_DEVICEID); rev_id = pmic_reg_read(dev, PFUZE3000_REVID); printf("PMIC: PFUZE3000 DEV_ID=0x%x REV_ID=0x%x ", dev_id, rev_id); |
1a8150d4b
|
253 |
|
6fbbcfdf0
|
254 |
pmic_clrsetbits(dev, PFUZE3000_LDOGCTL, 0, 1); |
1a8150d4b
|
255 |
|
d8fab10cb
|
256 257 258 259 260 |
/* * Set the voltage of VLDO4 output to 2.8V which feeds * the MIPI DSI and MIPI CSI inputs. */ pmic_clrsetbits(dev, PFUZE3000_VLD4CTL, 0xF, 0xA); |
1a8150d4b
|
261 262 263 264 265 266 |
return 0; } #endif int board_late_init(void) { |
4fae48e8a
|
267 |
struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR; |
1a8150d4b
|
268 |
|
1a8150d4b
|
269 |
imx_iomux_v3_setup_multiple_pads(wdog_pads, ARRAY_SIZE(wdog_pads)); |
4fae48e8a
|
270 271 272 273 274 275 276 |
set_wdog_reset(wdog); /* * Do not assert internal WDOG_RESET_B_DEB(controlled by bit 4), * since we use PMIC_PWRON to reset the board. */ clrsetbits_le16(&wdog->wcr, 0, 0x10); |
1a8150d4b
|
277 278 279 |
return 0; } |
1a8150d4b
|
280 281 |
int checkboard(void) { |
76b21efd5
|
282 283 284 285 286 287 288 289 290 |
char *mode; if (IS_ENABLED(CONFIG_ARMV7_BOOT_SEC_DEFAULT)) mode = "secure"; else mode = "non-secure"; printf("Board: i.MX7D SABRESD in %s mode ", mode); |
1a8150d4b
|
291 292 293 |
return 0; } |