/* SPDX-License-Identifier: GPL-2.0-only */ #include <device/mmio.h> #include <gpio.h> #include <soc/mipi.h> /* * GPIO 47-56 are controlled by MIPI register by default. * When they are used as GPI, we have to set IES of MIPI register to 1. * Additionally, pulls of these pins are controlled by MIPI, * and pull-setting of these pins are forbidden in our driver. */ static void set_gpi_from_mipi(void) { setbits32(&mt8173_mipi->mipi_rx_ana4c, 1 << 0 | /* RG_MIPI_GPI0_IES GPI47 */ 1 << 6 | /* RG_MIPI_GPI1_IES GPI48 */ 1 << 12 | /* RG_MIPI_GPI2_IES GPI49 */ 1 << 18 | /* RG_MIPI_GPI3_IES GPI50 */ 1 << 24); /* RF_MIPI_GPI4_IES GPI51 */ setbits32(&mt8173_mipi->mipi_rx_ana50, 1 << 0 | /* RG_MIPI_GPI5_IES GPI52 */ 1 << 6 | /* RG_MIPI_GPI6_IES GPI53 */ 1 << 12 | /* RG_MIPI_GPI7_IES GPI54 */ 1 << 18 | /* RG_MIPI_GPI8_IES GPI55 */ 1 << 24); /* RF_MIPI_GPI9_IES GPI56 */ } /* * overwrite the T/RDSEL default value of exmd_ctrl and * msdc2_ctrl5 as b'1010 */ static void gpio_set_duty(enum external_power ext_power) { /* EXMD control reg */ if (ext_power == GPIO_EINT_1P8V) { /* exmd_ctrl[9:4] = b`000000, [3:0] = b`1010 */ write16(&mtk_gpio->exmd_ctrl[0].rst, 0x3F5); write16(&mtk_gpio->exmd_ctrl[0].set, 0xA); } else if (ext_power == GPIO_EINT_3P3V) { /* exmd_ctrl[9:4] = b`001100, [3:0] = b`1010 */ write16(&mtk_gpio->exmd_ctrl[0].rst, 0x335); write16(&mtk_gpio->exmd_ctrl[0].set, 0xCA); } /* other R/TDSEL */ /* msdc2_ctrl5, bit[3:0] = b`1010 */ write16(&mtk_gpio->msdc2_ctrl5.set, 0xA); write16(&mtk_gpio->msdc2_ctrl5.rst, 0x5); } void gpio_init(enum external_power ext_power) { set_gpi_from_mipi(); gpio_set_duty(ext_power); }