71 lines
2.2 KiB
C
71 lines
2.2 KiB
C
/*
|
|
* 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 <arch/io.h>
|
|
#include <console/console.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(&mt8173_gpio->exmd_ctrl[0].rst, 0x3F5);
|
|
write16(&mt8173_gpio->exmd_ctrl[0].set, 0xA);
|
|
} else if (ext_power == GPIO_EINT_3P3V) {
|
|
/* exmd_ctrl[9:4] = b`001100, [3:0] = b`1010 */
|
|
write16(&mt8173_gpio->exmd_ctrl[0].rst, 0x335);
|
|
write16(&mt8173_gpio->exmd_ctrl[0].set, 0xCA);
|
|
}
|
|
|
|
/* other R/TDSEL */
|
|
/* msdc2_ctrl5 , bit[3:0] = b`1010 */
|
|
write16(&mt8173_gpio->msdc2_ctrl5.set, 0xA);
|
|
write16(&mt8173_gpio->msdc2_ctrl5.rst, 0x5);
|
|
}
|
|
|
|
void gpio_init(enum external_power ext_power)
|
|
{
|
|
set_gpi_from_mipi();
|
|
gpio_set_duty(ext_power);
|
|
}
|