GNU Linux-libre 4.19.286-gnu1
[releases.git] / drivers / watchdog / sprd_wdt.c
1 /*
2  * Spreadtrum watchdog driver
3  * Copyright (C) 2017 Spreadtrum - http://www.spreadtrum.com
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * version 2 as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  */
14
15 #include <linux/bitops.h>
16 #include <linux/clk.h>
17 #include <linux/device.h>
18 #include <linux/err.h>
19 #include <linux/interrupt.h>
20 #include <linux/io.h>
21 #include <linux/kernel.h>
22 #include <linux/module.h>
23 #include <linux/of.h>
24 #include <linux/of_address.h>
25 #include <linux/platform_device.h>
26 #include <linux/watchdog.h>
27
28 #define SPRD_WDT_LOAD_LOW               0x0
29 #define SPRD_WDT_LOAD_HIGH              0x4
30 #define SPRD_WDT_CTRL                   0x8
31 #define SPRD_WDT_INT_CLR                0xc
32 #define SPRD_WDT_INT_RAW                0x10
33 #define SPRD_WDT_INT_MSK                0x14
34 #define SPRD_WDT_CNT_LOW                0x18
35 #define SPRD_WDT_CNT_HIGH               0x1c
36 #define SPRD_WDT_LOCK                   0x20
37 #define SPRD_WDT_IRQ_LOAD_LOW           0x2c
38 #define SPRD_WDT_IRQ_LOAD_HIGH          0x30
39
40 /* WDT_CTRL */
41 #define SPRD_WDT_INT_EN_BIT             BIT(0)
42 #define SPRD_WDT_CNT_EN_BIT             BIT(1)
43 #define SPRD_WDT_NEW_VER_EN             BIT(2)
44 #define SPRD_WDT_RST_EN_BIT             BIT(3)
45
46 /* WDT_INT_CLR */
47 #define SPRD_WDT_INT_CLEAR_BIT          BIT(0)
48 #define SPRD_WDT_RST_CLEAR_BIT          BIT(3)
49
50 /* WDT_INT_RAW */
51 #define SPRD_WDT_INT_RAW_BIT            BIT(0)
52 #define SPRD_WDT_RST_RAW_BIT            BIT(3)
53 #define SPRD_WDT_LD_BUSY_BIT            BIT(4)
54
55 /* 1s equal to 32768 counter steps */
56 #define SPRD_WDT_CNT_STEP               32768
57
58 #define SPRD_WDT_UNLOCK_KEY             0xe551
59 #define SPRD_WDT_MIN_TIMEOUT            3
60 #define SPRD_WDT_MAX_TIMEOUT            60
61
62 #define SPRD_WDT_CNT_HIGH_SHIFT         16
63 #define SPRD_WDT_LOW_VALUE_MASK         GENMASK(15, 0)
64 #define SPRD_WDT_LOAD_TIMEOUT           1000
65
66 struct sprd_wdt {
67         void __iomem *base;
68         struct watchdog_device wdd;
69         struct clk *enable;
70         struct clk *rtc_enable;
71         int irq;
72 };
73
74 static inline struct sprd_wdt *to_sprd_wdt(struct watchdog_device *wdd)
75 {
76         return container_of(wdd, struct sprd_wdt, wdd);
77 }
78
79 static inline void sprd_wdt_lock(void __iomem *addr)
80 {
81         writel_relaxed(0x0, addr + SPRD_WDT_LOCK);
82 }
83
84 static inline void sprd_wdt_unlock(void __iomem *addr)
85 {
86         writel_relaxed(SPRD_WDT_UNLOCK_KEY, addr + SPRD_WDT_LOCK);
87 }
88
89 static irqreturn_t sprd_wdt_isr(int irq, void *dev_id)
90 {
91         struct sprd_wdt *wdt = (struct sprd_wdt *)dev_id;
92
93         sprd_wdt_unlock(wdt->base);
94         writel_relaxed(SPRD_WDT_INT_CLEAR_BIT, wdt->base + SPRD_WDT_INT_CLR);
95         sprd_wdt_lock(wdt->base);
96         watchdog_notify_pretimeout(&wdt->wdd);
97         return IRQ_HANDLED;
98 }
99
100 static u32 sprd_wdt_get_cnt_value(struct sprd_wdt *wdt)
101 {
102         u32 val;
103
104         val = readl_relaxed(wdt->base + SPRD_WDT_CNT_HIGH) <<
105                 SPRD_WDT_CNT_HIGH_SHIFT;
106         val |= readl_relaxed(wdt->base + SPRD_WDT_CNT_LOW) &
107                 SPRD_WDT_LOW_VALUE_MASK;
108
109         return val;
110 }
111
112 static int sprd_wdt_load_value(struct sprd_wdt *wdt, u32 timeout,
113                                u32 pretimeout)
114 {
115         u32 val, delay_cnt = 0;
116         u32 tmr_step = timeout * SPRD_WDT_CNT_STEP;
117         u32 prtmr_step = pretimeout * SPRD_WDT_CNT_STEP;
118
119         /*
120          * Waiting the load value operation done,
121          * it needs two or three RTC clock cycles.
122          */
123         do {
124                 val = readl_relaxed(wdt->base + SPRD_WDT_INT_RAW);
125                 if (!(val & SPRD_WDT_LD_BUSY_BIT))
126                         break;
127
128                 cpu_relax();
129         } while (delay_cnt++ < SPRD_WDT_LOAD_TIMEOUT);
130
131         if (delay_cnt >= SPRD_WDT_LOAD_TIMEOUT)
132                 return -EBUSY;
133
134         sprd_wdt_unlock(wdt->base);
135         writel_relaxed((tmr_step >> SPRD_WDT_CNT_HIGH_SHIFT) &
136                       SPRD_WDT_LOW_VALUE_MASK, wdt->base + SPRD_WDT_LOAD_HIGH);
137         writel_relaxed((tmr_step & SPRD_WDT_LOW_VALUE_MASK),
138                        wdt->base + SPRD_WDT_LOAD_LOW);
139         writel_relaxed((prtmr_step >> SPRD_WDT_CNT_HIGH_SHIFT) &
140                         SPRD_WDT_LOW_VALUE_MASK,
141                        wdt->base + SPRD_WDT_IRQ_LOAD_HIGH);
142         writel_relaxed(prtmr_step & SPRD_WDT_LOW_VALUE_MASK,
143                        wdt->base + SPRD_WDT_IRQ_LOAD_LOW);
144         sprd_wdt_lock(wdt->base);
145
146         return 0;
147 }
148
149 static int sprd_wdt_enable(struct sprd_wdt *wdt)
150 {
151         u32 val;
152         int ret;
153
154         ret = clk_prepare_enable(wdt->enable);
155         if (ret)
156                 return ret;
157         ret = clk_prepare_enable(wdt->rtc_enable);
158         if (ret) {
159                 clk_disable_unprepare(wdt->enable);
160                 return ret;
161         }
162
163         sprd_wdt_unlock(wdt->base);
164         val = readl_relaxed(wdt->base + SPRD_WDT_CTRL);
165         val |= SPRD_WDT_NEW_VER_EN;
166         writel_relaxed(val, wdt->base + SPRD_WDT_CTRL);
167         sprd_wdt_lock(wdt->base);
168         return 0;
169 }
170
171 static void sprd_wdt_disable(void *_data)
172 {
173         struct sprd_wdt *wdt = _data;
174
175         sprd_wdt_unlock(wdt->base);
176         writel_relaxed(0x0, wdt->base + SPRD_WDT_CTRL);
177         sprd_wdt_lock(wdt->base);
178
179         clk_disable_unprepare(wdt->rtc_enable);
180         clk_disable_unprepare(wdt->enable);
181 }
182
183 static int sprd_wdt_start(struct watchdog_device *wdd)
184 {
185         struct sprd_wdt *wdt = to_sprd_wdt(wdd);
186         u32 val;
187         int ret;
188
189         ret = sprd_wdt_load_value(wdt, wdd->timeout, wdd->pretimeout);
190         if (ret)
191                 return ret;
192
193         sprd_wdt_unlock(wdt->base);
194         val = readl_relaxed(wdt->base + SPRD_WDT_CTRL);
195         val |= SPRD_WDT_CNT_EN_BIT | SPRD_WDT_INT_EN_BIT | SPRD_WDT_RST_EN_BIT;
196         writel_relaxed(val, wdt->base + SPRD_WDT_CTRL);
197         sprd_wdt_lock(wdt->base);
198         set_bit(WDOG_HW_RUNNING, &wdd->status);
199
200         return 0;
201 }
202
203 static int sprd_wdt_stop(struct watchdog_device *wdd)
204 {
205         struct sprd_wdt *wdt = to_sprd_wdt(wdd);
206         u32 val;
207
208         sprd_wdt_unlock(wdt->base);
209         val = readl_relaxed(wdt->base + SPRD_WDT_CTRL);
210         val &= ~(SPRD_WDT_CNT_EN_BIT | SPRD_WDT_RST_EN_BIT |
211                 SPRD_WDT_INT_EN_BIT);
212         writel_relaxed(val, wdt->base + SPRD_WDT_CTRL);
213         sprd_wdt_lock(wdt->base);
214         return 0;
215 }
216
217 static int sprd_wdt_set_timeout(struct watchdog_device *wdd,
218                                 u32 timeout)
219 {
220         struct sprd_wdt *wdt = to_sprd_wdt(wdd);
221
222         if (timeout == wdd->timeout)
223                 return 0;
224
225         wdd->timeout = timeout;
226
227         return sprd_wdt_load_value(wdt, timeout, wdd->pretimeout);
228 }
229
230 static int sprd_wdt_set_pretimeout(struct watchdog_device *wdd,
231                                    u32 new_pretimeout)
232 {
233         struct sprd_wdt *wdt = to_sprd_wdt(wdd);
234
235         if (new_pretimeout < wdd->min_timeout)
236                 return -EINVAL;
237
238         wdd->pretimeout = new_pretimeout;
239
240         return sprd_wdt_load_value(wdt, wdd->timeout, new_pretimeout);
241 }
242
243 static u32 sprd_wdt_get_timeleft(struct watchdog_device *wdd)
244 {
245         struct sprd_wdt *wdt = to_sprd_wdt(wdd);
246         u32 val;
247
248         val = sprd_wdt_get_cnt_value(wdt);
249         val = val / SPRD_WDT_CNT_STEP;
250
251         return val;
252 }
253
254 static const struct watchdog_ops sprd_wdt_ops = {
255         .owner = THIS_MODULE,
256         .start = sprd_wdt_start,
257         .stop = sprd_wdt_stop,
258         .set_timeout = sprd_wdt_set_timeout,
259         .set_pretimeout = sprd_wdt_set_pretimeout,
260         .get_timeleft = sprd_wdt_get_timeleft,
261 };
262
263 static const struct watchdog_info sprd_wdt_info = {
264         .options = WDIOF_SETTIMEOUT |
265                    WDIOF_PRETIMEOUT |
266                    WDIOF_MAGICCLOSE |
267                    WDIOF_KEEPALIVEPING,
268         .identity = "Spreadtrum Watchdog Timer",
269 };
270
271 static int sprd_wdt_probe(struct platform_device *pdev)
272 {
273         struct resource *wdt_res;
274         struct sprd_wdt *wdt;
275         int ret;
276
277         wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL);
278         if (!wdt)
279                 return -ENOMEM;
280
281         wdt_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
282         wdt->base = devm_ioremap_resource(&pdev->dev, wdt_res);
283         if (IS_ERR(wdt->base))
284                 return PTR_ERR(wdt->base);
285
286         wdt->enable = devm_clk_get(&pdev->dev, "enable");
287         if (IS_ERR(wdt->enable)) {
288                 dev_err(&pdev->dev, "can't get the enable clock\n");
289                 return PTR_ERR(wdt->enable);
290         }
291
292         wdt->rtc_enable = devm_clk_get(&pdev->dev, "rtc_enable");
293         if (IS_ERR(wdt->rtc_enable)) {
294                 dev_err(&pdev->dev, "can't get the rtc enable clock\n");
295                 return PTR_ERR(wdt->rtc_enable);
296         }
297
298         wdt->irq = platform_get_irq(pdev, 0);
299         if (wdt->irq < 0) {
300                 dev_err(&pdev->dev, "failed to get IRQ resource\n");
301                 return wdt->irq;
302         }
303
304         ret = devm_request_irq(&pdev->dev, wdt->irq, sprd_wdt_isr,
305                                IRQF_NO_SUSPEND, "sprd-wdt", (void *)wdt);
306         if (ret) {
307                 dev_err(&pdev->dev, "failed to register irq\n");
308                 return ret;
309         }
310
311         wdt->wdd.info = &sprd_wdt_info;
312         wdt->wdd.ops = &sprd_wdt_ops;
313         wdt->wdd.parent = &pdev->dev;
314         wdt->wdd.min_timeout = SPRD_WDT_MIN_TIMEOUT;
315         wdt->wdd.max_timeout = SPRD_WDT_MAX_TIMEOUT;
316         wdt->wdd.timeout = SPRD_WDT_MAX_TIMEOUT;
317
318         ret = sprd_wdt_enable(wdt);
319         if (ret) {
320                 dev_err(&pdev->dev, "failed to enable wdt\n");
321                 return ret;
322         }
323         ret = devm_add_action(&pdev->dev, sprd_wdt_disable, wdt);
324         if (ret) {
325                 sprd_wdt_disable(wdt);
326                 dev_err(&pdev->dev, "Failed to add wdt disable action\n");
327                 return ret;
328         }
329
330         watchdog_set_nowayout(&wdt->wdd, WATCHDOG_NOWAYOUT);
331         watchdog_init_timeout(&wdt->wdd, 0, &pdev->dev);
332
333         ret = devm_watchdog_register_device(&pdev->dev, &wdt->wdd);
334         if (ret) {
335                 sprd_wdt_disable(wdt);
336                 dev_err(&pdev->dev, "failed to register watchdog\n");
337                 return ret;
338         }
339         platform_set_drvdata(pdev, wdt);
340
341         return 0;
342 }
343
344 static int __maybe_unused sprd_wdt_pm_suspend(struct device *dev)
345 {
346         struct sprd_wdt *wdt = dev_get_drvdata(dev);
347
348         if (watchdog_active(&wdt->wdd))
349                 sprd_wdt_stop(&wdt->wdd);
350         sprd_wdt_disable(wdt);
351
352         return 0;
353 }
354
355 static int __maybe_unused sprd_wdt_pm_resume(struct device *dev)
356 {
357         struct sprd_wdt *wdt = dev_get_drvdata(dev);
358         int ret;
359
360         ret = sprd_wdt_enable(wdt);
361         if (ret)
362                 return ret;
363
364         if (watchdog_active(&wdt->wdd))
365                 ret = sprd_wdt_start(&wdt->wdd);
366
367         return ret;
368 }
369
370 static const struct dev_pm_ops sprd_wdt_pm_ops = {
371         SET_SYSTEM_SLEEP_PM_OPS(sprd_wdt_pm_suspend,
372                                 sprd_wdt_pm_resume)
373 };
374
375 static const struct of_device_id sprd_wdt_match_table[] = {
376         { .compatible = "sprd,sp9860-wdt", },
377         {},
378 };
379 MODULE_DEVICE_TABLE(of, sprd_wdt_match_table);
380
381 static struct platform_driver sprd_watchdog_driver = {
382         .probe  = sprd_wdt_probe,
383         .driver = {
384                 .name = "sprd-wdt",
385                 .of_match_table = sprd_wdt_match_table,
386                 .pm = &sprd_wdt_pm_ops,
387         },
388 };
389 module_platform_driver(sprd_watchdog_driver);
390
391 MODULE_AUTHOR("Eric Long <eric.long@spreadtrum.com>");
392 MODULE_DESCRIPTION("Spreadtrum Watchdog Timer Controller Driver");
393 MODULE_LICENSE("GPL v2");