1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Support for Intel Camera Imaging ISP subsystem.
4  * Copyright (c) 2015, Intel Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  */
15 
16 #ifndef __IRQ_PUBLIC_H_INCLUDED__
17 #define __IRQ_PUBLIC_H_INCLUDED__
18 
19 #include <type_support.h>
20 #include "system_local.h"
21 
22 /*! Read the control registers of IRQ[ID]
23 
24  \param	ID[in]				IRQ identifier
25  \param	state[out]			irq controller state structure
26 
27  \return none, state = IRQ[ID].state
28  */
29 void irq_controller_get_state(const irq_ID_t ID,
30 			      struct irq_controller_state *state);
31 
32 /*! Write to a control register of IRQ[ID]
33 
34  \param	ID[in]				IRQ identifier
35  \param	reg[in]				register index
36  \param value[in]			The data to be written
37 
38  \return none, IRQ[ID].ctrl[reg] = value
39  */
40 STORAGE_CLASS_IRQ_H void irq_reg_store(
41     const irq_ID_t		ID,
42     const unsigned int	reg,
43     const hrt_data		value);
44 
45 /*! Read from a control register of IRQ[ID]
46 
47  \param	ID[in]				IRQ identifier
48  \param	reg[in]				register index
49  \param value[in]			The data to be written
50 
51  \return IRQ[ID].ctrl[reg]
52  */
53 STORAGE_CLASS_IRQ_H hrt_data irq_reg_load(
54     const irq_ID_t		ID,
55     const unsigned int	reg);
56 
57 /*! Enable an IRQ channel of IRQ[ID] with a mode
58 
59  \param	ID[in]				IRQ (device) identifier
60  \param	irq[in]				IRQ (channel) identifier
61 
62  \return none, enable(IRQ[ID].channel[irq_ID])
63  */
64 void irq_enable_channel(
65     const irq_ID_t				ID,
66     const unsigned int			irq_ID);
67 
68 /*! Enable pulse interrupts for IRQ[ID] with a mode
69 
70  \param	ID[in]				IRQ (device) identifier
71  \param	enable				enable/disable pulse interrupts
72 
73  \return none
74  */
75 void irq_enable_pulse(
76     const irq_ID_t	ID,
77     bool			pulse);
78 
79 /*! Disable an IRQ channel of IRQ[ID]
80 
81  \param	ID[in]				IRQ (device) identifier
82  \param	irq[in]				IRQ (channel) identifier
83 
84  \return none, disable(IRQ[ID].channel[irq_ID])
85  */
86 void irq_disable_channel(
87     const irq_ID_t				ID,
88     const unsigned int			irq);
89 
90 /*! Clear the state of all IRQ channels of IRQ[ID]
91 
92  \param	ID[in]				IRQ (device) identifier
93 
94  \return none, clear(IRQ[ID].channel[])
95  */
96 void irq_clear_all(
97     const irq_ID_t				ID);
98 
99 /*! Return the ID of a signalling IRQ channel of IRQ[ID]
100 
101  \param	ID[in]				IRQ (device) identifier
102  \param irq_id[out]			active IRQ (channel) identifier
103 
104  \Note: This function operates as strtok(), based on the return
105   state the user is informed if there are additional signalling
106   channels
107 
108  \return state(IRQ[ID])
109  */
110 enum hrt_isp_css_irq_status irq_get_channel_id(
111     const irq_ID_t				ID,
112     unsigned int				*irq_id);
113 
114 /*! Raise an interrupt on channel irq_id of device IRQ[ID]
115 
116  \param	ID[in]				IRQ (device) identifier
117  \param	irq_id[in]			IRQ (channel) identifier
118 
119  \return none, signal(IRQ[ID].channel[irq_id])
120  */
121 void irq_raise(
122     const irq_ID_t				ID,
123     const irq_sw_channel_id_t	irq_id);
124 
125 /*! Test if any IRQ channel of the virtual super IRQ has raised a signal
126 
127  \return any(VIRQ.channel[irq_ID] != 0)
128  */
129 bool any_virq_signal(void);
130 
131 /*! Enable an IRQ channel of the virtual super IRQ
132 
133  \param	irq[in]				IRQ (channel) identifier
134  \param	en[in]				predicate channel enable
135 
136  \return none, VIRQ.channel[irq_ID].enable = en
137  */
138 void cnd_virq_enable_channel(
139     const enum virq_id				irq_ID,
140     const bool					en);
141 
142 /*! Clear the state of all IRQ channels of the virtual super IRQ
143 
144  \return none, clear(VIRQ.channel[])
145  */
146 void virq_clear_all(void);
147 
148 /*! Clear the IRQ info state of the virtual super IRQ
149 
150  \param irq_info[in/out]	The IRQ (channel) state
151 
152  \return none
153  */
154 void virq_clear_info(struct virq_info *irq_info);
155 
156 /*! Return the ID of a signalling IRQ channel of the virtual super IRQ
157 
158  \param irq_id[out]			active IRQ (channel) identifier
159 
160  \Note: This function operates as strtok(), based on the return
161   state the user is informed if there are additional signalling
162   channels
163 
164  \return state(IRQ[...])
165  */
166 enum hrt_isp_css_irq_status virq_get_channel_id(
167     enum virq_id					*irq_id);
168 
169 /*! Return the IDs of all signaling IRQ channels of the virtual super IRQ
170 
171  \param irq_info[out]		all active IRQ (channel) identifiers
172 
173  \Note: Unlike "irq_get_channel_id()" this function returns all
174   channel signaling info. The new info is OR'd with the current
175   info state. N.B. this is the same as repeatedly calling the function
176   "irq_get_channel_id()" in a (non-blocked) handler routine
177 
178  \return (error(state(IRQ[...]))
179  */
180 enum hrt_isp_css_irq_status
181 virq_get_channel_signals(struct virq_info *irq_info);
182 
183 #endif /* __IRQ_PUBLIC_H_INCLUDED__ */
184