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