197fb5e8dSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
225fdd593SJeykumar Sankaran /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
325fdd593SJeykumar Sankaran  */
425fdd593SJeykumar Sankaran 
525fdd593SJeykumar Sankaran #ifndef __DPU_CORE_IRQ_H__
625fdd593SJeykumar Sankaran #define __DPU_CORE_IRQ_H__
725fdd593SJeykumar Sankaran 
825fdd593SJeykumar Sankaran #include "dpu_kms.h"
925fdd593SJeykumar Sankaran #include "dpu_hw_interrupts.h"
1025fdd593SJeykumar Sankaran 
1125fdd593SJeykumar Sankaran /**
1225fdd593SJeykumar Sankaran  * dpu_core_irq_preinstall - perform pre-installation of core IRQ handler
1325fdd593SJeykumar Sankaran  * @dpu_kms:		DPU handle
1425fdd593SJeykumar Sankaran  * @return:		none
1525fdd593SJeykumar Sankaran  */
1625fdd593SJeykumar Sankaran void dpu_core_irq_preinstall(struct dpu_kms *dpu_kms);
1725fdd593SJeykumar Sankaran 
1825fdd593SJeykumar Sankaran /**
1925fdd593SJeykumar Sankaran  * dpu_core_irq_uninstall - uninstall core IRQ handler
2025fdd593SJeykumar Sankaran  * @dpu_kms:		DPU handle
2125fdd593SJeykumar Sankaran  * @return:		none
2225fdd593SJeykumar Sankaran  */
2325fdd593SJeykumar Sankaran void dpu_core_irq_uninstall(struct dpu_kms *dpu_kms);
2425fdd593SJeykumar Sankaran 
2525fdd593SJeykumar Sankaran /**
2625fdd593SJeykumar Sankaran  * dpu_core_irq - core IRQ handler
2725fdd593SJeykumar Sankaran  * @dpu_kms:		DPU handle
2825fdd593SJeykumar Sankaran  * @return:		interrupt handling status
2925fdd593SJeykumar Sankaran  */
3025fdd593SJeykumar Sankaran irqreturn_t dpu_core_irq(struct dpu_kms *dpu_kms);
3125fdd593SJeykumar Sankaran 
3225fdd593SJeykumar Sankaran /**
3325fdd593SJeykumar Sankaran  * dpu_core_irq_idx_lookup - IRQ helper function for lookup irq_idx from HW
3425fdd593SJeykumar Sankaran  *                      interrupt mapping table.
3525fdd593SJeykumar Sankaran  * @dpu_kms:		DPU handle
3625fdd593SJeykumar Sankaran  * @intr_type:		DPU HW interrupt type for lookup
3725fdd593SJeykumar Sankaran  * @instance_idx:	DPU HW block instance defined in dpu_hw_mdss.h
3825fdd593SJeykumar Sankaran  * @return:		irq_idx or -EINVAL when fail to lookup
3925fdd593SJeykumar Sankaran  */
4025fdd593SJeykumar Sankaran int dpu_core_irq_idx_lookup(
4125fdd593SJeykumar Sankaran 		struct dpu_kms *dpu_kms,
4225fdd593SJeykumar Sankaran 		enum dpu_intr_type intr_type,
4325fdd593SJeykumar Sankaran 		uint32_t instance_idx);
4425fdd593SJeykumar Sankaran 
4525fdd593SJeykumar Sankaran /**
4625fdd593SJeykumar Sankaran  * dpu_core_irq_enable - IRQ helper function for enabling one or more IRQs
4725fdd593SJeykumar Sankaran  * @dpu_kms:		DPU handle
4825fdd593SJeykumar Sankaran  * @irq_idxs:		Array of irq index
4925fdd593SJeykumar Sankaran  * @irq_count:		Number of irq_idx provided in the array
5025fdd593SJeykumar Sankaran  * @return:		0 for success enabling IRQ, otherwise failure
5125fdd593SJeykumar Sankaran  *
5225fdd593SJeykumar Sankaran  * This function increments count on each enable and decrements on each
5325fdd593SJeykumar Sankaran  * disable.  Interrupts is enabled if count is 0 before increment.
5425fdd593SJeykumar Sankaran  */
5525fdd593SJeykumar Sankaran int dpu_core_irq_enable(
5625fdd593SJeykumar Sankaran 		struct dpu_kms *dpu_kms,
5725fdd593SJeykumar Sankaran 		int *irq_idxs,
5825fdd593SJeykumar Sankaran 		uint32_t irq_count);
5925fdd593SJeykumar Sankaran 
6025fdd593SJeykumar Sankaran /**
6125fdd593SJeykumar Sankaran  * dpu_core_irq_disable - IRQ helper function for disabling one of more IRQs
6225fdd593SJeykumar Sankaran  * @dpu_kms:		DPU handle
6325fdd593SJeykumar Sankaran  * @irq_idxs:		Array of irq index
6425fdd593SJeykumar Sankaran  * @irq_count:		Number of irq_idx provided in the array
6525fdd593SJeykumar Sankaran  * @return:		0 for success disabling IRQ, otherwise failure
6625fdd593SJeykumar Sankaran  *
6725fdd593SJeykumar Sankaran  * This function increments count on each enable and decrements on each
6825fdd593SJeykumar Sankaran  * disable.  Interrupts is disabled if count is 0 after decrement.
6925fdd593SJeykumar Sankaran  */
7025fdd593SJeykumar Sankaran int dpu_core_irq_disable(
7125fdd593SJeykumar Sankaran 		struct dpu_kms *dpu_kms,
7225fdd593SJeykumar Sankaran 		int *irq_idxs,
7325fdd593SJeykumar Sankaran 		uint32_t irq_count);
7425fdd593SJeykumar Sankaran 
7525fdd593SJeykumar Sankaran /**
7625fdd593SJeykumar Sankaran  * dpu_core_irq_read - IRQ helper function for reading IRQ status
7725fdd593SJeykumar Sankaran  * @dpu_kms:		DPU handle
7825fdd593SJeykumar Sankaran  * @irq_idx:		irq index
7925fdd593SJeykumar Sankaran  * @clear:		True to clear the irq after read
8025fdd593SJeykumar Sankaran  * @return:		non-zero if irq detected; otherwise no irq detected
8125fdd593SJeykumar Sankaran  */
8225fdd593SJeykumar Sankaran u32 dpu_core_irq_read(
8325fdd593SJeykumar Sankaran 		struct dpu_kms *dpu_kms,
8425fdd593SJeykumar Sankaran 		int irq_idx,
8525fdd593SJeykumar Sankaran 		bool clear);
8625fdd593SJeykumar Sankaran 
8725fdd593SJeykumar Sankaran /**
8825fdd593SJeykumar Sankaran  * dpu_core_irq_register_callback - For registering callback function on IRQ
8925fdd593SJeykumar Sankaran  *                             interrupt
9025fdd593SJeykumar Sankaran  * @dpu_kms:		DPU handle
9125fdd593SJeykumar Sankaran  * @irq_idx:		irq index
9225fdd593SJeykumar Sankaran  * @irq_cb:		IRQ callback structure, containing callback function
9325fdd593SJeykumar Sankaran  *			and argument. Passing NULL for irq_cb will unregister
9425fdd593SJeykumar Sankaran  *			the callback for the given irq_idx
9525fdd593SJeykumar Sankaran  *			This must exist until un-registration.
9625fdd593SJeykumar Sankaran  * @return:		0 for success registering callback, otherwise failure
9725fdd593SJeykumar Sankaran  *
9825fdd593SJeykumar Sankaran  * This function supports registration of multiple callbacks for each interrupt.
9925fdd593SJeykumar Sankaran  */
10025fdd593SJeykumar Sankaran int dpu_core_irq_register_callback(
10125fdd593SJeykumar Sankaran 		struct dpu_kms *dpu_kms,
10225fdd593SJeykumar Sankaran 		int irq_idx,
10325fdd593SJeykumar Sankaran 		struct dpu_irq_callback *irq_cb);
10425fdd593SJeykumar Sankaran 
10525fdd593SJeykumar Sankaran /**
10625fdd593SJeykumar Sankaran  * dpu_core_irq_unregister_callback - For unregistering callback function on IRQ
10725fdd593SJeykumar Sankaran  *                             interrupt
10825fdd593SJeykumar Sankaran  * @dpu_kms:		DPU handle
10925fdd593SJeykumar Sankaran  * @irq_idx:		irq index
11025fdd593SJeykumar Sankaran  * @irq_cb:		IRQ callback structure, containing callback function
11125fdd593SJeykumar Sankaran  *			and argument. Passing NULL for irq_cb will unregister
11225fdd593SJeykumar Sankaran  *			the callback for the given irq_idx
11325fdd593SJeykumar Sankaran  *			This must match with registration.
11425fdd593SJeykumar Sankaran  * @return:		0 for success registering callback, otherwise failure
11525fdd593SJeykumar Sankaran  *
11625fdd593SJeykumar Sankaran  * This function supports registration of multiple callbacks for each interrupt.
11725fdd593SJeykumar Sankaran  */
11825fdd593SJeykumar Sankaran int dpu_core_irq_unregister_callback(
11925fdd593SJeykumar Sankaran 		struct dpu_kms *dpu_kms,
12025fdd593SJeykumar Sankaran 		int irq_idx,
12125fdd593SJeykumar Sankaran 		struct dpu_irq_callback *irq_cb);
12225fdd593SJeykumar Sankaran 
12325fdd593SJeykumar Sankaran /**
12425fdd593SJeykumar Sankaran  * dpu_debugfs_core_irq_init - register core irq debugfs
12525fdd593SJeykumar Sankaran  * @dpu_kms: pointer to kms
12625fdd593SJeykumar Sankaran  * @parent: debugfs directory root
12725fdd593SJeykumar Sankaran  */
1283d688410SJordan Crouse void dpu_debugfs_core_irq_init(struct dpu_kms *dpu_kms,
12925fdd593SJeykumar Sankaran 		struct dentry *parent);
13025fdd593SJeykumar Sankaran 
13125fdd593SJeykumar Sankaran #endif /* __DPU_CORE_IRQ_H__ */
132