<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>