1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (c) 2016-2018 Toradex, Inc.
4  */
5 
6 #include <common.h>
7 #include <dm.h>
8 #include <asm/arch-tegra/ap.h>
9 #include <asm/gpio.h>
10 #include <asm/io.h>
11 #include <asm/arch/gpio.h>
12 #include <asm/arch/pinmux.h>
13 #include <pci_tegra.h>
14 #include <power/as3722.h>
15 #include <power/pmic.h>
16 
17 #include "../common/tdx-common.h"
18 #include "pinmux-config-apalis-tk1.h"
19 
20 #define LAN_DEV_OFF_N	TEGRA_GPIO(O, 6)
21 #define LAN_RESET_N	TEGRA_GPIO(S, 2)
22 #define LAN_WAKE_N	TEGRA_GPIO(O, 5)
23 #ifdef CONFIG_APALIS_TK1_PCIE_EVALBOARD_INIT
24 #define PEX_PERST_N	TEGRA_GPIO(DD, 1) /* Apalis GPIO7 */
25 #define RESET_MOCI_CTRL	TEGRA_GPIO(U, 4)
26 #endif /* CONFIG_APALIS_TK1_PCIE_EVALBOARD_INIT */
27 
arch_misc_init(void)28 int arch_misc_init(void)
29 {
30 	if (readl(NV_PA_BASE_SRAM + NVBOOTINFOTABLE_BOOTTYPE) ==
31 	    NVBOOTTYPE_RECOVERY)
32 		printf("USB recovery mode\n");
33 
34 	return 0;
35 }
36 
checkboard(void)37 int checkboard(void)
38 {
39 	puts("Model: Toradex Apalis TK1 2GB\n");
40 
41 	return 0;
42 }
43 
44 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
ft_board_setup(void * blob,bd_t * bd)45 int ft_board_setup(void *blob, bd_t *bd)
46 {
47 	return ft_common_board_setup(blob, bd);
48 }
49 #endif
50 
51 /*
52  * Routine: pinmux_init
53  * Description: Do individual peripheral pinmux configs
54  */
pinmux_init(void)55 void pinmux_init(void)
56 {
57 	pinmux_clear_tristate_input_clamping();
58 
59 	gpio_config_table(apalis_tk1_gpio_inits,
60 			  ARRAY_SIZE(apalis_tk1_gpio_inits));
61 
62 	pinmux_config_pingrp_table(apalis_tk1_pingrps,
63 				   ARRAY_SIZE(apalis_tk1_pingrps));
64 
65 	pinmux_config_drvgrp_table(apalis_tk1_drvgrps,
66 				   ARRAY_SIZE(apalis_tk1_drvgrps));
67 }
68 
69 #ifdef CONFIG_PCI_TEGRA
70 /* TODO: Convert to driver model */
as3722_sd_enable(struct udevice * pmic,unsigned int sd)71 static int as3722_sd_enable(struct udevice *pmic, unsigned int sd)
72 {
73 	int err;
74 
75 	if (sd > 6)
76 		return -EINVAL;
77 
78 	err = pmic_clrsetbits(pmic, AS3722_SD_CONTROL, 0, 1 << sd);
79 	if (err) {
80 		pr_err("failed to update SD control register: %d", err);
81 		return err;
82 	}
83 
84 	return 0;
85 }
86 
87 /* TODO: Convert to driver model */
as3722_ldo_enable(struct udevice * pmic,unsigned int ldo)88 static int as3722_ldo_enable(struct udevice *pmic, unsigned int ldo)
89 {
90 	int err;
91 	u8 ctrl_reg = AS3722_LDO_CONTROL0;
92 
93 	if (ldo > 11)
94 		return -EINVAL;
95 
96 	if (ldo > 7) {
97 		ctrl_reg = AS3722_LDO_CONTROL1;
98 		ldo -= 8;
99 	}
100 
101 	err = pmic_clrsetbits(pmic, ctrl_reg, 0, 1 << ldo);
102 	if (err) {
103 		pr_err("failed to update LDO control register: %d", err);
104 		return err;
105 	}
106 
107 	return 0;
108 }
109 
tegra_pcie_board_init(void)110 int tegra_pcie_board_init(void)
111 {
112 	struct udevice *dev;
113 	int ret;
114 
115 	ret = uclass_get_device_by_driver(UCLASS_PMIC,
116 					  DM_GET_DRIVER(pmic_as3722), &dev);
117 	if (ret) {
118 		pr_err("failed to find AS3722 PMIC: %d\n", ret);
119 		return ret;
120 	}
121 
122 	ret = as3722_sd_enable(dev, 4);
123 	if (ret < 0) {
124 		pr_err("failed to enable SD4: %d\n", ret);
125 		return ret;
126 	}
127 
128 	ret = as3722_sd_set_voltage(dev, 4, 0x24);
129 	if (ret < 0) {
130 		pr_err("failed to set SD4 voltage: %d\n", ret);
131 		return ret;
132 	}
133 
134 	gpio_request(LAN_DEV_OFF_N, "LAN_DEV_OFF_N");
135 	gpio_request(LAN_RESET_N, "LAN_RESET_N");
136 	gpio_request(LAN_WAKE_N, "LAN_WAKE_N");
137 
138 #ifdef CONFIG_APALIS_TK1_PCIE_EVALBOARD_INIT
139 	gpio_request(PEX_PERST_N, "PEX_PERST_N");
140 	gpio_request(RESET_MOCI_CTRL, "RESET_MOCI_CTRL");
141 #endif /* CONFIG_APALIS_TK1_PCIE_EVALBOARD_INIT */
142 
143 	return 0;
144 }
145 
tegra_pcie_board_port_reset(struct tegra_pcie_port * port)146 void tegra_pcie_board_port_reset(struct tegra_pcie_port *port)
147 {
148 	int index = tegra_pcie_port_index_of_port(port);
149 
150 	if (index == 1) { /* I210 Gigabit Ethernet Controller (On-module) */
151 		struct udevice *dev;
152 		int ret;
153 
154 		ret = uclass_get_device_by_driver(UCLASS_PMIC,
155 						  DM_GET_DRIVER(pmic_as3722),
156 						  &dev);
157 		if (ret) {
158 			debug("%s: Failed to find PMIC\n", __func__);
159 			return;
160 		}
161 
162 		/* Reset I210 Gigabit Ethernet Controller */
163 		gpio_direction_output(LAN_RESET_N, 0);
164 
165 		/*
166 		 * Make sure we don't get any back feeding from DEV_OFF_N resp.
167 		 * LAN_WAKE_N
168 		 */
169 		gpio_direction_output(LAN_DEV_OFF_N, 0);
170 		gpio_direction_output(LAN_WAKE_N, 0);
171 
172 		/* Make sure LDO9 and LDO10 are initially enabled @ 0V */
173 		ret = as3722_ldo_enable(dev, 9);
174 		if (ret < 0) {
175 			pr_err("failed to enable LDO9: %d\n", ret);
176 			return;
177 		}
178 		ret = as3722_ldo_enable(dev, 10);
179 		if (ret < 0) {
180 			pr_err("failed to enable LDO10: %d\n", ret);
181 			return;
182 		}
183 		ret = as3722_ldo_set_voltage(dev, 9, 0x80);
184 		if (ret < 0) {
185 			pr_err("failed to set LDO9 voltage: %d\n", ret);
186 			return;
187 		}
188 		ret = as3722_ldo_set_voltage(dev, 10, 0x80);
189 		if (ret < 0) {
190 			pr_err("failed to set LDO10 voltage: %d\n", ret);
191 			return;
192 		}
193 
194 		/* Make sure controller gets enabled by disabling DEV_OFF_N */
195 		gpio_set_value(LAN_DEV_OFF_N, 1);
196 
197 		/*
198 		 * Enable LDO9 and LDO10 for +V3.3_ETH on patched prototype
199 		 * V1.0A and sample V1.0B and newer modules
200 		 */
201 		ret = as3722_ldo_set_voltage(dev, 9, 0xff);
202 		if (ret < 0) {
203 			pr_err("failed to set LDO9 voltage: %d\n", ret);
204 			return;
205 		}
206 		ret = as3722_ldo_set_voltage(dev, 10, 0xff);
207 		if (ret < 0) {
208 			pr_err("failed to set LDO10 voltage: %d\n", ret);
209 			return;
210 		}
211 
212 		/*
213 		 * Must be asserted for 100 ms after power and clocks are stable
214 		 */
215 		mdelay(100);
216 
217 		gpio_set_value(LAN_RESET_N, 1);
218 	} else if (index == 0) { /* Apalis PCIe */
219 #ifdef CONFIG_APALIS_TK1_PCIE_EVALBOARD_INIT
220 		/*
221 		 * Reset PLX PEX 8605 PCIe Switch plus PCIe devices on Apalis
222 		 * Evaluation Board
223 		 */
224 		gpio_direction_output(PEX_PERST_N, 0);
225 		gpio_direction_output(RESET_MOCI_CTRL, 0);
226 
227 		/*
228 		 * Must be asserted for 100 ms after power and clocks are stable
229 		 */
230 		mdelay(100);
231 
232 		gpio_set_value(PEX_PERST_N, 1);
233 		/*
234 		 * Err_5: PEX_REFCLK_OUTpx/nx Clock Outputs is not Guaranteed
235 		 * Until 900 us After PEX_PERST# De-assertion
236 		 */
237 		mdelay(1);
238 		gpio_set_value(RESET_MOCI_CTRL, 1);
239 #endif /* CONFIG_APALIS_TK1_PCIE_EVALBOARD_INIT */
240 	}
241 }
242 #endif /* CONFIG_PCI_TEGRA */
243 
244 /*
245  * Backlight off before OS handover
246  */
board_preboot_os(void)247 void board_preboot_os(void)
248 {
249 	gpio_request(TEGRA_GPIO(BB, 5), "BL_ON");
250 	gpio_direction_output(TEGRA_GPIO(BB, 5), 0);
251 }
252