sandbox: add a sandbox timer and basic test
authorThomas Chou <thomas@wytron.com.tw>
Fri, 30 Oct 2015 07:35:52 +0000 (15:35 +0800)
committerSimon Glass <sjg@chromium.org>
Fri, 20 Nov 2015 03:13:41 +0000 (20:13 -0700)
Add a sandbox timer which get time from host os and a basic
test.

Signed-off-by: Thomas Chou <thomas@wytron.com.tw>
Reviewed-by: Simon Glass <sjg@chromium.org>
arch/sandbox/dts/sandbox.dts
board/sandbox/sandbox.c
configs/sandbox_defconfig
doc/device-tree-bindings/timer/sandbox_timer.txt [new file with mode: 0644]
drivers/timer/Kconfig
drivers/timer/Makefile
drivers/timer/sandbox_timer.c [new file with mode: 0644]
include/configs/sandbox.h
test/dm/Makefile
test/dm/timer.c [new file with mode: 0644]

index 08f72aceda530a9a357dd63a9b22bd3c23fef434..720ef932ff71d55b798d3104a8f11f0d240ae59f 100644 (file)
                sides = <4>;
        };
 
+       timer {
+               compatible = "sandbox,timer";
+       };
+
        tpm {
                compatible = "google,sandbox-tpm";
        };
index 80eaa6334cb56cccbeadaee9e0a3bf68c9a07c40..592f7728c02d5c72f0e842b61296ea5fbcf14012 100644 (file)
@@ -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)
 {
index ae5b9d1be1ba6520fd0e9e730899a0643b968a6e..0b1b41c36e3d8381b16fa4b01a55fa3217d07de8 100644 (file)
@@ -53,6 +53,8 @@ CONFIG_SANDBOX_SERIAL=y
 CONFIG_SOUND=y
 CONFIG_SOUND_SANDBOX=y
 CONFIG_SANDBOX_SPI=y
+CONFIG_TIMER=y
+CONFIG_SANDBOX_TIMER=y
 CONFIG_TPM_TIS_SANDBOX=y
 CONFIG_USB=y
 CONFIG_DM_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 (file)
index 0000000..3e113f8
--- /dev/null
@@ -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"
index 97c41280052eab5569f4af8d0ee6d02a40d05c07..601e493d4f8d90d4def15720a0fe1b72aab3210c 100644 (file)
@@ -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
index ae66c07d0e41ebfc6abb5dcb180eb2a928e2c472..300946e8d9e7bb527a54a18dc279d2b04100335a 100644 (file)
@@ -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 (file)
index 0000000..38de763
--- /dev/null
@@ -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" },
+       { }
+};
+
+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,
+};
index 2a68203446c37014da356f4bf49681e867198f33..b0fe5010dc807bdd237b37a95f66fa5251a41fa9 100644 (file)
@@ -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
 
index 39630f68c878faae2e44bb49797c67fab7f9a238..681c6aec71468c4958212e320185a427dc0c0ecf 100644 (file)
@@ -33,5 +33,6 @@ 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
 obj-$(CONFIG_ADC) += adc.o
 endif
diff --git a/test/dm/timer.c b/test/dm/timer.c
new file mode 100644 (file)
index 0000000..bf964c4
--- /dev/null
@@ -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);