1 /* SPDX-License-Identifier: GPL-2.0-only */
4 #include <device/mmio.h>
5 #include <cpu/x86/smm.h>
7 #include <ec/google/chromeec/smm.h>
11 #include <variant/onboard.h>
13 /* The wake gpio is SUS_GPIO[0]. */
14 #define WAKE_GPIO_EN SUS_GPIO_EN0
15 #define GPIO_SUS7_WAKE_MASK (1 << 12)
16 #define GPIO_SUS1_WAKE_MASK (1 << 13)
19 * The entire 32-bit ALT_GPIO_SMI register is passed as a parameter. Note, that
20 * this includes the enable bits in the lower 16 bits.
22 void mainboard_smi_gpi(uint32_t alt_gpio_smi
)
24 if (alt_gpio_smi
& (1 << EC_SMI_GPI
))
25 chromeec_smi_process_events();
28 void mainboard_smi_sleep(uint8_t slp_typ
)
33 /* Disable USB charging if required */
34 chromeec_set_usb_charge_mode(slp_typ
);
38 /* Enable wake pin in GPE block. */
39 enable_gpe(WAKE_GPIO_EN
);
42 /* Disabling wake from SUS_GPIO1 (TOUCH INT) and
43 * SUS_GPIO7 (TRACKPAD INT) in North bank as they are not
44 * valid S5 wake sources
46 addr
= (void *)(IO_BASE_ADDRESS
+ COMMUNITY_OFFSET_GPNORTH
+
48 mask
= ~(GPIO_SUS1_WAKE_MASK
| GPIO_SUS7_WAKE_MASK
);
49 write32(addr
, read32(addr
) & mask
);
53 chromeec_smi_sleep(slp_typ
, MAINBOARD_EC_S3_WAKE_EVENTS
, MAINBOARD_EC_S5_WAKE_EVENTS
);
55 /* Set LPC lines to low power in S3/S5. */
56 if ((slp_typ
== ACPI_S3
) || (slp_typ
== ACPI_S5
)) {
61 int mainboard_smi_apmc(uint8_t apmc
)
63 chromeec_smi_apmc(apmc
, MAINBOARD_EC_SCI_EVENTS
, MAINBOARD_EC_SMI_EVENTS
);