/* 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. */ #include "adc.h" #include "charger.h" #include "chipset.h" #include "common.h" #include "driver/charger/isl9241.h" #include "driver/temp_sensor/sb_tsi.h" #include "gpio.h" #include "hooks.h" #include "i2c.h" #include "power.h" #include "temp_sensor.h" #include "temp_sensor/thermistor.h" const struct power_signal_info power_signal_list[] = { [X86_SLP_S3_N] = { .gpio = GPIO_PCH_SLP_S3_L, .flags = POWER_SIGNAL_ACTIVE_HIGH, .name = "SLP_S3_DEASSERTED", }, [X86_SLP_S5_N] = { .gpio = GPIO_PCH_SLP_S5_L, .flags = POWER_SIGNAL_ACTIVE_HIGH, .name = "SLP_S5_DEASSERTED", }, [X86_S0_PGOOD] = { .gpio = GPIO_S0_PGOOD, .flags = POWER_SIGNAL_ACTIVE_HIGH, .name = "S0_PGOOD", }, [X86_S5_PGOOD] = { .gpio = GPIO_S5_PGOOD, .flags = POWER_SIGNAL_ACTIVE_HIGH, .name = "S5_PGOOD", }, }; BUILD_ASSERT(ARRAY_SIZE(power_signal_list) == POWER_SIGNAL_COUNT); int board_get_temp(int idx, int *temp_k) { int mv; int temp_c; enum adc_channel channel; /* idx is the sensor index set in board temp_sensors[] */ switch (idx) { case TEMP_SENSOR_CHARGER: channel = ADC_TEMP_SENSOR_CHARGER; break; case TEMP_SENSOR_SOC: /* thermistor is not powered in G3 */ if (chipset_in_state(CHIPSET_STATE_HARD_OFF)) return EC_ERROR_NOT_POWERED; /* adc power not ready when transition to S5 */ if (chipset_in_or_transitioning_to_state( CHIPSET_STATE_SOFT_OFF)) return EC_ERROR_NOT_POWERED; channel = ADC_TEMP_SENSOR_SOC; break; default: return EC_ERROR_INVAL; } mv = adc_read_channel(channel); if (mv < 0) return EC_ERROR_INVAL; temp_c = thermistor_linear_interpolate(mv, &thermistor_info); *temp_k = C_TO_K(temp_c); return EC_SUCCESS; } const struct adc_t adc_channels[] = { [ADC_TEMP_SENSOR_CHARGER] = { .name = "CHARGER", .input_ch = NPCX_ADC_CH2, .factor_mul = ADC_MAX_VOLT, .factor_div = ADC_READ_MAX + 1, .shift = 0, }, [ADC_TEMP_SENSOR_SOC] = { .name = "SOC", .input_ch = NPCX_ADC_CH3, .factor_mul = ADC_MAX_VOLT, .factor_div = ADC_READ_MAX + 1, .shift = 0, }, }; BUILD_ASSERT(ARRAY_SIZE(adc_channels) == ADC_CH_COUNT); const struct temp_sensor_t temp_sensors[] = { [TEMP_SENSOR_CHARGER] = { .name = "Charger", .type = TEMP_SENSOR_TYPE_BOARD, .read = board_get_temp, .idx = TEMP_SENSOR_CHARGER, }, [TEMP_SENSOR_SOC] = { .name = "SOC", .type = TEMP_SENSOR_TYPE_BOARD, .read = board_get_temp, .idx = TEMP_SENSOR_SOC, }, [TEMP_SENSOR_CPU] = { .name = "CPU", .type = TEMP_SENSOR_TYPE_CPU, .read = sb_tsi_get_val, .idx = 0, }, }; BUILD_ASSERT(ARRAY_SIZE(temp_sensors) == TEMP_SENSOR_COUNT); __overridable struct ec_thermal_config thermal_params[TEMP_SENSOR_COUNT] = { [TEMP_SENSOR_CHARGER] = { .temp_host = { [EC_TEMP_THRESH_HIGH] = C_TO_K(90), [EC_TEMP_THRESH_HALT] = C_TO_K(92), }, .temp_host_release = { [EC_TEMP_THRESH_HIGH] = C_TO_K(80), } }, [TEMP_SENSOR_SOC] = { .temp_host = { [EC_TEMP_THRESH_HIGH] = C_TO_K(90), [EC_TEMP_THRESH_HALT] = C_TO_K(92), }, .temp_host_release = { [EC_TEMP_THRESH_HIGH] = C_TO_K(80), } }, [TEMP_SENSOR_CPU] = { .temp_host = { [EC_TEMP_THRESH_HIGH] = C_TO_K(90), [EC_TEMP_THRESH_HALT] = C_TO_K(92), }, .temp_host_release = { [EC_TEMP_THRESH_HIGH] = C_TO_K(80), } }, }; BUILD_ASSERT(ARRAY_SIZE(thermal_params) == TEMP_SENSOR_COUNT); const struct i2c_port_t i2c_ports[] = { { .name = "tcpc0", .port = I2C_PORT_TCPC0, .kbps = 400, .scl = GPIO_EC_I2C_USB_A0_C0_SCL, .sda = GPIO_EC_I2C_USB_A0_C0_SDA, }, { .name = "tcpc1", .port = I2C_PORT_TCPC1, .kbps = 400, .scl = GPIO_EC_I2C_USB_A1_C1_SCL, .sda = GPIO_EC_I2C_USB_A1_C1_SDA, }, { .name = "charger", .port = I2C_PORT_CHARGER, .kbps = 100, .scl = GPIO_EC_I2C_POWER_SCL, .sda = GPIO_EC_I2C_POWER_SDA, }, { .name = "ap_mux", .port = I2C_PORT_USB_AP_MUX, .kbps = 400, .scl = GPIO_EC_I2C_USBC_AP_MUX_SCL, .sda = GPIO_EC_I2C_USBC_AP_MUX_SDA, }, { .name = "thermal", .port = I2C_PORT_THERMAL_AP, .kbps = 400, .scl = GPIO_FCH_SIC, .sda = GPIO_FCH_SID, }, { .name = "sensor", .port = I2C_PORT_SENSOR, .kbps = 400, .scl = GPIO_EC_I2C_SENSOR_CBI_SCL, .sda = GPIO_EC_I2C_SENSOR_CBI_SDA, }, { .name = "ap_audio", .port = I2C_PORT_AP_AUDIO, .kbps = 400, .scl = GPIO_I2C_AUDIO_USB_HUB_SCL, .sda = GPIO_I2C_AUDIO_USB_HUB_SDA, }, { .name = "battery", .port = I2C_PORT_BATTERY_V1, .kbps = 100, .scl = GPIO_EC_I2C_BATT_SCL, .sda = GPIO_EC_I2C_BATT_SDA, }, }; const unsigned int i2c_ports_used = ARRAY_SIZE(i2c_ports); /***************************************************************************** * Charger */ const struct charger_config_t chg_chips[] = { { .i2c_port = I2C_PORT_CHARGER, .i2c_addr_flags = ISL9241_ADDR_FLAGS, .drv = &isl9241_drv, }, };