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  /*! Write to a control register of IRQ[ID]
23  
24   \param	ID[in]				IRQ identifier
25   \param	reg[in]				register index
26   \param value[in]			The data to be written
27  
28   \return none, IRQ[ID].ctrl[reg] = value
29   */
30  STORAGE_CLASS_IRQ_H void irq_reg_store(
31      const irq_ID_t		ID,
32      const unsigned int	reg,
33      const hrt_data		value);
34  
35  /*! Read from a control register of IRQ[ID]
36  
37   \param	ID[in]				IRQ identifier
38   \param	reg[in]				register index
39   \param value[in]			The data to be written
40  
41   \return IRQ[ID].ctrl[reg]
42   */
43  STORAGE_CLASS_IRQ_H hrt_data irq_reg_load(
44      const irq_ID_t		ID,
45      const unsigned int	reg);
46  
47  /*! Enable an IRQ channel of IRQ[ID] with a mode
48  
49   \param	ID[in]				IRQ (device) identifier
50   \param	irq[in]				IRQ (channel) identifier
51  
52   \return none, enable(IRQ[ID].channel[irq_ID])
53   */
54  void irq_enable_channel(
55      const irq_ID_t				ID,
56      const unsigned int			irq_ID);
57  
58  /*! Enable pulse interrupts for IRQ[ID] with a mode
59  
60   \param	ID[in]				IRQ (device) identifier
61   \param	enable				enable/disable pulse interrupts
62  
63   \return none
64   */
65  void irq_enable_pulse(
66      const irq_ID_t	ID,
67      bool			pulse);
68  
69  /*! Disable an IRQ channel of IRQ[ID]
70  
71   \param	ID[in]				IRQ (device) identifier
72   \param	irq[in]				IRQ (channel) identifier
73  
74   \return none, disable(IRQ[ID].channel[irq_ID])
75   */
76  void irq_disable_channel(
77      const irq_ID_t				ID,
78      const unsigned int			irq);
79  
80  /*! Clear the state of all IRQ channels of IRQ[ID]
81  
82   \param	ID[in]				IRQ (device) identifier
83  
84   \return none, clear(IRQ[ID].channel[])
85   */
86  void irq_clear_all(
87      const irq_ID_t				ID);
88  
89  /*! Return the ID of a signalling IRQ channel of IRQ[ID]
90  
91   \param	ID[in]				IRQ (device) identifier
92   \param irq_id[out]			active IRQ (channel) identifier
93  
94   \Note: This function operates as strtok(), based on the return
95    state the user is informed if there are additional signalling
96    channels
97  
98   \return state(IRQ[ID])
99   */
100  enum hrt_isp_css_irq_status irq_get_channel_id(
101      const irq_ID_t				ID,
102      unsigned int				*irq_id);
103  
104  /*! Raise an interrupt on channel irq_id of device IRQ[ID]
105  
106   \param	ID[in]				IRQ (device) identifier
107   \param	irq_id[in]			IRQ (channel) identifier
108  
109   \return none, signal(IRQ[ID].channel[irq_id])
110   */
111  void irq_raise(
112      const irq_ID_t				ID,
113      const irq_sw_channel_id_t	irq_id);
114  
115  /*! Test if any IRQ channel of the virtual super IRQ has raised a signal
116  
117   \return any(VIRQ.channel[irq_ID] != 0)
118   */
119  bool any_virq_signal(void);
120  
121  /*! Enable an IRQ channel of the virtual super IRQ
122  
123   \param	irq[in]				IRQ (channel) identifier
124   \param	en[in]				predicate channel enable
125  
126   \return none, VIRQ.channel[irq_ID].enable = en
127   */
128  void cnd_virq_enable_channel(
129      const enum virq_id				irq_ID,
130      const bool					en);
131  
132  /*! Clear the state of all IRQ channels of the virtual super IRQ
133  
134   \return none, clear(VIRQ.channel[])
135   */
136  void virq_clear_all(void);
137  
138  /*! Clear the IRQ info state of the virtual super IRQ
139  
140   \param irq_info[in/out]	The IRQ (channel) state
141  
142   \return none
143   */
144  void virq_clear_info(struct virq_info *irq_info);
145  
146  /*! Return the ID of a signalling IRQ channel of the virtual super IRQ
147  
148   \param irq_id[out]			active IRQ (channel) identifier
149  
150   \Note: This function operates as strtok(), based on the return
151    state the user is informed if there are additional signalling
152    channels
153  
154   \return state(IRQ[...])
155   */
156  enum hrt_isp_css_irq_status virq_get_channel_id(
157      enum virq_id					*irq_id);
158  
159  /*! Return the IDs of all signaling IRQ channels of the virtual super IRQ
160  
161   \param irq_info[out]		all active IRQ (channel) identifiers
162  
163   \Note: Unlike "irq_get_channel_id()" this function returns all
164    channel signaling info. The new info is OR'd with the current
165    info state. N.B. this is the same as repeatedly calling the function
166    "irq_get_channel_id()" in a (non-blocked) handler routine
167  
168   \return (error(state(IRQ[...]))
169   */
170  enum hrt_isp_css_irq_status
171  virq_get_channel_signals(struct virq_info *irq_info);
172  
173  #endif /* __IRQ_PUBLIC_H_INCLUDED__ */
174