1 // SPDX-License-Identifier: GPL-2.0+
5 #include <fsl_esdhc_imx.h>
10 #include <asm/arch/ddr.h>
11 #include <asm/arch/imx8mq_pins.h>
12 #include <asm/arch/sys_proto.h>
13 #include <asm/arch/clock.h>
14 #include <asm/global_data.h>
16 #include <asm/mach-imx/iomux-v3.h>
17 #include <asm/mach-imx/gpio.h>
18 #include <asm/mach-imx/mxc_i2c.h>
19 #include <linux/delay.h>
20 #include <power/pmic.h>
21 #include <power/pfuze100_pmic.h>
23 #include "pitx_misc.h"
25 extern struct dram_timing_info dram_timing_2gb
;
26 extern struct dram_timing_info dram_timing_4gb
;
28 DECLARE_GLOBAL_DATA_PTR
;
31 static void spl_dram_init(void)
33 struct dram_timing_info
*dram_timing
;
34 int variant
= 0, size
;
36 variant
= get_pitx_board_variant();
40 dram_timing
= &dram_timing_2gb
;
44 dram_timing
= &dram_timing_4gb
;
48 printf("Unknown DDR type (%d)\n", variant
);
53 ddr_init(dram_timing
);
56 #define I2C_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_HYS | PAD_CTL_PUE)
57 #define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
58 static struct i2c_pads_info i2c_pad_info1
= {
60 .i2c_mode
= IMX8MQ_PAD_I2C1_SCL__I2C1_SCL
| PC
,
61 .gpio_mode
= IMX8MQ_PAD_I2C1_SCL__GPIO5_IO14
| PC
,
62 .gp
= IMX_GPIO_NR(5, 14),
65 .i2c_mode
= IMX8MQ_PAD_I2C1_SDA__I2C1_SDA
| PC
,
66 .gpio_mode
= IMX8MQ_PAD_I2C1_SDA__GPIO5_IO15
| PC
,
67 .gp
= IMX_GPIO_NR(5, 15),
71 #if CONFIG_IS_ENABLED(MMC)
72 #define USDHC2_CD_GPIO IMX_GPIO_NR(2, 12)
73 #define USDHC1_PWR_GPIO IMX_GPIO_NR(2, 10)
74 #define USDHC2_PWR_GPIO IMX_GPIO_NR(2, 19)
76 int board_mmc_getcd(struct mmc
*mmc
)
78 struct fsl_esdhc_cfg
*cfg
= (struct fsl_esdhc_cfg
*)mmc
->priv
;
81 switch (cfg
->esdhc_base
) {
82 case USDHC1_BASE_ADDR
:
83 /* the eMMC does not have a CD pin */
85 case USDHC2_BASE_ADDR
:
86 ret
= !gpio_get_value(USDHC2_CD_GPIO
);
93 #define USDHC_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_HYS | PAD_CTL_PUE | \
95 #define USDHC_GPIO_PAD_CTRL (PAD_CTL_PUE | PAD_CTL_DSE1)
97 static iomux_v3_cfg_t
const usdhc1_pads
[] = {
98 IMX8MQ_PAD_SD1_CLK__USDHC1_CLK
| MUX_PAD_CTRL(USDHC_PAD_CTRL
),
99 IMX8MQ_PAD_SD1_CMD__USDHC1_CMD
| MUX_PAD_CTRL(USDHC_PAD_CTRL
),
100 IMX8MQ_PAD_SD1_DATA0__USDHC1_DATA0
| MUX_PAD_CTRL(USDHC_PAD_CTRL
),
101 IMX8MQ_PAD_SD1_DATA1__USDHC1_DATA1
| MUX_PAD_CTRL(USDHC_PAD_CTRL
),
102 IMX8MQ_PAD_SD1_DATA2__USDHC1_DATA2
| MUX_PAD_CTRL(USDHC_PAD_CTRL
),
103 IMX8MQ_PAD_SD1_DATA3__USDHC1_DATA3
| MUX_PAD_CTRL(USDHC_PAD_CTRL
),
104 IMX8MQ_PAD_SD1_DATA4__USDHC1_DATA4
| MUX_PAD_CTRL(USDHC_PAD_CTRL
),
105 IMX8MQ_PAD_SD1_DATA5__USDHC1_DATA5
| MUX_PAD_CTRL(USDHC_PAD_CTRL
),
106 IMX8MQ_PAD_SD1_DATA6__USDHC1_DATA6
| MUX_PAD_CTRL(USDHC_PAD_CTRL
),
107 IMX8MQ_PAD_SD1_DATA7__USDHC1_DATA7
| MUX_PAD_CTRL(USDHC_PAD_CTRL
),
108 IMX8MQ_PAD_SD1_RESET_B__GPIO2_IO10
| MUX_PAD_CTRL(NO_PAD_CTRL
),
111 static iomux_v3_cfg_t
const usdhc2_pads
[] = {
112 IMX8MQ_PAD_SD2_CLK__USDHC2_CLK
| MUX_PAD_CTRL(USDHC_PAD_CTRL
), /* 0xd6 */
113 IMX8MQ_PAD_SD2_CMD__USDHC2_CMD
| MUX_PAD_CTRL(USDHC_PAD_CTRL
), /* 0xd6 */
114 IMX8MQ_PAD_SD2_DATA0__USDHC2_DATA0
| MUX_PAD_CTRL(USDHC_PAD_CTRL
), /* 0xd6 */
115 IMX8MQ_PAD_SD2_DATA1__USDHC2_DATA1
| MUX_PAD_CTRL(USDHC_PAD_CTRL
), /* 0xd6 */
116 IMX8MQ_PAD_SD2_DATA2__USDHC2_DATA2
| MUX_PAD_CTRL(USDHC_PAD_CTRL
), /* 0x16 */
117 IMX8MQ_PAD_SD2_DATA3__USDHC2_DATA3
| MUX_PAD_CTRL(USDHC_PAD_CTRL
), /* 0xd6 */
118 IMX8MQ_PAD_SD2_CD_B__GPIO2_IO12
| MUX_PAD_CTRL(USDHC_GPIO_PAD_CTRL
),
119 IMX8MQ_PAD_SD2_RESET_B__GPIO2_IO19
| MUX_PAD_CTRL(USDHC_GPIO_PAD_CTRL
),
122 static struct fsl_esdhc_cfg usdhc_cfg
[2] = {
123 {USDHC1_BASE_ADDR
, 0, 8},
124 {USDHC2_BASE_ADDR
, 0, 4},
127 int board_mmc_init(struct bd_info
*bis
)
131 * According to the board_mmc_init() the following map is done:
132 * (U-Boot device node) (Physical Port)
136 for (i
= 0; i
< CONFIG_SYS_FSL_USDHC_NUM
; i
++) {
140 usdhc_cfg
[0].sdhc_clk
= mxc_get_clock(USDHC1_CLK_ROOT
);
141 imx_iomux_v3_setup_multiple_pads(usdhc1_pads
,
142 ARRAY_SIZE(usdhc1_pads
));
143 gpio_request(USDHC1_PWR_GPIO
, "usdhc1_reset");
144 gpio_direction_output(USDHC1_PWR_GPIO
, 0);
146 gpio_direction_output(USDHC1_PWR_GPIO
, 1);
150 usdhc_cfg
[1].sdhc_clk
= mxc_get_clock(USDHC2_CLK_ROOT
);
151 imx_iomux_v3_setup_multiple_pads(usdhc2_pads
,
152 ARRAY_SIZE(usdhc2_pads
));
153 gpio_request(USDHC2_PWR_GPIO
, "usdhc2_reset");
154 gpio_direction_output(USDHC2_PWR_GPIO
, 0);
156 gpio_direction_output(USDHC2_PWR_GPIO
, 1);
159 printf("Warning: you configured more USDHC controllers "
160 "(%d) than supported by the board\n", i
+ 1);
164 ret
= fsl_esdhc_initialize(bis
, &usdhc_cfg
[i
]);
172 const char *spl_board_loader_name(u32 boot_device
)
174 switch (boot_device
) {
175 case BOOT_DEVICE_MMC1
:
177 case BOOT_DEVICE_MMC2
:
185 #if CONFIG_IS_ENABLED(POWER_LEGACY)
188 static int pfuze_mode_init(struct pmic
*p
, u32 mode
)
190 unsigned char offset
, i
, switch_num
;
194 pmic_reg_read(p
, PFUZE100_DEVICEID
, &id
);
199 offset
= PFUZE100_SW1CMODE
;
200 } else if (id
== 1) {
202 offset
= PFUZE100_SW2MODE
;
204 printf("Not supported, id=%d\n", id
);
208 ret
= pmic_reg_write(p
, PFUZE100_SW1ABMODE
, mode
);
210 printf("Set SW1AB mode error!\n");
214 for (i
= 0; i
< switch_num
- 1; i
++) {
215 ret
= pmic_reg_write(p
, offset
+ i
* SWITCH_SIZE
, mode
);
217 printf("Set switch 0x%x mode error!\n",
218 offset
+ i
* SWITCH_SIZE
);
226 int power_init_board(void)
232 ret
= power_pfuze100_init(I2C_PMIC
);
236 p
= pmic_get("PFUZE100");
241 pmic_reg_read(p
, PFUZE100_SW3AVOL
, ®
);
242 if ((reg
& 0x3f) != 0x18) {
245 pmic_reg_write(p
, PFUZE100_SW3AVOL
, reg
);
248 ret
= pfuze_mode_init(p
, APS_PFM
);
252 /* set SW3A standby mode to off */
253 pmic_reg_read(p
, PFUZE100_SW3AMODE
, ®
);
256 pmic_reg_write(p
, PFUZE100_SW3AMODE
, reg
);
262 void board_init_f(ulong dummy
)
266 /* Clear global data */
267 memset((void *)gd
, 0, sizeof(gd_t
));
273 board_early_init_f();
277 preloader_console_init();
280 memset(__bss_start
, 0, __bss_end
- __bss_start
);
284 debug("spl_init() failed: %d\n", ret
);
290 setup_i2c(0, 100000, 0x7f, &i2c_pad_info1
);
292 #if CONFIG_IS_ENABLED(POWER_LEGACY)
298 board_init_r(NULL
, 0);