| /* SPDX-License-Identifier: GPL-2.0-only */ |
| |
| #include <bootmode.h> |
| #include <types.h> |
| #include <console/console.h> |
| #include <ec/quanta/it8518/ec.h> |
| #include <device/device.h> |
| #include <southbridge/intel/bd82x6x/pch.h> |
| #include <southbridge/intel/common/pmbase.h> |
| #include "ec.h" |
| |
| void stout_ec_init(void) |
| { |
| printk(BIOS_DEBUG,"%s: EC FW version %x%x\n", __func__, |
| ec_read(EC_FW_VER), ec_read(EC_FW_VER + 1)); |
| |
| /* |
| * Important: get_recovery_mode_switch() must be called in EC init. |
| */ |
| get_recovery_mode_switch(); |
| |
| /* Unmute */ |
| ec_kbc_write_cmd(EC_KBD_CMD_UNMUTE); |
| |
| /* |
| * Set USB Power off in S3 (enabled in S3 path if requested in gnvs) |
| * Bit0 of 0x0D/Bit0 of 0x26 |
| * 0/0 All USB port off |
| * 1/0 USB on, all USB port didn't support wake up |
| * 0/1 USB on, yellow port support wake up charge, but may not support |
| * charge smart phone. |
| * 1/1 USB on, yellow port in AUTO mode and didn't support wake up system. |
| */ |
| ec_write(EC_PERIPH_CNTL_3, ec_read(EC_PERIPH_CNTL_3) & 0xE); |
| ec_write(EC_USB_S3_EN, ec_read(EC_USB_S3_EN) & 0xE); |
| |
| // TODO: Power Limit Setting |
| } |
| |
| void stout_ec_finalize_smm(void) |
| { |
| u8 ec_reg, critical_shutdown = 0; |
| |
| /* |
| * Check EC for error conditions. |
| */ |
| |
| /* Fan Error : Peripheral Status 3 (0x35) bit 4 */ |
| ec_reg = ec_read(EC_PERIPH_STAT_3); |
| |
| if (ec_reg & 0x8) { |
| printk(BIOS_ERR, " EC Fan Error\n"); |
| critical_shutdown = 1; |
| } |
| |
| /* Thermal Device Error : Peripheral Status 3 (0x35) bit 8 */ |
| if (ec_reg & 0x80) { |
| printk(BIOS_ERR, " EC Thermal Device Error\n"); |
| critical_shutdown = 1; |
| } |
| |
| /* Critical Battery Error */ |
| ec_reg = ec_read(EC_MBAT_STATUS); |
| |
| if ((ec_reg & 0xCF) == 0xC0) { |
| printk(BIOS_ERR, " EC Critical Battery Error\n"); |
| critical_shutdown = 1; |
| } |
| |
| if ((ec_reg & 0x8F) == 0x8F) { |
| printk(BIOS_ERR, " EC Read Battery Error\n"); |
| } |
| |
| if (critical_shutdown) { |
| printk(BIOS_ERR, "EC critical_shutdown"); |
| |
| /* Go to S5 */ |
| write_pmbase32(PM1_CNT, read_pmbase32(PM1_CNT) | (0xf << 10)); |
| } |
| } |