diff options
Diffstat (limited to 'src/ec/google/chromeec')
-rw-r--r-- | src/ec/google/chromeec/Kconfig | 7 | ||||
-rw-r--r-- | src/ec/google/chromeec/Makefile.inc | 4 | ||||
-rw-r--r-- | src/ec/google/chromeec/switches.c | 59 |
3 files changed, 70 insertions, 0 deletions
diff --git a/src/ec/google/chromeec/Kconfig b/src/ec/google/chromeec/Kconfig index f8090030ef..76eef05dbe 100644 --- a/src/ec/google/chromeec/Kconfig +++ b/src/ec/google/chromeec/Kconfig @@ -158,3 +158,10 @@ config EC_GOOGLE_CHROMEEC_PD_FIRMWARE_FILE depends on EC_GOOGLE_CHROMEEC_PD_FIRMWARE_EXTERNAL help The path and filename of the PD firmware file to use. + +config EC_GOOGLE_CHROMEEC_SWITCHES + depends on EC_GOOGLE_CHROMEEC && CHROMEOS + bool + help + Enable support for Chrome OS mode switches provided by the Chrome OS + EC. diff --git a/src/ec/google/chromeec/Makefile.inc b/src/ec/google/chromeec/Makefile.inc index b38d5b72ff..2fe6994884 100644 --- a/src/ec/google/chromeec/Makefile.inc +++ b/src/ec/google/chromeec/Makefile.inc @@ -29,6 +29,10 @@ smm-$(CONFIG_VBOOT) += vboot_storage.c romstage-$(CONFIG_VBOOT) += vboot_storage.c verstage-$(CONFIG_VBOOT) += vboot_storage.c +verstage-$(CONFIG_EC_GOOGLE_CHROMEEC_SWITCHES) += switches.c +romstage-$(CONFIG_EC_GOOGLE_CHROMEEC_SWITCHES) += switches.c +ramstage-$(CONFIG_EC_GOOGLE_CHROMEEC_SWITCHES) += switches.c + CHROMEEC_SOURCE ?= $(top)/3rdparty/chromeec # These are Chrome EC firmware images that a payload (such as depthcharge) can diff --git a/src/ec/google/chromeec/switches.c b/src/ec/google/chromeec/switches.c new file mode 100644 index 0000000000..74f72105d0 --- /dev/null +++ b/src/ec/google/chromeec/switches.c @@ -0,0 +1,59 @@ +/* + * This file is part of the coreboot project. + * + * Copyright 2016 Google Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <bootmode.h> +#include <ec/google/chromeec/ec.h> + +#if IS_ENABLED(CONFIG_EC_GOOGLE_CHROMEEC_LPC) +int get_lid_switch(void) +{ + if (!IS_ENABLED(CONFIG_LID_SWITCH)) + return -1; + + return !!(google_chromeec_get_switches() & EC_SWITCH_LID_OPEN); +} +#endif + +int get_recovery_mode_switch(void) +{ + /* Check for dedicated recovery switch first. */ + if (IS_ENABLED(CONFIG_EC_GOOGLE_CHROMEEC_LPC) && + (google_chromeec_get_switches() & EC_SWITCH_DEDICATED_RECOVERY)) + return 1; + + /* Check if the EC has posted the keyboard recovery/fastboot event. */ + return !!(google_chromeec_get_events_b() & + (EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEYBOARD_RECOVERY) | + EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEYBOARD_FASTBOOT))); +} + +int get_recovery_mode_retrain_switch(void) +{ + /* + * Check if the EC has posted the keyboard recovery event with memory + * retrain. + */ + return !!(google_chromeec_get_events_b() & + EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEYBOARD_RECOVERY_HW_REINIT)); +} + +int clear_recovery_mode_switch(void) +{ + /* Clear all host event bits requesting recovery mode. */ + return google_chromeec_clear_events_b( + EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEYBOARD_RECOVERY) | + EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEYBOARD_RECOVERY_HW_REINIT) | + EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEYBOARD_FASTBOOT)); +} |