1 /* 2 * Copyright (C) 2015 Thomas Chou <thomas@wytron.com.tw> 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6 7 #include <common.h> 8 #include <dm.h> 9 #include <errno.h> 10 #include <timer.h> 11 #include <os.h> 12 13 /* system timer offset in ms */ 14 static unsigned long sandbox_timer_offset; 15 16 void sandbox_timer_add_offset(unsigned long offset) 17 { 18 sandbox_timer_offset += offset; 19 } 20 21 static int sandbox_timer_get_count(struct udevice *dev, unsigned long *count) 22 { 23 *count = os_get_nsec() / 1000 + sandbox_timer_offset * 1000; 24 25 return 0; 26 } 27 28 static int sandbox_timer_probe(struct udevice *dev) 29 { 30 struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev); 31 32 uc_priv->clock_rate = 1000000; 33 34 return 0; 35 } 36 37 static const struct timer_ops sandbox_timer_ops = { 38 .get_count = sandbox_timer_get_count, 39 }; 40 41 static const struct udevice_id sandbox_timer_ids[] = { 42 { .compatible = "sandbox,timer" }, 43 { } 44 }; 45 46 U_BOOT_DRIVER(sandbox_timer) = { 47 .name = "sandbox_timer", 48 .id = UCLASS_TIMER, 49 .of_match = sandbox_timer_ids, 50 .probe = sandbox_timer_probe, 51 .ops = &sandbox_timer_ops, 52 .flags = DM_FLAG_PRE_RELOC, 53 }; 54