/* SPDX-License-Identifier: GPL-2.0-only */ #include #include #include #include #include #include #include #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)); } }