Felix Held has submitted this change. ( https://review.coreboot.org/c/coreboot/+/75298?usp=email )
(
9 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one. )Change subject: mb/google/corsola: Fix MIPI panel power on/off sequence ......................................................................
mb/google/corsola: Fix MIPI panel power on/off sequence
Based on the power sequence of the panel [1] and PMIC datasheet [2], the power on T2 sequence VSP to VSN should be large than 1ms, but it's -159us now, and the power off T2 sequence VSP to VSN should be large than 0ms, but it's less than 0 now. Let's modify the power sequence to meet the datasheet requirement.
[1] HX83102-J02_Datasheet_v03.pdf [2] TPS65132-Single-Inductor-Dual-Output-Power-Supply.pdf
BUG=b:282902297 TEST=power sequence T2 pass
Signed-off-by: Ruihai Zhou zhouruihai@huaqin.corp-partner.google.com Change-Id: Ib1625c6a211f849071393f69eaf5c649a8e7f72e Reviewed-on: https://review.coreboot.org/c/coreboot/+/75298 Reviewed-by: Yidi Lin yidilin@google.com Tested-by: build bot (Jenkins) no-reply@coreboot.org --- M src/mainboard/google/corsola/display.c M src/mainboard/google/corsola/display.h M src/mainboard/google/corsola/panel_starmie.c 3 files changed, 19 insertions(+), 74 deletions(-)
Approvals: build bot (Jenkins): Verified Yidi Lin: Looks good to me, approved
diff --git a/src/mainboard/google/corsola/display.c b/src/mainboard/google/corsola/display.c index 9a8ecc5..a66d92e 100644 --- a/src/mainboard/google/corsola/display.c +++ b/src/mainboard/google/corsola/display.c @@ -1,17 +1,13 @@ /* SPDX-License-Identifier: GPL-2.0-only */
-#include <assert.h> #include <boardid.h> #include <cbfs.h> #include <console/console.h> -#include <delay.h> -#include <device/i2c_simple.h> #include <edid.h> #include <gpio.h> #include <soc/ddp.h> #include <soc/dsi.h> #include <soc/gpio_common.h> -#include <soc/i2c.h> #include <soc/mtcmos.h>
#include "display.h" @@ -25,67 +21,6 @@ gpio_output(GPIO_EN_PP3300_DISP_X, 1); }
-int panel_pmic_reg_mask(unsigned int bus, uint8_t chip, uint8_t addr, - uint8_t val, uint8_t mask) -{ - uint8_t msg = 0; - - if (i2c_read_field(bus, chip, addr, &msg, 0xFF, 0) < 0) { - printk(BIOS_ERR, "%s: Failed to read i2c(%u): addr(%u)\n", - __func__, bus, addr); - return -1; - } - - msg &= ~mask; - msg |= val; - - return i2c_write_field(bus, chip, addr, msg, 0xFF, 0); -} - -void tps65132s_program_eeprom(void) -{ - u8 value = 0; - u8 value1 = 0; - - /* Initialize I2C6 for PMIC TPS65132 */ - mtk_i2c_bus_init(PMIC_TPS65132_I2C, I2C_SPEED_FAST); - mdelay(10); - - /* EN_PP6000_MIPI_DISP */ - gpio_output(GPIO_EN_PP3300_DISP_X, 1); - /* EN_PP6000_MIPI_DISP_150MA */ - gpio_output(GPIO_EN_PP3300_SDBRDG_X, 1); - mdelay(10); - - i2c_read_field(PMIC_TPS65132_I2C, PMIC_TPS65132_SLAVE, 0x00, &value, 0xFF, 0); - i2c_read_field(PMIC_TPS65132_I2C, PMIC_TPS65132_SLAVE, 0x01, &value1, 0xFF, 0); - - if (value != 0x14 || value1 != 0x14) { - printk(BIOS_INFO, "Set AVDD AVEE 6.0V to EEPROM Data in first time\n"); - - /* Set AVDD = 6.0V */ - if (panel_pmic_reg_mask(PMIC_TPS65132_I2C, PMIC_TPS65132_SLAVE, 0x00, 0x14, - 0x1F) < 0) - return; - - /* Set AVEE = -6.0V */ - if (panel_pmic_reg_mask(PMIC_TPS65132_I2C, PMIC_TPS65132_SLAVE, 0x01, 0x14, - 0x1F) < 0) - return; - - /* Set EEPROM Data */ - if (panel_pmic_reg_mask(PMIC_TPS65132_I2C, PMIC_TPS65132_SLAVE, 0xFF, 0x80, - 0xFC) < 0) - return; - mdelay(50); - } - /* EN_PP6000_MIPI_DISP */ - gpio_output(GPIO_EN_PP3300_DISP_X, 0); - /* EN_PP6000_MIPI_DISP_150MA */ - gpio_output(GPIO_EN_PP3300_SDBRDG_X, 0); - mdelay(5); -} - struct panel_description *get_panel_from_cbfs(struct panel_description *desc) { char cbfs_name[64]; diff --git a/src/mainboard/google/corsola/display.h b/src/mainboard/google/corsola/display.h index afff4bf..11d2f24 100644 --- a/src/mainboard/google/corsola/display.h +++ b/src/mainboard/google/corsola/display.h @@ -9,7 +9,6 @@
#define BRIDGE_I2C I2C0 #define PMIC_TPS65132_I2C I2C6 -#define PMIC_TPS65132_SLAVE 0x3E
struct panel_description { void (*power_on)(void); /* Callback to turn on panel */ @@ -34,7 +33,4 @@ /* Load panel serializable data from CBFS */ struct panel_description *get_panel_from_cbfs(struct panel_description *desc);
-void tps65132s_program_eeprom(void); -int panel_pmic_reg_mask(u32 bus, u8 chip, u8 addr, u8 val, u8 mask); - #endif diff --git a/src/mainboard/google/corsola/panel_starmie.c b/src/mainboard/google/corsola/panel_starmie.c index ffb7b65..aadabf4 100644 --- a/src/mainboard/google/corsola/panel_starmie.c +++ b/src/mainboard/google/corsola/panel_starmie.c @@ -1,20 +1,34 @@ /* SPDX-License-Identifier: GPL-2.0-only */
+#include <console/console.h> #include <delay.h> #include <gpio.h> #include <soc/regulator.h> +#include <soc/tps65132s.h>
#include "display.h" #include "gpio.h"
static void mipi_panel_power_on(void) { - tps65132s_program_eeprom(); + const struct tps65132s_reg_setting reg_settings[] = { + { PMIC_TPS65132_VPOS, 0x14, 0x1F }, + { PMIC_TPS65132_VNEG, 0x14, 0x1F }, + { PMIC_TPS65132_DLYX, 0x95, 0xFF }, + { PMIC_TPS65132_ASSDD, 0x5b, 0xFF }, + }; + const struct tps65132s_cfg cfg = { + .i2c_bus = PMIC_TPS65132_I2C, + .en = GPIO_EN_PP3300_DISP_X, + .sync = GPIO_EN_PP3300_SDBRDG_X, + .settings = reg_settings, + .setting_counts = ARRAY_SIZE(reg_settings), + }; + mainboard_set_regulator_voltage(MTK_REGULATOR_VIO18, 1800000); - mdelay(1); - gpio_output(GPIO_EN_PP3300_DISP_X, 1); - gpio_output(GPIO_EN_PP3300_SDBRDG_X, 1); - mdelay(1); + if (tps65132s_setup(&cfg) != CB_SUCCESS) + printk(BIOS_ERR, "Failed to setup tps65132s\n"); + /* DISP_RST_1V8_L */ gpio_output(GPIO_EDPBRDG_RST_L, 1); mdelay(1);