xref: /aosp_15_r20/external/coreboot/src/soc/samsung/exynos5250/pinmux.c (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <console/console.h>
4 #include <soc/gpio.h>
5 #include <soc/pinmux.h>
6 
exynos_pinmux_uart(int start,int count)7 static void exynos_pinmux_uart(int start, int count)
8 {
9 	int i;
10 
11 	for (i = start; i < start + count; i++) {
12 		gpio_set_pull(i, GPIO_PULL_NONE);
13 		gpio_cfg_pin(i, GPIO_FUNC(0x2));
14 	}
15 }
16 
exynos_pinmux_uart0(void)17 void exynos_pinmux_uart0(void)
18 {
19 	exynos_pinmux_uart(GPIO_A00, 4);
20 }
21 
exynos_pinmux_uart1(void)22 void exynos_pinmux_uart1(void)
23 {
24 	exynos_pinmux_uart(GPIO_D00, 4);
25 }
26 
exynos_pinmux_uart2(void)27 void exynos_pinmux_uart2(void)
28 {
29 	exynos_pinmux_uart(GPIO_A10, 4);
30 }
31 
exynos_pinmux_uart3(void)32 void exynos_pinmux_uart3(void)
33 {
34 	exynos_pinmux_uart(GPIO_A14, 2);
35 }
36 
exynos_pinmux_sdmmc(int start,int start_ext)37 static void exynos_pinmux_sdmmc(int start, int start_ext)
38 {
39 	int i;
40 
41 	if (start_ext) {
42 		for (i = 0; i <= 3; i++) {
43 			gpio_cfg_pin(start_ext + i, GPIO_FUNC(0x2));
44 			gpio_set_pull(start_ext + i, GPIO_PULL_UP);
45 			gpio_set_drv(start_ext + i, GPIO_DRV_4X);
46 		}
47 	}
48 	for (i = 0; i < 2; i++) {
49 		gpio_cfg_pin(start + i, GPIO_FUNC(0x2));
50 		gpio_set_pull(start + i, GPIO_PULL_NONE);
51 		gpio_set_drv(start + i, GPIO_DRV_4X);
52 	}
53 	for (i = 2; i <= 6; i++) {
54 		gpio_cfg_pin(start + i, GPIO_FUNC(0x2));
55 		gpio_set_pull(start + i, GPIO_PULL_UP);
56 		gpio_set_drv(start + i, GPIO_DRV_4X);
57 	}
58 }
59 
exynos_pinmux_sdmmc0(void)60 void exynos_pinmux_sdmmc0(void)
61 {
62 	exynos_pinmux_sdmmc(GPIO_C00, GPIO_C10);
63 }
64 
exynos_pinmux_sdmmc1(void)65 void exynos_pinmux_sdmmc1(void)
66 {
67 	exynos_pinmux_sdmmc(GPIO_C20, 0);
68 }
69 
exynos_pinmux_sdmmc2(void)70 void exynos_pinmux_sdmmc2(void)
71 {
72 	exynos_pinmux_sdmmc(GPIO_C30, 0);
73 }
74 
exynos_pinmux_sdmmc3(void)75 void exynos_pinmux_sdmmc3(void)
76 {
77 	/*
78 	 * TODO: Need to add definitions for GPC4 before
79 	 * enabling this.
80 	 */
81 	printk(BIOS_DEBUG, "SDMMC3 not supported yet");
82 }
83 
exynos_pinmux_sromc(int bank,int sixteen_bit)84 void exynos_pinmux_sromc(int bank, int sixteen_bit)
85 {
86 	int i;
87 
88 	if (bank > 3) {
89 		printk(BIOS_DEBUG, "Unsupported sromc bank %d.\n", bank);
90 		return;
91 	}
92 
93 	gpio_cfg_pin(GPIO_Y00 + bank, GPIO_FUNC(2));
94 	gpio_cfg_pin(GPIO_Y04, GPIO_FUNC(2));
95 	gpio_cfg_pin(GPIO_Y05, GPIO_FUNC(2));
96 
97 	for (i = 2; i < 4; i++)
98 		gpio_cfg_pin(GPIO_Y10 + i, GPIO_FUNC(2));
99 
100 	for (i = 0; i < 8; i++) {
101 		gpio_cfg_pin(GPIO_Y30 + i, GPIO_FUNC(2));
102 		gpio_set_pull(GPIO_Y30 + i, GPIO_PULL_UP);
103 
104 		gpio_cfg_pin(GPIO_Y50 + i, GPIO_FUNC(2));
105 		gpio_set_pull(GPIO_Y50 + i, GPIO_PULL_UP);
106 
107 		if (sixteen_bit) {
108 			gpio_cfg_pin(GPIO_Y60 + i, GPIO_FUNC(2));
109 			gpio_set_pull(GPIO_Y60 + i, GPIO_PULL_UP);
110 		}
111 	}
112 }
113 
exynos_pinmux_spi(int start,int cfg)114 static void exynos_pinmux_spi(int start, int cfg)
115 {
116 	int i;
117 
118 	for (i = 0; i < 4; i++) {
119 		gpio_cfg_pin(start + i, GPIO_FUNC(cfg));
120 		gpio_set_pull(start + i, GPIO_PULL_NONE);
121 		gpio_set_drv(start + i, GPIO_DRV_3X);
122 	}
123 }
124 
exynos_pinmux_spi0(void)125 void exynos_pinmux_spi0(void)
126 {
127 	exynos_pinmux_spi(GPIO_A20, 0x2);
128 }
129 
exynos_pinmux_spi1(void)130 void exynos_pinmux_spi1(void)
131 {
132 	exynos_pinmux_spi(GPIO_A24, 0x2);
133 }
134 
exynos_pinmux_spi2(void)135 void exynos_pinmux_spi2(void)
136 {
137 	exynos_pinmux_spi(GPIO_B11, 0x5);
138 }
139 
exynos_pinmux_spi3(void)140 void exynos_pinmux_spi3(void)
141 {
142 	exynos_pinmux_spi(GPIO_E00, 0x2);
143 }
144 
exynos_pinmux_spi4(void)145 void exynos_pinmux_spi4(void)
146 {
147 	int i;
148 
149 	for (i = 0; i < 2; i++)
150 		gpio_cfg_pin(GPIO_F02 + i, GPIO_FUNC(0x4));
151 	for (i = 2; i < 4; i++)
152 		gpio_cfg_pin(GPIO_E02 + i, GPIO_FUNC(0x4));
153 }
154 
exynos_pinmux_backlight(void)155 void exynos_pinmux_backlight(void)
156 {
157 	gpio_cfg_pin(GPIO_B20, GPIO_OUTPUT);
158 	gpio_set_value(GPIO_B20, 1);
159 }
160 
exynos_pinmux_lcd(void)161 void exynos_pinmux_lcd(void)
162 {
163 	gpio_cfg_pin(GPIO_Y25, GPIO_OUTPUT);
164 	gpio_set_value(GPIO_Y25, 1);
165 	gpio_cfg_pin(GPIO_X15, GPIO_OUTPUT);
166 	gpio_set_value(GPIO_X15, 1);
167 	gpio_cfg_pin(GPIO_X30, GPIO_OUTPUT);
168 	gpio_set_value(GPIO_X30, 1);
169 }
170 
exynos_pinmux_i2c(int start,int func)171 static void exynos_pinmux_i2c(int start, int func)
172 {
173 	gpio_cfg_pin(start, GPIO_FUNC(func));
174 	gpio_cfg_pin(start + 1, GPIO_FUNC(func));
175 	gpio_set_pull(start, GPIO_PULL_NONE);
176 	gpio_set_pull(start + 1, GPIO_PULL_NONE);
177 }
178 
exynos_pinmux_i2c0(void)179 void exynos_pinmux_i2c0(void)
180 {
181 	exynos_pinmux_i2c(GPIO_B30, 0x2);
182 }
183 
exynos_pinmux_i2c1(void)184 void exynos_pinmux_i2c1(void)
185 {
186 	exynos_pinmux_i2c(GPIO_B32, 0x2);
187 }
188 
exynos_pinmux_i2c2(void)189 void exynos_pinmux_i2c2(void)
190 {
191 	exynos_pinmux_i2c(GPIO_A06, 0x3);
192 }
193 
exynos_pinmux_i2c3(void)194 void exynos_pinmux_i2c3(void)
195 {
196 	exynos_pinmux_i2c(GPIO_A12, 0x3);
197 }
198 
exynos_pinmux_i2c4(void)199 void exynos_pinmux_i2c4(void)
200 {
201 	exynos_pinmux_i2c(GPIO_A20, 0x3);
202 }
203 
exynos_pinmux_i2c5(void)204 void exynos_pinmux_i2c5(void)
205 {
206 	exynos_pinmux_i2c(GPIO_A22, 0x3);
207 }
208 
exynos_pinmux_i2c6(void)209 void exynos_pinmux_i2c6(void)
210 {
211 	exynos_pinmux_i2c(GPIO_B13, 0x4);
212 }
213 
exynos_pinmux_i2c7(void)214 void exynos_pinmux_i2c7(void)
215 {
216 	exynos_pinmux_i2c(GPIO_B22, 0x3);
217 }
218 
exynos_pinmux_dphpd(void)219 void exynos_pinmux_dphpd(void)
220 {
221 	/* Set Hotplug detect for DP */
222 	gpio_cfg_pin(GPIO_X07, GPIO_FUNC(0x3));
223 
224 	/*
225 	 * Hotplug detect should have an external pullup; disable the
226 	 * internal pulldown so they don't fight.
227 	 */
228 	gpio_set_pull(GPIO_X07, GPIO_PULL_NONE);
229 }
230 
exynos_pinmux_i2s0(void)231 void exynos_pinmux_i2s0(void)
232 {
233 	int i;
234 
235 	for (i = 0; i < 5; i++) {
236 		gpio_cfg_pin(GPIO_Z0 + i, GPIO_FUNC(0x02));
237 		gpio_set_pull(GPIO_Z0 + i, GPIO_PULL_NONE);
238 	}
239 }
240 
exynos_pinmux_i2s1(void)241 void exynos_pinmux_i2s1(void)
242 {
243 	int i;
244 
245 	for (i = 0; i < 5; i++) {
246 		gpio_cfg_pin(GPIO_B00 + i, GPIO_FUNC(0x02));
247 		gpio_set_pull(GPIO_B00 + i, GPIO_PULL_NONE);
248 	}
249 }
250