1 /*
2  * Copyright (c) 2019 Derek Hageman <hageman@inthat.cloud>
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 
8 #ifndef ZEPHYR_DRIVERS_INTERRUPT_CONTROLLER_INTC_SAM0_EIC_H_
9 #define ZEPHYR_DRIVERS_INTERRUPT_CONTROLLER_INTC_SAM0_EIC_H_
10 
11 #include <zephyr/types.h>
12 
13 /* callback for EIC interrupt */
14 typedef void (*sam0_eic_callback_t)(uint32_t pins, void *data);
15 
16 /**
17  * @brief EIC trigger condition
18  */
19 enum sam0_eic_trigger {
20 	/* Rising edge */
21 	SAM0_EIC_RISING,
22 	/* Falling edge */
23 	SAM0_EIC_FALLING,
24 	/* Both edges */
25 	SAM0_EIC_BOTH,
26 	/* High level detection */
27 	SAM0_EIC_HIGH,
28 	/* Low level detection */
29 	SAM0_EIC_LOW,
30 };
31 
32 /**
33  * @brief Acquire an EIC interrupt for specific port and pin combination
34  *
35  * This acquires the EIC interrupt for a specific port and pin combination,
36  * or returns an error if the required line is not available.  Only a single
37  * callback per port is supported and supplying a different one will
38  * change it for all lines on that port.
39  *
40  * @param port port index (A=0, etc)
41  * @param pin pin in the port
42  * @param trigger trigger condition
43  * @param filter enable filter
44  * @param cb interrupt callback
45  * @param data parameter to the interrupt callback
46  */
47 int sam0_eic_acquire(int port, int pin, enum sam0_eic_trigger trigger,
48 		     bool filter, sam0_eic_callback_t cb, void *data);
49 
50 /**
51  * @brief Release the EIC interrupt for a specific port and pin combination
52  *
53  * Release the EIC configuration for a specific port and pin combination.
54  * No effect if that combination does not currently hold the associated
55  * EIC line.
56  *
57  * @param port port index (A=0, etc)
58  * @param pin pin in the port
59  */
60 int sam0_eic_release(int port, int pin);
61 
62 /**
63  * @brief Enable the EIC interrupt for a specific port and pin combination
64  *
65  * @param port port index (A=0, etc)
66  * @param pin pin in the port
67  */
68 int sam0_eic_enable_interrupt(int port, int pin);
69 
70 /**
71  * @brief Disable the EIC interrupt for a specific port and pin combination
72  *
73  * @param port port index (A=0, etc)
74  * @param pin pin in the port
75  */
76 int sam0_eic_disable_interrupt(int port, int pin);
77 
78 /**
79  * @brief Test if there is an EIC interrupt pending for a port
80  *
81  * @param port port index (A=0, etc)
82  */
83 uint32_t sam0_eic_interrupt_pending(int port);
84 
85 #endif /* ZEPHYR_DRIVERS_INTERRUPT_CONTROLLER_INTC_SAM0_EIC_H_ */
86