/* Copyright 2020 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ /* Asurada board configuration */ #include "adc.h" #include "adc_chip.h" #include "button.h" #include "charger.h" #include "chipset.h" #include "common.h" #include "console.h" #include "driver/charger/isl923x.h" #include "driver/tcpm/it83xx_pd.h" #include "extpower.h" #include "gpio.h" #include "hooks.h" #include "i2c.h" #include "keyboard_scan.h" #include "lid_switch.h" #include "power.h" #include "power_button.h" #include "pwm.h" #include "pwm_chip.h" #include "switch.h" #include "tablet_mode.h" #include "timer.h" #include "uart.h" #include "usb_mux.h" #include "usb_pd_tcpm.h" #define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ## args) #define CPRINTF(format, args...) cprintf(CC_USBCHARGE, format, ## args) #define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ## args) #define CPRINTF(format, args...) cprintf(CC_USBCHARGE, format, ## args) static void x_ec_interrupt(enum gpio_signal signal); #include "gpio_list.h" const struct charger_config_t chg_chips[] = { { .i2c_port = I2C_PORT_CHARGER, .i2c_addr_flags = ISL923X_ADDR_FLAGS, .drv = &isl923x_drv, }, }; const unsigned int chg_cnt = ARRAY_SIZE(chg_chips); /* * PWM channels. Must be in the exactly same order as in enum pwm_channel. * There total three 16 bits clock prescaler registers for all pwm channels, * so use the same frequency and prescaler register setting is required if * number of pwm channel greater than three. */ const struct pwm_t pwm_channels[] = { }; BUILD_ASSERT(ARRAY_SIZE(pwm_channels) == PWM_CH_COUNT); /* Wake-up pins for hibernate */ const enum gpio_signal hibernate_wake_pins[] = { GPIO_AC_PRESENT, GPIO_LID_OPEN, GPIO_POWER_BUTTON_L, }; const int hibernate_wake_pins_used = ARRAY_SIZE(hibernate_wake_pins); /* power signal list. Must match order of enum power_signal. */ const struct power_signal_info power_signal_list[] = { {GPIO_PMIC_EC_PWRGD, POWER_SIGNAL_ACTIVE_HIGH, "PMIC_PWR_GOOD"}, {GPIO_AP_IN_SLEEP_L, POWER_SIGNAL_ACTIVE_LOW, "AP_IN_S3_L"}, {GPIO_AP_EC_WATCHDOG_L, POWER_SIGNAL_ACTIVE_LOW | POWER_SIGNAL_DISABLE_AT_BOOT, "AP_WDT_ASSERTED"}, }; BUILD_ASSERT(ARRAY_SIZE(power_signal_list) == POWER_SIGNAL_COUNT); /* Detect subboard */ static enum board_sub_board board_get_sub_board(void); /* Initialize board. */ static void board_init(void) { } DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT); /* ADC channels. Must be in the exactly same order as in enum adc_channel. */ const struct adc_t adc_channels[] = { /* Convert to mV (3000mV/1024). */ {"TEMP_SENSOR_SUBPMIC", 3000, 1024, 0, CHIP_ADC_CH0}, {"BOARD_ID_0", 3000, 1024, 0, CHIP_ADC_CH1}, {"BOARD_ID_1", 3000, 1024, 0, CHIP_ADC_CH2}, {"TEMP_SENSOR_AMB", 3000, 1024, 0, CHIP_ADC_CH3}, {"TEMP_SENSOR_CHARGER", 3000, 1024, 0, CHIP_ADC_CH5}, {"CHARGER_PMON", 3000, 1024, 0, CHIP_ADC_CH6}, {"TEMP_SENSOR_AP", 3000, 1024, 0, CHIP_ADC_CH7}, }; BUILD_ASSERT(ARRAY_SIZE(adc_channels) == ADC_CH_COUNT); /* Keyboard scan setting */ struct keyboard_scan_config keyscan_config = { .output_settle_us = 35, .debounce_down_us = 5 * MSEC, .debounce_up_us = 40 * 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 */ }, }; /* * I2C channels (A, B, and C) are using the same timing registers (00h~07h) * at default. * In order to set frequency independently for each channels, * We use timing registers 09h~0Bh, and the supported frequency will be: * 50KHz, 100KHz, 400KHz, or 1MHz. * I2C channels (D, E and F) can be set different frequency on different ports. * The I2C(D/E/F) frequency depend on the frequency of SMBus Module and * the individual prescale register. * The frequency of SMBus module is 24MHz on default. * The allowed range of I2C(D/E/F) frequency is as following setting. * SMBus Module Freq = PLL_CLOCK / ((IT83XX_ECPM_SCDCR2 & 0x0F) + 1) * (SMBus Module Freq / 510) <= I2C Freq <= (SMBus Module Freq / 8) * Channel D has multi-function and can be used as UART interface. * Channel F is reserved for EC debug. */ /* I2C ports */ const struct i2c_port_t i2c_ports[] = { {"bat_chg", IT83XX_I2C_CH_A, 100, GPIO_I2C_A_SCL, GPIO_I2C_A_SDA}, {"sensor", IT83XX_I2C_CH_B, 100, GPIO_I2C_B_SCL, GPIO_I2C_B_SDA}, {"usb0", IT83XX_I2C_CH_C, 100, GPIO_I2C_C_SCL, GPIO_I2C_C_SDA}, {"usb1", IT83XX_I2C_CH_E, 100, GPIO_I2C_E_SCL, GPIO_I2C_E_SDA}, }; const unsigned int i2c_ports_used = ARRAY_SIZE(i2c_ports); static void x_ec_interrupt(enum gpio_signal signal) { /* TODO: implement this */ } /* TCPC */ const struct tcpc_config_t tcpc_config[CONFIG_USB_PD_PORT_MAX_COUNT] = { { .bus_type = EC_BUS_TYPE_EMBEDDED, /* TCPC is embedded within EC so no i2c config needed */ .drv = &it83xx_tcpm_drv, /* Alert is active-low, push-pull */ .flags = 0, }, { .bus_type = EC_BUS_TYPE_EMBEDDED, /* TCPC is embedded within EC so no i2c config needed */ .drv = &it83xx_tcpm_drv, /* Alert is active-low, push-pull */ .flags = 0, }, }; /* USB Mux */ const struct usb_mux usb_muxes[CONFIG_USB_PD_PORT_MAX_COUNT] = { }; uint16_t tcpc_get_alert_status(void) { /* * C0 & C1: TCPC is embedded in the EC and processes interrupts in the * chip code (it83xx/intc.c) */ return 0; } void board_reset_pd_mcu(void) { /* * C0 & C1: TCPC is embedded in the EC and processes interrupts in the * chip code (it83xx/intc.c) */ } int board_get_version(void) { return 0; } int board_set_active_charge_port(int charge_port) { CPRINTS("New chg p%d", charge_port); return 0; } void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, int charge_mv) { } void board_pd_vconn_ctrl(int port, enum usbpd_cc_pin cc_pin, int enabled) { } /* Sub-board */ static enum board_sub_board board_get_sub_board(void) { static enum board_sub_board sub = SUB_BOARD_NONE; if (sub != SUB_BOARD_NONE) return sub; /* HDMI board has external pull high. */ if (gpio_get_level(GPIO_EC_X_GPIO3)) { sub = SUB_BOARD_HDMI; } else { sub = SUB_BOARD_TYPEC; /* EC_X_GPIO1 */ gpio_set_flags(GPIO_USB_C1_FRS_EN, GPIO_OUT_LOW); /* X_EC_GPIO2 */ gpio_set_flags(GPIO_USB_C1_PPC_INT_ODL, GPIO_INT_BOTH | GPIO_PULL_UP); /* EC_X_GPIO3 */ gpio_set_flags(GPIO_USB_C1_DP_IN_HPD, GPIO_OUT_LOW); } CPRINTS("Detect %s SUB", sub == SUB_BOARD_HDMI ? "HDMI" : "TYPEC"); return sub; } static void sub_board_init(void) { board_get_sub_board(); } DECLARE_HOOK(HOOK_INIT, sub_board_init, HOOK_PRIO_INIT_I2C - 1); __override uint8_t board_get_usb_pd_port_count(void) { if (board_get_sub_board() == SUB_BOARD_TYPEC) return CONFIG_USB_PD_PORT_MAX_COUNT; else return CONFIG_USB_PD_PORT_MAX_COUNT - 1; }