diff options
author | Wealian Liao <whliao@nuvoton.corp-partner.google.com> | 2021-03-17 16:59:56 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-03-24 07:04:00 +0000 |
commit | b630842411a829fd478218d38a9948559601350b (patch) | |
tree | 865c1805cbe1c2f35b540ded1a1605c3152f3aa2 /zephyr | |
parent | c9e4a0d9a3b12e52ff5a412d9339616deaebd533 (diff) | |
download | chrome-ec-b630842411a829fd478218d38a9948559601350b.tar.gz |
zephyr: shim: connect RTC with cros_rtc driver
This connect shim/rtc with cros_rtc driver.
BUG=b:178230662
BRANCH=None.
TEST=check rtc value by 'ectool rtcset 10' & 'ectool rtcget'
check rtc alarm by 'ectool rtcsetalarm 10' & 'ectool rtcgetalarm'
Signed-off-by: Wealian Liao <whliao@nuvoton.corp-partner.google.com>
Change-Id: I4171074ff58ab32e5386dedea3695adbc40f58f6
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2767058
Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'zephyr')
-rw-r--r-- | zephyr/shim/src/rtc.c | 118 |
1 files changed, 93 insertions, 25 deletions
diff --git a/zephyr/shim/src/rtc.c b/zephyr/shim/src/rtc.c index 9c9d8c30ae..0f07af2f86 100644 --- a/zephyr/shim/src/rtc.c +++ b/zephyr/shim/src/rtc.c @@ -3,26 +3,101 @@ * found in the LICENSE file. */ +#include <logging/log.h> #include <kernel.h> #include <zephyr.h> #include "console.h" +#include "drivers/cros_rtc.h" +#include "hooks.h" #include "host_command.h" #include "util.h" -/* - * Microseconds will be ignored. The WTC register only - * stores wakeup time in seconds. - * Set seconds = 0 to disable the alarm - */ -void system_set_rtc_alarm(uint32_t seconds, uint32_t microseconds) +LOG_MODULE_REGISTER(shim_cros_rtc, LOG_LEVEL_ERR); + +#define CROS_RTC_DEV DT_LABEL(DT_CHOSEN(cros_rtc)) +static const struct device *cros_rtc_dev; + +#ifdef CONFIG_HOSTCMD_EVENTS +static void set_rtc_host_event(void) { - /* TODO(b/178230662): Implement this */ + host_set_single_event(EC_HOST_EVENT_RTC); +} +DECLARE_DEFERRED(set_rtc_host_event); +#endif + +void rtc_callback(const struct device *dev) +{ + ARG_UNUSED(dev); + + if (IS_ENABLED(CONFIG_HOSTCMD_EVENTS)) { + hook_call_deferred(&set_rtc_host_event_data, 0); + } +} + +/** Initialize the rtc. */ +static int system_init_rtc(const struct device *unused) +{ + ARG_UNUSED(unused); + + cros_rtc_dev = device_get_binding(CROS_RTC_DEV); + if (!cros_rtc_dev) { + LOG_ERR("Fail to find %s", CROS_RTC_DEV); + return -ENODEV; + } + + /* set the RTC callback */ + cros_rtc_configure(cros_rtc_dev, rtc_callback); + + return 0; +} +SYS_INIT(system_init_rtc, APPLICATION, 1); + +uint32_t system_get_rtc_sec(void) +{ + uint32_t seconds; + + cros_rtc_get_value(cros_rtc_dev, &seconds); + + return seconds; +} + +void system_set_rtc(uint32_t seconds) +{ + cros_rtc_set_value(cros_rtc_dev, seconds); } void system_reset_rtc_alarm(void) { - /* TODO(b/178230662): Implement this */ + if (!cros_rtc_dev) { + /* TODO(b/183115086): check the error handler for NULL device */ + LOG_ERR("rtc_dev hasn't initialized."); + return; + } + + cros_rtc_reset_alarm(cros_rtc_dev); +} + +/* + * For NPCX series, The alarm counter only stores wakeup time in seconds. + * Microseconds will be ignored. + */ +void system_set_rtc_alarm(uint32_t seconds, uint32_t microseconds) +{ + if (!cros_rtc_dev) { + LOG_ERR("rtc_dev hasn't initialized."); + return; + } + + /* If time = 0, clear the current alarm */ + if (seconds == EC_RTC_ALARM_CLEAR && microseconds == 0) { + system_reset_rtc_alarm(); + return; + } + + seconds += system_get_rtc_sec(); + + cros_rtc_set_alarm(cros_rtc_dev, seconds, microseconds); } /* @@ -31,26 +106,20 @@ void system_reset_rtc_alarm(void) */ uint32_t system_get_rtc_alarm(void) { + uint32_t seconds, microseconds; + + cros_rtc_get_alarm(cros_rtc_dev, &seconds, µseconds); + /* * Return 0: * 1. If alarm is not set to go off, OR * 2. If alarm is set and has already gone off */ + if (seconds == 0) { + return 0; + } - /* TODO(b/178230662): Implement this */ - return 0; -} - -/* MTC functions */ -uint32_t system_get_rtc_sec(void) -{ - /* TODO(b/178230662): Implement this */ - return 0; -} - -void system_set_rtc(uint32_t seconds) -{ - /* TODO(b/178230662): Implement this */ + return seconds - system_get_rtc_sec(); } /* Console commands */ @@ -96,9 +165,6 @@ static int command_rtc_alarm_test(int argc, char **argv) int s = 1, us = 0; char *e; - ccprintf("Setting RTC alarm\n"); - /* TODO(b/178230662): Implement enabling RTC interrupt */ - if (argc > 1) { s = strtoi(argv[1], &e, 10); if (*e) @@ -110,6 +176,8 @@ static int command_rtc_alarm_test(int argc, char **argv) return EC_ERROR_PARAM2; } + ccprintf("Setting RTC alarm\n"); + system_set_rtc_alarm(s, us); return EC_SUCCESS; |