]> git.sur5r.net Git - u-boot/commitdiff
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>;
        };
 
                sides = <4>;
        };
 
+       timer {
+               compatible = "sandbox,timer";
+       };
+
        tpm {
                compatible = "google,sandbox-tpm";
        };
        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;
 
 /* 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;
 }
 {
        return os_get_nsec() / 1000 + sandbox_timer_offset * 1000;
 }
+#endif
 
 int dram_init(void)
 {
 
 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_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
 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.
 
          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
 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_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
 
 #define CONFIG_IO_TRACE
 #define CONFIG_CMD_IOTRACE
 
+#ifndef CONFIG_TIMER
 #define CONFIG_SYS_TIMER_RATE          1000000
 #define CONFIG_SYS_TIMER_RATE          1000000
+#endif
 
 #define CONFIG_SYS_STDIO_DEREGISTER
 
 
 #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_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
 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);