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