xref: /aosp_15_r20/external/coreboot/src/soc/mediatek/mt8173/gpio_init.c (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <device/mmio.h>
4 #include <gpio.h>
5 #include <soc/mipi.h>
6 
7 /*
8  * GPIO 47-56 are controlled by MIPI register by default.
9  * When they are used as GPI, we have to set IES of MIPI register to 1.
10  * Additionally, pulls of these pins are controlled by MIPI,
11  * and pull-setting of these pins are forbidden in our driver.
12  */
set_gpi_from_mipi(void)13 static void set_gpi_from_mipi(void)
14 {
15 	setbits32(&mt8173_mipi->mipi_rx_ana4c,
16 		1 << 0  |	/* RG_MIPI_GPI0_IES GPI47 */
17 		1 << 6  |	/* RG_MIPI_GPI1_IES GPI48 */
18 		1 << 12 |	/* RG_MIPI_GPI2_IES GPI49 */
19 		1 << 18 |	/* RG_MIPI_GPI3_IES GPI50 */
20 		1 << 24);	/* RF_MIPI_GPI4_IES GPI51 */
21 
22 	setbits32(&mt8173_mipi->mipi_rx_ana50,
23 		1 << 0  |	/* RG_MIPI_GPI5_IES GPI52 */
24 		1 << 6  |	/* RG_MIPI_GPI6_IES GPI53 */
25 		1 << 12 |	/* RG_MIPI_GPI7_IES GPI54 */
26 		1 << 18 |	/* RG_MIPI_GPI8_IES GPI55 */
27 		1 << 24);	/* RF_MIPI_GPI9_IES GPI56 */
28 }
29 
30 /*
31  * overwrite the T/RDSEL default value of exmd_ctrl and
32  * msdc2_ctrl5 as b'1010
33  */
gpio_set_duty(enum external_power ext_power)34 static void gpio_set_duty(enum external_power ext_power)
35 {
36 	/* EXMD control reg */
37 	if (ext_power == GPIO_EINT_1P8V) {
38 		/* exmd_ctrl[9:4] = b`000000, [3:0] = b`1010 */
39 		write16(&mtk_gpio->exmd_ctrl[0].rst, 0x3F5);
40 		write16(&mtk_gpio->exmd_ctrl[0].set, 0xA);
41 	} else if (ext_power == GPIO_EINT_3P3V) {
42 		/* exmd_ctrl[9:4] = b`001100, [3:0] = b`1010 */
43 		write16(&mtk_gpio->exmd_ctrl[0].rst, 0x335);
44 		write16(&mtk_gpio->exmd_ctrl[0].set, 0xCA);
45 	}
46 
47 	/* other R/TDSEL */
48 	/* msdc2_ctrl5, bit[3:0] = b`1010 */
49 	write16(&mtk_gpio->msdc2_ctrl5.set, 0xA);
50 	write16(&mtk_gpio->msdc2_ctrl5.rst, 0x5);
51 }
52 
gpio_init(enum external_power ext_power)53 void gpio_init(enum external_power ext_power)
54 {
55 	set_gpi_from_mipi();
56 	gpio_set_duty(ext_power);
57 }
58