1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
5 #ifndef __DPU_CORE_IRQ_H__
6 #define __DPU_CORE_IRQ_H__
9 #include "dpu_hw_interrupts.h"
12 * dpu_core_irq_preinstall - perform pre-installation of core IRQ handler
13 * @dpu_kms: DPU handle
16 void dpu_core_irq_preinstall(struct dpu_kms *dpu_kms);
19 * dpu_core_irq_uninstall - uninstall core IRQ handler
20 * @dpu_kms: DPU handle
23 void dpu_core_irq_uninstall(struct dpu_kms *dpu_kms);
26 * dpu_core_irq - core IRQ handler
27 * @dpu_kms: DPU handle
28 * @return: interrupt handling status
30 irqreturn_t dpu_core_irq(struct dpu_kms *dpu_kms);
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
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);
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
52 * This function increments count on each enable and decrements on each
53 * disable. Interrupts is enabled if count is 0 before increment.
55 int dpu_core_irq_enable(
56 struct dpu_kms *dpu_kms,
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
67 * This function increments count on each enable and decrements on each
68 * disable. Interrupts is disabled if count is 0 after decrement.
70 int dpu_core_irq_disable(
71 struct dpu_kms *dpu_kms,
76 * dpu_core_irq_read - IRQ helper function for reading IRQ status
77 * @dpu_kms: DPU handle
79 * @clear: True to clear the irq after read
80 * @return: non-zero if irq detected; otherwise no irq detected
82 u32 dpu_core_irq_read(
83 struct dpu_kms *dpu_kms,
88 * dpu_core_irq_register_callback - For registering callback function on IRQ
90 * @dpu_kms: DPU handle
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
98 * This function supports registration of multiple callbacks for each interrupt.
100 int dpu_core_irq_register_callback(
101 struct dpu_kms *dpu_kms,
103 struct dpu_irq_callback *irq_cb);
106 * dpu_core_irq_unregister_callback - For unregistering callback function on IRQ
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
116 * This function supports registration of multiple callbacks for each interrupt.
118 int dpu_core_irq_unregister_callback(
119 struct dpu_kms *dpu_kms,
121 struct dpu_irq_callback *irq_cb);
124 * dpu_debugfs_core_irq_init - register core irq debugfs
125 * @dpu_kms: pointer to kms
126 * @parent: debugfs directory root
128 void dpu_debugfs_core_irq_init(struct dpu_kms *dpu_kms,
129 struct dentry *parent);
131 #endif /* __DPU_CORE_IRQ_H__ */