1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * Copyright (C) 2012 Freescale Semiconductor, Inc.
4 * Author: Fabio Estevam <fabio.estevam@freescale.com>
5 *
6 * Copyright (C) 2013, 2014 TQ-Systems (ported SabreSD to TQMa6x)
7 * Author: Markus Niebel <markus.niebel@tq-group.com>
8 */
9
10 #include <init.h>
11 #include <asm/arch/clock.h>
12 #include <asm/arch/mx6-pins.h>
13 #include <asm/arch/imx-regs.h>
14 #include <asm/arch/iomux.h>
15 #include <asm/arch/sys_proto.h>
16 #include <env.h>
17 #include <fdt_support.h>
18 #include <asm/global_data.h>
19 #include <linux/errno.h>
20 #include <asm/gpio.h>
21 #include <asm/io.h>
22 #include <linux/libfdt.h>
23 #include <mmc.h>
24 #include <power/pfuze100_pmic.h>
25 #include <power/pmic.h>
26
27 #include "tqma6_bb.h"
28
29 DECLARE_GLOBAL_DATA_PTR;
30
dram_init(void)31 int dram_init(void)
32 {
33 gd->ram_size = imx_ddr_size();
34
35 return 0;
36 }
37
38 static const uint16_t tqma6_emmc_dsr = 0x0100;
39
40
board_early_init_f(void)41 int board_early_init_f(void)
42 {
43 return tqma6_bb_board_early_init_f();
44 }
45
board_init(void)46 int board_init(void)
47 {
48 /* address of boot parameters */
49 gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
50
51 #ifndef CONFIG_DM_SPI
52 tqma6_iomuxc_spi();
53 #endif
54 tqma6_bb_board_init();
55
56 return 0;
57 }
58
tqma6_get_boardname(void)59 static const char *tqma6_get_boardname(void)
60 {
61 u32 cpurev = get_cpu_rev();
62
63 switch ((cpurev & 0xFF000) >> 12) {
64 case MXC_CPU_MX6SOLO:
65 return "TQMa6S";
66 break;
67 case MXC_CPU_MX6DL:
68 return "TQMa6DL";
69 break;
70 case MXC_CPU_MX6D:
71 return "TQMa6D";
72 break;
73 case MXC_CPU_MX6Q:
74 return "TQMa6Q";
75 break;
76 default:
77 return "??";
78 };
79 }
80
81 #if CONFIG_IS_ENABLED(DM_PMIC)
82 /* setup board specific PMIC */
power_init_board(void)83 int power_init_board(void)
84 {
85 struct udevice *dev;
86 u32 reg, rev;
87 int ret;
88
89 ret = pmic_get("pmic@8", &dev);
90 if (ret < 0)
91 return 0;
92
93 reg = pmic_reg_read(dev, PFUZE100_DEVICEID);
94 rev = pmic_reg_read(dev, PFUZE100_REVID);
95
96 printf("PMIC: PFUZE100 ID=0x%02x REV=0x%02x\n", reg, rev);
97 return 0;
98 }
99 #endif
100
board_late_init(void)101 int board_late_init(void)
102 {
103 env_set("board_name", tqma6_get_boardname());
104
105 tqma6_bb_board_late_init();
106
107 printf("Board: %s on a %s\n", tqma6_get_boardname(),
108 tqma6_bb_get_boardname());
109 return 0;
110 }
111
112 /*
113 * Device Tree Support
114 */
115 #if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
116 #define MODELSTRLEN 32u
ft_board_setup(void * blob,struct bd_info * bd)117 int ft_board_setup(void *blob, struct bd_info *bd)
118 {
119 char modelstr[MODELSTRLEN];
120
121 snprintf(modelstr, MODELSTRLEN, "TQ %s on %s", tqma6_get_boardname(),
122 tqma6_bb_get_boardname());
123 do_fixup_by_path_string(blob, "/", "model", modelstr);
124 fdt_fixup_memory(blob, (u64)PHYS_SDRAM, (u64)gd->ram_size);
125 /* bring in eMMC dsr settings */
126 do_fixup_by_path_u32(blob,
127 "/soc/aips-bus@02100000/usdhc@02198000",
128 "dsr", tqma6_emmc_dsr, 2);
129 tqma6_bb_ft_board_setup(blob, bd);
130
131 return 0;
132 }
133 #endif /* defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT) */
134