<p>Julius Werner has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/20587">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">google/gru: Add support for Scarlet rev1<br><br>This patch adds the necessary changes to support Scarlet revision 1.<br>Since the differences to revision 0 are so deep, we have decided not to<br>continue support for it in the same image. Therefore, this patch will<br>break Scarlet rev0.<br><br>All the deviations from other Gru boards are currently guarded by<br>CONFIG_BOARD_GOOGLE_SCARLET. This should be changed later if we<br>introduce more variants based on the newer Scarlet board design.<br><br>Change-Id: I7a7cc11d9387ac1d856663326e35cfa5371e0af2<br>Signed-off-by: Julius Werner <jwerner@chromium.org><br>---<br>M src/mainboard/google/gru/Kconfig<br>M src/mainboard/google/gru/board.h<br>M src/mainboard/google/gru/bootblock.c<br>M src/mainboard/google/gru/mainboard.c<br>M src/mainboard/google/gru/pwm_regulator.c<br>M src/mainboard/google/gru/romstage.c<br>6 files changed, 99 insertions(+), 41 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/87/20587/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">diff --git a/src/mainboard/google/gru/Kconfig b/src/mainboard/google/gru/Kconfig<br>index 75da54d..7bd7606 100644<br>--- a/src/mainboard/google/gru/Kconfig<br>+++ b/src/mainboard/google/gru/Kconfig<br>@@ -75,6 +75,11 @@<br> hex<br> default 0x20<br> <br>+config DRIVER_TPM_SPI_BUS<br>+ hex<br>+ default 0x2 if BOARD_GOOGLE_SCARLET<br>+ default 0x0<br>+<br> config CONSOLE_SERIAL_UART_ADDRESS<br> hex<br> depends on DRIVERS_UART<br>diff --git a/src/mainboard/google/gru/board.h b/src/mainboard/google/gru/board.h<br>index 8acbe34..f240dcf 100644<br>--- a/src/mainboard/google/gru/board.h<br>+++ b/src/mainboard/google/gru/board.h<br>@@ -17,18 +17,36 @@<br> #ifndef __COREBOOT_SRC_MAINBOARD_GOOGLE_GRU_BOARD_H<br> #define __COREBOOT_SRC_MAINBOARD_GOOGLE_GRU_BOARD_H<br> <br>+#include <assert.h><br> #include <gpio.h><br> <br>+#define GPIO_POWEROFF GPIO(1, A, 6)<br>+#define GPIO_RESET GPIO(0, B, 3)<br>+#define GPIO_SDMMC_PWR GPIO(4, D, 5)<br>+<br>+#if IS_ENABLED(CONFIG_BOARD_GOOGLE_SCARLET)<br>+#define GPIO_BACKLIGHT GPIO(4, C, 5)<br>+#define GPIO_EC_IN_RW GPIO(0, A, 1)<br>+#define GPIO_EC_IRQ GPIO(1, C, 2)<br>+#define GPIO_P15V_EN dead_code_t(gpio_t, "PP1500 doesn't exist on Scarlet")<br>+#define GPIO_P18V_AUDIO_PWREN dead_code_t(gpio_t, "doesn't exist on Scarlet")<br>+#define GPIO_P30V_EN dead_code_t(gpio_t, "PP3000 doesn't exist on Scarlet")<br>+#define GPIO_TP_RST_L dead_code_t(gpio_t, "don't need TP_RST_L on Scarlet")<br>+#define GPIO_TPM_IRQ GPIO(1, C, 1)<br>+#define GPIO_WLAN_RST_L dead_code_t(gpio_t, "no WLAN reset on Scarlet in FW")<br>+#define GPIO_WP GPIO(0, B, 5)<br>+#else<br> #define GPIO_BACKLIGHT GPIO(1, C, 1)<br> #define GPIO_EC_IN_RW GPIO(3, B, 0)<br> #define GPIO_EC_IRQ GPIO(0, A, 1)<br>-#define GPIO_POWEROFF GPIO(1, A, 6)<br>-#define GPIO_RESET GPIO(0, B, 3)<br>-#define GPIO_WP GPIO(1, C, 2)<br> #define GPIO_P15V_EN GPIO(0, B, 2)<br>+#define GPIO_P18V_AUDIO_PWREN GPIO(0, A, 2)<br> #define GPIO_P30V_EN GPIO(0, B, 4)<br>-#define GPIO_P18V_AUDIO_PWREN GPIO(0, A, 2)<br>+#define GPIO_TP_RST_L GPIO(3, B, 4) /* may also be an I2C pull-up enable */<br> #define GPIO_TPM_IRQ GPIO(0, A, 5)<br>+#define GPIO_WLAN_RST_L GPIO(1, B, 3)<br>+#define GPIO_WP GPIO(1, C, 2)<br>+#endif<br> <br> void setup_chromeos_gpios(void);<br> <br>diff --git a/src/mainboard/google/gru/bootblock.c b/src/mainboard/google/gru/bootblock.c<br>index 4320fce..7359f2a 100644<br>--- a/src/mainboard/google/gru/bootblock.c<br>+++ b/src/mainboard/google/gru/bootblock.c<br>@@ -44,12 +44,12 @@<br> */<br> write32(&rk3399_grf->io_vsel, RK_SETBITS(1 << 0));<br> <br>- /*<br>- * Let's enable these power rails here, we are already running the SPI<br>- * Flash based code.<br>- */<br>- gpio_output(GPIO(0, B, 2), 1); /* PP1500_EN */<br>- gpio_output(GPIO(0, B, 4), 1); /* PP3000_EN */<br>+ if (!IS_ENABLED(CONFIG_BOARD_GOOGLE_SCARLET)) {<br>+ /* Enable rails powering GPIO blocks, among other things.<br>+ These are EC-controlled on Scarlet and already on. */<br>+ gpio_output(GPIO_P15V_EN, 1);<br>+ gpio_output(GPIO_P30V_EN, 1);<br>+ }<br> <br> #if IS_ENABLED(CONFIG_DRIVERS_UART)<br> _Static_assert(CONFIG_CONSOLE_SERIAL_UART_ADDRESS == UART2_BASE,<br>@@ -92,14 +92,21 @@<br> static void configure_tpm(void)<br> {<br> if (IS_ENABLED(CONFIG_GRU_HAS_TPM2)) {<br>- gpio_input(GPIO(3, A, 4)); /* SPI0_MISO remove pull-up */<br>- gpio_input(GPIO(3, A, 5)); /* SPI0_MOSI remove pull-up */<br>- gpio_input(GPIO(3, A, 6)); /* SPI0_CLK remove pull-up */<br>- gpio_input_pullup(GPIO(3, A, 7)); /* SPI0_CS confirm */<br>-<br> rockchip_spi_init(CONFIG_DRIVER_TPM_SPI_BUS, 1500*KHz);<br> <br>- write32(&rk3399_grf->iomux_spi0, IOMUX_SPI0);<br>+ if (IS_ENABLED(CONFIG_BOARD_GOOGLE_SCARLET)) {<br>+ gpio_input(GPIO(2, B, 1)); /* SPI2_MISO no-pull */<br>+ gpio_input(GPIO(2, B, 2)); /* SPI2_MOSI no-pull */<br>+ gpio_input(GPIO(2, B, 3)); /* SPI2_CLK no-pull */<br>+ gpio_input_pullup(GPIO(2, B, 4)); /* SPI2_CS */<br>+ write32(&rk3399_grf->iomux_spi2, IOMUX_SPI2);<br>+ } else {<br>+ gpio_input(GPIO(3, A, 4)); /* SPI0_MISO no-pull */<br>+ gpio_input(GPIO(3, A, 5)); /* SPI0_MOSI no-pull */<br>+ gpio_input(GPIO(3, A, 6)); /* SPI0_CLK no-pull */<br>+ gpio_input_pullup(GPIO(3, A, 7)); /* SPI0_CS */<br>+ write32(&rk3399_grf->iomux_spi0, IOMUX_SPI0);<br>+ }<br> <br> gpio_input_irq(GPIO_TPM_IRQ, IRQ_TYPE_EDGE_RISING);<br> } else {<br>diff --git a/src/mainboard/google/gru/mainboard.c b/src/mainboard/google/gru/mainboard.c<br>index fa127ed..79953b4 100644<br>--- a/src/mainboard/google/gru/mainboard.c<br>+++ b/src/mainboard/google/gru/mainboard.c<br>@@ -34,21 +34,21 @@<br> <br> /*<br> * We have to drive the stronger pull-up within 1 second of powering up the<br>- * touchpad to prevent its firmware from falling into recovery.<br>+ * touchpad to prevent its firmware from falling into recovery. Not on Scarlet.<br> */<br> static void configure_touchpad(void)<br> {<br>- gpio_output(GPIO(3, B, 4), 1); /* TP's I2C pull-up rail */<br>+ gpio_output(GPIO_TP_RST_L, 1); /* TP's I2C pull-up rail */<br> }<br> <br> /*<br> * Wifi's PDN/RST line is pulled down by its (unpowered) voltage rails, but<br> * this reset pin is pulled up by default. Let's drive it low as early as we<br>- * can.<br>+ * can. Scarlet uses a different WiFi chip that doesn't have this pin anymore.<br> */<br> static void deassert_wifi_power(void)<br> {<br>- gpio_output(GPIO(1, B, 3), 0); /* Assert WLAN_MODULE_RST# */<br>+ gpio_output(GPIO_WLAN_RST_L, 0); /* Assert WLAN_MODULE_RST# */<br> }<br> <br> static void configure_emmc(void)<br>@@ -234,11 +234,21 @@<br> <br> static void configure_display(void)<br> {<br>- /* set pinmux for edp HPD*/<br>- gpio_input_pulldown(GPIO(4, C, 7));<br>- write32(&rk3399_grf->iomux_edp_hotplug, IOMUX_EDP_HOTPLUG);<br>+ if (IS_ENABLED(CONFIG_BOARD_GOOGLE_SCARLET)) {<br>+ gpio_output(GPIO(4, D, 1), 0); /* DISPLAY_RST_L */<br>+ gpio_output(GPIO(4, D, 3), 1); /* PPVARP_LCD */<br>+ mdelay(10);<br>+ gpio_output(GPIO(4, D, 4), 1); /* PPVARN_LCD */<br>+ mdelay(20 + 2); /* add 2ms for bias rise time */<br>+ gpio_output(GPIO(4, D, 1), 1); /* DISPLAY_RST_L */<br>+ mdelay(30);<br>+ } else {<br>+ /* set pinmux for edp HPD */<br>+ gpio_input_pulldown(GPIO(4, C, 7));<br>+ write32(&rk3399_grf->iomux_edp_hotplug, IOMUX_EDP_HOTPLUG);<br> <br>- gpio_output(GPIO(4, D, 3), 1); /* CPU3_EDP_VDDEN for P3.3V_DISP */<br>+ gpio_output(GPIO(4, D, 3), 1); /* P3.3V_DISP */<br>+ }<br> }<br> <br> static void usb_power_cycle(int port)<br>@@ -321,18 +331,20 @@<br> <br> static void mainboard_init(device_t dev)<br> {<br>- deassert_wifi_power();<br>- configure_touchpad();<br> configure_sdmmc();<br> configure_emmc();<br> configure_codec();<br>- configure_display();<br>+ if (display_init_required())<br>+ configure_display();<br> setup_usb(0);<br>- if (!IS_ENABLED(CONFIG_BOARD_GOOGLE_SCARLET))<br>- setup_usb(1);<br>+ if (!IS_ENABLED(CONFIG_BOARD_GOOGLE_SCARLET)) {<br>+ deassert_wifi_power(); /* no WIFI_PD# line */<br>+ configure_touchpad(); /* works differently */<br>+ setup_usb(1); /* only one USB port */<br>+ register_gpio_suspend(); /* all EC-controlled */<br>+ }<br> register_reset_to_bl31();<br> register_poweroff_to_bl31();<br>- register_gpio_suspend();<br> register_apio_suspend();<br> }<br> <br>diff --git a/src/mainboard/google/gru/pwm_regulator.c b/src/mainboard/google/gru/pwm_regulator.c<br>index b85f41f..696f09a 100644<br>--- a/src/mainboard/google/gru/pwm_regulator.c<br>+++ b/src/mainboard/google/gru/pwm_regulator.c<br>@@ -47,10 +47,23 @@<br> [PWM_REGULATOR_CENTERLOG] = {7994, 10499}<br> };<br> <br>+int pwm_enum_to_pwm_number[] = {<br>+ [PWM_REGULATOR_GPU] = 0,<br>+ [PWM_REGULATOR_LIT] = 2,<br>+#if IS_ENABLED(CONFIG_BOARD_GOOGLE_SCARLET)<br>+ [PWM_REGULATOR_BIG] = 3,<br>+ [PWM_REGULATOR_CENTERLOG] = -1, /* fixed regulator on Scarlet */<br>+#else<br>+ [PWM_REGULATOR_BIG] = 1,<br>+ [PWM_REGULATOR_CENTERLOG] = 3,<br>+#endif<br>+};<br>+<br> void pwm_regulator_configure(enum pwm_regulator pwm, int millivolt)<br> {<br> int duty_ns, voltage_max, voltage_min;<br> int voltage = millivolt * 10; /* for higer calculation accuracy */<br>+ int pwm_number = pwm_enum_to_pwm_number[pwm];<br> <br> voltage_min = pwm_design_voltage[pwm][0];<br> voltage_max = pwm_design_voltage[pwm][1];<br>@@ -75,24 +88,26 @@<br> duty_ns = PWM_PERIOD * (voltage_max - voltage)<br> / (voltage_max - voltage_min);<br> <br>- pwm_init(pwm, PWM_PERIOD, duty_ns);<br>+ pwm_init(pwm_number, PWM_PERIOD, duty_ns);<br> <br>- switch (pwm) {<br>- case PWM_REGULATOR_GPU:<br>+ switch (pwm_number) {<br>+ case 0:<br> gpio_input(GPIO(4, C, 2)); /* PWM0 remove pull-down */<br> write32(&rk3399_grf->iomux_pwm_0, IOMUX_PWM_0);<br> break;<br>- case PWM_REGULATOR_BIG:<br>+ case 1:<br> gpio_input(GPIO(4, C, 6)); /* PWM1 remove pull-down */<br> write32(&rk3399_grf->iomux_pwm_1, IOMUX_PWM_1);<br> break;<br>- case PWM_REGULATOR_LIT:<br>+ case 2:<br> gpio_input(GPIO(1, C, 3)); /* PWM2 remove pull-down */<br> write32(&rk3399_pmugrf->iomux_pwm_2, IOMUX_PWM_2);<br> break;<br>- case PWM_REGULATOR_CENTERLOG:<br>+ case 3:<br> gpio_input(GPIO(0, A, 6)); /* PWM3 remove pull-down */<br> write32(&rk3399_pmugrf->iomux_pwm_3a, IOMUX_PWM_3_A);<br> break;<br>+ default:<br>+ die("incorrect board configuration");<br> }<br> }<br>diff --git a/src/mainboard/google/gru/romstage.c b/src/mainboard/google/gru/romstage.c<br>index d644f7d..bde61b2 100644<br>--- a/src/mainboard/google/gru/romstage.c<br>+++ b/src/mainboard/google/gru/romstage.c<br>@@ -33,6 +33,7 @@<br> #include <soc/usb.h><br> #include <stdlib.h><br> <br>+#include "board.h"<br> #include "pwm_regulator.h"<br> <br> static void init_dvs_outputs(void)<br>@@ -40,10 +41,11 @@<br> pwm_regulator_configure(PWM_REGULATOR_GPU, 900);<br> pwm_regulator_configure(PWM_REGULATOR_BIG, 900);<br> <br>- /* Kevin's logic rail has some ripple, so up the voltage a bit */<br>+ /* Kevin's logic rail has some ripple, so up the voltage a bit. Scarlet<br>+ uses a fixed 900mV regulator for centerlogic. */<br> if (IS_ENABLED(CONFIG_BOARD_GOOGLE_KEVIN))<br> pwm_regulator_configure(PWM_REGULATOR_CENTERLOG, 925);<br>- else<br>+ else if (!IS_ENABLED(CONFIG_BOARD_GOOGLE_SCARLET))<br> pwm_regulator_configure(PWM_REGULATOR_CENTERLOG, 900);<br> <br> /* Allow time for the regulators to settle */<br>@@ -52,9 +54,8 @@<br> <br> static void prepare_sdmmc(void)<br> {<br>- /* Enable main SD rail early to allow ramp time before enabling SDIO<br>- * rail. */<br>- gpio_output(GPIO(4, D, 5), 1); /* SDMMC_PWR_EN */<br>+ /* Enable main SD rail early to allow ramp time before powering SDIO. */<br>+ gpio_output(GPIO_SDMMC_PWR, 1);<br> }<br> <br> static void prepare_usb(void)<br></pre><p>To view, visit <a href="https://review.coreboot.org/20587">change 20587</a>. To unsubscribe, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/20587"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I7a7cc11d9387ac1d856663326e35cfa5371e0af2 </div>
<div style="display:none"> Gerrit-Change-Number: 20587 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Julius Werner <jwerner@chromium.org> </div>