diff options
author | Julius Werner <jwerner@chromium.org> | 2016-05-16 15:39:12 -0700 |
---|---|---|
committer | Julius Werner <jwerner@chromium.org> | 2016-10-17 22:43:37 +0200 |
commit | 4fda9bd0ec15d5d2cbc647811b46c0a23fdb865e (patch) | |
tree | e64c3703fe4248662976a3befd6fa62c409a9b84 /payloads/libpayload/drivers/timer/cygnus.c | |
parent | 9ac7a66f0e044a384069b02779201ed46c3c58bd (diff) |
libpayload: Replace majority of timer drivers with a generic one
Currently every non-x86 platform supported by libpayload needs to
provide its own timer driver. Most of the ones we have accumulated there
look almost identical: For the frequency, return a preset constant. For
the value, read a 32-bit register, possibly read another 32-bit register
and shift+OR it with the previous one, then return that.
Let's replace this with a single .c file that can easily handle all of
those cases. Menuconfig convenience can still be maintained by providing
several presets that select different defaults for the driver's
configuration options (register address(es) and frequency).
Removes an "enabled" check from Samsung MCT driver since coreboot always
unconditionally enables that timer anyway.
CQ-DEPEND=CL:344809
BRANCH=None
BUG=None
TEST=Booted Oak and Veyron, observed how dev-mode delay was still ~30s
Change-Id: I61cb7d2ffd4902aa841c57f9afa9cd991f770acd
Signed-off-by: Julius Werner <jwerner@chromium.org>
Original-Commit-Id: a036af6
Original-Change-Id: I9784e7c6aa5abd6d92478ea7ec1cf42c9a437546
Original-Signed-off-by: Julius Werner <jwerner@chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/347749
Reviewed-on: https://review.coreboot.org/17023
Tested-by: build bot (Jenkins)
Reviewed-by: Nico Huber <nico.h@gmx.de>
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Diffstat (limited to 'payloads/libpayload/drivers/timer/cygnus.c')
-rw-r--r-- | payloads/libpayload/drivers/timer/cygnus.c | 52 |
1 files changed, 0 insertions, 52 deletions
diff --git a/payloads/libpayload/drivers/timer/cygnus.c b/payloads/libpayload/drivers/timer/cygnus.c deleted file mode 100644 index c8f2098608..0000000000 --- a/payloads/libpayload/drivers/timer/cygnus.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This file is part of the coreboot project. - * - * Copyright (C) 2015 Google Electronics - * - * 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 <libpayload.h> - -struct cygnus_timer { - u32 gtim_glob_low; - u32 gtim_glob_hi; - u32 gtim_glob_ctrl; -}; - -static struct cygnus_timer * const timer_ptr = - (void *)CONFIG_LP_IPROC_PERIPH_GLB_TIM_REG_BASE; - -uint64_t timer_hz(void) -{ - /* - * this is set up by coreboot as follows: - * - * PERIPH_CLOCK / - * (((TIMER_GLB_TIM_CTRL_PRESC & TIMER_GLB_TIM_CTRL_PRESC_MASK)>>8) + 1) - * - * where PERIPH_CLOCK is typically 500000000. - */ - return 500000000; -} - -uint64_t timer_raw_value(void) -{ - uint64_t cur_tick; - uint32_t count_h; - uint32_t count_l; - - do { - count_h = readl(&timer_ptr->gtim_glob_hi); - count_l = readl(&timer_ptr->gtim_glob_low); - cur_tick = readl(&timer_ptr->gtim_glob_hi); - } while (cur_tick != count_h); - - return (cur_tick << 32) + count_l; -} |