1 /*
2  * Copyright (c) 2021 Microchip Technology Inc.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 /**
8  * @brief Driver for External interrupt controller in Microchip XEC devices
9  *
10  * Based on reference manuals:
11  *   Reference Manuals for MEC152x and MEC172x ARM(r) 32-bit MCUs
12  *
13  * Chapter: EC Interrupt Aggregator (ECIA)
14  *
15  */
16 
17 #ifndef ZEPHYR_DRIVERS_INTERRUPT_CONTROLLER_MCHP_XEC_ECIA_H_
18 #define ZEPHYR_DRIVERS_INTERRUPT_CONTROLLER_MCHP_XEC_ECIA_H_
19 
20 #include <zephyr/device.h>
21 #include <zephyr/irq.h>
22 
23 /**
24  * @brief enable GIRQn interrupt for specific source
25  *
26  * @param girq_id is the GIRQ number (8 - 26)
27  * @param src is the interrupt source in the GIRQ (0 - 31)
28  */
29 int mchp_xec_ecia_enable(int girq_id, int src);
30 
31 /**
32  * @brief enable EXTI interrupt for specific line specified by parameter
33  * encoded with MCHP_XEC_ECIA macro.
34  *
35  * @param ecia_info is GIRQ connection encoded with MCHP_XEC_ECIA
36  */
37 int mchp_xec_ecia_info_enable(int ecia_info);
38 
39 /**
40  * @brief disable EXTI interrupt for specific line
41  *
42  * @param girq_id is the GIRQ number (8 - 26)
43  * @param src is the interrupt source in the GIRQ (0 - 31)
44  */
45 int mchp_xec_ecia_disable(int girq_id, int src);
46 
47 /**
48  * @brief disable EXTI interrupt for specific line specified by parameter
49  * encoded with MCHP_XEC_ECIA macro.
50  *
51  * @param ecia_info is GIRQ connection encoded with MCHP_XEC_ECIA
52  */
53 int mchp_xec_ecia_info_disable(int ecia_info);
54 
55 
56 /* callback for ECIA GIRQ interrupt source */
57 typedef void (*mchp_xec_ecia_callback_t) (int girq_id, int src, void *user);
58 
59 /**
60  * @brief set GIRQn interrupt source callback
61  *
62  * @param girq_id is the GIRQ number (8 - 26)
63  * @param src is the interrupt source in the GIRQ (0 - 31)
64  * @param cb user callback
65  * @param data user data
66  */
67 int mchp_xec_ecia_set_callback(int girq_id, int src,
68 			       mchp_xec_ecia_callback_t cb, void *data);
69 
70 /**
71  * @brief set GIRQn interrupt source callback
72  *
73  * @param ecia_info is GIRQ connection encoded with MCHP_XEC_ECIA
74  * @param cb user callback
75  * @param data user data
76  */
77 int mchp_xec_ecia_info_set_callback(int ecia_info, mchp_xec_ecia_callback_t cb,
78 				    void *data);
79 
80 /**
81  * @brief set GIRQn interrupt source callback
82  *
83  * @param dev_girq is a handle to the GIRQn device
84  * @param src is the interrupt source in the GIRQ (0 - 31)
85  * @param cb user callback
86  * @param data user data
87  */
88 int mchp_xec_ecia_set_callback_by_dev(const struct device *dev_girq, int src,
89 				      mchp_xec_ecia_callback_t cb, void *data);
90 
91 /**
92  * @brief unset GIRQn interrupt source callback
93  *
94  * @param girq_id is the GIRQ number (8 - 26)
95  * @param src is the interrupt source in the GIRQ (0 - 31)
96  */
97 int mchp_ecia_unset_callback(int girq_id, int src);
98 
99 /**
100  * @brief unset GIRQn interrupt source callback
101  *
102  * @param dev_girq is a handle to the GIRQn device
103  * @param src is the interrupt source in the GIRQ (0 - 31)
104  */
105 int mchp_ecia_unset_callback_by_dev(const struct device *dev_girq, int src);
106 
107 /* platform specific */
108 /** @brief enable or disable aggregated GIRQ output
109  *
110  * @param girq_id is the GIRQ number (8 - 26)
111  * @param enable non-zero enables aggregated output else disables
112  */
113 void mchp_xec_ecia_girq_aggr_en(uint8_t girq_id, uint8_t enable);
114 
115 /** @brief clear GIRQ latched source status bit
116  *
117  * @param girq_id is the GIRQ number (8 - 26)
118  * @param src_bit is the source bit position in the GIRQ registers (0 - 31)
119  */
120 void mchp_xec_ecia_girq_src_clr(uint8_t girq_id, uint8_t src_bit);
121 
122 /** @brief enable a source in a GIRQ
123  *
124  * @param girq_id is the GIRQ number (8 - 26)
125  * @param src_bit is the source bit position in the GIRQ registers (0 - 31)
126  */
127 void mchp_xec_ecia_girq_src_en(uint8_t girq_id, uint8_t src_bit);
128 
129 /** @brief disable a source in a GIRQ
130  *
131  * @param girq_id is the GIRQ number (8 - 26)
132  * @param src_bit is the source bit position in the GIRQ registers (0 - 31)
133  */
134 void mchp_xec_ecia_girq_src_dis(uint8_t girq_id, uint8_t src_bit);
135 
136 /** @brief clear GIRQ latches sources specified in bitmap
137  *
138  * @param girq_id is the GIRQ number (8 - 26)
139  * @param bitmap contains the source bits to clear
140  */
141 void mchp_xec_ecia_girq_src_clr_bitmap(uint8_t girq_id, uint32_t bitmap);
142 
143 /** @brief enable sources in a GIRQ
144  *
145  * @param girq_id is the GIRQ number (8 - 26)
146  * @param bitmap contains the source bits to enable
147  */
148 void mchp_xec_ecia_girq_src_en_bitmap(uint8_t girq_id, uint32_t bitmap);
149 
150 /** @brief disable sources in a GIRQ
151  *
152  * @param girq_id is the GIRQ number (8 - 26)
153  * @param bitmap contains the source bits to disable
154  */
155 void mchp_xec_ecia_girq_src_dis_bitmap(uint8_t girq_id, uint32_t bitmap);
156 
157 /** @brief Read GIRQ result register (bit-wise OR of enable and source)
158  *
159  * @param girq_id is the GIRQ number (8 - 26)
160  * @return 32-bit unsigned result register value
161  */
162 uint32_t mchp_xec_ecia_girq_result(uint8_t girq_id);
163 
164 /** @brief Clear external NVIC input pending status
165  *
166  * @param nvic_num is 0 to maximum NVIC inputs for the chip.
167  */
168 void mchp_xec_ecia_nvic_clr_pend(uint32_t nvic_num);
169 
170 /* API using GIRQ parameters encoded with MCHP_XEC_ECIA */
171 
172 /** @brief enable or disable aggregated GIRQ output
173  *
174  * @param ecia_info is GIRQ connection encoded with MCHP_XEC_ECIA
175  * @param enable is flag to indicate enable(1) or disable(0)
176  */
177 void mchp_xec_ecia_info_girq_aggr_en(int ecia_info, uint8_t enable);
178 
179 /** @brief clear GIRQ latched source status bit
180  *
181  * @param ecia_info is GIRQ connection encoded with MCHP_XEC_ECIA
182  */
183 void mchp_xec_ecia_info_girq_src_clr(int ecia_info);
184 
185 /** @brief enable a source in a GIRQ
186  *
187  * @param ecia_info is GIRQ connection encoded with MCHP_XEC_ECIA
188  */
189 void mchp_xec_ecia_info_girq_src_en(int ecia_info);
190 
191 /** @brief disable a source in a GIRQ
192  *
193  * @param ecia_info is GIRQ connection encoded with MCHP_XEC_ECIA
194  */
195 void mchp_xec_ecia_info_girq_src_dis(int ecia_info);
196 
197 /** @brief Read GIRQ result register (bit-wise OR of enable and source)
198  *
199  * @param ecia_info is GIRQ connection encoded with MCHP_XEC_ECIA
200  * @return 32-bit unsigned result register value
201  */
202 uint32_t mchp_xec_ecia_info_girq_result(int ecia_info);
203 
204 /** @brief Clear external NVIC input pending status given encoded ECIA info.
205  *
206  * @param ecia_info is GIRQ connection encoded with MCHP_XEC_ECIA
207  */
208 void mchp_xec_ecia_info_nvic_clr_pend(int ecia_info);
209 
210 #endif /* ZEPHYR_DRIVERS_INTERRUPT_CONTROLLER_MCHP_XEC_ECIA_H_ */
211