1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
5 #ifndef _DPU_HW_INTERRUPTS_H
6 #define _DPU_HW_INTERRUPTS_H
8 #include <linux/types.h>
11 #include "dpu_hw_catalog.h"
12 #include "dpu_hw_util.h"
13 #include "dpu_hw_mdss.h"
16 * dpu_intr_type - HW Interrupt Type
17 * @DPU_IRQ_TYPE_WB_ROT_COMP: WB rotator done
18 * @DPU_IRQ_TYPE_WB_WFD_COMP: WB WFD done
19 * @DPU_IRQ_TYPE_PING_PONG_COMP: PingPong done
20 * @DPU_IRQ_TYPE_PING_PONG_RD_PTR: PingPong read pointer
21 * @DPU_IRQ_TYPE_PING_PONG_WR_PTR: PingPong write pointer
22 * @DPU_IRQ_TYPE_PING_PONG_AUTO_REF: PingPong auto refresh
23 * @DPU_IRQ_TYPE_PING_PONG_TEAR_CHECK: PingPong Tear check
24 * @DPU_IRQ_TYPE_PING_PONG_TE_CHECK: PingPong TE detection
25 * @DPU_IRQ_TYPE_INTF_UNDER_RUN: INTF underrun
26 * @DPU_IRQ_TYPE_INTF_VSYNC: INTF VSYNC
27 * @DPU_IRQ_TYPE_CWB_OVERFLOW: Concurrent WB overflow
28 * @DPU_IRQ_TYPE_HIST_VIG_DONE: VIG Histogram done
29 * @DPU_IRQ_TYPE_HIST_VIG_RSTSEQ: VIG Histogram reset
30 * @DPU_IRQ_TYPE_HIST_DSPP_DONE: DSPP Histogram done
31 * @DPU_IRQ_TYPE_HIST_DSPP_RSTSEQ: DSPP Histogram reset
32 * @DPU_IRQ_TYPE_WD_TIMER: Watchdog timer
33 * @DPU_IRQ_TYPE_SFI_VIDEO_IN: Video static frame INTR into static
34 * @DPU_IRQ_TYPE_SFI_VIDEO_OUT: Video static frame INTR out-of static
35 * @DPU_IRQ_TYPE_SFI_CMD_0_IN: DSI CMD0 static frame INTR into static
36 * @DPU_IRQ_TYPE_SFI_CMD_0_OUT: DSI CMD0 static frame INTR out-of static
37 * @DPU_IRQ_TYPE_SFI_CMD_1_IN: DSI CMD1 static frame INTR into static
38 * @DPU_IRQ_TYPE_SFI_CMD_1_OUT: DSI CMD1 static frame INTR out-of static
39 * @DPU_IRQ_TYPE_SFI_CMD_2_IN: DSI CMD2 static frame INTR into static
40 * @DPU_IRQ_TYPE_SFI_CMD_2_OUT: DSI CMD2 static frame INTR out-of static
41 * @DPU_IRQ_TYPE_PROG_LINE: Programmable Line interrupt
42 * @DPU_IRQ_TYPE_AD4_BL_DONE: AD4 backlight
43 * @DPU_IRQ_TYPE_CTL_START: Control start
44 * @DPU_IRQ_TYPE_RESERVED: Reserved for expansion
47 DPU_IRQ_TYPE_WB_ROT_COMP
,
48 DPU_IRQ_TYPE_WB_WFD_COMP
,
49 DPU_IRQ_TYPE_PING_PONG_COMP
,
50 DPU_IRQ_TYPE_PING_PONG_RD_PTR
,
51 DPU_IRQ_TYPE_PING_PONG_WR_PTR
,
52 DPU_IRQ_TYPE_PING_PONG_AUTO_REF
,
53 DPU_IRQ_TYPE_PING_PONG_TEAR_CHECK
,
54 DPU_IRQ_TYPE_PING_PONG_TE_CHECK
,
55 DPU_IRQ_TYPE_INTF_UNDER_RUN
,
56 DPU_IRQ_TYPE_INTF_VSYNC
,
57 DPU_IRQ_TYPE_CWB_OVERFLOW
,
58 DPU_IRQ_TYPE_HIST_VIG_DONE
,
59 DPU_IRQ_TYPE_HIST_VIG_RSTSEQ
,
60 DPU_IRQ_TYPE_HIST_DSPP_DONE
,
61 DPU_IRQ_TYPE_HIST_DSPP_RSTSEQ
,
62 DPU_IRQ_TYPE_WD_TIMER
,
63 DPU_IRQ_TYPE_SFI_VIDEO_IN
,
64 DPU_IRQ_TYPE_SFI_VIDEO_OUT
,
65 DPU_IRQ_TYPE_SFI_CMD_0_IN
,
66 DPU_IRQ_TYPE_SFI_CMD_0_OUT
,
67 DPU_IRQ_TYPE_SFI_CMD_1_IN
,
68 DPU_IRQ_TYPE_SFI_CMD_1_OUT
,
69 DPU_IRQ_TYPE_SFI_CMD_2_IN
,
70 DPU_IRQ_TYPE_SFI_CMD_2_OUT
,
71 DPU_IRQ_TYPE_PROG_LINE
,
72 DPU_IRQ_TYPE_AD4_BL_DONE
,
73 DPU_IRQ_TYPE_CTL_START
,
74 DPU_IRQ_TYPE_RESERVED
,
80 * Interrupt operations.
82 struct dpu_hw_intr_ops
{
84 * irq_idx_lookup - Lookup IRQ index on the HW interrupt type
85 * Used for all irq related ops
86 * @intr_type: Interrupt type defined in dpu_intr_type
87 * @instance_idx: HW interrupt block instance
88 * @return: irq_idx or -EINVAL for lookup fail
90 int (*irq_idx_lookup
)(
91 enum dpu_intr_type intr_type
,
95 * enable_irq - Enable IRQ based on lookup IRQ index
96 * @intr: HW interrupt handle
97 * @irq_idx: Lookup irq index return from irq_idx_lookup
98 * @return: 0 for success, otherwise failure
101 struct dpu_hw_intr
*intr
,
105 * disable_irq - Disable IRQ based on lookup IRQ index
106 * @intr: HW interrupt handle
107 * @irq_idx: Lookup irq index return from irq_idx_lookup
108 * @return: 0 for success, otherwise failure
111 struct dpu_hw_intr
*intr
,
115 * clear_all_irqs - Clears all the interrupts (i.e. acknowledges
116 * any asserted IRQs). Useful during reset.
117 * @intr: HW interrupt handle
118 * @return: 0 for success, otherwise failure
120 int (*clear_all_irqs
)(
121 struct dpu_hw_intr
*intr
);
124 * disable_all_irqs - Disables all the interrupts. Useful during reset.
125 * @intr: HW interrupt handle
126 * @return: 0 for success, otherwise failure
128 int (*disable_all_irqs
)(
129 struct dpu_hw_intr
*intr
);
132 * dispatch_irqs - IRQ dispatcher will call the given callback
133 * function when a matching interrupt status bit is
134 * found in the irq mapping table.
135 * @intr: HW interrupt handle
136 * @cbfunc: Callback function pointer
137 * @arg: Argument to pass back during callback
139 void (*dispatch_irqs
)(
140 struct dpu_hw_intr
*intr
,
141 void (*cbfunc
)(void *arg
, int irq_idx
),
145 * get_interrupt_statuses - Gets and store value from all interrupt
146 * status registers that are currently fired.
147 * @intr: HW interrupt handle
149 void (*get_interrupt_statuses
)(
150 struct dpu_hw_intr
*intr
);
153 * clear_intr_status_nolock() - clears the HW interrupts without lock
154 * @intr: HW interrupt handle
155 * @irq_idx: Lookup irq index return from irq_idx_lookup
157 void (*clear_intr_status_nolock
)(
158 struct dpu_hw_intr
*intr
,
162 * get_interrupt_status - Gets HW interrupt status, and clear if set,
163 * based on given lookup IRQ index.
164 * @intr: HW interrupt handle
165 * @irq_idx: Lookup irq index return from irq_idx_lookup
166 * @clear: True to clear irq after read
168 u32 (*get_interrupt_status
)(
169 struct dpu_hw_intr
*intr
,
175 * struct dpu_hw_intr: hw interrupts handling data structure
176 * @hw: virtual address mapping
177 * @ops: function pointer mapping for IRQ handling
178 * @cache_irq_mask: array of IRQ enable masks reg storage created during init
179 * @save_irq_status: array of IRQ status reg storage created during init
180 * @irq_idx_tbl_size: total number of irq_idx mapped in the hw_interrupts
181 * @irq_lock: spinlock for accessing IRQ resources
184 struct dpu_hw_blk_reg_map hw
;
185 struct dpu_hw_intr_ops ops
;
187 u32
*save_irq_status
;
188 u32 irq_idx_tbl_size
;
190 unsigned long irq_mask
;
194 * dpu_hw_intr_init(): Initializes the interrupts hw object
195 * @addr: mapped register io address of MDP
196 * @m : pointer to mdss catalog data
198 struct dpu_hw_intr
*dpu_hw_intr_init(void __iomem
*addr
,
199 struct dpu_mdss_cfg
*m
);
202 * dpu_hw_intr_destroy(): Cleanup interrutps hw object
203 * @intr: pointer to interrupts hw object
205 void dpu_hw_intr_destroy(struct dpu_hw_intr
*intr
);