diff options
Diffstat (limited to 'board')
267 files changed, 3578 insertions, 1479 deletions
diff --git a/board/adlrvpp_mchp1521/board.h b/board/adlrvpp_mchp1521/board.h index bcd46acf25..645bfc0598 100644 --- a/board/adlrvpp_mchp1521/board.h +++ b/board/adlrvpp_mchp1521/board.h @@ -140,6 +140,9 @@ /* Use internal silicon 32KHz oscillator */ #undef CONFIG_CLOCK_SRC_EXTERNAL +/* Free up flash space. */ +#undef CONFIG_CONSOLE_CMDHELP + #ifndef __ASSEMBLER__ enum adlrvp_i2c_channel { diff --git a/board/agah/charger_isl9241.c b/board/agah/charger_isl9241.c index 47e8261f78..d5f3d1a0b4 100644 --- a/board/agah/charger_isl9241.c +++ b/board/agah/charger_isl9241.c @@ -196,13 +196,6 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - static const struct charge_port_info bj_power = { /* 150W (also default) */ .voltage = 19500, diff --git a/board/agah/usbc_config.c b/board/agah/usbc_config.c index a8bad0f121..d078ef59ac 100644 --- a/board/agah/usbc_config.c +++ b/board/agah/usbc_config.c @@ -149,7 +149,7 @@ const static struct usb_mux_chain usbc2_ps8818 = { &(const struct usb_mux){ .usb_port = USBC_PORT_C2, .i2c_port = I2C_PORT_USB_C2_TCPC, - .i2c_addr_flags = PS8818_I2C_ADDR_FLAGS, + .i2c_addr_flags = PS8818_I2C_ADDR0_FLAGS, .driver = &ps8818_usb_retimer_driver, .board_set = &board_ps8818_mux_set, }, diff --git a/board/ambassador/board.c b/board/ambassador/board.c index f2bc7557ec..3eff9215bc 100644 --- a/board/ambassador/board.c +++ b/board/ambassador/board.c @@ -88,8 +88,8 @@ uint16_t tcpc_get_alert_status(void) } /* Called when the charge manager has switched to a new port. */ -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* Blink alert if insufficient power per system_can_boot_ap(). */ int insufficient_power = diff --git a/board/anahera/board.c b/board/anahera/board.c index e087d629a7..cd9eb30870 100644 --- a/board/anahera/board.c +++ b/board/anahera/board.c @@ -64,15 +64,3 @@ enum battery_present battery_hw_present(void) /* The GPIO is low when the battery is physically present */ return gpio_get_level(GPIO_EC_BATT_PRES_ODL) ? BP_NO : BP_YES; } - -__override void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - /* - * Limit the input current to 95% negotiated limit, - * to account for the charger chip margin. - */ - charge_ma = charge_ma * 95 / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/anahera/board.h b/board/anahera/board.h index 18360171e3..82ba5a4e1c 100644 --- a/board/anahera/board.h +++ b/board/anahera/board.h @@ -33,6 +33,8 @@ #define CONFIG_USB_PORT_POWER_DUMB #define CONFIG_USBC_RETIMER_PS8811 +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 + /* USB Type C and USB PD defines */ #define CONFIG_USB_PD_REQUIRE_AP_MODE_ENTRY diff --git a/board/anahera/charger.c b/board/anahera/charger.c index a4fa209246..7fabd2082e 100644 --- a/board/anahera/charger.c +++ b/board/anahera/charger.c @@ -81,10 +81,3 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } - -__overridable void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/atlas/board.c b/board/atlas/board.c index 6fbbb64b16..d2562d43d3 100644 --- a/board/atlas/board.c +++ b/board/atlas/board.c @@ -531,39 +531,15 @@ int board_set_active_charge_port(int charge_port) return EC_SUCCESS; } -/* - * Limit the input current to 95% negotiated limit, - * to account for the charger chip margin. - */ - -static int charger_derate(int current) -{ - return current * 95 / 100; -} - static void board_charger_init(void) { - charger_set_input_current_limit(CHARGER_SOLO, - charger_derate(PD_MAX_CURRENT_MA)); + charger_set_input_current_limit( + CHARGER_SOLO, + PD_MAX_CURRENT_MA * + (100 - CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT) / 100); } DECLARE_HOOK(HOOK_INIT, board_charger_init, HOOK_PRIO_DEFAULT); -/** - * Set the charge limit based upon desired maximum. - * - * @param port Port number. - * @param supplier Charge supplier type. - * @param charge_ma Desired charge limit (mA). - * @param charge_mv Negotiated charge voltage (mV). - */ -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - charge_ma = charger_derate(charge_ma); - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - static void board_chipset_suspend(void) { gpio_set_level(GPIO_KBD_BL_EN, 0); diff --git a/board/atlas/board.h b/board/atlas/board.h index 9718ab7cdd..3dbce640bb 100644 --- a/board/atlas/board.h +++ b/board/atlas/board.h @@ -77,7 +77,9 @@ #define CONFIG_CHARGER #define CONFIG_CHARGER_ISL9238 #define CONFIG_CHARGER_DISCHARGE_ON_AC -#define CONFIG_CHARGER_INPUT_CURRENT 512 +#define CONFIG_CHARGER_DEFAULT_CURRENT_LIMIT 512 +#define CONFIG_CHARGER_MIN_INPUT_CURRENT_LIMIT 512 +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define CONFIG_CHARGER_PROFILE_OVERRIDE #define CONFIG_CHARGER_PSYS #define CONFIG_CHARGER_PSYS_READ diff --git a/board/banshee/charger.c b/board/banshee/charger.c index 88f5b85a41..7a16fcd5cb 100644 --- a/board/banshee/charger.c +++ b/board/banshee/charger.c @@ -79,10 +79,3 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } - -__overridable void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/beadrix/board.c b/board/beadrix/board.c index 5cea32f90c..24c6cb960e 100644 --- a/board/beadrix/board.c +++ b/board/beadrix/board.c @@ -474,19 +474,6 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -/* Vconn control for integrated ITE TCPC */ -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * TODO(b/151955431): Characterize the input current limit in case a - * scaling needs to be applied here - */ - charge_set_input_current_limit(icl, charge_mv); -} - __override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) { if (port < 0 || port > CONFIG_USB_PD_PORT_MAX_COUNT) diff --git a/board/beetley/board.c b/board/beetley/board.c index f6b1f1008c..89a1d6b13f 100644 --- a/board/beetley/board.c +++ b/board/beetley/board.c @@ -384,19 +384,6 @@ uint16_t tcpc_get_alert_status(void) return status; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * b/147463641: The charger IC seems to overdraw ~4%, therefore we - * reduce our target accordingly. - */ - icl = icl * 96 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - __override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) { if (port < 0 || port > board_get_usb_pd_port_count()) diff --git a/board/beetley/board.h b/board/beetley/board.h index a70ee73ebb..b05b8e2eb5 100644 --- a/board/beetley/board.h +++ b/board/beetley/board.h @@ -27,6 +27,11 @@ /* Charger */ #define CONFIG_CHARGE_RAMP_HW #define CONFIG_CHARGER_RAA489000 +/* + * b/147463641: The charger IC seems to overdraw ~4%, therefore we + * reduce our target accordingly. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 #define PD_MAX_VOLTAGE_MV 20000 #define CONFIG_CHARGER_SENSE_RESISTOR_AC 10 #define CONFIG_CHARGER_SENSE_RESISTOR 10 diff --git a/board/bellis/board.c b/board/bellis/board.c index e03ae1c36c..3acdb66e4f 100644 --- a/board/bellis/board.c +++ b/board/bellis/board.c @@ -236,14 +236,6 @@ int board_set_active_charge_port(int charge_port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - charge_ma = (charge_ma * 95) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - int board_discharge_on_ac(int enable) { int ret, port; diff --git a/board/bellis/board.h b/board/bellis/board.h index d502c4c5ef..0741de5dc7 100644 --- a/board/bellis/board.h +++ b/board/bellis/board.h @@ -40,6 +40,7 @@ #define CONFIG_BATTERY_HW_PRESENT_CUSTOM #define CONFIG_CHARGER_PSYS +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define CONFIG_CHARGER_RUNTIME_CONFIG diff --git a/board/blipper/board.c b/board/blipper/board.c index 766f55579c..ce1bc27700 100644 --- a/board/blipper/board.c +++ b/board/blipper/board.c @@ -536,19 +536,6 @@ uint16_t tcpc_get_alert_status(void) return status; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * b/147463641: The charger IC seems to overdraw ~4%, therefore we - * reduce our target accordingly. - */ - icl = icl * 96 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - __override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) { if (port < 0 || port > board_get_usb_pd_port_count()) diff --git a/board/blipper/board.h b/board/blipper/board.h index 379a92a007..896ebec76a 100644 --- a/board/blipper/board.h +++ b/board/blipper/board.h @@ -29,6 +29,11 @@ #define CONFIG_CHARGER_SENSE_RESISTOR 10 #undef CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE #define CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE (100 * MSEC) +/* + * b/147463641: The charger IC seems to overdraw ~4%, therefore we + * reduce our target accordingly. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 /* DAC for PSYS */ #define CONFIG_DAC diff --git a/board/boten/board.c b/board/boten/board.c index c47b9e46f0..fc70b11ada 100644 --- a/board/boten/board.c +++ b/board/boten/board.c @@ -244,19 +244,6 @@ uint16_t tcpc_get_alert_status(void) return status; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * b/147463641: The charger IC seems to overdraw ~4%, therefore we - * reduce our target accordingly. - */ - icl = icl * 96 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - __override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) { if (port < 0 || port > board_get_usb_pd_port_count()) diff --git a/board/boten/board.h b/board/boten/board.h index ec5d25ff9f..2e607f73c1 100644 --- a/board/boten/board.h +++ b/board/boten/board.h @@ -32,6 +32,11 @@ */ #undef CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE #define CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE (100 * MSEC) +/* + * b/147463641: The charger IC seems to overdraw ~4%, therefore we + * reduce our target accordingly. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 /* DAC for PSYS */ #define CONFIG_DAC diff --git a/board/brask/led.c b/board/brask/led.c index 0a57994ca0..b86a291625 100644 --- a/board/brask/led.c +++ b/board/brask/led.c @@ -249,8 +249,8 @@ int led_set_brightness(enum ec_led_id id, const uint8_t *brightness) else return set_color(id, LED_OFF, 0); } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* Blink alert if insufficient power per system_can_boot_ap(). */ int insufficient_power = diff --git a/board/brya/charger.c b/board/brya/charger.c index a4fa209246..7fabd2082e 100644 --- a/board/brya/charger.c +++ b/board/brya/charger.c @@ -81,10 +81,3 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } - -__overridable void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/bugzzy/board.c b/board/bugzzy/board.c index 5a28fb2c25..443f5f6d2f 100644 --- a/board/bugzzy/board.c +++ b/board/bugzzy/board.c @@ -393,19 +393,6 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * b/147463641: The charger IC seems to overdraw ~4%, therefore we - * reduce our target accordingly. - */ - icl = icl * 96 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - __override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) { if (port < 0 || port > board_get_usb_pd_port_count()) diff --git a/board/bugzzy/board.h b/board/bugzzy/board.h index 707314d02a..45bdfdc9f3 100644 --- a/board/bugzzy/board.h +++ b/board/bugzzy/board.h @@ -43,6 +43,11 @@ #undef CONFIG_CHARGER_SINGLE_CHIP #undef CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE #define CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE (100 * MSEC) +/* + * b/147463641: The charger IC seems to overdraw ~4%, therefore we + * reduce our target accordingly. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 #define CONFIG_BATTERY_CHECK_CHARGE_TEMP_LIMITS #define CONFIG_CHARGER_PROFILE_OVERRIDE @@ -183,6 +188,14 @@ #define CONFIG_TABLET_MODE #define CONFIG_TABLET_MODE_SWITCH +/* On-body detection */ +#define CONFIG_BODY_DETECTION +#define CONFIG_BODY_DETECTION_SENSOR BASE_ACCEL +#define CONFIG_BODY_DETECTION_VAR_NOISE_FACTOR 150 /* % */ +#define CONFIG_GESTURE_DETECTION +#define CONFIG_GESTURE_DETECTION_MASK BIT(CONFIG_BODY_DETECTION_SENSOR) +#define CONFIG_GESTURE_HOST_DETECTION + /* LIS2DS Lid accel */ #define CONFIG_ACCEL_LIS2DS diff --git a/board/burnet/board.c b/board/burnet/board.c index aa378ca289..a89250ae34 100644 --- a/board/burnet/board.c +++ b/board/burnet/board.c @@ -222,14 +222,6 @@ int board_set_active_charge_port(int charge_port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - charge_ma = (charge_ma * 95) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - int board_discharge_on_ac(int enable) { int ret, port; diff --git a/board/burnet/board.h b/board/burnet/board.h index 6870ccc2d2..5199ae4aaf 100644 --- a/board/burnet/board.h +++ b/board/burnet/board.h @@ -8,6 +8,9 @@ #ifndef __CROS_EC_BOARD_H #define __CROS_EC_BOARD_H +/* Free up flash space. */ +#undef CONFIG_CMD_KEYBOARD + #define VARIANT_KUKUI_JACUZZI #define VARIANT_KUKUI_BATTERY_SMART #define VARIANT_KUKUI_CHARGER_ISL9238 @@ -28,6 +31,7 @@ #define CONFIG_BATTERY_COUNT 1 #define CONFIG_CHARGER_PSYS +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define CONFIG_BC12_DETECT_PI3USB9201 diff --git a/board/c2d2/board.h b/board/c2d2/board.h index 6b1ac69efd..c1b450f482 100644 --- a/board/c2d2/board.h +++ b/board/c2d2/board.h @@ -34,7 +34,6 @@ #undef CONFIG_UART_RX_DMA /* Optional features */ -#define CONFIG_STM_HWTIMER32 #define CONFIG_HW_CRC /* USB Configuration */ diff --git a/board/cappy2/board.c b/board/cappy2/board.c index de651ac874..7956ae77f5 100644 --- a/board/cappy2/board.c +++ b/board/cappy2/board.c @@ -229,19 +229,6 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * b/147463641: The charger IC seems to overdraw ~4%, therefore we - * reduce our target accordingly. - */ - icl = icl * 96 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - __override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) { if (port < 0 || port > board_get_usb_pd_port_count()) diff --git a/board/cappy2/board.h b/board/cappy2/board.h index b21a20d6e5..8f503b1bcc 100644 --- a/board/cappy2/board.h +++ b/board/cappy2/board.h @@ -39,6 +39,11 @@ #define CONFIG_CHARGER_PROFILE_OVERRIDE #undef CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE #define CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE (100 * MSEC) +/* + * b/147463641: The charger IC seems to overdraw ~4%, therefore we + * reduce our target accordingly. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 /* Keyboard */ #undef CONFIG_PWM_KBLIGHT diff --git a/board/casta/board.c b/board/casta/board.c index 512a7c224b..2ae65c7d86 100644 --- a/board/casta/board.c +++ b/board/casta/board.c @@ -172,7 +172,8 @@ static void set_input_limit_on_ac_removal(void) if (get_cbi_ssfc_charger() != SSFC_CHARGER_BQ25710) return; - charger_set_input_current_limit(0, CONFIG_CHARGER_INPUT_CURRENT); + charger_set_input_current_limit(0, + CONFIG_CHARGER_DEFAULT_CURRENT_LIMIT); } DECLARE_HOOK(HOOK_AC_CHANGE, set_input_limit_on_ac_removal, HOOK_PRIO_DEFAULT); diff --git a/board/cerise/board.c b/board/cerise/board.c index e3fa60c76a..9b214f2dae 100644 --- a/board/cerise/board.c +++ b/board/cerise/board.c @@ -236,14 +236,6 @@ int board_set_active_charge_port(int charge_port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - charge_ma = (charge_ma * 95) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - int board_discharge_on_ac(int enable) { int ret, port; diff --git a/board/cerise/board.h b/board/cerise/board.h index 41d86b956d..d2c58e9f6e 100644 --- a/board/cerise/board.h +++ b/board/cerise/board.h @@ -28,6 +28,7 @@ #define CONFIG_BATTERY_HW_PRESENT_CUSTOM #define CONFIG_CHARGER_PSYS +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define CONFIG_CHARGER_RUNTIME_CONFIG diff --git a/board/cherry/board.c b/board/cherry/board.c index c2ad54acb2..f8700404ed 100644 --- a/board/cherry/board.c +++ b/board/cherry/board.c @@ -262,13 +262,6 @@ const struct usb_mux_chain usb_muxes[CONFIG_USB_PD_PORT_MAX_COUNT] = { }, }; -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - /* Initialize board. */ static void board_init(void) { diff --git a/board/chocodile_vpdmcu/board.h b/board/chocodile_vpdmcu/board.h index ede07dd9a0..0e0ff70ab8 100644 --- a/board/chocodile_vpdmcu/board.h +++ b/board/chocodile_vpdmcu/board.h @@ -55,7 +55,6 @@ #undef CONFIG_LID_SWITCH #define CONFIG_LOW_POWER_IDLE #define CONFIG_LTO -#define CONFIG_STM_HWTIMER32 #undef CONFIG_TASK_PROFILING #undef CONFIG_UART_TX_BUF_SIZE #undef CONFIG_UART_TX_DMA @@ -72,6 +71,7 @@ #define CONFIG_USB_PD_DECODE_SOP #define CONFIG_USB_PD_DUAL_ROLE #define CONFIG_USB_PD_INTERNAL_COMP +#undef CONFIG_USB_DPM_SM #define CONFIG_VBOOT_HASH #define CONFIG_WATCHDOG #undef CONFIG_WATCHDOG_HELP diff --git a/board/coachz/board.c b/board/coachz/board.c index 1e1ed2ab71..4863cd94c9 100644 --- a/board/coachz/board.c +++ b/board/coachz/board.c @@ -513,6 +513,7 @@ void board_tcpc_init(void) /* Enable PPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_SWCTL_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C1_SWCTL_INT_ODL); /* Enable TCPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_PD_INT_ODL); @@ -683,8 +684,8 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* * Ignore lower charge ceiling on PD transition if our battery is @@ -696,9 +697,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, charge_ma = max_ma; } - charge_ma = charge_ma * 95 / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } uint16_t tcpc_get_alert_status(void) diff --git a/board/coachz/board.h b/board/coachz/board.h index c332b98c34..70594d3efa 100644 --- a/board/coachz/board.h +++ b/board/coachz/board.h @@ -40,6 +40,8 @@ #define CONFIG_BATTERY_FUEL_GAUGE #define CONFIG_BATTERY_VENDOR_PARAM +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 + /* BC 1.2 Charger */ #define CONFIG_BC12_DETECT_PI3USB9201 diff --git a/board/coffeecake/board.h b/board/coffeecake/board.h index 966a5b2516..9c7a2643d0 100644 --- a/board/coffeecake/board.h +++ b/board/coffeecake/board.h @@ -18,7 +18,6 @@ #define CONFIG_UART_CONSOLE 1 /* Optional features */ -#define CONFIG_STM_HWTIMER32 #define CONFIG_ADC #define CONFIG_BOARD_PRE_INIT #define CONFIG_CMD_CHARGER diff --git a/board/coral/board.c b/board/coral/board.c index c63a2f6ddc..a2a99ed42b 100644 --- a/board/coral/board.c +++ b/board/coral/board.c @@ -554,8 +554,8 @@ int board_set_active_charge_port(int charge_port) * @param charge_ma Desired charge limit (mA). * @param charge_mv Negotiated charge voltage (mV). */ -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* Enable charging trigger by BC1.2 detection */ int bc12_enable = (supplier == CHARGE_SUPPLIER_BC12_CDP || @@ -566,9 +566,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, if (bd9995x_bc12_enable_charging(port, bc12_enable)) return; - charge_ma = (charge_ma * 95) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } /** diff --git a/board/coral/board.h b/board/coral/board.h index bc6226152c..cea83ef4a5 100644 --- a/board/coral/board.h +++ b/board/coral/board.h @@ -25,6 +25,7 @@ #define CONFIG_CMD_CHARGER_ADC_AMON_BMON #define CONFIG_CHARGER_SENSE_RESISTOR 10 #define CONFIG_CHARGER_SENSE_RESISTOR_AC 10 +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define BD9995X_IOUT_GAIN_SELECT \ BD9995X_CMD_PMON_IOUT_CTRL_SET_IOUT_GAIN_SET_20V @@ -59,7 +60,8 @@ #define CONFIG_CHARGER_BD9995X #define CONFIG_CHARGER_BD9995X_CHGEN #define CONFIG_CHARGER_DISCHARGE_ON_AC -#define CONFIG_CHARGER_INPUT_CURRENT 512 +#define CONFIG_CHARGER_DEFAULT_CURRENT_LIMIT 512 +#define CONFIG_CHARGER_MIN_INPUT_CURRENT_LIMIT 512 #define CONFIG_CHARGER_MAINTAIN_VBAT #undef CONFIG_CHARGER_MIN_BAT_PCT_FOR_POWER_ON #define CONFIG_CHARGER_MIN_BAT_PCT_FOR_POWER_ON 1 diff --git a/board/corori/board.c b/board/corori/board.c index 4fe1e01fec..52ef76a19c 100644 --- a/board/corori/board.c +++ b/board/corori/board.c @@ -311,19 +311,6 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * b/147463641: The charger IC seems to overdraw ~4%, therefore we - * reduce our target accordingly. - */ - icl = icl * 96 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - __override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) { if (port < 0 || port > board_get_usb_pd_port_count()) diff --git a/board/corori/board.h b/board/corori/board.h index 75e0e4eec6..646b14227d 100644 --- a/board/corori/board.h +++ b/board/corori/board.h @@ -28,6 +28,11 @@ #undef CONFIG_CMD_CHARGER_DUMP #undef CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE #define CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE (100 * MSEC) +/* + * b/147463641: The charger IC seems to overdraw ~4%, therefore we + * reduce our target accordingly. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 /* LED defines */ #define CONFIG_LED_COMMON diff --git a/board/corori2/board.c b/board/corori2/board.c index efebc3af2e..e3103f65ff 100644 --- a/board/corori2/board.c +++ b/board/corori2/board.c @@ -454,19 +454,6 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * b/147463641: The charger IC seems to overdraw ~4%, therefore we - * reduce our target accordingly. - */ - icl = icl * 96 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - __override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) { if (port < 0 || port > board_get_usb_pd_port_count()) diff --git a/board/corori2/board.h b/board/corori2/board.h index 3483d96f88..c62cade1c3 100644 --- a/board/corori2/board.h +++ b/board/corori2/board.h @@ -20,6 +20,7 @@ /* Save some flash space */ #define CONFIG_CHIP_INIT_ROM_REGION #undef CONFIG_CONSOLE_CMDHELP +#undef CONFIG_CONSOLE_HISTORY #define CONFIG_DEBUG_ASSERT_BRIEF #define CONFIG_USB_PD_DEBUG_LEVEL 0 @@ -30,6 +31,8 @@ #undef CONFIG_CMD_ACCELSPOOF #undef CONFIG_CMD_BATTFAKE #undef CONFIG_CMD_GETTIME +#undef CONFIG_CMD_I2C_SCAN +#undef CONFIG_CMD_I2C_XFER #undef CONFIG_CMD_MEM /* Battery */ @@ -47,6 +50,11 @@ #undef CONFIG_CHARGER_SINGLE_CHIP #undef CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE #define CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE (100 * MSEC) +/* + * b/147463641: The charger IC seems to overdraw ~4%, therefore we + * reduce our target accordingly. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 /* * GPIO for C1 interrupts, for baseboard use diff --git a/board/cret/board.c b/board/cret/board.c index c9c34d6d32..3c56757ef7 100644 --- a/board/cret/board.c +++ b/board/cret/board.c @@ -304,19 +304,6 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * b/147463641: The charger IC seems to overdraw ~4%, therefore we - * reduce our target accordingly. - */ - icl = icl * 96 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - __override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) { if (port < 0 || port > board_get_usb_pd_port_count()) diff --git a/board/cret/board.h b/board/cret/board.h index 2080185c7c..eb6b261cdf 100644 --- a/board/cret/board.h +++ b/board/cret/board.h @@ -34,6 +34,11 @@ #define CONFIG_CHARGER_SENSE_RESISTOR 10 #undef CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE #define CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE (100 * MSEC) +/* + * b/147463641: The charger IC seems to overdraw ~4%, therefore we + * reduce our target accordingly. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 #define CONFIG_CHARGER_PROFILE_OVERRIDE #define CHARGING_CURRENT_1100MA 1100 diff --git a/board/crota/board.c b/board/crota/board.c index cb3e79ee56..a12ef75d30 100644 --- a/board/crota/board.c +++ b/board/crota/board.c @@ -51,7 +51,7 @@ static void board_chipset_suspend(void) } DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, board_chipset_suspend, HOOK_PRIO_DEFAULT); -static bool board_is_convertible(void) +bool board_is_convertible(void) { /* * convertible = 0 diff --git a/board/crota/board.h b/board/crota/board.h index 3d79e190bd..d652a93ad0 100644 --- a/board/crota/board.h +++ b/board/crota/board.h @@ -288,6 +288,8 @@ enum thermal_cfg_table { LAPTOP_MODE, TABLET_MODE, THERMAL_CFG_TABLE_COUNT }; void motion_interrupt(enum gpio_signal signal); +bool board_is_convertible(void); + #endif /* !__ASSEMBLER__ */ #endif /* __CROS_EC_BOARD_H */ diff --git a/board/crota/charger.c b/board/crota/charger.c index c7dcf7b0c1..9f044790e0 100644 --- a/board/crota/charger.c +++ b/board/crota/charger.c @@ -79,10 +79,3 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } - -__overridable void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/crota/sensors.c b/board/crota/sensors.c index 79d2492060..7d60234dc3 100644 --- a/board/crota/sensors.c +++ b/board/crota/sensors.c @@ -10,9 +10,11 @@ #include "driver/accel_lis2dw12.h" #include "driver/accelgyro_bmi_common.h" #include "driver/accelgyro_lsm6dso.h" +#include "fw_config.h" #include "gpio.h" #include "hooks.h" #include "motion_sense.h" +#include "tablet_mode.h" #include "temp_sensor.h" #include "thermal.h" #include "temp_sensor/thermistor.h" @@ -209,10 +211,29 @@ static void board_update_motion_sensor_config(void) } else { ccprints("BASE IMU is LSM6DSO"); } + + if (!board_is_convertible()) { + tablet_set_mode(0, TABLET_TRIGGER_LID); + gmr_tablet_switch_disable(); + /* Make sure tablet mode detection is not trigger by mistake. */ + gpio_set_flags(GPIO_TABLET_MODE_L, GPIO_INPUT | GPIO_PULL_UP); + /* + * Make sure we don't even try to initialize the lid accel, it + * is not present. + */ + motion_sensors[LID_ACCEL].active_mask = 0; + gpio_set_flags(GPIO_EC_ACCEL_INT_R_L, + GPIO_INPUT | GPIO_PULL_UP); + } } DECLARE_HOOK(HOOK_CHIPSET_STARTUP, board_update_motion_sensor_config, HOOK_PRIO_INIT_I2C + 1); +__override int sensor_board_is_lid_angle_available(void) +{ + return board_is_convertible(); +} + static void baseboard_sensors_init(void) { /* Enable gpio interrupt for lid accel sensor */ diff --git a/board/damu/board.c b/board/damu/board.c index ddc8885e22..717276e768 100644 --- a/board/damu/board.c +++ b/board/damu/board.c @@ -236,14 +236,6 @@ int board_set_active_charge_port(int charge_port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - charge_ma = (charge_ma * 95) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - int board_discharge_on_ac(int enable) { int ret, port; diff --git a/board/damu/board.h b/board/damu/board.h index 49875e6883..16e03cf45c 100644 --- a/board/damu/board.h +++ b/board/damu/board.h @@ -28,6 +28,7 @@ #define CONFIG_BATTERY_HW_PRESENT_CUSTOM #define CONFIG_CHARGER_PSYS +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define CONFIG_CHARGER_RUNTIME_CONFIG diff --git a/board/dibbi/board.c b/board/dibbi/board.c new file mode 100644 index 0000000000..9b3207859a --- /dev/null +++ b/board/dibbi/board.c @@ -0,0 +1,374 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/* Dibbi board-specific configuration */ + +#include "adc_chip.h" +#include "button.h" +#include "charge_manager.h" +#include "charge_state_v2.h" +#include "charger.h" +#include "driver/temp_sensor/thermistor.h" +#include "driver/tcpm/it83xx_pd.h" +#include "driver/usb_mux/it5205.h" +#include "gpio.h" +#include "hooks.h" +#include "intc.h" +#include "power.h" +#include "power_button.h" +#include "pwm.h" +#include "pwm_chip.h" +#include "switch.h" +#include "system.h" +#include "tablet_mode.h" +#include "task.h" +#include "tcpm/tcpci.h" +#include "temp_sensor.h" +#include "uart.h" +#include "usb_charge.h" +#include "usb_mux.h" +#include "usb_pd.h" +#include "usb_pd_tcpm.h" + +#define CPRINTUSB(format, args...) cprints(CC_USBCHARGE, format, ##args) + +/* ADC channels */ +const struct adc_t adc_channels[] = { + [ADC_VSNS_PP3300_A] = { .name = "PP3300_A_PGOOD", + .factor_mul = ADC_MAX_MVOLT, + .factor_div = ADC_READ_MAX + 1, + .shift = 0, + .channel = CHIP_ADC_CH0 }, + [ADC_TEMP_SENSOR_1] = { .name = "TEMP_SENSOR1", + .factor_mul = ADC_MAX_MVOLT, + .factor_div = ADC_READ_MAX + 1, + .shift = 0, + .channel = CHIP_ADC_CH2 }, + [ADC_TEMP_SENSOR_2] = { .name = "TEMP_SENSOR2", + .factor_mul = ADC_MAX_MVOLT, + .factor_div = ADC_READ_MAX + 1, + .shift = 0, + .channel = CHIP_ADC_CH3 }, + [ADC_PPVAR_PWR_IN_IMON] = { .name = "ADC_PPVAR_PWR_IN_IMON", + .factor_mul = ADC_MAX_MVOLT, + .factor_div = ADC_READ_MAX + 1, + .shift = 0, + .channel = CHIP_ADC_CH15 }, + [ADC_SNS_PPVAR_PWR_IN] = { .name = "ADC_SNS_PPVAR_PWR_IN", + .factor_mul = ADC_MAX_MVOLT, + .factor_div = ADC_READ_MAX + 1, + .shift = 0, + .channel = CHIP_ADC_CH16 }, +}; +BUILD_ASSERT(ARRAY_SIZE(adc_channels) == ADC_CH_COUNT); + +/* TCPCs */ +const struct tcpc_config_t tcpc_config[CONFIG_USB_PD_PORT_MAX_COUNT] = { + { + .bus_type = EC_BUS_TYPE_EMBEDDED, + .drv = &it83xx_tcpm_drv, + }, +}; + +/* USB Muxes */ +const struct usb_mux_chain usb_muxes[CONFIG_USB_PD_PORT_MAX_COUNT] = { + { + .mux = + &(const struct usb_mux){ + .usb_port = 0, + .i2c_port = I2C_PORT_USB_C0, + .i2c_addr_flags = IT5205_I2C_ADDR1_FLAGS, + .driver = &it5205_usb_mux_driver, + }, + }, +}; + +/* USB-A ports */ +const int usb_port_enable[USB_PORT_COUNT] = { + GPIO_EN_USB_A0_VBUS, + GPIO_EN_USB_A1_VBUS, + GPIO_EN_USB_A2_VBUS, +}; + +/* PWM channels. Must be in the exactly same order as in enum pwm_channel. */ +const struct pwm_t pwm_channels[] = { + [PWM_CH_LED_RED] = { + .channel = 1, + .flags = PWM_CONFIG_DSLEEP | PWM_CONFIG_ACTIVE_LOW, + .freq_hz = 2400, + }, + + [PWM_CH_LED_GREEN] = { + .channel = 2, + .flags = PWM_CONFIG_DSLEEP | PWM_CONFIG_ACTIVE_LOW, + .freq_hz = 2400, + }, + + [PWM_CH_LED_BLUE] = { + .channel = 3, + .flags = PWM_CONFIG_DSLEEP | PWM_CONFIG_ACTIVE_LOW, + .freq_hz = 2400, + } + +}; +BUILD_ASSERT(ARRAY_SIZE(pwm_channels) == PWM_CH_COUNT); + +/* Thermistors */ +const struct temp_sensor_t temp_sensors[] = { + [TEMP_SENSOR_1] = { .name = "Memory", + .type = TEMP_SENSOR_TYPE_BOARD, + .read = get_temp_3v3_51k1_47k_4050b, + .idx = ADC_TEMP_SENSOR_1 }, + [TEMP_SENSOR_2] = { .name = "Ambient", + .type = TEMP_SENSOR_TYPE_BOARD, + .read = get_temp_3v3_51k1_47k_4050b, + .idx = ADC_TEMP_SENSOR_2 }, +}; +BUILD_ASSERT(ARRAY_SIZE(temp_sensors) == TEMP_SENSOR_COUNT); + +static void c0_ccsbu_ovp_interrupt(enum gpio_signal s) +{ + cprints(CC_USBPD, "C0: CC OVP, SBU OVP, or thermal event"); + pd_handle_cc_overvoltage(0); +} + +void board_init(void) +{ + int on; + + gpio_enable_interrupt(GPIO_USB_C0_CCSBU_OVP_ODL); + gpio_enable_interrupt(GPIO_BJ_ADP_PRESENT_L); + gpio_enable_interrupt(GPIO_USBC_ADP_PRESENT_L); + + /* Turn on 5V if the system is on, otherwise turn it off */ + on = chipset_in_state(CHIPSET_STATE_ON | CHIPSET_STATE_ANY_SUSPEND | + CHIPSET_STATE_SOFT_OFF); + board_power_5v_enable(on); +} +DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT); + +void board_reset_pd_mcu(void) +{ + /* + * Nothing to do. TCPC C0 is internal. + */ +} + +__override void board_power_5v_enable(int enable) +{ + /* + * Mainboard 5V regulator activated by GPIO. + * USB-A ports are activated by usb_port_power_dumb. + */ + gpio_set_level(GPIO_EN_PP5000, !!enable); +} + +void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, + int charge_mv) +{ + int insufficient_power = + (charge_ma * charge_mv) < + (CONFIG_CHARGER_MIN_POWER_MW_FOR_POWER_ON * 1000); + /* TODO(b/259467280) blink LED on error */ + (void)insufficient_power; +} + +int board_vbus_source_enabled(int port) +{ + if (port != CHARGE_PORT_TYPEC0) + return 0; + return gpio_get_level(GPIO_EN_USB_C0_VBUS); +} + +/* Vconn control for integrated ITE TCPC */ +void board_pd_vconn_ctrl(int port, enum usbpd_cc_pin cc_pin, int enabled) +{ + /* Vconn control is only for port 0 */ + if (port) + return; + + if (cc_pin == USBPD_CC_PIN_1) + gpio_set_level(GPIO_EN_USB_C0_CC1_VCONN, !!enabled); + else + gpio_set_level(GPIO_EN_USB_C0_CC2_VCONN, !!enabled); +} + +__override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) +{ + int ilim3A; + + if (port < 0 || port > CONFIG_USB_PD_PORT_MAX_COUNT) + return; + + /* Switch between 1.5A and 3A ILIM values */ + ilim3A = (rp == TYPEC_RP_3A0); + gpio_set_level(GPIO_USB_C0_VBUS_ILIM, ilim3A); +} + +/******************************************************************************/ +/* + * Since dibbi has no battery, it must source all of its power from either + * USB-C or the barrel jack (preferred). Fizz operates in continuous safe + * mode (charge_manager_leave_safe_mode() will never be called), which + * modifies port selection as follows: + * + * - Dual-role / dedicated capability of the port partner is ignored. + * - Charge ceiling on PD voltage transition is ignored. + * - CHARGE_PORT_NONE will never be selected. + */ + +/* List of BJ adapters */ +enum bj_adapter { + BJ_NONE, + BJ_65W_19V, +}; + +/* Barrel-jack power adapter ratings. */ +static const struct charge_port_info bj_adapters[] = { + [BJ_NONE] = { .current = 0, .voltage = 0 }, + [BJ_65W_19V] = { .current = 3420, .voltage = 19000 }, +}; +#define BJ_ADP_RATING_DEFAULT BJ_65W_19V /* BJ power ratings default */ +#define ADP_DEBOUNCE_MS 1000 /* Debounce time for BJ plug/unplug */ + +/* Debounced connection state of the barrel jack */ +static int8_t bj_adp_connected = -1; +static void adp_connect_deferred(void) +{ + const struct charge_port_info *pi; + int connected = !gpio_get_level(GPIO_BJ_ADP_PRESENT_L); + + /* Debounce */ + if (connected == bj_adp_connected) + return; + + if (connected) { + pi = &bj_adapters[BJ_ADP_RATING_DEFAULT]; + } else { + /* No barrel-jack, zero out this power supply */ + pi = &bj_adapters[BJ_NONE]; + } + /* This will result in a call to board_set_active_charge_port */ + charge_manager_update_charge(CHARGE_SUPPLIER_DEDICATED, + DEDICATED_CHARGE_PORT, pi); + bj_adp_connected = connected; +} +DECLARE_DEFERRED(adp_connect_deferred); + +/* IRQ for BJ plug/unplug. It shouldn't be called if BJ is the power source. */ +void adp_connect_interrupt(enum gpio_signal signal) +{ + hook_call_deferred(&adp_connect_deferred_data, ADP_DEBOUNCE_MS * MSEC); +} + +/* IRQ for USB-C plug/unplug. */ +void usbc_connect_interrupt(enum gpio_signal signal) +{ + task_wake(TASK_ID_PD_C0); +} + +int board_set_active_charge_port(int port) +{ + const int active_port = charge_manager_get_active_charge_port(); + + CPRINTUSB("Requested charge port change to %d", port); + + if (port < 0 || CHARGE_PORT_COUNT <= port) + return EC_ERROR_INVAL; + + if (port == active_port) + return EC_SUCCESS; + + /* Don't sink from a source port */ + if (board_vbus_source_enabled(port)) + return EC_ERROR_INVAL; + + if (!chipset_in_state(CHIPSET_STATE_ANY_OFF)) { + int bj_requested; + + if (charge_manager_get_active_charge_port() != CHARGE_PORT_NONE) + /* Change is only permitted while the system is off */ + return EC_ERROR_INVAL; + + /* + * Current setting is no charge port but the AP is on, so the + * charge manager is out of sync (probably because we're + * reinitializing after sysjump). Reject requests that aren't + * in sync with our outputs. + */ + bj_requested = port == CHARGE_PORT_BARRELJACK; + if (bj_adp_connected != bj_requested) + return EC_ERROR_INVAL; + } + + CPRINTUSB("New charger p%d", port); + + switch (port) { + case CHARGE_PORT_TYPEC0: + gpio_set_level(GPIO_EN_PPVAR_USBC_ADP_L, 0); + gpio_set_level(GPIO_EN_PPVAR_BJ_ADP_L, 1); + gpio_enable_interrupt(GPIO_BJ_ADP_PRESENT_L); + break; + case CHARGE_PORT_BARRELJACK: + /* Make sure BJ adapter is sourcing power */ + if (gpio_get_level(GPIO_BJ_ADP_PRESENT_L)) + return EC_ERROR_INVAL; + gpio_set_level(GPIO_EN_PPVAR_BJ_ADP_L, 0); + gpio_set_level(GPIO_EN_PPVAR_USBC_ADP_L, 1); + gpio_disable_interrupt(GPIO_BJ_ADP_PRESENT_L); + break; + default: + return EC_ERROR_INVAL; + } + + return EC_SUCCESS; +} + +static void board_charge_manager_init(void) +{ + enum charge_port port; + + /* + * Initialize all charge suppliers to 0. The charge manager waits until + * all ports have reported in before doing anything. + */ + for (int i = 0; i < CHARGE_PORT_COUNT; i++) { + for (int j = 0; j < CHARGE_SUPPLIER_COUNT; j++) + charge_manager_update_charge(j, i, NULL); + } + + port = gpio_get_level(GPIO_BJ_ADP_PRESENT_L) ? CHARGE_PORT_TYPEC0 : + CHARGE_PORT_BARRELJACK; + CPRINTUSB("Power source is p%d (%s)", port, + port == CHARGE_PORT_TYPEC0 ? "USB-C" : "BJ"); + + /* Initialize the power source supplier */ + switch (port) { + case CHARGE_PORT_TYPEC0: + typec_set_input_current_limit(port, 3000, 5000); + break; + case CHARGE_PORT_BARRELJACK: + charge_manager_update_charge( + CHARGE_SUPPLIER_DEDICATED, DEDICATED_CHARGE_PORT, + &bj_adapters[BJ_ADP_RATING_DEFAULT]); + break; + } + + /* Report charge state from the barrel jack. */ + adp_connect_deferred(); +} +DECLARE_HOOK(HOOK_INIT, board_charge_manager_init, + HOOK_PRIO_INIT_CHARGE_MANAGER + 1); + +__override int extpower_is_present(void) +{ + /* + * There's no battery, so running this method implies we have power. + */ + return 1; +} + +/* Must come after other header files and interrupt handler declarations */ +#include "gpio_list.h" diff --git a/board/dibbi/board.h b/board/dibbi/board.h new file mode 100644 index 0000000000..c59a540b5d --- /dev/null +++ b/board/dibbi/board.h @@ -0,0 +1,145 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/* Dibbi board configuration */ + +#ifndef __CROS_EC_BOARD_H +#define __CROS_EC_BOARD_H + +/* Select Baseboard features */ +#define VARIANT_DEDEDE_EC_IT8320 +#include "baseboard.h" + +/* System unlocked in early development */ +#define CONFIG_SYSTEM_UNLOCKED + +#define CONFIG_CMD_CHARGER_DUMP + +/* Power */ +#undef CONFIG_CHARGER +#undef CONFIG_CHARGER_DISCHARGE_ON_AC +#undef CONFIG_USB_PD_VBUS_MEASURE_CHARGER +#define CONFIG_CHARGER_MIN_POWER_MW_FOR_POWER_ON 16000 +#define PD_MAX_VOLTAGE_MV 15000 +#define CONFIG_USB_PD_VBUS_DETECT_GPIO +/* ADC sensors could measure VBUS on this board, but components are DNS */ +#define CONFIG_USB_PD_VBUS_MEASURE_NOT_PRESENT + +/* Override macro for C0 only */ +#define PORT_TO_HPD(port) (GPIO_USB_C0_DP_HPD) + +/* Power: Dedicated barreljack charger port */ +#undef CONFIG_DEDICATED_CHARGE_PORT_COUNT +#define CONFIG_DEDICATED_CHARGE_PORT_COUNT 1 +#define DEDICATED_CHARGE_PORT 1 + +/* USB Type-C */ +#undef CONFIG_USB_CHARGER +#undef CONFIG_USB_MUX_PI3USB31532 + +/* TCPC */ +#define CONFIG_USB_PD_PORT_MAX_COUNT 1 +#define CONFIG_USB_PD_TCPM_ITE_ON_CHIP /* C0: ITE EC TCPC */ +#define CONFIG_USB_PD_ITE_ACTIVE_PORT_COUNT 1 + +/* USB Mux and Retimer */ +#define CONFIG_USB_MUX_IT5205 /* C0: ITE Mux */ +#define I2C_PORT_USB_MUX I2C_PORT_USB_C0 /* Required for ITE Mux */ + +/* USB Type A Features */ +#define CONFIG_USB_PORT_POWER_DUMB +#define USB_PORT_COUNT 3 /* Type A ports */ + +/* No battery */ +#undef CONFIG_BATTERY_CUT_OFF +#undef CONFIG_BATTERY_PRESENT_GPIO +#undef CONFIG_BATTERY_REQUESTS_NIL_WHEN_DEAD +#undef CONFIG_BATTERY_REVIVE_DISCONNECT +#undef CONFIG_BATTERY_SMART + +/* LED */ +/* TODO(b/259467280) Determine what LED/PWM impl is needed*/ +/* #define CONFIG_LED_PWM */ +/* #define CONFIG_LED_PWM_COUNT 1 */ + +/* PWM */ +#define CONFIG_PWM + +/* Thermistors */ +#define CONFIG_TEMP_SENSOR +#define CONFIG_THERMISTOR +#define CONFIG_STEINHART_HART_3V3_51K1_47K_4050B + +/* Buttons */ +#define CONFIG_DEDICATED_RECOVERY_BUTTON +#define CONFIG_DEDICATED_RECOVERY_BUTTON_2 +#define CONFIG_POWER_BUTTON +#define CONFIG_POWER_BUTTON_IGNORE_LID +#define CONFIG_POWER_BUTTON_X86 + +/* No Keyboard */ +#undef CONFIG_MKBP_EVENT +#undef CONFIG_MKBP_EVENT_WAKEUP_MASK +#undef CONFIG_MKBP_USE_GPIO_AND_HOST_EVENT +#undef CONFIG_KEYBOARD_COL2_INVERTED +#undef CONFIG_KEYBOARD_PROTOCOL_8042 +#undef CONFIG_MKBP_INPUT_DEVICES +#undef CONFIG_CMD_KEYBOARD +#undef CONFIG_KEYBOARD_BOOT_KEYS +#undef CONFIG_KEYBOARD_RUNTIME_KEYS + +/* No backlight */ +#undef CONFIG_BACKLIGHT_LID +#undef GPIO_ENABLE_BACKLIGHT + +/* Unused features - Misc */ +#undef CONFIG_HIBERNATE +#undef CONFIG_VOLUME_BUTTONS +#undef CONFIG_LID_SWITCH +#undef CONFIG_TABLET_MODE +#undef CONFIG_TABLET_MODE_SWITCH +#undef CONFIG_GMR_TABLET_MODE +#undef GPIO_TABLET_MODE_L + +/* Unused GPIOs */ +#undef GPIO_USB_C1_DP_HPD + +/* Pin renaming */ +#define GPIO_RECOVERY_L GPIO_EC_RECOVERY_BTN_ODL +#define GPIO_RECOVERY_L_2 GPIO_H1_EC_RECOVERY_BTN_ODL +#define GPIO_POWER_BUTTON_L GPIO_H1_EC_PWR_BTN_ODL + +#ifndef __ASSEMBLER__ + +#include "gpio_signal.h" +#include "registers.h" + +enum charge_port { + CHARGE_PORT_TYPEC0, + CHARGE_PORT_BARRELJACK, +}; + +enum pwm_channel { + PWM_CH_LED_RED, + PWM_CH_LED_GREEN, + PWM_CH_LED_BLUE, + PWM_CH_COUNT, +}; + +/* ADC channels */ +enum adc_channel { + ADC_VSNS_PP3300_A, /* ADC0 */ + ADC_TEMP_SENSOR_1, /* ADC2 */ + ADC_TEMP_SENSOR_2, /* ADC3 */ + ADC_PPVAR_PWR_IN_IMON, /* ADC15 */ + ADC_SNS_PPVAR_PWR_IN, /* ADC16 */ + ADC_CH_COUNT +}; + +enum temp_sensor_id { TEMP_SENSOR_1, TEMP_SENSOR_2, TEMP_SENSOR_COUNT }; + +#endif /* !__ASSEMBLER__ */ + +#endif /* __CROS_EC_BOARD_H */ diff --git a/board/dibbi/build.mk b/board/dibbi/build.mk new file mode 100644 index 0000000000..07ea50c392 --- /dev/null +++ b/board/dibbi/build.mk @@ -0,0 +1,14 @@ +# -*- makefile -*- +# Copyright 2022 The ChromiumOS Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +# +# Board specific files build +# + +CHIP:=it83xx +CHIP_FAMILY:=it8320 +CHIP_VARIANT:=it8320dx +BASEBOARD:=dedede + +board-y=board.o led.o usb_pd_policy.o diff --git a/board/dibbi/ec.tasklist b/board/dibbi/ec.tasklist new file mode 100644 index 0000000000..768c31112a --- /dev/null +++ b/board/dibbi/ec.tasklist @@ -0,0 +1,16 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/* + * See CONFIG_TASK_LIST in config.h for details. + */ + +#define CONFIG_TASK_LIST \ + TASK_ALWAYS(HOOKS, hook_task, NULL, VENTI_TASK_STACK_SIZE) \ + TASK_NOTEST(CHIPSET, chipset_task, NULL, VENTI_TASK_STACK_SIZE) \ + TASK_ALWAYS(HOSTCMD, host_command_task, NULL, VENTI_TASK_STACK_SIZE) \ + TASK_ALWAYS(CONSOLE, console_task, NULL, VENTI_TASK_STACK_SIZE) \ + TASK_ALWAYS(POWERBTN, power_button_task, NULL, ULTRA_TASK_STACK_SIZE) \ + TASK_ALWAYS(PD_C0, pd_task, NULL, ULTRA_TASK_STACK_SIZE) diff --git a/board/dibbi/gpio.inc b/board/dibbi/gpio.inc new file mode 100644 index 0000000000..a5c0c02a72 --- /dev/null +++ b/board/dibbi/gpio.inc @@ -0,0 +1,142 @@ +/* -*- mode:c -*- + * + * Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/* Declare symbolic names for all the GPIOs that we care about. + * Note: Those with interrupt handlers must be declared first. */ + +/* Power State interrupts */ +GPIO_INT(SLP_S4_L, PIN(I, 5), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(SLP_S3_L, PIN(H, 3), GPIO_INT_BOTH, baseboard_all_sys_pgood_interrupt) +GPIO_INT(SLP_S0_L, PIN(E, 4), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(SLP_SUS_L, PIN(G, 2), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(VCCIN_AUX_VID0, PIN(D, 0), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(RSMRST_PWRGD_L, PIN(E, 1), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(CPU_C10_GATE_L, PIN(G, 1), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(PG_DRAM_OD, PIN(D, 3), GPIO_INT_BOTH, baseboard_all_sys_pgood_interrupt) +GPIO_INT(PG_PP1050_ST_OD, PIN(L, 1), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(VCCIN_AUX_VID1, PIN(K, 1), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(PG_VCCIO_EXT_OD, PIN(D, 7), GPIO_INT_BOTH, baseboard_all_sys_pgood_interrupt) +GPIO_INT(ESPI_RESET_L, PIN(D, 2), GPIO_INT_FALLING | GPIO_SEL_1P8V, espi_reset_pin_asserted_interrupt) + +GPIO_INT(H1_EC_PWR_BTN_ODL, PIN(E, 2), GPIO_INT_BOTH | GPIO_PULL_UP, power_button_interrupt) +#ifdef CONFIG_LOW_POWER_IDLE +/* Used to wake up the EC from Deep Doze mode when writing to console */ +GPIO_INT(UART1_RX, PIN(B, 0), GPIO_INT_BOTH, uart_deepsleep_interrupt) /* UART_DBG_TX_EC_RX */ +#endif + +/* USB-C interrupts */ +GPIO_INT(USB_C0_CCSBU_OVP_ODL, PIN(K, 6), GPIO_INT_FALLING | GPIO_PULL_UP, c0_ccsbu_ovp_interrupt) /* Fault protection */ + +/* Other interrupts */ +GPIO_INT(EC_WP_OD, PIN(A, 6), GPIO_INT_BOTH, switch_interrupt) +/* Directly connected recovery button */ +GPIO_INT(EC_RECOVERY_BTN_ODL, PIN(K, 7), GPIO_INT_BOTH, button_interrupt) +/* Recovery button input from H1 */ +GPIO_INT(H1_EC_RECOVERY_BTN_ODL, PIN(K, 4), GPIO_INT_BOTH, button_interrupt) +GPIO_INT(BJ_ADP_PRESENT_L, PIN(A, 7), GPIO_INT_BOTH | GPIO_PULL_UP, adp_connect_interrupt) +GPIO_INT(USBC_ADP_PRESENT_L, PIN(K, 3), GPIO_INT_BOTH | GPIO_PULL_UP, usbc_connect_interrupt) + +/* Power sequence GPIOs */ +GPIO(EC_AP_RTCRST, PIN(K, 2), GPIO_OUT_LOW) +GPIO(EC_AP_PWR_BTN_ODL, PIN(B, 6), GPIO_ODR_HIGH) +GPIO(EC_AP_DPWROK, PIN(L, 7), GPIO_OUT_LOW) +GPIO(EC_AP_RSMRST_L, PIN(H, 0), GPIO_OUT_LOW) +GPIO(EC_AP_WAKE_ODL, PIN(D, 5), GPIO_ODR_HIGH) +GPIO(SYS_RST_ODL, PIN(D, 1), GPIO_ODR_HIGH) +GPIO(EC_AP_SYS_PWROK, PIN(F, 2), GPIO_OUT_LOW) +GPIO(PG_PP5000_U_OD, PIN(E, 3), GPIO_INPUT) +GPIO(EN_PP3300_A, PIN(C, 5), GPIO_OUT_LOW) +GPIO(EC_AP_PCH_PWROK_OD, PIN(D, 6), GPIO_ODR_LOW) +GPIO(EN_PP5000_U, PIN(K, 5), GPIO_OUT_LOW) +/* TODO(b:149775160) - Modify if needed if we ever use this signal. */ +GPIO(EN_VCCST, PIN(D, 4), GPIO_INPUT) +GPIO(EN_VCCIO_EXT, PIN(B, 2), GPIO_OUT_LOW) +GPIO(EC_PROCHOT_ODL, PIN(I, 1), GPIO_ODR_HIGH | GPIO_SEL_1P8V) +GPIO(EC_AP_VCCST_PWRGD_OD, PIN(E, 5), GPIO_ODR_LOW) +GPIO(ALL_SYS_PWRGD, PIN(B, 7), GPIO_OUT_LOW) +GPIO(EN_PPVAR_BJ_ADP_L, PIN(J, 0), GPIO_OUT_LOW) +GPIO(EN_PPVAR_USBC_ADP_L, PIN(J, 1), GPIO_OUT_LOW) +GPIO(EN_USB_C0_VBUS, PIN(I, 7), GPIO_OUT_LOW) +GPIO(USB_C0_VBUS_ILIM, PIN(I, 6), GPIO_OUT_LOW) + +/* Required for icelake chipset code, but implemented through other means for dedede */ +UNIMPLEMENTED(AC_PRESENT) +UNIMPLEMENTED(PG_EC_DSW_PWROK) +UNIMPLEMENTED(PG_EC_ALL_SYS_PWRGD) + +/* Required for dedede baseboard but not used in dibbi */ +UNIMPLEMENTED(USB_C0_INT_ODL) +UNIMPLEMENTED(EN_SLP_Z) + +/* I2C pins - Alternate function below configures I2C module on these pins */ +GPIO(EC_I2C_EEPROM_SCL, PIN(B, 3), GPIO_INPUT) +GPIO(EC_I2C_EEPROM_SDA, PIN(B, 4), GPIO_INPUT) +GPIO(EC_I2C_BATTERY_SCL, PIN(C, 1), GPIO_INPUT) +GPIO(EC_I2C_BATTERY_SDA, PIN(C, 2), GPIO_INPUT) +GPIO(EC_I2C_SENSOR_SCL, PIN(F, 6), GPIO_INPUT | GPIO_SEL_1P8V) +GPIO(EC_I2C_SENSOR_SDA, PIN(F, 7), GPIO_INPUT | GPIO_SEL_1P8V) +GPIO(EC_I2C_USB_C0_SCL, PIN(A, 4), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_SDA, PIN(A, 5), GPIO_INPUT) + +/* USB pins */ +GPIO(EN_USB_C0_CC1_VCONN, PIN(H, 4), GPIO_OUT_LOW) +GPIO(EN_USB_C0_CC2_VCONN, PIN(H, 6), GPIO_OUT_LOW) +GPIO(EC_AP_USB_C0_HPD, PIN(L, 4), GPIO_OUT_LOW) +GPIO(EN_USB_A0_VBUS, PIN(L, 6), GPIO_OUT_LOW) +GPIO(EN_USB_A1_VBUS, PIN(C, 6), GPIO_OUT_LOW) +GPIO(EN_USB_A2_VBUS, PIN(C, 4), GPIO_OUT_LOW) + +/* MKBP event synchronization */ +/* TODO(b/257833880) Check whether this pin is needed */ +GPIO(EC_AP_MKBP_INT_L, PIN(L, 5), GPIO_ODR_HIGH) + +/* Misc pins which will run to the I/O board */ +GPIO(EC_SUB_IO_1_1, PIN(L, 3), GPIO_INPUT) +GPIO(EC_SUB_IO_1_2, PIN(F, 0), GPIO_INPUT) +GPIO(EC_SUB_IO_2_1, PIN(F, 1), GPIO_INPUT) +GPIO(EC_SUB_IO_2_2, PIN(L, 2), GPIO_INPUT) + +/* Misc */ +GPIO(EC_ENTERING_RW, PIN(G, 0), GPIO_OUT_LOW) +GPIO(CCD_MODE_ODL, PIN(H, 5), GPIO_ODR_HIGH) +GPIO(EC_BATTERY_PRES_ODL, PIN(I, 4), GPIO_INPUT) +GPIO(ECH1_PACKET_MODE, PIN(H, 1), GPIO_OUT_LOW) + + +/* NC pins, enable internal pull-down to avoid floating state. */ +GPIO(GPIOC0_NC, PIN(C, 0), GPIO_INPUT | GPIO_PULL_DOWN) +GPIO(GPIOC3_NC, PIN(C, 3), GPIO_INPUT | GPIO_PULL_DOWN) +GPIO(GPIOG3_NC, PIN(G, 3), GPIO_INPUT | GPIO_PULL_DOWN) +GPIO(GPIOG4_NC, PIN(G, 4), GPIO_INPUT | GPIO_PULL_DOWN) +GPIO(GPIOG5_NC, PIN(G, 5), GPIO_INPUT | GPIO_PULL_DOWN) +GPIO(GPIOG6_NC, PIN(G, 6), GPIO_INPUT | GPIO_PULL_DOWN) +GPIO(GPIOG7_NC, PIN(G, 7), GPIO_INPUT | GPIO_PULL_DOWN) +GPIO(GPIOJ4_NC, PIN(J, 4), GPIO_INPUT | GPIO_PULL_DOWN) +GPIO(GPIOJ5_NC, PIN(J, 5), GPIO_INPUT | GPIO_PULL_DOWN) +GPIO(GPIOJ6_NC, PIN(J, 6), GPIO_INPUT | GPIO_PULL_DOWN) +GPIO(GPIOK0_NC, PIN(K, 0), GPIO_INPUT | GPIO_PULL_DOWN) +GPIO(GPIOL0_NC, PIN(L, 0), GPIO_INPUT | GPIO_PULL_DOWN) +GPIO(GPIOM6_NC, PIN(M, 6), GPIO_INPUT | GPIO_PULL_DOWN) +/* TODO(b/257833880) add any new unused pins */ + +/* Alternate functions GPIO definitions */ +/* UART */ +ALTERNATE(PIN_MASK(B, BIT(0) | BIT(1)), 0, MODULE_UART, 0) /* UART for debug */ + +/* I2C */ +ALTERNATE(PIN_MASK(B, BIT(3) | BIT(4)), 0, MODULE_I2C, 0) /* I2C0 */ +ALTERNATE(PIN_MASK(C, BIT(1) | BIT(2)), 0, MODULE_I2C, 0) /* I2C1 */ +ALTERNATE(PIN_MASK(F, BIT(6) | BIT(7)), 0, MODULE_I2C, GPIO_SEL_1P8V) /* I2C2 - 1.8V */ +ALTERNATE(PIN_MASK(E, BIT(0) | BIT(7)), 0, MODULE_I2C, 0) /* I2C4 */ +ALTERNATE(PIN_MASK(A, BIT(4) | BIT(5)), 0, MODULE_I2C, 0) /* I2C5 */ + +/* ADC */ +ALTERNATE(PIN_MASK(I, BIT(0) | BIT(2) | BIT(3)), 0, MODULE_ADC, 0) /* ADC0: EC_VSNS_PP3300_A, ADC2: TEMP_SENSOR_1, ADC3: TEMP_SENSOR_2 */ +ALTERNATE(PIN_MASK(L, BIT(2) | BIT(3)), 0, MODULE_ADC, 0) /* ADC15: PPVAR_PWR_IN_IMON, ADC16: SNS_PPVAR_PWR_IN */ + +/* PWM */ +ALTERNATE(PIN_MASK(A, BIT(1) | BIT(2) | BIT(3)), 0, MODULE_PWM, 0) /* LED_[R,G,B]_ODL */ diff --git a/board/dibbi/led.c b/board/dibbi/led.c new file mode 100644 index 0000000000..44cfc0b457 --- /dev/null +++ b/board/dibbi/led.c @@ -0,0 +1,38 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/* Dibbi specific PWM LED settings. */ + +#include "common.h" +#include "ec_commands.h" +#include "pwm.h" +#include "util.h" + +/* TODO(b/259467280) Implement LED logic */ + +const enum ec_led_id supported_led_ids[] = { + EC_LED_ID_POWER_LED, +}; +const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids); + +void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range) +{ + /* TODO(b/259467280) check this implementation */ + memset(brightness_range, '\0', + sizeof(*brightness_range) * EC_LED_COLOR_COUNT); + brightness_range[EC_LED_COLOR_RED] = 100; + brightness_range[EC_LED_COLOR_GREEN] = 100; + brightness_range[EC_LED_COLOR_BLUE] = 100; + brightness_range[EC_LED_COLOR_YELLOW] = 100; + brightness_range[EC_LED_COLOR_WHITE] = 100; + brightness_range[EC_LED_COLOR_AMBER] = 100; +} + +int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness) +{ + /* TODO(b/259467280) fix this implementation */ + + return EC_SUCCESS; +} diff --git a/board/dibbi/usb_pd_policy.c b/board/dibbi/usb_pd_policy.c new file mode 100644 index 0000000000..9d573b9c61 --- /dev/null +++ b/board/dibbi/usb_pd_policy.c @@ -0,0 +1,69 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "charge_manager.h" +#include "charger.h" +#include "chipset.h" +#include "common.h" +#include "console.h" +#include "driver/tcpm/tcpci.h" +#include "gpio.h" +#include "usb_pd.h" + +#define CPRINTF(format, args...) cprintf(CC_USBPD, format, ##args) +#define CPRINTS(format, args...) cprints(CC_USBPD, format, ##args) + +__override int pd_check_power_swap(int port) +{ + /* If type-c port is supplying power, we never swap PR (to source) */ + if (port == charge_manager_get_active_charge_port()) + return 0; + /* + * Allow power swap as long as we are acting as a dual role device, + * otherwise assume our role is fixed (not in S0 or console command + * to fix our role). + */ + return (pd_get_dual_role(port) == PD_DRP_TOGGLE_ON ? 1 : 0); +} + +int pd_check_vconn_swap(int port) +{ + /* Allow VCONN swaps if the AP is on */ + return gpio_get_level(GPIO_EN_PP5000_U); +} + +void pd_power_supply_reset(int port) +{ + if (port < 0 || port >= board_get_usb_pd_port_count()) + return; + + /* Disable VBUS source */ + gpio_set_level(GPIO_EN_USB_C0_VBUS, 0); + + /* Notify host of power info change. */ + pd_send_host_event(PD_EVENT_POWER_CHANGE); +} + +int pd_set_power_supply_ready(int port) +{ + /* Disable charging */ + gpio_set_level(GPIO_EN_PPVAR_USBC_ADP_L, 1); + + /* Enable VBUS source */ + gpio_set_level(GPIO_EN_USB_C0_VBUS, 1); + + /* Notify host of power info change. */ + pd_send_host_event(PD_EVENT_POWER_CHANGE); + + return EC_SUCCESS; +} + +__override int pd_snk_is_vbus_provided(int port) +{ + if (port != CHARGE_PORT_TYPEC0) + return 0; + + return gpio_get_level(GPIO_USBC_ADP_PRESENT_L); +} diff --git a/board/dibbi/vif_override.xml b/board/dibbi/vif_override.xml new file mode 100644 index 0000000000..32736caf64 --- /dev/null +++ b/board/dibbi/vif_override.xml @@ -0,0 +1,3 @@ +<!-- Add VIF field overrides here. See genvif.c and the Vendor Info File + Definition from the USB-IF. +--> diff --git a/board/dingdong/board.h b/board/dingdong/board.h index c0372c9322..52c3b740e4 100644 --- a/board/dingdong/board.h +++ b/board/dingdong/board.h @@ -15,7 +15,6 @@ #define CONFIG_UART_CONSOLE 1 /* Optional features */ -#define CONFIG_STM_HWTIMER32 #define CONFIG_ADC #define CONFIG_BOARD_PRE_INIT #define CONFIG_HW_CRC diff --git a/board/discovery-stm32f072/board.h b/board/discovery-stm32f072/board.h index d5db803b65..b112f14f9f 100644 --- a/board/discovery-stm32f072/board.h +++ b/board/discovery-stm32f072/board.h @@ -23,7 +23,6 @@ #define CONFIG_UART_CONSOLE 2 /* Optional features */ -#define CONFIG_STM_HWTIMER32 #define CONFIG_HW_CRC /* USB Configuration */ diff --git a/board/discovery/board.h b/board/discovery/board.h index e348454af1..a722408e81 100644 --- a/board/discovery/board.h +++ b/board/discovery/board.h @@ -25,9 +25,14 @@ #ifndef __ASSEMBLER__ -/* Timer selection */ -#define TIM_CLOCK_MSB 3 -#define TIM_CLOCK_LSB 4 +/* Timer selection + * + * "discovery" is an STM32L152RC, which is a "Category 3" product that + * has the 32-bit timer TIM5. See Section 17 "General-purpose Timers" and + * "Table 3. STM32L15xxx product categories": + * https://www.st.com/resource/en/reference_manual/cd00240193-stm32l100xx-stm32l151xx-stm32l152xx-and-stm32l162xx-advanced-arm-based-32-bit-mcus-stmicroelectronics.pdf + */ +#define TIM_CLOCK32 5 #include "gpio_signal.h" diff --git a/board/dojo/board.c b/board/dojo/board.c index 62f2e6ac09..5c7db8b443 100644 --- a/board/dojo/board.c +++ b/board/dojo/board.c @@ -467,14 +467,13 @@ const struct usb_mux_chain usb_muxes[CONFIG_USB_PD_PORT_MAX_COUNT] = { }, }; -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* Limit input current lower than 2944 mA for safety */ charge_ma = MIN(charge_ma, 2944); - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } /* NVME */ diff --git a/board/dooly/board.c b/board/dooly/board.c index 6e1f6ebbeb..9652de72c0 100644 --- a/board/dooly/board.c +++ b/board/dooly/board.c @@ -323,8 +323,8 @@ uint16_t tcpc_get_alert_status(void) } /* Called when the charge manager has switched to a new port. */ -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* Blink alert if insufficient power per system_can_boot_ap(). */ int insufficient_power = diff --git a/board/drawcia/board.c b/board/drawcia/board.c index 118b3178be..58def569be 100644 --- a/board/drawcia/board.c +++ b/board/drawcia/board.c @@ -610,19 +610,17 @@ uint16_t tcpc_get_alert_status(void) return status; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - /* Limit C1 on board version 0 to 2.0 A */ if ((board_version == 0) && (port == 1)) - icl = MIN(icl, 2000); + charge_ma = MIN(charge_ma, 2000); /* * TODO(b/151955431): Characterize the input current limit in case a * scaling needs to be applied here */ - charge_set_input_current_limit(icl, charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } int board_set_active_charge_port(int port) diff --git a/board/drawcia_riscv/board.c b/board/drawcia_riscv/board.c index cbc977d64b..ba325aedc6 100644 --- a/board/drawcia_riscv/board.c +++ b/board/drawcia_riscv/board.c @@ -542,19 +542,17 @@ uint16_t tcpc_get_alert_status(void) return status; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - /* Limit C1 on board version 0 to 2.0 A */ if ((board_version == 0) && (port == 1)) - icl = MIN(icl, 2000); + charge_ma = MIN(charge_ma, 2000); /* * TODO(b/151955431): Characterize the input current limit in case a * scaling needs to be applied here */ - charge_set_input_current_limit(icl, charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } int board_set_active_charge_port(int port) diff --git a/board/driblee/board.c b/board/driblee/board.c index 30075e683e..05ec708ac5 100644 --- a/board/driblee/board.c +++ b/board/driblee/board.c @@ -338,19 +338,6 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * b/147463641: The charger IC seems to overdraw ~4%, therefore we - * reduce our target accordingly. - */ - icl = icl * 96 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - __override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) { if (port < 0 || port > board_get_usb_pd_port_count()) diff --git a/board/driblee/board.h b/board/driblee/board.h index f6a3ac9130..514fe584ff 100644 --- a/board/driblee/board.h +++ b/board/driblee/board.h @@ -31,6 +31,11 @@ #undef CONFIG_CMD_CHARGER_DUMP #undef CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE #define CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE (100 * MSEC) +/* + * b/147463641: The charger IC seems to overdraw ~4%, therefore we + * reduce our target accordingly. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 #define CONFIG_MATH_UTIL #define CONFIG_CHARGER_PROFILE_OVERRIDE #define CHARGING_CURRENT_1100MA 1100 diff --git a/board/drobit/board.c b/board/drobit/board.c index 1a20870d1f..1d881d9a2c 100644 --- a/board/drobit/board.c +++ b/board/drobit/board.c @@ -475,17 +475,3 @@ static void board_chipset_suspend(void) gpio_set_level(GPIO_EC_KB_BL_EN, 0); } DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, board_chipset_suspend, HOOK_PRIO_DEFAULT); - -/******************************************************************************/ -/* Set the charge limit based upon desired maximum. */ -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - /* - * Limit the input current to 98% negotiated limit, - * to account for the charger chip margin. - */ - charge_ma = charge_ma * 98 / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/drobit/board.h b/board/drobit/board.h index d6fda98f3d..bf3e64ae5a 100644 --- a/board/drobit/board.h +++ b/board/drobit/board.h @@ -89,6 +89,7 @@ /* charger defines */ #define CONFIG_CHARGER_SENSE_RESISTOR 10 #define CONFIG_CHARGER_SENSE_RESISTOR_AC 10 +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 2 /* * Macros for GPIO signals used in common code that don't match the diff --git a/board/eldrid/board.c b/board/eldrid/board.c index 81fdf22ffc..1abf9c6acd 100644 --- a/board/eldrid/board.c +++ b/board/eldrid/board.c @@ -182,14 +182,7 @@ __override void board_set_charge_limit(int port, int supplier, int charge_ma, else isl9241_set_ac_prochot(0, 3328); - /* - * Follow OEM request to limit the input current to - * 90% negotiated limit. - */ - charge_ma = charge_ma * 90 / 100; - - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } /******************************************************************************/ diff --git a/board/eldrid/board.h b/board/eldrid/board.h index 1bbe183425..8cfac4d8bc 100644 --- a/board/eldrid/board.h +++ b/board/eldrid/board.h @@ -93,6 +93,8 @@ /* charger defines */ #define CONFIG_CHARGER_SENSE_RESISTOR 10 #define CONFIG_CHARGER_SENSE_RESISTOR_AC 10 +/* OEM requested 10% derating */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 10 /* Retimer */ #undef CONFIG_USBC_RETIMER_INTEL_BB diff --git a/board/elm/board.c b/board/elm/board.c index 4007d34379..f8621d086e 100644 --- a/board/elm/board.c +++ b/board/elm/board.c @@ -337,13 +337,10 @@ int board_set_active_charge_port(int charge_port) * @param charge_ma Desired charge limit (mA). * @param charge_mv Negotiated charge voltage (mV). */ -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { - /* Limit input current 95% ratio on elm board for safety */ - charge_ma = (charge_ma * 95) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); pd_send_host_event(PD_EVENT_POWER_CHANGE); } diff --git a/board/elm/board.h b/board/elm/board.h index 10cb6bb75d..6e4e705604 100644 --- a/board/elm/board.h +++ b/board/elm/board.h @@ -37,13 +37,15 @@ #define CONFIG_BATTERY_SMART #define CONFIG_CHARGE_MANAGER #define CONFIG_CHARGER -#define CONFIG_CHARGER_INPUT_CURRENT 512 +#define CONFIG_CHARGER_DEFAULT_CURRENT_LIMIT 512 +#define CONFIG_CHARGER_MIN_INPUT_CURRENT_LIMIT 512 #define CONFIG_CHARGE_RAMP_HW #define CONFIG_CHARGER_ISL9237 #define CONFIG_CHARGER_MAX_INPUT_CURRENT 3000 #define CONFIG_CHARGER_SENSE_RESISTOR 10 #define CONFIG_CHARGER_SENSE_RESISTOR_AC 20 #define CONFIG_CHARGER_DISCHARGE_ON_AC +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define CONFIG_CHIPSET_MT817X #define CONFIG_CMD_TYPEC #define CONFIG_EXTPOWER_GPIO @@ -73,7 +75,6 @@ #define CONFIG_USB_CHARGER #define CONFIG_SPI #define CONFIG_SPI_CONTROLLER -#define CONFIG_STM_HWTIMER32 #define CONFIG_VBOOT_HASH #undef CONFIG_WATCHDOG_HELP #define CONFIG_SWITCH diff --git a/board/eve/board.c b/board/eve/board.c index 3f5da1a83a..96534f62c7 100644 --- a/board/eve/board.c +++ b/board/eve/board.c @@ -634,8 +634,8 @@ int board_set_active_charge_port(int charge_port) * @param charge_ma Desired charge limit (mA). * @param charge_mv Negotiated charge voltage (mV). */ -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* Enable charging trigger by BC1.2 detection */ int bc12_enable = (supplier == CHARGE_SUPPLIER_BC12_CDP || @@ -646,9 +646,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, if (bd9995x_bc12_enable_charging(port, bc12_enable)) return; - charge_ma = (charge_ma * 95) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } /** diff --git a/board/eve/board.h b/board/eve/board.h index 064bce4b60..e3623979c3 100644 --- a/board/eve/board.h +++ b/board/eve/board.h @@ -100,7 +100,9 @@ #define CONFIG_CHARGER_BD9995X #define CONFIG_CHARGER_BD9995X_CHGEN #define CONFIG_CHARGER_DISCHARGE_ON_AC -#define CONFIG_CHARGER_INPUT_CURRENT 512 +#define CONFIG_CHARGER_DEFAULT_CURRENT_LIMIT 512 +#define CONFIG_CHARGER_MIN_INPUT_CURRENT_LIMIT 512 +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define CONFIG_CHARGER_MAINTAIN_VBAT #define CONFIG_CHARGER_PROFILE_OVERRIDE #define CONFIG_CHARGER_PSYS_READ diff --git a/board/ezkinil/board.c b/board/ezkinil/board.c index c9e1aca267..5e15b458cc 100644 --- a/board/ezkinil/board.c +++ b/board/ezkinil/board.c @@ -865,16 +865,3 @@ int fan_percent_to_rpm(int fan, int pct) return fan_table[current_level].rpm; } - -__override void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - /* - * Limit the input current to 95% negotiated limit, - * to account for the charger chip margin. - */ - charge_ma = charge_ma * 95 / 100; - - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/ezkinil/board.h b/board/ezkinil/board.h index aa1fe065f4..c5e6ce1771 100644 --- a/board/ezkinil/board.h +++ b/board/ezkinil/board.h @@ -15,6 +15,9 @@ #define CONFIG_KEYBOARD_FACTORY_TEST +/* charger margin */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 + /* Motion sensing drivers */ #define CONFIG_ACCELGYRO_ICM426XX #define CONFIG_ACCELGYRO_ICM426XX_INT_EVENT \ diff --git a/board/felwinter/board.h b/board/felwinter/board.h index 17e1cf9246..0ca6a59b9c 100644 --- a/board/felwinter/board.h +++ b/board/felwinter/board.h @@ -179,6 +179,7 @@ #define CONFIG_CHARGE_RAMP_SW #define CONFIG_CHARGER_SENSE_RESISTOR 10 #define CONFIG_CHARGER_SENSE_RESISTOR_AC 10 +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 10 #define CONFIG_KEYBOARD_REFRESH_ROW3 diff --git a/board/felwinter/charger_isl9241.c b/board/felwinter/charger_isl9241.c index dd2535ea7c..95227f753a 100644 --- a/board/felwinter/charger_isl9241.c +++ b/board/felwinter/charger_isl9241.c @@ -79,11 +79,3 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } - -__overridable void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - charge_ma = (charge_ma * 90) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/fennel/board.c b/board/fennel/board.c index 563f680dee..6d864252b6 100644 --- a/board/fennel/board.c +++ b/board/fennel/board.c @@ -237,14 +237,6 @@ int board_set_active_charge_port(int charge_port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - charge_ma = (charge_ma * 95) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - int board_discharge_on_ac(int enable) { int ret, port; diff --git a/board/fennel/board.h b/board/fennel/board.h index 6bb90ef0f3..42e1fcd451 100644 --- a/board/fennel/board.h +++ b/board/fennel/board.h @@ -26,6 +26,7 @@ #define CONFIG_BATTERY_HW_PRESENT_CUSTOM #define CONFIG_CHARGER_PSYS +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define CONFIG_CHARGER_RUNTIME_CONFIG diff --git a/board/fizz/board.c b/board/fizz/board.c index f58083c6ed..296ddca5a7 100644 --- a/board/fizz/board.c +++ b/board/fizz/board.c @@ -512,8 +512,8 @@ static void set_charge_limit(int charge_ma) } } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { int p87w = 0, p65w = 0, p60w = 0; diff --git a/board/fluffy/board.h b/board/fluffy/board.h index 1309c41901..604e67d9b8 100644 --- a/board/fluffy/board.h +++ b/board/fluffy/board.h @@ -38,7 +38,6 @@ #define USB_EP_COUNT 2 /* Optional features */ -#define CONFIG_STM_HWTIMER32 #define CONFIG_ADC #define CONFIG_I2C diff --git a/board/fusb307bgevb/board.h b/board/fusb307bgevb/board.h index 5e45b346b7..8d2fdfcfed 100644 --- a/board/fusb307bgevb/board.h +++ b/board/fusb307bgevb/board.h @@ -29,7 +29,6 @@ #define CONFIG_UART_CONSOLE 2 /* Optional features */ -#define CONFIG_STM_HWTIMER32 #define CONFIG_HW_CRC #define CONFIG_I2C #define CONFIG_I2C_CONTROLLER diff --git a/board/gaelin/board.c b/board/gaelin/board.c index 6fad328a76..7228c9e2f2 100644 --- a/board/gaelin/board.c +++ b/board/gaelin/board.c @@ -17,7 +17,6 @@ #include "gpio_signal.h" #include "power_button.h" #include "hooks.h" -#include "peripheral_charger.h" #include "power.h" #include "switch.h" #include "throttle_ap.h" @@ -41,33 +40,6 @@ const int usb_port_enable[USB_PORT_COUNT] = { }; BUILD_ASSERT(ARRAY_SIZE(usb_port_enable) == USB_PORT_COUNT); -extern struct pchg_drv cps8100_drv; -struct pchg pchgs[] = { - [0] = { - .cfg = &(const struct pchg_config) { - .drv = &cps8100_drv, - .i2c_port = I2C_PORT_QI, - .irq_pin = GPIO_QI_INT_ODL, - .full_percent = 96, - .block_size = 128, - }, - .policy = { - [PCHG_CHIPSET_STATE_ON] = &pchg_policy_on, - [PCHG_CHIPSET_STATE_SUSPEND] = &pchg_policy_suspend, - }, - .events = QUEUE_NULL(PCHG_EVENT_QUEUE_SIZE, enum pchg_event), - }, -}; -const int pchg_count = ARRAY_SIZE(pchgs); - -__override void board_pchg_power_on(int port, bool on) -{ - if (port == 0) - gpio_set_level(GPIO_EC_QI_PWR, on); - else - CPRINTS("%s: Invalid port=%d", __func__, port); -} - /******************************************************************************/ int board_set_active_charge_port(int port) @@ -118,7 +90,6 @@ int board_set_active_charge_port(int port) switch (port) { case CHARGE_PORT_TYPEC0: case CHARGE_PORT_TYPEC1: - case CHARGE_PORT_TYPEC2: gpio_set_level(GPIO_EN_PPVAR_BJ_ADP_L, 1); break; case CHARGE_PORT_BARRELJACK: @@ -293,6 +264,7 @@ void board_overcurrent_event(int port, int is_overcurrented) usbc_overcurrent = is_overcurrented; update_5v_usage(); } + /* * Power monitoring and management. * @@ -336,7 +308,6 @@ void board_overcurrent_event(int port, int is_overcurrented) #define THROT_TYPE_A_REAR BIT(1) #define THROT_TYPE_C0 BIT(2) #define THROT_TYPE_C1 BIT(3) -#define THROT_TYPE_C2 BIT(4) #define THROT_PROCHOT BIT(5) /* @@ -471,16 +442,6 @@ static void power_monitor(void) gap += POWER_GAIN_TYPE_C; } /* - * If the type-C port is sourcing power, - * check whether it should be throttled. - */ - if (ppc_is_sourcing_vbus(2) && gap <= 0) { - new_state |= THROT_TYPE_C2; - headroom_5v_z1 += PWR_Z1_C_HIGH - PWR_Z1_C_LOW; - if (!(current_state & THROT_TYPE_C2)) - gap += POWER_GAIN_TYPE_C; - } - /* * As a last resort, turn on PROCHOT to * throttle the CPU. */ @@ -570,15 +531,6 @@ static void power_monitor(void) tcpm_select_rp_value(1, rp); pd_update_contract(1); } - if (diff & THROT_TYPE_C2) { - enum tcpc_rp_value rp = (new_state & THROT_TYPE_C2) ? - TYPEC_RP_1A5 : - TYPEC_RP_3A0; - - ppc_set_vbus_source_current_limit(2, rp); - tcpm_select_rp_value(2, rp); - pd_update_contract(2); - } if (diff & THROT_TYPE_A_REAR) { int typea_bc = (new_state & THROT_TYPE_A_REAR) ? 1 : 0; diff --git a/board/gaelin/board.h b/board/gaelin/board.h index f113c6cffd..166f0f1432 100644 --- a/board/gaelin/board.h +++ b/board/gaelin/board.h @@ -16,7 +16,7 @@ #define CONFIG_MP2964 /* Barrel Jack */ -#define DEDICATED_CHARGE_PORT 3 +#define DEDICATED_CHARGE_PORT 2 /* HDMI CEC */ #define CONFIG_CEC @@ -31,19 +31,9 @@ /* USB Type C and USB PD defines */ #define CONFIG_USB_PD_REQUIRE_AP_MODE_ENTRY -#define CONFIG_IO_EXPANDER -#define CONFIG_IO_EXPANDER_NCT38XX -#define CONFIG_IO_EXPANDER_PORT_COUNT 2 - #define CONFIG_USB_PD_PPC -#define CONFIG_USB_PD_TCPM_RT1715 -#define CONFIG_USBC_RETIMER_INTEL_BB - -#define CONFIG_USBC_RETIMER_KB800X -#define CONFIG_KB800X_CUSTOM_XBAR -#define CONFIG_USBC_PPC_SYV682X -#undef CONFIG_SYV682X_HV_ILIM -#define CONFIG_SYV682X_HV_ILIM SYV682X_HV_ILIM_5_50 +#define CONFIG_USB_PD_TCPM_PS8815 +#define CONFIG_USBC_PPC_NX20P3483 /* Compatible with Silicon Mitus SM5360A */ /* TODO: b/177608416 - measure and check these values on brya */ #define PD_POWER_SUPPLY_TURN_ON_DELAY 30000 /* us */ @@ -92,22 +82,17 @@ #define GPIO_RECOVERY_L_2 GPIO_GSC_EC_RECOVERY_BTN_OD /* I2C Bus Configuration */ +#define I2C_PORT_SCALER NPCX_I2C_PORT5_0 -#define I2C_PORT_DP_REDRIVER NPCX_I2C_PORT0_0 - -#define I2C_PORT_USB_C0_C2_TCPC NPCX_I2C_PORT1_0 +#define I2C_PORT_USB_C0_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_C1_PPC NPCX_I2C_PORT6_1 +#define I2C_PORT_USB_C0_PPC NPCX_I2C_PORT2_0 +#define I2C_PORT_USB_C1_PPC NPCX_I2C_PORT3_0 -#define I2C_PORT_USB_C0_C2_BC12 NPCX_I2C_PORT2_0 -#define I2C_PORT_USB_C1_BC12 NPCX_I2C_PORT6_1 +#define I2C_PORT_USB_C0_BC12 NPCX_I2C_PORT2_0 +#define I2C_PORT_USB_C1_BC12 NPCX_I2C_PORT3_0 -#define I2C_PORT_USB_C0_C2_MUX NPCX_I2C_PORT3_0 -#define I2C_PORT_USB_C1_MUX NPCX_I2C_PORT6_1 - -#define I2C_PORT_QI NPCX_I2C_PORT5_0 #define I2C_PORT_EEPROM NPCX_I2C_PORT7_0 #define I2C_PORT_MP2964 NPCX_I2C_PORT7_0 @@ -115,17 +100,7 @@ #define I2C_ADDR_MP2964_FLAGS 0x20 -#define USBC_PORT_C0_BB_RETIMER_I2C_ADDR 0x58 -#define USBC_PORT_C2_BB_RETIMER_I2C_ADDR 0x59 - -/* Enabling Thunderbolt-compatible mode */ -#define CONFIG_USB_PD_TBT_COMPAT_MODE - -/* Enabling USB4 mode */ -#define CONFIG_USB_PD_USB4 - -/* Retimer */ -#define CONFIG_USBC_RETIMER_FW_UPDATE +#define I2C_ADDR_SCALER_FLAGS 0x58 /* Thermal features */ #define CONFIG_THERMISTOR @@ -136,21 +111,14 @@ /* ADC */ #define CONFIG_ADC -/* - * TODO(b/197478860): Enable the fan control. We need - * to check the sensor value and adjust the fan speed. - */ +/* Fan */ #define CONFIG_FANS FAN_CH_COUNT +#define RPM_DEVIATION 1 +#define CONFIG_CUSTOM_FAN_CONTROL /* Include math_util for bitmask_uint64 used in pd_timers */ #define CONFIG_MATH_UTIL -/* WPC/Qi charger */ -#ifdef SECTION_IS_RW -#define CONFIG_PERIPHERAL_CHARGER -#define CONFIG_CPS8100 -#endif - #ifndef __ASSEMBLER__ #include "gpio_signal.h" /* needed by registers.h */ @@ -160,7 +128,6 @@ enum charge_port { CHARGE_PORT_TYPEC0, CHARGE_PORT_TYPEC1, - CHARGE_PORT_TYPEC2, CHARGE_PORT_BARRELJACK, CHARGE_PORT_ENUM_COUNT }; @@ -183,8 +150,6 @@ enum temp_sensor_id { TEMP_SENSOR_COUNT }; -enum ioex_port { IOEX_C0_NCT38XX = 0, IOEX_C2_NCT38XX, IOEX_PORT_COUNT }; - enum pwm_channel { PWM_CH_LED_GREEN, /* PWM0 */ PWM_CH_FAN, /* PWM5 */ diff --git a/board/gaelin/build.mk b/board/gaelin/build.mk index 3de758d1bd..6961fb3f60 100644 --- a/board/gaelin/build.mk +++ b/board/gaelin/build.mk @@ -19,4 +19,5 @@ board-y+=i2c.o board-y+=led.o board-y+=pwm.o board-y+=sensors.o +board-y+=thermal.o board-y+=usbc_config.o diff --git a/board/gaelin/ec.tasklist b/board/gaelin/ec.tasklist index d16fc35f52..4a40f332e8 100644 --- a/board/gaelin/ec.tasklist +++ b/board/gaelin/ec.tasklist @@ -12,10 +12,8 @@ #define CONFIG_TASK_LIST \ TASK_ALWAYS(HOOKS, hook_task, NULL, LARGER_TASK_STACK_SIZE) \ - TASK_ALWAYS_RW(PCHG, pchg_task, NULL, LARGER_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_NOTEST(CHIPSET, chipset_task, NULL, LARGER_TASK_STACK_SIZE) \ TASK_ALWAYS(USB_MUX, usb_mux_task, NULL, VENTI_TASK_STACK_SIZE) \ TASK_ALWAYS(HOSTCMD, host_command_task, NULL, LARGER_TASK_STACK_SIZE) \ @@ -23,7 +21,6 @@ TASK_ALWAYS(POWERBTN, power_button_task, NULL, LARGER_TASK_STACK_SIZE) \ TASK_ALWAYS(PD_C0, pd_task, NULL, VENTI_TASK_STACK_SIZE) \ TASK_ALWAYS(PD_C1, pd_task, NULL, VENTI_TASK_STACK_SIZE) \ - TASK_ALWAYS(PD_C2, pd_task, NULL, VENTI_TASK_STACK_SIZE) \ - TASK_ALWAYS(PD_INT_C0, pd_shared_alert_task, (BIT(2) | BIT(0)), LARGER_TASK_STACK_SIZE) \ + TASK_ALWAYS(PD_INT_C0, pd_interrupt_handler_task, 0, LARGER_TASK_STACK_SIZE) \ TASK_ALWAYS(PD_INT_C1, pd_interrupt_handler_task, 1, LARGER_TASK_STACK_SIZE) \ TASK_ALWAYS(CEC, cec_task, NULL, LARGER_TASK_STACK_SIZE) diff --git a/board/gaelin/fans.c b/board/gaelin/fans.c index 6828438a10..5f54e6e63c 100644 --- a/board/gaelin/fans.c +++ b/board/gaelin/fans.c @@ -30,16 +30,10 @@ static const struct fan_conf fan_conf_0 = { .enable_gpio = GPIO_EN_PP5000_FAN, }; -/* - * TOOD(b/197478860): need to update for real fan - * - * Prototype fan spins at about 7200 RPM at 100% PWM. - * Set minimum at around 30% PWM. - */ static const struct fan_rpm fan_rpm_0 = { - .rpm_min = 2200, - .rpm_start = 2200, - .rpm_max = 7200, + .rpm_min = 2350, + .rpm_start = 2350, + .rpm_max = 4100, }; const struct fan_t fans[FAN_CH_COUNT] = { diff --git a/board/gaelin/gpio.inc b/board/gaelin/gpio.inc index 51cf0010c6..6de7003743 100644 --- a/board/gaelin/gpio.inc +++ b/board/gaelin/gpio.inc @@ -18,15 +18,11 @@ GPIO_INT(SLP_S3_L, PIN(A, 5), GPIO_INT_BOTH, power_signal_inte GPIO_INT(SLP_SUS_L, PIN(F, 1), GPIO_INT_BOTH, power_signal_interrupt) GPIO_INT(SYS_SLP_S0IX_L, PIN(D, 5), GPIO_INT_BOTH, power_signal_interrupt) 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_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_C1_BC12_INT_ODL, PIN(5, 0), GPIO_INT_FALLING, bc12_interrupt) GPIO_INT(USB_C1_PPC_INT_ODL, PIN(F, 5), GPIO_INT_FALLING, ppc_interrupt) GPIO_INT(USB_C1_TCPC_INT_ODL, PIN(A, 2), GPIO_INT_FALLING, tcpc_alert_event) -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(BJ_ADP_PRESENT_ODL, PIN(8, 2), GPIO_INT_BOTH | GPIO_PULL_UP, adp_connect_interrupt) GPIO_INT(EC_RECOVERY_BTN_OD, PIN(2, 3), GPIO_INT_BOTH, button_interrupt) GPIO_INT(HDMI_CONN_OC_ODL, PIN(2, 4), GPIO_INPUT | GPIO_INT_BOTH, port_ocp_interrupt) @@ -34,11 +30,6 @@ GPIO_INT(USB_A0_OC_ODL, PIN(3, 1), GPIO_INPUT | GPIO_PULL_UP | GPIO GPIO_INT(USB_A1_OC_ODL, PIN(3, 0), GPIO_INPUT | GPIO_PULL_UP | GPIO_INT_BOTH, port_ocp_interrupt) GPIO_INT(USB_A2_OC_ODL, PIN(2, 7), GPIO_INPUT | GPIO_PULL_UP | GPIO_INT_BOTH, port_ocp_interrupt) GPIO_INT(USB_A3_OC_ODL, PIN(2, 6), GPIO_INPUT | GPIO_PULL_UP | GPIO_INT_BOTH, port_ocp_interrupt) -#ifdef SECTION_IS_RW -GPIO_INT(QI_INT_ODL, PIN(9, 6), GPIO_INT_FALLING, pchg_irq) -#else -UNIMPLEMENTED(QI_INT_ODL) -#endif /* CCD */ GPIO(CCD_MODE_ODL, PIN(E, 5), GPIO_INPUT) @@ -54,8 +45,25 @@ GPIO(EN_PP5000_FAN, PIN(6, 1), GPIO_OUT_HIGH) GPIO(ANALOG_PPVAR_PWR_IN_IMON_EC, PIN(4, 2), GPIO_INPUT) /* Display */ -GPIO(DP_CONN_OC_ODL, PIN(2, 5), GPIO_INPUT) - +GPIO(EC_OVERRIDE_SCLR_EN, PIN(D, 4), GPIO_OUT_HIGH) + +/* TODO(b/260063632): the gpio pin control is wip, setting to level high + to enable the backlight by default */ +GPIO(EC_12VSC_EN, PIN(D, 2), GPIO_OUT_HIGH) + +GPIO(OSD_STS, PIN(4, 1), GPIO_INPUT) +GPIO(DISP_MODE, PIN(A, 0), GPIO_INPUT) +GPIO(PANEL_PWR_STS, PIN(9, 5), GPIO_INPUT) +GPIO(EN_SCLR_RAILS, PIN(0, 4), GPIO_INPUT) +GPIO(HDMI_5V_IN, PIN(9, 3), GPIO_INPUT) +GPIO(HDMI0_CABLE_DET, PIN(9, 6), GPIO_INPUT) +GPIO(WP_EC, PIN(C, 3), GPIO_INPUT) +GPIO(OSD_INT, PIN(0, 5), GPIO_INPUT) + +/* Audio */ +/* TODO(b/260063632): the gpio pin control is wip, setting to level high + to enable the speaker by default */ +GPIO(EC_AMP_SD, PIN(5, 6), GPIO_OUT_HIGH) /* BarrelJack */ GPIO(EN_PPVAR_BJ_ADP_L, PIN(0, 7), GPIO_OUT_LOW) @@ -79,17 +87,6 @@ GPIO(CPU_C10_GATE_L, PIN(6, 7), GPIO_INPUT) GPIO(EC_PCH_PWR_BTN_ODL, PIN(C, 1), GPIO_ODR_HIGH) GPIO(GSC_EC_RECOVERY_BTN_OD, PIN(2, 2), GPIO_INPUT) -/* NFC */ -/* TODO(b/194068530): Enable NFC */ -GPIO(NFC_COIL_ACT_L, PIN(D, 4), GPIO_INPUT) -GPIO(NFC_LOW_POWER_MODE, PIN(9, 5), GPIO_OUT_HIGH) -GPIO(NFC_CARD_DET_L, PIN(A, 3), GPIO_INPUT) -GPIO(EN_NFC_BUZZER, PIN(0, 5), GPIO_OUT_LOW) - -/* Wireless Charger */ -GPIO(EC_QI_PWR, PIN(D, 2), GPIO_OUT_LOW) -GPIO(QI_RESET_L, PIN(9, 3), GPIO_OUT_HIGH) - /* HDMI CEC */ /* TODO(b/197474873): Enable HDMI CEC */ GPIO(HDMI_CEC_IN, PIN(4, 0), GPIO_INPUT) @@ -97,20 +94,16 @@ GPIO(HDMI_CEC_OUT, PIN(D, 3), GPIO_OUT_HIGH | GPIO_OPEN_DRAIN) GPIO(HDMI_CEC_PULL_UP, PIN(C, 2), GPIO_OUT_HIGH) /* I2C SCL/SDA */ -GPIO(EC_I2C_QI_SCL, PIN(3, 3), GPIO_INPUT) -GPIO(EC_I2C_QI_SDA, PIN(3, 6), GPIO_INPUT) +GPIO(SMSCALER_CLK, PIN(3, 3), GPIO_INPUT) +GPIO(SMSCALER_DATA, PIN(3, 6), GPIO_INPUT) 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_DP_SCL, PIN(B, 5), GPIO_INPUT) -GPIO(EC_I2C_DP_SDA, PIN(B, 4), GPIO_INPUT) -GPIO(EC_I2C_USB_C0_C2_PPC_SCL, PIN(9, 2), GPIO_INPUT) -GPIO(EC_I2C_USB_C0_C2_PPC_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_C1_MIX_SCL, PIN(E, 4), GPIO_INPUT) -GPIO(EC_I2C_USB_C1_MIX_SDA, PIN(E, 3), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_PPC_BC_SCL, PIN(9, 2), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_PPC_BC_SDA, PIN(9, 1), GPIO_INPUT) +GPIO(EC_I2C_USB_C1_PPC_BC_SCL, PIN(D, 1), GPIO_INPUT) +GPIO(EC_I2C_USB_C1_PPC_BC_SDA, PIN(D, 0), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_TCPC_SCL, PIN(9, 0), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_TCPC_SDA, PIN(8, 7), GPIO_INPUT) GPIO(EC_I2C_USB_C1_TCPC_SCL, PIN(F, 3), GPIO_INPUT) GPIO(EC_I2C_USB_C1_TCPC_SDA, PIN(F, 2), GPIO_INPUT) @@ -128,36 +121,26 @@ GPIO(USB_A_OC_SOC_L, PIN(8, 0), GPIO_OUT_HIGH) /* LED */ /* TODO(b/197471359): LED implementation */ -GPIO(LED_GREEN_L, PIN(C, 3), GPIO_OUT_LOW) GPIO(LED_RED_L, PIN(C, 4), GPIO_OUT_LOW) /* USBC */ -GPIO(USB_C0_C2_TCPC_RST_ODL, PIN(A, 7), GPIO_ODR_LOW) +GPIO(USB_C0_FRS_EN, PIN(9, 7), GPIO_OUT_LOW) +GPIO(USB_C0_RT_RST_L, PIN(A, 7), GPIO_OUT_HIGH) GPIO(USB_C1_FRS_EN, PIN(9, 4), GPIO_OUT_LOW) -GPIO(USB_C1_RT_INT_ODL, PIN(A, 0), GPIO_INPUT) -GPIO(USB_C1_RT_RST_R_L, PIN(0, 2), GPIO_OUT_LOW) +GPIO(USB_C1_RT_RST_L, PIN(0, 2), GPIO_OUT_HIGH) /* GPIO02_P2 to PU */ /* GPIO03_P2 to PU */ -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) /* GPIO07_P2 to PU */ /* UART alternate functions */ ALTERNATE(PIN_MASK(6, 0x30), 0, MODULE_UART, 0) /* GPIO64/CR_SIN1, GPO65/CR_SOUT1/FLPRG1_L */ /* I2C alternate functions */ -ALTERNATE(PIN_MASK(3, 0x48), 0, MODULE_I2C, 0) /* GPIO33/I2C5_SCL0/CTS_L, GPIO36/RTS_L/I2C5_SDA0 */ +ALTERNATE(PIN_MASK(3, 0x48), 0, MODULE_I2C, 0) /* GPIO36/RTS_L/I2C5_SDA0, GPIO33/I2C5_SCL0/CTS_L */ ALTERNATE(PIN_MASK(8, 0x80), 0, MODULE_I2C, 0) /* GPIO87/I2C1_SDA0 */ ALTERNATE(PIN_MASK(9, 0x07), 0, MODULE_I2C, 0) /* GPIO92/I2C2_SCL0, GPIO91/I2C2_SDA0, GPIO90/I2C1_SCL0 */ ALTERNATE(PIN_MASK(B, 0x0c), 0, MODULE_I2C, 0) /* GPIOB3/I2C7_SCL0/DCD_L, GPIOB2/I2C7_SDA0/DSR_L */ -ALTERNATE(PIN_MASK(B, 0x30), 0, MODULE_I2C, 0) /* GPIOB5/I2C0_SCL0, GPIOB4/I2C0_SDA0 */ ALTERNATE(PIN_MASK(D, 0x03), 0, MODULE_I2C, 0) /* GPIOD1/I2C3_SCL0, GPIOD0/I2C3_SDA0 */ ALTERNATE(PIN_MASK(E, 0x18), 0, MODULE_I2C, 0) /* GPIOE4/I2C6_SCL1/I3C_SCL, GPIOE3/I2C6_SDA1/I3C_SDA */ ALTERNATE(PIN_MASK(F, 0x0c), 0, MODULE_I2C, 0) /* GPIOF3/I2C4_SCL1, GPIOF2/I2C4_SDA1 */ @@ -178,10 +161,14 @@ UNUSED(PIN(3, 2)) /* GPO32/TRIS_L */ UNUSED(PIN(3, 5)) /* GPO35/CR_SOUT4/TEST_L */ UNUSED(PIN(6, 6)) /* GPIO66 */ UNUSED(PIN(8, 1)) /* GPIO81/PECI_DATA */ -UNUSED(PIN(5, 6)) /* GPIO56/CLKRUN# */ -UNUSED(PIN(9, 7)) /* GPIO97 */ UNUSED(PIN(8, 6)) /* GPIO86/TXD/CR_SOUT2 */ UNUSED(PIN(1, 3)) /* KSO06/GPO13/GP_SEL# */ UNUSED(PIN(1, 2)) /* KSO07/GPO12/JEN# */ UNUSED(PIN(0, 6)) /* KSO11/GPIO06/P80_CLK */ -UNUSED(PIN(0, 4)) /* KSO13/GPIO04 */ +UNUSED(PIN(B, 4)) /* GPIOB4/I2C0_SDA0 */ +UNUSED(PIN(2, 5)) /* KSI4/GPIO25/TRACECLK/GP_SCLK */ +UNUSED(PIN(B, 5)) /* GPIOB5/I2C0_SCL0 */ +UNUSED(PIN(8, 3)) /* KSO15/GPIO83 */ +UNUSED(PIN(B, 1)) /* KSO17/GPIOB1/CR_SIN4 */ +UNUSED(PIN(7, 0)) /* GPIO70/PS2_DAT0 */ +UNUSED(PIN(A, 3)) /* SPIP_MOSI/GPIOA3 */ diff --git a/board/gaelin/i2c.c b/board/gaelin/i2c.c index 0a0b6b69a6..f9bfa11657 100644 --- a/board/gaelin/i2c.c +++ b/board/gaelin/i2c.c @@ -11,60 +11,44 @@ /* I2C port map configuration */ const struct i2c_port_t i2c_ports[] = { { - /* I2C0 */ - .name = "dp_redriver", - .port = I2C_PORT_DP_REDRIVER, - .kbps = 400, - .scl = GPIO_EC_I2C_DP_SCL, - .sda = GPIO_EC_I2C_DP_SDA, - }, - { /* I2C1 */ - .name = "tcpc0,2", - .port = I2C_PORT_USB_C0_C2_TCPC, + .name = "tcpc0", + .port = I2C_PORT_USB_C0_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_TCPC_SCL, + .sda = GPIO_EC_I2C_USB_C0_TCPC_SDA, }, { /* I2C2 */ - .name = "ppc0,2", - .port = I2C_PORT_USB_C0_C2_PPC, + .name = "ppc0", + .port = I2C_PORT_USB_C0_PPC, .kbps = 1000, - .scl = GPIO_EC_I2C_USB_C0_C2_PPC_SCL, - .sda = GPIO_EC_I2C_USB_C0_C2_PPC_SDA, + .scl = GPIO_EC_I2C_USB_C0_PPC_BC_SCL, + .sda = GPIO_EC_I2C_USB_C0_PPC_BC_SDA, }, { /* I2C3 */ - .name = "retimer0,2", - .port = I2C_PORT_USB_C0_C2_MUX, + .name = "ppc1", + .port = I2C_PORT_USB_C1_PPC, .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_C1_PPC_BC_SCL, + .sda = GPIO_EC_I2C_USB_C1_PPC_BC_SDA, }, { - /* I2C4 C1 TCPC */ + /* I2C4 */ .name = "tcpc1", .port = I2C_PORT_USB_C1_TCPC, - .kbps = 400, + .kbps = 1000, .scl = GPIO_EC_I2C_USB_C1_TCPC_SCL, .sda = GPIO_EC_I2C_USB_C1_TCPC_SDA, }, { /* I2C5 */ - .name = "wireless_charger", - .port = I2C_PORT_QI, + .name = "scaler", + .port = I2C_PORT_SCALER, .kbps = 400, - .scl = GPIO_EC_I2C_QI_SCL, - .sda = GPIO_EC_I2C_QI_SDA, - }, - { - /* I2C6 */ - .name = "ppc1", - .port = I2C_PORT_USB_C1_PPC, - .kbps = 1000, - .scl = GPIO_EC_I2C_USB_C1_MIX_SCL, - .sda = GPIO_EC_I2C_USB_C1_MIX_SDA, + .scl = GPIO_SMSCALER_CLK, + .sda = GPIO_SMSCALER_DATA, }, { /* I2C7 */ diff --git a/board/gaelin/led.c b/board/gaelin/led.c index 842cee0530..a4b9a0d094 100644 --- a/board/gaelin/led.c +++ b/board/gaelin/led.c @@ -249,8 +249,8 @@ int led_set_brightness(enum ec_led_id id, const uint8_t *brightness) else return set_color(id, LED_OFF, 0); } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* Blink alert if insufficient power per system_can_boot_ap(). */ int insufficient_power = diff --git a/board/gaelin/pwm.c b/board/gaelin/pwm.c index 3d4335f453..fe7e82894a 100644 --- a/board/gaelin/pwm.c +++ b/board/gaelin/pwm.c @@ -16,8 +16,8 @@ const struct pwm_t pwm_channels[] = { PWM_CONFIG_DSLEEP, .freq = 2000 }, [PWM_CH_FAN] = { .channel = 5, - .flags = PWM_CONFIG_OPEN_DRAIN | PWM_CONFIG_DSLEEP, - .freq = 1000 }, + .flags = PWM_CONFIG_OPEN_DRAIN, + .freq = 25000 }, [PWM_CH_LED_RED] = { .channel = 2, .flags = PWM_CONFIG_ACTIVE_LOW | PWM_CONFIG_DSLEEP, .freq = 2000 }, diff --git a/board/gaelin/thermal.c b/board/gaelin/thermal.c new file mode 100644 index 0000000000..e15e0043e1 --- /dev/null +++ b/board/gaelin/thermal.c @@ -0,0 +1,140 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "chipset.h" +#include "common.h" +#include "console.h" +#include "fan.h" +#include "hooks.h" +#include "host_command.h" +#include "temp_sensor.h" +#include "thermal.h" +#include "util.h" + +/* Console output macros */ +#define CPUTS(outstr) cputs(CC_THERMAL, outstr) +#define CPRINTS(format, args...) cprints(CC_THERMAL, format, ##args) + +struct fan_step { + /* + * Sensor 1~4 trigger point, set -1 if we're not using this + * sensor to determine fan speed. + */ + int8_t on[TEMP_SENSOR_COUNT]; + /* + * Sensor 1~4 trigger point, set -1 if we're not using this + * sensor to determine fan speed. + */ + int8_t off[TEMP_SENSOR_COUNT]; + /* Fan rpm */ + int16_t rpm[FAN_CH_COUNT]; +}; + +static const struct fan_step fan_table[] = { + { + /* level 0 */ + .on = { 65, -1, -1, -1 }, + .off = { 0, -1, -1, -1 }, + .rpm = { 2350 }, + }, + { + /* level 1 */ + .on = { 80, -1, -1, -1 }, + .off = { 60, -1, -1, -1 }, + .rpm = { 2350 }, + }, + { + /* level 2 */ + .on = { 87, -1, -1, -1 }, + .off = { 75, -1, -1, -1 }, + .rpm = { 3250 }, + }, + { + /* level 3 */ + .on = { 91, -1, -1, -1 }, + .off = { 82, -1, -1, -1 }, + .rpm = { 3750 }, + }, + { + /* level 4 */ + .on = { 100, -1, -1, -1 }, + .off = { 86, -1, -1, -1 }, + .rpm = { 4100 }, + }, +}; +const int num_fan_levels = ARRAY_SIZE(fan_table); + +int fan_table_to_rpm(int fan, int *temp, enum temp_sensor_id temp_sensor) +{ + /* current fan level */ + static int current_level; + /* previous fan level */ + static int prev_current_level; + /* previous sensor temperature */ + static int prev_temp[TEMP_SENSOR_COUNT]; + int i; + int new_rpm = 0; + + /* + * Compare the current and previous temperature, we have + * the three paths: + * 1. decreasing path. (check the release point) + * 2. increasing path. (check the trigger point) + * 3. invariant path. (return the current RPM) + */ + if (temp[temp_sensor] < prev_temp[temp_sensor]) { + for (i = current_level; i > 0; i--) { + if (temp[temp_sensor] < fan_table[i].off[temp_sensor]) + current_level = i - 1; + else + break; + } + } else if (temp[temp_sensor] > prev_temp[temp_sensor]) { + for (i = current_level; i < num_fan_levels; i++) { + if (temp[temp_sensor] > fan_table[i].on[temp_sensor]) + current_level = i + 1; + else + break; + } + } + + if (current_level < 0) + current_level = 0; + if (current_level >= num_fan_levels) + current_level = num_fan_levels - 1; + + if (current_level != prev_current_level) { + CPRINTS("temp: %d, prev_temp: %d", temp[temp_sensor], + prev_temp[temp_sensor]); + CPRINTS("current_level: %d", current_level); + } + + prev_temp[temp_sensor] = temp[temp_sensor]; + prev_current_level = current_level; + + switch (fan) { + case FAN_CH_0: + new_rpm = fan_table[current_level].rpm[FAN_CH_0]; + break; + default: + break; + } + + return new_rpm; +} + +void board_override_fan_control(int fan, int *temp) +{ + if (chipset_in_state(CHIPSET_STATE_ON)) { + fan_set_rpm_mode(FAN_CH(fan), 1); + fan_set_rpm_target(FAN_CH(fan), + fan_table_to_rpm(FAN_CH(fan), temp, + TEMP_SENSOR_1_CPU)); + } else if (chipset_in_state(CHIPSET_STATE_ANY_SUSPEND)) { + /* Stop fan when enter S0ix */ + fan_set_rpm_mode(FAN_CH(fan), 1); + fan_set_rpm_target(FAN_CH(fan), 0); + } +} diff --git a/board/gaelin/usbc_config.c b/board/gaelin/usbc_config.c index 806ff2c4ee..98595fc607 100644 --- a/board/gaelin/usbc_config.c +++ b/board/gaelin/usbc_config.c @@ -10,17 +10,13 @@ #include "compile_time_macros.h" #include "console.h" #include "driver/bc12/pi3usb9201_public.h" -#include "driver/ppc/syv682x_public.h" -#include "driver/retimer/bb_retimer_public.h" -#include "driver/retimer/kb800x.h" -#include "driver/tcpm/nct38xx.h" -#include "driver/tcpm/rt1715.h" +#include "driver/ppc/nx20p348x.h" +#include "driver/tcpm/ps8xxx_public.h" #include "driver/tcpm/tcpci.h" #include "ec_commands.h" #include "gpio.h" #include "gpio_signal.h" #include "hooks.h" -#include "ioexpander.h" #include "system.h" #include "task.h" #include "task_id.h" @@ -40,29 +36,22 @@ 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, - .addr_flags = NCT38XX_I2C_ADDR1_1_FLAGS, + .port = I2C_PORT_USB_C0_TCPC, + .addr_flags = PS8XXX_I2C_ADDR1_FLAGS, }, - .drv = &nct38xx_tcpm_drv, + .drv = &ps8xxx_tcpm_drv, .flags = TCPC_FLAGS_TCPCI_REV2_0 | - TCPC_FLAGS_NO_DEBUG_ACC_CONTROL, + TCPC_FLAGS_TCPCI_REV2_0_NO_VSAFE0V, }, [USBC_PORT_C1] = { .bus_type = EC_BUS_TYPE_I2C, .i2c_info = { .port = I2C_PORT_USB_C1_TCPC, - .addr_flags = RT1715_I2C_ADDR_FLAGS, + .addr_flags = PS8XXX_I2C_ADDR2_FLAGS, }, - .drv = &rt1715_tcpm_drv, - }, - [USBC_PORT_C2] = { - .bus_type = EC_BUS_TYPE_I2C, - .i2c_info = { - .port = I2C_PORT_USB_C0_C2_TCPC, - .addr_flags = NCT38XX_I2C_ADDR2_1_FLAGS, - }, - .drv = &nct38xx_tcpm_drv, - .flags = TCPC_FLAGS_TCPCI_REV2_0, + .drv = &ps8xxx_tcpm_drv, + .flags = TCPC_FLAGS_TCPCI_REV2_0 | + TCPC_FLAGS_TCPCI_REV2_0_NO_VSAFE0V, }, }; BUILD_ASSERT(ARRAY_SIZE(tcpc_config) == USBC_PORT_COUNT); @@ -71,19 +60,16 @@ BUILD_ASSERT(CONFIG_USB_PD_PORT_MAX_COUNT == USBC_PORT_COUNT); /* USBC PPC configuration */ struct ppc_config_t ppc_chips[] = { [USBC_PORT_C0] = { - .i2c_port = I2C_PORT_USB_C0_C2_PPC, - .i2c_addr_flags = SYV682X_ADDR0_FLAGS, - .drv = &syv682x_drv, + /* Compatible with Silicon Mitus SM5360A */ + .i2c_port = I2C_PORT_USB_C0_PPC, + .i2c_addr_flags = NX20P3483_ADDR2_FLAGS, + .drv = &nx20p348x_drv, }, [USBC_PORT_C1] = { + /* Compatible with Silicon Mitus SM5360A */ .i2c_port = I2C_PORT_USB_C1_PPC, - .i2c_addr_flags = SYV682X_ADDR0_FLAGS, - .drv = &syv682x_drv, - }, - [USBC_PORT_C2] = { - .i2c_port = I2C_PORT_USB_C0_C2_PPC, - .i2c_addr_flags = SYV682X_ADDR2_FLAGS, - .drv = &syv682x_drv, + .i2c_addr_flags = NX20P3483_ADDR3_FLAGS, + .drv = &nx20p348x_drv, }, }; BUILD_ASSERT(ARRAY_SIZE(ppc_chips) == USBC_PORT_COUNT); @@ -95,200 +81,100 @@ static const struct usb_mux_chain usbc0_tcss_usb_mux = { .mux = &(const struct usb_mux){ .usb_port = USBC_PORT_C0, - .driver = &virtual_usb_mux_driver, - .hpd_update = &virtual_hpd_update, + .driver = &tcpci_tcpm_usb_mux_driver, + .hpd_update = &ps8xxx_tcpc_update_hpd_status, }, }; static const struct usb_mux_chain usbc1_tcss_usb_mux = { .mux = &(const struct usb_mux){ .usb_port = USBC_PORT_C1, - .driver = &virtual_usb_mux_driver, - .hpd_update = &virtual_hpd_update, + .driver = &tcpci_tcpm_usb_mux_driver, + .hpd_update = &ps8xxx_tcpc_update_hpd_status, }, }; -static const struct usb_mux_chain usbc2_tcss_usb_mux = { - .mux = - &(const struct usb_mux){ - .usb_port = USBC_PORT_C2, - .driver = &virtual_usb_mux_driver, - .hpd_update = &virtual_hpd_update, - }, -}; - -struct kb800x_control_t kb800x_control[] = { - [USBC_PORT_C0] = { - }, - [USBC_PORT_C1] = { - .retimer_rst_gpio = GPIO_USB_C1_RT_RST_R_L, - .ss_lanes = { - [KB800X_A0] = KB800X_TX0, [KB800X_A1] = KB800X_RX0, - [KB800X_B0] = KB800X_RX1, [KB800X_B1] = KB800X_TX1, - [KB800X_C0] = KB800X_RX0, [KB800X_C1] = KB800X_TX0, - [KB800X_D0] = KB800X_TX1, [KB800X_D1] = KB800X_RX1, - } - }, - [USBC_PORT_C2] = { - }, -}; -BUILD_ASSERT(ARRAY_SIZE(kb800x_control) == USBC_PORT_COUNT); const struct usb_mux_chain usb_muxes[] = { [USBC_PORT_C0] = { .mux = &(const struct usb_mux) { .usb_port = USBC_PORT_C0, - .driver = &bb_usb_retimer, - .hpd_update = bb_retimer_hpd_update, - .i2c_port = I2C_PORT_USB_C0_C2_MUX, - .i2c_addr_flags = USBC_PORT_C0_BB_RETIMER_I2C_ADDR, + .driver = &virtual_usb_mux_driver, + .hpd_update = &virtual_hpd_update, }, .next = &usbc0_tcss_usb_mux, }, [USBC_PORT_C1] = { .mux = &(const struct usb_mux) { .usb_port = USBC_PORT_C1, - .driver = &kb800x_usb_mux_driver, - .i2c_port = I2C_PORT_USB_C1_MUX, - .i2c_addr_flags = KB800X_I2C_ADDR0_FLAGS, + .driver = &virtual_usb_mux_driver, + .hpd_update = &virtual_hpd_update, }, .next = &usbc1_tcss_usb_mux, }, - [USBC_PORT_C2] = { - .mux = &(const struct usb_mux) { - .usb_port = USBC_PORT_C2, - .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 = &usbc2_tcss_usb_mux, - }, }; 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_BC12, .i2c_addr_flags = PI3USB9201_I2C_ADDR_3_FLAGS, }, [USBC_PORT_C1] = { .i2c_port = I2C_PORT_USB_C1_BC12, - .i2c_addr_flags = PI3USB9201_I2C_ADDR_3_FLAGS, - }, - [USBC_PORT_C2] = { - .i2c_port = I2C_PORT_USB_C0_C2_BC12, - .i2c_addr_flags = PI3USB9201_I2C_ADDR_1_FLAGS, + .i2c_addr_flags = PI3USB9201_I2C_ADDR_2_FLAGS, }, }; BUILD_ASSERT(ARRAY_SIZE(pi3usb9201_bc12_chips) == USBC_PORT_COUNT); -/* - * USB C0 and C2 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 - * reset, so we need to start in disabled mode, then explicitly - * call ioex_init(). - */ - -struct ioexpander_config_t ioex_config[] = { - [IOEX_C0_NCT38XX] = { - .i2c_host_port = I2C_PORT_USB_C0_C2_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, - .drv = &nct38xx_ioexpander_drv, - .flags = IOEX_FLAGS_DEFAULT_INIT_DISABLED, - }, -}; -BUILD_ASSERT(ARRAY_SIZE(ioex_config) == CONFIG_IO_EXPANDER_PORT_COUNT); - -__override int bb_retimer_power_enable(const struct usb_mux *me, bool enable) +static void ps8815_reset(int port) { - enum ioex_signal rst_signal; - - 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; + int val; + int i2c_port; + uint16_t i2c_addr_flags; + enum gpio_signal ps8xxx_rst_odl; + + if (port == USBC_PORT_C0) { + ps8xxx_rst_odl = GPIO_USB_C0_RT_RST_L; + i2c_port = I2C_PORT_USB_C0_TCPC; + i2c_addr_flags = PS8XXX_I2C_ADDR1_FLAGS; + } else if (port == USBC_PORT_C1) { + ps8xxx_rst_odl = GPIO_USB_C1_RT_RST_L; + i2c_port = I2C_PORT_USB_C1_TCPC; + i2c_addr_flags = PS8XXX_I2C_ADDR2_FLAGS; } else { - return EC_ERROR_INVAL; + return; } - /* - * We do not have a load switch for the burnside bridge chips, - * so we only need to sequence reset. - */ + gpio_set_level(ps8xxx_rst_odl, 0); + msleep(GENERIC_MAX(PS8XXX_RESET_DELAY_MS, PS8815_PWR_H_RST_H_DELAY_MS)); + gpio_set_level(ps8xxx_rst_odl, 1); + msleep(PS8815_FW_INIT_DELAY_MS); - if (enable) { - /* - * Tpw, minimum time from VCC to RESET_N de-assertion is 100us. - * For boards that don't provide a load switch control, the - * retimer_init() function ensures power is up before calling - * this function. - */ - ioex_set_level(rst_signal, 1); - /* - * Allow 1ms time for the retimer to power up lc_domain - * which powers I2C controller within retimer - */ - msleep(1); - } else { - ioex_set_level(rst_signal, 0); - msleep(1); + CPRINTS("[C%d] %s: patching ps8815 registers", port, __func__); + + if (i2c_read8(i2c_port, i2c_addr_flags, 0x0f, &val) == EC_SUCCESS) + CPRINTS("ps8815: reg 0x0f was %02x", val); + else { + CPRINTS("delay 10ms to make sure ps8815 is waken from idle"); + msleep(10); } - return EC_SUCCESS; -} -__override int bb_retimer_reset(const struct usb_mux *me) -{ - /* - * TODO(b/193402306, b/195375738): Remove this once transition to - * QS Silicon is complete - */ - bb_retimer_power_enable(me, false); - msleep(5); - bb_retimer_power_enable(me, true); - msleep(25); + if (i2c_write8(i2c_port, i2c_addr_flags, 0x0f, 0x31) == EC_SUCCESS) + CPRINTS("ps8815: reg 0x0f set to 0x31"); - return EC_SUCCESS; + if (i2c_read8(i2c_port, i2c_addr_flags, 0x0f, &val) == EC_SUCCESS) + CPRINTS("ps8815: reg 0x0f now %02x", val); } void board_reset_pd_mcu(void) { - enum gpio_signal tcpc_rst; - - tcpc_rst = GPIO_USB_C0_C2_TCPC_RST_ODL; - - /* - * TODO(b/179648104): figure out correct timing - */ - - gpio_set_level(tcpc_rst, 0); - gpio_set_level(GPIO_USB_C1_RT_RST_R_L, 0); - - /* - * delay for power-on to reset-off and min. assertion time - */ - - msleep(20); - - gpio_set_level(tcpc_rst, 1); - gpio_set_level(GPIO_USB_C1_RT_RST_R_L, 1); - - /* wait for chips to come up */ - - msleep(50); -} - -static void enable_ioex(int ioex) -{ - ioex_init(ioex); + ps8815_reset(USBC_PORT_C0); + usb_mux_hpd_update(USBC_PORT_C0, USB_PD_MUX_HPD_LVL_DEASSERTED | + USB_PD_MUX_HPD_IRQ_DEASSERTED); + ps8815_reset(USBC_PORT_C1); + usb_mux_hpd_update(USBC_PORT_C1, USB_PD_MUX_HPD_LVL_DEASSERTED | + USB_PD_MUX_HPD_IRQ_DEASSERTED); } static void board_tcpc_init(void) @@ -296,25 +182,19 @@ static void board_tcpc_init(void) /* Don't reset TCPCs after initial reset */ if (!system_jumped_late()) { board_reset_pd_mcu(); - - /* - * These IO expander pins are implemented using the - * C0/C2 TCPC, so they must be set up after the TCPC has - * been taken out of reset. - */ - enable_ioex(IOEX_C0_NCT38XX); - enable_ioex(IOEX_C2_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_C1_PPC_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C0_TCPC_INT_ODL); gpio_enable_interrupt(GPIO_USB_C1_TCPC_INT_ODL); + + /* Enable BC1.2 interrupts. */ + gpio_enable_interrupt(GPIO_USB_C0_BC12_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C1_BC12_INT_ODL); } DECLARE_HOOK(HOOK_INIT, board_tcpc_init, HOOK_PRIO_INIT_CHIPSET); @@ -322,8 +202,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_TCPC_INT_ODL) == 0) + status |= PD_STATUS_TCPC_ALERT_0; if (gpio_get_level(GPIO_USB_C1_TCPC_INT_ODL) == 0) status |= PD_STATUS_TCPC_ALERT_1; @@ -337,15 +217,13 @@ int ppc_get_alert_status(int port) return gpio_get_level(GPIO_USB_C0_PPC_INT_ODL) == 0; else if (port == USBC_PORT_C1) return gpio_get_level(GPIO_USB_C1_PPC_INT_ODL) == 0; - else if (port == USBC_PORT_C2) - return gpio_get_level(GPIO_USB_C2_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_TCPC_INT_ODL: schedule_deferred_pd_interrupt(USBC_PORT_C0); break; case GPIO_USB_C1_TCPC_INT_ODL: @@ -365,9 +243,6 @@ void bc12_interrupt(enum gpio_signal signal) case GPIO_USB_C1_BC12_INT_ODL: usb_charger_task_set_event(1, USB_CHG_EVENT_BC12); break; - case GPIO_USB_C2_BC12_INT_ODL: - usb_charger_task_set_event(2, USB_CHG_EVENT_BC12); - break; default: break; } @@ -377,13 +252,10 @@ void ppc_interrupt(enum gpio_signal signal) { switch (signal) { case GPIO_USB_C0_PPC_INT_ODL: - syv682x_interrupt(USBC_PORT_C0); + nx20p348x_interrupt(USBC_PORT_C0); break; case GPIO_USB_C1_PPC_INT_ODL: - syv682x_interrupt(USBC_PORT_C1); - break; - case GPIO_USB_C2_PPC_INT_ODL: - syv682x_interrupt(USBC_PORT_C2); + nx20p348x_interrupt(USBC_PORT_C1); break; default: break; @@ -401,16 +273,3 @@ __override bool board_is_dts_port(int port) { return port == USBC_PORT_C0; } - -__override bool board_is_tbt_usb4_port(int port) -{ - return true; -} - -__override enum tbt_compat_cable_speed board_get_max_tbt_speed(int port) -{ - if (!board_is_tbt_usb4_port(port)) - return TBT_SS_RES_0; - - return TBT_SS_TBT_GEN3; -} diff --git a/board/gaelin/usbc_config.h b/board/gaelin/usbc_config.h index 5e7beae21a..219ad9a745 100644 --- a/board/gaelin/usbc_config.h +++ b/board/gaelin/usbc_config.h @@ -8,13 +8,8 @@ #ifndef __CROS_EC_USBC_CONFIG_H #define __CROS_EC_USBC_CONFIG_H -#define CONFIG_USB_PD_PORT_MAX_COUNT 3 +#define CONFIG_USB_PD_PORT_MAX_COUNT 2 -enum usbc_port { - USBC_PORT_C0 = 0, - USBC_PORT_C1, - USBC_PORT_C2, - USBC_PORT_COUNT -}; +enum usbc_port { USBC_PORT_C0 = 0, USBC_PORT_C1, USBC_PORT_COUNT }; #endif /* __CROS_EC_USBC_CONFIG_H */ diff --git a/board/galtic/board.c b/board/galtic/board.c index af0638be20..9800c1150c 100644 --- a/board/galtic/board.c +++ b/board/galtic/board.c @@ -502,18 +502,6 @@ uint16_t tcpc_get_alert_status(void) return status; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * TODO(b/151955431): Characterize the input current limit in case a - * scaling needs to be applied here - */ - charge_set_input_current_limit(icl, charge_mv); -} - int board_is_sourcing_vbus(int port) { int regval; diff --git a/board/gelarshie/board.c b/board/gelarshie/board.c index 11346a3c7d..174e4b0764 100644 --- a/board/gelarshie/board.c +++ b/board/gelarshie/board.c @@ -511,6 +511,7 @@ void board_tcpc_init(void) /* Enable PPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_SWCTL_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C1_SWCTL_INT_ODL); /* Enable TCPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_PD_INT_ODL); @@ -682,8 +683,8 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* * Ignore lower charge ceiling on PD transition if our battery is @@ -695,9 +696,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, charge_ma = max_ma; } - charge_ma = charge_ma * 95 / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } uint16_t tcpc_get_alert_status(void) diff --git a/board/gelarshie/board.h b/board/gelarshie/board.h index 7e27c7a62f..737f005639 100644 --- a/board/gelarshie/board.h +++ b/board/gelarshie/board.h @@ -35,6 +35,7 @@ #undef CONFIG_CMD_ACCEL_FIFO #undef CONFIG_CMD_ACCEL_INFO #undef CONFIG_CMD_TASK_RESET +#undef CONFIG_CONSOLE_CMDHELP /* Battery */ #define CONFIG_BATTERY_DEVICE_CHEMISTRY "LION" @@ -42,6 +43,9 @@ #define CONFIG_BATTERY_FUEL_GAUGE #define CONFIG_BATTERY_VENDOR_PARAM +/* charger margin */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 + /* Enable PD3.0 */ #define CONFIG_USB_PD_REV30 /* BC 1.2 Charger */ diff --git a/board/gimble/board.c b/board/gimble/board.c index 0ca135b9fd..5373eb2bff 100644 --- a/board/gimble/board.c +++ b/board/gimble/board.c @@ -185,16 +185,3 @@ __overridable void board_ps8xxx_tcpc_init(int port) CPRINTS("ps8815: fail to write reg 0x%02x", PS8815_REG_RX_EQ_AT_5G); } - -__override void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - /* - * Follow OEM request to limit the input current to - * 90% negotiated limit. - */ - charge_ma = charge_ma * 90 / 100; - - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/gimble/board.h b/board/gimble/board.h index 015f3f78e6..1d4099e7eb 100644 --- a/board/gimble/board.h +++ b/board/gimble/board.h @@ -196,6 +196,8 @@ #define CONFIG_CHARGER_BQ25710_SENSE_RESISTOR 10 #define CONFIG_CHARGER_BQ25710_SENSE_RESISTOR_AC 10 #define CONFIG_CHARGER_BQ25710_PSYS_SENSING +/* OEM requested 10% derating */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 10 /* PROCHOT defines */ #define BATT_MAX_CONTINUE_DISCHARGE_WATT 45 diff --git a/board/gimble/charger.c b/board/gimble/charger.c index a4fa209246..7fabd2082e 100644 --- a/board/gimble/charger.c +++ b/board/gimble/charger.c @@ -81,10 +81,3 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } - -__overridable void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/gooey/board.c b/board/gooey/board.c index 250f6afd61..544117f9c6 100644 --- a/board/gooey/board.c +++ b/board/gooey/board.c @@ -259,19 +259,6 @@ uint16_t tcpc_get_alert_status(void) return status; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * b/147463641: The charger IC seems to overdraw ~4%, therefore we - * reduce our target accordingly. - */ - icl = icl * 96 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - __override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) { if (port < 0 || port > board_get_usb_pd_port_count()) diff --git a/board/gooey/board.h b/board/gooey/board.h index b586c0f334..fde32f8866 100644 --- a/board/gooey/board.h +++ b/board/gooey/board.h @@ -32,6 +32,11 @@ */ #undef CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE #define CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE (100 * MSEC) +/* + * b/147463641: The charger IC seems to overdraw ~4%, therefore we + * reduce our target accordingly. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 /* DAC for PSYS */ #define CONFIG_DAC diff --git a/board/haboki/board.c b/board/haboki/board.c index d7509115b5..8814871ed7 100644 --- a/board/haboki/board.c +++ b/board/haboki/board.c @@ -526,19 +526,17 @@ uint16_t tcpc_get_alert_status(void) return status; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - /* Limit C1 on board version 0 to 2.0 A */ if ((board_version == 0) && (port == 1)) - icl = MIN(icl, 2000); + charge_ma = MIN(charge_ma, 2000); /* * TODO(b/151955431): Characterize the input current limit in case a * scaling needs to be applied here */ - charge_set_input_current_limit(icl, charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } int board_set_active_charge_port(int port) diff --git a/board/hammer/board.h b/board/hammer/board.h index bce7dc39f4..dd4b337c66 100644 --- a/board/hammer/board.h +++ b/board/hammer/board.h @@ -83,7 +83,6 @@ #define CONFIG_LTO #define CONFIG_FORCE_CONSOLE_RESUME #define CONFIG_MATH_UTIL -#define CONFIG_STM_HWTIMER32 /* USB Configuration */ #define CONFIG_USB @@ -270,7 +269,7 @@ #ifdef BOARD_WAND /* Battery and charger options. */ #define CONFIG_CHARGER -#define CONFIG_CHARGER_INPUT_CURRENT 128 +#define CONFIG_CHARGER_DEFAULT_CURRENT_LIMIT 128 #define CONFIG_CHARGER_ISL9238 #define CONFIG_CHARGER_SENSE_RESISTOR 10 #define CONFIG_CHARGER_SENSE_RESISTOR_AC 20 diff --git a/board/hatch_fp/board.h b/board/hatch_fp/board.h index d36a9228c1..9e900a126a 100644 --- a/board/hatch_fp/board.h +++ b/board/hatch_fp/board.h @@ -235,7 +235,6 @@ #define CONFIG_SHA256 #define CONFIG_SHA256_UNROLLED #define CONFIG_SPI -#define CONFIG_STM_HWTIMER32 #define CONFIG_WP_ACTIVE_HIGH #define CONFIG_PANIC_STRIP_GPR diff --git a/board/hatch_fp/build.mk b/board/hatch_fp/build.mk index 828e7523b3..894c907ab9 100644 --- a/board/hatch_fp/build.mk +++ b/board/hatch_fp/build.mk @@ -29,6 +29,7 @@ test-list-y=\ abort \ aes \ always_memset \ + benchmark \ cec \ compile_time_macros \ cortexm_fpu \ @@ -39,6 +40,8 @@ test-list-y=\ flash_write_protect \ fpsensor \ fpsensor_hw \ + ftrapv \ + libc_printf \ mpu \ mutex \ panic \ @@ -46,6 +49,7 @@ test-list-y=\ pingpong \ printf \ queue \ + rng_benchmark \ rollback \ rollback_entropy \ rsa3 \ diff --git a/board/herobrine/usbc_config.c b/board/herobrine/usbc_config.c index 98d1b70bac..c80b00f0de 100644 --- a/board/herobrine/usbc_config.c +++ b/board/herobrine/usbc_config.c @@ -177,6 +177,7 @@ void board_tcpc_init(void) /* Enable PPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_SWCTL_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C1_SWCTL_INT_ODL); /* Enable TCPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_PD_INT_ODL); @@ -285,8 +286,8 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* * Ignore lower charge ceiling on PD transition if our battery is @@ -298,8 +299,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, charge_ma = max_ma; } - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } uint16_t tcpc_get_alert_status(void) diff --git a/board/hoho/board.h b/board/hoho/board.h index 7768ab7293..f6421fdaf0 100644 --- a/board/hoho/board.h +++ b/board/hoho/board.h @@ -15,7 +15,6 @@ #define CONFIG_UART_CONSOLE 1 /* Optional features */ -#define CONFIG_STM_HWTIMER32 #define CONFIG_ADC #define CONFIG_BOARD_PRE_INIT #define CONFIG_CMD_SPI_FLASH diff --git a/board/homestar/board.c b/board/homestar/board.c index ab4b95b625..11035d2034 100644 --- a/board/homestar/board.c +++ b/board/homestar/board.c @@ -459,6 +459,7 @@ void board_tcpc_init(void) /* Enable PPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_SWCTL_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C1_SWCTL_INT_ODL); /* Enable TCPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_PD_INT_ODL); @@ -630,8 +631,8 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* * Ignore lower charge ceiling on PD transition if our battery is @@ -643,9 +644,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, charge_ma = max_ma; } - charge_ma = charge_ma * 95 / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } uint16_t tcpc_get_alert_status(void) diff --git a/board/homestar/board.h b/board/homestar/board.h index 230aa6e7d3..60d943b300 100644 --- a/board/homestar/board.h +++ b/board/homestar/board.h @@ -27,6 +27,9 @@ #define CONFIG_BATTERY_FUEL_GAUGE #define CONFIG_BATTERY_VENDOR_PARAM +/* charger margin */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 + /* Enable PD3.0 */ #define CONFIG_USB_PD_REV30 diff --git a/board/host/charger.c b/board/host/charger.c index fddadf245d..0580ddcb41 100644 --- a/board/host/charger.c +++ b/board/host/charger.c @@ -136,7 +136,8 @@ static enum ec_error_list mock_set_input_current_limit(int chgnum, int current) static enum ec_error_list mock_post_init(int chgnum) { - mock_current = mock_input_current = CONFIG_CHARGER_INPUT_CURRENT; + mock_current = mock_input_current = + CONFIG_CHARGER_DEFAULT_CURRENT_LIMIT; return EC_SUCCESS; } diff --git a/board/hyperdebug/board.c b/board/hyperdebug/board.c index 37e41f66a9..66cd981dca 100644 --- a/board/hyperdebug/board.c +++ b/board/hyperdebug/board.c @@ -20,6 +20,8 @@ #include "usb-stream.h" #include "gpio_list.h" +#include <stdio.h> + void board_config_pre_init(void) { /* enable SYSCFG clock */ @@ -236,6 +238,26 @@ static void board_init(void) } DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT); +const char *board_read_serial(void) +{ + const uint32_t *stm32_unique_id = + (const uint32_t *)STM32_UNIQUE_ID_BASE; + static char serial[13]; + + // Compute 12 hex digits from three factory programmed 32-bit "Unique + // ID" words in a manner that has been observed to be consistent with + // how the STM DFU ROM bootloader presents its serial number. This + // means that the serial number of any particular HyperDebug board will + // remain the same as it enters and leaves DFU mode for software + // upgrade. + int rc = snprintf(serial, sizeof(serial), "%08X%04X", + stm32_unique_id[0] + stm32_unique_id[2], + stm32_unique_id[1] >> 16); + if (12 != rc) + return NULL; + return serial; +} + /** * Find a GPIO signal by name. * diff --git a/board/hyperdebug/board.h b/board/hyperdebug/board.h index 9d15311784..86c2c88ad0 100644 --- a/board/hyperdebug/board.h +++ b/board/hyperdebug/board.h @@ -36,7 +36,6 @@ #undef CONFIG_UART_RX_DMA /* Optional features */ -#define CONFIG_STM_HWTIMER32 #define CONFIG_HW_CRC #undef CONFIG_PVD /* diff --git a/board/icarus/board.c b/board/icarus/board.c index be464e3a77..4d145287a4 100644 --- a/board/icarus/board.c +++ b/board/icarus/board.c @@ -204,14 +204,6 @@ int board_set_active_charge_port(int charge_port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - charge_ma = (charge_ma * 95) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - int board_discharge_on_ac(int enable) { int ret, port; diff --git a/board/icarus/board.h b/board/icarus/board.h index 98b6da3fd5..ca1a236307 100644 --- a/board/icarus/board.h +++ b/board/icarus/board.h @@ -24,6 +24,7 @@ #define CONFIG_BATTERY_HW_PRESENT_CUSTOM #define CONFIG_CHARGER_PSYS +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define CONFIG_CHARGER_RUNTIME_CONFIG diff --git a/board/jacuzzi/board.c b/board/jacuzzi/board.c index 129b75f8e2..d9e88d3f80 100644 --- a/board/jacuzzi/board.c +++ b/board/jacuzzi/board.c @@ -244,14 +244,6 @@ int board_set_active_charge_port(int charge_port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - charge_ma = (charge_ma * 95) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - int board_discharge_on_ac(int enable) { int ret, port; diff --git a/board/jacuzzi/board.h b/board/jacuzzi/board.h index 0fd5f6496d..d5d0523790 100644 --- a/board/jacuzzi/board.h +++ b/board/jacuzzi/board.h @@ -34,6 +34,7 @@ #define CONFIG_BATTERY_HW_PRESENT_CUSTOM #define CONFIG_CHARGER_PSYS +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define CONFIG_CHARGER_RUNTIME_CONFIG diff --git a/board/kano/charger.c b/board/kano/charger.c index ab48a7338c..95227f753a 100644 --- a/board/kano/charger.c +++ b/board/kano/charger.c @@ -79,10 +79,3 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } - -__overridable void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/kappa/board.c b/board/kappa/board.c index c04b24d3ed..c00e375560 100644 --- a/board/kappa/board.c +++ b/board/kappa/board.c @@ -217,14 +217,6 @@ int board_set_active_charge_port(int charge_port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - charge_ma = (charge_ma * 95) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - int board_discharge_on_ac(int enable) { int ret, port; diff --git a/board/kappa/board.h b/board/kappa/board.h index 6b6461ae83..5c49053a7b 100644 --- a/board/kappa/board.h +++ b/board/kappa/board.h @@ -26,6 +26,7 @@ #define CONFIG_BATTERY_COUNT 1 #define CONFIG_CHARGER_PSYS +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define CONFIG_BC12_DETECT_PI3USB9201 diff --git a/board/kappa/led.c b/board/kappa/led.c index 1dc86013d7..d9ecb33da0 100644 --- a/board/kappa/led.c +++ b/board/kappa/led.c @@ -129,6 +129,7 @@ static void led_set_battery(void) case PWR_STATE_FORCED_IDLE: led_set_color_battery((battery_ticks & 0x2) ? LED_AMBER : LED_OFF); + break; default: /* Other states don't alter LED behavior */ break; diff --git a/board/kingoftown/usbc_config.c b/board/kingoftown/usbc_config.c index f0f17e93a9..eafd55bcf2 100644 --- a/board/kingoftown/usbc_config.c +++ b/board/kingoftown/usbc_config.c @@ -225,6 +225,7 @@ void board_tcpc_init(void) /* Enable PPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_SWCTL_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C1_SWCTL_INT_ODL); /* Enable TCPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_PD_INT_ODL); @@ -333,8 +334,8 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* * Ignore lower charge ceiling on PD transition if our battery is @@ -346,8 +347,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, charge_ma = max_ma; } - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } uint16_t tcpc_get_alert_status(void) diff --git a/board/kinox/board.c b/board/kinox/board.c index 7c55fba876..7d9955e05f 100644 --- a/board/kinox/board.c +++ b/board/kinox/board.c @@ -100,8 +100,8 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { } diff --git a/board/kracko/board.c b/board/kracko/board.c index 136b05ea1e..47bf6a7687 100644 --- a/board/kracko/board.c +++ b/board/kracko/board.c @@ -582,19 +582,17 @@ uint16_t tcpc_get_alert_status(void) return status; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - /* Limit C1 on board version 0 to 2.0 A */ if ((board_version == 0) && (port == 1)) - icl = MIN(icl, 2000); + charge_ma = MIN(charge_ma, 2000); /* * TODO(b/151955431): Characterize the input current limit in case a * scaling needs to be applied here */ - charge_set_input_current_limit(icl, charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } int board_set_active_charge_port(int port) diff --git a/board/kuldax/led.c b/board/kuldax/led.c index 39b79e2196..2fabc26a9a 100644 --- a/board/kuldax/led.c +++ b/board/kuldax/led.c @@ -259,8 +259,8 @@ int led_set_brightness(enum ec_led_id id, const uint8_t *brightness) else return set_color(id, LED_OFF, 0); } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* Blink alert if insufficient power per system_can_boot_ap(). */ int insufficient_power = diff --git a/board/kuldax/sensors.c b/board/kuldax/sensors.c index 96f49de8a3..a41d5be713 100644 --- a/board/kuldax/sensors.c +++ b/board/kuldax/sensors.c @@ -46,11 +46,11 @@ const struct adc_t adc_channels[] = { .factor_mul = ADC_MAX_VOLT * 39, .factor_div = (ADC_READ_MAX + 1) * 5, }, - [ADC_PPVAR_IMON] = { /* 872.3 mV/A */ + [ADC_PPVAR_IMON] = { /* 20/(20+8.66)*50/200 */ .name = "PPVAR_IMON", .input_ch = NPCX_ADC_CH3, - .factor_mul = ADC_MAX_VOLT * 1433, - .factor_div = (ADC_READ_MAX + 1) * 1250, + .factor_mul = ADC_MAX_VOLT * 143, + .factor_div = (ADC_READ_MAX + 1) * 25, }, }; diff --git a/board/lalala/board.c b/board/lalala/board.c index 78404d6821..f0f354fcf3 100644 --- a/board/lalala/board.c +++ b/board/lalala/board.c @@ -397,19 +397,6 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * b/147463641: The charger IC seems to overdraw ~4%, therefore we - * reduce our target accordingly. - */ - icl = icl * 96 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - __override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) { if (port < 0 || port > board_get_usb_pd_port_count()) diff --git a/board/lalala/board.h b/board/lalala/board.h index 4967e49752..2996ad3613 100644 --- a/board/lalala/board.h +++ b/board/lalala/board.h @@ -33,6 +33,11 @@ #undef CONFIG_CMD_CHARGER_DUMP #undef CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE #define CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE (100 * MSEC) +/* + * b/147463641: The charger IC seems to overdraw ~4%, therefore we + * reduce our target accordingly. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 /* GPIO for C1 interrupts, for baseboard use */ #define GPIO_USB_C1_INT_ODL GPIO_SUB_USB_C1_INT_ODL diff --git a/board/lantis/board.c b/board/lantis/board.c index 08fc84e222..9917231474 100644 --- a/board/lantis/board.c +++ b/board/lantis/board.c @@ -719,18 +719,6 @@ uint16_t tcpc_get_alert_status(void) return status; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * TODO(b/151955431): Characterize the input current limit in case a - * scaling needs to be applied here - */ - charge_set_input_current_limit(icl, charge_mv); -} - int board_set_active_charge_port(int port) { int is_valid_port = (port >= 0 && port < board_get_usb_pd_port_count()); diff --git a/board/lazor/usbc_config.c b/board/lazor/usbc_config.c index 11cc649573..26a8a5692d 100644 --- a/board/lazor/usbc_config.c +++ b/board/lazor/usbc_config.c @@ -263,6 +263,7 @@ void board_tcpc_init(void) /* Enable PPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_SWCTL_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C1_SWCTL_INT_ODL); /* Enable TCPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_PD_INT_ODL); @@ -370,8 +371,8 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* * Ignore lower charge ceiling on PD transition if our battery is @@ -383,8 +384,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, charge_ma = max_ma; } - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } uint16_t tcpc_get_alert_status(void) diff --git a/board/lisbon/led.c b/board/lisbon/led.c index 842cee0530..a4b9a0d094 100644 --- a/board/lisbon/led.c +++ b/board/lisbon/led.c @@ -249,8 +249,8 @@ int led_set_brightness(enum ec_led_id id, const uint8_t *brightness) else return set_color(id, LED_OFF, 0); } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* Blink alert if insufficient power per system_can_boot_ap(). */ int insufficient_power = diff --git a/board/madoo/board.c b/board/madoo/board.c index eedf8e6fdd..77c939143a 100644 --- a/board/madoo/board.c +++ b/board/madoo/board.c @@ -312,20 +312,6 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * b/147463641: The charger IC seems to overdraw ~4%, therefore we - reduce - * our target accordingly. - */ - icl = icl * 96 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - __override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) { if (port < 0 || port > board_get_usb_pd_port_count()) diff --git a/board/madoo/board.h b/board/madoo/board.h index 82cfa30b0e..0d5e24c2a0 100644 --- a/board/madoo/board.h +++ b/board/madoo/board.h @@ -19,6 +19,11 @@ #define CONFIG_OCPC_DEF_RBATT_MOHMS \ 22 /* R_DS(on) 11.6mOhm + 10mOhm sns rstr \ */ +/* + * b/147463641: The charger IC seems to overdraw ~4%, therefore we + * reduce our target accordingly. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 #define CONFIG_OCPC #undef CONFIG_CHARGER_SINGLE_CHIP diff --git a/board/magolor/board.c b/board/magolor/board.c index bfa77375e5..3ddc1af3d1 100644 --- a/board/magolor/board.c +++ b/board/magolor/board.c @@ -415,6 +415,8 @@ void board_hibernate(void) if (board_get_charger_chip_count() > 1) raa489000_hibernate(1, true); raa489000_hibernate(0, true); + + msleep(1000); /* Wait for charger to enter low power mode */ } void board_reset_pd_mcu(void) @@ -593,19 +595,6 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * b/147463641: The charger IC seems to overdraw ~4%, therefore we - * reduce our target accordingly. - */ - icl = icl * 96 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - __override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) { if (port < 0 || port > board_get_usb_pd_port_count()) diff --git a/board/magolor/board.h b/board/magolor/board.h index 481856323f..beb2cc279c 100644 --- a/board/magolor/board.h +++ b/board/magolor/board.h @@ -45,6 +45,11 @@ #undef CONFIG_CMD_CHARGER_DUMP #undef CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE #define CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE (100 * MSEC) +/* + * b/147463641: The charger IC seems to overdraw ~4%, therefore we + * reduce our target accordingly. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 /* GPIO for C1 interrupts, for baseboard use */ #define GPIO_USB_C1_INT_ODL GPIO_SUB_C1_INT_EN_RAILS_ODL diff --git a/board/makomo/board.c b/board/makomo/board.c index 24b34d9a75..5a7158b58a 100644 --- a/board/makomo/board.c +++ b/board/makomo/board.c @@ -235,14 +235,6 @@ int board_set_active_charge_port(int charge_port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - charge_ma = (charge_ma * 95) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - int board_discharge_on_ac(int enable) { int ret, port; diff --git a/board/makomo/board.h b/board/makomo/board.h index bf705e9560..86e5e78862 100644 --- a/board/makomo/board.h +++ b/board/makomo/board.h @@ -27,6 +27,7 @@ #define CONFIG_BATTERY_HW_PRESENT_CUSTOM #define CONFIG_CHARGER_PSYS +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define CONFIG_CHARGER_RUNTIME_CONFIG diff --git a/board/marasov/battery.c b/board/marasov/battery.c new file mode 100644 index 0000000000..b974930d5b --- /dev/null +++ b/board/marasov/battery.c @@ -0,0 +1,77 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + * Battery pack vendor provided charging profile + */ + +#include "battery_fuel_gauge.h" +#include "cbi.h" +#include "common.h" +#include "compile_time_macros.h" +#include "gpio.h" +/* + * Battery info for all Brya battery types. Note that the fields + * start_charging_min/max and charging_min/max are not used for the charger. + * The effective temperature limits are given by discharging_min/max_c. + * + * Fuel Gauge (FG) parameters which are used for determining if the battery + * is connected, the appropriate ship mode (battery cutoff) command, and the + * charge/discharge FETs status. + * + * Ship mode (battery cutoff) requires 2 writes to the appropriate smart battery + * register. For some batteries, the charge/discharge FET bits are set when + * charging/discharging is active, in other types, these bits set mean that + * charging/discharging is disabled. Therefore, in addition to the mask for + * these bits, a disconnect value must be specified. Note that for TI fuel + * gauge, the charge/discharge FET status is found in Operation Status (0x54), + * but a read of Manufacturer Access (0x00) will return the lower 16 bits of + * Operation status which contains the FET status bits. + * + * The assumption for battery types supported is that the charge/discharge FET + * status can be read with a sb_read() command and therefore, only the register + * address, mask, and disconnect value need to be provided. + */ +const struct board_batt_params board_battery_info[] = { + /* C490-42 Battery Information */ + [BATTERY_C490] = { + .fuel_gauge = { + .manuf_name = "AS3GWQd3jB", + .device_name = "C490-42", + .ship_mode = { + .reg_addr = 0x00, + .reg_data = { 0x0010, 0x0010 }, + }, + .fet = { + .reg_addr = 0x99, + .reg_mask = 0x000c, + .disconnect_val = 0x000c, + } + }, + .batt_info = { + .voltage_max = 13200, /* mV */ + .voltage_normal = 11880, /* mV */ + .voltage_min = 9000, /* mV */ + .precharge_current = 256, /* mA */ + .start_charging_min_c = 0, + .start_charging_max_c = 45, + .charging_min_c = 0, + .charging_max_c = 60, + .discharging_min_c = -20, + .discharging_max_c = 60, + }, + }, +}; +BUILD_ASSERT(ARRAY_SIZE(board_battery_info) == BATTERY_TYPE_COUNT); + +const enum battery_type DEFAULT_BATTERY_TYPE = BATTERY_C490; + +enum battery_present battery_hw_present(void) +{ + enum gpio_signal batt_pres; + + batt_pres = GPIO_EC_BATT_PRES_ODL; + + /* The GPIO is low when the battery is physically present */ + return gpio_get_level(batt_pres) ? BP_NO : BP_YES; +} diff --git a/board/marasov/board.c b/board/marasov/board.c new file mode 100644 index 0000000000..e48dfaa163 --- /dev/null +++ b/board/marasov/board.c @@ -0,0 +1,52 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "button.h" +#include "cbi.h" +#include "charge_ramp.h" +#include "charger.h" +#include "common.h" +#include "console.h" +#include "driver/accelgyro_lsm6dso.h" +#include "driver/accel_lis2dw12.h" +#include "driver/als_tcs3400.h" +#include "fw_config.h" +#include "gpio.h" +#include "gpio_signal.h" +#include "hooks.h" +#include "lid_switch.h" +#include "power_button.h" +#include "power.h" +#include "registers.h" +#include "switch.h" +#include "tablet_mode.h" +#include "throttle_ap.h" +#include "usbc_config.h" + +#include "gpio_list.h" /* Must come after other header files. */ + +/* Console output macros */ +#define CPRINTF(format, args...) cprintf(CC_CHARGER, format, ##args) +#define CPRINTS(format, args...) cprints(CC_CHARGER, format, ##args) + +/* Called on AP S3 -> S0 transition */ +static void board_chipset_resume(void) +{ + /* Allow keyboard backlight to be enabled */ + + if (IS_ENABLED(CONFIG_PWM_KBLIGHT)) + gpio_set_level(GPIO_EC_KB_BL_EN_L, 0); +} +DECLARE_HOOK(HOOK_CHIPSET_RESUME, board_chipset_resume, HOOK_PRIO_DEFAULT); + +/* Called on AP S0 -> S3 transition */ +static void board_chipset_suspend(void) +{ + /* Turn off the keyboard backlight if it's on. */ + + if (IS_ENABLED(CONFIG_PWM_KBLIGHT)) + gpio_set_level(GPIO_EC_KB_BL_EN_L, 1); +} +DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, board_chipset_suspend, HOOK_PRIO_DEFAULT); diff --git a/board/marasov/board.h b/board/marasov/board.h new file mode 100644 index 0000000000..6cb0225edc --- /dev/null +++ b/board/marasov/board.h @@ -0,0 +1,217 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/* Brya board configuration */ + +#ifndef __CROS_EC_BOARD_H +#define __CROS_EC_BOARD_H + +#include "compile_time_macros.h" + +/* + * Early brya boards are not set up for vivaldi + */ +#undef CONFIG_KEYBOARD_VIVALDI + +/* Baseboard features */ +#include "baseboard.h" + +/* + * This will happen automatically on NPCX9 ES2 and later. Do not remove + * until we can confirm all earlier chips are out of service. + */ +#define CONFIG_HIBERNATE_PSL_VCC1_RST_WAKEUP + +#define CONFIG_MP2964 + +/* LED */ +#define CONFIG_LED_ONOFF_STATES +#define CONFIG_LED_ONOFF_STATES_BAT_LOW 10 + +#undef CONFIG_TABLET_MODE +#undef CONFIG_TABLET_MODE_SWITCH +#undef CONFIG_GMR_TABLET_MODE +#undef CONFIG_VOLUME_BUTTONS + +/* USB Type A Features */ +#define USB_PORT_COUNT 2 +#define CONFIG_USB_PORT_POWER_DUMB + +/* USB Type C and USB PD defines */ +#define CONFIG_USB_PD_REQUIRE_AP_MODE_ENTRY + +#define CONFIG_IO_EXPANDER +#define CONFIG_IO_EXPANDER_NCT38XX +#define CONFIG_IO_EXPANDER_PORT_COUNT 1 + +#define CONFIG_USB_PD_FRS_PPC + +#define CONFIG_USB_PD_TCPM_PS8815 +#define CONFIG_USB_PD_TCPM_PS8815_FORCE_DID +#define CONFIG_USBC_RETIMER_INTEL_BB +#undef CONFIG_BC12_DETECT_PI3USB9201 +#undef CONFIG_USB_CHARGER + +/* Battery Configuration */ +#define CONFIG_SMBUS_PEC +#undef CONFIG_BATT_HOST_FULL_FACTOR +#define CONFIG_BATT_HOST_FULL_FACTOR 99 + +/* I2C speed console command */ +#define CONFIG_CMD_I2C_SPEED + +/* I2C control host command */ +#define CONFIG_HOSTCMD_I2C_CONTROL + +#define CONFIG_USBC_PPC_SYV682X + +/* TODO: b/177608416 - measure and check these values on brya */ +#define PD_POWER_SUPPLY_TURN_ON_DELAY 30000 /* us */ +#define PD_POWER_SUPPLY_TURN_OFF_DELAY 30000 /* us */ +#define PD_VCONN_SWAP_DELAY 5000 /* us */ + +/* + * Passive USB-C cables only support up to 60W. + */ +#define PD_OPERATING_POWER_MW 15000 +#define PD_MAX_POWER_MW 60000 +#define PD_MAX_CURRENT_MA 3000 +#define PD_MAX_VOLTAGE_MV 20000 + +/* + * Macros for GPIO signals used in common code that don't match the + * schematic names. Signal names in gpio.inc match the schematic and are + * then redefined here to so it's more clear which signal is being used for + * which purpose. + */ +#define GPIO_AC_PRESENT GPIO_ACOK_OD +#define GPIO_CPU_PROCHOT GPIO_EC_PROCHOT_ODL +#define GPIO_EC_INT_L GPIO_EC_PCH_INT_ODL +#define GPIO_ENABLE_BACKLIGHT GPIO_EC_EN_EDP_BL +#define GPIO_ENTERING_RW GPIO_EC_ENTERING_RW +#define GPIO_KBD_KSO2 GPIO_EC_KSO_02_INV +#define GPIO_PACKET_MODE_EN GPIO_EC_GSC_PACKET_MODE +#define GPIO_PCH_PWRBTN_L GPIO_EC_PCH_PWR_BTN_ODL +#define GPIO_PCH_RSMRST_L GPIO_EC_PCH_RSMRST_L +#define GPIO_PCH_RTCRST GPIO_EC_PCH_RTCRST +#define GPIO_PCH_SLP_S0_L GPIO_SYS_SLP_S0IX_L +#define GPIO_PCH_SLP_S3_L GPIO_SLP_S3_L +#define GPIO_TEMP_SENSOR_POWER GPIO_SEQ_EC_DSW_PWROK + +/* + * GPIO_EC_PCH_INT_ODL is used for MKBP events as well as a PCH wakeup + * signal. + */ +#define GPIO_PCH_WAKE_L GPIO_EC_PCH_INT_ODL +#define GPIO_PG_EC_ALL_SYS_PWRGD GPIO_SEQ_EC_ALL_SYS_PG +#define GPIO_PG_EC_DSW_PWROK GPIO_SEQ_EC_DSW_PWROK +#define GPIO_PG_EC_RSMRST_ODL GPIO_SEQ_EC_RSMRST_ODL +#define GPIO_POWER_BUTTON_L GPIO_GSC_EC_PWR_BTN_ODL +#define GPIO_SYS_RESET_L GPIO_SYS_RST_ODL +#define GPIO_VOLUME_DOWN_L GPIO_EC_VOLDN_BTN_ODL +#define GPIO_VOLUME_UP_L GPIO_EC_VOLUP_BTN_ODL +#define GPIO_WP_L GPIO_EC_WP_ODL + +/* System has back-lit keyboard */ +#define CONFIG_PWM_KBLIGHT + +/* I2C Bus Configuration */ + +#define I2C_PORT_SENSOR NPCX_I2C_PORT0_0 + +#define I2C_PORT_USB_C0_TCPC NPCX_I2C_PORT1_0 +#define I2C_PORT_USB_C1_TCPC NPCX_I2C_PORT4_1 + +#define I2C_PORT_USB_C0_PPC NPCX_I2C_PORT2_0 +#define I2C_PORT_USB_C1_PPC NPCX_I2C_PORT6_1 + +#define I2C_PORT_USB_C0_MUX NPCX_I2C_PORT3_0 +#define I2C_PORT_USB_C1_MUX NPCX_I2C_PORT6_1 + +#define I2C_PORT_BATTERY NPCX_I2C_PORT5_0 +#define I2C_PORT_CHARGER NPCX_I2C_PORT7_0 +#define I2C_PORT_EEPROM NPCX_I2C_PORT7_0 +#define I2C_PORT_MP2964 NPCX_I2C_PORT7_0 + +#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 + +/* Enabling Thunderbolt-compatible mode */ +#define CONFIG_USB_PD_TBT_COMPAT_MODE + +/* Enabling USB4 mode */ +#define CONFIG_USB_PD_USB4 +#define CONFIG_USB_PD_DATA_RESET_MSG + +/* Retimer */ +#define CONFIG_USBC_RETIMER_FW_UPDATE + +/* Thermal features */ +#define CONFIG_THERMISTOR +#define CONFIG_TEMP_SENSOR +#define CONFIG_TEMP_SENSOR_POWER +#define CONFIG_STEINHART_HART_3V3_30K9_47K_4050B + +#define CONFIG_FANS FAN_CH_COUNT + +/* Charger defines */ +#define CONFIG_CHARGER_BQ25720 +#define CONFIG_CHARGER_BQ25720_VSYS_TH2_CUSTOM +#define CONFIG_CHARGER_BQ25720_VSYS_TH2_DV 70 +#define CONFIG_CHARGER_BQ25710_SENSE_RESISTOR 10 +#define CONFIG_CHARGER_BQ25710_SENSE_RESISTOR_AC 10 +#define CONFIG_CHARGER_BQ25710_PSYS_SENSING + +/* + * Older boards have a different ADC assignment. + */ + +#define CONFIG_ADC_CHANNELS_RUNTIME_CONFIG + +#ifndef __ASSEMBLER__ + +#include "gpio_signal.h" /* needed by registers.h */ +#include "registers.h" +#include "usbc_config.h" + +enum adc_channel { + ADC_TEMP_SENSOR_1_DDR_SOC, + ADC_TEMP_SENSOR_2_AMBIENT, + ADC_TEMP_SENSOR_3_CHARGER, + ADC_TEMP_SENSOR_4_WWAN, + ADC_CH_COUNT +}; + +enum temp_sensor_id { + TEMP_SENSOR_1_DDR_SOC, + TEMP_SENSOR_2_AMBIENT, + TEMP_SENSOR_3_CHARGER, + TEMP_SENSOR_4_WWAN, + TEMP_SENSOR_COUNT +}; + +enum ioex_port { IOEX_C0_NCT38XX = 0, IOEX_PORT_COUNT }; + +enum battery_type { BATTERY_C490, BATTERY_TYPE_COUNT }; + +enum pwm_channel { + PWM_CH_KBLIGHT, /* PWM3 */ + PWM_CH_FAN, /* PWM5 */ + PWM_CH_COUNT +}; + +enum fan_channel { FAN_CH_0 = 0, FAN_CH_COUNT }; + +enum mft_channel { MFT_CH_0 = 0, MFT_CH_COUNT }; + +#endif /* !__ASSEMBLER__ */ + +#endif /* __CROS_EC_BOARD_H */ diff --git a/board/marasov/build.mk b/board/marasov/build.mk new file mode 100644 index 0000000000..8b85854cf0 --- /dev/null +++ b/board/marasov/build.mk @@ -0,0 +1,25 @@ +# -*- makefile -*- +# Copyright 2022 The ChromiumOS Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +# +# Brya board specific files build +# + +CHIP:=npcx +CHIP_FAMILY:=npcx9 +CHIP_VARIANT:=npcx9m3f +BASEBOARD:=brya + +board-y= +board-y+=battery.o +board-y+=board.o +board-y+=charger.o +board-y+=fans.o +board-y+=fw_config.o +board-y+=i2c.o +board-y+=keyboard.o +board-y+=led.o +board-y+=pwm.o +board-y+=sensors.o +board-y+=usbc_config.o diff --git a/board/marasov/charger.c b/board/marasov/charger.c new file mode 100644 index 0000000000..68fff4f283 --- /dev/null +++ b/board/marasov/charger.c @@ -0,0 +1,83 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "common.h" + +#include "charge_manager.h" +#include "charge_state_v2.h" +#include "charger.h" +#include "compile_time_macros.h" +#include "console.h" +#include "driver/charger/bq25710.h" +#include "usbc_ppc.h" +#include "usb_pd.h" +#include "util.h" + +#define CPRINTSUSB(format, args...) cprints(CC_USBCHARGE, format, ##args) +#define CPRINTFUSB(format, args...) cprintf(CC_USBCHARGE, format, ##args) + +#ifndef CONFIG_ZEPHYR +/* Charger Chip Configuration */ +const struct charger_config_t chg_chips[] = { + { + .i2c_port = I2C_PORT_CHARGER, + .i2c_addr_flags = BQ25710_SMBUS_ADDR1_FLAGS, + .drv = &bq25710_drv, + }, +}; +BUILD_ASSERT(ARRAY_SIZE(chg_chips) == CHARGER_NUM); +#endif + +int board_set_active_charge_port(int port) +{ + int is_valid_port = board_is_usb_pd_port_present(port); + int i; + + if (port == CHARGE_PORT_NONE) { + CPRINTSUSB("Disabling all charger ports"); + + /* Disable all ports. */ + for (i = 0; i < ppc_cnt; i++) { + /* + * Do not return early if one fails otherwise we can + * get into a boot loop assertion failure. + */ + if (ppc_vbus_sink_enable(i, 0)) + CPRINTSUSB("Disabling C%d as sink failed.", i); + } + + return EC_SUCCESS; + } else if (!is_valid_port) { + return EC_ERROR_INVAL; + } + + /* Check if the port is sourcing VBUS. */ + if (ppc_is_sourcing_vbus(port)) { + CPRINTFUSB("Skip enable C%d", port); + return EC_ERROR_INVAL; + } + + CPRINTSUSB("New charge port: C%d", port); + + /* + * Turn off the other ports' sink path FETs, before enabling the + * requested charge port. + */ + for (i = 0; i < ppc_cnt; i++) { + if (i == port) + continue; + + if (ppc_vbus_sink_enable(i, 0)) + CPRINTSUSB("C%d: sink path disable failed.", i); + } + + /* Enable requested charge port. */ + if (ppc_vbus_sink_enable(port, 1)) { + CPRINTSUSB("C%d: sink path enable failed.", port); + return EC_ERROR_UNKNOWN; + } + + return EC_SUCCESS; +} diff --git a/board/marasov/ec.tasklist b/board/marasov/ec.tasklist new file mode 100644 index 0000000000..a4039fc94f --- /dev/null +++ b/board/marasov/ec.tasklist @@ -0,0 +1,26 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/* + * See CONFIG_TASK_LIST in config.h for details. + * + * USB_CHG_Px tasks must be contiguous (see USB_CHG_PORT_TO_TASK_ID(x)). + * PD_Cx tasks must be contiguous (see PD_PORT_TO_TASK_ID(x)) + */ + +#define CONFIG_TASK_LIST \ + TASK_ALWAYS(HOOKS, hook_task, NULL, HOOKS_TASK_STACK_SIZE) \ + TASK_ALWAYS(CHARGER, charger_task, NULL, BASEBOARD_CHARGER_TASK_STACK_SIZE) \ + TASK_NOTEST(KEYPROTO, keyboard_protocol_task, NULL, LARGER_TASK_STACK_SIZE) \ + TASK_NOTEST(CHIPSET, chipset_task, NULL, BASEBOARD_CHIPSET_TASK_STACK_SIZE) \ + TASK_ALWAYS(USB_MUX, usb_mux_task, NULL, VENTI_TASK_STACK_SIZE) \ + TASK_ALWAYS(HOSTCMD, host_command_task, NULL, LARGER_TASK_STACK_SIZE) \ + TASK_ALWAYS(CONSOLE, console_task, NULL, CONSOLE_TASK_STACK_SIZE) \ + TASK_ALWAYS(POWERBTN, power_button_task, NULL, BASEBOARD_POWERBTN_TASK_STACK_SIZE) \ + 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_INT_C0, pd_interrupt_handler_task, 0, BASEBOARD_PD_INT_TASK_STACK_SIZE) \ + TASK_ALWAYS(PD_INT_C1, pd_interrupt_handler_task, 1, BASEBOARD_PD_INT_TASK_STACK_SIZE) diff --git a/board/marasov/fans.c b/board/marasov/fans.c new file mode 100644 index 0000000000..158f4bf704 --- /dev/null +++ b/board/marasov/fans.c @@ -0,0 +1,89 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/* Physical fans. These are logically separate from pwm_channels. */ + +#include "common.h" +#include "compile_time_macros.h" +#include "console.h" +#include "fan_chip.h" +#include "fan.h" +#include "hooks.h" +#include "pwm.h" + +/* MFT channels. These are logically separate from pwm_channels. */ +const struct mft_t mft_channels[] = { + [MFT_CH_0] = { + .module = NPCX_MFT_MODULE_1, + .clk_src = TCKC_LFCLK, + .pwm_id = PWM_CH_FAN, + }, +}; +BUILD_ASSERT(ARRAY_SIZE(mft_channels) == MFT_CH_COUNT); + +static const struct fan_conf fan_conf_0 = { + .flags = FAN_USE_RPM_MODE, + .ch = MFT_CH_0, /* Use MFT id to control fan */ + .pgood_gpio = -1, + .enable_gpio = GPIO_EN_PP5000_FAN, +}; + +/* + * TOOD(b/181271666): thermistor placement and calibration + * + * Prototype fan spins at about 4200 RPM at 100% PWM, this + * is specific to board ID 2 and might also apears in later + * boards as well. + */ +static const struct fan_rpm fan_rpm_0 = { + .rpm_min = 2200, + .rpm_start = 2200, + .rpm_max = 4200, +}; + +const struct fan_t fans[FAN_CH_COUNT] = { + [FAN_CH_0] = { + .conf = &fan_conf_0, + .rpm = &fan_rpm_0, + }, +}; + +#ifndef CONFIG_FANS + +/* + * TODO(b/181271666): use static fan speeds until fan and sensors are + * tuned. for now, use: + * + * AP off: 33% + * AP on: 100% + */ + +static void fan_slow(void) +{ + const int duty_pct = 33; + + ccprints("%s: speed %d%%", __func__, duty_pct); + + pwm_enable(PWM_CH_FAN, 1); + pwm_set_duty(PWM_CH_FAN, duty_pct); +} + +static void fan_max(void) +{ + const int duty_pct = 100; + + ccprints("%s: speed %d%%", __func__, duty_pct); + + pwm_enable(PWM_CH_FAN, 1); + pwm_set_duty(PWM_CH_FAN, duty_pct); +} + +DECLARE_HOOK(HOOK_INIT, fan_slow, HOOK_PRIO_DEFAULT); +DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, fan_slow, HOOK_PRIO_DEFAULT); +DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, fan_slow, HOOK_PRIO_DEFAULT); +DECLARE_HOOK(HOOK_CHIPSET_RESET, fan_max, HOOK_PRIO_FIRST); +DECLARE_HOOK(HOOK_CHIPSET_RESUME, fan_max, HOOK_PRIO_DEFAULT); + +#endif /* CONFIG_FANS */ diff --git a/board/marasov/fw_config.c b/board/marasov/fw_config.c new file mode 100644 index 0000000000..375f5e965b --- /dev/null +++ b/board/marasov/fw_config.c @@ -0,0 +1,46 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "cbi.h" +#include "common.h" +#include "compile_time_macros.h" +#include "console.h" +#include "cros_board_info.h" +#include "fw_config.h" + +#define CPRINTS(format, args...) cprints(CC_SYSTEM, format, ##args) + +static union brya_cbi_fw_config fw_config; +BUILD_ASSERT(sizeof(fw_config) == sizeof(uint32_t)); + +/* + * FW_CONFIG defaults for brya if the CBI.FW_CONFIG data is not + * initialized. + */ +static const union brya_cbi_fw_config fw_config_defaults = { + .usb_db = DB_USB3_PS8815, + .kb_bl = KEYBOARD_BACKLIGHT_ENABLED, +}; + +/**************************************************************************** + * Brya FW_CONFIG access + */ +void board_init_fw_config(void) +{ + if (cbi_get_fw_config(&fw_config.raw_value)) { + CPRINTS("CBI: Read FW_CONFIG failed, using board defaults"); + fw_config = fw_config_defaults; + } +} + +union brya_cbi_fw_config get_fw_config(void) +{ + return fw_config; +} + +enum ec_cfg_usb_db_type ec_cfg_usb_db_type(void) +{ + return fw_config.usb_db; +} diff --git a/board/marasov/fw_config.h b/board/marasov/fw_config.h new file mode 100644 index 0000000000..906e61fe7e --- /dev/null +++ b/board/marasov/fw_config.h @@ -0,0 +1,52 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef __BOARD_BRYA_FW_CONFIG_H_ +#define __BOARD_BRYA_FW_CONFIG_H_ + +#include <stdint.h> + +/**************************************************************************** + * CBI FW_CONFIG layout for Brya board. + * + * Source of truth is the project/brya/brya/config.star configuration file. + */ + +enum ec_cfg_usb_db_type { + DB_USB3_PS8815 = 0, +}; + +enum ec_cfg_keyboard_backlight_type { + KEYBOARD_BACKLIGHT_DISABLED = 0, + KEYBOARD_BACKLIGHT_ENABLED = 1 +}; + +union brya_cbi_fw_config { + struct { + enum ec_cfg_usb_db_type usb_db : 4; + uint32_t sd_db : 2; + uint32_t lte_db : 1; + enum ec_cfg_keyboard_backlight_type kb_bl : 1; + uint32_t audio : 3; + uint32_t reserved_1 : 21; + }; + uint32_t raw_value; +}; + +/** + * Read the cached FW_CONFIG. Guaranteed to have valid values. + * + * @return the FW_CONFIG for the board. + */ +union brya_cbi_fw_config get_fw_config(void); + +/** + * Get the USB daughter board type from FW_CONFIG. + * + * @return the USB daughter board type. + */ +enum ec_cfg_usb_db_type ec_cfg_usb_db_type(void); + +#endif /* __BOARD_BRYA_FW_CONFIG_H_ */ diff --git a/board/marasov/generated-gpio.inc b/board/marasov/generated-gpio.inc new file mode 100644 index 0000000000..f01f5b790b --- /dev/null +++ b/board/marasov/generated-gpio.inc @@ -0,0 +1,127 @@ +/* + * This file was auto-generated. + */ + +/* INTERRUPT GPIOs: */ +GPIO_INT(ACOK_OD, PIN(0, 0), GPIO_INT_BOTH | GPIO_HIB_WAKE_HIGH, extpower_interrupt) +GPIO_INT(EC_PROCHOT_IN_L, PIN(F, 0), GPIO_INT_BOTH, throttle_ap_prochot_input_interrupt) +GPIO_INT(EC_WP_ODL, PIN(A, 1), GPIO_INT_BOTH, switch_interrupt) +GPIO_INT(GSC_EC_PWR_BTN_ODL, PIN(0, 1), GPIO_INT_BOTH | GPIO_HIB_WAKE_LOW, power_button_interrupt) +GPIO_INT(LID_OPEN, PIN(D, 2), GPIO_INT_BOTH | GPIO_HIB_WAKE_HIGH, lid_interrupt) +GPIO_INT(SEQ_EC_ALL_SYS_PG, PIN(F, 4), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(SEQ_EC_DSW_PWROK, PIN(C, 7), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(SEQ_EC_RSMRST_ODL, PIN(E, 2), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(SLP_S3_L, PIN(A, 5), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(SLP_SUS_L, PIN(F, 1), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(SYS_SLP_S0IX_L, PIN(D, 5), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(USB_C0_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_C1_PPC_INT_ODL, PIN(F, 5), GPIO_INT_FALLING, ppc_interrupt) +GPIO_INT(USB_C1_TCPC_INT_ODL, PIN(A, 2), GPIO_INT_FALLING, tcpc_alert_event) + +/* USED GPIOs: */ +GPIO(CCD_MODE_ODL, PIN(E, 5), GPIO_INPUT) +GPIO(CHARGER_VAP_OTG_EN, PIN(7, 3), GPIO_OUT_LOW) +GPIO(CPU_C10_GATE_L, PIN(6, 7), GPIO_INPUT) +GPIO(EC_BATT_PRES_ODL, PIN(A, 3), GPIO_INPUT) +GPIO(EC_ENTERING_RW, PIN(0, 3), GPIO_OUT_LOW) +GPIO(EC_EN_EDP_BL, PIN(D, 3), GPIO_OUT_HIGH) +GPIO(EC_GSC_PACKET_MODE, PIN(7, 5), GPIO_OUT_LOW) +GPIO(EC_I2C_BAT_SCL, PIN(3, 3), GPIO_INPUT) +GPIO(EC_I2C_BAT_SDA, PIN(3, 6), GPIO_INPUT) +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_PPC_BC_SCL, PIN(9, 2), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_PPC_BC_SDA, PIN(9, 1), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_RT_SCL, PIN(D, 1), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_RT_SDA, PIN(D, 0), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_TCPC_SCL, PIN(9, 0), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_TCPC_SDA, PIN(8, 7), GPIO_INPUT) +GPIO(EC_I2C_USB_C1_MIX_SCL, PIN(E, 4), GPIO_INPUT) +GPIO(EC_I2C_USB_C1_MIX_SDA, PIN(E, 3), GPIO_INPUT) +GPIO(EC_I2C_USB_C1_TCPC_SCL, PIN(F, 3), GPIO_INPUT) +GPIO(EC_I2C_USB_C1_TCPC_SDA, PIN(F, 2), 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) +GPIO(EC_PCH_PWR_BTN_ODL, PIN(C, 1), GPIO_ODR_HIGH) +GPIO(EC_PCH_RSMRST_L, PIN(A, 6), GPIO_OUT_LOW) +GPIO(EC_PCH_RTCRST, PIN(7, 6), GPIO_OUT_LOW) +GPIO(EC_PCH_SYS_PWROK, PIN(3, 7), GPIO_OUT_LOW) +GPIO(EC_PCH_WAKE_R_ODL, PIN(C, 0), GPIO_ODR_HIGH) +GPIO(EC_PROCHOT_ODL, PIN(6, 3), GPIO_ODR_HIGH) +GPIO(EN_PP5000_FAN, PIN(6, 1), GPIO_OUT_HIGH) +GPIO(EN_PP5000_USBA_R, PIN(D, 7), GPIO_OUT_LOW) +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_TCPC_RST_ODL, PIN(A, 7), GPIO_ODR_LOW) +GPIO(USB_C1_FRS_EN, PIN(9, 4), GPIO_OUT_LOW) +GPIO(USB_C1_OC_ODL, PIN(9, 6), GPIO_ODR_HIGH) +GPIO(USB_C1_RT_INT_ODL, PIN(A, 0), GPIO_INPUT) +GPIO(USB_C1_RT_RST_R_ODL, PIN(0, 2), GPIO_ODR_LOW) +GPIO(VCCST_PWRGD_OD, PIN(A, 4), GPIO_ODR_LOW) +GPIO(PWR_LED_W_ODL, PIN(6, 0), GPIO_OUT_HIGH) +GPIO(PWR_LED_A_ODL, PIN(C, 2), GPIO_OUT_HIGH) + +/* UART alternate functions */ +ALTERNATE(PIN_MASK(6, 0x30), 0, MODULE_UART, 0) /* GPIO64/CR_SIN1, GPO65/CR_SOUT1/FLPRG1_L */ + +/* I2C alternate functions */ +ALTERNATE(PIN_MASK(3, 0x48), 0, MODULE_I2C, 0) /* GPIO33/I2C5_SCL0/CTS_L, GPIO36/RTS_L/I2C5_SDA0 */ +ALTERNATE(PIN_MASK(8, 0x80), 0, MODULE_I2C, 0) /* GPIO87/I2C1_SDA0 */ +ALTERNATE(PIN_MASK(9, 0x07), 0, MODULE_I2C, 0) /* GPIO92/I2C2_SCL0, GPIO91/I2C2_SDA0, GPIO90/I2C1_SCL0 */ +ALTERNATE(PIN_MASK(B, 0x0c), 0, MODULE_I2C, 0) /* GPIOB3/I2C7_SCL0/DCD_L, GPIOB2/I2C7_SDA0/DSR_L */ +ALTERNATE(PIN_MASK(B, 0x30), 0, MODULE_I2C, GPIO_SEL_1P8V) /* GPIOB5/I2C0_SCL0, GPIOB4/I2C0_SDA0 */ +ALTERNATE(PIN_MASK(D, 0x03), 0, MODULE_I2C, 0) /* GPIOD1/I2C3_SCL0, GPIOD0/I2C3_SDA0 */ +ALTERNATE(PIN_MASK(E, 0x18), 0, MODULE_I2C, 0) /* GPIOE4/I2C6_SCL1/I3C_SCL, GPIOE3/I2C6_SDA1/I3C_SDA */ +ALTERNATE(PIN_MASK(F, 0x0c), 0, MODULE_I2C, 0) /* GPIOF3/I2C4_SCL1, GPIOF2/I2C4_SDA1 */ + +/* PWM alternate functions */ +ALTERNATE(PIN_MASK(4, 0x01), 0, MODULE_PWM, 0) /* GPIO40/TA1 */ +ALTERNATE(PIN_MASK(8, 0x01), 0, MODULE_PWM, 0) /* GPIO80/PWM3 */ +ALTERNATE(PIN_MASK(B, 0x80), 0, MODULE_PWM, 0) /* GPIOB7/PWM5 */ + +/* ADC alternate functions */ +ALTERNATE(PIN_MASK(3, 0x10), 0, MODULE_ADC, 0) /* GPIO34/PS2_DAT2/ADC6 */ +ALTERNATE(PIN_MASK(4, 0x34), 0, MODULE_ADC, 0) /* GPIO42/ADC3/RI_L, GPIO45/ADC0, GPIO44/ADC1 */ +ALTERNATE(PIN_MASK(E, 0x02), 0, MODULE_ADC, 0) /* GPIOE1/ADC7 */ + +/* KB alternate functions */ +ALTERNATE(PIN_MASK(0, 0xf0), 0, MODULE_KB, GPIO_ODR_HIGH) /* KSO10&P80_CLK/GPIO07, KSO11&P80_DAT/GPIO06, KSO12/GPIO05, KSO13/GPIO04 */ +ALTERNATE(PIN_MASK(1, 0x7f), 0, MODULE_KB, GPIO_ODR_HIGH) /* KSO06/GPO13/GP_SEL_L, KSO07/GPO12/JEN_L, KSO03/GPIO16/JTAG_TDO0_SWO, KSO04/GPIO15/XNOR, KSO05/GPIO14, KSO08/GPIO11/CR_SOUT1, KSO09/GPIO10/CR_SIN1 */ +ALTERNATE(PIN_MASK(2, 0xfc), 0, MODULE_KB, GPIO_INPUT | GPIO_PULL_UP) /* KSI2/GPIO27/TRACEDATA1, KSI3/GPIO26/TRACEDATA0, KSI4/GPIO25/TRACECLK/GP_SCLK, KSI5/GPIO24/GP_MISO, KSI6/GPIO23/S_SBUB, KSI7/GPIO22/S_SBUA */ +ALTERNATE(PIN_MASK(2, 0x03), 0, MODULE_KB, GPIO_ODR_HIGH) /* KSO00/GPIO21/JTAG_TCK_SWCLK, KSO01/GPIO20/JTAG_TMS_SWIO */ +ALTERNATE(PIN_MASK(3, 0x03), 0, MODULE_KB, GPIO_INPUT | GPIO_PULL_UP) /* KSI0/GPIO31/TRACEDATA3/GP_MOSI, KSI1/GPIO30/TRACEDATA2/GP_CS_L */ +ALTERNATE(PIN_MASK(8, 0x04), 0, MODULE_KB, GPIO_ODR_HIGH) /* KSO14/GPIO82 */ + +/* PMU alternate functions */ +ALTERNATE(PIN_MASK(0, 0x01), 0, MODULE_PMU, GPIO_INT_BOTH | GPIO_HIB_WAKE_HIGH) /* PSL_IN2_L&GPI00/GPIO00 */ +ALTERNATE(PIN_MASK(0, 0x02), 0, MODULE_PMU, GPIO_INT_BOTH | GPIO_HIB_WAKE_LOW) /* GPIO01/PSL_IN3_L&GPI01 */ +ALTERNATE(PIN_MASK(D, 0x04), 0, MODULE_PMU, GPIO_INT_BOTH | GPIO_HIB_WAKE_HIGH) /* PSL_IN1_L&GPID2/GPIOD2 */ + +/* Unused Pins */ +UNUSED(PIN(D, 6)) /* GPOD6/CR_SOUT3/SHDF_ESPI_L */ +UNUSED(PIN(3, 2)) /* GPO32/TRIS_L */ +UNUSED(PIN(3, 5)) /* GPO35/CR_SOUT4/TEST_L */ +UNUSED(PIN(6, 6)) /* GPIO66 */ +UNUSED(PIN(5, 7)) /* GPIO57/SER_IRQ/ESPI_ALERT_L */ +UNUSED(PIN(9, 5)) /* GPIO95 */ +UNUSED(PIN(8, 1)) /* GPIO81 */ +UNUSED(PIN(5, 6)) /* GPIO56 */ +UNUSED(PIN(D, 4)) /* GPIOD4 */ +UNUSED(PIN(9, 3)) /* GPIO93 */ +UNUSED(PIN(9, 7)) /* GPIO97 */ +UNUSED(PIN(C, 3)) /* GPIOC3 */ +UNUSED(PIN(C, 4)) /* GPIOC4 */ +UNUSED(PIN(C, 6)) /* GPIOC6 */ +UNUSED(PIN(5, 0)) /* GPIO50 */ +UNUSED(PIN(8, 3)) /* GPIO83 */ +UNUSED(PIN(7, 0)) /* GPIO70 */ +UNUSED(PIN(4, 1)) /* GPIO41 */ + +/* Pre-configured PSL balls: J8 K6 */ diff --git a/board/marasov/gpio.inc b/board/marasov/gpio.inc new file mode 100644 index 0000000000..d4a2ff2d67 --- /dev/null +++ b/board/marasov/gpio.inc @@ -0,0 +1,38 @@ +/* -*- mode:c -*- + * + * Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#define MODULE_KB MODULE_KEYBOARD_SCAN + +/* + * Generated-gpio.inc is produced using a Brya specific tool that + * parses the GPIO definitions derived from the board schematics and + * EC pinout descriptions derived form the chip datasheets to generate + * the Chrome EC GPIO pinout definitions. Due to the confidential + * nature of schematics and datasheets, they are not provided here. + * + * Variants that do not auto-generate their GPIO definitions should + * combine the Brya gpio.inc and generated-gpio.inc into their + * gpio.inc and customize as appropriate. + */ + +#include "generated-gpio.inc" + +/* + * The NPCX keyboard driver does not use named GPIOs to access + * keyboard scan pins, so we do not list them in *gpio.inc. However, when + * KEYBOARD_COL2_INVERTED is defined, this name is required. + */ +GPIO(EC_KSO_02_INV, PIN(1, 7), GPIO_OUT_LOW) + +/* IO expander configuration */ + +/* GPIO02_P2 to PU */ +/* GPIO03_P2 to PU */ +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_OUT_LOW) +IOEX(USB_C0_RT_RST_ODL, EXPIN(IOEX_C0_NCT38XX, 0, 7), GPIO_ODR_LOW) +/* GPIO07_P2 to PU */ diff --git a/board/marasov/i2c.c b/board/marasov/i2c.c new file mode 100644 index 0000000000..15c9b13e83 --- /dev/null +++ b/board/marasov/i2c.c @@ -0,0 +1,81 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "common.h" +#include "compile_time_macros.h" +#include "console.h" +#include "hooks.h" +#include "i2c.h" + +/* I2C port map configuration */ +const struct i2c_port_t i2c_ports[] = { + { + /* I2C0 */ + .name = "sensor", + .port = I2C_PORT_SENSOR, + .kbps = 400, + .scl = GPIO_EC_I2C_SENSOR_SCL, + .sda = GPIO_EC_I2C_SENSOR_SDA, + }, + { + /* I2C1 */ + .name = "tcpc0,2", + .port = I2C_PORT_USB_C0_TCPC, + .kbps = 1000, + .scl = GPIO_EC_I2C_USB_C0_TCPC_SCL, + .sda = GPIO_EC_I2C_USB_C0_TCPC_SDA, + }, + { + /* I2C2 */ + .name = "ppc0,2", + .port = I2C_PORT_USB_C0_PPC, + .kbps = 1000, + .scl = GPIO_EC_I2C_USB_C0_PPC_BC_SCL, + .sda = GPIO_EC_I2C_USB_C0_PPC_BC_SDA, + }, + { + /* I2C3 */ + .name = "retimer0,2", + .port = I2C_PORT_USB_C0_MUX, + .kbps = 1000, + .scl = GPIO_EC_I2C_USB_C0_RT_SCL, + .sda = GPIO_EC_I2C_USB_C0_RT_SDA, + }, + { + /* I2C4 C1 TCPC */ + .name = "tcpc1", + .port = I2C_PORT_USB_C1_TCPC, + .kbps = 1000, + .scl = GPIO_EC_I2C_USB_C1_TCPC_SCL, + .sda = GPIO_EC_I2C_USB_C1_TCPC_SDA, + .flags = I2C_PORT_FLAG_DYNAMIC_SPEED, + }, + { + /* I2C5 */ + .name = "battery", + .port = I2C_PORT_BATTERY, + .kbps = 100, + .scl = GPIO_EC_I2C_BAT_SCL, + .sda = GPIO_EC_I2C_BAT_SDA, + }, + { + /* I2C6 */ + .name = "ppc1", + .port = I2C_PORT_USB_C1_PPC, + .kbps = 1000, + .scl = GPIO_EC_I2C_USB_C1_MIX_SCL, + .sda = GPIO_EC_I2C_USB_C1_MIX_SDA, + .flags = I2C_PORT_FLAG_DYNAMIC_SPEED, + }, + { + /* I2C7 */ + .name = "eeprom", + .port = I2C_PORT_EEPROM, + .kbps = 400, + .scl = GPIO_EC_I2C_MISC_SCL_R, + .sda = GPIO_EC_I2C_MISC_SDA_R, + }, +}; +const unsigned int i2c_ports_used = ARRAY_SIZE(i2c_ports); diff --git a/board/marasov/keyboard.c b/board/marasov/keyboard.c new file mode 100644 index 0000000000..936aeb290b --- /dev/null +++ b/board/marasov/keyboard.c @@ -0,0 +1,25 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "common.h" + +#include "keyboard_scan.h" +#include "timer.h" + +/* Keyboard scan setting */ +__override struct keyboard_scan_config keyscan_config = { + /* Increase from 50 us, because KSO_02 passes through the H1. */ + .output_settle_us = 80, + /* Other values should be the same as the default configuration. */ + .debounce_down_us = 9 * MSEC, + .debounce_up_us = 30 * MSEC, + .scan_period_us = 3 * MSEC, + .min_post_scan_delay_us = 1000, + .poll_timeout_us = 100 * MSEC, + .actual_key_mask = { + 0x14, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xa4, 0xff, 0xfe, 0x55, 0xfa, 0xca /* full set */ + }, +}; diff --git a/board/marasov/led.c b/board/marasov/led.c new file mode 100644 index 0000000000..74005005cb --- /dev/null +++ b/board/marasov/led.c @@ -0,0 +1,101 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "chipset.h" +#include "ec_commands.h" +#include "gpio.h" +#include "led_common.h" +#include "led_onoff_states.h" + +#define LED_OFF_LVL 1 +#define LED_ON_LVL 0 + +__override const int led_charge_lvl_1; +__override const int led_charge_lvl_2 = 95; + +__override struct led_descriptor + led_bat_state_table[LED_NUM_STATES][LED_NUM_PHASES] = { + [STATE_CHARGING_LVL_1] = { { EC_LED_COLOR_AMBER, + LED_INDEFINITE } }, + [STATE_CHARGING_LVL_2] = { { EC_LED_COLOR_AMBER, + LED_INDEFINITE } }, + [STATE_CHARGING_FULL_CHARGE] = { { EC_LED_COLOR_WHITE, + LED_INDEFINITE } }, + [STATE_DISCHARGE_S0] = { { EC_LED_COLOR_WHITE, + LED_INDEFINITE } }, + [STATE_DISCHARGE_S0_BAT_LOW] = { { EC_LED_COLOR_AMBER, + 1 * LED_ONE_SEC }, + { LED_OFF, 3 * LED_ONE_SEC } }, + [STATE_DISCHARGE_S3] = { { EC_LED_COLOR_WHITE, + 1 * LED_ONE_SEC }, + { LED_OFF, 3 * LED_ONE_SEC } }, + [STATE_DISCHARGE_S5] = { { LED_OFF, LED_INDEFINITE } }, + [STATE_BATTERY_ERROR] = { { EC_LED_COLOR_AMBER, + 1 * LED_ONE_SEC }, + { LED_OFF, 1 * LED_ONE_SEC } }, + [STATE_FACTORY_TEST] = { { EC_LED_COLOR_WHITE, + 2 * LED_ONE_SEC }, + { EC_LED_COLOR_AMBER, + 2 * LED_ONE_SEC } }, + }; + +const enum ec_led_id supported_led_ids[] = { + EC_LED_ID_BATTERY_LED, +}; + +const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids); + +__override void led_set_color_battery(enum ec_led_colors color) +{ + switch (color) { + case EC_LED_COLOR_WHITE: + gpio_set_level(GPIO_PWR_LED_A_ODL, LED_OFF_LVL); + gpio_set_level(GPIO_PWR_LED_W_ODL, LED_ON_LVL); + break; + case EC_LED_COLOR_AMBER: + gpio_set_level(GPIO_PWR_LED_A_ODL, LED_ON_LVL); + gpio_set_level(GPIO_PWR_LED_W_ODL, LED_OFF_LVL); + break; + default: /* LED_OFF and other unsupported colors */ + gpio_set_level(GPIO_PWR_LED_W_ODL, LED_OFF_LVL); + gpio_set_level(GPIO_PWR_LED_A_ODL, LED_OFF_LVL); + break; + } +} + +void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range) +{ + if (led_id == EC_LED_ID_BATTERY_LED) { + brightness_range[EC_LED_COLOR_WHITE] = 1; + brightness_range[EC_LED_COLOR_AMBER] = 1; + } +} + +int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness) +{ + if (led_id == EC_LED_ID_BATTERY_LED) { + if (brightness[EC_LED_COLOR_WHITE] != 0) + led_set_color_battery(EC_LED_COLOR_WHITE); + else if (brightness[EC_LED_COLOR_AMBER] != 0) + led_set_color_battery(EC_LED_COLOR_AMBER); + else + led_set_color_battery(LED_OFF); + } + + return EC_SUCCESS; +} + +__override enum led_states board_led_get_state(enum led_states desired_state) +{ + if (desired_state == STATE_BATTERY_ERROR) { + if (chipset_in_state(CHIPSET_STATE_ON)) + return desired_state; + else if (chipset_in_state(CHIPSET_STATE_ANY_SUSPEND)) + return STATE_DISCHARGE_S3; + else + return STATE_DISCHARGE_S5; + } + return desired_state; +} diff --git a/board/marasov/pwm.c b/board/marasov/pwm.c new file mode 100644 index 0000000000..f693a6e27f --- /dev/null +++ b/board/marasov/pwm.c @@ -0,0 +1,38 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "common.h" + +#include "compile_time_macros.h" +#include "hooks.h" +#include "pwm.h" +#include "pwm_chip.h" + +const struct pwm_t pwm_channels[] = { + [PWM_CH_KBLIGHT] = { + .channel = 3, + .flags = 0, + /* + * Set PWM frequency to multiple of 50 Hz and 60 Hz to prevent + * flicker. Higher frequencies consume similar average power to + * lower PWM frequencies, but higher frequencies record a much + * lower maximum power. + */ + .freq = 12000, + }, + [PWM_CH_FAN] = { + .channel = 5, + .flags = PWM_CONFIG_OPEN_DRAIN, + .freq = 25000, + }, +}; +BUILD_ASSERT(ARRAY_SIZE(pwm_channels) == PWM_CH_COUNT); + +static void board_pwm_init(void) +{ + pwm_enable(PWM_CH_KBLIGHT, 1); + pwm_set_duty(PWM_CH_KBLIGHT, 50); +} +DECLARE_HOOK(HOOK_INIT, board_pwm_init, HOOK_PRIO_DEFAULT); diff --git a/board/marasov/sensors.c b/board/marasov/sensors.c new file mode 100644 index 0000000000..2a25141639 --- /dev/null +++ b/board/marasov/sensors.c @@ -0,0 +1,187 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "common.h" +#include "adc.h" +#include "gpio.h" +#include "hooks.h" +#include "temp_sensor.h" +#include "thermal.h" +#include "temp_sensor/thermistor.h" + +/* ADC configuration */ +struct adc_t adc_channels[] = { + [ADC_TEMP_SENSOR_1_DDR_SOC] = { + .name = "TEMP_DDR_SOC", + .input_ch = NPCX_ADC_CH0, + .factor_mul = ADC_MAX_VOLT, + .factor_div = ADC_READ_MAX + 1, + .shift = 0, + }, + [ADC_TEMP_SENSOR_2_AMBIENT] = { + .name = "TEMP_AMBIENT", + .input_ch = NPCX_ADC_CH1, + .factor_mul = ADC_MAX_VOLT, + .factor_div = ADC_READ_MAX + 1, + .shift = 0, + }, + [ADC_TEMP_SENSOR_3_CHARGER] = { + .name = "TEMP_CHARGER", + .input_ch = NPCX_ADC_CH6, + .factor_mul = ADC_MAX_VOLT, + .factor_div = ADC_READ_MAX + 1, + .shift = 0, + }, + [ADC_TEMP_SENSOR_4_WWAN] = { + .name = "TEMP_WWAN", + .input_ch = NPCX_ADC_CH7, + .factor_mul = ADC_MAX_VOLT, + .factor_div = ADC_READ_MAX + 1, + .shift = 0, + }, +}; +BUILD_ASSERT(ARRAY_SIZE(adc_channels) == ADC_CH_COUNT); + +/* Temperature sensor configuration */ +const struct temp_sensor_t temp_sensors[] = { + [TEMP_SENSOR_1_DDR_SOC] = { + .name = "DDR and SOC", + .type = TEMP_SENSOR_TYPE_BOARD, + .read = get_temp_3v3_30k9_47k_4050b, + .idx = ADC_TEMP_SENSOR_1_DDR_SOC, + }, + [TEMP_SENSOR_2_AMBIENT] = { + .name = "Ambient", + .type = TEMP_SENSOR_TYPE_BOARD, + .read = get_temp_3v3_30k9_47k_4050b, + .idx = ADC_TEMP_SENSOR_2_AMBIENT, + }, + [TEMP_SENSOR_3_CHARGER] = { + .name = "Charger", + .type = TEMP_SENSOR_TYPE_BOARD, + .read = get_temp_3v3_30k9_47k_4050b, + .idx = ADC_TEMP_SENSOR_3_CHARGER, + }, + [TEMP_SENSOR_4_WWAN] = { + .name = "WWAN", + .type = TEMP_SENSOR_TYPE_BOARD, + .read = get_temp_3v3_30k9_47k_4050b, + .idx = ADC_TEMP_SENSOR_4_WWAN, + }, +}; +BUILD_ASSERT(ARRAY_SIZE(temp_sensors) == TEMP_SENSOR_COUNT); + +/* + * TODO(b/180681346): update for Alder Lake/brya + * + * Alder Lake specifies 100 C as maximum TDP temperature. THRMTRIP# occurs at + * 130 C. However, sensor is located next to DDR, so we need to use the lower + * DDR temperature limit (85 C) + */ +/* + * TODO(b/202062363): Remove when clang is fixed. + */ +#define THERMAL_CPU \ + { \ + .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(80), \ + }, \ + .temp_fan_off = C_TO_K(35), \ + .temp_fan_max = C_TO_K(60), \ + } +__maybe_unused static const struct ec_thermal_config thermal_cpu = THERMAL_CPU; + +/* + * TODO(b/180681346): update for Alder Lake/brya + * + * Inductor limits - used for both charger and PP3300 regulator + * + * Need to use the lower of the charger IC, PP3300 regulator, and the inductors + * + * Charger max recommended temperature 100C, max absolute temperature 125C + * PP3300 regulator: operating range -40 C to 145 C + * + * Inductors: limit of 125c + * PCB: limit is 80c + */ +/* + * TODO(b/202062363): Remove when clang is fixed. + */ +#define THERMAL_AMBIENT \ + { \ + .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(80), \ + }, \ + .temp_fan_off = C_TO_K(35), \ + .temp_fan_max = C_TO_K(60), \ + } +__maybe_unused static const struct ec_thermal_config thermal_ambient = + THERMAL_AMBIENT; + +/* + * Inductor limits - used for both charger and PP3300 regulator + * + * Need to use the lower of the charger IC, PP3300 regulator, and the inductors + * + * Charger max recommended temperature 125C, max absolute temperature 150C + * PP3300 regulator: operating range -40 C to 125 C + * + * Inductors: limit of 125c + * PCB: limit is 80c + */ +/* + * TODO(b/202062363): Remove when clang is fixed. + */ +#define THERMAL_CHARGER \ + { \ + .temp_host = { \ + [EC_TEMP_THRESH_HIGH] = C_TO_K(105), \ + [EC_TEMP_THRESH_HALT] = C_TO_K(120), \ + }, \ + .temp_host_release = { \ + [EC_TEMP_THRESH_HIGH] = C_TO_K(90), \ + }, \ + .temp_fan_off = C_TO_K(35), \ + .temp_fan_max = C_TO_K(65), \ + } +__maybe_unused static const struct ec_thermal_config thermal_charger = + THERMAL_CHARGER; + +/* + * TODO(b/180681346): update for brya WWAN module + */ +/* + * TODO(b/202062363): Remove when clang is fixed. + */ +#define THERMAL_WWAN \ + { \ + .temp_host = { \ + [EC_TEMP_THRESH_HIGH] = C_TO_K(130), \ + [EC_TEMP_THRESH_HALT] = C_TO_K(130), \ + }, \ + .temp_host_release = { \ + [EC_TEMP_THRESH_HIGH] = C_TO_K(100), \ + }, \ + .temp_fan_off = C_TO_K(35), \ + .temp_fan_max = C_TO_K(60), \ + } +__maybe_unused static const struct ec_thermal_config thermal_wwan = + THERMAL_WWAN; + +struct ec_thermal_config thermal_params[] = { + [TEMP_SENSOR_1_DDR_SOC] = THERMAL_CPU, + [TEMP_SENSOR_2_AMBIENT] = THERMAL_AMBIENT, + [TEMP_SENSOR_3_CHARGER] = THERMAL_CHARGER, + [TEMP_SENSOR_4_WWAN] = THERMAL_WWAN, +}; +BUILD_ASSERT(ARRAY_SIZE(thermal_params) == TEMP_SENSOR_COUNT); diff --git a/board/marasov/usbc_config.c b/board/marasov/usbc_config.c new file mode 100644 index 0000000000..b974ba7509 --- /dev/null +++ b/board/marasov/usbc_config.c @@ -0,0 +1,348 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include <stdint.h> +#include <stdbool.h> + +#include "cbi.h" +#include "charger.h" +#include "common.h" +#include "compile_time_macros.h" +#include "console.h" +#include "driver/ppc/syv682x_public.h" +#include "driver/retimer/bb_retimer_public.h" +#include "driver/tcpm/nct38xx.h" +#include "driver/tcpm/ps8xxx_public.h" +#include "driver/tcpm/tcpci.h" +#include "ec_commands.h" +#include "fw_config.h" +#include "gpio.h" +#include "gpio_signal.h" +#include "hooks.h" +#include "ioexpander.h" +#include "system.h" +#include "task.h" +#include "task_id.h" +#include "timer.h" +#include "usbc_config.h" +#include "usbc_ppc.h" +#include "usb_mux.h" +#include "usb_pd.h" +#include "usb_pd_tcpm.h" + +#define CPRINTF(format, args...) cprintf(CC_USBPD, format, ##args) +#define CPRINTS(format, args...) cprints(CC_USBPD, format, ##args) + +#ifdef CONFIG_ZEPHYR +enum ioex_port { IOEX_C0_NCT38XX = 0, IOEX_PORT_COUNT }; +#endif /* CONFIG_ZEPHYR */ + +#ifndef CONFIG_ZEPHYR +/* USBC TCPC configuration */ +const struct tcpc_config_t tcpc_config[] = { + [USBC_PORT_C0] = { + .bus_type = EC_BUS_TYPE_I2C, + .i2c_info = { + .port = I2C_PORT_USB_C0_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_C1] = { + .bus_type = EC_BUS_TYPE_I2C, + .i2c_info = { + .port = I2C_PORT_USB_C1_TCPC, + .addr_flags = PS8XXX_I2C_ADDR1_FLAGS, + }, + .drv = &ps8xxx_tcpm_drv, + .flags = TCPC_FLAGS_TCPCI_REV2_0 | + TCPC_FLAGS_TCPCI_REV2_0_NO_VSAFE0V | + TCPC_FLAGS_CONTROL_VCONN | + TCPC_FLAGS_CONTROL_FRS, + }, +}; +BUILD_ASSERT(ARRAY_SIZE(tcpc_config) == USBC_PORT_COUNT); +BUILD_ASSERT(CONFIG_USB_PD_PORT_MAX_COUNT == USBC_PORT_COUNT); +#endif /* !CONFIG_ZEPHYR */ + +/******************************************************************************/ +/* USB-A charging control */ + +#ifndef CONFIG_ZEPHYR +const int usb_port_enable[USB_PORT_COUNT] = { + GPIO_EN_PP5000_USBA_R, +}; +#endif +BUILD_ASSERT(ARRAY_SIZE(usb_port_enable) == USB_PORT_COUNT); + +/******************************************************************************/ + +#ifndef CONFIG_ZEPHYR +/* USBC PPC configuration */ +struct ppc_config_t ppc_chips[] = { + [USBC_PORT_C0] = { + .i2c_port = I2C_PORT_USB_C0_PPC, + .i2c_addr_flags = SYV682X_ADDR0_FLAGS, + .frs_en = IOEX_USB_C0_FRS_EN, + .drv = &syv682x_drv, + }, + [USBC_PORT_C1] = { + /* Compatible with Silicon Mitus SM5360A */ + .i2c_port = I2C_PORT_USB_C1_PPC, + .i2c_addr_flags = SYV682X_ADDR0_FLAGS, + .drv = &syv682x_drv, + }, +}; +BUILD_ASSERT(ARRAY_SIZE(ppc_chips) == USBC_PORT_COUNT); + +unsigned int ppc_cnt = ARRAY_SIZE(ppc_chips); + +/* USBC mux configuration - Alder Lake includes internal mux */ +static const struct usb_mux_chain usbc0_tcss_usb_mux = { + .mux = + &(const struct usb_mux){ + .usb_port = USBC_PORT_C0, + .driver = &virtual_usb_mux_driver, + .hpd_update = &virtual_hpd_update, + }, +}; + +/* + * USB3 DB mux configuration - the top level mux still needs to be set + * to the virtual_usb_mux_driver so the AP gets notified of mux changes + * and updates the TCSS configuration on state changes. + */ +static const struct usb_mux_chain usbc1_usb3_db_retimer = { + .mux = + &(const struct usb_mux){ + .usb_port = USBC_PORT_C1, + .driver = &tcpci_tcpm_usb_mux_driver, + .hpd_update = &ps8xxx_tcpc_update_hpd_status, + }, +}; + +const struct usb_mux_chain usb_muxes[] = { + [USBC_PORT_C0] = { + .mux = &(const struct usb_mux) { + .usb_port = USBC_PORT_C0, + .flags = USB_MUX_FLAG_CAN_IDLE, + .driver = &bb_usb_retimer, + .hpd_update = bb_retimer_hpd_update, + .i2c_port = I2C_PORT_USB_C0_MUX, + .i2c_addr_flags = USBC_PORT_C0_BB_RETIMER_I2C_ADDR, + }, + .next = &usbc0_tcss_usb_mux, + }, + [USBC_PORT_C1] = { + .mux = &(const struct usb_mux) { + /* PS8815 DB */ + .usb_port = USBC_PORT_C1, + .driver = &virtual_usb_mux_driver, + .hpd_update = &virtual_hpd_update, + }, + .next = &usbc1_usb3_db_retimer, + }, +}; +BUILD_ASSERT(ARRAY_SIZE(usb_muxes) == USBC_PORT_COUNT); + +/* + * USB C0 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 + * reset, so we need to start in disabled mode, then explicitly + * call ioex_init(). + */ + +struct ioexpander_config_t ioex_config[] = { + [IOEX_C0_NCT38XX] = { + .i2c_host_port = I2C_PORT_USB_C0_TCPC, + .i2c_addr_flags = NCT38XX_I2C_ADDR1_1_FLAGS, + .drv = &nct38xx_ioexpander_drv, + .flags = IOEX_FLAGS_DEFAULT_INIT_DISABLED, + }, +}; +BUILD_ASSERT(ARRAY_SIZE(ioex_config) == CONFIG_IO_EXPANDER_PORT_COUNT); +#endif /* !CONFIG_ZEPHYR */ + +__override int bb_retimer_power_enable(const struct usb_mux *me, bool enable) +{ + enum ioex_signal rst_signal; + + if (me->usb_port == USBC_PORT_C0) { +/* TODO: explore how to handle board id in zephyr*/ +#ifndef CONFIG_ZEPHYR + rst_signal = IOEX_USB_C0_RT_RST_ODL; +#else + /* On Zephyr use bb_controls generated from DTS */ + rst_signal = bb_controls[me->usb_port].retimer_rst_gpio; +#endif /* !CONFIG_ZEPHYR */ + } else { + return EC_ERROR_INVAL; + } + + /* + * We do not have a load switch for the burnside bridge chips, + * so we only need to sequence reset. + */ + + if (enable) { + /* + * Tpw, minimum time from VCC to RESET_N de-assertion is 100us. + * For boards that don't provide a load switch control, the + * retimer_init() function ensures power is up before calling + * this function. + */ + ioex_set_level(rst_signal, 1); + /* + * Allow 1ms time for the retimer to power up lc_domain + * which powers I2C controller within retimer + */ + msleep(1); + } else { + ioex_set_level(rst_signal, 0); + msleep(1); + } + return EC_SUCCESS; +} + +void board_reset_pd_mcu(void) +{ + enum gpio_signal tcpc_rst; + +#ifndef CONFIG_ZEPHYR + tcpc_rst = GPIO_USB_C0_TCPC_RST_ODL; +#else + tcpc_rst = GPIO_UNIMPLEMENTED; +#endif /* !CONFIG_ZEPHYR */ + + /* + * TODO(b/179648104): figure out correct timing + */ + + gpio_set_level(tcpc_rst, 0); + gpio_set_level(GPIO_USB_C1_RT_RST_R_ODL, 0); + + /* + * delay for power-on to reset-off and min. assertion time + */ + + msleep(20); + + gpio_set_level(tcpc_rst, 1); + gpio_set_level(GPIO_USB_C1_RT_RST_R_ODL, 1); + + /* wait for chips to come up */ + + msleep(50); +} + +static void board_tcpc_init(void) +{ + /* Don't reset TCPCs after initial reset */ + if (!system_jumped_late()) + board_reset_pd_mcu(); + + /* + * These IO expander pins are implemented using the + * C0 TCPC, so they must be set up after the TCPC has + * been taken out of reset. + */ +#ifndef CONFIG_ZEPHYR + ioex_init(IOEX_C0_NCT38XX); +#else + gpio_reset_port(DEVICE_DT_GET(DT_NODELABEL(ioex_port1))); +#endif + + /* Enable PPC interrupts. */ + gpio_enable_interrupt(GPIO_USB_C0_PPC_INT_ODL); + + /* Enable TCPC interrupts. */ + gpio_enable_interrupt(GPIO_USB_C0_TCPC_INT_ODL); + + gpio_enable_interrupt(GPIO_USB_C1_PPC_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C1_TCPC_INT_ODL); +} +DECLARE_HOOK(HOOK_INIT, board_tcpc_init, HOOK_PRIO_INIT_CHIPSET); + +uint16_t tcpc_get_alert_status(void) +{ + uint16_t status = 0; + + if (gpio_get_level(GPIO_USB_C0_TCPC_INT_ODL) == 0) + status |= PD_STATUS_TCPC_ALERT_0; + + if (gpio_get_level(GPIO_USB_C1_TCPC_INT_ODL) == 0) + status |= PD_STATUS_TCPC_ALERT_1; + + return status; +} + +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_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_TCPC_INT_ODL: + schedule_deferred_pd_interrupt(USBC_PORT_C0); + break; + case GPIO_USB_C1_TCPC_INT_ODL: + schedule_deferred_pd_interrupt(USBC_PORT_C1); + break; + default: + break; + } +} + +void ppc_interrupt(enum gpio_signal signal) +{ + switch (signal) { + case GPIO_USB_C0_PPC_INT_ODL: + syv682x_interrupt(USBC_PORT_C0); + break; + case GPIO_USB_C1_PPC_INT_ODL: + syv682x_interrupt(USBC_PORT_C1); + break; + default: + break; + } +} + +void retimer_interrupt(enum gpio_signal signal) +{ + /* + * TODO(b/179513527): add USB-C support + */ +} + +__override bool board_is_dts_port(int port) +{ + return port == USBC_PORT_C0; +} + +__override bool board_is_tbt_usb4_port(int port) +{ + if (port == USBC_PORT_C0) + return true; + + return false; +} + +__override enum tbt_compat_cable_speed board_get_max_tbt_speed(int port) +{ + if (!board_is_tbt_usb4_port(port)) + return TBT_SS_RES_0; + + return TBT_SS_TBT_GEN3; +} diff --git a/board/marasov/usbc_config.h b/board/marasov/usbc_config.h new file mode 100644 index 0000000000..1fa7ad4c7a --- /dev/null +++ b/board/marasov/usbc_config.h @@ -0,0 +1,17 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/* Brya board-specific USB-C configuration */ + +#ifndef __CROS_EC_USBC_CONFIG_H +#define __CROS_EC_USBC_CONFIG_H + +#ifndef CONFIG_ZEPHYR +#define CONFIG_USB_PD_PORT_MAX_COUNT 2 +#endif + +enum usbc_port { USBC_PORT_C0 = 0, USBC_PORT_C1, USBC_PORT_COUNT }; + +#endif /* __CROS_EC_USBC_CONFIG_H */ diff --git a/board/marasov/vif_override.xml b/board/marasov/vif_override.xml new file mode 100644 index 0000000000..6ade5d2f92 --- /dev/null +++ b/board/marasov/vif_override.xml @@ -0,0 +1,148 @@ +<?xml version="1.0" encoding="utf-8"?> +<vif:VIF xmlns="http://usb.org/VendorInfoFile.xsd"> + <vif:Product_Revision>2</vif:Product_Revision> + <vif:TID>0</vif:TID> + <vif:Product> + <vif:USB4_Num_Internal_Host_Controllers value="1" /> + <vif:USB4_Num_PCIe_DN_Bridges value="0" /> + <vif:USB4RouterList> + <vif:Usb4Router> + <!--USB4 Router 0--> + <vif:USB4_Router_ID value="0" /> + <vif:USB4_Silicon_VID value="32903">8087</vif:USB4_Silicon_VID> + <vif:USB4_Num_Lane_Adapters value="4" /> + <vif:USB4_Num_USB3_DN_Adapters value="1" /> + <vif:USB4_Num_DP_IN_Adapters value="1" /> + <vif:USB4_Num_DP_OUT_Adapters value="0" /> + <vif:USB4_Num_PCIe_DN_Adapters value="4" /> + <vif:USB4_TBT3_Not_Supported value="0">TBT3 Compatible</vif:USB4_TBT3_Not_Supported> + <vif:USB4_PCIe_Wake_Supported value="true" /> + <vif:USB4_USB3_Wake_Supported value="false" /> + <vif:USB4_Num_Unused_Adapters value="0" /> + <vif:USB4_TBT3_VID value="32903">8087</vif:USB4_TBT3_VID> + <vif:USB4_PCIe_Switch_Vendor_ID value="32902">8086</vif:USB4_PCIe_Switch_Vendor_ID> + <vif:USB4_PCIe_Switch_Device_ID value="39451">9A1B</vif:USB4_PCIe_Switch_Device_ID> + </vif:Usb4Router> + </vif:USB4RouterList> + </vif:Product> + + <vif:Component> + <vif:USB4_Max_Speed value="1">Gen 3 (40Gb)</vif:USB4_Max_Speed> + + <!--;USB Host--> + + <vif:Host_Speed value="4">USB 3.2 Gen 2x2</vif:Host_Speed> + <vif:Host_Contains_Captive_Retimer value="true" /> + <vif:Host_Truncates_DP_For_tDHPResponse value="false" /> + <vif:Host_Suspend_Supported value="true" /> + + <!--;PD Source--> + <!-- will we ever clear USB_Suspend_Supported? --> + <vif:USB_Suspend_May_Be_Cleared value="true" /> + + <!-- remove FR_Swap_* when we enable CONFIG_USB_PD_FRS --> + <!--;Dual Role--> + <vif:FR_Swap_Supported_As_Initial_Sink value="true" /> + <!--;PD Source--> + <vif:FR_Swap_Type_C_Current_Capability_As_Initial_Sink value="3">3A @ 5V</vif:FR_Swap_Type_C_Current_Capability_As_Initial_Sink> + <vif:SrcPdoList> + <vif:SrcPDO> + <!--Source PDO 1--> + <vif:Src_PD_OCP_OC_Debounce value="50">50 msec</vif:Src_PD_OCP_OC_Debounce> + <vif:Src_PD_OCP_OC_Threshold value="360">3600 mA</vif:Src_PD_OCP_OC_Threshold> + </vif:SrcPDO> + </vif:SrcPdoList> + + <!-- SOP Discover ID --> + <vif:Product_Type_UFP_SOP value="2">PDUSB Peripheral</vif:Product_Type_UFP_SOP> + <vif:Product_Type_DFP_SOP value="2">PDUSB Host</vif:Product_Type_DFP_SOP> + + <!-- USB4 Port --> + <vif:USB4_Lane_0_Adapter value="1" /> + <vif:USB4_UFP_Supported value="false" /> + <vif:USB4_DFP_Supported value="true" /> + <vif:USB4_USB3_Tunneling_Supported value="true" /> + <vif:USB4_DP_Tunneling_Supported value="true" /> + <vif:USB4_CL1_State_Supported value="true" /> + <vif:USB4_CL2_State_Supported value="true" /> + <vif:USB4_Num_Retimers value="1" /> + <vif:USB4_DP_Bit_Rate value="3">HBR3</vif:USB4_DP_Bit_Rate> + <vif:USB4_Num_DP_Lanes value="4">4 Lanes</vif:USB4_Num_DP_Lanes> + + </vif:Component> + + <vif:Component> + <vif:USB4_Supported value="false" /> + + <!--;USB Host--> + <vif:Host_Speed value="2">USB 3.2 Gen 2x1</vif:Host_Speed> + <vif:Host_Contains_Captive_Retimer value="true" /> + <vif:Host_Truncates_DP_For_tDHPResponse value="false" /> + <vif:Host_Suspend_Supported value="true" /> + + <!--;PD Source--> + <!-- will we ever clear USB_Suspend_Supported? --> + <vif:USB_Suspend_May_Be_Cleared value="true" /> + + <!-- remove FR_Swap_* when we enable CONFIG_USB_PD_FRS --> + <!--;Dual Role--> + <vif:FR_Swap_Supported_As_Initial_Sink value="true" /> + <!--;PD Source--> + <vif:FR_Swap_Type_C_Current_Capability_As_Initial_Sink value="3">3A @ 5V</vif:FR_Swap_Type_C_Current_Capability_As_Initial_Sink> + <vif:SrcPdoList> + <vif:SrcPDO> + <!--Source PDO 1--> + <vif:Src_PD_OCP_OC_Debounce value="50">50 msec</vif:Src_PD_OCP_OC_Debounce> + <vif:Src_PD_OCP_OC_Threshold value="360">3600 mA</vif:Src_PD_OCP_OC_Threshold> + </vif:SrcPDO> + </vif:SrcPdoList> + + <!-- SOP Discover ID --> + <vif:Product_Type_UFP_SOP value="3">PSD</vif:Product_Type_UFP_SOP> + <vif:Product_Type_DFP_SOP value="2">PDUSB Host</vif:Product_Type_DFP_SOP> + + </vif:Component> + + <vif:Component> + <vif:USB4_Max_Speed value="1">Gen 3 (40Gb)</vif:USB4_Max_Speed> + <!--;USB Host--> + <vif:Host_Speed value="4">USB 3.2 Gen 2x2</vif:Host_Speed> + <vif:Host_Contains_Captive_Retimer value="true" /> + <vif:Host_Truncates_DP_For_tDHPResponse value="false" /> + <vif:Host_Suspend_Supported value="true" /> + + <!--;PD Source--> + <!-- will we ever clear USB_Suspend_Supported? --> + <vif:USB_Suspend_May_Be_Cleared value="true" /> + + <!-- remove FR_Swap_* when we enable CONFIG_USB_PD_FRS --> + <!--;Dual Role--> + <vif:FR_Swap_Supported_As_Initial_Sink value="true" /> + <!--;PD Source--> + <vif:FR_Swap_Type_C_Current_Capability_As_Initial_Sink value="3">3A @ 5V</vif:FR_Swap_Type_C_Current_Capability_As_Initial_Sink> + <vif:SrcPdoList> + <vif:SrcPDO> + <!--Source PDO 1--> + <vif:Src_PD_OCP_OC_Debounce value="50">50 msec</vif:Src_PD_OCP_OC_Debounce> + <vif:Src_PD_OCP_OC_Threshold value="360">3600 mA</vif:Src_PD_OCP_OC_Threshold> + </vif:SrcPDO> + </vif:SrcPdoList> + + <!-- SOP Discover ID --> + <vif:Product_Type_UFP_SOP value="2">PDUSB Peripheral</vif:Product_Type_UFP_SOP> + <vif:Product_Type_DFP_SOP value="2">PDUSB Host</vif:Product_Type_DFP_SOP> + + <!-- USB4 Port --> + <vif:USB4_Lane_0_Adapter value="1" /> + <vif:USB4_UFP_Supported value="false" /> + <vif:USB4_DFP_Supported value="true" /> + <vif:USB4_USB3_Tunneling_Supported value="true" /> + <vif:USB4_DP_Tunneling_Supported value="true" /> + <vif:USB4_CL1_State_Supported value="true" /> + <vif:USB4_CL2_State_Supported value="true" /> + <vif:USB4_Num_Retimers value="1" /> + <vif:USB4_DP_Bit_Rate value="3">HBR3</vif:USB4_DP_Bit_Rate> + <vif:USB4_Num_DP_Lanes value="4">4 Lanes</vif:USB4_Num_DP_Lanes> + + </vif:Component> +</vif:VIF> diff --git a/board/marzipan/board.c b/board/marzipan/board.c index 125c39a826..cf59f133e7 100644 --- a/board/marzipan/board.c +++ b/board/marzipan/board.c @@ -496,6 +496,7 @@ void board_tcpc_init(void) /* Enable PPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_SWCTL_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C1_SWCTL_INT_ODL); /* Enable TCPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_PD_INT_ODL); @@ -625,8 +626,8 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* * Ignore lower charge ceiling on PD transition if our battery is @@ -638,8 +639,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, charge_ma = max_ma; } - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } uint16_t tcpc_get_alert_status(void) diff --git a/board/mchpevb1/board.c b/board/mchpevb1/board.c index 23135108f6..3b7b34843b 100644 --- a/board/mchpevb1/board.c +++ b/board/mchpevb1/board.c @@ -590,21 +590,6 @@ int board_set_active_charge_port(int charge_port) return EC_SUCCESS; } - -/** - * Set the charge limit based upon desired maximum. - * - * @param port Port number. - * @param supplier Charge supplier type. - * @param charge_ma Desired charge limit (mA). - * @param charge_mv Negotiated charge voltage (mV). - */ -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} #endif /* diff --git a/board/mchpevb1/board.h b/board/mchpevb1/board.h index 10208ca736..dd7c87fd6f 100644 --- a/board/mchpevb1/board.h +++ b/board/mchpevb1/board.h @@ -150,7 +150,8 @@ /* #define CONFIG_CHARGER_DISCHARGE_ON_AC */ /* #define CONFIG_CHARGER_ISL9237 */ /* #define CONFIG_CHARGER_ILIM_PIN_DISABLED */ -/* #define CONFIG_CHARGER_INPUT_CURRENT 512 */ +/* #define CONFIG_CHARGER_DEFAULT_CURRENT_LIMIT 512 */ +/* #define CONFIG_CHARGER_MIN_INPUT_CURRENT_LIMIT 512 */ /* #define CONFIG_CHARGER_NARROW_VDC */ /* #define CONFIG_CHARGER_PROFILE_OVERRIDE */ diff --git a/board/metaknight/board.c b/board/metaknight/board.c index 5aa3a21cc0..e5d86aba63 100644 --- a/board/metaknight/board.c +++ b/board/metaknight/board.c @@ -396,19 +396,6 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * b/147463641: The charger IC seems to overdraw ~4%, therefore we - * reduce our target accordingly. - */ - icl = icl * 96 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - __override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) { if (port < 0 || port > board_get_usb_pd_port_count()) diff --git a/board/metaknight/board.h b/board/metaknight/board.h index 5bd3c56a83..79027a3e9c 100644 --- a/board/metaknight/board.h +++ b/board/metaknight/board.h @@ -22,6 +22,11 @@ #undef CONFIG_CHARGER_SINGLE_CHIP #undef CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE #define CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE (100 * MSEC) +/* + * b/147463641: The charger IC seems to overdraw ~4%, therefore we + * reduce our target accordingly. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 /* * GPIO for C1 interrupts, for baseboard use diff --git a/board/mithrax/board.h b/board/mithrax/board.h index d12375d678..0b6ea04bd4 100644 --- a/board/mithrax/board.h +++ b/board/mithrax/board.h @@ -176,6 +176,7 @@ #define CONFIG_CHARGE_RAMP_SW #define CONFIG_CHARGER_SENSE_RESISTOR 10 #define CONFIG_CHARGER_SENSE_RESISTOR_AC 10 +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 10 /* RGB Keyboard */ #ifdef SECTION_IS_RW diff --git a/board/mithrax/charger_isl9241.c b/board/mithrax/charger_isl9241.c index a9eafe353e..7a16fcd5cb 100644 --- a/board/mithrax/charger_isl9241.c +++ b/board/mithrax/charger_isl9241.c @@ -79,11 +79,3 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } - -__overridable void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - charge_ma = (charge_ma * 90) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/moli/board.c b/board/moli/board.c index acc12f9831..a63c93ae50 100644 --- a/board/moli/board.c +++ b/board/moli/board.c @@ -8,11 +8,13 @@ #include "button.h" #include "charge_manager.h" #include "charge_state_v2.h" +#include "chipset.h" #include "common.h" #include "compile_time_macros.h" #include "console.h" #include "cros_board_info.h" #include "driver/tcpm/tcpci.h" +#include "fw_config.h" #include "gpio.h" #include "gpio_signal.h" #include "hooks.h" @@ -31,6 +33,32 @@ static void power_monitor(void); DECLARE_DEFERRED(power_monitor); /******************************************************************************/ +/* Power on by HDMI/ DP monitor */ +struct monitor_config { + enum gpio_signal gpio; + uint8_t state; +}; + +static struct monitor_config monitors[MONITOR_COUNT] = { + [HDMI1_MONITOR] = { + .gpio = GPIO_HDMI1_MONITOR_ON, + .state = MONITOR_OFF, + }, + + [HDMI2_MONITOR] = { + .gpio = GPIO_HDMI2_MONITOR_ON, + .state = MONITOR_OFF, + }, + + [OPTION_MONITOR] = { + .gpio = GPIO_OPTION_MONITOR_ON, + .state = MONITOR_OFF, + }, +}; + +/******************************************************************************/ + +/******************************************************************************/ /* USB-A charging control */ const int usb_port_enable[USB_PORT_COUNT] = { @@ -116,34 +144,6 @@ static uint8_t usbc_overcurrent; * only do that if the system is off since it might still brown out. */ -/* - * Barrel-jack power adapter ratings. - */ -static const struct { - int voltage; - int current; -} bj_power[] = { - { /* 0 - 90W (also default) */ - .voltage = 19000, - .current = 4740 }, - { /* 1 - 135W */ - .voltage = 19500, - .current = 6920 }, -}; - -static unsigned int ec_config_get_bj_power(void) -{ - uint32_t fw_config; - unsigned int bj; - - cbi_get_fw_config(&fw_config); - bj = (fw_config & EC_CFG_BJ_POWER_MASK) >> EC_CFG_BJ_POWER_L; - /* Out of range value defaults to 0 */ - if (bj >= ARRAY_SIZE(bj_power)) - bj = 0; - return bj; -} - #define ADP_DEBOUNCE_MS 1000 /* Debounce time for BJ plug/unplug */ /* Debounced connection state of the barrel jack */ static int8_t adp_connected = -1; @@ -155,12 +155,9 @@ static void adp_connect_deferred(void) /* Debounce */ if (connected == adp_connected) return; - if (connected) { - unsigned int bj = ec_config_get_bj_power(); + if (connected) + ec_bj_power(&pi.voltage, &pi.current); - pi.voltage = bj_power[bj].voltage; - pi.current = bj_power[bj].current; - } charge_manager_update_charge(CHARGE_SUPPLIER_DEDICATED, DEDICATED_CHARGE_PORT, &pi); adp_connected = connected; @@ -192,12 +189,29 @@ DECLARE_HOOK(HOOK_INIT, adp_state_init, HOOK_PRIO_INIT_CHARGE_MANAGER + 1); static void board_init(void) { + int i; + gpio_enable_interrupt(GPIO_BJ_ADP_PRESENT_ODL); gpio_enable_interrupt(GPIO_HDMI_CONN_OC_ODL); gpio_enable_interrupt(GPIO_USB_A1_OC_ODL); gpio_enable_interrupt(GPIO_USB_A2_OC_ODL); gpio_enable_interrupt(GPIO_USB_A3_OC_ODL); gpio_enable_interrupt(GPIO_USB_A4_OC_ODL); + + if (ec_cfg_power_on_monitor() == POWER_ON_MONITOR_ENABLE) { + /* + * Only enable interrupt when fw_config set it as enable. + */ + gpio_enable_interrupt(GPIO_HDMI1_MONITOR_ON); + gpio_enable_interrupt(GPIO_HDMI2_MONITOR_ON); + gpio_enable_interrupt(GPIO_OPTION_MONITOR_ON); + + /* + * Initialize the monitor state to corresponding gpio state. + */ + for (i = 0; i < MONITOR_COUNT; i++) + monitors[i].state = gpio_get_level(monitors[i].gpio); + } } DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT); @@ -432,3 +446,72 @@ static void power_monitor(void) * Start power monitoring after ADCs have been initialised. */ DECLARE_HOOK(HOOK_INIT, power_monitor, HOOK_PRIO_INIT_ADC + 1); + +/******************************************************************************/ +/* + * System power on and wake up by monitor power button. + * + * After pressing power button of monitor for power on, monitor will send power + * on signal with 3.3V / 200ms to DT. If DT detect that pulse, there are three + * DT behavior: + * + * - Do nothing in state S0. + * - Wake up from state S0ix. + * - Power on from state S5 and G3. + */ + +/* Debounce time for HDMI power button press */ +#define MONITOR_DEBOUNCE_MS 100 + +static void monitor_irq_deferred(void); +DECLARE_DEFERRED(monitor_irq_deferred); + +static void monitor_irq_deferred(void) +{ + int i; + + for (i = 0; i < MONITOR_COUNT; i++) { + if (monitors[i].state && gpio_get_level(monitors[i].gpio)) { + /* + * System power on from state S5 and G3. + */ + if (chipset_in_state(CHIPSET_STATE_ANY_OFF)) + chipset_power_on(); + /* + * System wake up from state S0ix. + */ + else if (chipset_in_state(CHIPSET_STATE_ANY_SUSPEND)) + power_button_simulate_press(200); + } + monitors[i].state = MONITOR_OFF; + } +} + +/* Power on by HDMI/ DP monitor. */ +void monitor_interrupt(enum gpio_signal signal) +{ + /* + * Power on by HDMI/ DP monitor only works + * when system is not in S0. + */ + if (chipset_in_state(CHIPSET_STATE_ON)) + return; + + if (ec_cfg_power_on_monitor() == POWER_ON_MONITOR_ENABLE) { + switch (signal) { + case GPIO_HDMI1_MONITOR_ON: + monitors[HDMI1_MONITOR].state = MONITOR_ON; + break; + case GPIO_HDMI2_MONITOR_ON: + monitors[HDMI2_MONITOR].state = MONITOR_ON; + break; + case GPIO_OPTION_MONITOR_ON: + monitors[OPTION_MONITOR].state = MONITOR_ON; + break; + default: + break; + } + hook_call_deferred(&monitor_irq_deferred_data, + MONITOR_DEBOUNCE_MS * MSEC); + } +} diff --git a/board/moli/board.h b/board/moli/board.h index e7aa7855e7..8d0ba97fb2 100644 --- a/board/moli/board.h +++ b/board/moli/board.h @@ -181,17 +181,17 @@ enum fan_channel { FAN_CH_0 = 0, FAN_CH_COUNT }; enum mft_channel { MFT_CH_0 = 0, MFT_CH_COUNT }; -/* - * firmware config fields - */ -/* - * Barrel-jack power (2 bits). - */ -#define EC_CFG_BJ_POWER_L 0 -#define EC_CFG_BJ_POWER_H 1 -#define EC_CFG_BJ_POWER_MASK GENMASK(EC_CFG_BJ_POWER_H, EC_CFG_BJ_POWER_L) +enum monitor_port { + HDMI1_MONITOR, + HDMI2_MONITOR, + OPTION_MONITOR, + MONITOR_COUNT +}; + +enum monitor_state { MONITOR_OFF, MONITOR_ON }; extern void adp_connect_interrupt(enum gpio_signal signal); +extern void monitor_interrupt(enum gpio_signal signal); #endif /* !__ASSEMBLER__ */ diff --git a/board/moli/build.mk b/board/moli/build.mk index 4897d446b2..4ddfaaf181 100644 --- a/board/moli/build.mk +++ b/board/moli/build.mk @@ -20,3 +20,4 @@ board-y+=pwm.o board-y+=sensors.o board-y+=thermal.o board-y+=usbc_config.o +board-y+=fw_config.o diff --git a/board/moli/fw_config.c b/board/moli/fw_config.c new file mode 100644 index 0000000000..5807ee9111 --- /dev/null +++ b/board/moli/fw_config.c @@ -0,0 +1,73 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "cbi.h" +#include "common.h" +#include "compile_time_macros.h" +#include "console.h" +#include "cros_board_info.h" +#include "fw_config.h" + +#define CPRINTS(format, args...) cprints(CC_SYSTEM, format, ##args) + +static union moli_cbi_fw_config fw_config; +BUILD_ASSERT(sizeof(fw_config) == sizeof(uint32_t)); + +/* + * FW_CONFIG defaults for moli if the CBI.FW_CONFIG data is not + * initialized. + */ +static const union moli_cbi_fw_config fw_config_defaults = { + .bj_power = BJ_90W, + .po_mon = POWER_ON_MONITOR_ENABLE, +}; + +/* + * Barrel-jack power adapter ratings. + */ +static const struct { + int voltage; + int current; +} bj_power[] = { + [BJ_90W] = { /* 0 - 90W (also default) */ + .voltage = 19000, + .current = 4740 }, + [BJ_135W] = { /* 1 - 135W */ + .voltage = 19500, + .current = 6920 }, +}; + +/**************************************************************************** + * Moli FW_CONFIG access + */ +void board_init_fw_config(void) +{ + if (cbi_get_fw_config(&fw_config.raw_value)) { + CPRINTS("CBI: Read FW_CONFIG failed, using board defaults"); + fw_config = fw_config_defaults; + } +} + +union moli_cbi_fw_config get_fw_config(void) +{ + return fw_config; +} + +void ec_bj_power(uint32_t *voltage, uint32_t *current) +{ + unsigned int bj; + + bj = fw_config.bj_power; + /* Out of range value defaults to 0 */ + if (bj >= ARRAY_SIZE(bj_power)) + bj = 0; + *voltage = bj_power[bj].voltage; + *current = bj_power[bj].current; +} + +enum ec_cfg_power_on_monitor ec_cfg_power_on_monitor(void) +{ + return fw_config.po_mon; +} diff --git a/board/moli/fw_config.h b/board/moli/fw_config.h new file mode 100644 index 0000000000..ee3dcd274d --- /dev/null +++ b/board/moli/fw_config.h @@ -0,0 +1,53 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef __BOARD_MOLI_FW_CONFIG_H_ +#define __BOARD_MOLI_FW_CONFIG_H_ + +#include <stdint.h> + +/**************************************************************************** + * CBI FW_CONFIG layout for Moli board. + * + * Source of truth is the project/brask/moli/config.star configuration file. + */ + +enum ec_cfg_bj_power { BJ_90W = 0, BJ_135W = 1 }; + +enum ec_cfg_power_on_monitor { + POWER_ON_MONITOR_ENABLE = 0, + POWER_ON_MONITOR_DISABLE = 1 +}; + +union moli_cbi_fw_config { + struct { + uint32_t bj_power : 2; + uint32_t mlb_usb_tbt : 2; + uint32_t storage : 2; + uint32_t audio : 1; + enum ec_cfg_power_on_monitor po_mon : 1; + uint32_t reserved_1 : 24; + }; + uint32_t raw_value; +}; + +/** + * Read the cached FW_CONFIG. Guaranteed to have valid values. + * + * @return the FW_CONFIG for the board. + */ +union moli_cbi_fw_config get_fw_config(void); + +/** + * Get the barrel-jack power from FW_CONFIG. + */ +void ec_bj_power(uint32_t *voltage, uint32_t *current); + +/** + * Get enable/disable power on by monitor from FW_CONFIG. + */ +enum ec_cfg_power_on_monitor ec_cfg_power_on_monitor(void); + +#endif /* __BOARD_MOLI_FW_CONFIG_H_ */ diff --git a/board/moli/gpio.inc b/board/moli/gpio.inc index fb3b508573..e8473f8c95 100644 --- a/board/moli/gpio.inc +++ b/board/moli/gpio.inc @@ -25,6 +25,9 @@ GPIO_INT(EC_RECOVERY_BTN_ODL, PIN(2, 3), GPIO_INT_BOTH, button_interrupt) GPIO_INT(USB_C1_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(HDMI1_MONITOR_ON, PIN(B, 4), GPIO_INT_RISING, monitor_interrupt) +GPIO_INT(HDMI2_MONITOR_ON, PIN(B, 5), GPIO_INT_RISING, monitor_interrupt) +GPIO_INT(OPTION_MONITOR_ON, PIN(1, 0), GPIO_INT_RISING, monitor_interrupt) /* CCD */ GPIO(CCD_MODE_ODL, PIN(E, 5), GPIO_INPUT) @@ -120,12 +123,9 @@ GPIO(LED_ORANGE_CONTROL, PIN(3, 1), GPIO_ODR_LOW) GPIO(LED_BLUE_CONTROL, PIN(2, 5), GPIO_ODR_LOW) /* Option Board */ -GPIO(HDMI1_MONITOR_ON, PIN(B, 4), GPIO_INPUT) -GPIO(HDMI1_MONON_SIO, PIN(1, 6), GPIO_ODR_LOW) -GPIO(OPTION_MONITOR_ON, PIN(1, 0), GPIO_INPUT) -GPIO(OPTION_MONON_SIO, PIN(2, 1), GPIO_ODR_LOW) -GPIO(HDMI2_MONITOR_ON, PIN(B, 5), GPIO_INPUT) -GPIO(HDMI2_MONON_SIO, PIN(1, 5), GPIO_ODR_LOW) +GPIO(HDMI1_MONON_SIO, PIN(1, 6), GPIO_INPUT) +GPIO(HDMI2_MONON_SIO, PIN(1, 5), GPIO_INPUT) +GPIO(OPTION_MONON_SIO, PIN(2, 1), GPIO_INPUT) 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) diff --git a/board/moli/led.c b/board/moli/led.c index f2ab214418..edb429e530 100644 --- a/board/moli/led.c +++ b/board/moli/led.c @@ -270,8 +270,8 @@ int led_set_brightness(enum ec_led_id id, const uint8_t *brightness) return set_color(id, LED_OFF, 0); } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* Blink alert if insufficient power per system_can_boot_ap(). */ int insufficient_power = diff --git a/board/mrbland/board.c b/board/mrbland/board.c index 50ba008512..52b1c50a1b 100644 --- a/board/mrbland/board.c +++ b/board/mrbland/board.c @@ -585,8 +585,8 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* * Ignore lower charge ceiling on PD transition if our battery is @@ -598,9 +598,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, charge_ma = max_ma; } - charge_ma = charge_ma * 95 / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } uint16_t tcpc_get_alert_status(void) diff --git a/board/mrbland/board.h b/board/mrbland/board.h index 0f78db50d9..cc6207ca83 100644 --- a/board/mrbland/board.h +++ b/board/mrbland/board.h @@ -24,6 +24,8 @@ #define CONFIG_BATTERY_FUEL_GAUGE #define CONFIG_BATTERY_VENDOR_PARAM +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 + /* Enable PD3.0 */ #define CONFIG_USB_PD_REV30 diff --git a/board/munna/board.c b/board/munna/board.c index f6996b8460..6d7b35da1c 100644 --- a/board/munna/board.c +++ b/board/munna/board.c @@ -236,14 +236,6 @@ int board_set_active_charge_port(int charge_port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - charge_ma = (charge_ma * 95) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - int board_discharge_on_ac(int enable) { int ret, port; diff --git a/board/munna/board.h b/board/munna/board.h index 5dc35c68df..20194bed88 100644 --- a/board/munna/board.h +++ b/board/munna/board.h @@ -40,6 +40,7 @@ #define CONFIG_BATTERY_HW_PRESENT_CUSTOM #define CONFIG_CHARGER_PSYS +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define CONFIG_CHARGER_RUNTIME_CONFIG diff --git a/board/nami/board.c b/board/nami/board.c index 02fb27a283..2ab66ab951 100644 --- a/board/nami/board.c +++ b/board/nami/board.c @@ -747,8 +747,8 @@ int board_set_active_charge_port(int charge_port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* * Limit the input current to 96% negotiated limit, @@ -760,8 +760,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, (model == MODEL_EKKO || model == MODEL_BARD)) factor = 95; charge_ma = charge_ma * factor / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } void board_hibernate(void) diff --git a/board/nami/board.h b/board/nami/board.h index 51cde41acb..652db4826d 100644 --- a/board/nami/board.h +++ b/board/nami/board.h @@ -96,7 +96,8 @@ #define CONFIG_CHARGER #define CONFIG_CHARGER_ISL9238 #define CONFIG_CHARGER_DISCHARGE_ON_AC -#define CONFIG_CHARGER_INPUT_CURRENT 512 +#define CONFIG_CHARGER_DEFAULT_CURRENT_LIMIT 512 +#define CONFIG_CHARGER_MIN_INPUT_CURRENT_LIMIT 512 #define CONFIG_CHARGER_MIN_POWER_MW_FOR_POWER_ON 27000 #define CONFIG_CHARGER_MIN_POWER_MW_FOR_POWER_ON_WITH_BATT 15000 /* AP's thresholds. */ diff --git a/board/nautilus/board.c b/board/nautilus/board.c index 3cdd7abaf1..af7d7f48d4 100644 --- a/board/nautilus/board.c +++ b/board/nautilus/board.c @@ -528,26 +528,6 @@ int board_set_active_charge_port(int charge_port) } /** - * Set the charge limit based upon desired maximum. - * - * @param port Port number. - * @param supplier Charge supplier type. - * @param charge_ma Desired charge limit (mA). - * @param charge_mv Negotiated charge voltage (mV). - */ -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - /* - * Limit the input current to 96% negotiated limit, - * to account for the charger chip margin. - */ - charge_ma = charge_ma * 96 / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - -/** * Return the maximum allowed input current */ int board_get_ramp_current_limit(int supplier, int sup_curr) diff --git a/board/nautilus/board.h b/board/nautilus/board.h index cbca28a71f..2b4f25538d 100644 --- a/board/nautilus/board.h +++ b/board/nautilus/board.h @@ -79,11 +79,13 @@ #define CONFIG_CHARGER #define CONFIG_CHARGER_ISL9238 #define CONFIG_CHARGER_DISCHARGE_ON_AC -#define CONFIG_CHARGER_INPUT_CURRENT 512 +#define CONFIG_CHARGER_DEFAULT_CURRENT_LIMIT 512 +#define CONFIG_CHARGER_MIN_INPUT_CURRENT_LIMIT 512 #define CONFIG_CHARGER_PROFILE_OVERRIDE #define CONFIG_CHARGER_PSYS #define CONFIG_CHARGER_SENSE_RESISTOR 10 #define CONFIG_CHARGER_SENSE_RESISTOR_AC 20 +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 /* margining */ #define CONFIG_CMD_CHARGER_ADC_AMON_BMON #define CONFIG_HOSTCMD_PD_CONTROL #define CONFIG_EXTPOWER_GPIO diff --git a/board/nocturne/board.c b/board/nocturne/board.c index d32f036844..1c0b2b3397 100644 --- a/board/nocturne/board.c +++ b/board/nocturne/board.c @@ -760,19 +760,6 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * Nocturne seems to overdraw its set input current limit by about 5%. - * Request at most 95% of what's desired. - */ - icl = icl * 95 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - static void board_chipset_reset(void) { board_report_pmic_fault("CHIPSET RESET"); diff --git a/board/nocturne/board.h b/board/nocturne/board.h index 279016ec98..73700b8480 100644 --- a/board/nocturne/board.h +++ b/board/nocturne/board.h @@ -8,6 +8,8 @@ #ifndef __CROS_EC_BOARD_H #define __CROS_EC_BOARD_H +#define CONFIG_LTO + /* * By default, enable all console messages excepted HC, ACPI and event: * The sensor stack is generating a lot of activity. @@ -31,6 +33,7 @@ #define CONFIG_ADC #define CONFIG_BACKLIGHT_LID #define CONFIG_HOST_INTERFACE_ESPI +#define CONFIG_FPU #define CONFIG_I2C #define CONFIG_I2C_BUS_MAY_BE_UNPOWERED #define CONFIG_I2C_CONTROLLER @@ -67,8 +70,14 @@ #define CONFIG_CHARGE_MANAGER #define CONFIG_CHARGER #define CONFIG_CHARGER_DISCHARGE_ON_AC -#define CONFIG_CHARGER_INPUT_CURRENT 128 +#define CONFIG_CHARGER_DEFAULT_CURRENT_LIMIT 128 +#define CONFIG_CHARGER_MIN_INPUT_CURRENT_LIMIT 128 #define CONFIG_CHARGER_ISL9238 +/* + * Nocturne seems to overdraw its set input current limit by about 5%. + * Request at most 95% of what's desired. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #undef CONFIG_CHARGER_MIN_BAT_PCT_FOR_POWER_ON #define CONFIG_CHARGER_MIN_BAT_PCT_FOR_POWER_ON 1 #define CONFIG_CHARGER_PROFILE_OVERRIDE diff --git a/board/nocturne_fp/board.h b/board/nocturne_fp/board.h index e7d34445b0..d95df6101a 100644 --- a/board/nocturne_fp/board.h +++ b/board/nocturne_fp/board.h @@ -110,7 +110,6 @@ #define CONFIG_SHA256 #define CONFIG_SHA256_UNROLLED #define CONFIG_SPI -#define CONFIG_STM_HWTIMER32 #undef CONFIG_TASK_PROFILING #define CONFIG_WATCHDOG_HELP #define CONFIG_WP_ACTIVE_HIGH diff --git a/board/nocturne_fp/build.mk b/board/nocturne_fp/build.mk index 65ffd6c096..2bc59c1f13 100644 --- a/board/nocturne_fp/build.mk +++ b/board/nocturne_fp/build.mk @@ -29,6 +29,7 @@ test-list-y=\ abort \ aes \ always_memset \ + benchmark \ cec \ compile_time_macros \ cortexm_fpu \ @@ -39,6 +40,8 @@ test-list-y=\ flash_write_protect \ fpsensor \ fpsensor_hw \ + ftrapv \ + libc_printf \ mpu \ mutex \ panic \ @@ -46,6 +49,7 @@ test-list-y=\ pingpong \ printf \ queue \ + rng_benchmark \ rollback \ rollback_entropy \ rsa3 \ diff --git a/board/nucleo-dartmonkey/build.mk b/board/nucleo-dartmonkey/build.mk index 2e3e1f31d2..b544490fc9 100644 --- a/board/nucleo-dartmonkey/build.mk +++ b/board/nucleo-dartmonkey/build.mk @@ -22,11 +22,13 @@ test-list-y=\ flash_write_protect \ fpsensor \ fpsensor_hw \ + libc_printf \ mpu \ mutex \ pingpong \ printf \ queue \ + rng_benchmark \ rollback \ rollback_entropy \ rsa3 \ diff --git a/board/nucleo-f072rb/board.h b/board/nucleo-f072rb/board.h index d807209564..bd957d35db 100644 --- a/board/nucleo-f072rb/board.h +++ b/board/nucleo-f072rb/board.h @@ -16,7 +16,6 @@ #define CONFIG_UART_CONSOLE 2 /* Optional features */ -#define CONFIG_STM_HWTIMER32 #ifdef CTS_MODULE #undef STM32_IRQ_EXT2_3_PRIORITY diff --git a/board/nucleo-f411re/board.h b/board/nucleo-f411re/board.h index d4e299dcff..3b7d5f1bf1 100644 --- a/board/nucleo-f411re/board.h +++ b/board/nucleo-f411re/board.h @@ -19,7 +19,6 @@ /* Optional features */ #undef CONFIG_LID_SWITCH #undef CONFIG_HIBERNATE -#define CONFIG_STM_HWTIMER32 #define CONFIG_WATCHDOG_HELP #define CONFIG_TASK_PROFILING diff --git a/board/nucleo-f412zg/build.mk b/board/nucleo-f412zg/build.mk index 21a2955bc4..d923a7a40f 100644 --- a/board/nucleo-f412zg/build.mk +++ b/board/nucleo-f412zg/build.mk @@ -19,11 +19,13 @@ test-list-y=\ exception \ flash_physical \ flash_write_protect \ + libc_printf \ mpu \ mutex \ pingpong \ printf \ queue \ + rng_benchmark \ rollback \ rollback_entropy \ rsa3 \ diff --git a/board/nucleo-g431rb/board.h b/board/nucleo-g431rb/board.h index 905b4ea110..e2df8d2547 100644 --- a/board/nucleo-g431rb/board.h +++ b/board/nucleo-g431rb/board.h @@ -12,7 +12,6 @@ #define CONFIG_SYSTEM_UNLOCKED /* Allow dangerous commands while in dev. */ #define CPU_CLOCK 48000000 -#define CONFIG_STM_HWTIMER32 #define TIM_CLOCK32 2 #define TIM_CLOCK_MSB 3 #define TIM_CLOCK_LSB 15 diff --git a/board/nucleo-h743zi/build.mk b/board/nucleo-h743zi/build.mk index 6153d85d8a..ad04a68918 100644 --- a/board/nucleo-h743zi/build.mk +++ b/board/nucleo-h743zi/build.mk @@ -19,11 +19,13 @@ test-list-y=\ exception \ flash_physical \ flash_write_protect \ + libc_printf \ mpu \ mutex \ pingpong \ printf \ queue \ + rng_benchmark \ rollback \ rollback_entropy \ rsa3 \ diff --git a/board/oak/board.c b/board/oak/board.c index 468b6e6677..17908caa7a 100644 --- a/board/oak/board.c +++ b/board/oak/board.c @@ -357,11 +357,10 @@ int board_set_active_charge_port(int charge_port) * @param charge_ma Desired charge limit (mA). * @param charge_mv Negotiated charge voltage (mV). */ -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); pd_send_host_event(PD_EVENT_POWER_CHANGE); } diff --git a/board/oak/board.h b/board/oak/board.h index 6f5ed3fc87..c429a655c5 100644 --- a/board/oak/board.h +++ b/board/oak/board.h @@ -14,6 +14,7 @@ /* Free up some flash space */ #define CONFIG_DEBUG_ASSERT_BRIEF #define CONFIG_USB_PD_DEBUG_LEVEL 0 +#undef CONFIG_CONSOLE_CMDHELP #define CONFIG_LTO @@ -39,7 +40,8 @@ #define CONFIG_CHARGE_MANAGER #define CONFIG_CHARGER -#define CONFIG_CHARGER_INPUT_CURRENT 512 +#define CONFIG_CHARGER_DEFAULT_CURRENT_LIMIT 512 +#define CONFIG_CHARGER_MIN_INPUT_CURRENT_LIMIT 512 #if BOARD_REV == OAK_REV1 #define CONFIG_CHARGER_BQ24773 @@ -105,7 +107,6 @@ #define CONFIG_USB_PD_VBUS_DETECT_TCPC #define CONFIG_SPI #define CONFIG_SPI_CONTROLLER -#define CONFIG_STM_HWTIMER32 #define CONFIG_VBOOT_HASH #undef CONFIG_WATCHDOG_HELP #define CONFIG_SWITCH diff --git a/board/osiris/charger.c b/board/osiris/charger.c index 88f5b85a41..7a16fcd5cb 100644 --- a/board/osiris/charger.c +++ b/board/osiris/charger.c @@ -79,10 +79,3 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } - -__overridable void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/pazquel/board.c b/board/pazquel/board.c index 6ed03e90ad..1efad2255f 100644 --- a/board/pazquel/board.c +++ b/board/pazquel/board.c @@ -305,6 +305,7 @@ void board_tcpc_init(void) /* Enable PPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_SWCTL_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C1_SWCTL_INT_ODL); /* Enable TCPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_PD_INT_ODL); @@ -533,8 +534,8 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* * Ignore lower charge ceiling on PD transition if our battery is @@ -546,8 +547,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, charge_ma = max_ma; } - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } uint16_t tcpc_get_alert_status(void) diff --git a/board/pdeval-stm32f072/board.h b/board/pdeval-stm32f072/board.h index 4cb55573f4..6ba7923b8e 100644 --- a/board/pdeval-stm32f072/board.h +++ b/board/pdeval-stm32f072/board.h @@ -21,7 +21,6 @@ #define CONFIG_HW_CRC #define CONFIG_I2C #define CONFIG_I2C_CONTROLLER -#define CONFIG_STM_HWTIMER32 /* USB Power Delivery configuration */ #define CONFIG_USB_POWER_DELIVERY #define CONFIG_USB_PD_TCPMV1 diff --git a/board/pico/board.c b/board/pico/board.c index f884545b6d..801c344a69 100644 --- a/board/pico/board.c +++ b/board/pico/board.c @@ -320,14 +320,6 @@ int board_set_active_charge_port(int charge_port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - charge_ma = (charge_ma * 95) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - int board_discharge_on_ac(int enable) { int ret, port; diff --git a/board/pico/board.h b/board/pico/board.h index 665cf59691..97128b54f1 100644 --- a/board/pico/board.h +++ b/board/pico/board.h @@ -28,6 +28,7 @@ #define CONFIG_BATTERY_HW_PRESENT_CUSTOM #define CONFIG_CHARGER_PSYS +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define CONFIG_CHARGER_RUNTIME_CONFIG diff --git a/board/pirika/board.c b/board/pirika/board.c index 8913ec0f07..ae1c74bdfc 100644 --- a/board/pirika/board.c +++ b/board/pirika/board.c @@ -491,18 +491,6 @@ uint16_t tcpc_get_alert_status(void) return status; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * TODO(b/151955431): Characterize the input current limit in case a - * scaling needs to be applied here - */ - charge_set_input_current_limit(icl, charge_mv); -} - int board_is_sourcing_vbus(int port) { int regval; @@ -590,7 +578,7 @@ __override void ocpc_get_pid_constants(int *kp, int *kp_div, int *ki, __override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) { - if (port < 0 || port > board_get_usb_pd_port_count()) + if (!board_is_usb_pd_port_present(port)) return; raa489000_set_output_current(port, rp); diff --git a/board/plankton/board.h b/board/plankton/board.h index 224364269b..a17bd30c3c 100644 --- a/board/plankton/board.h +++ b/board/plankton/board.h @@ -16,7 +16,6 @@ #define CONFIG_UART_CONSOLE 2 /* Optional features */ -#define CONFIG_STM_HWTIMER32 #define CONFIG_USB_POWER_DELIVERY #define CONFIG_USB_PD_TCPMV1 #define CONFIG_USB_PD_ALT_MODE diff --git a/board/polyberry/board.h b/board/polyberry/board.h index 41069f2722..1390bb996c 100644 --- a/board/polyberry/board.h +++ b/board/polyberry/board.h @@ -60,7 +60,6 @@ #undef CONFIG_WATCHDOG /* Optional features */ -#define CONFIG_STM_HWTIMER32 /* * Allow dangerous commands all the time, since we don't have a write protect diff --git a/board/pompom/board.c b/board/pompom/board.c index 394f06be8e..ccaff4f55f 100644 --- a/board/pompom/board.c +++ b/board/pompom/board.c @@ -269,8 +269,6 @@ DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT); void board_hibernate(void) { - int i; - /* * Sensors are unpowered in hibernate. Apply PD to the * interrupt lines such that they don't float. @@ -290,8 +288,7 @@ void board_hibernate(void) * otherwise, ACOK won't go High and can't wake EC up. Check the * bug b/170324206 for details. */ - for (i = 0; i < CONFIG_USB_PD_PORT_MAX_COUNT; i++) - ppc_vbus_sink_enable(i, 1); + ppc_vbus_sink_enable(USB_PD_PORT_C0, 1); } __override uint16_t board_get_ps8xxx_product_id(int port) @@ -323,9 +320,9 @@ void board_tcpc_init(void) * Initialize HPD to low; after sysjump SOC needs to see * HPD pulse to enable video path */ - for (int port = 0; port < CONFIG_USB_PD_PORT_MAX_COUNT; ++port) - usb_mux_hpd_update(port, USB_PD_MUX_HPD_LVL_DEASSERTED | - USB_PD_MUX_HPD_IRQ_DEASSERTED); + usb_mux_hpd_update(USB_PD_PORT_C0, + USB_PD_MUX_HPD_LVL_DEASSERTED | + USB_PD_MUX_HPD_IRQ_DEASSERTED); } DECLARE_HOOK(HOOK_INIT, board_tcpc_init, HOOK_PRIO_INIT_I2C + 1); @@ -405,24 +402,20 @@ void board_overcurrent_event(int port, int is_overcurrented) int board_set_active_charge_port(int port) { - int is_real_port = (port >= 0 && port < CONFIG_USB_PD_PORT_MAX_COUNT); - int i; + int is_real_port = (port == USB_PD_PORT_C0); if (!is_real_port && port != CHARGE_PORT_NONE) return EC_ERROR_INVAL; if (port == CHARGE_PORT_NONE) { CPRINTS("Disabling all charging port"); - - /* Disable all ports. */ - for (i = 0; i < CONFIG_USB_PD_PORT_MAX_COUNT; i++) { - /* - * Do not return early if one fails otherwise we can - * get into a boot loop assertion failure. - */ - if (board_vbus_sink_enable(i, 0)) - CPRINTS("Disabling p%d sink path failed.", i); - } + /* + * Do not return early if one fails otherwise we can + * get into a boot loop assertion failure. + */ + if (board_vbus_sink_enable(USB_PD_PORT_C0, 0)) + CPRINTS("Disabling p%d sink path failed.", + USB_PD_PORT_C0); return EC_SUCCESS; } @@ -435,18 +428,6 @@ int board_set_active_charge_port(int port) CPRINTS("New charge port: p%d", port); - /* - * Turn off the other ports' sink path FETs, before enabling the - * requested charge port. - */ - for (i = 0; i < CONFIG_USB_PD_PORT_MAX_COUNT; i++) { - if (i == port) - continue; - - if (board_vbus_sink_enable(i, 0)) - CPRINTS("p%d: sink path disable failed.", i); - } - /* Enable requested charge port. */ if (board_vbus_sink_enable(port, 1)) { CPRINTS("p%d: sink path enable failed.", port); @@ -456,8 +437,8 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* * Ignore lower charge ceiling on PD transition if our battery is @@ -469,9 +450,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, charge_ma = max_ma; } - charge_ma = charge_ma * 95 / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } uint16_t tcpc_get_alert_status(void) diff --git a/board/pompom/board.h b/board/pompom/board.h index 40e7185c16..774b339273 100644 --- a/board/pompom/board.h +++ b/board/pompom/board.h @@ -23,6 +23,8 @@ /* BC 1.2 Charger */ #define CONFIG_BC12_DETECT_PI3USB9201 +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 + /* USB */ #define CONFIG_USB_PD_TCPM_MULTI_PS8XXX #define CONFIG_USB_PD_TCPM_PS8751 @@ -30,6 +32,7 @@ #define CONFIG_USB_PD_TCPM_PS8805 #define CONFIG_USBC_PPC_SN5S330 #define CONFIG_USB_PD_PORT_MAX_COUNT 1 +#define USB_PD_PORT_C0 0 /* USB-A */ #define USB_PORT_COUNT 1 diff --git a/board/poppy/board.c b/board/poppy/board.c index 38183c0da0..ab3f3b40b0 100644 --- a/board/poppy/board.c +++ b/board/poppy/board.c @@ -58,9 +58,6 @@ #define USB_PD_PORT_ANX74XX 0 -/* Minimum input current limit. */ -#define ILIM_MIN_MA 472 - static void tcpc_alert_event(enum gpio_signal signal) { if ((signal == GPIO_USB_C0_PD_INT_ODL) && @@ -679,8 +676,8 @@ int board_set_active_charge_port(int charge_port) * @param charge_ma Desired charge limit (mA). * @param charge_mv Negotiated charge voltage (mV). */ -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* Adjust ILIM according to measurements to eliminate overshoot. */ charge_ma = (charge_ma - 500) * 31 / 32 + 472; @@ -688,7 +685,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, if (charge_mv > 5000) charge_ma -= 52; - charge_set_input_current_limit(MAX(charge_ma, ILIM_MIN_MA), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } void board_hibernate(void) diff --git a/board/poppy/board.h b/board/poppy/board.h index b55dc1d818..5242c1d3a8 100644 --- a/board/poppy/board.h +++ b/board/poppy/board.h @@ -89,7 +89,8 @@ #define CONFIG_CHARGER #define CONFIG_CHARGER_ISL9238 #define CONFIG_CHARGER_DISCHARGE_ON_AC -#define CONFIG_CHARGER_INPUT_CURRENT 512 +#define CONFIG_CHARGER_DEFAULT_CURRENT_LIMIT 512 +#define CONFIG_CHARGER_MIN_INPUT_CURRENT_LIMIT 472 #define CONFIG_CHARGER_PSYS #define CONFIG_CHARGER_SENSE_RESISTOR 10 #define CONFIG_CHARGER_SENSE_RESISTOR_AC 20 diff --git a/board/primus/board.c b/board/primus/board.c index 8b5f1a86fc..3f438cee00 100644 --- a/board/primus/board.c +++ b/board/primus/board.c @@ -137,8 +137,7 @@ __override void board_set_charge_limit(int port, int supplier, int charge_ma, else charge_ma = charge_ma * 93 / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } static void configure_input_current_limit(void) @@ -159,9 +158,7 @@ static void configure_input_current_limit(void) else adapter_current_ma = adapter_current_ma * 97 / 100; - charge_set_input_current_limit(MAX(adapter_current_ma, - CONFIG_CHARGER_INPUT_CURRENT), - adapter_current_mv); + charge_set_input_current_limit(adapter_current_ma, adapter_current_mv); } DECLARE_HOOK(HOOK_CHIPSET_STARTUP, configure_input_current_limit, HOOK_PRIO_DEFAULT); diff --git a/board/primus/charger.c b/board/primus/charger.c index a4fa209246..7fabd2082e 100644 --- a/board/primus/charger.c +++ b/board/primus/charger.c @@ -81,10 +81,3 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } - -__overridable void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/prism/board.h b/board/prism/board.h index 5c3cabce53..42768de2e7 100644 --- a/board/prism/board.h +++ b/board/prism/board.h @@ -111,7 +111,6 @@ #define CONFIG_LTO #define CONFIG_FORCE_CONSOLE_RESUME #define CONFIG_MATH_UTIL -#define CONFIG_STM_HWTIMER32 /* USB Configuration */ #define CONFIG_USB diff --git a/board/puff/board.c b/board/puff/board.c index d863b5fc0b..5475773aa0 100644 --- a/board/puff/board.c +++ b/board/puff/board.c @@ -88,8 +88,8 @@ uint16_t tcpc_get_alert_status(void) } /* Called when the charge manager has switched to a new port. */ -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* Blink alert if insufficient power per system_can_boot_ap(). */ int insufficient_power = diff --git a/board/quackingstick/board.c b/board/quackingstick/board.c index 6cdf814c74..7002a62e03 100644 --- a/board/quackingstick/board.c +++ b/board/quackingstick/board.c @@ -612,8 +612,8 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* * Ignore lower charge ceiling on PD transition if our battery is @@ -625,9 +625,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, charge_ma = max_ma; } - charge_ma = charge_ma * 95 / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } /** diff --git a/board/quackingstick/board.h b/board/quackingstick/board.h index 9b50237b4d..a8ec5a4231 100644 --- a/board/quackingstick/board.h +++ b/board/quackingstick/board.h @@ -32,6 +32,8 @@ #define CONFIG_BATTERY_FUEL_GAUGE #define CONFIG_BATTERY_VENDOR_PARAM +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 + /* BC 1.2 Charger */ #define CONFIG_BC12_DETECT_PI3USB9201 diff --git a/board/rainier/board.c b/board/rainier/board.c index 07a006b671..05142a3936 100644 --- a/board/rainier/board.c +++ b/board/rainier/board.c @@ -173,8 +173,8 @@ int board_set_active_charge_port(int charge_port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* * NOP because there is no internal power therefore no charging. diff --git a/board/rainier/board.h b/board/rainier/board.h index 463a1e4a05..745ebeaca8 100644 --- a/board/rainier/board.h +++ b/board/rainier/board.h @@ -22,7 +22,6 @@ #define CONFIG_POWER_COMMON #define CONFIG_SPI #define CONFIG_SPI_CONTROLLER -#define CONFIG_STM_HWTIMER32 /* Source RTCCLK from external 32.768kHz source on PC15/OSC32_IN. */ #define CONFIG_STM32_CLOCK_LSE #define CONFIG_SWITCH diff --git a/board/rammus/board.c b/board/rammus/board.c index 8cbc6c6856..e4abed4afb 100644 --- a/board/rammus/board.c +++ b/board/rammus/board.c @@ -558,26 +558,6 @@ int board_set_active_charge_port(int charge_port) return EC_SUCCESS; } -/** - * Set the charge limit based upon desired maximum. - * - * @param port Port number. - * @param supplier Charge supplier type. - * @param charge_ma Desired charge limit (mA). - * @param charge_mv Negotiated charge voltage (mV). - */ -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - /* - * Limit the input current to 96% negotiated limit, - * to account for the charger chip margin. - */ - charge_ma = charge_ma * 96 / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - void board_hibernate(void) { CPRINTS("Triggering PMIC shutdown."); diff --git a/board/rammus/board.h b/board/rammus/board.h index c0c8238c3e..975417df9a 100644 --- a/board/rammus/board.h +++ b/board/rammus/board.h @@ -84,10 +84,12 @@ #define CONFIG_CHARGER #define CONFIG_CHARGER_ISL9238 #define CONFIG_CHARGER_DISCHARGE_ON_AC -#define CONFIG_CHARGER_INPUT_CURRENT 512 +#define CONFIG_CHARGER_DEFAULT_CURRENT_LIMIT 512 +#define CONFIG_CHARGER_MIN_INPUT_CURRENT_LIMIT 512 #define CONFIG_CHARGER_PSYS #define CONFIG_CHARGER_SENSE_RESISTOR 10 #define CONFIG_CHARGER_SENSE_RESISTOR_AC 20 +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 /* charger margin */ #define CONFIG_CMD_CHARGER_ADC_AMON_BMON #define CONFIG_HOSTCMD_PD_CONTROL #define CONFIG_EXTPOWER_GPIO diff --git a/board/redrix/charger.c b/board/redrix/charger.c index a4fa209246..7fabd2082e 100644 --- a/board/redrix/charger.c +++ b/board/redrix/charger.c @@ -81,10 +81,3 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } - -__overridable void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/reef/board.c b/board/reef/board.c index e41921a436..ad92334c2b 100644 --- a/board/reef/board.c +++ b/board/reef/board.c @@ -543,8 +543,8 @@ int board_set_active_charge_port(int charge_port) * @param charge_ma Desired charge limit (mA). * @param charge_mv Negotiated charge voltage (mV). */ -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* Enable charging trigger by BC1.2 detection */ int bc12_enable = (supplier == CHARGE_SUPPLIER_BC12_CDP || @@ -555,9 +555,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, if (bd9995x_bc12_enable_charging(port, bc12_enable)) return; - charge_ma = (charge_ma * 95) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } /** diff --git a/board/reef/board.h b/board/reef/board.h index fc25024dff..cc1783e43a 100644 --- a/board/reef/board.h +++ b/board/reef/board.h @@ -50,7 +50,9 @@ #define CONFIG_CHARGER_BD9995X #define CONFIG_CHARGER_BD9995X_CHGEN #define CONFIG_CHARGER_DISCHARGE_ON_AC -#define CONFIG_CHARGER_INPUT_CURRENT 512 +#define CONFIG_CHARGER_DEFAULT_CURRENT_LIMIT 512 +#define CONFIG_CHARGER_MIN_INPUT_CURRENT_LIMIT 512 +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define CONFIG_CHARGER_LIMIT_POWER_THRESH_BAT_PCT 1 #define CONFIG_CHARGER_LIMIT_POWER_THRESH_CHG_MW 18000 #define CONFIG_CHARGER_MAINTAIN_VBAT diff --git a/board/reef_it8320/board.c b/board/reef_it8320/board.c index b00e451842..1e222a4ed4 100644 --- a/board/reef_it8320/board.c +++ b/board/reef_it8320/board.c @@ -299,8 +299,8 @@ int board_set_active_charge_port(int charge_port) * @param charge_ma Desired charge limit (mA). * @param charge_mv Negotiated charge voltage (mV). */ -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* Enable charging trigger by BC1.2 detection */ int bc12_enable = (supplier == CHARGE_SUPPLIER_BC12_CDP || @@ -311,9 +311,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, if (bd9995x_bc12_enable_charging(port, bc12_enable)) return; - charge_ma = (charge_ma * 95) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } /** diff --git a/board/reef_it8320/board.h b/board/reef_it8320/board.h index 45abf34151..dbccc6eeee 100644 --- a/board/reef_it8320/board.h +++ b/board/reef_it8320/board.h @@ -48,7 +48,9 @@ #define CONFIG_CHARGER_BD9995X #define CONFIG_CHARGER_BD9995X_CHGEN #define CONFIG_CHARGER_DISCHARGE_ON_AC -#define CONFIG_CHARGER_INPUT_CURRENT 512 +#define CONFIG_CHARGER_DEFAULT_CURRENT_LIMIT 512 +#define CONFIG_CHARGER_MIN_INPUT_CURRENT_LIMIT 512 +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define CONFIG_CHARGER_LIMIT_POWER_THRESH_BAT_PCT 1 #define CONFIG_CHARGER_LIMIT_POWER_THRESH_CHG_MW 18000 #define CONFIG_CHARGER_MAINTAIN_VBAT diff --git a/board/reef_mchp/board.c b/board/reef_mchp/board.c index 0a40f5dd04..c50a4feb8a 100644 --- a/board/reef_mchp/board.c +++ b/board/reef_mchp/board.c @@ -736,8 +736,8 @@ int board_set_active_charge_port(int charge_port) * @param charge_ma Desired charge limit (mA). * @param charge_mv Negotiated charge voltage (mV). */ -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* Enable charging trigger by BC1.2 detection */ int bc12_enable = (supplier == CHARGE_SUPPLIER_BC12_CDP || @@ -748,9 +748,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, if (bd9995x_bc12_enable_charging(port, bc12_enable)) return; - charge_ma = (charge_ma * 95) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } /** diff --git a/board/reef_mchp/board.h b/board/reef_mchp/board.h index bde2d831d3..925f271ffd 100644 --- a/board/reef_mchp/board.h +++ b/board/reef_mchp/board.h @@ -53,7 +53,9 @@ #define CONFIG_CHARGER_BD9995X #define CONFIG_CHARGER_BD9995X_CHGEN #define CONFIG_CHARGER_DISCHARGE_ON_AC -#define CONFIG_CHARGER_INPUT_CURRENT 512 +#define CONFIG_CHARGER_DEFAULT_CURRENT_LIMIT 512 +#define CONFIG_CHARGER_MIN_INPUT_CURRENT_LIMIT 512 +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define CONFIG_CHARGER_LIMIT_POWER_THRESH_BAT_PCT 1 #define CONFIG_CHARGER_LIMIT_POWER_THRESH_CHG_MW 18000 #define CONFIG_CHARGER_MAINTAIN_VBAT diff --git a/board/sasuke/board.c b/board/sasuke/board.c index ddd5279d62..e6767d8126 100644 --- a/board/sasuke/board.c +++ b/board/sasuke/board.c @@ -395,19 +395,6 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * b/147463641: The charger IC seems to overdraw ~4%, therefore we - * reduce our target accordingly. - */ - icl = icl * 96 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - __override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) { if (port < 0 || port > board_get_usb_pd_port_count()) diff --git a/board/sasuke/board.h b/board/sasuke/board.h index 64c830df0f..df390d2d99 100644 --- a/board/sasuke/board.h +++ b/board/sasuke/board.h @@ -29,6 +29,11 @@ #define CONFIG_OCPC_DEF_RBATT_MOHMS \ 22 /* R_DS(on) 11.6mOhm + 10mOhm sns rstr \ */ +/* + * b/147463641: The charger IC seems to overdraw ~4%, therefore we + * reduce our target accordingly. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 #define CONFIG_OCPC #define CONFIG_CHARGER_PROFILE_OVERRIDE #define CONFIG_CHARGE_RAMP_HW diff --git a/board/sasukette/board.c b/board/sasukette/board.c index e45213a63a..f6786c1441 100644 --- a/board/sasukette/board.c +++ b/board/sasukette/board.c @@ -251,19 +251,6 @@ uint16_t tcpc_get_alert_status(void) return status; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * b/147463641: The charger IC seems to overdraw ~4%, therefore we - * reduce our target accordingly. - */ - icl = icl * 96 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - int board_is_sourcing_vbus(int port) { int regval; diff --git a/board/sasukette/board.h b/board/sasukette/board.h index 44cb65239a..f06a89a5f0 100644 --- a/board/sasukette/board.h +++ b/board/sasukette/board.h @@ -36,6 +36,11 @@ #define CONFIG_CHARGER_PROFILE_OVERRIDE #undef CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE #define CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE (100 * MSEC) +/* + * b/147463641: The charger IC seems to overdraw ~4%, therefore we + * reduce our target accordingly. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 /* LED */ #define CONFIG_LED_COMMON diff --git a/board/scarlet/board.c b/board/scarlet/board.c index 34e5cc456c..66017e172d 100644 --- a/board/scarlet/board.c +++ b/board/scarlet/board.c @@ -212,13 +212,6 @@ int board_set_active_charge_port(int charge_port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - int extpower_is_present(void) { /* diff --git a/board/scarlet/board.h b/board/scarlet/board.h index 4691d74391..cdc09f9114 100644 --- a/board/scarlet/board.h +++ b/board/scarlet/board.h @@ -32,7 +32,6 @@ #define CONFIG_POWER_COMMON #define CONFIG_SPI #define CONFIG_SPI_CONTROLLER -#define CONFIG_STM_HWTIMER32 /* Source RTCCLK from external 32.768kHz source on PC15/OSC32_IN. */ #define CONFIG_STM32_CLOCK_LSE #define CONFIG_SWITCH @@ -70,7 +69,8 @@ #define CONFIG_CHARGER #define CONFIG_CHARGER_RT9467 -#define CONFIG_CHARGER_INPUT_CURRENT 512 +#define CONFIG_CHARGER_DEFAULT_CURRENT_LIMIT 512 +#define CONFIG_CHARGER_MIN_INPUT_CURRENT_LIMIT 512 #define CONFIG_CHARGER_LIMIT_POWER_THRESH_BAT_PCT 2 #define CONFIG_CHARGER_LIMIT_POWER_THRESH_CHG_MW 15000 #define CONFIG_CHARGER_PROFILE_OVERRIDE diff --git a/board/servo_micro/board.h b/board/servo_micro/board.h index 801b67e07e..109a40409d 100644 --- a/board/servo_micro/board.h +++ b/board/servo_micro/board.h @@ -30,7 +30,6 @@ #undef CONFIG_UART_RX_DMA /* Optional features */ -#define CONFIG_STM_HWTIMER32 #define CONFIG_HW_CRC #define CONFIG_PVD /* See 'Programmable voltage detector characteristics' in the STM32F072x8 diff --git a/board/servo_v4/board.h b/board/servo_v4/board.h index 289c117989..1c7d90eab4 100644 --- a/board/servo_v4/board.h +++ b/board/servo_v4/board.h @@ -35,7 +35,6 @@ #define CONFIG_CMD_USART_INFO /* Optional features */ -#define CONFIG_STM_HWTIMER32 #define CONFIG_HW_CRC #define CONFIG_PVD /* See 'Programmable voltage detector characteristics' in the STM32F072x8 @@ -97,6 +96,8 @@ #undef CONFIG_CMD_FLASHINFO #undef CONFIG_CMD_FLASH_WP #undef CONFIG_CMD_GETTIME +#undef CONFIG_CMD_I2C_SCAN +#undef CONFIG_CMD_I2C_XFER #undef CONFIG_CMD_MEM #undef CONFIG_CMD_SHMEM #undef CONFIG_CMD_SYSLOCK diff --git a/board/servo_v4/usb_pd_policy.c b/board/servo_v4/usb_pd_policy.c index 4fcded6842..e3eba6104a 100644 --- a/board/servo_v4/usb_pd_policy.c +++ b/board/servo_v4/usb_pd_policy.c @@ -364,8 +364,8 @@ int board_set_active_charge_port(int charge_port) return 0; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { if (port != CHG) return; diff --git a/board/servo_v4p1/board.h b/board/servo_v4p1/board.h index b6c7915c6c..4debd67b49 100644 --- a/board/servo_v4p1/board.h +++ b/board/servo_v4p1/board.h @@ -97,7 +97,6 @@ #undef CONFIG_UART_RX_DMA /* Optional features */ -#define CONFIG_STM_HWTIMER32 #define CONFIG_HW_CRC #define CONFIG_PVD /* diff --git a/board/servo_v4p1/usb_pd_policy.c b/board/servo_v4p1/usb_pd_policy.c index 7f5b6f35bf..fc79bf84da 100644 --- a/board/servo_v4p1/usb_pd_policy.c +++ b/board/servo_v4p1/usb_pd_policy.c @@ -391,8 +391,8 @@ int board_set_active_charge_port(int charge_port) return 0; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { if (port != CHG) return; diff --git a/board/shotzo/board.c b/board/shotzo/board.c index dea75ee7d2..5d96e164cf 100644 --- a/board/shotzo/board.c +++ b/board/shotzo/board.c @@ -351,8 +351,8 @@ uint16_t tcpc_get_alert_status(void) return 0; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { if (port == CHARGER_SOLO) { charger_set_input_current_limit(CHARGER_SOLO, max_ma); diff --git a/board/stern/board.c b/board/stern/board.c index 26576ede86..a6d488aaf6 100644 --- a/board/stern/board.c +++ b/board/stern/board.c @@ -236,14 +236,6 @@ int board_set_active_charge_port(int charge_port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - charge_ma = (charge_ma * 95) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - int board_discharge_on_ac(int enable) { int ret, port; diff --git a/board/stern/board.h b/board/stern/board.h index eedbc2a44c..d7d96ea67c 100644 --- a/board/stern/board.h +++ b/board/stern/board.h @@ -28,6 +28,7 @@ #define CONFIG_BATTERY_HW_PRESENT_CUSTOM #define CONFIG_CHARGER_PSYS +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define CONFIG_CHARGER_RUNTIME_CONFIG diff --git a/board/stm32f446e-eval/board.h b/board/stm32f446e-eval/board.h index 4ae9117829..667483d81f 100644 --- a/board/stm32f446e-eval/board.h +++ b/board/stm32f446e-eval/board.h @@ -56,7 +56,6 @@ #undef CONFIG_WATCHDOG /* Optional features */ -#define CONFIG_STM_HWTIMER32 #define CONFIG_DMA_HELP #define CONFIG_FLASH_CROS diff --git a/board/stm32l476g-eval/board.h b/board/stm32l476g-eval/board.h index 26ea530e4e..40c7fb0eca 100644 --- a/board/stm32l476g-eval/board.h +++ b/board/stm32l476g-eval/board.h @@ -33,7 +33,6 @@ #endif /* Optional features */ -#define CONFIG_STM_HWTIMER32 #ifdef CTS_MODULE_I2C #define CONFIG_I2C diff --git a/board/storo/board.c b/board/storo/board.c index f6f3ed5750..83d9ef4c72 100644 --- a/board/storo/board.c +++ b/board/storo/board.c @@ -431,19 +431,6 @@ uint16_t tcpc_get_alert_status(void) return status; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * b/147463641: The charger IC seems to overdraw ~4%, therefore we - * reduce our target accordingly. - */ - icl = icl * 96 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - int board_is_sourcing_vbus(int port) { int regval; diff --git a/board/storo/board.h b/board/storo/board.h index 93dd573ba1..1f33ce53b0 100644 --- a/board/storo/board.h +++ b/board/storo/board.h @@ -31,6 +31,11 @@ #define CONFIG_OCPC_DEF_RBATT_MOHMS \ 22 /* R_DS(on) 11.6mOhm + 10mOhm sns rstr \ */ +/* + * b/147463641: The charger IC seems to overdraw ~4%, therefore we + * reduce our target accordingly. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 #define CONFIG_OCPC #undef CONFIG_CHARGER_SINGLE_CHIP #undef CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE diff --git a/board/sweetberry/board.h b/board/sweetberry/board.h index 4387cd4094..4d945f5dc4 100644 --- a/board/sweetberry/board.h +++ b/board/sweetberry/board.h @@ -77,7 +77,6 @@ #undef CONFIG_WATCHDOG /* Optional features */ -#define CONFIG_STM_HWTIMER32 /* * Allow dangerous commands all the time, since we don't have a write protect diff --git a/board/taeko/board.c b/board/taeko/board.c index 79ef4029d6..9f0d21b8b8 100644 --- a/board/taeko/board.c +++ b/board/taeko/board.c @@ -136,16 +136,3 @@ enum battery_present battery_hw_present(void) /* The GPIO is low when the battery is physically present */ return gpio_get_level(GPIO_EC_BATT_PRES_ODL) ? BP_NO : BP_YES; } - -__override void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - /* - * Follow OEM request to limit the input current to - * 95% negotiated limit. - */ - charge_ma = charge_ma * 95 / 100; - - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/taeko/board.h b/board/taeko/board.h index c3193c8847..a3ae9abb00 100644 --- a/board/taeko/board.h +++ b/board/taeko/board.h @@ -26,6 +26,9 @@ #define CONFIG_MP2964 +/* OEM requested 5% charger current margin */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 + /* LED */ #define CONFIG_LED_ONOFF_STATES diff --git a/board/taeko/charger.c b/board/taeko/charger.c index a4fa209246..7fabd2082e 100644 --- a/board/taeko/charger.c +++ b/board/taeko/charger.c @@ -81,10 +81,3 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } - -__overridable void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/taniks/board.c b/board/taniks/board.c index 5da998524b..f8501d761b 100644 --- a/board/taniks/board.c +++ b/board/taniks/board.c @@ -115,16 +115,3 @@ enum battery_present battery_hw_present(void) /* The GPIO is low when the battery is physically present */ return gpio_get_level(GPIO_EC_BATT_PRES_ODL) ? BP_NO : BP_YES; } - -__override void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - /* - * Follow OEM request to limit the input current to - * 95% negotiated limit. - */ - charge_ma = charge_ma * 95 / 100; - - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/taniks/board.h b/board/taniks/board.h index 6cd42ad7bb..a301f3b458 100644 --- a/board/taniks/board.h +++ b/board/taniks/board.h @@ -36,6 +36,9 @@ */ #define CONFIG_HIBERNATE_PSL_VCC1_RST_WAKEUP +/* OEM requested 5% charger margin */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 + /* LED */ #define CONFIG_LED_ONOFF_STATES diff --git a/board/taniks/charger.c b/board/taniks/charger.c index a4fa209246..7fabd2082e 100644 --- a/board/taniks/charger.c +++ b/board/taniks/charger.c @@ -81,10 +81,3 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } - -__overridable void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/terrador/board.c b/board/terrador/board.c index 8426216e79..3724c9d2d0 100644 --- a/board/terrador/board.c +++ b/board/terrador/board.c @@ -301,6 +301,7 @@ void ppc_interrupt(enum gpio_signal signal) break; case GPIO_USB_C1_PPC_INT_ODL: syv682x_interrupt(USBC_PORT_C1); + break; default: break; } diff --git a/board/tglrvp_ish/board.h b/board/tglrvp_ish/board.h index 3912e8803a..e285014e5e 100644 --- a/board/tglrvp_ish/board.h +++ b/board/tglrvp_ish/board.h @@ -79,8 +79,11 @@ #define CONFIG_ISH_IPAPG #define CONFIG_ISH_D0I2_MIN_USEC (15 * MSEC) +#ifdef BOARD_ADL_ISH_LITE +#define CONFIG_ISH_D0I3_MIN_USEC (3000 * MSEC) +#else #define CONFIG_ISH_D0I3_MIN_USEC (50 * MSEC) - +#endif #define CONFIG_ISH_NEW_PM #ifndef __ASSEMBLER__ diff --git a/board/tigertail/board.h b/board/tigertail/board.h index ea4d11db06..26e6af5985 100644 --- a/board/tigertail/board.h +++ b/board/tigertail/board.h @@ -24,7 +24,6 @@ #undef CONFIG_UART_RX_DMA /* Optional features */ -#define CONFIG_STM_HWTIMER32 #define CONFIG_HW_CRC /* USB Configuration */ diff --git a/board/trogdor/usbc_config.c b/board/trogdor/usbc_config.c index 39a54f659e..b9c37a04fd 100644 --- a/board/trogdor/usbc_config.c +++ b/board/trogdor/usbc_config.c @@ -225,6 +225,7 @@ void board_tcpc_init(void) /* Enable PPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_SWCTL_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C1_SWCTL_INT_ODL); /* Enable TCPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_PD_INT_ODL); @@ -333,8 +334,8 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* * Ignore lower charge ceiling on PD transition if our battery is @@ -346,8 +347,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, charge_ma = max_ma; } - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } uint16_t tcpc_get_alert_status(void) diff --git a/board/twinkie/board.h b/board/twinkie/board.h index b1379fb15b..808053d146 100644 --- a/board/twinkie/board.h +++ b/board/twinkie/board.h @@ -79,8 +79,7 @@ void trace_packets(void); void set_trace_mode(int mode); /* Timer selection */ -#define TIM_CLOCK_MSB 3 -#define TIM_CLOCK_LSB 15 +#define TIM_CLOCK32 2 #define TIM_ADC 16 #include "gpio_signal.h" diff --git a/board/vell/board.h b/board/vell/board.h index 4b3d527901..3a7d97858c 100644 --- a/board/vell/board.h +++ b/board/vell/board.h @@ -61,6 +61,8 @@ #undef CONFIG_SYV682X_HV_ILIM #define CONFIG_SYV682X_HV_ILIM SYV682X_HV_ILIM_5_50 +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 + /* TODO: b/177608416 - measure and check these values on brya */ #define PD_POWER_SUPPLY_TURN_ON_DELAY 30000 /* us */ #define PD_POWER_SUPPLY_TURN_OFF_DELAY 30000 /* us */ diff --git a/board/vell/charger.c b/board/vell/charger.c index e33a0ed44a..53b14381cd 100644 --- a/board/vell/charger.c +++ b/board/vell/charger.c @@ -81,18 +81,6 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - /* - * Limit the input current to 96% negotiated limit, - * to account for the charger chip margin. - */ - charge_ma = charge_ma * 96 / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - static void set_ac_prochot(void) { isl9241_set_ac_prochot(CHARGER_SOLO, PD_MAX_CURRENT_MA); diff --git a/board/vilboz/board.c b/board/vilboz/board.c index 7c74794d9d..1ba266f145 100644 --- a/board/vilboz/board.c +++ b/board/vilboz/board.c @@ -504,16 +504,3 @@ const int usb_port_enable[USBA_PORT_COUNT] = { IOEX_EN_USB_A0_5V, GPIO_EN_USB_A1_5V, }; - -__override void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - /* - * Limit the input current to 95% negotiated limit, - * to account for the charger chip margin. - */ - charge_ma = charge_ma * 95 / 100; - - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/vilboz/board.h b/board/vilboz/board.h index 5160abbc26..8a7c86824d 100644 --- a/board/vilboz/board.h +++ b/board/vilboz/board.h @@ -20,6 +20,7 @@ #define GPIO_USB2_ILIM_SEL GPIO_USB_A1_CHARGE_EN_DB_L #define CONFIG_CHARGER_PROFILE_OVERRIDE +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 /* Motion sensing drivers */ #define CONFIG_ACCELGYRO_LSM6DSM diff --git a/board/volmar/charger.c b/board/volmar/charger.c index 88f5b85a41..7a16fcd5cb 100644 --- a/board/volmar/charger.c +++ b/board/volmar/charger.c @@ -79,10 +79,3 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } - -__overridable void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} diff --git a/board/waddledee/board.c b/board/waddledee/board.c index d7abda740c..4dfb3048ca 100644 --- a/board/waddledee/board.c +++ b/board/waddledee/board.c @@ -342,18 +342,6 @@ uint16_t tcpc_get_alert_status(void) return status; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * TODO(b/151955431): Characterize the input current limit in case a - * scaling needs to be applied here - */ - charge_set_input_current_limit(icl, charge_mv); -} - int board_set_active_charge_port(int port) { int is_valid_port = (port >= 0 && port < board_get_usb_pd_port_count()); diff --git a/board/waddledoo/board.c b/board/waddledoo/board.c index e207e59456..3cdb71cc5e 100644 --- a/board/waddledoo/board.c +++ b/board/waddledoo/board.c @@ -390,19 +390,6 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * b/147463641: The charger IC seems to overdraw ~4%, therefore we - * reduce our target accordingly. - */ - icl = icl * 96 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - __override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) { if (port < 0 || port > board_get_usb_pd_port_count()) diff --git a/board/waddledoo/board.h b/board/waddledoo/board.h index 727f1bdb33..23a89c84d6 100644 --- a/board/waddledoo/board.h +++ b/board/waddledoo/board.h @@ -18,10 +18,12 @@ #define CONFIG_SYSTEM_UNLOCKED /* Save some flash space */ +#undef CONFIG_ACCEL_SPOOF_MODE #define CONFIG_CHIP_INIT_ROM_REGION #undef CONFIG_CONSOLE_CMDHELP +#undef CONFIG_CONSOLE_HISTORY #define CONFIG_DEBUG_ASSERT_BRIEF -#define CONFIG_USB_PD_DEBUG_LEVEL 2 +#define CONFIG_USB_PD_DEBUG_LEVEL 0 /* EC console commands */ #define CONFIG_CMD_CHARGER_DUMP @@ -41,6 +43,11 @@ #define CONFIG_OCPC_DEF_RBATT_MOHMS \ 22 /* R_DS(on) 11.6mOhm + 10mOhm sns rstr \ */ +/* + * b/147463641: The charger IC seems to overdraw ~4%, therefore we + * reduce our target accordingly. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 #define CONFIG_OCPC #undef CONFIG_CHARGER_SINGLE_CHIP #undef CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE diff --git a/board/waddledoo2/board.c b/board/waddledoo2/board.c index fd12aec449..98c061d9af 100644 --- a/board/waddledoo2/board.c +++ b/board/waddledoo2/board.c @@ -397,19 +397,6 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * b/147463641: The charger IC seems to overdraw ~4%, therefore we - * reduce our target accordingly. - */ - icl = icl * 96 / 100; - charge_set_input_current_limit(icl, charge_mv); -} - __override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) { if (port < 0 || port > board_get_usb_pd_port_count()) diff --git a/board/waddledoo2/board.h b/board/waddledoo2/board.h index 93f0a0f108..3b4587037d 100644 --- a/board/waddledoo2/board.h +++ b/board/waddledoo2/board.h @@ -28,6 +28,11 @@ #define CONFIG_OCPC_DEF_RBATT_MOHMS \ 22 /* R_DS(on) 11.6mOhm + 10mOhm sns rstr \ */ +/* + * b/147463641: The charger IC seems to overdraw ~4%, therefore we + * reduce our target accordingly. + */ +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 4 #define CONFIG_OCPC #undef CONFIG_CHARGER_SINGLE_CHIP #undef CONFIG_CMD_CHARGER_DUMP diff --git a/board/wheelie/board.c b/board/wheelie/board.c index 9708dcca82..e8852a0b5a 100644 --- a/board/wheelie/board.c +++ b/board/wheelie/board.c @@ -229,18 +229,6 @@ uint16_t tcpc_get_alert_status(void) return status; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT); - - /* - * TODO(b/151955431): Characterize the input current limit in case a - * scaling needs to be applied here - */ - charge_set_input_current_limit(icl, charge_mv); -} - int board_set_active_charge_port(int port) { int is_valid_port = (port >= 0 && port < CONFIG_USB_PD_PORT_MAX_COUNT); diff --git a/board/willow/board.c b/board/willow/board.c index 826df6940c..1fdcc37492 100644 --- a/board/willow/board.c +++ b/board/willow/board.c @@ -234,14 +234,6 @@ int board_set_active_charge_port(int charge_port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) -{ - charge_ma = (charge_ma * 95) / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); -} - int board_discharge_on_ac(int enable) { int ret, port; diff --git a/board/willow/board.h b/board/willow/board.h index 18745a07a4..315c206a07 100644 --- a/board/willow/board.h +++ b/board/willow/board.h @@ -27,6 +27,7 @@ #define CONFIG_BATTERY_HW_PRESENT_CUSTOM #define CONFIG_CHARGER_PSYS +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 #define CONFIG_CHARGER_RUNTIME_CONFIG diff --git a/board/woomax/board.c b/board/woomax/board.c index 747c576fc2..7e9fbd224f 100644 --- a/board/woomax/board.c +++ b/board/woomax/board.c @@ -451,7 +451,7 @@ static int woomax_ps8802_mux_set(const struct usb_mux *me, const struct usb_mux usbc1_woomax_ps8818 = { .usb_port = USBC_PORT_C1, .i2c_port = I2C_PORT_TCPC1, - .i2c_addr_flags = PS8818_I2C_ADDR_FLAGS, + .i2c_addr_flags = PS8818_I2C_ADDR0_FLAGS, .driver = &ps8818_usb_retimer_driver, .board_set = &woomax_ps8818_mux_set, }; diff --git a/board/wormdingler/board.c b/board/wormdingler/board.c index 3c4dfe4b3c..e9e929de53 100644 --- a/board/wormdingler/board.c +++ b/board/wormdingler/board.c @@ -458,6 +458,7 @@ void board_tcpc_init(void) /* Enable PPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_SWCTL_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C1_SWCTL_INT_ODL); /* Enable TCPC interrupts */ gpio_enable_interrupt(GPIO_USB_C0_PD_INT_ODL); @@ -629,8 +630,8 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } -void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, - int charge_mv) +__override void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) { /* * Ignore lower charge ceiling on PD transition if our battery is @@ -642,9 +643,7 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, charge_ma = max_ma; } - charge_ma = charge_ma * 95 / 100; - charge_set_input_current_limit( - MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); + charge_set_input_current_limit(charge_ma, charge_mv); } uint16_t tcpc_get_alert_status(void) diff --git a/board/wormdingler/board.h b/board/wormdingler/board.h index 3c3ba6ead5..447846c509 100644 --- a/board/wormdingler/board.h +++ b/board/wormdingler/board.h @@ -24,6 +24,8 @@ #define CONFIG_BATTERY_FUEL_GAUGE #define CONFIG_BATTERY_VENDOR_PARAM +#define CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT 5 + /* Enable PD3.0 */ #define CONFIG_USB_PD_REV30 |