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