7315a0f3d5676815ad1b9c81d442690403ab87b3
[platform/kernel/linux-starfive.git] / drivers / clocksource / timer-starfive.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright 2021 StarFive, Inc <samin.guo@starfivetech.com>
4  *
5  * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING
6  * CUSTOMERS WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER
7  * FOR THEM TO SAVE TIME. AS A RESULT, STARFIVE SHALL NOT BE HELD LIABLE
8  * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY
9  * CLAIMS ARISING FROM THE CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE
10  * BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONNECTION
11  * WITH THEIR PRODUCTS.
12  */
13 #ifndef STARFIVE_TIMER_H
14 #define STARFIVE_TIMER_H
15
16 #define NR_TIMERS               TIMERS_MAX
17 #define PER_TIMER_LEN           0x40
18 #define TIMER_BASE(x)           ((TIMER_##x)*PER_TIMER_LEN)
19
20 /*
21  * JH7100 timwer TIMER_INT_STATUS:
22  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
23  * |     Bits     | 08~31 | 7 | 6 | 5 |  4  | 3 | 2 | 1 | 0 |
24  * ----------------------------------------------------------
25  * | timer(n)_int |  res  | 6 | 5 | 4 | Wdt | 3 | 2 | 1 | 0 |
26  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
27  *
28  * Software can read this register to know which interrupt is occurred.
29  */
30 #define STF_TIMER_INT_STATUS    0x00
31 #define STF_TIMER_CTL           0x04
32 #define STF_TIMER_LOAD          0x08
33 #define STF_TIMER_ENABLE        0x10
34 #define STF_TIMER_RELOAD        0x14
35 #define STF_TIMER_VALUE         0x18
36 #define STF_TIMER_INT_CLR       0x20
37 #define STF_TIMER_INT_MASK      0x24
38 #define INT_STATUS_CLR_AVA      BIT(1)
39
40 enum STF_TIMERS {
41         TIMER_0 = 0,
42         TIMER_1,
43         TIMER_2,
44         TIMER_3,
45         TIMER_4,  /*WDT*/
46         TIMER_5,
47         TIMER_6,
48         TIMER_7,
49         TIMERS_MAX
50 };
51
52 enum TIMERI_INTMASK {
53         INTMASK_ENABLE_DIS = 0,
54         INTMASK_ENABLE = 1
55 };
56
57 enum TIMER_MOD {
58         MOD_CONTIN = 0,
59         MOD_SINGLE = 1
60 };
61
62 enum TIMER_CTL_EN {
63         TIMER_ENA_DIS   = 0,
64         TIMER_ENA       = 1
65 };
66
67 enum {
68         INT_CLR_AVAILABLE = 0,
69         INT_CLR_NOT_AVAILABLE = 1
70 };
71
72 struct starfive_timer {
73         u32 ctrl;
74         u32 load;
75         u32 enable;
76         u32 reload;
77         u32 value;
78         u32 intclr;
79         u32 intmask;
80         u32 wdt_lock;   /* 0x3c+i*0x40 watchdog use ONLY */
81         u32 timer_base[NR_TIMERS];
82 };
83
84 struct starfive_clkevt {
85         struct clock_event_device evt;
86         struct clk *clk;
87         char name[20];
88         int irq;
89         u64 periodic;
90         u64 rate;
91         u32 reload_val;
92         void __iomem *base;
93         void __iomem *ctrl;
94         void __iomem *load;
95         void __iomem *enable;
96         void __iomem *reload;
97         void __iomem *value;
98         void __iomem *intclr;
99         void __iomem *intmask;
100 };
101 #endif /* STARFIVE_TIMER_H */