diff options
-rw-r--r-- | board/fizz/battery.c | 134 | ||||
-rw-r--r-- | board/fizz/board.c | 71 | ||||
-rw-r--r-- | board/fizz/board.h | 27 | ||||
-rw-r--r-- | board/fizz/build.mk | 1 | ||||
-rw-r--r-- | board/fizz/ec.tasklist | 1 | ||||
-rw-r--r-- | board/fizz/gpio.inc | 1 | ||||
-rw-r--r-- | board/fizz/usb_pd_policy.c | 54 | ||||
-rw-r--r-- | power/intel_x86.c | 6 |
8 files changed, 96 insertions, 199 deletions
diff --git a/board/fizz/battery.c b/board/fizz/battery.c deleted file mode 100644 index 221814dba3..0000000000 --- a/board/fizz/battery.c +++ /dev/null @@ -1,134 +0,0 @@ -/* Copyright 2017 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. - * - * Placeholder values for temporary battery pack. - */ - -#include "battery.h" -#include "battery_smart.h" -#include "charge_state.h" -#include "console.h" -#include "ec_commands.h" -#include "extpower.h" -#include "util.h" - -/* Shutdown mode parameter to write to manufacturer access register */ -#define SB_SHIP_MODE_REG 0x3a -#define SB_SHUTDOWN_DATA 0xC574 - -static const struct battery_info info = { - .voltage_max = 13200, - .voltage_normal = 11550, - .voltage_min = 9100, - /* Pre-charge values. */ - .precharge_current = 256, /* mA */ - - .start_charging_min_c = 0, - .start_charging_max_c = 50, - .charging_min_c = 0, - .charging_max_c = 60, - .discharging_min_c = 0, - .discharging_max_c = 60, -}; - -const struct battery_info *battery_get_info(void) -{ - return &info; -} - -int board_cut_off_battery(void) -{ - int rv; - - /* Ship mode command must be sent twice to take effect */ - rv = sb_write(SB_SHIP_MODE_REG, SB_SHUTDOWN_DATA); - - if (rv != EC_SUCCESS) - return rv; - - return sb_write(SB_SHIP_MODE_REG, SB_SHUTDOWN_DATA); -} - -/* TODO(crosbug.com/p/61098): Verify that this applies with our battery pack */ -enum battery_disconnect_state battery_get_disconnect_state(void) -{ - uint8_t data[6]; - int rv; - - /* - * Take note if we find that the battery isn't in disconnect state, - * and always return NOT_DISCONNECTED without probing the battery. - * This assumes the battery will not go to disconnect state during - * runtime. - */ - static int not_disconnected; - - if (not_disconnected) - return BATTERY_NOT_DISCONNECTED; - - if (extpower_is_present()) { - /* Check if battery charging + discharging is disabled. */ - rv = sb_read_mfgacc(PARAM_OPERATION_STATUS, - SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data)); - if (rv) - return BATTERY_DISCONNECT_ERROR; - - if (~data[3] & (BATTERY_DISCHARGING_DISABLED | - BATTERY_CHARGING_DISABLED)) { - not_disconnected = 1; - return BATTERY_NOT_DISCONNECTED; - } - - /* - * Battery is neither charging nor discharging. Verify that - * we didn't enter this state due to a safety fault. - */ - rv = sb_read_mfgacc(PARAM_SAFETY_STATUS, - SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data)); - if (rv || data[2] || data[3] || data[4] || data[5]) - return BATTERY_DISCONNECT_ERROR; - - /* - * Battery is present and also the status is initialized and - * no safety fault, battery is disconnected. - */ - if (battery_is_present() == BP_YES) - return BATTERY_DISCONNECTED; - } - not_disconnected = 1; - return BATTERY_NOT_DISCONNECTED; -} - -int charger_profile_override(struct charge_state_data *curr) -{ - const struct battery_info *batt_info; - /* battery temp in 0.1 deg C */ - int bat_temp_c = curr->batt.temperature - 2731; - - batt_info = battery_get_info(); - /* Don't charge if outside of allowable temperature range */ - if (bat_temp_c >= batt_info->charging_max_c * 10 || - bat_temp_c < batt_info->charging_min_c * 10) { - curr->requested_current = 0; - curr->requested_voltage = 0; - curr->batt.flags &= ~BATT_FLAG_WANT_CHARGE; - curr->state = ST_IDLE; - } - return 0; -} - -/* Customs options controllable by host command. */ -#define PARAM_FASTCHARGE (CS_PARAM_CUSTOM_PROFILE_MIN + 0) - -enum ec_status charger_profile_override_get_param(uint32_t param, - uint32_t *value) -{ - return EC_RES_INVALID_PARAM; -} - -enum ec_status charger_profile_override_set_param(uint32_t param, - uint32_t value) -{ - return EC_RES_INVALID_PARAM; -} diff --git a/board/fizz/board.c b/board/fizz/board.c index 157b452e62..6f03aa19ea 100644 --- a/board/fizz/board.c +++ b/board/fizz/board.c @@ -8,6 +8,7 @@ #include "adc.h" #include "adc_chip.h" #include "als.h" +#include "battery.h" #include "bd99992gw.h" #include "board_config.h" #include "button.h" @@ -90,10 +91,7 @@ const int hibernate_wake_pins_used = ARRAY_SIZE(hibernate_wake_pins); /* ADC channels */ const struct adc_t adc_channels[] = { - /* Base detection */ - [ADC_BASE_DET] = {"BASE_DET", NPCX_ADC_CH0, - ADC_MAX_VOLT, ADC_READ_MAX+1, 0}, - /* Vbus sensing (10x voltage divider). */ + /* Vbus sensing (1/10 voltage divider). */ [ADC_VBUS] = {"VBUS", NPCX_ADC_CH2, ADC_MAX_VOLT*10, ADC_READ_MAX+1, 0}, /* * Adapter current output or battery charging/discharging current (uV) @@ -195,8 +193,6 @@ uint16_t tcpc_get_alert_status(void) * src/mainboard/google/${board}/acpi/dptf.asl */ const struct temp_sensor_t temp_sensors[] = { - {"Battery", TEMP_SENSOR_TYPE_BATTERY, charge_get_battery_temp, - 0, 4}, {"TMP432_Internal", TEMP_SENSOR_TYPE_BOARD, tmp432_get_val, TMP432_IDX_LOCAL, 4}, {"TMP432_Sensor_1", TEMP_SENSOR_TYPE_BOARD, tmp432_get_val, @@ -215,7 +211,6 @@ struct ec_thermal_config thermal_params[] = { {{0, 0, 0}, C_TO_K(35), C_TO_K(68)}, /* TMP432_Internal */ {{0, 0, 0}, 0, 0}, /* TMP432_Sensor_1 */ {{0, 0, 0}, 0, 0}, /* TMP432_Sensor_2 */ - {{0, 0, 0}, 0, 0}, /* Battery */ }; BUILD_ASSERT(ARRAY_SIZE(thermal_params) == TEMP_SENSOR_COUNT); @@ -373,52 +368,42 @@ static void board_init(void) } DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT); -/** - * Set active charge port -- only one port can be active at a time. - * - * @param charge_port Charge port to enable. - * - * Returns EC_SUCCESS if charge port is accepted and made active, - * EC_ERROR_* otherwise. - */ int board_set_active_charge_port(int charge_port) { - /* charge port is a physical port */ - int is_real_port = (charge_port >= 0 && - charge_port < CONFIG_USB_PD_PORT_COUNT); - /* check if we are source VBUS on the port */ - int source = gpio_get_level(GPIO_USB_C0_5V_EN); - - if (is_real_port && source) { - CPRINTF("Skip enable p%d", charge_port); + const int active_port = charge_manager_get_active_charge_port(); + + if (charge_port < 0 || CHARGE_PORT_COUNT <= charge_port) return EC_ERROR_INVAL; - } - CPRINTF("New chg p%d", charge_port); + if (charge_port == active_port) + return EC_SUCCESS; - if (charge_port == CHARGE_PORT_NONE) - /* Disable port */ - gpio_set_level(GPIO_USB_C0_CHARGE_L, 1); - else - /* Enable charging port */ + /* Don't charge from a source port */ + if (board_vbus_source_enabled(charge_port)) + return EC_ERROR_INVAL; + + CPRINTS("New charger p%d", charge_port); + + switch (charge_port) { + case CHARGE_PORT_TYPEC0: gpio_set_level(GPIO_USB_C0_CHARGE_L, 0); + gpio_set_level(GPIO_AC_JACK_CHARGE_L, 1); + break; + case CHARGE_PORT_BARRELJACK : + gpio_set_level(GPIO_AC_JACK_CHARGE_L, 0); + gpio_set_level(GPIO_USB_C0_CHARGE_L, 1); + break; + default: + return EC_ERROR_INVAL; + } 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); + charger_set_input_current(charge_ma); } /** @@ -479,3 +464,9 @@ const struct button_config *recovery_buttons[] = { &buttons[BUTTON_RECOVERY], }; const int recovery_buttons_count = ARRAY_SIZE(recovery_buttons); + +enum battery_present battery_is_present(void) +{ + /* The GPIO is low when the battery is present */ + return BP_NO; +} diff --git a/board/fizz/board.h b/board/fizz/board.h index f723e89415..0848f35b89 100644 --- a/board/fizz/board.h +++ b/board/fizz/board.h @@ -55,27 +55,12 @@ #define CONFIG_ESPI_VW_SIGNALS #define CONFIG_LPC -/* Battery */ -#define CONFIG_BATTERY_CUT_OFF -#define CONFIG_BATTERY_DEVICE_CHEMISTRY "LION" -#define CONFIG_BATTERY_PRESENT_GPIO GPIO_BATTERY_PRESENT_L -#define CONFIG_BATTERY_REVIVE_DISCONNECT -#define CONFIG_BATTERY_SMART - /* Charger */ #define CONFIG_CHARGE_MANAGER #define CONFIG_CHARGE_RAMP_HW /* This, or just RAMP? */ -#define CONFIG_CHARGER -#define CONFIG_CHARGER_V2 #define CONFIG_CHARGER_ISL9238 -#define CONFIG_CHARGER_DISCHARGE_ON_AC #define CONFIG_CHARGER_INPUT_CURRENT 512 -#define CONFIG_CHARGER_LIMIT_POWER_THRESH_CHG_MW 15000 -#define CONFIG_CHARGER_LIMIT_POWER_THRESH_BAT_PCT 1 -#define CONFIG_CHARGER_MIN_BAT_PCT_FOR_POWER_ON 1 -#define CONFIG_CHARGER_NARROW_VDC -#define CONFIG_CHARGER_PROFILE_OVERRIDE #define CONFIG_CHARGER_SENSE_RESISTOR 10 #define CONFIG_CHARGER_SENSE_RESISTOR_AC 20 #define CONFIG_CMD_CHARGER_ADC_AMON_BMON @@ -119,6 +104,10 @@ #define CONFIG_USBC_VCONN #define CONFIG_USBC_VCONN_SWAP +/* Charge ports */ +#undef CONFIG_DEDICATED_CHARGE_PORT_COUNT +#define CONFIG_DEDICATED_CHARGE_PORT_COUNT 1 + /* USB-A config */ #define CONFIG_USB_PORT_POWER_DUMB #define USB_PORT_COUNT 5 @@ -144,6 +133,11 @@ #include "gpio_signal.h" #include "registers.h" +enum charge_port { + CHARGE_PORT_TYPEC0, + CHARGE_PORT_BARRELJACK, +}; + enum power_signal { X86_SLP_S0_DEASSERTED, X86_SLP_S3_DEASSERTED, @@ -155,7 +149,6 @@ enum power_signal { }; enum temp_sensor_id { - TEMP_SENSOR_BATTERY, /* BD99956GW TSENSE */ TEMP_SENSOR_CHARGER, /* BD99992GW SYSTHERM1 */ TEMP_SENSOR_DRAM, /* BD99992GW SYSTHERM2 */ TEMP_SENSOR_EMMC, /* BD99992GW SYSTHERM3 */ @@ -163,7 +156,6 @@ enum temp_sensor_id { }; enum adc_channel { - ADC_BASE_DET, ADC_VBUS, ADC_AMON_BMON, ADC_CH_COUNT @@ -195,6 +187,7 @@ enum button { int board_get_version(void); void board_reset_pd_mcu(void); void board_set_tcpc_power_mode(int port, int mode); +int board_get_battery_soc(void); #endif /* !__ASSEMBLER__ */ diff --git a/board/fizz/build.mk b/board/fizz/build.mk index 2ff420939e..74094ac834 100644 --- a/board/fizz/build.mk +++ b/board/fizz/build.mk @@ -10,6 +10,5 @@ CHIP:=npcx CHIP_VARIANT:=npcx5m6g board-y=board.o -board-$(CONFIG_BATTERY_SMART)+=battery.o board-$(CONFIG_USB_POWER_DELIVERY)+=usb_pd_policy.o board-y+=led.o diff --git a/board/fizz/ec.tasklist b/board/fizz/ec.tasklist index 582d5ddee8..06c39984a3 100644 --- a/board/fizz/ec.tasklist +++ b/board/fizz/ec.tasklist @@ -22,7 +22,6 @@ #define CONFIG_TASK_LIST \ TASK_ALWAYS(HOOKS, hook_task, NULL, LARGER_TASK_STACK_SIZE) \ - TASK_ALWAYS(CHARGER, charger_task, NULL, LARGER_TASK_STACK_SIZE) \ TASK_NOTEST(CHIPSET, chipset_task, NULL, LARGER_TASK_STACK_SIZE) \ TASK_NOTEST(PDCMD, pd_command_task, NULL, TASK_STACK_SIZE) \ TASK_ALWAYS(HOSTCMD, host_command_task, NULL, LARGER_TASK_STACK_SIZE) \ diff --git a/board/fizz/gpio.inc b/board/fizz/gpio.inc index 92ee2b1798..a73f3745e1 100644 --- a/board/fizz/gpio.inc +++ b/board/fizz/gpio.inc @@ -73,6 +73,7 @@ GPIO(I2C3_SDA, PIN(D, 0), GPIO_INPUT) /* EC_THEM_SDA */ /* 5V enables: INPUT=1.5A, OUT_LOW=OFF, OUT_HIGH=3A */ GPIO(USB_C0_5V_EN, PIN(4, 2), GPIO_OUT_LOW | GPIO_PULL_UP) /* C0 5V Enable */ GPIO(USB_C0_CHARGE_L, PIN(C, 0), GPIO_OUT_LOW) /* C0 Charge enable */ +GPIO(AC_JACK_CHARGE_L, PIN(C, 3), GPIO_OUT_LOW) /* AC jack charge enable */ GPIO(USB_C0_PD_RST_ODL, PIN(0, 3), GPIO_OUT_LOW) /* C0 PD Reset */ GPIO(USB_C0_DP_HPD, PIN(9, 4), GPIO_INPUT) /* C0 DP Hotplug Detect */ GPIO(USB_C0_TCPC_PWR, PIN(8, 4), GPIO_OUT_LOW) /* Enable C0 TCPC Power */ diff --git a/board/fizz/usb_pd_policy.c b/board/fizz/usb_pd_policy.c index 122c4d39ca..69ab2b379e 100644 --- a/board/fizz/usb_pd_policy.c +++ b/board/fizz/usb_pd_policy.c @@ -3,6 +3,7 @@ * found in the LICENSE file. */ +#include "adc.h" #include "atomic.h" #include "extpower.h" #include "charge_manager.h" @@ -55,18 +56,19 @@ void pd_transition_voltage(int idx) /* No-operation: we are always 5V */ } -static uint8_t vbus_en; - int board_vbus_source_enabled(int port) { - return vbus_en; + if (port != 0) + return 0; + return gpio_get_level(GPIO_USB_C0_5V_EN); } int pd_set_power_supply_ready(int port) { /* Disable charging */ gpio_set_level(GPIO_USB_C0_CHARGE_L, 1); - /* Provide VBUS */ + + /* Enable VBUS source */ gpio_set_level(GPIO_USB_C0_5V_EN, 1); /* notify host of power info change */ @@ -77,7 +79,7 @@ int pd_set_power_supply_ready(int port) void pd_power_supply_reset(int port) { - /* Disable VBUS */ + /* Disable VBUS source */ gpio_set_level(GPIO_USB_C0_5V_EN, 0); /* notify host of power info change */ @@ -243,6 +245,48 @@ int pd_custom_vdm(int port, int cnt, uint32_t *payload, return 0; } +static void board_charge_manager_init(void) +{ + int input_voltage; + int i, j; + struct charge_port_info cpi = { + .voltage = USB_CHARGER_VOLTAGE_MV, + .current = 0, + }; + + /* Initialize all charge suppliers to 0 */ + for (i = 0; i < CHARGE_PORT_COUNT; i++) { + for (j = 0; j < CHARGE_SUPPLIER_COUNT; j++) + charge_manager_update_charge(j, i, &cpi); + } + + input_voltage = adc_read_channel(ADC_VBUS); + + /* Initialize the power source supplier */ + if (input_voltage > 5500) { + /* Power source is barrel jack */ + CPRINTF("Source: BJ (%dmV)\n", input_voltage); + cpi.voltage = input_voltage; + cpi.current = 3330; /* TODO: Set right value */ + charge_manager_update_charge(CHARGE_SUPPLIER_PROPRIETARY, 1, + &cpi); + /* Source only. Disable PD negotiation as a sink */ + } else { + /* Power source is usb-c */ + CPRINTF("Source: C0 (%dmV)\n", input_voltage); + cpi.voltage = input_voltage; + cpi.current = 3000; /* TODO: Set right value */ + charge_manager_update_charge(CHARGE_SUPPLIER_TYPEC, 0, &cpi); + /* Sink only. Disable PD negotiation as a source */ + } +} +DECLARE_HOOK(HOOK_INIT, board_charge_manager_init, HOOK_PRIO_INIT_ADC + 1); + +int board_get_battery_soc(void) +{ + return 100; +} + #ifdef CONFIG_USB_PD_ALT_MODE_DFP static int dp_flags[CONFIG_USB_PD_PORT_COUNT]; static uint32_t dp_status[CONFIG_USB_PD_PORT_COUNT]; diff --git a/power/intel_x86.c b/power/intel_x86.c index c9e28f3d6f..f4b5251d00 100644 --- a/power/intel_x86.c +++ b/power/intel_x86.c @@ -180,7 +180,6 @@ enum power_state power_chipset_init(void) enum power_state common_intel_x86_power_handle_state(enum power_state state) { - int tries = 0; switch (state) { case POWER_G3: @@ -241,6 +240,9 @@ enum power_state common_intel_x86_power_handle_state(enum power_state state) #endif case POWER_G3S5: +#ifdef CONFIG_CHARGER + { + int tries = 0; /* * Allow charger to be initialized for upto defined tries, * in case we're trying to boot the AP with no battery. @@ -257,6 +259,8 @@ enum power_state common_intel_x86_power_handle_state(enum power_state state) chipset_force_shutdown(); return POWER_G3; } + } +#endif /* Call hooks to initialize PMIC */ hook_notify(HOOK_CHIPSET_PRE_INIT); |