
Hi Thomas,
On 22 October 2015 at 07:25, Thomas Chou thomas@wytron.com.tw wrote:
Add a sandbox timer which get time from host os and a basic test.
Signed-off-by: Thomas Chou thomas@wytron.com.tw
arch/sandbox/dts/sandbox.dts | 4 ++ board/sandbox/sandbox.c | 2 + common/board_f.c | 2 +- configs/sandbox_defconfig | 2 + doc/device-tree-bindings/timer/sandbox_timer.txt | 7 ++++ drivers/timer/Kconfig | 7 ++++ drivers/timer/Makefile | 1 + drivers/timer/sandbox_timer.c | 53 ++++++++++++++++++++++++ include/configs/sandbox.h | 2 + test/dm/Makefile | 1 + test/dm/timer.c | 27 ++++++++++++
Can you please split out the board_f.c change into a separate commit?
Otherwise:
Reviewed-by: Simon Glass sjg@chromium.org
11 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 doc/device-tree-bindings/timer/sandbox_timer.txt create mode 100644 drivers/timer/sandbox_timer.c create mode 100644 test/dm/timer.c
diff --git a/arch/sandbox/dts/sandbox.dts b/arch/sandbox/dts/sandbox.dts index 08f72ac..720ef93 100644 --- a/arch/sandbox/dts/sandbox.dts +++ b/arch/sandbox/dts/sandbox.dts @@ -177,6 +177,10 @@ sides = <4>; };
timer {
compatible = "sandbox,timer";
};
tpm { compatible = "google,sandbox-tpm"; };
diff --git a/board/sandbox/sandbox.c b/board/sandbox/sandbox.c index 80eaa63..592f772 100644 --- a/board/sandbox/sandbox.c +++ b/board/sandbox/sandbox.c @@ -26,6 +26,7 @@ void flush_cache(unsigned long start, unsigned long size) { }
+#ifndef CONFIG_TIMER /* system timer offset in ms */ static unsigned long sandbox_timer_offset;
@@ -38,6 +39,7 @@ unsigned long timer_read_counter(void) { return os_get_nsec() / 1000 + sandbox_timer_offset * 1000; } +#endif
int dram_init(void) { diff --git a/common/board_f.c b/common/board_f.c index 613332e..0899144 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -778,9 +778,9 @@ static init_fnc_t init_sequence_f[] = { x86_fsp_init, #endif arch_cpu_init, /* basic arch cpu dependent setup */
mark_bootstage, initf_dm, arch_cpu_init_dm,
mark_bootstage, /* need timer, go after init dm */
#if defined(CONFIG_BOARD_EARLY_INIT_F) board_early_init_f, #endif diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig index b2675c7..0b3785b 100644 --- a/configs/sandbox_defconfig +++ b/configs/sandbox_defconfig @@ -47,6 +47,8 @@ CONFIG_SANDBOX_SERIAL=y CONFIG_SOUND=y CONFIG_SOUND_SANDBOX=y CONFIG_SANDBOX_SPI=y +CONFIG_TIMER=y +CONFIG_SANDBOX_TIMER=y CONFIG_DM_TPM=y CONFIG_TPM_TIS_SANDBOX=y CONFIG_USB=y diff --git a/doc/device-tree-bindings/timer/sandbox_timer.txt b/doc/device-tree-bindings/timer/sandbox_timer.txt new file mode 100644 index 0000000..3e113f8 --- /dev/null +++ b/doc/device-tree-bindings/timer/sandbox_timer.txt @@ -0,0 +1,7 @@ +Sandbox timer
+The sandbox timer device is an emulated device which gets time from +host os.
+Required properties:
- compatible: "sandbox,timer"
diff --git a/drivers/timer/Kconfig b/drivers/timer/Kconfig index 97c4128..601e493 100644 --- a/drivers/timer/Kconfig +++ b/drivers/timer/Kconfig @@ -16,4 +16,11 @@ config ALTERA_TIMER Select this to enable an timer for Altera devices. Please find details on the "Embedded Peripherals IP User Guide" of Altera.
+config SANDBOX_TIMER
bool "Sandbox Timer support"
depends on SANDBOX && TIMER
help
Select this to enable an emulated timer for sandbox. It gets
time from host os.
endmenu diff --git a/drivers/timer/Makefile b/drivers/timer/Makefile index ae66c07..300946e 100644 --- a/drivers/timer/Makefile +++ b/drivers/timer/Makefile @@ -6,3 +6,4 @@
obj-$(CONFIG_TIMER) += timer-uclass.o obj-$(CONFIG_ALTERA_TIMER) += altera_timer.o +obj-$(CONFIG_SANDBOX_TIMER) += sandbox_timer.o diff --git a/drivers/timer/sandbox_timer.c b/drivers/timer/sandbox_timer.c new file mode 100644 index 0000000..8193170 --- /dev/null +++ b/drivers/timer/sandbox_timer.c @@ -0,0 +1,53 @@ +/*
- Copyright (C) 2015 Thomas Chou thomas@wytron.com.tw
- SPDX-License-Identifier: GPL-2.0+
- */
+#include <common.h> +#include <dm.h> +#include <errno.h> +#include <timer.h> +#include <os.h>
+/* system timer offset in ms */ +static unsigned long sandbox_timer_offset;
+void sandbox_timer_add_offset(unsigned long offset) +{
sandbox_timer_offset += offset;
+}
+static int sandbox_timer_get_count(struct udevice *dev, unsigned long *count) +{
*count = os_get_nsec() / 1000 + sandbox_timer_offset * 1000;
return 0;
+}
+static int sandbox_timer_probe(struct udevice *dev) +{
struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev);
uc_priv->clock_rate = 1000000;
return 0;
+}
+static const struct timer_ops sandbox_timer_ops = {
.get_count = sandbox_timer_get_count,
+};
+static const struct udevice_id sandbox_timer_ids[] = {
{ .compatible = "sandbox,timer", },
You can drop the penultimate comma.
{ }
+};
+U_BOOT_DRIVER(sandbox_timer) = {
.name = "sandbox_timer",
.id = UCLASS_TIMER,
.of_match = sandbox_timer_ids,
.probe = sandbox_timer_probe,
.ops = &sandbox_timer_ops,
.flags = DM_FLAG_PRE_RELOC,
+}; diff --git a/include/configs/sandbox.h b/include/configs/sandbox.h index 32e3a9b..db7c8bd 100644 --- a/include/configs/sandbox.h +++ b/include/configs/sandbox.h @@ -19,7 +19,9 @@ #define CONFIG_IO_TRACE #define CONFIG_CMD_IOTRACE
+#ifndef CONFIG_TIMER #define CONFIG_SYS_TIMER_RATE 1000000 +#endif
#define CONFIG_SYS_STDIO_DEREGISTER
diff --git a/test/dm/Makefile b/test/dm/Makefile index eda9643..d5e93f0 100644 --- a/test/dm/Makefile +++ b/test/dm/Makefile @@ -32,4 +32,5 @@ obj-y += syscon.o obj-$(CONFIG_DM_USB) += usb.o obj-$(CONFIG_DM_PMIC) += pmic.o obj-$(CONFIG_DM_REGULATOR) += regulator.o +obj-$(CONFIG_TIMER) += timer.o endif diff --git a/test/dm/timer.c b/test/dm/timer.c new file mode 100644 index 0000000..bf964c4 --- /dev/null +++ b/test/dm/timer.c @@ -0,0 +1,27 @@ +/*
- Copyright (C) 2015 Thomas Chou thomas@wytron.com.tw
- SPDX-License-Identifier: GPL-2.0+
- */
+#include <common.h> +#include <dm.h> +#include <timer.h> +#include <dm/test.h> +#include <test/ut.h>
+DECLARE_GLOBAL_DATA_PTR;
+/*
- Basic test of the timer uclass.
- */
+static int dm_test_timer_base(struct unit_test_state *uts) +{
struct udevice *dev;
ut_assertok(uclass_get_device(UCLASS_TIMER, 0, &dev));
ut_asserteq(1000000, timer_get_rate(dev));
return 0;
+}
+DM_TEST(dm_test_timer_base, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
2.1.4
Regards, Simon