diff --git a/board/amenia/board.c b/board/amenia/board.c index 670ceb2870..a64ab089fd 100644 --- a/board/amenia/board.c +++ b/board/amenia/board.c @@ -15,9 +15,11 @@ #include "console.h" #include "driver/als_isl29035.h" #include "driver/accel_kionix.h" -#include "driver/accel_kxcj9.h" +#include "driver/accel_kx022.h" #include "driver/accelgyro_bmi160.h" -#include "driver/temp_sensor/tmp432.h" +#include "driver/charger/bd99955.h" +#include "driver/tcpm/tcpci.h" +#include "driver/temp_sensor/g78x.h" #include "extpower.h" #include "gpio.h" #include "hooks.h" @@ -28,7 +30,6 @@ #include "math_util.h" #include "motion_sense.h" #include "motion_lid.h" -#include "pi3usb9281.h" #include "power.h" #include "power_button.h" #include "spi.h" @@ -47,39 +48,92 @@ #define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ## args) #define CPRINTF(format, args...) cprintf(CC_USBCHARGE, format, ## args) -/* Exchange status with PD MCU. */ -static void pd_mcu_interrupt(enum gpio_signal signal) +#if 1 /* TODO: CHARGER / BC1.2 */ +static void update_vbus_supplier(int port, int vbus_level) { + struct charge_port_info charge; + + charge.voltage = USB_CHARGER_VOLTAGE_MV; + charge.current = vbus_level ? USB_CHARGER_MIN_CURR_MA : 0; + charge_manager_update_charge(CHARGE_SUPPLIER_VBUS, port, &charge); +} + +static void reset_charge(int port) +{ + struct charge_port_info charge_none; + + charge_none.voltage = USB_CHARGER_VOLTAGE_MV; + charge_none.current = 0; + charge_manager_update_charge(CHARGE_SUPPLIER_PROPRIETARY, + port, + &charge_none); + charge_manager_update_charge(CHARGE_SUPPLIER_BC12_CDP, + port, + &charge_none); + charge_manager_update_charge(CHARGE_SUPPLIER_BC12_DCP, + port, + &charge_none); + charge_manager_update_charge(CHARGE_SUPPLIER_BC12_SDP, + port, + &charge_none); + charge_manager_update_charge(CHARGE_SUPPLIER_OTHER, + port, + &charge_none); + + /* Initialize VBUS supplier based on whether VBUS is present */ + update_vbus_supplier(port, pd_snk_is_vbus_provided(port)); +} +#endif + +uint16_t tcpc_get_alert_status(void) +{ + uint16_t status = 0; + +#if 0 /* TODO: TCPC */ + if (gpio_get_level(GPIO_USB_C0_PD_INT)) + if (gpio_get_level(GPIO_USB_C0_RST_L)) + status |= PD_STATUS_TCPC_ALERT_0; + + if (!gpio_get_level(GPIO_USB_C1_PD_INT_L)) + if (gpio_get_level(GPIO_USB_C1_RST_L)) + status |= PD_STATUS_TCPC_ALERT_1; +#endif + + return status; +} + +static void tcpc_alert_event(enum gpio_signal signal) +{ +#if 0 /* TODO: TCPC */ #ifdef HAS_TASK_PDCMD /* Exchange status with PD MCU to determine interrupt cause */ host_command_pd_send_status(0); #endif +#endif } void vbus0_evt(enum gpio_signal signal) { + if (!gpio_get_level(GPIO_USB_C0_RST_L)) + return; + /* VBUS present GPIO is inverted */ - usb_charger_vbus_change(0, !gpio_get_level(signal)); + update_vbus_supplier(0, !gpio_get_level(signal)); + task_wake(TASK_ID_PD_C0); } void vbus1_evt(enum gpio_signal signal) { + if (!gpio_get_level(GPIO_USB_C1_RST_L)) + return; + /* VBUS present GPIO is inverted */ - usb_charger_vbus_change(1, !gpio_get_level(signal)); + update_vbus_supplier(1, !gpio_get_level(signal)); + task_wake(TASK_ID_PD_C1); } -void usb0_evt(enum gpio_signal signal) -{ - task_set_event(TASK_ID_USB_CHG_P0, USB_CHG_EVENT_BC12, 0); -} - -void usb1_evt(enum gpio_signal signal) -{ - task_set_event(TASK_ID_USB_CHG_P1, USB_CHG_EVENT_BC12, 0); -} - /* * enable_input_devices() is called by the tablet_mode ISR, but changes the * state of GPIOs, so its definition must reside after including gpio_list. @@ -114,21 +168,25 @@ const struct adc_t adc_channels[] = { [ADC_AMON_BMON] = {"AMON_BMON", NPCX_ADC_CH4, 55000, 6144, 0}, /* System current consumption */ [ADC_PSYS] = {"PSYS", NPCX_ADC_CH3, 1, 1, 0}, + /* Thermistor 0 */ + [ADC_THERM_SYS0] = {"THERM_SYS0", NPCX_ADC_CH0, 1, 1, 0}, + /* Thermistor 1 */ + [ADC_THERM_SYS1] = {"THERM_SYS1", NPCX_ADC_CH2, 1, 1, 0}, }; BUILD_ASSERT(ARRAY_SIZE(adc_channels) == ADC_CH_COUNT); const struct i2c_port_t i2c_ports[] = { - {"pmic", NPCX_I2C_PORT0_0, 400, GPIO_I2C0_0_SCL, GPIO_I2C0_0_SDA}, - {"muxes", NPCX_I2C_PORT0_1, 400, GPIO_I2C0_1_SCL, GPIO_I2C0_1_SDA}, - {"pd_mcu", NPCX_I2C_PORT1, 400, GPIO_I2C1_SCL, GPIO_I2C1_SDA}, - {"sensors", NPCX_I2C_PORT2, 400, GPIO_I2C2_SCL, GPIO_I2C2_SDA}, - {"batt", NPCX_I2C_PORT3, 100, GPIO_I2C3_SCL, GPIO_I2C3_SDA}, + {"unused", NPCX_I2C_PORT0_0, 400, GPIO_I2C0_0_SCL, GPIO_I2C0_0_SDA}, + {"tcpc", NPCX_I2C_PORT0_1, 400, GPIO_I2C0_1_SCL, GPIO_I2C0_1_SDA}, + {"lid sensor", NPCX_I2C_PORT1, 400, GPIO_I2C1_SCL, GPIO_I2C1_SDA}, + {"base sensor", NPCX_I2C_PORT2, 400, GPIO_I2C2_SCL, GPIO_I2C2_SDA}, + {"bat charger", NPCX_I2C_PORT3, 100, GPIO_I2C3_SCL, GPIO_I2C3_SDA}, }; const unsigned int i2c_ports_used = ARRAY_SIZE(i2c_ports); const struct tcpc_config_t tcpc_config[CONFIG_USB_PD_PORT_COUNT] = { - {I2C_PORT_TCPC, CONFIG_TCPC_I2C_BASE_ADDR}, - {I2C_PORT_TCPC, CONFIG_TCPC_I2C_BASE_ADDR + 2}, + {I2C_PORT_TCPC0, TCPC0_I2C_ADDR, &tcpci_tcpm_drv}, + {I2C_PORT_TCPC1, TCPC1_I2C_ADDR, &tcpci_tcpm_drv}, }; const enum gpio_signal hibernate_wake_pins[] = { @@ -139,52 +197,77 @@ const enum gpio_signal hibernate_wake_pins[] = { const int hibernate_wake_pins_used = ARRAY_SIZE(hibernate_wake_pins); -struct pi3usb9281_config pi3usb9281_chips[] = { - { - .i2c_port = I2C_PORT_USB_CHARGER_1, - .mux_lock = NULL, - }, - { - .i2c_port = I2C_PORT_USB_CHARGER_2, - .mux_lock = NULL, - }, -}; -BUILD_ASSERT(ARRAY_SIZE(pi3usb9281_chips) == - CONFIG_USB_SWITCH_PI3USB9281_CHIP_COUNT); - +#if 1 /* TODO: TCPC */ struct usb_mux usb_muxes[CONFIG_USB_PD_PORT_COUNT] = { { - .port_addr = 0xa8, - .driver = &pi3usb30532_usb_mux_driver, + .port_addr = 0, + .driver = &tcpci_tcpm_usb_mux_driver, }, { - .port_addr = 0xaa, - .driver = &pi3usb30532_usb_mux_driver, + .port_addr = 0, + .driver = &tcpci_tcpm_usb_mux_driver, } }; +#endif /** * Reset PD MCU + * + * TCPC0 minimum reset assertion time: TODO + * TCPC1 minimum reset assertion time: 1ms (must be less than 10ms) */ void board_reset_pd_mcu(void) { - gpio_set_level(GPIO_PD_RST_L, 0); - usleep(100); - gpio_set_level(GPIO_PD_RST_L, 1); + /* Assert reset to TCPC1 */ + gpio_set_level(GPIO_USB_C1_RST_L, 0); + + /* Assert reset to TCPC0 */ + gpio_set_level(GPIO_USB_C0_RST_L, 0); + msleep(1); + gpio_set_level(GPIO_USB_C0_PWR_EN, 0); + + /* Deassert reset to TCPC1 */ + gpio_set_level(GPIO_USB_C1_RST_L, 1); + + /* TODO: Need confirmation from TCPC0 vendor */ + msleep(10); + + /* Deassert reset to TCPC0 */ + gpio_set_level(GPIO_USB_C0_PWR_EN, 1); + msleep(10); + gpio_set_level(GPIO_USB_C0_RST_L, 1); } +void board_tcpc_init(void) +{ + /* Only reset TCPC if not sysjump */ + if (!system_jumped_to_this_image()) + board_reset_pd_mcu(); + +#if 0 /* TODO: TCPC */ + /* Enable TCPC0 interrupt */ + gpio_enable_interrupt(GPIO_USB_C0_PD_INT); + gpio_enable_interrupt(GPIO_USB_C0_VBUS_WAKE_L); + + /* Enable TCPC1 interrupt */ + gpio_enable_interrupt(GPIO_USB_C1_PD_INT_L); + gpio_enable_interrupt(GPIO_USB_C1_VBUS_WAKE_L); +#endif +} +DECLARE_HOOK(HOOK_INIT, board_tcpc_init, HOOK_PRIO_INIT_I2C+1); + /* * Temperature sensors data; must be in same order as enum temp_sensor_id. * Sensor index and name must match those present in coreboot: * src/mainboard/google/${board}/acpi/dptf.asl */ const struct temp_sensor_t temp_sensors[] = { - {"TMP432_Internal", TEMP_SENSOR_TYPE_BOARD, tmp432_get_val, - TMP432_IDX_LOCAL, 4}, - {"TMP432_Sensor_1", TEMP_SENSOR_TYPE_BOARD, tmp432_get_val, - TMP432_IDX_REMOTE1, 4}, - {"TMP432_Sensor_2", TEMP_SENSOR_TYPE_BOARD, tmp432_get_val, - TMP432_IDX_REMOTE2, 4}, + {"G782_Internal", TEMP_SENSOR_TYPE_BOARD, g78x_get_val, + G78X_IDX_INTERNAL, 4}, + {"G782_Sensor_1", TEMP_SENSOR_TYPE_BOARD, g78x_get_val, + G78X_IDX_EXTERNAL1, 4}, + {"G782_Sensor_2", TEMP_SENSOR_TYPE_BOARD, g78x_get_val, + G78X_IDX_EXTERNAL2, 4}, {"Battery", TEMP_SENSOR_TYPE_BATTERY, charge_temp_sensor_get_val, 0, 4}, }; @@ -196,9 +279,9 @@ BUILD_ASSERT(ARRAY_SIZE(temp_sensors) == TEMP_SENSOR_COUNT); */ struct ec_thermal_config thermal_params[] = { /* {Twarn, Thigh, Thalt}, fan_off, fan_max */ - {{0, 0, 0}, 0, 0}, /* TMP432_Internal */ - {{0, 0, 0}, 0, 0}, /* TMP432_Sensor_1 */ - {{0, 0, 0}, 0, 0}, /* TMP432_Sensor_2 */ + {{0, 0, 0}, 0, 0}, /* G782_Internal */ + {{0, 0, 0}, 0, 0}, /* G782_Sensor_1 */ + {{0, 0, 0}, 0, 0}, /* G782_Sensor_2 */ {{0, 0, 0}, 0, 0}, /* Battery */ }; BUILD_ASSERT(ARRAY_SIZE(thermal_params) == TEMP_SENSOR_COUNT); @@ -219,16 +302,18 @@ const struct button_config buttons[CONFIG_BUTTON_COUNT] = { /* Initialize board. */ static void board_init(void) { - /* Enable PD MCU interrupt */ - gpio_enable_interrupt(GPIO_PD_MCU_INT); +#if 1 /* TODO: CHARGER / BC1.2 */ + int i; - /* Enable VBUS interrupt */ - gpio_enable_interrupt(GPIO_USB_C0_VBUS_WAKE_L); - gpio_enable_interrupt(GPIO_USB_C1_VBUS_WAKE_L); + /* Initialize all BC1.2 charge suppliers to 0 */ + for (i = 0; i < CONFIG_USB_PD_PORT_COUNT; i++) + reset_charge(i); +#endif - /* Enable pericom BC1.2 interrupts */ - gpio_enable_interrupt(GPIO_USB_C0_BC12_INT_L); - gpio_enable_interrupt(GPIO_USB_C1_BC12_INT_L); +#if 0 /* TODO: CHARGER */ + /* Enable charger interrupt */ + gpio_enable_interrupt(GPIO_CHARGER_INT_L); +#endif /* Enable tablet mode interrupt for input device enable */ gpio_enable_interrupt(GPIO_TABLET_MODE_L); @@ -245,6 +330,8 @@ DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT); */ int board_set_active_charge_port(int charge_port) { + enum bd99955_charge_port bd99955_port; + /* charge port is a realy physical port */ int is_real_port = (charge_port >= 0 && charge_port < CONFIG_USB_PD_PORT_COUNT); @@ -259,20 +346,22 @@ int board_set_active_charge_port(int charge_port) CPRINTS("New chg p%d", charge_port); - if (charge_port == CHARGE_PORT_NONE) { - /* Disable both ports */ - gpio_set_level(GPIO_USB_C0_CHARGE_EN_L, 1); - gpio_set_level(GPIO_USB_C1_CHARGE_EN_L, 1); - } else { - /* Make sure non-charging port is disabled */ - gpio_set_level(charge_port ? GPIO_USB_C0_CHARGE_EN_L : - GPIO_USB_C1_CHARGE_EN_L, 1); - /* Enable charging port */ - gpio_set_level(charge_port ? GPIO_USB_C1_CHARGE_EN_L : - GPIO_USB_C0_CHARGE_EN_L, 0); + switch (charge_port) { + case 0: + bd99955_port = BD99955_CHARGE_PORT_VBUS; + break; + case 1: + bd99955_port = BD99955_CHARGE_PORT_VCC; + break; + case CHARGE_PORT_NONE: + bd99955_port = BD99955_CHARGE_PORT_NONE; + break; + default: + panic("Invalid charge port\n"); + break; } - return EC_SUCCESS; + return bd99955_select_input_port(bd99955_port); } /** @@ -324,11 +413,7 @@ void board_hibernate_late(void) /* Turn off LEDs in hibernate */ {GPIO_BAT_LED_BLUE, GPIO_INPUT | GPIO_PULL_UP}, {GPIO_BAT_LED_AMBER, GPIO_INPUT | GPIO_PULL_UP}, - /* - * Set PD wake low so that it toggles high to generate a wake - * event once we leave hibernate. - */ - {GPIO_USB_PD_WAKE, GPIO_OUTPUT | GPIO_LOW}, + /* * In hibernate, this pin connected to GND. Set it to output * low to eliminate the current caused by internal pull-up. @@ -339,9 +424,7 @@ void board_hibernate_late(void) * allow wake-on-plug. 5V enable must be pulled low. */ {GPIO_USB_C0_5V_EN, GPIO_INPUT | GPIO_PULL_DOWN}, - {GPIO_USB_C0_CHARGE_EN_L, GPIO_OUTPUT | GPIO_LOW}, {GPIO_USB_C1_5V_EN, GPIO_INPUT | GPIO_PULL_DOWN}, - {GPIO_USB_C1_CHARGE_EN_L, GPIO_OUTPUT | GPIO_LOW}, }; /* Change GPIOs' state in hibernate for better power consumption */ @@ -367,14 +450,14 @@ static struct mutex g_base_mutex; /* Matrix to rotate accelrator into standard reference frame */ const matrix_3x3_t base_standard_ref = { - { 0, FLOAT_TO_FP(1), 0}, - { FLOAT_TO_FP(-1), 0, 0}, + { 0, FLOAT_TO_FP(-1), 0}, + { FLOAT_TO_FP(1), 0, 0}, { 0, 0, FLOAT_TO_FP(1)} }; -/* KXCJ9 private data */ -struct kionix_accel_data g_kxcj9_data = { - .variant = KXCJ9, +/* KX022 private data */ +struct kionix_accel_data g_kx022_data = { + .variant = KX022, }; struct motion_sensor_t motion_sensors[] = { @@ -392,7 +475,7 @@ struct motion_sensor_t motion_sensors[] = { .drv = &bmi160_drv, .mutex = &g_lid_mutex, .drv_data = &g_bmi160_data, - .port = I2C_PORT_ACCEL, + .port = I2C_PORT_ACCELGYRO, .addr = BMI160_ADDR0, .rot_standard_ref = NULL, /* Identity matrix. */ .default_range = 2, /* g, enough for laptop. */ @@ -429,7 +512,7 @@ struct motion_sensor_t motion_sensors[] = { .drv = &bmi160_drv, .mutex = &g_lid_mutex, .drv_data = &g_bmi160_data, - .port = I2C_PORT_ACCEL, + .port = I2C_PORT_ACCELGYRO, .addr = BMI160_ADDR0, .default_range = 1000, /* dps */ .rot_standard_ref = NULL, /* Identity Matrix. */ @@ -466,7 +549,7 @@ struct motion_sensor_t motion_sensors[] = { .drv = &bmi160_drv, .mutex = &g_lid_mutex, .drv_data = &g_bmi160_data, - .port = I2C_PORT_ACCEL, + .port = I2C_PORT_ACCELGYRO, .addr = BMI160_ADDR0, .default_range = 1 << 11, /* 16LSB / uT, fixed */ .rot_standard_ref = NULL, /* Identity Matrix. */ @@ -497,14 +580,14 @@ struct motion_sensor_t motion_sensors[] = { [BASE_ACCEL] = { .name = "Base Accel", .active_mask = SENSOR_ACTIVE_S0, - .chip = MOTIONSENSE_CHIP_KXCJ9, + .chip = MOTIONSENSE_CHIP_KX022, .type = MOTIONSENSE_TYPE_ACCEL, .location = MOTIONSENSE_LOC_BASE, .drv = &kionix_accel_drv, .mutex = &g_base_mutex, - .drv_data = &g_kxcj9_data, + .drv_data = &g_kx022_data, .port = I2C_PORT_ACCEL, - .addr = KXCJ9_ADDR1, + .addr = KX022_ADDR1, .rot_standard_ref = &base_standard_ref, /* Identity matrix. */ .default_range = 2, /* g, enough for laptop. */ .config = { @@ -536,6 +619,9 @@ void board_hibernate(void) { CPRINTS("Enter Pseudo G3"); + /* Enable both the VBUS & VCC ports before entering PG3 */ + bd99955_select_input_port(BD99955_CHARGE_PORT_BOTH); + /* * Clean up the UART buffer and prevent any unwanted garbage characters * before power off and also ensure above debug message is printed. diff --git a/board/amenia/board.h b/board/amenia/board.h index 8df5715165..4d4b76bcd3 100644 --- a/board/amenia/board.h +++ b/board/amenia/board.h @@ -16,7 +16,7 @@ /* Optional features */ #define CONFIG_ACCELGYRO_BMI160 -#define CONFIG_ACCEL_KXCJ9 +#define CONFIG_ACCEL_KX022 #define CONFIG_ADC #define CONFIG_ALS #define CONFIG_ALS_ISL29035 @@ -33,7 +33,7 @@ #define CONFIG_CHARGER_ADC_AMON_BMON #define CONFIG_CHARGER_DISCHARGE_ON_AC -#define CONFIG_CHARGER_ISL9237 +#define CONFIG_CHARGER_BD99955 #define CONFIG_CHARGER_ILIM_PIN_DISABLED #define CONFIG_CHARGER_INPUT_CURRENT 512 #define CONFIG_CHARGER_LIMIT_POWER_THRESH_BAT_PCT 1 @@ -49,12 +49,11 @@ #define CONFIG_CMD_ALS #define CONFIG_EXTPOWER_GPIO #define CONFIG_FPU -#define CONFIG_HOSTCMD_PD -#define CONFIG_HOSTCMD_PD_PANIC #define CONFIG_I2C #define CONFIG_I2C_MASTER #define CONFIG_LPC #define CONFIG_UART_HOST 0 +#define CONFIG_KEYBOARD_COL2_INVERTED #define CONFIG_KEYBOARD_PROTOCOL_8042 #define CONFIG_LED_COMMON #define CONFIG_LID_ANGLE @@ -71,8 +70,6 @@ #define CONFIG_POWER_BUTTON_X86 #define CONFIG_POWER_COMMON #define CONFIG_SCI_GPIO GPIO_PCH_SCI_L -#define CONFIG_USB_CHARGER -#define CONFIG_USB_MUX_PI3USB30532 #define CONFIG_USB_POWER_DELIVERY #define CONFIG_USB_PD_ALT_MODE #define CONFIG_USB_PD_ALT_MODE_DFP @@ -82,6 +79,9 @@ #define CONFIG_USB_PD_LOG_SIZE 512 #define CONFIG_USB_PD_PORT_COUNT 2 #define CONFIG_USB_PD_TCPM_TCPCI +#define TCPC0_I2C_ADDR CONFIG_TCPC_I2C_BASE_ADDR +#define TCPC1_I2C_ADDR (CONFIG_TCPC_I2C_BASE_ADDR + 2) +#define CONFIG_USB_PD_TCPM_MUX #define CONFIG_USB_PD_TRY_SRC #define CONFIG_USB_PORT_POWER_SMART #define GPIO_USB1_CTL1 GPIO_USB_CTL1 @@ -91,8 +91,6 @@ #define GPIO_USB2_CTL2 GPIO_UNIMPLEMENTED #define GPIO_USB2_CTL3 GPIO_UNIMPLEMENTED #define CONFIG_USB_PORT_POWER_SMART_DEFAULT_MODE USB_CHARGE_MODE_CDP -#define CONFIG_USB_SWITCH_PI3USB9281 -#define CONFIG_USB_SWITCH_PI3USB9281_CHIP_COUNT 2 #define CONFIG_USBC_SS_MUX #define CONFIG_USBC_SS_MUX_DFP_ONLY #define CONFIG_USBC_VCONN @@ -103,7 +101,7 @@ #define CONFIG_SPI_FLASH_W25X40 #define CONFIG_TEMP_SENSOR -#define CONFIG_TEMP_SENSOR_TMP432 +#define CONFIG_TEMP_SENSOR_G782 /* Optional feature - used by nuvoton */ #define NPCX_I2C0_BUS2 0 /* 0:GPIOB4/B5 1:GPIOB2/B3 as I2C0 */ @@ -126,12 +124,9 @@ #define GPIO_BAT_LED_GREEN GPIO_CHARGE_LED_2 /* I2C ports */ -#define I2C_PORT_PMIC NPCX_I2C_PORT0_0 -#define I2C_PORT_USB_CHARGER_1 NPCX_I2C_PORT0_1 -#define I2C_PORT_USB_MUX NPCX_I2C_PORT0_1 -#define I2C_PORT_USB_CHARGER_2 NPCX_I2C_PORT0_0 -#define I2C_PORT_PD_MCU NPCX_I2C_PORT1 -#define I2C_PORT_TCPC NPCX_I2C_PORT1 +#define I2C_PORT_TCPC0 NPCX_I2C_PORT0_1 +#define I2C_PORT_TCPC1 NPCX_I2C_PORT0_1 +#define I2C_PORT_ACCELGYRO NPCX_I2C_PORT1 #define I2C_PORT_ALS NPCX_I2C_PORT2 #define I2C_PORT_ACCEL NPCX_I2C_PORT2 #define I2C_PORT_BATTERY NPCX_I2C_PORT3 @@ -151,6 +146,8 @@ enum adc_channel { ADC_VBUS, ADC_AMON_BMON, ADC_PSYS, + ADC_THERM_SYS0, + ADC_THERM_SYS1, /* Number of ADC channels */ ADC_CH_COUNT }; @@ -169,10 +166,10 @@ enum power_signal { }; enum temp_sensor_id { - /* TMP432 local and remote sensors */ - TEMP_SENSOR_I2C_TMP432_LOCAL, - TEMP_SENSOR_I2C_TMP432_REMOTE1, - TEMP_SENSOR_I2C_TMP432_REMOTE2, + /* G782 local and remote sensors */ + TEMP_SENSOR_I2C_G782_LOCAL, + TEMP_SENSOR_I2C_G782_REMOTE1, + TEMP_SENSOR_I2C_G782_REMOTE2, /* Battery temperature sensor */ TEMP_SENSOR_BATTERY, diff --git a/board/amenia/ec.tasklist b/board/amenia/ec.tasklist index 2ef0b5d498..f47a845f66 100644 --- a/board/amenia/ec.tasklist +++ b/board/amenia/ec.tasklist @@ -11,16 +11,14 @@ * For each task, use the macro TASK_ALWAYS(n, r, d, s) for base tasks and * TASK_NOTEST(n, r, d, s) for tasks that can be excluded in test binaries, * where : - * 'n' in the name of the task - * 'r' in the main routine of the task - * 'd' in an opaque parameter passed to the routine at startup + * 'n' is the name of the task + * 'r' is the main routine of the task + * 'd' is an opaque parameter passed to the routine at startup * 's' is the stack size in bytes; must be a multiple of 8 */ #define CONFIG_TASK_LIST \ TASK_ALWAYS(HOOKS, hook_task, NULL, LARGER_TASK_STACK_SIZE) \ TASK_ALWAYS(ALS, als_task, NULL, TASK_STACK_SIZE) \ - TASK_ALWAYS(USB_CHG_P0, usb_charger_task, NULL, TASK_STACK_SIZE) \ - TASK_ALWAYS(USB_CHG_P1, usb_charger_task, NULL, TASK_STACK_SIZE) \ TASK_ALWAYS(CHARGER, charger_task, NULL, LARGER_TASK_STACK_SIZE) \ TASK_NOTEST(MOTIONSENSE, motion_sense_task, NULL, VENTI_TASK_STACK_SIZE) \ TASK_NOTEST(CHIPSET, chipset_task, NULL, LARGER_TASK_STACK_SIZE) \ diff --git a/board/amenia/gpio.inc b/board/amenia/gpio.inc index 5abd6a9120..3a32f511a2 100644 --- a/board/amenia/gpio.inc +++ b/board/amenia/gpio.inc @@ -5,8 +5,10 @@ * 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. */ +/* + * Declare symbolic names for all the GPIOs that we care about. + * Note: Those with interrupt handlers must be declared first. + */ GPIO_INT(AC_PRESENT, PIN(7, 3), GPIO_INT_BOTH, extpower_interrupt) /* B39 - PS2_CLK3/TA2for EC_ACIN */ GPIO_INT(LID_OPEN, PIN(9, 5), GPIO_INT_BOTH | GPIO_PULL_UP, lid_interrupt) /* A47 - SPIP_MISO for LID_OPEN_D */ @@ -24,11 +26,14 @@ GPIO_INT(PCH_SUSPWRDNACK, PIN(B, 1), GPIO_INT_BOTH, power_ GPIO_INT(ALL_SYS_PGOOD, PIN(6, 2), GPIO_INT_BOTH, power_signal_interrupt) /* A31 - PS2_CLK1 for ALL_SYS_PWRGD */ GPIO_INT(RSMRST_L_PGOOD, PIN(9, 3), GPIO_INT_BOTH, power_signal_interrupt) /* A46 - TA1/F_DIO2 for PMIC_RSMRST_N */ -GPIO_INT(PD_MCU_INT, PIN(0, 2), GPIO_INT_FALLING | GPIO_PULL_UP, pd_mcu_interrupt) /* A01 - GPIO02 for USB_MCU_EC_INT_N */ GPIO_INT(USB_C0_VBUS_WAKE_L, PIN(A, 7), GPIO_INT_BOTH | GPIO_PULL_UP, vbus0_evt) /* B56 - PS2_DAT3/TB2/F_DIO3 for USB_C0_VBUS_DET_N */ +GPIO_INT(USB_C0_PD_INT, PIN(8, 5), GPIO_INT_RISING, tcpc_alert_event) /* A43 - RXD for USB_C0_PHY_INT */ + GPIO_INT(USB_C1_VBUS_WAKE_L, PIN(6, 1), GPIO_INT_BOTH | GPIO_PULL_UP, vbus1_evt) /* B32 - GPIO61 for USB_C1_VBUS_DET_N */ -GPIO_INT(USB_C0_BC12_INT_L, PIN(8, 5), GPIO_INT_FALLING, usb0_evt) /* A43 - RXD for USB_C0_BC12_INT_N */ -GPIO_INT(USB_C1_BC12_INT_L, PIN(9, 4), GPIO_INT_FALLING, usb1_evt) /* B49 - GPIO94 for USB_C1_BC12_INT_N */ +GPIO_INT(USB_C1_PD_INT_L, PIN(9, 4), GPIO_INT_FALLING, tcpc_alert_event) /* B49 - GPIO94 for USB_C1_PHY_INT_N */ + +/* TODO: CHARGER */ +GPIO(CHARGER_INT_L, PIN(0, 2), GPIO_INT_FALLING | GPIO_PULL_UP ) /* A01 - GPIO02 for CHRGR_INT_N */ /* Board ID */ GPIO(BOARD_VERSION1, PIN(0, 4), GPIO_INPUT) /* A02 - KSO13 for EC_BRD_ID1 */ @@ -58,7 +63,6 @@ GPIO(BAT_LED_AMBER, PIN(C, 0), GPIO_OUT_LOW) /* B61 /* Power Control*/ GPIO(V5A_EN, PIN(C, 4), GPIO_OUT_LOW) /* B64 - PWM2 for V5A_EN */ -GPIO(PMIC_EN, PIN(0, 3), GPIO_OUT_LOW) /* B02 - KSO16 for PMIC_EN */ GPIO(G3_SLEEP_EN, PIN(E, 3), GPIO_OUT_LOW) /* B51 - GPIOE3 for G3_SLEEP_ENA */ GPIO(ENABLE_BACKLIGHT, PIN(E, 2), GPIO_OUT_LOW) /* A41 - JTAG_TDI1 for EC_BL_DISABLE_N */ GPIO(ENABLE_TOUCHPAD, PIN(A, 6), GPIO_OUT_LOW) /* B55 - PS2_CLK3/TA2/F_CS1# for TRACKPAD_PWR_EN */ @@ -79,49 +83,53 @@ GPIO(CPU_PROCHOT, PIN(D, 7), GPIO_OUT_LOW) /* A18 GPIO(PCH_SEC_DISABLE_L, PIN(6, 3), GPIO_OUT_HIGH) /* B33 - PS2_DAT1 for FLASH_DSC_OVERRIDE_N */ GPIO(PCH_WAKE_L, PIN(3, 5), GPIO_OUT_HIGH) /* A17 - GPIO35/TEST# for EC_SOC_WAKE_N */ GPIO(PCH_RCIN_L, PIN(E, 1), GPIO_OUT_HIGH) /* B30 - GPIOE1 for EC_SOC_RST_OUT_N */ -GPIO(KBD_IRQ_L_DO_NOT_USE, PIN(D, 5), GPIO_INPUT) /* A08 - JTAG_TCK1 for EC_KBD_IRQ_N_R */ +GPIO(KBD_IRQ_L_DO_NOT_USE, PIN(D, 5), GPIO_INPUT | GPIO_PULL_UP) /* A08 - JTAG_TCK1 for EC_KBD_IRQ_N_R */ GPIO(PCH_SYS_PWROK, PIN(7, 2), GPIO_OUT_LOW) /* A36 - PWRGD for SOC_PWROK_R */ GPIO(PCH_RSMRST_L, PIN(8, 4), GPIO_OUT_LOW) /* B45 - GPIO84 for EC_RSMRST_OUT_N */ GPIO(PCH_RTCRST, PIN(C, 1), GPIO_OUT_LOW) /* A58 - GPIOC1 for EC_RTCRST */ /* USB-A Port */ -GPIO(USB1_ENABLE, PIN(4, 5), GPIO_OUT_LOW) /* B24 - ADC0 for USBPD_MB_PWR_EN */ +GPIO(USB1_ENABLE, PIN(6, 7), GPIO_OUT_LOW) /* A33 - PS2_CLK0 for USBPD_MB_PWR_EN */ GPIO(USB2_ENABLE, PIN(D, 4), GPIO_OUT_LOW) /* B08 - JTAG_TDO1 for USBPD_DB_PWR_EN */ GPIO(USB1_ILIM_SEL, PIN(A, 1), GPIO_ODR_HIGH) /* A49 - SPIP_SCLK for USBPD_MBILIMSEL_DBSTATUS_N */ GPIO(USB2_ILIM_SEL, PIN(C, 2), GPIO_ODR_HIGH) /* A59 - PWM1 for USBPD_MBSTATUS_N_DBILIMSEL */ GPIO(USB_CTL1, PIN(B, 6), GPIO_ODR_HIGH) /* B60 - PWM4/Eng_Strap# for EC_GPOB6 */ -/* USB-C Port */ -GPIO(PD_RST_L, PIN(7, 4), GPIO_ODR_HIGH) /* A37 - GPIO74 for EC_USBPD_RST_N */ -GPIO(USB_PD_WAKE, PIN(4, 3), GPIO_OUT_LOW) /* B23 - ADC2 for USBPD_WAKE */ -GPIO(USB_C0_DP_HPD, PIN(6, 7), GPIO_OUT_LOW) /* A33 - PS2_CLK0 for DDI1_HPD */ -GPIO(USB_C1_DP_HPD, PIN(3, 7), GPIO_OUT_LOW) /* B20 - PS2_CLK2 for DDI2_HPD */ +/* USB-C Port 0 */ GPIO(USB_C0_5V_EN, PIN(0, 1), GPIO_OUT_LOW) /* B01 - GPIO01 for EN_USB_C0_5V_OUT */ +GPIO(USB_C0_RST_L, PIN(7, 4), GPIO_OUT_LOW) /* A37 - GPIO74 for USB_C0_RESET_ANX_N */ +GPIO(USB_C0_PWR_EN, PIN(D, 3), GPIO_OUT_LOW) /* A64 - TB1 for USB_C0_ANX_PWR_EN */ +GPIO(USB_C0_CABLE_DET, PIN(B, 0), GPIO_INPUT) /* B57 - GPIOB0 for USB_C0_CABLE_DET */ + +/* USB-C Port 1 */ GPIO(USB_C1_5V_EN, PIN(E, 5), GPIO_OUT_LOW) /* B62 - JTAG_TMS1 for EN_USB_C1_5V_OUT */ -GPIO(USB_C0_CHARGE_EN_L, PIN(D, 3), GPIO_OUT_LOW) /* A64 - TB1 for EN_USB_C0_CHARGE_N */ -GPIO(USB_C1_CHARGE_EN_L, PIN(C, 7), GPIO_OUT_LOW) /* A62 - GPIOC7 for EN_USB_C1_CHARGE_N */ +GPIO(USB_C1_RST_L, PIN(C, 7), GPIO_OUT_LOW) /* A62 - GPIOC7 for USC_C1_RESET_PAR_N */ /* Other EC Pins */ GPIO(ENTERING_RW, PIN(6, 0), GPIO_OUT_LOW) /* A30 - PWM7 for EC_ENTERING_RW */ GPIO(BAT_PRESENT_L, PIN(C, 3), GPIO_INPUT | GPIO_PULL_UP) /* A60 - PWM0 for BC_BATPRES_N */ -GPIO(PLATFORM_EC_PROCHOT, PIN(3, 6), GPIO_INPUT) /* B19 - GPIO36 for PLATFORM_EC_PROCHOT */ +GPIO(PLATFORM_EC_PROCHOT, PIN(3, 6), GPIO_INPUT) /* B19 - GPIO36 for SOURCE_EC_PROCHOT_R */ GPIO(THERM_OVERTEMP_L, PIN(8, 0), GPIO_INPUT | GPIO_PULL_UP) /* A39 - PWM3 for THERM_OVERTEMP_N */ -GPIO(EC_STM_BOOT0, PIN(B, 0), GPIO_INPUT) /* B57 - GPIOB0 for EC_STM_BOOT0 */ GPIO(USB2_OTG_ID, PIN(7, 5), GPIO_ODR_LOW) /* B40 - 32KHZ_OUT for USB2_OTG_ID */ GPIO(USB2_OTG_VBUSSENSE, PIN(D, 2), GPIO_ODR_LOW) /* B67 - GPIOD2 for USB_VBUSSNS */ /* NC pins - Set as input and pull them up for better power consumption */ +GPIO(NC_003, PIN(0, 3), GPIO_INPUT | GPIO_PULL_UP) /* B02 - KSO16 for TP_PMIC_EN */ GPIO(NC_032, PIN(3, 2), GPIO_INPUT | GPIO_PULL_UP) /* A16 - TRIS# for TP_EC_GPO32 */ +GPIO(NC_037, PIN(3, 7), GPIO_INPUT | GPIO_PULL_UP) /* B20 - PS2_CLK2 for DDI2_HPD */ +GPIO(NC_066, PIN(6, 6), GPIO_INPUT | GPIO_PULL_UP) /* B35 - ARM#_x86 for DDI1_HPD */ GPIO(NC_081, PIN(8, 1), GPIO_INPUT | GPIO_PULL_UP) /* A40 - Unused pin */ -GPIO(NC_066, PIN(6, 6), GPIO_INPUT | GPIO_PULL_UP) /* B35 - Unused pin */ GPIO(NC_0D6, PIN(D, 6), GPIO_INPUT | GPIO_PULL_UP) /* B09 - Unused pin */ +/* Keyboard inverted COL2 */ +GPIO(KBD_KSO2, PIN(1, 7), GPIO_OUT_LOW) /* B11 - KSO02 for KB_ROW_2 */ + UNIMPLEMENTED(UNIMPLEMENTED) /* Alternate functions GPIO definitions */ /* ADC pins */ -ALTERNATE(PIN_MASK(4, 0x16), 1, MODULE_ADC, 0) /* ADC1/ADC3/ADC4 for ADC GPIO44/42/41 */ +ALTERNATE(PIN_MASK(4, 0x3E), 1, MODULE_ADC, 0) /* ADC0/ADC1/ADC2/ADC3/ADC4 for ADC GPIO45/44/43/42/41 */ /* I2C pins */ ALTERNATE(PIN_MASK(B, 0x0C), 1, MODULE_I2C, 0) /* I2C0SDA1/I2C0SCL1 for I2C GPIOB2/B3 */ @@ -130,9 +138,9 @@ ALTERNATE(PIN_MASK(8, 0x80), 1, MODULE_I2C, 0) /* I2C1SDA for I2C GPIO8 ALTERNATE(PIN_MASK(9, 0x07), 1, MODULE_I2C, 0) /* I2C1SCL/I2C2SDA/I2C2SCL for I2C GPIO90/91/92 */ ALTERNATE(PIN_MASK(D, 0x03), 1, MODULE_I2C, 0) /* I2C3SDA/I2C3SCL for I2C GPIOD0/D1 */ -/* Keyboard Columns */ +/* Keyboard Columns (except inverted COL2/GP17) */ ALTERNATE(PIN_MASK(0, 0xE0), 0, MODULE_KEYBOARD_SCAN, 0) -ALTERNATE(PIN_MASK(1, 0xFF), 0, MODULE_KEYBOARD_SCAN, 0) +ALTERNATE(PIN_MASK(1, 0x7F), 0, MODULE_KEYBOARD_SCAN, 0) ALTERNATE(PIN_MASK(2, 0x03), 0, MODULE_KEYBOARD_SCAN, 0) /* Keyboard Rows */ diff --git a/board/amenia/usb_pd_policy.c b/board/amenia/usb_pd_policy.c index 803dfecef2..f4fce34590 100644 --- a/board/amenia/usb_pd_policy.c +++ b/board/amenia/usb_pd_policy.c @@ -7,6 +7,7 @@ #include "charge_manager.h" #include "common.h" #include "console.h" +#include "driver/charger/bd99955.h" #include "gpio.h" #include "hooks.h" #include "host_command.h" @@ -49,13 +50,17 @@ void pd_transition_voltage(int idx) int pd_set_power_supply_ready(int port) { - /* Disable charging */ - gpio_set_level(port ? GPIO_USB_C1_CHARGE_EN_L : - GPIO_USB_C0_CHARGE_EN_L, 1); + /* Ensure we're not charging from this port */ + if (charge_manager_get_active_charge_port() == port) + bd99955_select_input_port(BD99955_CHARGE_PORT_NONE); + /* Provide VBUS */ gpio_set_level(port ? GPIO_USB_C1_5V_EN : GPIO_USB_C0_5V_EN, 1); + /* notify host of power info change */ + pd_send_host_event(PD_EVENT_POWER_CHANGE); + return EC_SUCCESS; /* we are ready */ } @@ -80,6 +85,7 @@ void pd_set_input_current_limit(int port, uint32_t max_ma, charge_manager_update_charge(CHARGE_SUPPLIER_PD, port, &charge); #endif /* notify host of power info change */ + pd_send_host_event(PD_EVENT_POWER_CHANGE); } void typec_set_input_current_limit(int port, uint32_t max_ma, @@ -94,6 +100,7 @@ void typec_set_input_current_limit(int port, uint32_t max_ma, #endif /* notify host of power info change */ + pd_send_host_event(PD_EVENT_POWER_CHANGE); } int pd_snk_is_vbus_provided(int port) @@ -288,9 +295,14 @@ static void svdm_dp_post_config(int port) if (!(dp_flags[port] & DP_FLAGS_HPD_HI_PENDING)) return; +/* TODO: TCPC HPD */ +#if 0 gpio_set_level(PORT_TO_HPD(port), 1); +#endif } +/* TODO: TCPC HPD */ +#if 0 static void hpd0_irq_deferred(void) { gpio_set_level(GPIO_USB_C0_DP_HPD, 1); @@ -306,9 +318,12 @@ DECLARE_DEFERRED(hpd1_irq_deferred); #define PORT_TO_HPD_IRQ_DEFERRED(port) ((port) ? \ &hpd1_irq_deferred_data : \ &hpd0_irq_deferred_data) +#endif static int svdm_dp_attention(int port, uint32_t *payload) { +/* TODO: TCPC HPD */ +#if 0 int cur_lvl; int lvl = PD_VDO_DPSTS_HPD_LVL(payload[1]); int irq = PD_VDO_DPSTS_HPD_IRQ(payload[1]); @@ -335,6 +350,8 @@ static int svdm_dp_attention(int port, uint32_t *payload) } else { gpio_set_level(hpd, lvl); } +#endif + /* ack */ return 1; } @@ -342,7 +359,11 @@ static int svdm_dp_attention(int port, uint32_t *payload) static void svdm_exit_dp_mode(int port) { svdm_safe_dp_mode(port); + +/* TODO: TCPC HPD */ +#if 0 gpio_set_level(PORT_TO_HPD(port), 0); +#endif } static int svdm_enter_gfu_mode(int port, uint32_t mode_caps) @@ -396,4 +417,3 @@ const struct svdm_amode_fx supported_modes[] = { }; const int supported_modes_cnt = ARRAY_SIZE(supported_modes); #endif /* CONFIG_USB_PD_ALT_MODE_DFP */ -