]> Git Repo - J-u-boot.git/blob - drivers/timer/atmel_pit_timer.c
Merge branch 'next-clk-sync' of https://source.denx.de/u-boot/custodians/u-boot-sh
[J-u-boot.git] / drivers / timer / atmel_pit_timer.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2017 Microchip Corporation
4  *                    Wenyou.Yang <[email protected]>
5  */
6
7 #include <clk.h>
8 #include <dm.h>
9 #include <timer.h>
10 #include <asm/io.h>
11 #include <linux/bitops.h>
12
13 #define AT91_PIT_VALUE          0xfffff
14 #define AT91_PIT_PITEN          BIT(24)         /* Timer Enabled */
15
16 struct atmel_pit_regs {
17         u32     mode;
18         u32     status;
19         u32     value;
20         u32     value_image;
21 };
22
23 struct atmel_pit_plat {
24         struct atmel_pit_regs *regs;
25 };
26
27 static u64 atmel_pit_get_count(struct udevice *dev)
28 {
29         struct atmel_pit_plat *plat = dev_get_plat(dev);
30         struct atmel_pit_regs *const regs = plat->regs;
31         u32 val = readl(&regs->value_image);
32
33         return timer_conv_64(val);
34 }
35
36 static int atmel_pit_probe(struct udevice *dev)
37 {
38         struct atmel_pit_plat *plat = dev_get_plat(dev);
39         struct atmel_pit_regs *const regs = plat->regs;
40         struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev);
41         struct clk clk;
42         ulong clk_rate;
43         int ret;
44
45         ret = clk_get_by_index(dev, 0, &clk);
46         if (ret)
47                 return -EINVAL;
48
49         clk_rate = clk_get_rate(&clk);
50         if (!clk_rate)
51                 return -EINVAL;
52
53         uc_priv->clock_rate = clk_rate / 16;
54
55         writel(AT91_PIT_VALUE | AT91_PIT_PITEN, &regs->mode);
56
57         return 0;
58 }
59
60 static int atmel_pit_of_to_plat(struct udevice *dev)
61 {
62         struct atmel_pit_plat *plat = dev_get_plat(dev);
63
64         plat->regs = dev_read_addr_ptr(dev);
65
66         return 0;
67 }
68
69 static const struct timer_ops atmel_pit_ops = {
70         .get_count = atmel_pit_get_count,
71 };
72
73 static const struct udevice_id atmel_pit_ids[] = {
74         { .compatible = "atmel,at91sam9260-pit" },
75         { }
76 };
77
78 U_BOOT_DRIVER(atmel_pit) = {
79         .name   = "atmel_pit",
80         .id     = UCLASS_TIMER,
81         .of_match = atmel_pit_ids,
82         .of_to_plat = atmel_pit_of_to_plat,
83         .plat_auto      = sizeof(struct atmel_pit_plat),
84         .probe  = atmel_pit_probe,
85         .ops    = &atmel_pit_ops,
86 };
This page took 0.029607 seconds and 4 git commands to generate.