From a8c4f7004ea1c9b8268a87dd0b700c250ec4747d Mon Sep 17 00:00:00 2001 From: Nicholas Chin Date: Fri, 3 May 2024 11:03:32 -0600 Subject: [PATCH] ec/dell/mec5035: Add S3 suspend SMI handler Change-Id: I655868aba46911d128f6c24f410dc6fdf83f3070 Signed-off-by: Nicholas Chin --- src/ec/dell/mec5035/Makefile.mk | 1 + src/ec/dell/mec5035/mec5035.c | 14 ++++++++++++++ src/ec/dell/mec5035/mec5035.h | 19 +++++++++++++++++++ src/ec/dell/mec5035/smihandler.c | 17 +++++++++++++++++ 4 files changed, 51 insertions(+) create mode 100644 src/ec/dell/mec5035/smihandler.c diff --git a/src/ec/dell/mec5035/Makefile.mk b/src/ec/dell/mec5035/Makefile.mk index 4ebdd811f9..be557e4599 100644 --- a/src/ec/dell/mec5035/Makefile.mk +++ b/src/ec/dell/mec5035/Makefile.mk @@ -5,5 +5,6 @@ ifeq ($(CONFIG_EC_DELL_MEC5035),y) bootblock-y += mec5035.c romstage-y += mec5035.c ramstage-y += mec5035.c +smm-y += mec5035.c smihandler.c endif diff --git a/src/ec/dell/mec5035/mec5035.c b/src/ec/dell/mec5035/mec5035.c index 68b6b2f7fb..33bf046634 100644 --- a/src/ec/dell/mec5035/mec5035.c +++ b/src/ec/dell/mec5035/mec5035.c @@ -94,6 +94,20 @@ void mec5035_control_radio(enum ec_radio_dev dev, enum ec_radio_state state) ec_command(CMD_RADIO_CTRL); } +void mec5035_sleep_enable(void) +{ + u8 buf[SLEEP_EN_NUM_ARGS] = {3, 0}; + write_mailbox_regs(buf, 2, SLEEP_EN_NUM_ARGS); + ec_command(CMD_SLEEP_ENABLE); +} + +void mec5035_change_wake(u8 source, enum ec_wake_change change) +{ + u8 buf[ACPI_WAKEUP_NUM_ARGS] = {change, source, 0, 0x40}; + write_mailbox_regs(buf, 2, ACPI_WAKEUP_NUM_ARGS); + ec_command(CMD_ACPI_WAKEUP_CHANGE); +} + void mec5035_early_init(void) { /* If this isn't sent the EC shuts down the system after about 15 diff --git a/src/ec/dell/mec5035/mec5035.h b/src/ec/dell/mec5035/mec5035.h index fa15a9d621..069616fbc5 100644 --- a/src/ec/dell/mec5035/mec5035.h +++ b/src/ec/dell/mec5035/mec5035.h @@ -4,6 +4,7 @@ #define _EC_DELL_MEC5035_H_ #include +#include #define NUM_REGISTERS 32 @@ -29,9 +30,27 @@ enum ec_radio_state { RADIO_ON }; +#define CMD_ACPI_WAKEUP_CHANGE 0x4a +#define ACPI_WAKEUP_NUM_ARGS 4 +enum ec_wake_change { + WAKE_OFF = 0, + WAKE_ON +}; +enum ec_acpi_wake_events { + EC_ACPI_WAKE_PWRB = BIT(0), /* Wake up by power button */ + EC_ACPI_WAKE_LID = BIT(1), /* Wake up by lid switch */ + EC_ACPI_WAKE_RTC = BIT(5), /* Wake up by RTC */ +}; + +#define CMD_SLEEP_ENABLE 0x64 +#define SLEEP_EN_NUM_ARGS 2 + u8 mec5035_mouse_touchpad(u8 setting); void mec5035_cpu_ok(void); void mec5035_early_init(void); void mec5035_control_radio(enum ec_radio_dev device, enum ec_radio_state state); +void mec5035_sleep(int slp_type); +void mec5035_change_wake(u8 source, enum ec_wake_change change); +void mec5035_sleep_enable(void); #endif /* _EC_DELL_MEC5035_H_ */ diff --git a/src/ec/dell/mec5035/smihandler.c b/src/ec/dell/mec5035/smihandler.c new file mode 100644 index 0000000000..1db834773d --- /dev/null +++ b/src/ec/dell/mec5035/smihandler.c @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include +#include "mec5035.h" + +void mec5035_sleep(int slp_type) +{ + switch (slp_type) { + case ACPI_S3: + /* System does not yet resume properly if woken by lid */ + mec5035_change_wake(EC_ACPI_WAKE_LID, WAKE_OFF); + mec5035_sleep_enable(); + break; + } +} -- 2.44.0