diff options
-rw-r--r-- | src/mainboard/google/rush_ryu/Makefile.inc | 1 | ||||
-rw-r--r-- | src/mainboard/google/rush_ryu/gpio.h | 6 | ||||
-rw-r--r-- | src/mainboard/google/rush_ryu/mainboard.c | 114 | ||||
-rw-r--r-- | src/soc/nvidia/tegra132/include/soc/clock.h | 3 |
4 files changed, 115 insertions, 9 deletions
diff --git a/src/mainboard/google/rush_ryu/Makefile.inc b/src/mainboard/google/rush_ryu/Makefile.inc index 3b71c79ef9..3a6090d542 100644 --- a/src/mainboard/google/rush_ryu/Makefile.inc +++ b/src/mainboard/google/rush_ryu/Makefile.inc @@ -45,6 +45,7 @@ ramstage-y += boardid.c ramstage-y += mainboard.c ramstage-y += reset.c ramstage-y += chromeos.c +ramstage-y += pmic.c bootblock-y += memlayout.ld romstage-y += memlayout.ld diff --git a/src/mainboard/google/rush_ryu/gpio.h b/src/mainboard/google/rush_ryu/gpio.h index 89f32801f0..a813d42332 100644 --- a/src/mainboard/google/rush_ryu/gpio.h +++ b/src/mainboard/google/rush_ryu/gpio.h @@ -62,6 +62,12 @@ enum { BTN_AP_PWR = GPIO(Q0), POWER_BUTTON = BTN_AP_PWR, POWER_BUTTON_INDEX = GPIO_Q0_INDEX, + + /* Panel related GPIOs */ + LCD_EN = GPIO(H5), + LCD_RST_L = GPIO(H3), + EN_VDD18_LCD = GPIO(X0), + EN_VDD_LCD = GPIO(BB6), /* P1/P3 board */ }; #endif /* __MAINBOARD_GOOGLE_RUSH_RYU_GPIO_H__ */ diff --git a/src/mainboard/google/rush_ryu/mainboard.c b/src/mainboard/google/rush_ryu/mainboard.c index 9ad7f778c8..2b71c98038 100644 --- a/src/mainboard/google/rush_ryu/mainboard.c +++ b/src/mainboard/google/rush_ryu/mainboard.c @@ -21,6 +21,7 @@ #include <boardid.h> #include <boot/coreboot_tables.h> #include <cbmem.h> +#include <delay.h> #include <device/device.h> #include <elog.h> #include <memrange.h> @@ -38,6 +39,7 @@ #endif #include "gpio.h" +#include "pmic.h" static const struct pad_config mmcpads[] = { /* MMC4 (eMMC) */ @@ -88,18 +90,105 @@ static void fix_ec_sw_sync(void) #endif } -static void mainboard_init(device_t dev) +static const struct pad_config lcd_gpio_padcfgs[] = { + /* LCD_EN */ + PAD_CFG_GPIO_OUT0(GPIO_PH5, PINMUX_PULL_UP), + /* LCD_RST_L */ + PAD_CFG_GPIO_OUT0(GPIO_PH3, PINMUX_PULL_UP), + /* EN_VDD_LCD */ + PAD_CFG_GPIO_OUT0(GPIO_PBB6, PINMUX_PULL_NONE), + /* EN_VDD18_LCD */ + PAD_CFG_GPIO_OUT0(DVFS_PWM, PINMUX_PULL_DOWN), +}; + +static void configure_display_clocks(void) { - /* PLLD should be 2 * pixel clock (301620khz). */ - const uint32_t req_disp_clk = 301620 * 1000 * 2; - uint32_t disp_clk; + u32 lclks = CLK_L_HOST1X | CLK_L_DISP1; /* dc */ + u32 hclks = CLK_H_MIPI_CAL | CLK_H_DSI; /* mipi phy, mipi-dsi a */ + u32 uclks = CLK_U_DSIB; /* mipi-dsi b */ + u32 xclks = CLK_X_CLK72MHZ; /* clk src of mipi_cal */ - soc_configure_funits(funits, ARRAY_SIZE(funits)); - disp_clk = clock_display(req_disp_clk); + clock_enable_clear_reset(lclks, hclks, uclks, 0, 0, xclks); + + /* Give clocks time to stabilize. */ + udelay(IO_STABILIZATION_DELAY); +} + +static int enable_lcd_vdd(void) +{ + uint8_t data; + + /* Set 1.20V to power AVDD_DSI_CSI */ + pmic_write_reg(I2CPWR_BUS, TI65913_LDO5_VOLTAGE, + VSEL_1200, 1); + pmic_write_reg(I2CPWR_BUS, TI65913_LDO5_CTRL, + TI65913_MODE_ACTIVE_ON, 1); + /* wait for 100ms */ + mdelay(100); + + /* + * Enable VDD_LCD + * + * Use different GPIO based on board id + */ + switch (board_id()) { + case BOARD_ID_PROTO_0: + /* Select PMIC GPIO_6's primary function */ + pmic_read_reg(I2CPWR_BUS, TI65913_PAD2, &data); + pmic_write_reg(I2CPWR_BUS, TI65913_PAD2, + PAD2_GPIO_6_PRIMARY(data), 0); + + /* Set PMIC_GPIO_6 as output */ + pmic_read_reg(I2CPWR_BUS, TI65913_GPIO_DATA_DIR, &data); + pmic_write_reg(I2CPWR_BUS, TI65913_GPIO_DATA_DIR, + TI65913_GPIO_6_OUTPUT, 0); + + /* Set PMIC_GPIO_6 output high */ + pmic_read_reg(I2CPWR_BUS, TI65913_GPIO_DATA_OUT, &data); + pmic_write_reg(I2CPWR_BUS, TI65913_GPIO_DATA_OUT, + TI65913_GPIO_6_HIGH, 1); + break; + case BOARD_ID_PROTO_1: + case BOARD_ID_PROTO_3: + gpio_set(EN_VDD_LCD, 1); + break; + default: /* unknown board */ + return -1; + } + /* wait for 2ms */ + mdelay(2); + + /* Enable PP1800_LCDIO to panel */ + gpio_set(EN_VDD18_LCD, 1); + /* wait for 1ms */ + mdelay(1); + + /* Set panel EN and RST signals */ + gpio_set(LCD_EN, 1); /* enable */ + /* wait for min 10ms */ + mdelay(10); + gpio_set(LCD_RST_L, 1); /* clear reset */ + /* wait for min 3ms */ + mdelay(3); + + return 0; +} - if (disp_clk != req_disp_clk) - printk(BIOS_DEBUG, "display clock: %u vs %u (r)\n", disp_clk, - req_disp_clk); +static int configure_display_blocks(void) +{ + /* set and enable panel related vdd */ + if (enable_lcd_vdd()) + return -1; + + /* enable display related clocks */ + configure_display_clocks(); + + return 0; +} + +static void mainboard_init(device_t dev) +{ + soc_configure_funits(funits, ARRAY_SIZE(funits)); /* I2C6 bus (audio, etc.) */ soc_configure_i2c6pad(); @@ -108,6 +197,13 @@ static void mainboard_init(device_t dev) elog_add_boot_reason(); fix_ec_sw_sync(); + + /* configure panel gpio pads */ + soc_configure_pads(lcd_gpio_padcfgs, ARRAY_SIZE(lcd_gpio_padcfgs)); + + /* if panel needs to bringup */ + if (!vboot_skip_display_init()) + configure_display_blocks(); } static void mainboard_enable(device_t dev) diff --git a/src/soc/nvidia/tegra132/include/soc/clock.h b/src/soc/nvidia/tegra132/include/soc/clock.h index e62e0aad32..7fabff74e6 100644 --- a/src/soc/nvidia/tegra132/include/soc/clock.h +++ b/src/soc/nvidia/tegra132/include/soc/clock.h @@ -186,6 +186,8 @@ enum { CLK_S = 6, PLLE = 7, PLLA = 8, + PLLD = 9, + PLLD2 = 10, UNUSED = 100, UNUSED1 = 101, UNUSED2 = 102, @@ -212,6 +214,7 @@ enum { CLK_SRC_FREQ_ID(dev, g) = g enum { + CLK_SRC_DEVICE(disp1, PLLP, PLLM, PLLD, PLLA, PLLC, PLLD2, CLK_M), CLK_SRC_DEVICE(host1x, PLLM, PLLC2, PLLC, PLLC3, PLLP, UNUSED, PLLA), CLK_SRC_DEVICE(I2C1, PLLP, PLLC2, PLLC, PLLC3, PLLM, UNUSED, CLK_M), CLK_SRC_DEVICE(I2C2, PLLP, PLLC2, PLLC, PLLC3, PLLM, UNUSED, CLK_M), |