summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/sandbox/dts/sandbox.dts4
-rw-r--r--board/sandbox/sandbox.c2
-rw-r--r--configs/sandbox_defconfig2
-rw-r--r--doc/device-tree-bindings/timer/sandbox_timer.txt7
-rw-r--r--drivers/timer/Kconfig7
-rw-r--r--drivers/timer/Makefile1
-rw-r--r--drivers/timer/sandbox_timer.c53
-rw-r--r--include/configs/sandbox.h2
-rw-r--r--test/dm/Makefile1
-rw-r--r--test/dm/timer.c27
10 files changed, 106 insertions, 0 deletions
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/configs/sandbox_defconfig b/configs/sandbox_defconfig
index ae5b9d1..0b1b41c 100644
--- a/configs/sandbox_defconfig
+++ b/configs/sandbox_defconfig
@@ -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
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..38de763
--- /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" },
+ { }
+};
+
+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 2a68203..b0fe501 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 39630f6..681c6ae 100644
--- a/test/dm/Makefile
+++ b/test/dm/Makefile
@@ -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
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);