blob: 94de0ae56133d57c1fad18a5fd8d734f5b7bbed7 [file] [log] [blame]
Anas Nashifa9ed4ba2015-11-21 21:07:43 -05001/*
2 * Copyright (c) 2015 Intel Corporation.
3 *
David B. Kinderac74d8b2017-01-18 17:01:01 -08004 * SPDX-License-Identifier: Apache-2.0
Anas Nashifa9ed4ba2015-11-21 21:07:43 -05005 */
6
7#ifndef _WDT_H_
8#define _WDT_H_
Anas Nashifa9ed4ba2015-11-21 21:07:43 -05009
Kumar Gala78908162017-04-19 10:32:08 -050010#include <zephyr/types.h>
Tomasz Bursztykae8c43352015-12-03 09:43:26 +010011#include <device.h>
12#include <misc/util.h>
Anas Nashif2318f022015-11-29 12:35:59 -050013
Peter Mitsisa0e45682016-01-22 12:38:49 -050014#ifdef __cplusplus
15extern "C" {
16#endif
17
Anas Nashif2318f022015-11-29 12:35:59 -050018#define WDT_MODE (BIT(1))
19#define WDT_MODE_OFFSET (1)
20#define WDT_TIMEOUT_MASK (0xF)
21
22enum wdt_mode {
23 WDT_MODE_RESET = 0,
24 WDT_MODE_INTERRUPT_RESET
25};
26
27/**
28 * WDT clock cycles for timeout type.
29 */
30enum wdt_clock_timeout_cycles {
31 WDT_2_16_CYCLES,
32 WDT_2_17_CYCLES,
33 WDT_2_18_CYCLES,
34 WDT_2_19_CYCLES,
35 WDT_2_20_CYCLES,
36 WDT_2_21_CYCLES,
37 WDT_2_22_CYCLES,
38 WDT_2_23_CYCLES,
39 WDT_2_24_CYCLES,
40 WDT_2_25_CYCLES,
41 WDT_2_26_CYCLES,
42 WDT_2_27_CYCLES,
43 WDT_2_28_CYCLES,
44 WDT_2_29_CYCLES,
45 WDT_2_30_CYCLES,
46 WDT_2_31_CYCLES
47};
48
Anas Nashifa9ed4ba2015-11-21 21:07:43 -050049
50/**
51 * WDT configuration struct.
52 */
53struct wdt_config {
Kumar Galacc334c72017-04-21 10:55:34 -050054 u32_t timeout;
Anas Nashif2318f022015-11-29 12:35:59 -050055 enum wdt_mode mode;
Tomasz Bursztykae8c43352015-12-03 09:43:26 +010056 void (*interrupt_fn)(struct device *dev);
Anas Nashifa9ed4ba2015-11-21 21:07:43 -050057};
58
Tomasz Bursztykae8c43352015-12-03 09:43:26 +010059typedef void (*wdt_api_enable)(struct device *dev);
60typedef void (*wdt_api_disable)(struct device *dev);
61typedef int (*wdt_api_set_config)(struct device *dev,
62 struct wdt_config *config);
63typedef void (*wdt_api_get_config)(struct device *dev,
64 struct wdt_config *config);
65typedef void (*wdt_api_reload)(struct device *dev);
Anas Nashifa9ed4ba2015-11-21 21:07:43 -050066
67struct wdt_driver_api {
68 wdt_api_enable enable;
69 wdt_api_disable disable;
70 wdt_api_get_config get_config;
71 wdt_api_set_config set_config;
72 wdt_api_reload reload;
73};
74
75static inline void wdt_enable(struct device *dev)
76{
Michael Hope5f67a612018-03-17 12:44:40 +010077 const struct wdt_driver_api *api =
78 (const struct wdt_driver_api *)dev->driver_api;
Anas Nashifa9ed4ba2015-11-21 21:07:43 -050079
Tomasz Bursztykae8c43352015-12-03 09:43:26 +010080 api->enable(dev);
Anas Nashifa9ed4ba2015-11-21 21:07:43 -050081}
82
83static inline void wdt_disable(struct device *dev)
84{
Michael Hope5f67a612018-03-17 12:44:40 +010085 const struct wdt_driver_api *api =
86 (const struct wdt_driver_api *)dev->driver_api;
Anas Nashifa9ed4ba2015-11-21 21:07:43 -050087
Tomasz Bursztykae8c43352015-12-03 09:43:26 +010088 api->disable(dev);
Anas Nashifa9ed4ba2015-11-21 21:07:43 -050089}
90
Tomasz Bursztykae8c43352015-12-03 09:43:26 +010091static inline void wdt_get_config(struct device *dev,
92 struct wdt_config *config)
Anas Nashifa9ed4ba2015-11-21 21:07:43 -050093{
Michael Hope5f67a612018-03-17 12:44:40 +010094 const struct wdt_driver_api *api =
95 (const struct wdt_driver_api *)dev->driver_api;
Anas Nashifa9ed4ba2015-11-21 21:07:43 -050096
Tomasz Bursztykae8c43352015-12-03 09:43:26 +010097 api->get_config(dev, config);
Anas Nashifa9ed4ba2015-11-21 21:07:43 -050098}
99
Tomasz Bursztykae8c43352015-12-03 09:43:26 +0100100static inline int wdt_set_config(struct device *dev,
101 struct wdt_config *config)
Anas Nashifa9ed4ba2015-11-21 21:07:43 -0500102{
Michael Hope5f67a612018-03-17 12:44:40 +0100103 const struct wdt_driver_api *api =
104 (const struct wdt_driver_api *)dev->driver_api;
Anas Nashifa9ed4ba2015-11-21 21:07:43 -0500105
Tomasz Bursztykae8c43352015-12-03 09:43:26 +0100106 return api->set_config(dev, config);
Anas Nashifa9ed4ba2015-11-21 21:07:43 -0500107}
108
109static inline void wdt_reload(struct device *dev)
110{
Michael Hope5f67a612018-03-17 12:44:40 +0100111 const struct wdt_driver_api *api =
112 (const struct wdt_driver_api *)dev->driver_api;
Anas Nashifa9ed4ba2015-11-21 21:07:43 -0500113
Tomasz Bursztykae8c43352015-12-03 09:43:26 +0100114 api->reload(dev);
Anas Nashifa9ed4ba2015-11-21 21:07:43 -0500115}
116
Peter Mitsisa0e45682016-01-22 12:38:49 -0500117#ifdef __cplusplus
118}
119#endif
120
Anas Nashifa9ed4ba2015-11-21 21:07:43 -0500121#endif