Merge tag 'for-v5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux...
[linux-2.6-microblaze.git] / drivers / gpu / drm / mediatek / mtk_drm_ddp_comp.h
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (c) 2015 MediaTek Inc.
4  */
5
6 #ifndef MTK_DRM_DDP_COMP_H
7 #define MTK_DRM_DDP_COMP_H
8
9 #include <linux/io.h>
10 #include <linux/soc/mediatek/mtk-mmsys.h>
11
12 struct device;
13 struct device_node;
14 struct drm_crtc;
15 struct drm_device;
16 struct mtk_plane_state;
17 struct drm_crtc_state;
18
19 enum mtk_ddp_comp_type {
20         MTK_DISP_OVL,
21         MTK_DISP_OVL_2L,
22         MTK_DISP_RDMA,
23         MTK_DISP_WDMA,
24         MTK_DISP_COLOR,
25         MTK_DISP_CCORR,
26         MTK_DISP_DITHER,
27         MTK_DISP_AAL,
28         MTK_DISP_GAMMA,
29         MTK_DISP_UFOE,
30         MTK_DSI,
31         MTK_DPI,
32         MTK_DISP_PWM,
33         MTK_DISP_MUTEX,
34         MTK_DISP_OD,
35         MTK_DISP_BLS,
36         MTK_DDP_COMP_TYPE_MAX,
37 };
38
39 struct mtk_ddp_comp;
40 struct cmdq_pkt;
41 struct mtk_ddp_comp_funcs {
42         void (*config)(struct mtk_ddp_comp *comp, unsigned int w,
43                        unsigned int h, unsigned int vrefresh,
44                        unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
45         void (*start)(struct mtk_ddp_comp *comp);
46         void (*stop)(struct mtk_ddp_comp *comp);
47         void (*enable_vblank)(struct mtk_ddp_comp *comp, struct drm_crtc *crtc);
48         void (*disable_vblank)(struct mtk_ddp_comp *comp);
49         unsigned int (*supported_rotations)(struct mtk_ddp_comp *comp);
50         unsigned int (*layer_nr)(struct mtk_ddp_comp *comp);
51         int (*layer_check)(struct mtk_ddp_comp *comp,
52                            unsigned int idx,
53                            struct mtk_plane_state *state);
54         void (*layer_config)(struct mtk_ddp_comp *comp, unsigned int idx,
55                              struct mtk_plane_state *state,
56                              struct cmdq_pkt *cmdq_pkt);
57         void (*gamma_set)(struct mtk_ddp_comp *comp,
58                           struct drm_crtc_state *state);
59         void (*bgclr_in_on)(struct mtk_ddp_comp *comp);
60         void (*bgclr_in_off)(struct mtk_ddp_comp *comp);
61         void (*ctm_set)(struct mtk_ddp_comp *comp,
62                         struct drm_crtc_state *state);
63 };
64
65 struct mtk_ddp_comp {
66         struct clk *clk;
67         void __iomem *regs;
68         int irq;
69         struct device *larb_dev;
70         enum mtk_ddp_comp_id id;
71         const struct mtk_ddp_comp_funcs *funcs;
72         resource_size_t regs_pa;
73         u8 subsys;
74 };
75
76 static inline void mtk_ddp_comp_config(struct mtk_ddp_comp *comp,
77                                        unsigned int w, unsigned int h,
78                                        unsigned int vrefresh, unsigned int bpc,
79                                        struct cmdq_pkt *cmdq_pkt)
80 {
81         if (comp->funcs && comp->funcs->config)
82                 comp->funcs->config(comp, w, h, vrefresh, bpc, cmdq_pkt);
83 }
84
85 static inline void mtk_ddp_comp_start(struct mtk_ddp_comp *comp)
86 {
87         if (comp->funcs && comp->funcs->start)
88                 comp->funcs->start(comp);
89 }
90
91 static inline void mtk_ddp_comp_stop(struct mtk_ddp_comp *comp)
92 {
93         if (comp->funcs && comp->funcs->stop)
94                 comp->funcs->stop(comp);
95 }
96
97 static inline void mtk_ddp_comp_enable_vblank(struct mtk_ddp_comp *comp,
98                                               struct drm_crtc *crtc)
99 {
100         if (comp->funcs && comp->funcs->enable_vblank)
101                 comp->funcs->enable_vblank(comp, crtc);
102 }
103
104 static inline void mtk_ddp_comp_disable_vblank(struct mtk_ddp_comp *comp)
105 {
106         if (comp->funcs && comp->funcs->disable_vblank)
107                 comp->funcs->disable_vblank(comp);
108 }
109
110 static inline
111 unsigned int mtk_ddp_comp_supported_rotations(struct mtk_ddp_comp *comp)
112 {
113         if (comp->funcs && comp->funcs->supported_rotations)
114                 return comp->funcs->supported_rotations(comp);
115
116         return 0;
117 }
118
119 static inline unsigned int mtk_ddp_comp_layer_nr(struct mtk_ddp_comp *comp)
120 {
121         if (comp->funcs && comp->funcs->layer_nr)
122                 return comp->funcs->layer_nr(comp);
123
124         return 0;
125 }
126
127 static inline int mtk_ddp_comp_layer_check(struct mtk_ddp_comp *comp,
128                                            unsigned int idx,
129                                            struct mtk_plane_state *state)
130 {
131         if (comp->funcs && comp->funcs->layer_check)
132                 return comp->funcs->layer_check(comp, idx, state);
133         return 0;
134 }
135
136 static inline void mtk_ddp_comp_layer_config(struct mtk_ddp_comp *comp,
137                                              unsigned int idx,
138                                              struct mtk_plane_state *state,
139                                              struct cmdq_pkt *cmdq_pkt)
140 {
141         if (comp->funcs && comp->funcs->layer_config)
142                 comp->funcs->layer_config(comp, idx, state, cmdq_pkt);
143 }
144
145 static inline void mtk_ddp_gamma_set(struct mtk_ddp_comp *comp,
146                                      struct drm_crtc_state *state)
147 {
148         if (comp->funcs && comp->funcs->gamma_set)
149                 comp->funcs->gamma_set(comp, state);
150 }
151
152 static inline void mtk_ddp_comp_bgclr_in_on(struct mtk_ddp_comp *comp)
153 {
154         if (comp->funcs && comp->funcs->bgclr_in_on)
155                 comp->funcs->bgclr_in_on(comp);
156 }
157
158 static inline void mtk_ddp_comp_bgclr_in_off(struct mtk_ddp_comp *comp)
159 {
160         if (comp->funcs && comp->funcs->bgclr_in_off)
161                 comp->funcs->bgclr_in_off(comp);
162 }
163
164 static inline void mtk_ddp_ctm_set(struct mtk_ddp_comp *comp,
165                                    struct drm_crtc_state *state)
166 {
167         if (comp->funcs && comp->funcs->ctm_set)
168                 comp->funcs->ctm_set(comp, state);
169 }
170
171 int mtk_ddp_comp_get_id(struct device_node *node,
172                         enum mtk_ddp_comp_type comp_type);
173 unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm,
174                                                 struct mtk_ddp_comp ddp_comp);
175 int mtk_ddp_comp_init(struct device *dev, struct device_node *comp_node,
176                       struct mtk_ddp_comp *comp, enum mtk_ddp_comp_id comp_id,
177                       const struct mtk_ddp_comp_funcs *funcs);
178 int mtk_ddp_comp_register(struct drm_device *drm, struct mtk_ddp_comp *comp);
179 void mtk_ddp_comp_unregister(struct drm_device *drm, struct mtk_ddp_comp *comp);
180 void mtk_dither_set(struct mtk_ddp_comp *comp, unsigned int bpc,
181                     unsigned int CFG, struct cmdq_pkt *cmdq_pkt);
182 enum mtk_ddp_comp_type mtk_ddp_comp_get_type(enum mtk_ddp_comp_id comp_id);
183 void mtk_ddp_write(struct cmdq_pkt *cmdq_pkt, unsigned int value,
184                    struct mtk_ddp_comp *comp, unsigned int offset);
185 void mtk_ddp_write_relaxed(struct cmdq_pkt *cmdq_pkt, unsigned int value,
186                            struct mtk_ddp_comp *comp, unsigned int offset);
187 void mtk_ddp_write_mask(struct cmdq_pkt *cmdq_pkt, unsigned int value,
188                         struct mtk_ddp_comp *comp, unsigned int offset,
189                         unsigned int mask);
190 #endif /* MTK_DRM_DDP_COMP_H */