]> Git Repo - linux.git/blob - drivers/gpu/drm/mediatek/mtk_ddp_comp.h
Merge patch series "riscv: Extension parsing fixes"
[linux.git] / drivers / gpu / drm / mediatek / mtk_ddp_comp.h
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (c) 2015 MediaTek Inc.
4  */
5
6 #ifndef MTK_DDP_COMP_H
7 #define MTK_DDP_COMP_H
8
9 #include <linux/io.h>
10 #include <linux/pm_runtime.h>
11 #include <linux/soc/mediatek/mtk-cmdq.h>
12 #include <linux/soc/mediatek/mtk-mmsys.h>
13 #include <linux/soc/mediatek/mtk-mutex.h>
14
15 #include <drm/drm_modes.h>
16
17 struct device;
18 struct device_node;
19 struct drm_crtc;
20 struct drm_device;
21 struct mtk_plane_state;
22 struct drm_crtc_state;
23
24 enum mtk_ddp_comp_type {
25         MTK_DISP_AAL,
26         MTK_DISP_BLS,
27         MTK_DISP_CCORR,
28         MTK_DISP_COLOR,
29         MTK_DISP_DITHER,
30         MTK_DISP_DSC,
31         MTK_DISP_GAMMA,
32         MTK_DISP_MERGE,
33         MTK_DISP_MUTEX,
34         MTK_DISP_OD,
35         MTK_DISP_OVL,
36         MTK_DISP_OVL_2L,
37         MTK_DISP_OVL_ADAPTOR,
38         MTK_DISP_POSTMASK,
39         MTK_DISP_PWM,
40         MTK_DISP_RDMA,
41         MTK_DISP_UFOE,
42         MTK_DISP_WDMA,
43         MTK_DPI,
44         MTK_DP_INTF,
45         MTK_DSI,
46         MTK_DDP_COMP_TYPE_MAX,
47 };
48
49 struct mtk_ddp_comp;
50 struct cmdq_pkt;
51 struct mtk_ddp_comp_funcs {
52         int (*power_on)(struct device *dev);
53         void (*power_off)(struct device *dev);
54         int (*clk_enable)(struct device *dev);
55         void (*clk_disable)(struct device *dev);
56         void (*config)(struct device *dev, unsigned int w,
57                        unsigned int h, unsigned int vrefresh,
58                        unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
59         void (*start)(struct device *dev);
60         void (*stop)(struct device *dev);
61         void (*register_vblank_cb)(struct device *dev,
62                                    void (*vblank_cb)(void *),
63                                    void *vblank_cb_data);
64         void (*unregister_vblank_cb)(struct device *dev);
65         void (*enable_vblank)(struct device *dev);
66         void (*disable_vblank)(struct device *dev);
67         unsigned int (*supported_rotations)(struct device *dev);
68         unsigned int (*layer_nr)(struct device *dev);
69         int (*layer_check)(struct device *dev,
70                            unsigned int idx,
71                            struct mtk_plane_state *state);
72         void (*layer_config)(struct device *dev, unsigned int idx,
73                              struct mtk_plane_state *state,
74                              struct cmdq_pkt *cmdq_pkt);
75         unsigned int (*gamma_get_lut_size)(struct device *dev);
76         void (*gamma_set)(struct device *dev,
77                           struct drm_crtc_state *state);
78         void (*bgclr_in_on)(struct device *dev);
79         void (*bgclr_in_off)(struct device *dev);
80         void (*ctm_set)(struct device *dev,
81                         struct drm_crtc_state *state);
82         struct device * (*dma_dev_get)(struct device *dev);
83         const u32 *(*get_formats)(struct device *dev);
84         size_t (*get_num_formats)(struct device *dev);
85         void (*connect)(struct device *dev, struct device *mmsys_dev, unsigned int next);
86         void (*disconnect)(struct device *dev, struct device *mmsys_dev, unsigned int next);
87         void (*add)(struct device *dev, struct mtk_mutex *mutex);
88         void (*remove)(struct device *dev, struct mtk_mutex *mutex);
89         unsigned int (*encoder_index)(struct device *dev);
90         enum drm_mode_status (*mode_valid)(struct device *dev, const struct drm_display_mode *mode);
91 };
92
93 struct mtk_ddp_comp {
94         struct device *dev;
95         int irq;
96         unsigned int id;
97         int encoder_index;
98         const struct mtk_ddp_comp_funcs *funcs;
99 };
100
101 static inline int mtk_ddp_comp_power_on(struct mtk_ddp_comp *comp)
102 {
103         if (comp->funcs && comp->funcs->power_on)
104                 return comp->funcs->power_on(comp->dev);
105         else
106                 return pm_runtime_resume_and_get(comp->dev);
107         return 0;
108 }
109
110 static inline void mtk_ddp_comp_power_off(struct mtk_ddp_comp *comp)
111 {
112         if (comp->funcs && comp->funcs->power_off)
113                 comp->funcs->power_off(comp->dev);
114         else
115                 pm_runtime_put(comp->dev);
116 }
117
118 static inline int mtk_ddp_comp_clk_enable(struct mtk_ddp_comp *comp)
119 {
120         if (comp->funcs && comp->funcs->clk_enable)
121                 return comp->funcs->clk_enable(comp->dev);
122
123         return 0;
124 }
125
126 static inline void mtk_ddp_comp_clk_disable(struct mtk_ddp_comp *comp)
127 {
128         if (comp->funcs && comp->funcs->clk_disable)
129                 comp->funcs->clk_disable(comp->dev);
130 }
131
132 static inline
133 enum drm_mode_status mtk_ddp_comp_mode_valid(struct mtk_ddp_comp *comp,
134                                              const struct drm_display_mode *mode)
135 {
136         if (comp && comp->funcs && comp->funcs->mode_valid)
137                 return comp->funcs->mode_valid(comp->dev, mode);
138         return MODE_OK;
139 }
140
141 static inline void mtk_ddp_comp_config(struct mtk_ddp_comp *comp,
142                                        unsigned int w, unsigned int h,
143                                        unsigned int vrefresh, unsigned int bpc,
144                                        struct cmdq_pkt *cmdq_pkt)
145 {
146         if (comp->funcs && comp->funcs->config)
147                 comp->funcs->config(comp->dev, w, h, vrefresh, bpc, cmdq_pkt);
148 }
149
150 static inline void mtk_ddp_comp_start(struct mtk_ddp_comp *comp)
151 {
152         if (comp->funcs && comp->funcs->start)
153                 comp->funcs->start(comp->dev);
154 }
155
156 static inline void mtk_ddp_comp_stop(struct mtk_ddp_comp *comp)
157 {
158         if (comp->funcs && comp->funcs->stop)
159                 comp->funcs->stop(comp->dev);
160 }
161
162 static inline void mtk_ddp_comp_register_vblank_cb(struct mtk_ddp_comp *comp,
163                                                    void (*vblank_cb)(void *),
164                                                    void *vblank_cb_data)
165 {
166         if (comp->funcs && comp->funcs->register_vblank_cb)
167                 comp->funcs->register_vblank_cb(comp->dev, vblank_cb,
168                                                 vblank_cb_data);
169 }
170
171 static inline void mtk_ddp_comp_unregister_vblank_cb(struct mtk_ddp_comp *comp)
172 {
173         if (comp->funcs && comp->funcs->unregister_vblank_cb)
174                 comp->funcs->unregister_vblank_cb(comp->dev);
175 }
176
177 static inline void mtk_ddp_comp_enable_vblank(struct mtk_ddp_comp *comp)
178 {
179         if (comp->funcs && comp->funcs->enable_vblank)
180                 comp->funcs->enable_vblank(comp->dev);
181 }
182
183 static inline void mtk_ddp_comp_disable_vblank(struct mtk_ddp_comp *comp)
184 {
185         if (comp->funcs && comp->funcs->disable_vblank)
186                 comp->funcs->disable_vblank(comp->dev);
187 }
188
189 static inline
190 unsigned int mtk_ddp_comp_supported_rotations(struct mtk_ddp_comp *comp)
191 {
192         if (comp->funcs && comp->funcs->supported_rotations)
193                 return comp->funcs->supported_rotations(comp->dev);
194
195         return 0;
196 }
197
198 static inline unsigned int mtk_ddp_comp_layer_nr(struct mtk_ddp_comp *comp)
199 {
200         if (comp->funcs && comp->funcs->layer_nr)
201                 return comp->funcs->layer_nr(comp->dev);
202
203         return 0;
204 }
205
206 static inline int mtk_ddp_comp_layer_check(struct mtk_ddp_comp *comp,
207                                            unsigned int idx,
208                                            struct mtk_plane_state *state)
209 {
210         if (comp->funcs && comp->funcs->layer_check)
211                 return comp->funcs->layer_check(comp->dev, idx, state);
212         return 0;
213 }
214
215 static inline void mtk_ddp_comp_layer_config(struct mtk_ddp_comp *comp,
216                                              unsigned int idx,
217                                              struct mtk_plane_state *state,
218                                              struct cmdq_pkt *cmdq_pkt)
219 {
220         if (comp->funcs && comp->funcs->layer_config)
221                 comp->funcs->layer_config(comp->dev, idx, state, cmdq_pkt);
222 }
223
224 static inline unsigned int mtk_ddp_gamma_get_lut_size(struct mtk_ddp_comp *comp)
225 {
226         if (comp->funcs && comp->funcs->gamma_get_lut_size)
227                 return comp->funcs->gamma_get_lut_size(comp->dev);
228
229         return 0;
230 }
231
232 static inline void mtk_ddp_gamma_set(struct mtk_ddp_comp *comp,
233                                      struct drm_crtc_state *state)
234 {
235         if (comp->funcs && comp->funcs->gamma_set)
236                 comp->funcs->gamma_set(comp->dev, state);
237 }
238
239 static inline void mtk_ddp_comp_bgclr_in_on(struct mtk_ddp_comp *comp)
240 {
241         if (comp->funcs && comp->funcs->bgclr_in_on)
242                 comp->funcs->bgclr_in_on(comp->dev);
243 }
244
245 static inline void mtk_ddp_comp_bgclr_in_off(struct mtk_ddp_comp *comp)
246 {
247         if (comp->funcs && comp->funcs->bgclr_in_off)
248                 comp->funcs->bgclr_in_off(comp->dev);
249 }
250
251 static inline void mtk_ddp_ctm_set(struct mtk_ddp_comp *comp,
252                                    struct drm_crtc_state *state)
253 {
254         if (comp->funcs && comp->funcs->ctm_set)
255                 comp->funcs->ctm_set(comp->dev, state);
256 }
257
258 static inline struct device *mtk_ddp_comp_dma_dev_get(struct mtk_ddp_comp *comp)
259 {
260         if (comp->funcs && comp->funcs->dma_dev_get)
261                 return comp->funcs->dma_dev_get(comp->dev);
262         return comp->dev;
263 }
264
265 static inline
266 const u32 *mtk_ddp_comp_get_formats(struct mtk_ddp_comp *comp)
267 {
268         if (comp->funcs && comp->funcs->get_formats)
269                 return comp->funcs->get_formats(comp->dev);
270
271         return NULL;
272 }
273
274 static inline
275 size_t mtk_ddp_comp_get_num_formats(struct mtk_ddp_comp *comp)
276 {
277         if (comp->funcs && comp->funcs->get_num_formats)
278                 return comp->funcs->get_num_formats(comp->dev);
279
280         return 0;
281 }
282
283 static inline bool mtk_ddp_comp_add(struct mtk_ddp_comp *comp, struct mtk_mutex *mutex)
284 {
285         if (comp->funcs && comp->funcs->add) {
286                 comp->funcs->add(comp->dev, mutex);
287                 return true;
288         }
289         return false;
290 }
291
292 static inline bool mtk_ddp_comp_remove(struct mtk_ddp_comp *comp, struct mtk_mutex *mutex)
293 {
294         if (comp->funcs && comp->funcs->remove) {
295                 comp->funcs->remove(comp->dev, mutex);
296                 return true;
297         }
298         return false;
299 }
300
301 static inline bool mtk_ddp_comp_connect(struct mtk_ddp_comp *comp, struct device *mmsys_dev,
302                                         unsigned int next)
303 {
304         if (comp->funcs && comp->funcs->connect) {
305                 comp->funcs->connect(comp->dev, mmsys_dev, next);
306                 return true;
307         }
308         return false;
309 }
310
311 static inline bool mtk_ddp_comp_disconnect(struct mtk_ddp_comp *comp, struct device *mmsys_dev,
312                                            unsigned int next)
313 {
314         if (comp->funcs && comp->funcs->disconnect) {
315                 comp->funcs->disconnect(comp->dev, mmsys_dev, next);
316                 return true;
317         }
318         return false;
319 }
320
321 static inline void mtk_ddp_comp_encoder_index_set(struct mtk_ddp_comp *comp)
322 {
323         if (comp->funcs && comp->funcs->encoder_index)
324                 comp->encoder_index = (int)comp->funcs->encoder_index(comp->dev);
325 }
326
327 int mtk_ddp_comp_get_id(struct device_node *node,
328                         enum mtk_ddp_comp_type comp_type);
329 unsigned int mtk_find_possible_crtcs(struct drm_device *drm, struct device *dev);
330 int mtk_ddp_comp_init(struct device_node *comp_node, struct mtk_ddp_comp *comp,
331                       unsigned int comp_id);
332 enum mtk_ddp_comp_type mtk_ddp_comp_get_type(unsigned int comp_id);
333 void mtk_ddp_write(struct cmdq_pkt *cmdq_pkt, unsigned int value,
334                    struct cmdq_client_reg *cmdq_reg, void __iomem *regs,
335                    unsigned int offset);
336 void mtk_ddp_write_relaxed(struct cmdq_pkt *cmdq_pkt, unsigned int value,
337                            struct cmdq_client_reg *cmdq_reg, void __iomem *regs,
338                            unsigned int offset);
339 void mtk_ddp_write_mask(struct cmdq_pkt *cmdq_pkt, unsigned int value,
340                         struct cmdq_client_reg *cmdq_reg, void __iomem *regs,
341                         unsigned int offset, unsigned int mask);
342 #endif /* MTK_DDP_COMP_H */
This page took 0.052942 seconds and 4 git commands to generate.