diff options
author | Boris Mittelberg <bmbm@google.com> | 2022-04-14 11:38:33 -0700 |
---|---|---|
committer | Boris Mittelberg <bmbm@google.com> | 2022-04-14 11:38:33 -0700 |
commit | 10cf54860dc2f7ac36610799919f1a0cf1d501bb (patch) | |
tree | ac982e3f9c46d97c7ec713ac5e15ee284179fec7 | |
parent | 59ede6b1714c313de3e003c0497c70725bf625d5 (diff) | |
parent | 265691a2fe290e0fa54ecccba151a5c63dd73e47 (diff) | |
download | chrome-ec-firmware-brya-14505.71.B-main.tar.gz |
Merge remote-tracking branch cros/main into firmware-brya-14505.B-mainfirmware-brya-14505.71.B-main
Generated by: util/update_release_branch.py --baseboard brya
--relevant_paths_file baseboard/brya/relevant-paths.txt
firmware-brya-14505.B-main
Relevant changes:
git log --oneline 59ede6b17..265691a2f -- baseboard/brya board/agah
board/anahera board/banshee board/brya board/crota board/felwinter
board/gimble board/kano board/primus board/redrix board/taeko
board/taniks board/vell board/volmar driver/bc12/pi3usb9201_public.*
driver/charger/bq25710.* driver/ppc/nx20p348x.*
driver/ppc/syv682x_public.* driver/retimer/bb_retimer_public.*
driver/tcpm/nct38xx.* driver/tcpm/ps8xxx_public.* driver/tcpm/tcpci.*
include/power/alderlake* include/intel_x86.h power/alderlake*
power/intel_x86.c util/getversion.sh
98493ee98 crota: remove type-c port 2 to avoid confusion
88a19dd1b anahera: Tune USBA retimer EQ revision 2
37d45dd56 kano: Support 28w cpu fan table
BRANCH=None
BUG=b:228775653 b:203837657 b:219176652
TEST=`make -j buildall`
Signed-off-by: Boris Mittelberg <bmbm@google.com>
Change-Id: Ia775339f54ad90ecdbc81ce1543b1b38f94f3b3b
64 files changed, 538 insertions, 829 deletions
diff --git a/baseboard/brask/baseboard.h b/baseboard/brask/baseboard.h index 66a10c7197..dd7be91500 100644 --- a/baseboard/brask/baseboard.h +++ b/baseboard/brask/baseboard.h @@ -59,12 +59,7 @@ /* Support Barrel Jack */ #undef CONFIG_DEDICATED_CHARGE_PORT_COUNT #define CONFIG_DEDICATED_CHARGE_PORT_COUNT 1 -/* - * TODO(b/197475210): Don't allow the system to boot to S0 when - * the power is lower than CONFIG_CHARGER_MIN_POWER_MW_FOR_POWER_ON - * since there is no battery. - */ -#define CONFIG_CHARGER_MIN_POWER_MW_FOR_POWER_ON 30000 +#define CONFIG_CHARGER_MIN_POWER_MW_FOR_POWER_ON 45000 /* Chipset config */ #define CONFIG_CHIPSET_ALDERLAKE_SLG4BD44540 diff --git a/board/anahera/usbc_config.c b/board/anahera/usbc_config.c index 247cc50dd3..2c0cd85a67 100644 --- a/board/anahera/usbc_config.c +++ b/board/anahera/usbc_config.c @@ -317,11 +317,11 @@ const struct usb_mux usba_ps8811[] = { }; BUILD_ASSERT(ARRAY_SIZE(usba_ps8811) == USBA_PORT_COUNT); -const static struct ps8811_reg_val equalizer_table[] = { +const static struct ps8811_reg_val equalizer_wwan_table[] = { { /* Set channel A EQ setting */ .reg = PS8811_REG1_USB_AEQ_LEVEL, - .val = (PS8811_AEQ_I2C_LEVEL_UP_10P5DB << + .val = (PS8811_AEQ_I2C_LEVEL_UP_13DB << PS8811_AEQ_I2C_LEVEL_UP_SHIFT) | (PS8811_AEQ_PIN_LEVEL_UP_18DB << PS8811_AEQ_PIN_LEVEL_UP_SHIFT), @@ -351,7 +351,18 @@ const static struct ps8811_reg_val equalizer_table[] = { }, }; -#define NUM_EQ_ARRAY ARRAY_SIZE(equalizer_table) +#define NUM_EQ_WWAN_ARRAY ARRAY_SIZE(equalizer_wwan_table) + +const static struct ps8811_reg_val equalizer_wlan_table[] = { + { + /* Set 50ohm adjust for B channel */ + .reg = PS8811_REG1_50OHM_ADJUST_CHAN_B, + .val = (PS8811_50OHM_ADJUST_CHAN_B_MINUS_9PCT << + PS8811_50OHM_ADJUST_CHAN_B_SHIFT), + }, +}; + +#define NUM_EQ_WLAN_ARRAY ARRAY_SIZE(equalizer_wlan_table) static int usba_retimer_init(int port) { @@ -380,10 +391,36 @@ static int usba_retimer_init(int port) PS8811_CHAN_A_SWING_MASK, 0x2 << PS8811_CHAN_A_SWING_SHIFT); - for (i = 0; i < NUM_EQ_ARRAY; i++) + /* Set channel B output PS level */ + rv |= ps8811_i2c_field_update( + me, PS8811_REG_PAGE1, + PS8811_REG1_USB_CHAN_B_DE_PS_LSB, + PS8811_CHAN_B_DE_PS_LSB_MASK, 0x06); + + /* Set channel B output DE level */ + rv |= ps8811_i2c_field_update( + me, PS8811_REG_PAGE1, + PS8811_REG1_USB_CHAN_B_DE_PS_MSB, + PS8811_CHAN_B_DE_PS_MSB_MASK, 0x16); + + + for (i = 0; i < NUM_EQ_WWAN_ARRAY; i++) + rv |= ps8811_i2c_write(me, PS8811_REG_PAGE1, + equalizer_wwan_table[i].reg, + equalizer_wwan_table[i].val); + } else { + /* Set channel A output swing */ + rv = ps8811_i2c_field_update( + me, PS8811_REG_PAGE1, + PS8811_REG1_USB_CHAN_A_SWING, + PS8811_CHAN_A_SWING_MASK, + 0x2 << PS8811_CHAN_A_SWING_SHIFT); + + + for (i = 0; i < NUM_EQ_WLAN_ARRAY; i++) rv |= ps8811_i2c_write(me, PS8811_REG_PAGE1, - equalizer_table[i].reg, - equalizer_table[i].val); + equalizer_wlan_table[i].reg, + equalizer_wlan_table[i].val); } break; } diff --git a/board/brask/board.c b/board/brask/board.c index 022ce8f43c..304fe58ce6 100644 --- a/board/brask/board.c +++ b/board/brask/board.c @@ -158,11 +158,11 @@ static void update_5v_usage(void) base_5v_power_s5 += PWR_S5_FRONT_HIGH - PWR_S5_FRONT_LOW; if (!gpio_get_level(GPIO_USB_A2_OC_ODL)) { - front_ports++; + rear_ports++; base_5v_power_s5 += PWR_S5_REAR_LOW; } if (!gpio_get_level(GPIO_USB_A3_OC_ODL)) { - front_ports++; + rear_ports++; base_5v_power_s5 += PWR_S5_REAR_LOW; } /* diff --git a/board/crota/board.h b/board/crota/board.h index 7df9426e5c..d13689971e 100644 --- a/board/crota/board.h +++ b/board/crota/board.h @@ -157,16 +157,16 @@ #define I2C_PORT_SENSOR NPCX_I2C_PORT0_0 -#define I2C_PORT_USB_C0_C2_TCPC NPCX_I2C_PORT1_0 +#define I2C_PORT_USB_C0_C1_TCPC NPCX_I2C_PORT1_0 #define I2C_PORT_USB_C1_TCPC NPCX_I2C_PORT4_1 -#define I2C_PORT_USB_C0_C2_PPC NPCX_I2C_PORT2_0 +#define I2C_PORT_USB_C0_C1_PPC NPCX_I2C_PORT2_0 #define I2C_PORT_USB_C1_PPC NPCX_I2C_PORT6_1 -#define I2C_PORT_USB_C0_C2_BC12 NPCX_I2C_PORT2_0 +#define I2C_PORT_USB_C0_C1_BC12 NPCX_I2C_PORT2_0 #define I2C_PORT_USB_C1_BC12 NPCX_I2C_PORT6_1 -#define I2C_PORT_USB_C0_C2_MUX NPCX_I2C_PORT3_0 +#define I2C_PORT_USB_C0_C1_MUX NPCX_I2C_PORT3_0 #define I2C_PORT_USB_C1_MUX NPCX_I2C_PORT6_1 #define I2C_PORT_BATTERY NPCX_I2C_PORT5_0 @@ -177,12 +177,11 @@ #define I2C_ADDR_EEPROM_FLAGS 0x50 #define I2C_ADDR_MP2964_FLAGS 0x20 - /* * see b/174768555#comment22 */ #define USBC_PORT_C0_BB_RETIMER_I2C_ADDR 0x56 -#define USBC_PORT_C2_BB_RETIMER_I2C_ADDR 0x57 +#define USBC_PORT_C1_BB_RETIMER_I2C_ADDR 0x57 /* Enabling Thunderbolt-compatible mode */ #define CONFIG_USB_PD_TBT_COMPAT_MODE @@ -249,7 +248,7 @@ enum sensor_id { enum ioex_port { IOEX_C0_NCT38XX = 0, - IOEX_C2_NCT38XX, + IOEX_C1_NCT38XX, IOEX_PORT_COUNT }; diff --git a/board/crota/ec.tasklist b/board/crota/ec.tasklist index a049ba3bfa..296654d39d 100644 --- a/board/crota/ec.tasklist +++ b/board/crota/ec.tasklist @@ -15,7 +15,6 @@ TASK_ALWAYS(CHG_RAMP, chg_ramp_task, NULL, BASEBOARD_CHG_RAMP_TASK_STACK_SIZE) \ TASK_ALWAYS(USB_CHG_P0, usb_charger_task, 0, TASK_STACK_SIZE) \ TASK_ALWAYS(USB_CHG_P1, usb_charger_task, 0, TASK_STACK_SIZE) \ - TASK_ALWAYS(USB_CHG_P2, usb_charger_task, 0, TASK_STACK_SIZE) \ TASK_ALWAYS(CHARGER, charger_task, NULL, BASEBOARD_CHARGER_TASK_STACK_SIZE) \ TASK_ALWAYS(MOTIONSENSE, motion_sense_task, NULL, VENTI_TASK_STACK_SIZE) \ TASK_NOTEST(KEYPROTO, keyboard_protocol_task, NULL, LARGER_TASK_STACK_SIZE) \ @@ -27,6 +26,4 @@ TASK_NOTEST(KEYSCAN, keyboard_scan_task, NULL, VENTI_TASK_STACK_SIZE) \ TASK_ALWAYS(PD_C0, pd_task, NULL, BASEBOARD_PD_TASK_STACK_SIZE) \ TASK_ALWAYS(PD_C1, pd_task, NULL, BASEBOARD_PD_TASK_STACK_SIZE) \ - TASK_ALWAYS(PD_C2, pd_task, NULL, BASEBOARD_PD_TASK_STACK_SIZE) \ - TASK_ALWAYS(PD_INT_C0, pd_shared_alert_task, (BIT(2) | BIT(0)), BASEBOARD_PD_INT_TASK_STACK_SIZE) \ - TASK_ALWAYS(PD_INT_C1, pd_interrupt_handler_task, 1, BASEBOARD_PD_INT_TASK_STACK_SIZE) + TASK_ALWAYS(PD_INT_C0, pd_shared_alert_task, (BIT(1) | BIT(0)), BASEBOARD_PD_INT_TASK_STACK_SIZE) diff --git a/board/crota/gpio.inc b/board/crota/gpio.inc index 9742a33b90..eccf10a36c 100644 --- a/board/crota/gpio.inc +++ b/board/crota/gpio.inc @@ -25,12 +25,12 @@ GPIO_INT(SLP_SUS_L, PIN(F, 1), GPIO_INT_BOTH, power_signal_ GPIO_INT(SYS_SLP_S0IX_L, PIN(D, 5), GPIO_INT_BOTH, power_signal_interrupt) GPIO_INT(TABLET_MODE_L, PIN(9, 5), GPIO_INT_BOTH, gmr_tablet_switch_isr) GPIO_INT(USB_C0_BC12_INT_ODL, PIN(C, 6), GPIO_INT_FALLING, bc12_interrupt) -GPIO_INT(USB_C0_C2_TCPC_INT_ODL, PIN(E, 0), GPIO_INT_FALLING, tcpc_alert_event) +GPIO_INT(USB_C0_C1_TCPC_INT_ODL, PIN(E, 0), GPIO_INT_FALLING, tcpc_alert_event) GPIO_INT(USB_C0_PPC_INT_ODL, PIN(6, 2), GPIO_INT_FALLING, ppc_interrupt) GPIO_INT(USB_C0_RT_INT_ODL, PIN(B, 1), GPIO_INT_FALLING, retimer_interrupt) -GPIO_INT(USB_C2_BC12_INT_ODL, PIN(8, 3), GPIO_INT_FALLING, bc12_interrupt) -GPIO_INT(USB_C2_PPC_INT_ODL, PIN(7, 0), GPIO_INT_FALLING, ppc_interrupt) -GPIO_INT(USB_C2_RT_INT_ODL, PIN(4, 1), GPIO_INT_FALLING, retimer_interrupt) +GPIO_INT(USB_C1_BC12_INT_ODL, PIN(8, 3), GPIO_INT_FALLING, bc12_interrupt) +GPIO_INT(USB_C1_PPC_INT_ODL, PIN(7, 0), GPIO_INT_FALLING, ppc_interrupt) +GPIO_INT(USB_C1_RT_INT_ODL, PIN(4, 1), GPIO_INT_FALLING, retimer_interrupt) /* USED GPIOs: */ GPIO(CCD_MODE_ODL, PIN(E, 5), GPIO_INPUT) @@ -46,12 +46,12 @@ GPIO(EC_I2C_MISC_SCL_R, PIN(B, 3), GPIO_INPUT) GPIO(EC_I2C_MISC_SDA_R, PIN(B, 2), GPIO_INPUT) GPIO(EC_I2C_SENSOR_SCL, PIN(B, 5), GPIO_INPUT | GPIO_SEL_1P8V) GPIO(EC_I2C_SENSOR_SDA, PIN(B, 4), GPIO_INPUT | GPIO_SEL_1P8V) -GPIO(EC_I2C_USB_C0_C2_PPC_BC_SCL, PIN(9, 2), GPIO_INPUT) -GPIO(EC_I2C_USB_C0_C2_PPC_BC_SDA, PIN(9, 1), GPIO_INPUT) -GPIO(EC_I2C_USB_C0_C2_RT_SCL, PIN(D, 1), GPIO_INPUT) -GPIO(EC_I2C_USB_C0_C2_RT_SDA, PIN(D, 0), GPIO_INPUT) -GPIO(EC_I2C_USB_C0_C2_TCPC_SCL, PIN(9, 0), GPIO_INPUT) -GPIO(EC_I2C_USB_C0_C2_TCPC_SDA, PIN(8, 7), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_C1_PPC_BC_SCL, PIN(9, 2), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_C1_PPC_BC_SDA, PIN(9, 1), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_C1_RT_SCL, PIN(D, 1), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_C1_RT_SDA, PIN(D, 0), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_C1_TCPC_SCL, PIN(9, 0), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_C1_TCPC_SDA, PIN(8, 7), GPIO_INPUT) GPIO(EC_KB_BL_EN_L, PIN(8, 6), GPIO_OUT_HIGH) GPIO(EC_PCHHOT_ODL, PIN(7, 4), GPIO_INPUT) GPIO(EC_PCH_INT_ODL, PIN(B, 0), GPIO_ODR_HIGH) @@ -67,7 +67,7 @@ GPIO(EN_S5_RAILS, PIN(B, 6), GPIO_OUT_LOW) GPIO(IMVP9_VRRDY_OD, PIN(4, 3), GPIO_INPUT) GPIO(PCH_PWROK, PIN(7, 2), GPIO_OUT_LOW) GPIO(SYS_RST_ODL, PIN(C, 5), GPIO_ODR_HIGH) -GPIO(USB_C0_C2_TCPC_RST_ODL, PIN(A, 7), GPIO_ODR_LOW) +GPIO(USB_C0_C1_TCPC_RST_ODL, PIN(A, 7), GPIO_ODR_LOW) GPIO(VCCST_PWRGD_OD, PIN(A, 4), GPIO_ODR_LOW) /* UART alternate functions */ @@ -138,7 +138,6 @@ IOEX(USB_C0_OC_ODL, EXPIN(IOEX_C0_NCT38XX, 0, 4), GPIO_ODR_HIGH) IOEX(USB_C0_FRS_EN, EXPIN(IOEX_C0_NCT38XX, 0, 6), GPIO_LOW) IOEX(USB_C0_RT_RST_ODL, EXPIN(IOEX_C0_NCT38XX, 0, 7), GPIO_ODR_LOW) -IOEX(USB_C2_RT_RST_ODL, EXPIN(IOEX_C2_NCT38XX, 0, 2), GPIO_ODR_LOW) -IOEX(USB_C1_OC_ODL, EXPIN(IOEX_C2_NCT38XX, 0, 3), GPIO_ODR_HIGH) -IOEX(USB_C2_OC_ODL, EXPIN(IOEX_C2_NCT38XX, 0, 4), GPIO_ODR_HIGH) -IOEX(USB_C2_FRS_EN, EXPIN(IOEX_C2_NCT38XX, 0, 6), GPIO_LOW) +IOEX(USB_C1_RT_RST_ODL, EXPIN(IOEX_C1_NCT38XX, 0, 2), GPIO_ODR_LOW) +IOEX(USB_C1_OC_ODL, EXPIN(IOEX_C1_NCT38XX, 0, 4), GPIO_ODR_HIGH) +IOEX(USB_C1_FRS_EN, EXPIN(IOEX_C1_NCT38XX, 0, 6), GPIO_LOW) diff --git a/board/crota/i2c.c b/board/crota/i2c.c index 6feaa309a9..1fc1126282 100644 --- a/board/crota/i2c.c +++ b/board/crota/i2c.c @@ -24,26 +24,26 @@ const struct i2c_port_t i2c_ports[] = { { /* I2C1 */ .name = "tcpc0,2", - .port = I2C_PORT_USB_C0_C2_TCPC, + .port = I2C_PORT_USB_C0_C1_TCPC, .kbps = 1000, - .scl = GPIO_EC_I2C_USB_C0_C2_TCPC_SCL, - .sda = GPIO_EC_I2C_USB_C0_C2_TCPC_SDA, + .scl = GPIO_EC_I2C_USB_C0_C1_TCPC_SCL, + .sda = GPIO_EC_I2C_USB_C0_C1_TCPC_SDA, }, { /* I2C2 */ .name = "ppc0,2", - .port = I2C_PORT_USB_C0_C2_PPC, + .port = I2C_PORT_USB_C0_C1_PPC, .kbps = 1000, - .scl = GPIO_EC_I2C_USB_C0_C2_PPC_BC_SCL, - .sda = GPIO_EC_I2C_USB_C0_C2_PPC_BC_SDA, + .scl = GPIO_EC_I2C_USB_C0_C1_PPC_BC_SCL, + .sda = GPIO_EC_I2C_USB_C0_C1_PPC_BC_SDA, }, { /* I2C3 */ .name = "retimer0,2", - .port = I2C_PORT_USB_C0_C2_MUX, + .port = I2C_PORT_USB_C0_C1_MUX, .kbps = 1000, - .scl = GPIO_EC_I2C_USB_C0_C2_RT_SCL, - .sda = GPIO_EC_I2C_USB_C0_C2_RT_SDA, + .scl = GPIO_EC_I2C_USB_C0_C1_RT_SCL, + .sda = GPIO_EC_I2C_USB_C0_C1_RT_SDA, }, { /* I2C5 */ @@ -75,7 +75,7 @@ static void set_board_legacy_i2c_speeds(void) ccprints("setting USB DB I2C buses to 400 kHz\n"); - i2c_set_freq(I2C_PORT_USB_C0_C2_TCPC, I2C_FREQ_400KHZ); - i2c_set_freq(I2C_PORT_USB_C0_C2_PPC, I2C_FREQ_400KHZ); + i2c_set_freq(I2C_PORT_USB_C0_C1_TCPC, I2C_FREQ_400KHZ); + i2c_set_freq(I2C_PORT_USB_C0_C1_PPC, I2C_FREQ_400KHZ); } DECLARE_HOOK(HOOK_INIT, set_board_legacy_i2c_speeds, HOOK_PRIO_INIT_I2C - 1); diff --git a/board/crota/usbc_config.c b/board/crota/usbc_config.c index 80db6295bb..a6a1e0f01c 100644 --- a/board/crota/usbc_config.c +++ b/board/crota/usbc_config.c @@ -42,9 +42,7 @@ #ifdef CONFIG_ZEPHYR enum ioex_port { IOEX_C0_NCT38XX = 0, - IOEX_C2_NCT38XX, - IOEX_ID_1_C0_NCT38XX, - IOEX_ID_1_C2_NCT38XX, + IOEX_C1_NCT38XX, IOEX_PORT_COUNT }; #endif /* CONFIG_ZEPHYR */ @@ -54,17 +52,17 @@ const struct tcpc_config_t tcpc_config[] = { [USBC_PORT_C0] = { .bus_type = EC_BUS_TYPE_I2C, .i2c_info = { - .port = I2C_PORT_USB_C0_C2_TCPC, + .port = I2C_PORT_USB_C0_C1_TCPC, .addr_flags = NCT38XX_I2C_ADDR1_1_FLAGS, }, .drv = &nct38xx_tcpm_drv, .flags = TCPC_FLAGS_TCPCI_REV2_0 | TCPC_FLAGS_NO_DEBUG_ACC_CONTROL, }, - [USBC_PORT_C2] = { + [USBC_PORT_C1] = { .bus_type = EC_BUS_TYPE_I2C, .i2c_info = { - .port = I2C_PORT_USB_C0_C2_TCPC, + .port = I2C_PORT_USB_C0_C1_TCPC, .addr_flags = NCT38XX_I2C_ADDR1_4_FLAGS, }, .drv = &nct38xx_tcpm_drv, @@ -87,12 +85,12 @@ BUILD_ASSERT(ARRAY_SIZE(usb_port_enable) == USB_PORT_COUNT); /* USBC PPC configuration */ struct ppc_config_t ppc_chips[] = { [USBC_PORT_C0] = { - .i2c_port = I2C_PORT_USB_C0_C2_PPC, + .i2c_port = I2C_PORT_USB_C0_C1_PPC, .i2c_addr_flags = SYV682X_ADDR0_FLAGS, .drv = &syv682x_drv, }, - [USBC_PORT_C2] = { - .i2c_port = I2C_PORT_USB_C0_C2_PPC, + [USBC_PORT_C1] = { + .i2c_port = I2C_PORT_USB_C0_C1_PPC, .i2c_addr_flags = SYV682X_ADDR2_FLAGS, .drv = &syv682x_drv, }, @@ -107,8 +105,8 @@ static const struct usb_mux usbc0_tcss_usb_mux = { .driver = &virtual_usb_mux_driver, .hpd_update = &virtual_hpd_update, }; -static const struct usb_mux usbc2_tcss_usb_mux = { - .usb_port = USBC_PORT_C2, +static const struct usb_mux usbc1_tcss_usb_mux = { + .usb_port = USBC_PORT_C1, .driver = &virtual_usb_mux_driver, .hpd_update = &virtual_hpd_update, }; @@ -117,17 +115,17 @@ const struct usb_mux usb_muxes[] = { .usb_port = USBC_PORT_C0, .driver = &bb_usb_retimer, .hpd_update = bb_retimer_hpd_update, - .i2c_port = I2C_PORT_USB_C0_C2_MUX, + .i2c_port = I2C_PORT_USB_C0_C1_MUX, .i2c_addr_flags = USBC_PORT_C0_BB_RETIMER_I2C_ADDR, .next_mux = &usbc0_tcss_usb_mux, }, - [USBC_PORT_C2] = { - .usb_port = USBC_PORT_C2, + [USBC_PORT_C1] = { + .usb_port = USBC_PORT_C1, .driver = &bb_usb_retimer, .hpd_update = bb_retimer_hpd_update, - .i2c_port = I2C_PORT_USB_C0_C2_MUX, - .i2c_addr_flags = USBC_PORT_C2_BB_RETIMER_I2C_ADDR, - .next_mux = &usbc2_tcss_usb_mux, + .i2c_port = I2C_PORT_USB_C0_C1_MUX, + .i2c_addr_flags = USBC_PORT_C1_BB_RETIMER_I2C_ADDR, + .next_mux = &usbc1_tcss_usb_mux, }, }; BUILD_ASSERT(ARRAY_SIZE(usb_muxes) == USBC_PORT_COUNT); @@ -136,18 +134,18 @@ BUILD_ASSERT(ARRAY_SIZE(usb_muxes) == USBC_PORT_COUNT); /* BC1.2 charger detect configuration */ const struct pi3usb9201_config_t pi3usb9201_bc12_chips[] = { [USBC_PORT_C0] = { - .i2c_port = I2C_PORT_USB_C0_C2_BC12, + .i2c_port = I2C_PORT_USB_C0_C1_BC12, .i2c_addr_flags = PI3USB9201_I2C_ADDR_3_FLAGS, }, - [USBC_PORT_C2] = { - .i2c_port = I2C_PORT_USB_C0_C2_BC12, + [USBC_PORT_C1] = { + .i2c_port = I2C_PORT_USB_C0_C1_BC12, .i2c_addr_flags = PI3USB9201_I2C_ADDR_1_FLAGS, }, }; BUILD_ASSERT(ARRAY_SIZE(pi3usb9201_bc12_chips) == USBC_PORT_COUNT); /* - * USB C0 and C2 uses burnside bridge chips and have their reset + * USB C0 and C1 uses burnside bridge chips and have their reset * controlled by their respective TCPC chips acting as GPIO expanders. * * ioex_init() is normally called before we take the TCPCs out of @@ -157,14 +155,14 @@ BUILD_ASSERT(ARRAY_SIZE(pi3usb9201_bc12_chips) == USBC_PORT_COUNT); struct ioexpander_config_t ioex_config[] = { [IOEX_C0_NCT38XX] = { - .i2c_host_port = I2C_PORT_USB_C0_C2_TCPC, + .i2c_host_port = I2C_PORT_USB_C0_C1_TCPC, .i2c_addr_flags = NCT38XX_I2C_ADDR1_1_FLAGS, .drv = &nct38xx_ioexpander_drv, .flags = IOEX_FLAGS_DEFAULT_INIT_DISABLED, }, - [IOEX_C2_NCT38XX] = { - .i2c_host_port = I2C_PORT_USB_C0_C2_TCPC, - .i2c_addr_flags = NCT38XX_I2C_ADDR2_1_FLAGS, + [IOEX_C1_NCT38XX] = { + .i2c_host_port = I2C_PORT_USB_C0_C1_TCPC, + .i2c_addr_flags = NCT38XX_I2C_ADDR1_4_FLAGS, .drv = &nct38xx_ioexpander_drv, .flags = IOEX_FLAGS_DEFAULT_INIT_DISABLED, }, @@ -223,8 +221,8 @@ __override int bb_retimer_power_enable(const struct usb_mux *me, bool enable) if (me->usb_port == USBC_PORT_C0) { rst_signal = IOEX_USB_C0_RT_RST_ODL; - } else if (me->usb_port == USBC_PORT_C2) { - rst_signal = IOEX_USB_C2_RT_RST_ODL; + } else if (me->usb_port == USBC_PORT_C1) { + rst_signal = IOEX_USB_C1_RT_RST_ODL; } else { return EC_ERROR_INVAL; } @@ -258,7 +256,7 @@ void board_reset_pd_mcu(void) { enum gpio_signal tcpc_rst; - tcpc_rst = GPIO_USB_C0_C2_TCPC_RST_ODL; + tcpc_rst = GPIO_USB_C0_C1_TCPC_RST_ODL; gpio_set_level(tcpc_rst, 0); @@ -283,23 +281,23 @@ static void board_tcpc_init(void) /* * These IO expander pins are implemented using the - * C0/C2 TCPC, so they must be set up after the TCPC has + * C0/C1 TCPC, so they must be set up after the TCPC has * been taken out of reset. */ ioex_init(IOEX_C0_NCT38XX); - ioex_init(IOEX_C2_NCT38XX); + ioex_init(IOEX_C1_NCT38XX); /* Enable PPC interrupts. */ gpio_enable_interrupt(GPIO_USB_C0_PPC_INT_ODL); - gpio_enable_interrupt(GPIO_USB_C2_PPC_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C1_PPC_INT_ODL); /* Enable TCPC interrupts. */ - gpio_enable_interrupt(GPIO_USB_C0_C2_TCPC_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C0_C1_TCPC_INT_ODL); #ifndef CONFIG_ZEPHYR /* Enable BC1.2 interrupts. */ gpio_enable_interrupt(GPIO_USB_C0_BC12_INT_ODL); - gpio_enable_interrupt(GPIO_USB_C2_BC12_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C1_BC12_INT_ODL); #endif /* !CONFIG_ZEPHYR */ } DECLARE_HOOK(HOOK_INIT, board_tcpc_init, HOOK_PRIO_INIT_CHIPSET); @@ -308,8 +306,8 @@ uint16_t tcpc_get_alert_status(void) { uint16_t status = 0; - if (gpio_get_level(GPIO_USB_C0_C2_TCPC_INT_ODL) == 0) - status |= PD_STATUS_TCPC_ALERT_0 | PD_STATUS_TCPC_ALERT_2; + if (gpio_get_level(GPIO_USB_C0_C1_TCPC_INT_ODL) == 0) + status |= PD_STATUS_TCPC_ALERT_0 | PD_STATUS_TCPC_ALERT_1; return status; } @@ -318,15 +316,15 @@ int ppc_get_alert_status(int port) { if (port == USBC_PORT_C0) return gpio_get_level(GPIO_USB_C0_PPC_INT_ODL) == 0; - else if (port == USBC_PORT_C2) - return gpio_get_level(GPIO_USB_C2_PPC_INT_ODL) == 0; + else if (port == USBC_PORT_C1) + return gpio_get_level(GPIO_USB_C1_PPC_INT_ODL) == 0; return 0; } void tcpc_alert_event(enum gpio_signal signal) { switch (signal) { - case GPIO_USB_C0_C2_TCPC_INT_ODL: + case GPIO_USB_C0_C1_TCPC_INT_ODL: schedule_deferred_pd_interrupt(USBC_PORT_C0); break; default: @@ -340,8 +338,8 @@ void bc12_interrupt(enum gpio_signal signal) case GPIO_USB_C0_BC12_INT_ODL: task_set_event(TASK_ID_USB_CHG_P0, USB_CHG_EVENT_BC12); break; - case GPIO_USB_C2_BC12_INT_ODL: - task_set_event(TASK_ID_USB_CHG_P2, USB_CHG_EVENT_BC12); + case GPIO_USB_C1_BC12_INT_ODL: + task_set_event(TASK_ID_USB_CHG_P1, USB_CHG_EVENT_BC12); break; default: break; @@ -354,8 +352,8 @@ void ppc_interrupt(enum gpio_signal signal) case GPIO_USB_C0_PPC_INT_ODL: syv682x_interrupt(USBC_PORT_C0); break; - case GPIO_USB_C2_PPC_INT_ODL: - syv682x_interrupt(USBC_PORT_C2); + case GPIO_USB_C1_PPC_INT_ODL: + syv682x_interrupt(USBC_PORT_C1); break; default: break; @@ -376,7 +374,7 @@ __override bool board_is_dts_port(int port) __override bool board_is_tbt_usb4_port(int port) { - if (port == USBC_PORT_C0 || port == USBC_PORT_C2) + if (port == USBC_PORT_C0 || port == USBC_PORT_C1) return true; return false; diff --git a/board/crota/usbc_config.h b/board/crota/usbc_config.h index 2c21d83f0c..55134ce79e 100644 --- a/board/crota/usbc_config.h +++ b/board/crota/usbc_config.h @@ -14,7 +14,7 @@ enum usbc_port { USBC_PORT_C0 = 0, - USBC_PORT_C2, + USBC_PORT_C1, USBC_PORT_COUNT }; diff --git a/board/kano/fans.c b/board/kano/fans.c index de6557215c..b652ec90da 100644 --- a/board/kano/fans.c +++ b/board/kano/fans.c @@ -37,9 +37,9 @@ static const struct fan_conf fan_conf_0 = { * Set minimum at around 30% PWM. */ static const struct fan_rpm fan_rpm_0 = { - .rpm_min = 3000, - .rpm_start = 3000, - .rpm_max = 6200, + .rpm_min = 2400, + .rpm_start = 2400, + .rpm_max = 6000, }; const struct fan_t fans[FAN_CH_COUNT] = { diff --git a/board/kano/fw_config.c b/board/kano/fw_config.c index a13dadeb5d..e6e5ba28bb 100644 --- a/board/kano/fw_config.c +++ b/board/kano/fw_config.c @@ -20,6 +20,7 @@ BUILD_ASSERT(sizeof(fw_config) == sizeof(uint32_t)); */ static const union kano_cbi_fw_config fw_config_defaults = { .kb_bl = KEYBOARD_BACKLIGHT_ENABLED, + .thermal_solution = THERMAL_SOLUTION_15W, }; /**************************************************************************** @@ -53,3 +54,8 @@ bool ec_cfg_has_kblight(void) { return (fw_config.kb_bl == KEYBOARD_BACKLIGHT_ENABLED); } + +enum ec_cfg_thermal_solution_type ec_cfg_thermal_solution(void) +{ + return fw_config.thermal_solution; +} diff --git a/board/kano/fw_config.h b/board/kano/fw_config.h index 8402b5568d..88573bdd33 100644 --- a/board/kano/fw_config.h +++ b/board/kano/fw_config.h @@ -19,12 +19,19 @@ enum ec_cfg_keyboard_backlight_type { KEYBOARD_BACKLIGHT_ENABLED = 1 }; +enum ec_cfg_thermal_solution_type { + THERMAL_SOLUTION_15W = 0, + THERMAL_SOLUTION_28W = 1 +}; + union kano_cbi_fw_config { struct { enum ec_cfg_keyboard_backlight_type kb_bl : 1; uint32_t audio : 3; uint32_t ufc : 2; - uint32_t reserved_1 : 26; + uint32_t stylus : 1; + enum ec_cfg_thermal_solution_type thermal_solution : 1; + uint32_t reserved_1 : 24; }; uint32_t raw_value; }; @@ -44,4 +51,11 @@ union kano_cbi_fw_config get_fw_config(void); */ bool ec_cfg_has_kblight(void); +/** + * Read the thermal solution config. + * + * @return thermal solution config. + */ +enum ec_cfg_thermal_solution_type ec_cfg_thermal_solution(void); + #endif /* __BOARD_KANO_FW_CONFIG_H_ */ diff --git a/board/kano/sensors.c b/board/kano/sensors.c index fd7d0f01ad..e3e2f9d920 100644 --- a/board/kano/sensors.c +++ b/board/kano/sensors.c @@ -12,6 +12,7 @@ #include "driver/accelgyro_icm426xx.h" #include "driver/accelgyro_icm_common.h" #include "driver/accel_kionix.h" +#include "fw_config.h" #include "gpio.h" #include "hooks.h" #include "motion_sense.h" @@ -354,12 +355,30 @@ __maybe_unused static const struct ec_thermal_config thermal_cpu = THERMAL_CPU; .temp_host_release = { \ [EC_TEMP_THRESH_HIGH] = C_TO_K(68), \ }, \ - .temp_fan_off = C_TO_K(25), \ + .temp_fan_off = C_TO_K(37), \ .temp_fan_max = C_TO_K(90), \ } __maybe_unused static const struct ec_thermal_config thermal_fan = THERMAL_FAN; /* + * TODO(b/202062363): Remove when clang is fixed. + */ +#define THERMAL_FAN_28W \ + { \ + .temp_host = { \ + [EC_TEMP_THRESH_HIGH] = C_TO_K(85), \ + [EC_TEMP_THRESH_HALT] = C_TO_K(90), \ + }, \ + .temp_host_release = { \ + [EC_TEMP_THRESH_HIGH] = C_TO_K(68), \ + }, \ + .temp_fan_off = C_TO_K(37), \ + .temp_fan_max = C_TO_K(62), \ + } +__maybe_unused static const struct ec_thermal_config thermal_fan_28w = + THERMAL_FAN_28W; + +/* * Set value to zero to disable charger thermal control. */ /* @@ -387,3 +406,23 @@ struct ec_thermal_config thermal_params[] = { [TEMP_SENSOR_3_CHARGER] = THERMAL_CHARGER, }; BUILD_ASSERT(ARRAY_SIZE(thermal_params) == TEMP_SENSOR_COUNT); + +static void setup_thermal(void) +{ + unsigned int table = ec_cfg_thermal_solution(); + /* Configure Fan */ + switch (table) { + /* 28w CPU fan table */ + case THERMAL_SOLUTION_28W: + cprints(CC_THERMAL, "Fan table set to 28w CPU scheme"); + thermal_params[TEMP_SENSOR_2_FAN] = thermal_fan_28w; + break; + /* Default fan table */ + case THERMAL_SOLUTION_15W: + default: + cprints(CC_THERMAL, "Fan table set to 15w CPU scheme"); + break; + } +} +/* setup_thermal should be called before HOOK_INIT/HOOK_PRIO_DEFAULT */ +DECLARE_HOOK(HOOK_INIT, setup_thermal, HOOK_PRIO_DEFAULT - 1); diff --git a/common/usbc/usb_pd_timer.c b/common/usbc/usb_pd_timer.c index d215590371..a1859ac9e9 100644 --- a/common/usbc/usb_pd_timer.c +++ b/common/usbc/usb_pd_timer.c @@ -131,12 +131,11 @@ void pd_timer_init(int port) count[port] = 0; /* - * timer_active and timer_disabled are atomic_t global arrays. - * Set them to the initial state. + * Set timers to init state for "port". */ - for (int i = 0; i < ARRAY_SIZE(timer_active); i++) { - *(timer_active + i) = 0; - *(timer_disabled + i) = ~0; + for (int bit = 0; bit < PD_TIMER_COUNT; bit++) { + PD_CLR_ACTIVE(port, bit); + PD_SET_DISABLED(port, bit); } } diff --git a/common/virtual_battery.c b/common/virtual_battery.c index db7e34ced6..33e014d68e 100644 --- a/common/virtual_battery.c +++ b/common/virtual_battery.c @@ -187,6 +187,9 @@ int virtual_battery_operation(const uint8_t *batt_cmd_head, { int val; int year, month, day; +#ifdef CONFIG_BATTERY_SMART + char str[32]; +#endif /* * We cache battery operational mode locally for both read and write * commands. If MODE_CAPACITY bit is set, battery capacity will be @@ -382,6 +385,16 @@ int virtual_battery_operation(const uint8_t *batt_cmd_head, } memcpy(dest, &val, bounded_read_len); break; +#ifdef CONFIG_BATTERY_SMART + case SB_MANUFACTURER_DATA: + if (read_len > ARRAY_SIZE(str)) + return EC_ERROR_INVAL; + /* This may cause an i2c transaction */ + if (battery_manufacturer_data(str, ARRAY_SIZE(str))) + return EC_ERROR_INVAL; + memcpy(dest, &str, read_len); + break; +#endif case SB_MANUFACTURER_ACCESS: /* No manuf. access reg access allowed over VB interface */ return EC_ERROR_INVAL; diff --git a/docs/zephyr/zephyr_pwm.md b/docs/zephyr/zephyr_pwm.md index 8c050e8d2e..95144f406e 100644 --- a/docs/zephyr/zephyr_pwm.md +++ b/docs/zephyr/zephyr_pwm.md @@ -12,7 +12,6 @@ Kconfig Option | Default | Documentation :------------- | :------ | :------------ `CONFIG_PWM` | n | [PWM (Pulse Width Modulation) Drivers] `CONFIG_PWM_<platform>` | n | Platform specific PWM driver -`CONFIG_PLATFORM_EC_PWM` | y if `CONFIG_PWM=y` | [PWM (Pulse Width Modulation) module] Kconfig sub-option | Default | Documentation :----------------- | :------ | :------------ diff --git a/driver/battery/smart.c b/driver/battery/smart.c index 72cf545afe..91058150fa 100644 --- a/driver/battery/smart.c +++ b/driver/battery/smart.c @@ -321,6 +321,11 @@ test_mockable int battery_device_chemistry(char *dest, int size) return sb_read_string(SB_DEVICE_CHEMISTRY, dest, size); } +int battery_manufacturer_data(char *data, int size) +{ + return sb_read_string(SB_MANUFACTURER_DATA, data, size); +} + int battery_get_avg_current(void) { int current; diff --git a/driver/charger/rt9490.c b/driver/charger/rt9490.c index e3eee4ebad..ade7049d65 100644 --- a/driver/charger/rt9490.c +++ b/driver/charger/rt9490.c @@ -338,6 +338,12 @@ static int rt9490_init_setting(int chgnum) RETURN_ERROR(rt9490_set_bit(chgnum, RT9490_REG_CHG_IRQ_MASK5, RT9490_CHG_IRQ_MASK5_ALL)); + /* Reduce SW freq from 1.5MHz to 1MHz + * for 10% higher current rating b/215294785 + */ + RETURN_ERROR(rt9490_set_bit(chgnum, RT9490_REG_ADD_CTRL1, + RT9490_PWM_1MHZ_EN)); + return EC_SUCCESS; } diff --git a/driver/charger/rt9490.h b/driver/charger/rt9490.h index a6ace8c1eb..28900b20e8 100644 --- a/driver/charger/rt9490.h +++ b/driver/charger/rt9490.h @@ -238,6 +238,9 @@ struct rt9490_init_setting { #define RT9490_AUTO_MIVR BIT(2) #define RT9490_JEITA_COLD_HOT BIT(0) +/* ADD CTRL1 */ +#define RT9490_PWM_1MHZ_EN BIT(4) + extern const struct charger_drv rt9490_drv; extern const struct bc12_drv rt9490_bc12_drv; diff --git a/driver/ppc/rt1739.c b/driver/ppc/rt1739.c index b407924432..a99ec91b5c 100644 --- a/driver/ppc/rt1739.c +++ b/driver/ppc/rt1739.c @@ -183,6 +183,14 @@ static int rt1739_workaround(int port) case RT1739_DEVICE_ID_ES2: CPRINTS("RT1739 ES2"); + /* enter hidden mode */ + RETURN_ERROR(write_reg(port, 0xF1, 0x62)); + RETURN_ERROR(write_reg(port, 0xF0, 0x86)); + /* turn off SWENB output */ + RETURN_ERROR(write_reg(port, 0xE0, 0x07)); + /* leave hidden mode */ + RETURN_ERROR(write_reg(port, 0xF1, 0)); + RETURN_ERROR(write_reg(port, 0xF0, 0)); break; default: diff --git a/driver/retimer/ps8811.h b/driver/retimer/ps8811.h index a0ab50e5d7..5721f31eae 100644 --- a/driver/retimer/ps8811.h +++ b/driver/retimer/ps8811.h @@ -138,6 +138,25 @@ #define PS8811_CHAN_A_SWING_MASK GENMASK(6, 4) #define PS8811_CHAN_A_SWING_SHIFT 4 +#define PS8811_REG1_50OHM_ADJUST_CHAN_B 0x73 +#define PS8811_50OHM_ADJUST_CHAN_B_CONFIG_MASK GENMASK(3, 1) +#define PS8811_50OHM_ADJUST_CHAN_B_SHIFT 1 +#define PS8811_50OHM_ADJUST_CHAN_B_DEFAULT 0x00 +#define PS8811_50OHM_ADJUST_CHAN_B_MINUS_6PCT 0x01 +#define PS8811_50OHM_ADJUST_CHAN_B_MINUS_9PCT 0x02 +#define PS8811_50OHM_ADJUST_CHAN_B_MINUS_14PCT 0x03 +#define PS8811_50OHM_ADJUST_CHAN_B_PLUS_7PCT 0x04 +#define PS8811_50OHM_ADJUST_CHAN_B_PLUS_11PCT 0x05 +#define PS8811_50OHM_ADJUST_CHAN_B_PLUS_20PCT 0x06 + +#define PS8811_BDE_PIN_MID_LEVEL_1P5DB 0x01 +#define PS8811_BDE_PIN_MID_LEVEL_2DB 0x02 +#define PS8811_BDE_PIN_MID_LEVEL_3DB 0x03 +#define PS8811_BDE_PIN_MID_LEVEL_3P5DB 0x04 +#define PS8811_BDE_PIN_MID_LEVEL_4P5DB 0x05 +#define PS8811_BDE_PIN_MID_LEVEL_6DB 0x06 +#define PS8811_BDE_PIN_MID_LEVEL_7P5DB 0x07 + #define PS8811_REG1_USB_CHAN_B_SWING 0xA4 #define PS8811_CHAN_B_SWING_MASK GENMASK(2, 0) #define PS8811_CHAN_B_SWING_SHIFT 0 diff --git a/include/battery.h b/include/battery.h index 27e678c0ba..2bf6e7bb06 100644 --- a/include/battery.h +++ b/include/battery.h @@ -395,6 +395,15 @@ int battery_device_chemistry(char *dest, int size); int battery_manufacturer_date(int *year, int *month, int *day); /** + * Read battery manufacturer data. + * + * @param dest Destination buffer. + * @param size Length of destination buffer. + * @return non-zero if error. + */ +int battery_manufacturer_data(char *data, int size); + +/** * Report the absolute difference between the highest and lowest cell voltage in * the battery pack, in millivolts. On error or unimplemented, returns '0'. */ diff --git a/include/led_pwm.h b/include/led_pwm.h index d0295b8061..7f286130e7 100644 --- a/include/led_pwm.h +++ b/include/led_pwm.h @@ -9,7 +9,6 @@ #include "ec_commands.h" #ifdef CONFIG_ZEPHYR -#include "pwm/pwm.h" #include "drivers/pwm.h" #endif diff --git a/util/comm-usb.c b/util/comm-usb.c index 3810af6ea8..9b362aa2f4 100644 --- a/util/comm-usb.c +++ b/util/comm-usb.c @@ -125,8 +125,9 @@ static int find_interface_with_endpoint(struct usb_endpoint *uep) ep = &iface->endpoint[k]; if (ep->bEndpointAddress == uep->ep_num) { uep->chunk_len = ep->wMaxPacketSize; + r = iface->bInterfaceNumber; libusb_free_config_descriptor(conf); - return i; + return r; } } } diff --git a/util/config_allowed.txt b/util/config_allowed.txt index e00ce907fd..6714872fa4 100644 --- a/util/config_allowed.txt +++ b/util/config_allowed.txt @@ -728,6 +728,7 @@ CONFIG_PROGRAM_MEMORY_BASE_LOAD CONFIG_PS2 CONFIG_PSTORE CONFIG_PVD +CONFIG_PWM CONFIG_PWM_INPUT_LFCLK CONFIG_PWR_STATE_DISCHARGE_FULL CONFIG_RAM_BANKS diff --git a/util/pinmap/README.md b/util/pinmap/README.md index 0246ed47cd..7ac924e09a 100644 --- a/util/pinmap/README.md +++ b/util/pinmap/README.md @@ -5,13 +5,13 @@ This program reads a CSV (comma separated values) file and generates Zephyr Device Tree entries for GPIOs and other configuration. -A basic Device Tree configuration is generated for I2C buses, ADC pins, GPIO pins -and PWM pins, with labels and nodes generated for each of the signals in the +A basic Device Tree configuration is generated for I2C buses, ADC pins and GPIO +pins with labels and nodes generated for each of the signals in the spreadsheet. -A separate overlay Device Tree file can be used to modify the generated DTS -to allow specific properties and parameters to be set e.g bus speeds for I2C, conversion parameters -for ADCs, frequencies for PWM etc. +A separate overlay Device Tree file can be used to modify the generated DTS to +allow specific properties and parameters to be set e.g bus speeds for I2C, +conversion parameters for ADCs etc. ## Building @@ -70,8 +70,6 @@ generate the GPIO or other configuration flags in the DTS. | Type Name | Description | | ----------- | ----------- | | `ADC` | An analogue to digital converter signal | -| `PWM` | A pulse width modulator signal | -| `PWM_INVERT` | A pulse width modulator signal with inverted output | | `I2C_CLOCK` | The clock signal for an I2C bus | | `I2C_DATA` | The data signal for an I2C bus (ignored) | | `INPUT` | A GPIO input signal | diff --git a/util/pinmap/chips/it81302.go b/util/pinmap/chips/it81302.go index e7c8cf697d..6e593a2c5e 100644 --- a/util/pinmap/chips/it81302.go +++ b/util/pinmap/chips/it81302.go @@ -228,21 +228,3 @@ func (c *It81302) I2c(p string) string { return "" } } - -// Pwm returns the configuration of this pin as a PWM. -func (c *It81302) Pwm(p string) string { - s, ok := it81302_pins[p] - if ok { - // Found the pin, now find the PWM name. - for _, ss := range strings.Split(s, "/") { - if strings.HasPrefix(ss, "PWM") && len(ss) > 3 { - pwm := fmt.Sprintf("pwm%s", ss[3:]) - c.okay = append(c.okay, pwm) - return fmt.Sprintf("%s %s", pwm, ss[3:]) - } - } - return "" - } else { - return "" - } -} diff --git a/util/pinmap/chips/npcx993.go b/util/pinmap/chips/npcx993.go index 58ee312d20..7a865c115d 100644 --- a/util/pinmap/chips/npcx993.go +++ b/util/pinmap/chips/npcx993.go @@ -228,21 +228,3 @@ func (c *Npcx993) I2c(p string) string { return "" } } - -// Pwm returns the PWM config associated with this pin. -func (c *Npcx993) Pwm(p string) string { - s, ok := npcx993_pins[p] - if ok { - // Found the pin, now find the PWM name. - for _, ss := range strings.Split(s, ",") { - if strings.HasPrefix(ss, "PWM") && len(ss) > 3 { - ch := ss[3:] - c.okay = append(c.okay, fmt.Sprintf("pwm%s", ch)) - return fmt.Sprintf("pwm%s %s", ch, ch) - } - } - return "" - } else { - return "" - } -} diff --git a/util/pinmap/chips/npcx993_test.go b/util/pinmap/chips/npcx993_test.go index fbed838804..6ed4bf2357 100644 --- a/util/pinmap/chips/npcx993_test.go +++ b/util/pinmap/chips/npcx993_test.go @@ -33,9 +33,6 @@ func TestMissing(t *testing.T) { if gc != "" { t.Errorf("Expected empty string, got %s %d for Gpio()", gc, gp) } - if n.Pwm(none) != "" { - t.Errorf("Expected empty string, got %s for Pwm()", n.Pwm(none)) - } if n.I2c(none) != "" { t.Errorf("Expected empty string, got %s for I2c()", n.I2c(none)) } @@ -52,16 +49,9 @@ func TestMulti(t *testing.T) { if gc != "gpioe" || gp != 0 { t.Errorf("Expected \"gpioe 0\", got %s %d for Gpio()", gc, gp) } - if n.Pwm(pin) != "" { - t.Errorf("Expected empty string, got %s for Pwm()", n.Pwm(pin)) - } if n.I2c(pin) != "" { t.Errorf("Expected empty string, got %s for I2c()", n.I2c(pin)) } - pin = "L9" - if n.Pwm(pin) != "pwm4 4" { - t.Errorf("Expected \"pwm4 4\", got %s for Pwm()", n.Pwm(pin)) - } pin = "F8" if n.I2c(pin) != "i2c3_0" { t.Errorf("Expected \"i2c3_0\", got %s for I2c()", n.I2c(pin)) diff --git a/util/pinmap/pm/chip.go b/util/pinmap/pm/chip.go index bb9d783c60..a940e7c5fe 100644 --- a/util/pinmap/pm/chip.go +++ b/util/pinmap/pm/chip.go @@ -36,11 +36,6 @@ type Chip interface { * the I2C clock pin of the 2 wire bus. */ I2c(pin string) string - /* - * Pwm will return a DTS reference to the appropriate PWM - * that is connected to this pin. - */ - Pwm(pin string) string } // chipList contains a list of registered chips. diff --git a/util/pinmap/pm/chip_test.go b/util/pinmap/pm/chip_test.go index ac65695755..0bfe601093 100644 --- a/util/pinmap/pm/chip_test.go +++ b/util/pinmap/pm/chip_test.go @@ -20,7 +20,6 @@ type testChip struct { gc string gp int i2c string - pwm string } func (c *testChip) Name() string { @@ -43,10 +42,6 @@ func (c *testChip) I2c(pin string) string { return c.i2c } -func (c *testChip) Pwm(pin string) string { - return c.pwm -} - func TestName(t *testing.T) { n1 := "Test1" n2 := "Test2" diff --git a/util/pinmap/pm/generate.go b/util/pinmap/pm/generate.go index afa23ed7c5..835206ad7b 100644 --- a/util/pinmap/pm/generate.go +++ b/util/pinmap/pm/generate.go @@ -46,7 +46,6 @@ func Generate(out io.Writer, pins *Pins, chip Chip, names bool) { gpioConfig(out, pin, chip, lineNameMap) }) pinConfig(out, "named-i2c-ports", pins.I2c, chip, sortI2c, i2cConfig) - pinConfig(out, "named-pwms", pins.Pwm, chip, sortSignal, pwmConfig) fmt.Fprintf(out, "};\n") // Retrieve the enabled nodes, sort, de-dup and // generate overlays. @@ -159,32 +158,6 @@ func i2cConfig(out io.Writer, pin *Pin, chip Chip) { fmt.Fprintf(out, "\t\t};\n") } -// pwmConfig is the handler for PWM pins. -func pwmConfig(out io.Writer, pin *Pin, chip Chip) { - var inv string - switch pin.PinType { - default: - fmt.Printf("Unknown PWM type (%d) for pin %s, ignored\n", pin.PinType, pin.Pin) - return - case PWM: - inv = "0" - case PWM_INVERT: - inv = "1" - } - c := chip.Pwm(pin.Pin) - if len(c) == 0 { - fmt.Printf("No matching PWM for pin %s, ignored\n", pin.Pin) - return - } - lc := strings.ToLower(pin.Signal) - fmt.Fprintf(out, "\t\tpwm_%s: %s {\n", lc, lc) - fmt.Fprintf(out, "\t\t\tpwms = <&%s %s>;\n", c, inv) - if len(pin.Enum) > 0 { - fmt.Fprintf(out, "\t\t\tenum-name = \"%s\";\n", pin.Enum) - } - fmt.Fprintf(out, "\t\t};\n") -} - // generateEnabledNodes generates a "status = okay" // property for the list of nodes passed. func generateEnabledNodes(out io.Writer, nodes []string) { diff --git a/util/pinmap/pm/generate_test.go b/util/pinmap/pm/generate_test.go index 0a6eaca99d..3903180b1b 100644 --- a/util/pinmap/pm/generate_test.go +++ b/util/pinmap/pm/generate_test.go @@ -23,7 +23,7 @@ func (c *genChip) Name() string { } func (c *genChip) EnabledNodes() []string { - return []string{"adc0", "i2c0", "i2c1", "i2c2", "pwm1"} + return []string{"adc0", "i2c0", "i2c1", "i2c2"} } func (c *genChip) Adc(pin string) string { @@ -47,10 +47,6 @@ func (c *genChip) I2c(pin string) string { panic(fmt.Sprintf("Unknown I2C: %s", pin)) } -func (c *genChip) Pwm(pin string) string { - return "pwm1" -} - func TestGenerate(t *testing.T) { pins := &pm.Pins{ Adc: []*pm.Pin{ @@ -67,10 +63,6 @@ func TestGenerate(t *testing.T) { &pm.Pin{pm.InputPU, "G7", "EC_IN_3", "ENUM_IN_3"}, &pm.Pin{pm.InputPD, "H8", "EC_IN_4", "ENUM_IN_4"}, }, - Pwm: []*pm.Pin{ - &pm.Pin{pm.PWM, "E5", "EC_LED_1", "ENUM_LED_1"}, - &pm.Pin{pm.PWM_INVERT, "F6", "EC_LED_2", "ENUM_LED_2"}, - }, } var out bytes.Buffer pm.Generate(&out, pins, &genChip{}, true) @@ -136,19 +128,6 @@ func TestGenerate(t *testing.T) { enum-name = "ENUM_I2C_2"; }; }; - - named-pwms { - compatible = "named-pwms"; - - pwm_ec_led_1: ec_led_1 { - pwms = <&pwm1 0>; - enum-name = "ENUM_LED_1"; - }; - pwm_ec_led_2: ec_led_2 { - pwms = <&pwm1 1>; - enum-name = "ENUM_LED_2"; - }; - }; }; &adc0 { @@ -167,10 +146,6 @@ func TestGenerate(t *testing.T) { status = "okay"; }; -&pwm1 { - status = "okay"; -}; - &gpioC { gpio-line-names = "", diff --git a/util/pinmap/pm/pins.go b/util/pinmap/pm/pins.go index ea9282ab5d..cb749eb166 100644 --- a/util/pinmap/pm/pins.go +++ b/util/pinmap/pm/pins.go @@ -7,8 +7,6 @@ package pm // Pin types enum constants const ( ADC = iota - PWM - PWM_INVERT I2C Input InputL @@ -34,5 +32,4 @@ type Pins struct { Adc []*Pin // Analogue to digital converters I2c []*Pin // I2C busses Gpio []*Pin // GPIO pins - Pwm []*Pin // Pwm pins } diff --git a/util/pinmap/readers/csv/csv.go b/util/pinmap/readers/csv/csv.go index 3f541f5da6..562b5c6383 100644 --- a/util/pinmap/readers/csv/csv.go +++ b/util/pinmap/readers/csv/csv.go @@ -82,20 +82,16 @@ func (r *CSVReader) Read(columnKey, filepath string) (*pm.Pins, error) { p := new(pm.Pin) switch row[ptype] { default: - fmt.Printf("%s:%d: Unknown signal type (%s) - ignored", filepath, i+1, row[ptype]) + fmt.Printf("%s:%d: Unknown signal type (%s) - ignored\n", filepath, i+1, row[ptype]) continue case "OTHER": + case "PWM": + case "PWM_INVERT": // Skipped continue case "ADC": p.PinType = pm.ADC pins.Adc = append(pins.Adc, p) - case "PWM": - p.PinType = pm.PWM - pins.Pwm = append(pins.Pwm, p) - case "PWM_INVERT": - p.PinType = pm.PWM_INVERT - pins.Pwm = append(pins.Pwm, p) case "I2C_DATA": // Only the clock pin is used for the config continue diff --git a/util/pinmap/readers/csv/csv_test.go b/util/pinmap/readers/csv/csv_test.go index 639ec4f8fe..c0a79ba784 100644 --- a/util/pinmap/readers/csv/csv_test.go +++ b/util/pinmap/readers/csv/csv_test.go @@ -38,15 +38,10 @@ func TestName(t *testing.T) { &pm.Pin{pm.OutputODL, "F6", "EC_GPIO_3", ""}, &pm.Pin{pm.InputPU, "K10", "EC_GPIO_4", ""}, }, - Pwm: []*pm.Pin{ - &pm.Pin{pm.PWM, "C3", "EC_PWM_1", "FAN_1"}, - &pm.Pin{pm.PWM_INVERT, "J9", "EC_PWM_2", "LED_1"}, - }, } check(t, "ADc", exp.Adc, pins.Adc) check(t, "I2c", exp.I2c, pins.I2c) check(t, "Gpio", exp.Gpio, pins.Gpio) - check(t, "Pwm", exp.Pwm, pins.Pwm) } func check(t *testing.T, name string, exp, got []*pm.Pin) { diff --git a/util/pinmap/readers/csv/testdata/data.csv b/util/pinmap/readers/csv/testdata/data.csv index 6c7ac5ace9..8f1be84801 100644 --- a/util/pinmap/readers/csv/testdata/data.csv +++ b/util/pinmap/readers/csv/testdata/data.csv @@ -1,8 +1,6 @@ Signal Name,MyCHIP,Type,Enum EC_ADC_1,A1,ADC,ENUM_ADC_1 EC_IGNORED_1,B2,OTHER, -EC_PWM_1,C3,PWM,FAN_1 -EC_PWM_2,J9,PWM_INVERT,LED_1 EC_GPIO_1,D4,INPUT,GPIO1 EC_GPIO_2,E5,OUTPUT,GPIO2 EC_GPIO_3,F6,OUTPUT_ODL, diff --git a/zephyr/Kconfig b/zephyr/Kconfig index 8b727e6aca..cbcb0bee4b 100644 --- a/zephyr/Kconfig +++ b/zephyr/Kconfig @@ -543,17 +543,15 @@ config PLATFORM_EC_POWER_BUTTON This requires a GPIO named GPIO_POWER_BUTTON_L in gpio_map.h. -config PLATFORM_EC_PWM +config PLATFORM_EC_PWM_HC bool - default y if PWM help - Enable the PWM (Pulse Width Modulation) module. This module is used to - support variable brightness LEDs, backlight controls, and - variable-speed fans. + Enable the PWM (Pulse Width Modulation) host command support. This + implements EC_CMD_PWM_SET_DUTY and EC_CMD_PWM_GET_DUTY. config PLATFORM_EC_PWM_DISPLIGHT bool "PWM display backlight" - depends on PLATFORM_EC_PWM + select PLATFORM_EC_PWM_HC help Enables display backlight controlled by a PWM signal connected directly to the EC chipset. The board devicetree file must define a diff --git a/zephyr/Kconfig.keyboard b/zephyr/Kconfig.keyboard index 8c0a60a620..41805be43b 100644 --- a/zephyr/Kconfig.keyboard +++ b/zephyr/Kconfig.keyboard @@ -189,6 +189,7 @@ choice config PLATFORM_EC_PWM_KBLIGHT bool "PWM keyboard backlight" + select PLATFORM_EC_PWM_HC help Enables a PWM-controlled keyboard backlight controlled by a PWM signal connected directly to the EC chipset. The board devicetree file must diff --git a/zephyr/dts/bindings/pwm/named-pwms.yaml b/zephyr/dts/bindings/pwm/named-pwms.yaml deleted file mode 100644 index 3e5c1c789f..0000000000 --- a/zephyr/dts/bindings/pwm/named-pwms.yaml +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2021 The Chromium OS Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -description: PWM KEYS parent node - -compatible: "named-pwms" - -child-binding: - description: Named PWMs child node - properties: - pwms: - type: phandle-array - required: true - frequency: - required: true - type: int - description: PWM frequency, in Hz diff --git a/zephyr/projects/nissa/nereid_generated.dts b/zephyr/projects/nissa/nereid_generated.dts index 2f772a3530..d31fabad92 100644 --- a/zephyr/projects/nissa/nereid_generated.dts +++ b/zephyr/projects/nissa/nereid_generated.dts @@ -238,23 +238,6 @@ enum-name = "I2C_PORT_USB_C0_TCPC"; }; }; - - named-pwms { - compatible = "named-pwms"; - - pwm_pwm_kb_bl: pwm_kb_bl { - pwms = <&pwm0 0 0>; - }; - pwm_pwm_led_1_odl: pwm_led_1_odl { - pwms = <&pwm1 1 1>; - }; - pwm_pwm_led_2_odl: pwm_led_2_odl { - pwms = <&pwm2 2 1>; - }; - pwm_pwm_led_3_odl: pwm_led_3_odl { - pwms = <&pwm3 3 1>; - }; - }; }; &adc0 { @@ -280,19 +263,3 @@ &i2c5 { status = "okay"; }; - -&pwm0 { - status = "okay"; -}; - -&pwm1 { - status = "okay"; -}; - -&pwm2 { - status = "okay"; -}; - -&pwm3 { - status = "okay"; -}; diff --git a/zephyr/projects/nissa/nereid_keyboard.dts b/zephyr/projects/nissa/nereid_keyboard.dts index 8767d23828..a020a92ba9 100644 --- a/zephyr/projects/nissa/nereid_keyboard.dts +++ b/zephyr/projects/nissa/nereid_keyboard.dts @@ -10,3 +10,8 @@ frequency = <10000>; }; }; + +&pwm0 { + status = "okay"; + prescaler-cx = <PWM_PRESCALER_C4>; +}; diff --git a/zephyr/projects/nissa/nereid_overlay.dts b/zephyr/projects/nissa/nereid_overlay.dts index 08b796d0fe..a23c070359 100644 --- a/zephyr/projects/nissa/nereid_overlay.dts +++ b/zephyr/projects/nissa/nereid_overlay.dts @@ -264,36 +264,3 @@ label = "I2C_USB_C0_TCPC"; clock-frequency = <I2C_BITRATE_FAST_PLUS>; }; - -/* PWM config */ -&pwm0 { - prescaler-cx = <PWM_PRESCALER_C4>; -}; - -&pwm1 { - prescaler-cx = <PWM_PRESCALER_C4>; -}; - -&pwm2 { - prescaler-cx = <PWM_PRESCALER_C4>; -}; - -&pwm3 { - prescaler-cx = <PWM_PRESCALER_C4>; -}; - -&pwm_pwm_kb_bl { - frequency = <10000>; -}; - -&pwm_pwm_led_1_odl { - frequency = <324>; -}; - -&pwm_pwm_led_2_odl { - frequency = <324>; -}; - -&pwm_pwm_led_3_odl { - frequency = <324>; -}; diff --git a/zephyr/projects/nissa/nereid_pwm_leds.dts b/zephyr/projects/nissa/nereid_pwm_leds.dts index a25e4487c0..7cd2df01b0 100644 --- a/zephyr/projects/nissa/nereid_pwm_leds.dts +++ b/zephyr/projects/nissa/nereid_pwm_leds.dts @@ -38,3 +38,18 @@ }; }; }; + +&pwm1 { + status = "okay"; + prescaler-cx = <PWM_PRESCALER_C4>; +}; + +&pwm2 { + status = "okay"; + prescaler-cx = <PWM_PRESCALER_C4>; +}; + +&pwm3 { + status = "okay"; + prescaler-cx = <PWM_PRESCALER_C4>; +}; diff --git a/zephyr/projects/nissa/nivviks_generated.dts b/zephyr/projects/nissa/nivviks_generated.dts index ad8d2de0d1..7b3c83886f 100644 --- a/zephyr/projects/nissa/nivviks_generated.dts +++ b/zephyr/projects/nissa/nivviks_generated.dts @@ -227,23 +227,6 @@ enum-name = "I2C_PORT_BATTERY"; }; }; - - named-pwms { - compatible = "named-pwms"; - - pwm_pwm_kb_bl: pwm_kb_bl { - pwms = <&pwm6 6 0>; - }; - pwm_pwm_led_1_odl: pwm_led_1_odl { - pwms = <&pwm2 2 1>; - }; - pwm_pwm_led_2_odl: pwm_led_2_odl { - pwms = <&pwm0 0 1>; - }; - pwm_pwm_led_3_odl: pwm_led_3_odl { - pwms = <&pwm1 1 1>; - }; - }; }; &adc0 { @@ -289,19 +272,3 @@ &i2c_ctrl7 { status = "okay"; }; - -&pwm0 { - status = "okay"; -}; - -&pwm1 { - status = "okay"; -}; - -&pwm2 { - status = "okay"; -}; - -&pwm6 { - status = "okay"; -}; diff --git a/zephyr/projects/nissa/nivviks_keyboard.dts b/zephyr/projects/nissa/nivviks_keyboard.dts index bb3dd9067e..b1b4b5af8b 100644 --- a/zephyr/projects/nissa/nivviks_keyboard.dts +++ b/zephyr/projects/nissa/nivviks_keyboard.dts @@ -10,3 +10,7 @@ frequency = <10000>; }; }; + +&pwm6 { + status = "okay"; +}; diff --git a/zephyr/projects/nissa/nivviks_overlay.dts b/zephyr/projects/nissa/nivviks_overlay.dts index 63c857cf6d..ad335f80e1 100644 --- a/zephyr/projects/nissa/nivviks_overlay.dts +++ b/zephyr/projects/nissa/nivviks_overlay.dts @@ -287,37 +287,6 @@ clock-frequency = <I2C_BITRATE_STANDARD>; }; -/* PWM frequencies */ - -&pwm_pwm_kb_bl { - frequency = <10000>; -}; - -&pwm_pwm_led_1_odl { - frequency = <324>; -}; - -&pwm_pwm_led_2_odl { - frequency = <324>; -}; - -&pwm_pwm_led_3_odl { - frequency = <324>; -}; - -/* Enable LEDs to work while CPU suspended */ -&pwm0 { - clock-bus = "NPCX_CLOCK_BUS_LFCLK"; -}; - -&pwm1 { - clock-bus = "NPCX_CLOCK_BUS_LFCLK"; -}; - -&pwm2 { - clock-bus = "NPCX_CLOCK_BUS_LFCLK"; -}; - &pwm5 { status = "okay"; drive-open-drain; diff --git a/zephyr/projects/nissa/nivviks_pwm_leds.dts b/zephyr/projects/nissa/nivviks_pwm_leds.dts index de76880cbe..36a5a5b461 100644 --- a/zephyr/projects/nissa/nivviks_pwm_leds.dts +++ b/zephyr/projects/nissa/nivviks_pwm_leds.dts @@ -38,3 +38,20 @@ }; }; }; + +/* Enable LEDs to work while CPU suspended */ + +&pwm0 { + status = "okay"; + clock-bus = "NPCX_CLOCK_BUS_LFCLK"; +}; + +&pwm1 { + status = "okay"; + clock-bus = "NPCX_CLOCK_BUS_LFCLK"; +}; + +&pwm2 { + status = "okay"; + clock-bus = "NPCX_CLOCK_BUS_LFCLK"; +}; diff --git a/zephyr/projects/skyrim/power_signals.c b/zephyr/projects/skyrim/power_signals.c index f36f2ae576..e85cea1f04 100644 --- a/zephyr/projects/skyrim/power_signals.c +++ b/zephyr/projects/skyrim/power_signals.c @@ -81,10 +81,10 @@ DECLARE_HOOK(HOOK_INIT, baseboard_init, HOOK_PRIO_POST_I2C); /** * b/227296844: On G3->S5, wait for RSMRST_L to be deasserted before asserting - * PCH_PWRBTN_L. This typically takes 32-35 ms in testing. Then wait an + * PCH_PWRBTN_L. This can be as long as ~65ms after cold boot. Then wait an * additional delay of T1a defined in the EDS before changing the power button. */ -#define RSMRST_WAIT_DELAY 40 +#define RSMRST_WAIT_DELAY 70 #define EDS_PWR_BTN_RSMRST_T1A_DELAY 16 void board_pwrbtn_to_pch(int level) { diff --git a/zephyr/shim/include/board.h b/zephyr/shim/include/board.h index 74caadfeef..39d80a3495 100644 --- a/zephyr/shim/include/board.h +++ b/zephyr/shim/include/board.h @@ -25,10 +25,6 @@ #include "i2c/i2c.h" #endif -#ifdef CONFIG_PWM -#include "pwm/pwm.h" -#endif - /* Include board specific sensor configuration if motionsense is enabled */ #ifdef CONFIG_MOTIONSENSE #include "motionsense_sensors_defs.h" diff --git a/zephyr/shim/include/config_chip.h b/zephyr/shim/include/config_chip.h index 5f865c3fa7..4b84447aa5 100644 --- a/zephyr/shim/include/config_chip.h +++ b/zephyr/shim/include/config_chip.h @@ -871,11 +871,6 @@ extern struct jump_data mock_jump_data; #define CONFIG_FAKE_SHMEM #endif -#undef CONFIG_PWM -#ifdef CONFIG_PLATFORM_EC_PWM -#define CONFIG_PWM -#endif - #undef CONFIG_CMD_S5_TIMEOUT #ifdef CONFIG_PLATFORM_EC_CONSOLE_CMD_S5_TIMEOUT #define CONFIG_CMD_S5_TIMEOUT diff --git a/zephyr/shim/include/pwm/pwm.h b/zephyr/shim/include/pwm/pwm.h deleted file mode 100644 index 1bf4685837..0000000000 --- a/zephyr/shim/include/pwm/pwm.h +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright 2021 The Chromium OS Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#ifndef ZEPHYR_SHIM_INCLUDE_PWM_PWM_H_ -#define ZEPHYR_SHIM_INCLUDE_PWM_PWM_H_ - -#include <device.h> -#include <devicetree.h> - -#if DT_NODE_EXISTS(DT_PATH(named_pwms)) - -#define PWM_CHANNEL(id) DT_CAT(PWM_, id) -#define PWM_CHANNEL_WITH_COMMA(id) PWM_CHANNEL(id), - -enum pwm_channel { - DT_FOREACH_CHILD(DT_PATH(named_pwms), PWM_CHANNEL_WITH_COMMA) - PWM_CH_COUNT, -}; - -#define NAMED_PWM(name) PWM_CHANNEL(DT_PATH(named_pwms, name)) - -#endif /* named_pwms */ - -#endif /* ZEPHYR_SHIM_INCLUDE_PWM_PWM_H_ */ diff --git a/zephyr/shim/src/CMakeLists.txt b/zephyr/shim/src/CMakeLists.txt index bc9729abae..23aacc177f 100644 --- a/zephyr/shim/src/CMakeLists.txt +++ b/zephyr/shim/src/CMakeLists.txt @@ -43,7 +43,7 @@ zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_MKBP_EVENT mkbp_event.c) zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_MOTIONSENSE motionsense_sensors.c) zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_PANIC panic.c) -zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_PWM pwm.c) +zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_PWM_HC pwm_hc.c) zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_LED_PWM pwm_led.c) zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_RTC rtc.c) zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_SWITCHCAP_GPIO diff --git a/zephyr/shim/src/pwm.c b/zephyr/shim/src/pwm.c deleted file mode 100644 index 5f76878b12..0000000000 --- a/zephyr/shim/src/pwm.c +++ /dev/null @@ -1,295 +0,0 @@ -/* Copyright 2021 The Chromium OS Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include <device.h> -#include <devicetree.h> -#include <drivers/pwm.h> -#include <logging/log.h> - -#include "common.h" -#include "console.h" -#include "drivers/cros_displight.h" -#include "ec_commands.h" -#include "host_command.h" -#include "pwm.h" -#include "keyboard_backlight.h" -#include "util.h" - -#include "pwm/pwm.h" - -LOG_MODULE_REGISTER(pwm_shim, LOG_LEVEL_ERR); - -#define PWM_RAW_TO_PERCENT(v) \ - DIV_ROUND_NEAREST((uint32_t)(v) * 100, UINT16_MAX) -#define PWM_PERCENT_TO_RAW(v) ((uint32_t)(v) * UINT16_MAX / 100) - -/* TODO(b/217741090): drop the PWM shim code once all callers have been - * converted. - */ -#if DT_HAS_COMPAT_STATUS_OKAY(named_pwms) - -/* - * Initialize the device bindings in pwm_channels. - * This macro is called from within DT_FOREACH_CHILD - */ -#define INIT_DEV_BINDING(id) { \ - pwm_configs[PWM_CHANNEL(id)].name = DT_NODE_FULL_NAME(id); \ - pwm_configs[PWM_CHANNEL(id)].dev = DEVICE_DT_GET( \ - DT_PHANDLE(id, pwms)); \ - pwm_configs[PWM_CHANNEL(id)].pin = DT_PWMS_CHANNEL(id); \ - pwm_configs[PWM_CHANNEL(id)].flags = DT_PWMS_FLAGS(id); \ - pwm_configs[PWM_CHANNEL(id)].freq = DT_PROP(id, frequency); \ - } - -struct pwm_config { - /* Name */ - const char *name; - /* PWM pin */ - uint32_t pin; - /* PWM channel flags. See dt-bindings/pwm/pwm.h */ - pwm_flags_t flags; - /* PWM operating frequency. Configured by the devicetree */ - uint32_t freq; - - /* PWM period in microseconds. Automatically set to 1/frequency */ - uint32_t period_us; - /* PWM pulse in microseconds. Set by pwm_set_raw_duty */ - uint32_t pulse_us; - /* Saves whether the PWM channel is currently enabled */ - bool enabled; - - /* Runtime device for PWM */ - const struct device *dev; -}; - -static struct pwm_config pwm_configs[PWM_CH_COUNT]; - -static int init_pwms(const struct device *unused) -{ - struct pwm_config *pwm; - int rv = 0; - - ARG_UNUSED(unused); - - /* Initialize PWM data from the device tree */ - DT_FOREACH_CHILD(DT_PATH(named_pwms), INIT_DEV_BINDING) - - /* Read the PWM operating frequency, set by the chip driver */ - for (size_t i = 0; i < PWM_CH_COUNT; ++i) { - pwm = &pwm_configs[i]; - - if (pwm->dev == NULL) { - LOG_ERR("Not found (%s)", pwm->name); - rv = -ENODEV; - continue; - } - - /* - * TODO - check that devicetree frequency is less than 1/2 - * max frequency from the chip driver. - */ - pwm->period_us = USEC_PER_SEC / pwm->freq; - } - - return rv; -} -#if CONFIG_PLATFORM_EC_PWM_INIT_PRIORITY <= CONFIG_KERNEL_INIT_PRIORITY_DEVICE -#error "PWM init priority must be > KERNEL_INIT_PRIORITY_DEVICE" -#endif -SYS_INIT(init_pwms, PRE_KERNEL_1, CONFIG_PLATFORM_EC_PWM_INIT_PRIORITY); - -static struct pwm_config* pwm_lookup(enum pwm_channel ch) -{ - __ASSERT(ch < ARRAY_SIZE(pwm_configs), "Invalid PWM channel %d", ch); - - return &pwm_configs[ch]; -} - -void pwm_enable(enum pwm_channel ch, int enabled) -{ - struct pwm_config *pwm; - uint32_t pulse_us; - int rv; - - pwm = pwm_lookup(ch); - pwm->enabled = enabled; - - /* - * The Zephyr API doesn't provide explicit enable and disable - * commands. However, setting the pulse width to zero disables - * the PWM. - */ - if (enabled) - pulse_us = pwm->pulse_us; - else - pulse_us = 0; - - rv = pwm_pin_set_usec(pwm->dev, pwm->pin, pwm->period_us, pulse_us, - pwm->flags); - - if (rv) - LOG_ERR("pwm_pin_set_usec() failed %s (%d)", pwm->name, rv); -} - -int pwm_get_enabled(enum pwm_channel ch) -{ - struct pwm_config *pwm; - - pwm = pwm_lookup(ch); - return pwm->enabled; -} - -void pwm_set_raw_duty(enum pwm_channel ch, uint16_t duty) -{ - struct pwm_config *pwm; - int rv; - - pwm = pwm_lookup(ch); - - pwm->pulse_us = - DIV_ROUND_NEAREST(pwm->period_us * duty, EC_PWM_MAX_DUTY); - - LOG_DBG("PWM %s set raw duty (0x%04x), pulse %d", pwm->name, duty, - pwm->pulse_us); - - rv = pwm_pin_set_usec(pwm->dev, pwm->pin, pwm->period_us, pwm->pulse_us, - pwm->flags); - - if (rv) - LOG_ERR("pwm_pin_set_usec() failed %s (%d)", pwm->name, rv); -} - -uint16_t pwm_get_raw_duty(enum pwm_channel ch) -{ - struct pwm_config *pwm; - - pwm = pwm_lookup(ch); - - return DIV_ROUND_NEAREST(pwm->pulse_us * EC_PWM_MAX_DUTY, - pwm->period_us); -} - -void pwm_set_duty(enum pwm_channel ch, int percent) -{ - struct pwm_config *pwm; - int rv; - - pwm = pwm_lookup(ch); - - pwm->pulse_us = DIV_ROUND_NEAREST(pwm->period_us * percent, 100); - - LOG_DBG("PWM %s set percent (%d), pulse %d", pwm->name, percent, - pwm->pulse_us); - - rv = pwm_pin_set_usec(pwm->dev, pwm->pin, pwm->period_us, pwm->pulse_us, - pwm->flags); - - if (rv) - LOG_ERR("pwm_pin_set_usec() failed %s (%d)", pwm->name, rv); -} - -int pwm_get_duty(enum pwm_channel ch) -{ - struct pwm_config *pwm; - - pwm = pwm_lookup(ch); - - return DIV_ROUND_NEAREST(pwm->pulse_us * 100, pwm->period_us); -} - -#endif /* DT_HAS_COMPAT_STATUS_OKAY(named_pwm) */ - -#define HAS_PWM_GENERIC_CHANNEL(compat) \ - DT_NODE_HAS_PROP(DT_COMPAT_GET_ANY_STATUS_OKAY(compat), \ - generic_pwm_channel) - -#define PWM_GENERIC_CHANNEL_ID(compat) \ - DT_PROP(DT_COMPAT_GET_ANY_STATUS_OKAY(compat), \ - generic_pwm_channel) - -#ifdef CONFIG_PWM_KBLIGHT -static bool pwm_is_kblight(int type, int index) -{ - if (type == EC_PWM_TYPE_KB_LIGHT) - return true; - -#if HAS_PWM_GENERIC_CHANNEL(cros_ec_kblight_pwm) - if (type == EC_PWM_TYPE_GENERIC && - index == PWM_GENERIC_CHANNEL_ID(cros_ec_kblight_pwm)) - return true; -#endif /* HAS_PWM_GENERIC_CHANNEL(cros_ec_kblight_pwm) */ - - return false; -} -#endif /* CONFIG_PWM_KBLIGHT */ - -#ifdef CONFIG_PLATFORM_EC_PWM_DISPLIGHT -static bool pwm_is_displight(int type, int index) -{ - if (type == EC_PWM_TYPE_DISPLAY_LIGHT) - return true; - -#if HAS_PWM_GENERIC_CHANNEL(cros_ec_displight) - if (type == EC_PWM_TYPE_GENERIC && - index == PWM_GENERIC_CHANNEL_ID(cros_ec_displight)) - return true; -#endif /* HAS_PWM_GENERIC_CHANNEL(cros_ec_displight) */ - - return false; -} -#endif /* CONFIG_PLATFORM_EC_PWM_DISPLIGHT */ - - -static enum ec_status host_command_pwm_set_duty( - struct host_cmd_handler_args *args) -{ - __maybe_unused const struct ec_params_pwm_set_duty *p = args->params; - -#ifdef CONFIG_PLATFORM_EC_PWM_KBLIGHT - if (pwm_is_kblight(p->pwm_type, p->index)) { - kblight_set(PWM_RAW_TO_PERCENT(p->duty)); - kblight_enable(p->duty > 0); - return EC_RES_SUCCESS; - } -#endif -#ifdef CONFIG_PLATFORM_EC_PWM_DISPLIGHT - if (pwm_is_displight(p->pwm_type, p->index)) { - displight_set(PWM_RAW_TO_PERCENT(p->duty)); - return EC_RES_SUCCESS; - } -#endif - - return EC_RES_INVALID_PARAM; -} -DECLARE_HOST_COMMAND(EC_CMD_PWM_SET_DUTY, - host_command_pwm_set_duty, - EC_VER_MASK(0)); - -static enum ec_status host_command_pwm_get_duty( - struct host_cmd_handler_args *args) -{ - __maybe_unused const struct ec_params_pwm_get_duty *p = args->params; - __maybe_unused struct ec_response_pwm_get_duty *r = args->response; - -#ifdef CONFIG_PLATFORM_EC_PWM_KBLIGHT - if (pwm_is_kblight(p->pwm_type, p->index)) { - r->duty = PWM_PERCENT_TO_RAW(kblight_get()); - args->response_size = sizeof(*r); - return EC_RES_SUCCESS; - } -#endif -#ifdef CONFIG_PLATFORM_EC_PWM_DISPLIGHT - if (pwm_is_displight(p->pwm_type, p->index)) { - r->duty = PWM_PERCENT_TO_RAW(displight_get()); - args->response_size = sizeof(*r); - return EC_RES_SUCCESS; - } -#endif - - return EC_RES_INVALID_PARAM; -} -DECLARE_HOST_COMMAND(EC_CMD_PWM_GET_DUTY, - host_command_pwm_get_duty, - EC_VER_MASK(0)); diff --git a/zephyr/shim/src/pwm_hc.c b/zephyr/shim/src/pwm_hc.c new file mode 100644 index 0000000000..3aaba20bc4 --- /dev/null +++ b/zephyr/shim/src/pwm_hc.c @@ -0,0 +1,117 @@ +/* Copyright 2021 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include <device.h> +#include <devicetree.h> +#include <drivers/pwm.h> +#include <logging/log.h> + +#include "common.h" +#include "console.h" +#include "drivers/cros_displight.h" +#include "ec_commands.h" +#include "host_command.h" +#include "pwm.h" +#include "keyboard_backlight.h" +#include "util.h" + +LOG_MODULE_REGISTER(pwm_shim, LOG_LEVEL_ERR); + +#define PWM_RAW_TO_PERCENT(v) \ + DIV_ROUND_NEAREST((uint32_t)(v) * 100, UINT16_MAX) +#define PWM_PERCENT_TO_RAW(v) ((uint32_t)(v) * UINT16_MAX / 100) + +#define HAS_PWM_GENERIC_CHANNEL(compat) \ + DT_NODE_HAS_PROP(DT_COMPAT_GET_ANY_STATUS_OKAY(compat), \ + generic_pwm_channel) + +#define PWM_GENERIC_CHANNEL_ID(compat) \ + DT_PROP(DT_COMPAT_GET_ANY_STATUS_OKAY(compat), \ + generic_pwm_channel) + +#ifdef CONFIG_PWM_KBLIGHT +static bool pwm_is_kblight(int type, int index) +{ + if (type == EC_PWM_TYPE_KB_LIGHT) + return true; + +#if HAS_PWM_GENERIC_CHANNEL(cros_ec_kblight_pwm) + if (type == EC_PWM_TYPE_GENERIC && + index == PWM_GENERIC_CHANNEL_ID(cros_ec_kblight_pwm)) + return true; +#endif /* HAS_PWM_GENERIC_CHANNEL(cros_ec_kblight_pwm) */ + + return false; +} +#endif /* CONFIG_PWM_KBLIGHT */ + +#ifdef CONFIG_PLATFORM_EC_PWM_DISPLIGHT +static bool pwm_is_displight(int type, int index) +{ + if (type == EC_PWM_TYPE_DISPLAY_LIGHT) + return true; + +#if HAS_PWM_GENERIC_CHANNEL(cros_ec_displight) + if (type == EC_PWM_TYPE_GENERIC && + index == PWM_GENERIC_CHANNEL_ID(cros_ec_displight)) + return true; +#endif /* HAS_PWM_GENERIC_CHANNEL(cros_ec_displight) */ + + return false; +} +#endif /* CONFIG_PLATFORM_EC_PWM_DISPLIGHT */ + + +static enum ec_status host_command_pwm_set_duty( + struct host_cmd_handler_args *args) +{ + __maybe_unused const struct ec_params_pwm_set_duty *p = args->params; + +#ifdef CONFIG_PLATFORM_EC_PWM_KBLIGHT + if (pwm_is_kblight(p->pwm_type, p->index)) { + kblight_set(PWM_RAW_TO_PERCENT(p->duty)); + kblight_enable(p->duty > 0); + return EC_RES_SUCCESS; + } +#endif +#ifdef CONFIG_PLATFORM_EC_PWM_DISPLIGHT + if (pwm_is_displight(p->pwm_type, p->index)) { + displight_set(PWM_RAW_TO_PERCENT(p->duty)); + return EC_RES_SUCCESS; + } +#endif + + return EC_RES_INVALID_PARAM; +} +DECLARE_HOST_COMMAND(EC_CMD_PWM_SET_DUTY, + host_command_pwm_set_duty, + EC_VER_MASK(0)); + +static enum ec_status host_command_pwm_get_duty( + struct host_cmd_handler_args *args) +{ + __maybe_unused const struct ec_params_pwm_get_duty *p = args->params; + __maybe_unused struct ec_response_pwm_get_duty *r = args->response; + +#ifdef CONFIG_PLATFORM_EC_PWM_KBLIGHT + if (pwm_is_kblight(p->pwm_type, p->index)) { + r->duty = PWM_PERCENT_TO_RAW(kblight_get()); + args->response_size = sizeof(*r); + return EC_RES_SUCCESS; + } +#endif +#ifdef CONFIG_PLATFORM_EC_PWM_DISPLIGHT + if (pwm_is_displight(p->pwm_type, p->index)) { + r->duty = PWM_PERCENT_TO_RAW(displight_get()); + args->response_size = sizeof(*r); + return EC_RES_SUCCESS; + } +#endif + + return EC_RES_INVALID_PARAM; +} +DECLARE_HOST_COMMAND(EC_CMD_PWM_GET_DUTY, + host_command_pwm_get_duty, + EC_VER_MASK(0)); diff --git a/zephyr/subsys/ap_pwrseq/include/signal_vw.h b/zephyr/subsys/ap_pwrseq/include/signal_vw.h index bb05d15a71..d005daaa40 100644 --- a/zephyr/subsys/ap_pwrseq/include/signal_vw.h +++ b/zephyr/subsys/ap_pwrseq/include/signal_vw.h @@ -45,11 +45,4 @@ int power_signal_vw_get(enum pwr_sig_vw vw); */ void power_signal_vw_init(void); -/** - * @brief External notification when the bus is ready or not. - * - * @param ready true When signals are valid, false when bus is not ready. - */ -void notify_espi_ready(bool ready); - #endif /* __AP_PWRSEQ_SIGNAL_VW_H__ */ diff --git a/zephyr/subsys/ap_pwrseq/include/x86_common_pwrseq.h b/zephyr/subsys/ap_pwrseq/include/x86_common_pwrseq.h index 6eee6ce140..9b6c60b53c 100644 --- a/zephyr/subsys/ap_pwrseq/include/x86_common_pwrseq.h +++ b/zephyr/subsys/ap_pwrseq/include/x86_common_pwrseq.h @@ -18,9 +18,6 @@ struct pwrseq_context { enum power_states_ndsx power_state; /* Indicate should exit G3 power state or not */ bool want_g3_exit; -#if defined(PWRSEQ_REQUIRE_ESPI) - bool espi_ready; -#endif }; diff --git a/zephyr/subsys/ap_pwrseq/include/x86_power_signals.h b/zephyr/subsys/ap_pwrseq/include/x86_power_signals.h index 8ec4770e99..1832c4877c 100644 --- a/zephyr/subsys/ap_pwrseq/include/x86_power_signals.h +++ b/zephyr/subsys/ap_pwrseq/include/x86_power_signals.h @@ -24,16 +24,6 @@ #define IN_ALL_S0_VALUE IN_PGOOD_ALL_CORE #define CHIPSET_G3S5_POWERUP_SIGNAL IN_PCH_SLP_SUS_DEASSERTED -#if defined(CONFIG_PLATFORM_EC_ESPI_VW_SLP_S3) || \ - defined(CONFIG_PLATFORM_EC_ESPI_VW_SLP_S4) || \ - defined(CONFIG_PLATFORM_EC_ESPI_VW_SLP_S5) -/* - * Set if ESPI signals are required, so need to check - * whether ESPI is ready or not - */ -#define PWRSEQ_REQUIRE_ESPI -#endif - #else #warning("Input power signals state flags not defined"); #endif diff --git a/zephyr/subsys/ap_pwrseq/power_host_sleep.c b/zephyr/subsys/ap_pwrseq/power_host_sleep.c index 13e6aba765..2e7df63c51 100644 --- a/zephyr/subsys/ap_pwrseq/power_host_sleep.c +++ b/zephyr/subsys/ap_pwrseq/power_host_sleep.c @@ -203,7 +203,7 @@ void ap_power_chipset_handle_host_sleep_event( * notification needs to be sent to listeners. */ ap_power_sleep_set_notify(AP_POWER_SLEEP_SUSPEND); - power_signal_enable_interrupt(PWR_SLP_S0); + power_signal_enable(PWR_SLP_S0); } else if (state == HOST_SLEEP_EVENT_S0IX_RESUME) { /* @@ -212,7 +212,7 @@ void ap_power_chipset_handle_host_sleep_event( */ ap_power_sleep_set_notify(AP_POWER_SLEEP_RESUME); power_s0ix_resume_restore_masks(); - power_signal_disable_interrupt(PWR_SLP_S0); + power_signal_disable(PWR_SLP_S0); /* * If the sleep signal timed out and never transitioned, then @@ -223,7 +223,7 @@ void ap_power_chipset_handle_host_sleep_event( power_update_wake_mask(); } else if (state == HOST_SLEEP_EVENT_DEFAULT_RESET) { - power_signal_disable_interrupt(PWR_SLP_S0); + power_signal_disable(PWR_SLP_S0); } #endif /* CONFIG_AP_PWRSEQ_S0IX */ } diff --git a/zephyr/subsys/ap_pwrseq/power_signals.c b/zephyr/subsys/ap_pwrseq/power_signals.c index c463e8e82e..7df7b3ef00 100644 --- a/zephyr/subsys/ap_pwrseq/power_signals.c +++ b/zephyr/subsys/ap_pwrseq/power_signals.c @@ -86,16 +86,18 @@ DT_FOREACH_STATUS_OKAY(intel_ap_pwrseq_external, PWR_SIGNAL_POLLED) }; /* - * Bitmask of power signals updated via interrupt. + * Bitmasks of power signals. A previous copy is held so that + * logging of changes can occur if the signal is in the debug mask. */ -static atomic_t interrupt_power_signals; +static atomic_t power_signals, prev_power_signals; -static power_signal_mask_t output_signals; static power_signal_mask_t debug_signals; void power_set_debug(power_signal_mask_t debug) { debug_signals = debug; + /* Copy the current values */ + atomic_set(&prev_power_signals, atomic_get(&power_signals)); } power_signal_mask_t power_get_debug(void) @@ -103,12 +105,19 @@ power_signal_mask_t power_get_debug(void) return debug_signals; } -static inline void check_debug(power_signal_mask_t mask, - enum power_signal signal, - int value) +static inline void check_debug(enum power_signal signal) { - if (debug_signals & mask) { - LOG_INF("%s -> %d", power_signal_name(signal), value); + /* + * Only check for debug display if the logging level requires it. + */ + if ((CONFIG_AP_PWRSEQ_LOG_LEVEL >= LOG_LEVEL_INF) && + (debug_signals & POWER_SIGNAL_MASK(signal))) { + bool value = atomic_test_bit(&power_signals, signal); + + if (value != atomic_test_bit(&prev_power_signals, signal)) { + LOG_INF("%s -> %d", power_signal_name(signal), value); + atomic_set_bit_to(&prev_power_signals, signal, value); + } } } @@ -121,14 +130,13 @@ power_signal_mask_t power_get_signals(void) mask |= POWER_SIGNAL_MASK(polled_signals[i]); } } - return mask | output_signals | - atomic_get(&interrupt_power_signals); + return mask | atomic_get(&power_signals); } void power_signal_interrupt(enum power_signal signal, int value) { - atomic_set_bit_to(&interrupt_power_signals, signal, value); - check_debug(POWER_SIGNAL_MASK(signal), signal, value); + atomic_set_bit_to(&power_signals, signal, value); + check_debug(signal); } int power_wait_mask_signals_timeout(power_signal_mask_t mask, @@ -209,19 +217,11 @@ int power_signal_set(enum power_signal signal, int value) #endif } /* - * Output succeeded, update output mask. + * Output succeeded, update mask. */ if (ret == 0) { - power_signal_mask_t mask = POWER_SIGNAL_MASK(signal); - power_signal_mask_t old = output_signals; - - if (value) - output_signals |= mask; - else - output_signals &= ~mask; - if (old != output_signals) { - check_debug(mask, signal, value); - } + atomic_set_bit_to(&power_signals, signal, value); + check_debug(signal); } return ret; } @@ -295,4 +295,26 @@ void power_signal_init(void) if (IS_ENABLED(HAS_ADC_SIGNALS)) { power_signal_adc_init(); } + /* + * Initialise the mask with the current values. + * This includes the outputs as well. + */ + for (int i = 0; i < POWER_SIGNAL_COUNT; i++) { + if (power_signal_get(i) == 1) { + atomic_set_bit(&power_signals, i); + } + } + /* + * Some signals are polled (such as the board external signals), + * so clear these values from the initial state so they + * don't get OR'ed in later on. + */ + for (int i = 0; i < ARRAY_SIZE(polled_signals); i++) { + atomic_clear_bit(&power_signals, i); + } + /* + * Save the current state so that new changes can be + * checked against the debug mask. + */ + atomic_set(&prev_power_signals, atomic_get(&power_signals)); } diff --git a/zephyr/subsys/ap_pwrseq/signal_adc.c b/zephyr/subsys/ap_pwrseq/signal_adc.c index 9898c8e4bd..17038ba2ea 100644 --- a/zephyr/subsys/ap_pwrseq/signal_adc.c +++ b/zephyr/subsys/ap_pwrseq/signal_adc.c @@ -175,6 +175,10 @@ void power_signal_adc_init(void) /* Set high and low trigger callbacks */ sensor_trigger_set(config[i].dev_trig_high, &trig, high_cb[i]); sensor_trigger_set(config[i].dev_trig_low, &trig, low_cb[i]); + /* + * TODO: Get current value and initialise adc_state. + * + */ power_signal_adc_enable(i); } } diff --git a/zephyr/subsys/ap_pwrseq/signal_gpio.c b/zephyr/subsys/ap_pwrseq/signal_gpio.c index b4888f8cff..e28df96e6b 100644 --- a/zephyr/subsys/ap_pwrseq/signal_gpio.c +++ b/zephyr/subsys/ap_pwrseq/signal_gpio.c @@ -6,7 +6,7 @@ #include <power_signals.h> #include <signal_gpio.h> #include <drivers/gpio.h> -#include "system.h" +#include "sysjump.h" #define MY_COMPAT intel_ap_pwrseq_gpio @@ -121,8 +121,11 @@ void power_signal_gpio_init(void) /* * If there has been a sysjump, do not set the output * to the deasserted state. + * We can't use system_jumped_late() since that is not + * initialised at this point. */ - gpio_flags_t out_flags = system_jumped_late() ? + struct jump_data *jdata = get_jump_data(); + gpio_flags_t out_flags = (jdata && jdata->magic == JUMP_DATA_MAGIC) ? GPIO_OUTPUT : GPIO_OUTPUT_INACTIVE; for (int i = 0; i < ARRAY_SIZE(gpio_config); i++) { diff --git a/zephyr/subsys/ap_pwrseq/signal_vw.c b/zephyr/subsys/ap_pwrseq/signal_vw.c index b0abe4fe13..a42be8ae85 100644 --- a/zephyr/subsys/ap_pwrseq/signal_vw.c +++ b/zephyr/subsys/ap_pwrseq/signal_vw.c @@ -3,6 +3,7 @@ * found in the LICENSE file. */ +#include <atomic.h> #include <drivers/espi.h> #include <x86_non_dsx_common_pwrseq_sm_handler.h> @@ -34,18 +35,20 @@ const static struct vw_config vw_config[] = { DT_FOREACH_STATUS_OKAY(MY_COMPAT, INIT_ESPI_SIGNAL) }; -static bool signal_data[ARRAY_SIZE(vw_config)]; +/* + * Current signal value. + */ +static atomic_t signal_data; +/* + * Mask of valid signals. If the bus is reset, this is cleared, + * and when a signal is updated the associated bit is set to indicate + * the signal is valid. + */ +static atomic_t signal_valid; #define espi_dev DEVICE_DT_GET(DT_CHOSEN(intel_ap_pwrseq_espi)) -/* - * Mask of updated signals. If the bus is reset, this is cleared, - * and it is only when all the signals have been updated that - * notification is sent that the signals are ready. - */ -static uint8_t espi_mask; -static bool espi_not_valid; -BUILD_ASSERT(ARRAY_SIZE(vw_config) <= 8); +BUILD_ASSERT(ARRAY_SIZE(vw_config) <= (sizeof(atomic_t) * 8)); static void espi_handler(const struct device *dev, struct espi_callback *cb, @@ -61,53 +64,35 @@ static void espi_handler(const struct device *dev, case ESPI_BUS_RESET: /* - * Notify that the bus isn't ready, and clear - * the signal mask. + * Clear the signal valid mask. */ - notify_espi_ready(false); - espi_mask = 0; - espi_not_valid = true; + atomic_clear(&signal_valid); break; case ESPI_BUS_EVENT_VWIRE_RECEIVED: for (int i = 0; i < ARRAY_SIZE(vw_config); i++) { if (event.evt_details == vw_config[i].espi_signal) { - int value = vw_config[i].invert + bool value = vw_config[i].invert ? !event.evt_data : !!event.evt_data; - signal_data[i] = value; - if (espi_not_valid) { - espi_mask |= BIT(i); - } + atomic_set_bit_to(&signal_data, i, value); + atomic_set_bit(&signal_valid, i); power_signal_interrupt(vw_config[i].signal, value); } } - /* - * When all the signals have been updated, notify that - * the ESPI signals are valid. - */ - if (espi_not_valid && - espi_mask == BIT_MASK(ARRAY_SIZE(vw_config))) { - espi_not_valid = false; - LOG_DBG("ESPI signals valid"); - /* - * TODO(b/222946923): Convert to generalised - * callback pattern. - */ - notify_espi_ready(true); - } break; } } int power_signal_vw_get(enum pwr_sig_vw vw) { - if (vw < 0 || vw >= ARRAY_SIZE(vw_config)) { + if (vw < 0 || vw >= ARRAY_SIZE(vw_config) || + !atomic_test_bit(&signal_valid, vw)) { return -EINVAL; } - return signal_data[vw]; + return atomic_test_bit(&signal_data, vw); } void power_signal_vw_init(void) @@ -138,6 +123,24 @@ void power_signal_vw_init(void) ESPI_BUS_RESET | ESPI_BUS_EVENT_VWIRE_RECEIVED); espi_add_callback(espi_dev, &espi_cb); + /* + * Check whether the bus is ready, and if so, + * initialise the current values of the signals. + */ + if (espi_get_channel_status(espi_dev, ESPI_CHANNEL_VWIRE)) { + for (int i = 0; i < ARRAY_SIZE(vw_config); i++) { + uint8_t vw_value; + + if (espi_receive_vwire(espi_dev, + vw_config[i].espi_signal, + &vw_value) == 0) { + atomic_set_bit_to(&signal_data, i, + vw_config[i].invert + ? !vw_value + : !!vw_value); + } + } + } } #endif /* HAS_VW_SIGNALS */ diff --git a/zephyr/subsys/ap_pwrseq/x86_non_dsx_common_pwrseq_sm_handler.c b/zephyr/subsys/ap_pwrseq/x86_non_dsx_common_pwrseq_sm_handler.c index 34c3d5df18..bcc34bd32d 100644 --- a/zephyr/subsys/ap_pwrseq/x86_non_dsx_common_pwrseq_sm_handler.c +++ b/zephyr/subsys/ap_pwrseq/x86_non_dsx_common_pwrseq_sm_handler.c @@ -42,34 +42,26 @@ const char pwrsm_dbg[][25] = { #endif }; -#ifdef PWRSEQ_REQUIRE_ESPI - -void notify_espi_ready(bool ready) -{ - pwrseq_ctx.espi_ready = ready; -} -#endif - /* * Returns true if all signals in mask are valid. + * This is only done for virtual wire signals. */ static inline bool signals_valid(power_signal_mask_t signals) { -#ifdef PWRSEQ_REQUIRE_ESPI - if (!pwrseq_ctx.espi_ready) { #if defined(CONFIG_PLATFORM_EC_ESPI_VW_SLP_S3) - if (signals & POWER_SIGNAL_MASK(PWR_SLP_S3)) - return false; + if ((signals & POWER_SIGNAL_MASK(PWR_SLP_S3)) && + power_signal_get(PWR_SLP_S3) < 0) + return false; #endif #if defined(CONFIG_PLATFORM_EC_ESPI_VW_SLP_S4) - if (signals & POWER_SIGNAL_MASK(PWR_SLP_S3)) - return false; + if ((signals & POWER_SIGNAL_MASK(PWR_SLP_S4)) && + power_signal_get(PWR_SLP_S4) < 0) + return false; #endif #if defined(CONFIG_PLATFORM_EC_ESPI_VW_SLP_S5) - if (signals & POWER_SIGNAL_MASK(PWR_SLP_S3)) - return false; -#endif - } + if ((signals & POWER_SIGNAL_MASK(PWR_SLP_S5)) && + power_signal_get(PWR_SLP_S5) < 0) + return false; #endif return true; } @@ -526,4 +518,8 @@ static int pwrseq_init(const struct device *dev) return 0; } +/* + * The initialisation must occur after system I/O initialisation that + * the signals depend upon, such as GPIO, ADC etc. + */ SYS_INIT(pwrseq_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); |