1 /*
2  *  kempld_wdt.h - Kontron PLD watchdog driver definitions
3  *
4  *  Copyright (c) 2010 Kontron Embedded Modules GmbH
5  *  Author: Michael Brunner <michael.brunner@kontron.com>
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License 2 as published
9  *  by the Free Software Foundation.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; see the file COPYING.  If not, write to
18  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
19  */
20 
21 #ifndef _KEMPLD_WDT_H_
22 #define _KEMPLD_WDT_H_
23 #include <stdint.h>
24 
25 #define KEMPLD_IOPORT 0x0a80
26 #define KEMPLD_IODATA (KEMPLD_IOPORT+1)
27 
28 #define KEMPLD_MUTEX_KEY	0x80
29 
30 /* watchdog register definitions */
31 #define KEMPLD_WDT_KICK                 0x16
32 #define KEMPLD_WDT_REV                  0x16
33 #define         KEMPLD_WDT_REV_GET(x)                   (x & 0xf)
34 #define KEMPLD_WDT_CFG                  0x17
35 #define         KEMPLD_WDT_CFG_STAGE_TIMEOUT_OCCURED(x) (1<<x)
36 #define         KEMPLD_WDT_CFG_ENABLE_LOCK              0x8
37 #define         KEMPLD_WDT_CFG_ENABLE                   0x10
38 #define         KEMPLD_WDT_CFG_AUTO_RELOAD              0x40
39 #define         KEMPLD_WDT_CFG_GLOBAL_LOCK              0x80
40 #define KEMPLD_WDT_STAGE_CFG(x)         (0x18+x)
41 #define         KEMPLD_WDT_STAGE_CFG_ACTION_MASK        0x7
42 #define         KEMPLD_WDT_STAGE_CFG_GET_ACTION(x)      (x & 0x7)
43 #define         KEMPLD_WDT_STAGE_CFG_ASSERT             0x8
44 #define         KEMPLD_WDT_STAGE_CFG_PRESCALER_MASK     0x30
45 #define         KEMPLD_WDT_STAGE_CFG_GET_PRESCALER(x)   ((x & 0x30)>>4)
46 #define         KEMPLD_WDT_STAGE_CFG_SET_PRESCALER(x)   ((x & 0x30)<<4)
47 #define KEMPLD_WDT_STAGE_TIMEOUT(x)     (0x1b+x*4)
48 #define KEMPLD_WDT_MAX_STAGES           3
49 
50 #define KEMPLD_WDT_ACTION_NONE          0x0
51 #define KEMPLD_WDT_ACTION_RESET         0x1
52 #define KEMPLD_WDT_ACTION_NMI           0x2
53 #define KEMPLD_WDT_ACTION_SMI           0x3
54 #define KEMPLD_WDT_ACTION_SCI           0x4
55 #define KEMPLD_WDT_ACTION_DELAY         0x5
56 
57 #define KEMPLD_WDT_PRESCALER_21BIT      0x0
58 #define KEMPLD_WDT_PRESCALER_17BIT      0x1
59 #define KEMPLD_WDT_PRESCALER_12BIT      0x2
60 
61 const int kempld_prescaler_bits[] = { 21, 17, 12 };
62 
63 struct kempld_watchdog_stage {
64         int     num;
65         uint32_t     timeout_mask;
66 };
67 
68 /**
69  * struct kempld_device_data - Internal representation of the PLD device
70  * @io_base:            Pointer to the IO memory
71  * @io_index:           Pointer to the IO index register
72  * @io_data:            Pointer to the IO data register
73  * @pld_clock:          PLD clock frequency
74  * @lock:               PLD spin-lock
75  * @lock_flags:         PLD spin-lock flags
76  * @have_mutex:         Bool value that indicates if mutex is aquired
77  * @last_index:         Last written index value
78  * @rscr:               Kernel resource structure
79  * @dev:                Pointer to kernel device structure
80  * @info:               KEMPLD info structure
81  */
82 struct kempld_device_data {
83         uint16_t 	        io_base;
84         uint16_t		io_index;
85         uint16_t		io_data;
86         uint32_t		 pld_clock;
87 /*        spinlock_t              lock;
88         unsigned long           lock_flags; */
89         int                     have_mutex;
90         uint8_t			last_index;
91 /*        struct resource         rscr;
92         struct device           *dev;
93         struct kempld_info      info;*/
94 };
95 
96 struct watchdog_info {
97 	uint32_t options;          /* Options the card/driver supports */
98 	uint32_t firmware_version; /* Firmware version of the card */
99 	uint8_t  identity[32];     /* Identity of the board */
100 };
101 
102 struct kempld_watchdog_data {
103         unsigned int                    revision;
104         int                             timeout;
105         int                             pretimeout;
106         unsigned long                   is_open;
107         unsigned long                   expect_close;
108         int                             stages;
109         struct kempld_watchdog_stage    *timeout_stage;
110         struct kempld_watchdog_stage    *pretimeout_stage;
111         struct kempld_device_data       *pld;
112         struct kempld_watchdog_stage    *stage[KEMPLD_WDT_MAX_STAGES];
113 	struct watchdog_info		ident;
114 };
115 
116 #endif /* _KEMPLD_WDT_H_ */
117 #define KEMPLD_PRESCALER(x)     (0xffffffff>>(32-kempld_prescaler_bits[x]))
118