blob: c41bbfc1d57613077166ad0ade04987aac6ba017 [file] [log] [blame]
Sergei Antonov4803f1d2023-02-13 20:34:36 +03001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * (C) Copyright 2009 Faraday Technology
4 * Po-Yu Chuang <ratbert@faraday-tech.com>
5 *
6 * 23/08/2022 Port to DM
7 */
Sergei Antonov4803f1d2023-02-13 20:34:36 +03008#include <dm.h>
9#include <log.h>
10#include <timer.h>
11#include <asm/io.h>
12#include <dm/ofnode.h>
13#include <faraday/fttmr010.h>
14#include <asm/global_data.h>
15
16#define TIMER_LOAD_VAL 0xffffffff
17
18struct fttmr010_timer_priv {
19 struct fttmr010 __iomem *regs;
20};
21
22static u64 fttmr010_timer_get_count(struct udevice *dev)
23{
24 struct fttmr010_timer_priv *priv = dev_get_priv(dev);
25 struct fttmr010 *tmr = priv->regs;
26 u32 now = TIMER_LOAD_VAL - readl(&tmr->timer3_counter);
27
28 /* increment tbu if tbl has rolled over */
29 if (now < gd->arch.tbl)
30 gd->arch.tbu++;
31 gd->arch.tbl = now;
32
33 return ((u64)gd->arch.tbu << 32) | gd->arch.tbl;
34}
35
36static int fttmr010_timer_probe(struct udevice *dev)
37{
38 struct fttmr010_timer_priv *priv = dev_get_priv(dev);
39 struct fttmr010 *tmr;
40 unsigned int cr;
41
42 priv->regs = dev_read_addr_ptr(dev);
43 if (!priv->regs)
44 return -EINVAL;
45 tmr = priv->regs;
46
47 debug("Faraday FTTMR010 timer revision 0x%08X\n", readl(&tmr->revision));
48
49 /* disable timers */
50 writel(0, &tmr->cr);
51
52 /* setup timer */
53 writel(TIMER_LOAD_VAL, &tmr->timer3_load);
54 writel(TIMER_LOAD_VAL, &tmr->timer3_counter);
55 writel(0, &tmr->timer3_match1);
56 writel(0, &tmr->timer3_match2);
57
58 /* we don't want timer to issue interrupts */
59 writel(FTTMR010_TM3_MATCH1 |
60 FTTMR010_TM3_MATCH2 |
61 FTTMR010_TM3_OVERFLOW,
62 &tmr->interrupt_mask);
63
64 cr = readl(&tmr->cr);
65 cr |= FTTMR010_TM3_CLOCK; /* use external clock */
66 cr |= FTTMR010_TM3_ENABLE;
67 writel(cr, &tmr->cr);
68
69 gd->arch.tbl = 0;
70 gd->arch.tbu = 0;
71
72 return 0;
73}
74
75static const struct timer_ops fttmr010_timer_ops = {
76 .get_count = fttmr010_timer_get_count,
77};
78
79static const struct udevice_id fttmr010_timer_ids[] = {
80 { .compatible = "faraday,fttmr010-timer" },
81 {}
82};
83
84U_BOOT_DRIVER(fttmr010_timer) = {
85 .name = "fttmr010_timer",
86 .id = UCLASS_TIMER,
87 .of_match = fttmr010_timer_ids,
88 .priv_auto = sizeof(struct fttmr010_timer_priv),
89 .probe = fttmr010_timer_probe,
90 .ops = &fttmr010_timer_ops,
91};