aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clocksource
diff options
context:
space:
mode:
authorStanley Chu <stanley.chu@mediatek.com>2018-07-05 19:11:26 -0400
committerDaniel Lezcano <daniel.lezcano@linaro.org>2018-07-26 05:26:32 -0400
commit56d52d3f56192049221105efa6ee76251a949c0e (patch)
tree3845a30629bfd9c1dd6ad2427ed5ab0fa643ccb9 /drivers/clocksource
parent7ec58e5244b7a7aa41f792968208239a43e5ade7 (diff)
clocksource/drivers/timer-mediatek: Use specific prefix for GPT
Use specific prefix to specify the name of supported timer hardware: "General Purpose Timer (GPT)". Signed-off-by: Stanley Chu <stanley.chu@mediatek.com> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Diffstat (limited to 'drivers/clocksource')
-rw-r--r--drivers/clocksource/timer-mediatek.c157
1 files changed, 80 insertions, 77 deletions
diff --git a/drivers/clocksource/timer-mediatek.c b/drivers/clocksource/timer-mediatek.c
index f9b724fd9950..e3657d29e765 100644
--- a/drivers/clocksource/timer-mediatek.c
+++ b/drivers/clocksource/timer-mediatek.c
@@ -29,32 +29,35 @@
29#include <linux/sched_clock.h> 29#include <linux/sched_clock.h>
30#include <linux/slab.h> 30#include <linux/slab.h>
31 31
32#define GPT_IRQ_EN_REG 0x00 32#define TIMER_CLK_EVT (1)
33#define GPT_IRQ_ENABLE(val) BIT((val) - 1) 33#define TIMER_CLK_SRC (2)
34#define GPT_IRQ_ACK_REG 0x08 34
35#define GPT_IRQ_ACK(val) BIT((val) - 1) 35#define TIMER_SYNC_TICKS (3)
36 36
37#define TIMER_CTRL_REG(val) (0x10 * (val)) 37/* gpt */
38#define TIMER_CTRL_OP(val) (((val) & 0x3) << 4) 38#define GPT_IRQ_EN_REG 0x00
39#define TIMER_CTRL_OP_ONESHOT (0) 39#define GPT_IRQ_ENABLE(val) BIT((val) - 1)
40#define TIMER_CTRL_OP_REPEAT (1) 40#define GPT_IRQ_ACK_REG 0x08
41#define TIMER_CTRL_OP_FREERUN (3) 41#define GPT_IRQ_ACK(val) BIT((val) - 1)
42#define TIMER_CTRL_CLEAR (2) 42
43#define TIMER_CTRL_ENABLE (1) 43#define GPT_CTRL_REG(val) (0x10 * (val))
44#define TIMER_CTRL_DISABLE (0) 44#define GPT_CTRL_OP(val) (((val) & 0x3) << 4)
45 45#define GPT_CTRL_OP_ONESHOT (0)
46#define TIMER_CLK_REG(val) (0x04 + (0x10 * (val))) 46#define GPT_CTRL_OP_REPEAT (1)
47#define TIMER_CLK_SRC(val) (((val) & 0x1) << 4) 47#define GPT_CTRL_OP_FREERUN (3)
48#define TIMER_CLK_SRC_SYS13M (0) 48#define GPT_CTRL_CLEAR (2)
49#define TIMER_CLK_SRC_RTC32K (1) 49#define GPT_CTRL_ENABLE (1)
50#define TIMER_CLK_DIV1 (0x0) 50#define GPT_CTRL_DISABLE (0)
51#define TIMER_CLK_DIV2 (0x1) 51
52 52#define GPT_CLK_REG(val) (0x04 + (0x10 * (val)))
53#define TIMER_CNT_REG(val) (0x08 + (0x10 * (val))) 53#define GPT_CLK_SRC(val) (((val) & 0x1) << 4)
54#define TIMER_CMP_REG(val) (0x0C + (0x10 * (val))) 54#define GPT_CLK_SRC_SYS13M (0)
55 55#define GPT_CLK_SRC_RTC32K (1)
56#define GPT_CLK_EVT 1 56#define GPT_CLK_DIV1 (0x0)
57#define GPT_CLK_SRC 2 57#define GPT_CLK_DIV2 (0x1)
58
59#define GPT_CNT_REG(val) (0x08 + (0x10 * (val)))
60#define GPT_CMP_REG(val) (0x0C + (0x10 * (val)))
58 61
59struct mtk_clock_event_device { 62struct mtk_clock_event_device {
60 void __iomem *gpt_base; 63 void __iomem *gpt_base;
@@ -64,7 +67,7 @@ struct mtk_clock_event_device {
64 67
65static void __iomem *gpt_sched_reg __read_mostly; 68static void __iomem *gpt_sched_reg __read_mostly;
66 69
67static u64 notrace mtk_read_sched_clock(void) 70static u64 notrace mtk_gpt_read_sched_clock(void)
68{ 71{
69 return readl_relaxed(gpt_sched_reg); 72 return readl_relaxed(gpt_sched_reg);
70} 73}
@@ -75,22 +78,22 @@ static inline struct mtk_clock_event_device *to_mtk_clk(
75 return container_of(c, struct mtk_clock_event_device, dev); 78 return container_of(c, struct mtk_clock_event_device, dev);
76} 79}
77 80
78static void mtk_clkevt_time_stop(struct mtk_clock_event_device *evt, u8 timer) 81static void mtk_gpt_clkevt_time_stop(struct mtk_clock_event_device *evt, u8 timer)
79{ 82{
80 u32 val; 83 u32 val;
81 84
82 val = readl(evt->gpt_base + TIMER_CTRL_REG(timer)); 85 val = readl(evt->gpt_base + GPT_CTRL_REG(timer));
83 writel(val & ~TIMER_CTRL_ENABLE, evt->gpt_base + 86 writel(val & ~GPT_CTRL_ENABLE, evt->gpt_base +
84 TIMER_CTRL_REG(timer)); 87 GPT_CTRL_REG(timer));
85} 88}
86 89
87static void mtk_clkevt_time_setup(struct mtk_clock_event_device *evt, 90static void mtk_gpt_clkevt_time_setup(struct mtk_clock_event_device *evt,
88 unsigned long delay, u8 timer) 91 unsigned long delay, u8 timer)
89{ 92{
90 writel(delay, evt->gpt_base + TIMER_CMP_REG(timer)); 93 writel(delay, evt->gpt_base + GPT_CMP_REG(timer));
91} 94}
92 95
93static void mtk_clkevt_time_start(struct mtk_clock_event_device *evt, 96static void mtk_gpt_clkevt_time_start(struct mtk_clock_event_device *evt,
94 bool periodic, u8 timer) 97 bool periodic, u8 timer)
95{ 98{
96 u32 val; 99 u32 val;
@@ -98,75 +101,75 @@ static void mtk_clkevt_time_start(struct mtk_clock_event_device *evt,
98 /* Acknowledge interrupt */ 101 /* Acknowledge interrupt */
99 writel(GPT_IRQ_ACK(timer), evt->gpt_base + GPT_IRQ_ACK_REG); 102 writel(GPT_IRQ_ACK(timer), evt->gpt_base + GPT_IRQ_ACK_REG);
100 103
101 val = readl(evt->gpt_base + TIMER_CTRL_REG(timer)); 104 val = readl(evt->gpt_base + GPT_CTRL_REG(timer));
102 105
103 /* Clear 2 bit timer operation mode field */ 106 /* Clear 2 bit timer operation mode field */
104 val &= ~TIMER_CTRL_OP(0x3); 107 val &= ~GPT_CTRL_OP(0x3);
105 108
106 if (periodic) 109 if (periodic)
107 val |= TIMER_CTRL_OP(TIMER_CTRL_OP_REPEAT); 110 val |= GPT_CTRL_OP(GPT_CTRL_OP_REPEAT);
108 else 111 else
109 val |= TIMER_CTRL_OP(TIMER_CTRL_OP_ONESHOT); 112 val |= GPT_CTRL_OP(GPT_CTRL_OP_ONESHOT);
110 113
111 writel(val | TIMER_CTRL_ENABLE | TIMER_CTRL_CLEAR, 114 writel(val | GPT_CTRL_ENABLE | GPT_CTRL_CLEAR,
112 evt->gpt_base + TIMER_CTRL_REG(timer)); 115 evt->gpt_base + GPT_CTRL_REG(timer));
113} 116}
114 117
115static int mtk_clkevt_shutdown(struct clock_event_device *clk) 118static int mtk_gpt_clkevt_shutdown(struct clock_event_device *clk)
116{ 119{
117 mtk_clkevt_time_stop(to_mtk_clk(clk), GPT_CLK_EVT); 120 mtk_gpt_clkevt_time_stop(to_mtk_clk(clk), TIMER_CLK_EVT);
118 return 0; 121 return 0;
119} 122}
120 123
121static int mtk_clkevt_set_periodic(struct clock_event_device *clk) 124static int mtk_gpt_clkevt_set_periodic(struct clock_event_device *clk)
122{ 125{
123 struct mtk_clock_event_device *evt = to_mtk_clk(clk); 126 struct mtk_clock_event_device *evt = to_mtk_clk(clk);
124 127
125 mtk_clkevt_time_stop(evt, GPT_CLK_EVT); 128 mtk_gpt_clkevt_time_stop(evt, TIMER_CLK_EVT);
126 mtk_clkevt_time_setup(evt, evt->ticks_per_jiffy, GPT_CLK_EVT); 129 mtk_gpt_clkevt_time_setup(evt, evt->ticks_per_jiffy, TIMER_CLK_EVT);
127 mtk_clkevt_time_start(evt, true, GPT_CLK_EVT); 130 mtk_gpt_clkevt_time_start(evt, true, TIMER_CLK_EVT);
128 return 0; 131 return 0;
129} 132}
130 133
131static int mtk_clkevt_next_event(unsigned long event, 134static int mtk_gpt_clkevt_next_event(unsigned long event,
132 struct clock_event_device *clk) 135 struct clock_event_device *clk)
133{ 136{
134 struct mtk_clock_event_device *evt = to_mtk_clk(clk); 137 struct mtk_clock_event_device *evt = to_mtk_clk(clk);
135 138
136 mtk_clkevt_time_stop(evt, GPT_CLK_EVT); 139 mtk_gpt_clkevt_time_stop(evt, TIMER_CLK_EVT);
137 mtk_clkevt_time_setup(evt, event, GPT_CLK_EVT); 140 mtk_gpt_clkevt_time_setup(evt, event, TIMER_CLK_EVT);
138 mtk_clkevt_time_start(evt, false, GPT_CLK_EVT); 141 mtk_gpt_clkevt_time_start(evt, false, TIMER_CLK_EVT);
139 142
140 return 0; 143 return 0;
141} 144}
142 145
143static irqreturn_t mtk_timer_interrupt(int irq, void *dev_id) 146static irqreturn_t mtk_gpt_interrupt(int irq, void *dev_id)
144{ 147{
145 struct mtk_clock_event_device *evt = dev_id; 148 struct mtk_clock_event_device *evt = dev_id;
146 149
147 /* Acknowledge timer0 irq */ 150 /* Acknowledge timer0 irq */
148 writel(GPT_IRQ_ACK(GPT_CLK_EVT), evt->gpt_base + GPT_IRQ_ACK_REG); 151 writel(GPT_IRQ_ACK(TIMER_CLK_EVT), evt->gpt_base + GPT_IRQ_ACK_REG);
149 evt->dev.event_handler(&evt->dev); 152 evt->dev.event_handler(&evt->dev);
150 153
151 return IRQ_HANDLED; 154 return IRQ_HANDLED;
152} 155}
153 156
154static void 157static void
155__init mtk_timer_setup(struct mtk_clock_event_device *evt, u8 timer, u8 option) 158__init mtk_gpt_setup(struct mtk_clock_event_device *evt, u8 timer, u8 option)
156{ 159{
157 writel(TIMER_CTRL_CLEAR | TIMER_CTRL_DISABLE, 160 writel(GPT_CTRL_CLEAR | GPT_CTRL_DISABLE,
158 evt->gpt_base + TIMER_CTRL_REG(timer)); 161 evt->gpt_base + GPT_CTRL_REG(timer));
159 162
160 writel(TIMER_CLK_SRC(TIMER_CLK_SRC_SYS13M) | TIMER_CLK_DIV1, 163 writel(GPT_CLK_SRC(GPT_CLK_SRC_SYS13M) | GPT_CLK_DIV1,
161 evt->gpt_base + TIMER_CLK_REG(timer)); 164 evt->gpt_base + GPT_CLK_REG(timer));
162 165
163 writel(0x0, evt->gpt_base + TIMER_CMP_REG(timer)); 166 writel(0x0, evt->gpt_base + GPT_CMP_REG(timer));
164 167
165 writel(TIMER_CTRL_OP(option) | TIMER_CTRL_ENABLE, 168 writel(GPT_CTRL_OP(option) | GPT_CTRL_ENABLE,
166 evt->gpt_base + TIMER_CTRL_REG(timer)); 169 evt->gpt_base + GPT_CTRL_REG(timer));
167} 170}
168 171
169static void mtk_timer_enable_irq(struct mtk_clock_event_device *evt, u8 timer) 172static void mtk_gpt_enable_irq(struct mtk_clock_event_device *evt, u8 timer)
170{ 173{
171 u32 val; 174 u32 val;
172 175
@@ -181,7 +184,7 @@ static void mtk_timer_enable_irq(struct mtk_clock_event_device *evt, u8 timer)
181 evt->gpt_base + GPT_IRQ_EN_REG); 184 evt->gpt_base + GPT_IRQ_EN_REG);
182} 185}
183 186
184static int __init mtk_timer_init(struct device_node *node) 187static int __init mtk_gpt_init(struct device_node *node)
185{ 188{
186 struct mtk_clock_event_device *evt; 189 struct mtk_clock_event_device *evt;
187 struct resource res; 190 struct resource res;
@@ -195,14 +198,14 @@ static int __init mtk_timer_init(struct device_node *node)
195 evt->dev.name = "mtk_tick"; 198 evt->dev.name = "mtk_tick";
196 evt->dev.rating = 300; 199 evt->dev.rating = 300;
197 evt->dev.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT; 200 evt->dev.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
198 evt->dev.set_state_shutdown = mtk_clkevt_shutdown; 201 evt->dev.set_state_shutdown = mtk_gpt_clkevt_shutdown;
199 evt->dev.set_state_periodic = mtk_clkevt_set_periodic; 202 evt->dev.set_state_periodic = mtk_gpt_clkevt_set_periodic;
200 evt->dev.set_state_oneshot = mtk_clkevt_shutdown; 203 evt->dev.set_state_oneshot = mtk_gpt_clkevt_shutdown;
201 evt->dev.tick_resume = mtk_clkevt_shutdown; 204 evt->dev.tick_resume = mtk_gpt_clkevt_shutdown;
202 evt->dev.set_next_event = mtk_clkevt_next_event; 205 evt->dev.set_next_event = mtk_gpt_clkevt_next_event;
203 evt->dev.cpumask = cpu_possible_mask; 206 evt->dev.cpumask = cpu_possible_mask;
204 207
205 evt->gpt_base = of_io_request_and_map(node, 0, "mtk-timer"); 208 evt->gpt_base = of_io_request_and_map(node, 0, "mtk-timer-gpt");
206 if (IS_ERR(evt->gpt_base)) { 209 if (IS_ERR(evt->gpt_base)) {
207 pr_err("Can't get resource\n"); 210 pr_err("Can't get resource\n");
208 goto err_kzalloc; 211 goto err_kzalloc;
@@ -226,7 +229,7 @@ static int __init mtk_timer_init(struct device_node *node)
226 } 229 }
227 rate = clk_get_rate(clk); 230 rate = clk_get_rate(clk);
228 231
229 if (request_irq(evt->dev.irq, mtk_timer_interrupt, 232 if (request_irq(evt->dev.irq, mtk_gpt_interrupt,
230 IRQF_TIMER | IRQF_IRQPOLL, "mtk_timer", evt)) { 233 IRQF_TIMER | IRQF_IRQPOLL, "mtk_timer", evt)) {
231 pr_err("failed to setup irq %d\n", evt->dev.irq); 234 pr_err("failed to setup irq %d\n", evt->dev.irq);
232 goto err_clk_disable; 235 goto err_clk_disable;
@@ -235,18 +238,18 @@ static int __init mtk_timer_init(struct device_node *node)
235 evt->ticks_per_jiffy = DIV_ROUND_UP(rate, HZ); 238 evt->ticks_per_jiffy = DIV_ROUND_UP(rate, HZ);
236 239
237 /* Configure clock source */ 240 /* Configure clock source */
238 mtk_timer_setup(evt, GPT_CLK_SRC, TIMER_CTRL_OP_FREERUN); 241 mtk_gpt_setup(evt, TIMER_CLK_SRC, GPT_CTRL_OP_FREERUN);
239 clocksource_mmio_init(evt->gpt_base + TIMER_CNT_REG(GPT_CLK_SRC), 242 clocksource_mmio_init(evt->gpt_base + GPT_CNT_REG(TIMER_CLK_SRC),
240 node->name, rate, 300, 32, clocksource_mmio_readl_up); 243 node->name, rate, 300, 32, clocksource_mmio_readl_up);
241 gpt_sched_reg = evt->gpt_base + TIMER_CNT_REG(GPT_CLK_SRC); 244 gpt_sched_reg = evt->gpt_base + GPT_CNT_REG(TIMER_CLK_SRC);
242 sched_clock_register(mtk_read_sched_clock, 32, rate); 245 sched_clock_register(mtk_gpt_read_sched_clock, 32, rate);
243 246
244 /* Configure clock event */ 247 /* Configure clock event */
245 mtk_timer_setup(evt, GPT_CLK_EVT, TIMER_CTRL_OP_REPEAT); 248 mtk_gpt_setup(evt, TIMER_CLK_EVT, GPT_CTRL_OP_REPEAT);
246 clockevents_config_and_register(&evt->dev, rate, 0x3, 249 clockevents_config_and_register(&evt->dev, rate, TIMER_SYNC_TICKS,
247 0xffffffff); 250 0xffffffff);
248 251
249 mtk_timer_enable_irq(evt, GPT_CLK_EVT); 252 mtk_gpt_enable_irq(evt, TIMER_CLK_EVT);
250 253
251 return 0; 254 return 0;
252 255
@@ -265,4 +268,4 @@ err_kzalloc:
265 268
266 return -EINVAL; 269 return -EINVAL;
267} 270}
268TIMER_OF_DECLARE(mtk_mt6577, "mediatek,mt6577-timer", mtk_timer_init); 271TIMER_OF_DECLARE(mtk_mt6577, "mediatek,mt6577-timer", mtk_gpt_init);