diff options
author | Boris Mittelberg <bmbm@google.com> | 2022-04-14 11:38:33 -0700 |
---|---|---|
committer | Boris Mittelberg <bmbm@google.com> | 2022-04-14 11:38:33 -0700 |
commit | 10cf54860dc2f7ac36610799919f1a0cf1d501bb (patch) | |
tree | ac982e3f9c46d97c7ec713ac5e15ee284179fec7 /zephyr/subsys/ap_pwrseq/signal_vw.c | |
parent | 59ede6b1714c313de3e003c0497c70725bf625d5 (diff) | |
parent | 265691a2fe290e0fa54ecccba151a5c63dd73e47 (diff) | |
download | chrome-ec-firmware-brya-14505.71.B-main.tar.gz |
Merge remote-tracking branch cros/main into firmware-brya-14505.B-mainfirmware-brya-14505.71.B-main
Generated by: util/update_release_branch.py --baseboard brya
--relevant_paths_file baseboard/brya/relevant-paths.txt
firmware-brya-14505.B-main
Relevant changes:
git log --oneline 59ede6b17..265691a2f -- baseboard/brya board/agah
board/anahera board/banshee board/brya board/crota board/felwinter
board/gimble board/kano board/primus board/redrix board/taeko
board/taniks board/vell board/volmar driver/bc12/pi3usb9201_public.*
driver/charger/bq25710.* driver/ppc/nx20p348x.*
driver/ppc/syv682x_public.* driver/retimer/bb_retimer_public.*
driver/tcpm/nct38xx.* driver/tcpm/ps8xxx_public.* driver/tcpm/tcpci.*
include/power/alderlake* include/intel_x86.h power/alderlake*
power/intel_x86.c util/getversion.sh
98493ee98 crota: remove type-c port 2 to avoid confusion
88a19dd1b anahera: Tune USBA retimer EQ revision 2
37d45dd56 kano: Support 28w cpu fan table
BRANCH=None
BUG=b:228775653 b:203837657 b:219176652
TEST=`make -j buildall`
Signed-off-by: Boris Mittelberg <bmbm@google.com>
Change-Id: Ia775339f54ad90ecdbc81ce1543b1b38f94f3b3b
Diffstat (limited to 'zephyr/subsys/ap_pwrseq/signal_vw.c')
-rw-r--r-- | zephyr/subsys/ap_pwrseq/signal_vw.c | 73 |
1 files changed, 38 insertions, 35 deletions
diff --git a/zephyr/subsys/ap_pwrseq/signal_vw.c b/zephyr/subsys/ap_pwrseq/signal_vw.c index b0abe4fe13..a42be8ae85 100644 --- a/zephyr/subsys/ap_pwrseq/signal_vw.c +++ b/zephyr/subsys/ap_pwrseq/signal_vw.c @@ -3,6 +3,7 @@ * found in the LICENSE file. */ +#include <atomic.h> #include <drivers/espi.h> #include <x86_non_dsx_common_pwrseq_sm_handler.h> @@ -34,18 +35,20 @@ const static struct vw_config vw_config[] = { DT_FOREACH_STATUS_OKAY(MY_COMPAT, INIT_ESPI_SIGNAL) }; -static bool signal_data[ARRAY_SIZE(vw_config)]; +/* + * Current signal value. + */ +static atomic_t signal_data; +/* + * Mask of valid signals. If the bus is reset, this is cleared, + * and when a signal is updated the associated bit is set to indicate + * the signal is valid. + */ +static atomic_t signal_valid; #define espi_dev DEVICE_DT_GET(DT_CHOSEN(intel_ap_pwrseq_espi)) -/* - * Mask of updated signals. If the bus is reset, this is cleared, - * and it is only when all the signals have been updated that - * notification is sent that the signals are ready. - */ -static uint8_t espi_mask; -static bool espi_not_valid; -BUILD_ASSERT(ARRAY_SIZE(vw_config) <= 8); +BUILD_ASSERT(ARRAY_SIZE(vw_config) <= (sizeof(atomic_t) * 8)); static void espi_handler(const struct device *dev, struct espi_callback *cb, @@ -61,53 +64,35 @@ static void espi_handler(const struct device *dev, case ESPI_BUS_RESET: /* - * Notify that the bus isn't ready, and clear - * the signal mask. + * Clear the signal valid mask. */ - notify_espi_ready(false); - espi_mask = 0; - espi_not_valid = true; + atomic_clear(&signal_valid); break; case ESPI_BUS_EVENT_VWIRE_RECEIVED: for (int i = 0; i < ARRAY_SIZE(vw_config); i++) { if (event.evt_details == vw_config[i].espi_signal) { - int value = vw_config[i].invert + bool value = vw_config[i].invert ? !event.evt_data : !!event.evt_data; - signal_data[i] = value; - if (espi_not_valid) { - espi_mask |= BIT(i); - } + atomic_set_bit_to(&signal_data, i, value); + atomic_set_bit(&signal_valid, i); power_signal_interrupt(vw_config[i].signal, value); } } - /* - * When all the signals have been updated, notify that - * the ESPI signals are valid. - */ - if (espi_not_valid && - espi_mask == BIT_MASK(ARRAY_SIZE(vw_config))) { - espi_not_valid = false; - LOG_DBG("ESPI signals valid"); - /* - * TODO(b/222946923): Convert to generalised - * callback pattern. - */ - notify_espi_ready(true); - } break; } } int power_signal_vw_get(enum pwr_sig_vw vw) { - if (vw < 0 || vw >= ARRAY_SIZE(vw_config)) { + if (vw < 0 || vw >= ARRAY_SIZE(vw_config) || + !atomic_test_bit(&signal_valid, vw)) { return -EINVAL; } - return signal_data[vw]; + return atomic_test_bit(&signal_data, vw); } void power_signal_vw_init(void) @@ -138,6 +123,24 @@ void power_signal_vw_init(void) ESPI_BUS_RESET | ESPI_BUS_EVENT_VWIRE_RECEIVED); espi_add_callback(espi_dev, &espi_cb); + /* + * Check whether the bus is ready, and if so, + * initialise the current values of the signals. + */ + if (espi_get_channel_status(espi_dev, ESPI_CHANNEL_VWIRE)) { + for (int i = 0; i < ARRAY_SIZE(vw_config); i++) { + uint8_t vw_value; + + if (espi_receive_vwire(espi_dev, + vw_config[i].espi_signal, + &vw_value) == 0) { + atomic_set_bit_to(&signal_data, i, + vw_config[i].invert + ? !vw_value + : !!vw_value); + } + } + } } #endif /* HAS_VW_SIGNALS */ |