summaryrefslogtreecommitdiff
path: root/src/soc/mediatek/mt8173/gpio_init.c
blob: e991a5f75dff27eb5dc7a7c08c61cde9c6c422a7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*
 * This file is part of the coreboot project.
 *
 * Copyright 2015 MediaTek Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#include <device/mmio.h>
#include <soc/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)
{
	setbits_le32(&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 */

	setbits_le32(&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);
}