1 // SPDX-License-Identifier: GPL-2.0+
3 * Menlosystems M53Menlo board
5 * Copyright (C) 2012-2017 Marek Vasut <marex@denx.de>
6 * Copyright (C) 2014-2017 Olaf Mandel <o.mandel@menlosystems.com>
11 #include <asm/arch/imx-regs.h>
12 #include <asm/arch/sys_proto.h>
13 #include <asm/arch/crm_regs.h>
14 #include <asm/arch/clock.h>
15 #include <asm/arch/iomux-mx53.h>
16 #include <asm/mach-imx/mx5_video.h>
17 #include <asm/mach-imx/video.h>
20 #include <fdt_support.h>
21 #include <fsl_esdhc.h>
23 #include <ipu_pixfmt.h>
24 #include <linux/errno.h>
30 #include <usb/ehci-ci.h>
32 DECLARE_GLOBAL_DATA_PTR
;
34 static u32 mx53_dram_size
[2];
36 ulong
board_get_usable_ram_top(ulong total_size
)
39 * WARNING: We must override get_effective_memsize() function here
40 * to report only the size of the first DRAM bank. This is to make
41 * U-Boot relocator place U-Boot into valid memory, that is, at the
42 * end of the first DRAM bank. If we did not override this function
43 * like so, U-Boot would be placed at the address of the first DRAM
44 * bank + total DRAM size - sizeof(uboot), which in the setup where
45 * each DRAM bank contains 512MiB of DRAM would result in placing
46 * U-Boot into invalid memory area close to the end of the first
49 return PHYS_SDRAM_2
+ mx53_dram_size
[1];
54 mx53_dram_size
[0] = get_ram_size((void *)PHYS_SDRAM_1
, 1 << 30);
55 mx53_dram_size
[1] = get_ram_size((void *)PHYS_SDRAM_2
, 1 << 30);
57 gd
->ram_size
= mx53_dram_size
[0] + mx53_dram_size
[1];
62 int dram_init_banksize(void)
64 gd
->bd
->bi_dram
[0].start
= PHYS_SDRAM_1
;
65 gd
->bd
->bi_dram
[0].size
= mx53_dram_size
[0];
67 gd
->bd
->bi_dram
[1].start
= PHYS_SDRAM_2
;
68 gd
->bd
->bi_dram
[1].size
= mx53_dram_size
[1];
73 static void setup_iomux_uart(void)
75 static const iomux_v3_cfg_t uart_pads
[] = {
76 MX53_PAD_PATA_DMACK__UART1_RXD_MUX
,
77 MX53_PAD_PATA_DIOW__UART1_TXD_MUX
,
80 imx_iomux_v3_setup_multiple_pads(uart_pads
, ARRAY_SIZE(uart_pads
));
83 static void setup_iomux_fec(void)
85 static const iomux_v3_cfg_t fec_pads
[] = {
87 NEW_PAD_CTRL(MX53_PAD_FEC_MDIO__FEC_MDIO
, PAD_CTL_HYS
|
88 PAD_CTL_DSE_HIGH
| PAD_CTL_PUS_22K_UP
| PAD_CTL_ODE
),
89 NEW_PAD_CTRL(MX53_PAD_FEC_MDC__FEC_MDC
, PAD_CTL_DSE_HIGH
),
92 NEW_PAD_CTRL(MX53_PAD_FEC_CRS_DV__FEC_RX_DV
,
93 PAD_CTL_HYS
| PAD_CTL_PKE
),
94 NEW_PAD_CTRL(MX53_PAD_FEC_REF_CLK__FEC_TX_CLK
,
95 PAD_CTL_HYS
| PAD_CTL_PKE
),
96 NEW_PAD_CTRL(MX53_PAD_FEC_RX_ER__FEC_RX_ER
,
97 PAD_CTL_HYS
| PAD_CTL_PKE
),
98 NEW_PAD_CTRL(MX53_PAD_FEC_TX_EN__FEC_TX_EN
, PAD_CTL_DSE_HIGH
),
99 NEW_PAD_CTRL(MX53_PAD_FEC_RXD0__FEC_RDATA_0
,
100 PAD_CTL_HYS
| PAD_CTL_PKE
),
101 NEW_PAD_CTRL(MX53_PAD_FEC_RXD1__FEC_RDATA_1
,
102 PAD_CTL_HYS
| PAD_CTL_PKE
),
103 NEW_PAD_CTRL(MX53_PAD_FEC_TXD0__FEC_TDATA_0
, PAD_CTL_DSE_HIGH
),
104 NEW_PAD_CTRL(MX53_PAD_FEC_TXD1__FEC_TDATA_1
, PAD_CTL_DSE_HIGH
),
107 NEW_PAD_CTRL(MX53_PAD_KEY_COL0__FEC_RDATA_3
,
108 PAD_CTL_HYS
| PAD_CTL_PKE
),
109 NEW_PAD_CTRL(MX53_PAD_KEY_ROW0__FEC_TX_ER
,
110 PAD_CTL_HYS
| PAD_CTL_PKE
),
111 NEW_PAD_CTRL(MX53_PAD_KEY_COL1__FEC_RX_CLK
,
112 PAD_CTL_HYS
| PAD_CTL_PKE
),
113 NEW_PAD_CTRL(MX53_PAD_KEY_ROW1__FEC_COL
,
114 PAD_CTL_HYS
| PAD_CTL_PKE
),
115 NEW_PAD_CTRL(MX53_PAD_KEY_COL2__FEC_RDATA_2
,
116 PAD_CTL_HYS
| PAD_CTL_PKE
),
117 NEW_PAD_CTRL(MX53_PAD_KEY_ROW2__FEC_TDATA_2
, PAD_CTL_DSE_HIGH
),
118 NEW_PAD_CTRL(MX53_PAD_KEY_COL3__FEC_CRS
,
119 PAD_CTL_HYS
| PAD_CTL_PKE
),
120 NEW_PAD_CTRL(MX53_PAD_GPIO_19__FEC_TDATA_3
, PAD_CTL_DSE_HIGH
),
123 imx_iomux_v3_setup_multiple_pads(fec_pads
, ARRAY_SIZE(fec_pads
));
127 static void enable_lvds_clock(struct display_info_t
const *dev
, const u8 hclk
)
129 static struct mxc_ccm_reg
*mxc_ccm
= (struct mxc_ccm_reg
*)MXC_CCM_BASE
;
132 /* For ETM0430G0DH6 model, this must be enabled before the clock. */
133 gpio_direction_output(IMX_GPIO_NR(6, 0), 1);
136 * Set LVDS clock to 33.28 MHz for the display. The PLL4 is set to
137 * 233 MHz, divided by 7 by setting CCM_CSCMR2 LDB_DI0_IPU_DIV=1 .
139 ret
= mxc_set_clock(MXC_HCLK
, hclk
, MXC_LDB_CLK
);
141 puts("IPU: Failed to configure LDB clock\n");
143 /* Configure CCM_CSCMR2 */
144 clrsetbits_le32(&mxc_ccm
->cscmr2
,
145 (0x7 << 26) | BIT(10) | BIT(8),
146 (0x5 << 26) | BIT(10) | BIT(8));
148 /* Configure LDB_CTRL */
149 writel(0x201, 0x53fa8008);
152 static void enable_lvds_etm0430g0dh6(struct display_info_t
const *dev
)
154 gpio_request(IMX_GPIO_NR(6, 0), "LCD");
156 /* For ETM0430G0DH6 model, this must be enabled before the clock. */
157 gpio_direction_output(IMX_GPIO_NR(6, 0), 1);
160 * Set LVDS clock to 9 MHz for the display. The PLL4 is set to
161 * 63 MHz, divided by 7 by setting CCM_CSCMR2 LDB_DI0_IPU_DIV=1 .
163 enable_lvds_clock(dev
, 63);
166 static void enable_lvds_etm0700g0dh6(struct display_info_t
const *dev
)
168 gpio_request(IMX_GPIO_NR(6, 0), "LCD");
171 * Set LVDS clock to 33.28 MHz for the display. The PLL4 is set to
172 * 233 MHz, divided by 7 by setting CCM_CSCMR2 LDB_DI0_IPU_DIV=1 .
174 enable_lvds_clock(dev
, 233);
176 /* For ETM0700G0DH6 model, this may be enabled after the clock. */
177 gpio_direction_output(IMX_GPIO_NR(6, 0), 1);
180 static const char *lvds_compat_string
;
182 static int detect_lvds(struct display_info_t
const *dev
)
185 u8
*touchptr
= &touchid
[0];
188 ret
= i2c_set_bus_num(0);
192 /* Touchscreen is at address 0x38, ID register is 0xbb. */
193 ret
= i2c_read(0x38, 0xbb, 1, touchid
, sizeof(touchid
));
197 /* EP0430 prefixes the response with 0xbb, skip it. */
198 if (*touchptr
== 0xbb)
201 /* Skip the 'EP' prefix. */
204 ret
= !memcmp(touchptr
, &dev
->mode
.name
[7], 4);
206 lvds_compat_string
= dev
->mode
.name
;
211 void board_preboot_os(void)
213 /* Power off the LCD to prevent awful color flicker */
214 gpio_direction_output(IMX_GPIO_NR(6, 0), 0);
217 int ft_board_setup(void *blob
, bd_t
*bd
)
219 if (lvds_compat_string
)
220 do_fixup_by_path_string(blob
, "/panel", "compatible",
226 struct display_info_t
const displays
[] = {
230 .detect
= detect_lvds
,
231 .enable
= enable_lvds_etm0430g0dh6
,
232 .pixfmt
= IPU_PIX_FMT_RGB666
,
234 .name
= "edt,etm0430g0dh6",
238 .pixclock
= 111111, /* picosecond (9 MHz) */
246 .vmode
= FB_VMODE_NONINTERLACED
251 .detect
= detect_lvds
,
252 .enable
= enable_lvds_etm0700g0dh6
,
253 .pixfmt
= IPU_PIX_FMT_RGB666
,
255 .name
= "edt,etm0700g0dh6",
259 .pixclock
= 30048, /* picosecond (33.28 MHz) */
267 .vmode
= FB_VMODE_NONINTERLACED
272 size_t display_count
= ARRAY_SIZE(displays
);
275 #ifdef CONFIG_SPLASH_SCREEN
276 static struct splash_location default_splash_locations
[] = {
279 .storage
= SPLASH_STORAGE_MMC
,
280 .flags
= SPLASH_STORAGE_FS
,
285 int splash_screen_prepare(void)
287 return splash_source_load(default_splash_locations
,
288 ARRAY_SIZE(default_splash_locations
));
292 #define I2C_PAD_CTRL (PAD_CTL_SRE_FAST | PAD_CTL_DSE_HIGH | \
293 PAD_CTL_PUS_100K_UP | PAD_CTL_ODE)
295 static void setup_iomux_i2c(void)
297 static const iomux_v3_cfg_t i2c_pads
[] = {
299 NEW_PAD_CTRL(MX53_PAD_EIM_D28__I2C1_SDA
, I2C_PAD_CTRL
),
300 NEW_PAD_CTRL(MX53_PAD_EIM_D21__I2C1_SCL
, I2C_PAD_CTRL
),
302 NEW_PAD_CTRL(MX53_PAD_EIM_D16__I2C2_SDA
, I2C_PAD_CTRL
),
303 NEW_PAD_CTRL(MX53_PAD_EIM_EB2__I2C2_SCL
, I2C_PAD_CTRL
),
306 imx_iomux_v3_setup_multiple_pads(i2c_pads
, ARRAY_SIZE(i2c_pads
));
309 static void setup_iomux_video(void)
311 static const iomux_v3_cfg_t lcd_pads
[] = {
312 MX53_PAD_LVDS0_TX3_P__LDB_LVDS0_TX3
,
313 MX53_PAD_LVDS0_CLK_P__LDB_LVDS0_CLK
,
314 MX53_PAD_LVDS0_TX2_P__LDB_LVDS0_TX2
,
315 MX53_PAD_LVDS0_TX1_P__LDB_LVDS0_TX1
,
316 MX53_PAD_LVDS0_TX0_P__LDB_LVDS0_TX0
,
319 imx_iomux_v3_setup_multiple_pads(lcd_pads
, ARRAY_SIZE(lcd_pads
));
322 static void setup_iomux_nand(void)
324 static const iomux_v3_cfg_t nand_pads
[] = {
325 NEW_PAD_CTRL(MX53_PAD_NANDF_WE_B__EMI_NANDF_WE_B
,
327 NEW_PAD_CTRL(MX53_PAD_NANDF_RE_B__EMI_NANDF_RE_B
,
329 NEW_PAD_CTRL(MX53_PAD_NANDF_CLE__EMI_NANDF_CLE
,
331 NEW_PAD_CTRL(MX53_PAD_NANDF_ALE__EMI_NANDF_ALE
,
333 NEW_PAD_CTRL(MX53_PAD_NANDF_WP_B__EMI_NANDF_WP_B
,
334 PAD_CTL_PUS_100K_UP
),
335 NEW_PAD_CTRL(MX53_PAD_NANDF_RB0__EMI_NANDF_RB_0
,
336 PAD_CTL_PUS_100K_UP
),
337 NEW_PAD_CTRL(MX53_PAD_NANDF_CS0__EMI_NANDF_CS_0
,
339 NEW_PAD_CTRL(MX53_PAD_PATA_DATA0__EMI_NANDF_D_0
,
340 PAD_CTL_DSE_HIGH
| PAD_CTL_PKE
),
341 NEW_PAD_CTRL(MX53_PAD_PATA_DATA1__EMI_NANDF_D_1
,
342 PAD_CTL_DSE_HIGH
| PAD_CTL_PKE
),
343 NEW_PAD_CTRL(MX53_PAD_PATA_DATA2__EMI_NANDF_D_2
,
344 PAD_CTL_DSE_HIGH
| PAD_CTL_PKE
),
345 NEW_PAD_CTRL(MX53_PAD_PATA_DATA3__EMI_NANDF_D_3
,
346 PAD_CTL_DSE_HIGH
| PAD_CTL_PKE
),
347 NEW_PAD_CTRL(MX53_PAD_PATA_DATA4__EMI_NANDF_D_4
,
348 PAD_CTL_DSE_HIGH
| PAD_CTL_PKE
),
349 NEW_PAD_CTRL(MX53_PAD_PATA_DATA5__EMI_NANDF_D_5
,
350 PAD_CTL_DSE_HIGH
| PAD_CTL_PKE
),
351 NEW_PAD_CTRL(MX53_PAD_PATA_DATA6__EMI_NANDF_D_6
,
352 PAD_CTL_DSE_HIGH
| PAD_CTL_PKE
),
353 NEW_PAD_CTRL(MX53_PAD_PATA_DATA7__EMI_NANDF_D_7
,
354 PAD_CTL_DSE_HIGH
| PAD_CTL_PKE
),
357 imx_iomux_v3_setup_multiple_pads(nand_pads
, ARRAY_SIZE(nand_pads
));
360 static void m53_set_clock(void)
363 const u32 ref_clk
= MXC_HCLK
;
364 const u32 dramclk
= 400;
367 gpio_request(IMX_GPIO_NR(4, 0), "CPUCLK");
369 imx_iomux_v3_setup_pad(NEW_PAD_CTRL(MX53_PAD_GPIO_10__GPIO4_0
,
370 PAD_CTL_DSE_HIGH
| PAD_CTL_PKE
));
371 gpio_direction_input(IMX_GPIO_NR(4, 0));
373 /* GPIO10 selects modules' CPU speed, 1 = 1200MHz ; 0 = 800MHz */
374 cpuclk
= gpio_get_value(IMX_GPIO_NR(4, 0)) ? 1200 : 800;
376 ret
= mxc_set_clock(ref_clk
, cpuclk
, MXC_ARM_CLK
);
378 printf("CPU: Switch CPU clock to %dMHz failed\n", cpuclk
);
380 ret
= mxc_set_clock(ref_clk
, dramclk
, MXC_PERIPH_CLK
);
382 printf("CPU: Switch peripheral clock to %dMHz failed\n",
386 ret
= mxc_set_clock(ref_clk
, dramclk
, MXC_DDR_CLK
);
388 printf("CPU: Switch DDR clock to %dMHz failed\n", dramclk
);
391 static void m53_set_nand(void)
395 /* NAND flash is muxed on ATA pins */
396 setbits_le32(M4IF_BASE_ADDR
+ 0xc, M4IF_GENP_WEIM_MM_MASK
);
398 /* Wait for Grant/Ack sequence (see EIM_CSnGCR2:MUX16_BYP_GRANT) */
399 for (i
= 0x4; i
< 0x94; i
+= 0x18) {
400 clrbits_le32(WEIM_BASE_ADDR
+ i
,
401 WEIM_GCR2_MUX16_BYP_GRANT_MASK
);
404 mxc_set_clock(0, 33, MXC_NFC_CLK
);
408 int board_early_init_f(void)
418 mxc_set_sata_internal_clock();
420 /* NAND clock @ 33MHz */
428 gd
->bd
->bi_boot_params
= PHYS_SDRAM_1
+ 0x100;
435 puts("Board: Menlosystems M53Menlo\n");
443 #ifdef CONFIG_SPL_BUILD
444 void spl_board_init(void)
451 u32
spl_boot_device(void)
453 return BOOT_DEVICE_NAND
;