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