xref: /linux/drivers/gpu/drm/msm/disp/dpu1/dpu_core_irq.h (revision 3bdab16c55f57a24245c97d707241dd9b48d1a91)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
3  */
4 
5 #ifndef __DPU_CORE_IRQ_H__
6 #define __DPU_CORE_IRQ_H__
7 
8 #include "dpu_kms.h"
9 #include "dpu_hw_interrupts.h"
10 
11 /**
12  * dpu_core_irq_preinstall - perform pre-installation of core IRQ handler
13  * @dpu_kms:		DPU handle
14  * @return:		none
15  */
16 void dpu_core_irq_preinstall(struct dpu_kms *dpu_kms);
17 
18 /**
19  * dpu_core_irq_uninstall - uninstall core IRQ handler
20  * @dpu_kms:		DPU handle
21  * @return:		none
22  */
23 void dpu_core_irq_uninstall(struct dpu_kms *dpu_kms);
24 
25 /**
26  * dpu_core_irq - core IRQ handler
27  * @dpu_kms:		DPU handle
28  * @return:		interrupt handling status
29  */
30 irqreturn_t dpu_core_irq(struct dpu_kms *dpu_kms);
31 
32 /**
33  * dpu_core_irq_idx_lookup - IRQ helper function for lookup irq_idx from HW
34  *                      interrupt mapping table.
35  * @dpu_kms:		DPU handle
36  * @intr_type:		DPU HW interrupt type for lookup
37  * @instance_idx:	DPU HW block instance defined in dpu_hw_mdss.h
38  * @return:		irq_idx or -EINVAL when fail to lookup
39  */
40 int dpu_core_irq_idx_lookup(
41 		struct dpu_kms *dpu_kms,
42 		enum dpu_intr_type intr_type,
43 		uint32_t instance_idx);
44 
45 /**
46  * dpu_core_irq_enable - IRQ helper function for enabling one or more IRQs
47  * @dpu_kms:		DPU handle
48  * @irq_idxs:		Array of irq index
49  * @irq_count:		Number of irq_idx provided in the array
50  * @return:		0 for success enabling IRQ, otherwise failure
51  *
52  * This function increments count on each enable and decrements on each
53  * disable.  Interrupts is enabled if count is 0 before increment.
54  */
55 int dpu_core_irq_enable(
56 		struct dpu_kms *dpu_kms,
57 		int *irq_idxs,
58 		uint32_t irq_count);
59 
60 /**
61  * dpu_core_irq_disable - IRQ helper function for disabling one of more IRQs
62  * @dpu_kms:		DPU handle
63  * @irq_idxs:		Array of irq index
64  * @irq_count:		Number of irq_idx provided in the array
65  * @return:		0 for success disabling IRQ, otherwise failure
66  *
67  * This function increments count on each enable and decrements on each
68  * disable.  Interrupts is disabled if count is 0 after decrement.
69  */
70 int dpu_core_irq_disable(
71 		struct dpu_kms *dpu_kms,
72 		int *irq_idxs,
73 		uint32_t irq_count);
74 
75 /**
76  * dpu_core_irq_read - IRQ helper function for reading IRQ status
77  * @dpu_kms:		DPU handle
78  * @irq_idx:		irq index
79  * @clear:		True to clear the irq after read
80  * @return:		non-zero if irq detected; otherwise no irq detected
81  */
82 u32 dpu_core_irq_read(
83 		struct dpu_kms *dpu_kms,
84 		int irq_idx,
85 		bool clear);
86 
87 /**
88  * dpu_core_irq_register_callback - For registering callback function on IRQ
89  *                             interrupt
90  * @dpu_kms:		DPU handle
91  * @irq_idx:		irq index
92  * @irq_cb:		IRQ callback structure, containing callback function
93  *			and argument. Passing NULL for irq_cb will unregister
94  *			the callback for the given irq_idx
95  *			This must exist until un-registration.
96  * @return:		0 for success registering callback, otherwise failure
97  *
98  * This function supports registration of multiple callbacks for each interrupt.
99  */
100 int dpu_core_irq_register_callback(
101 		struct dpu_kms *dpu_kms,
102 		int irq_idx,
103 		struct dpu_irq_callback *irq_cb);
104 
105 /**
106  * dpu_core_irq_unregister_callback - For unregistering callback function on IRQ
107  *                             interrupt
108  * @dpu_kms:		DPU handle
109  * @irq_idx:		irq index
110  * @irq_cb:		IRQ callback structure, containing callback function
111  *			and argument. Passing NULL for irq_cb will unregister
112  *			the callback for the given irq_idx
113  *			This must match with registration.
114  * @return:		0 for success registering callback, otherwise failure
115  *
116  * This function supports registration of multiple callbacks for each interrupt.
117  */
118 int dpu_core_irq_unregister_callback(
119 		struct dpu_kms *dpu_kms,
120 		int irq_idx,
121 		struct dpu_irq_callback *irq_cb);
122 
123 /**
124  * dpu_debugfs_core_irq_init - register core irq debugfs
125  * @dpu_kms: pointer to kms
126  * @parent: debugfs directory root
127  */
128 void dpu_debugfs_core_irq_init(struct dpu_kms *dpu_kms,
129 		struct dentry *parent);
130 
131 #endif /* __DPU_CORE_IRQ_H__ */
132