1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * linux/include/video/mmp_disp.h |
4 | * Header file for Marvell MMP Display Controller |
5 | * |
6 | * Copyright (C) 2012 Marvell Technology Group Ltd. |
7 | * Authors: Zhou Zhu <zzhu3@marvell.com> |
8 | */ |
9 | |
10 | #ifndef _MMP_DISP_H_ |
11 | #define _MMP_DISP_H_ |
12 | #include <linux/kthread.h> |
13 | |
14 | enum { |
15 | PIXFMT_UYVY = 0, |
16 | PIXFMT_VYUY, |
17 | PIXFMT_YUYV, |
18 | PIXFMT_YUV422P, |
19 | PIXFMT_YVU422P, |
20 | PIXFMT_YUV420P, |
21 | PIXFMT_YVU420P, |
22 | PIXFMT_RGB565 = 0x100, |
23 | PIXFMT_BGR565, |
24 | PIXFMT_RGB1555, |
25 | PIXFMT_BGR1555, |
26 | PIXFMT_RGB888PACK, |
27 | PIXFMT_BGR888PACK, |
28 | PIXFMT_RGB888UNPACK, |
29 | PIXFMT_BGR888UNPACK, |
30 | PIXFMT_RGBA888, |
31 | PIXFMT_BGRA888, |
32 | PIXFMT_RGB666, /* for output usage */ |
33 | PIXFMT_PSEUDOCOLOR = 0x200, |
34 | }; |
35 | |
36 | static inline int pixfmt_to_stride(int pix_fmt) |
37 | { |
38 | switch (pix_fmt) { |
39 | case PIXFMT_RGB565: |
40 | case PIXFMT_BGR565: |
41 | case PIXFMT_RGB1555: |
42 | case PIXFMT_BGR1555: |
43 | case PIXFMT_UYVY: |
44 | case PIXFMT_VYUY: |
45 | case PIXFMT_YUYV: |
46 | return 2; |
47 | case PIXFMT_RGB888UNPACK: |
48 | case PIXFMT_BGR888UNPACK: |
49 | case PIXFMT_RGBA888: |
50 | case PIXFMT_BGRA888: |
51 | return 4; |
52 | case PIXFMT_RGB888PACK: |
53 | case PIXFMT_BGR888PACK: |
54 | return 3; |
55 | case PIXFMT_YUV422P: |
56 | case PIXFMT_YVU422P: |
57 | case PIXFMT_YUV420P: |
58 | case PIXFMT_YVU420P: |
59 | case PIXFMT_PSEUDOCOLOR: |
60 | return 1; |
61 | default: |
62 | return 0; |
63 | } |
64 | } |
65 | |
66 | /* parameters used by path/overlay */ |
67 | /* overlay related para: win/addr */ |
68 | struct mmp_win { |
69 | /* position/size of window */ |
70 | u16 xsrc; |
71 | u16 ysrc; |
72 | u16 xdst; |
73 | u16 ydst; |
74 | u16 xpos; |
75 | u16 ypos; |
76 | u16 left_crop; |
77 | u16 right_crop; |
78 | u16 up_crop; |
79 | u16 bottom_crop; |
80 | int pix_fmt; |
81 | /* |
82 | * pitch[0]: graphics/video layer line length or y pitch |
83 | * pitch[1]/pitch[2]: video u/v pitch if non-zero |
84 | */ |
85 | u32 pitch[3]; |
86 | }; |
87 | |
88 | struct mmp_addr { |
89 | /* phys address */ |
90 | u32 phys[6]; |
91 | }; |
92 | |
93 | /* path related para: mode */ |
94 | struct mmp_mode { |
95 | const char *name; |
96 | u32 refresh; |
97 | u32 xres; |
98 | u32 yres; |
99 | u32 left_margin; |
100 | u32 right_margin; |
101 | u32 upper_margin; |
102 | u32 lower_margin; |
103 | u32 hsync_len; |
104 | u32 vsync_len; |
105 | u32 hsync_invert; |
106 | u32 vsync_invert; |
107 | u32 invert_pixclock; |
108 | u32 pixclock_freq; |
109 | int pix_fmt_out; |
110 | }; |
111 | |
112 | /* main structures */ |
113 | struct mmp_path; |
114 | struct mmp_overlay; |
115 | struct mmp_panel; |
116 | |
117 | /* status types */ |
118 | enum { |
119 | MMP_OFF = 0, |
120 | MMP_ON, |
121 | }; |
122 | |
123 | static inline const char *stat_name(int stat) |
124 | { |
125 | switch (stat) { |
126 | case MMP_OFF: |
127 | return "OFF" ; |
128 | case MMP_ON: |
129 | return "ON" ; |
130 | default: |
131 | return "UNKNOWNSTAT" ; |
132 | } |
133 | } |
134 | |
135 | struct mmp_overlay_ops { |
136 | /* should be provided by driver */ |
137 | void (*set_fetch)(struct mmp_overlay *overlay, int fetch_id); |
138 | void (*set_onoff)(struct mmp_overlay *overlay, int status); |
139 | void (*set_win)(struct mmp_overlay *overlay, struct mmp_win *win); |
140 | int (*set_addr)(struct mmp_overlay *overlay, struct mmp_addr *addr); |
141 | }; |
142 | |
143 | /* overlay describes a z-order indexed slot in each path. */ |
144 | struct mmp_overlay { |
145 | int id; |
146 | const char *name; |
147 | struct mmp_path *path; |
148 | |
149 | /* overlay info: private data */ |
150 | int dmafetch_id; |
151 | struct mmp_addr addr; |
152 | struct mmp_win win; |
153 | |
154 | /* state */ |
155 | int open_count; |
156 | int status; |
157 | struct mutex access_ok; |
158 | |
159 | struct mmp_overlay_ops *ops; |
160 | }; |
161 | |
162 | /* panel type */ |
163 | enum { |
164 | PANELTYPE_ACTIVE = 0, |
165 | PANELTYPE_SMART, |
166 | PANELTYPE_TV, |
167 | PANELTYPE_DSI_CMD, |
168 | PANELTYPE_DSI_VIDEO, |
169 | }; |
170 | |
171 | struct mmp_panel { |
172 | /* use node to register to list */ |
173 | struct list_head node; |
174 | const char *name; |
175 | /* path name used to connect to proper path configed */ |
176 | const char *plat_path_name; |
177 | struct device *dev; |
178 | int panel_type; |
179 | void *plat_data; |
180 | int (*get_modelist)(struct mmp_panel *panel, |
181 | struct mmp_mode **modelist); |
182 | void (*set_mode)(struct mmp_panel *panel, |
183 | struct mmp_mode *mode); |
184 | void (*set_onoff)(struct mmp_panel *panel, |
185 | int status); |
186 | }; |
187 | |
188 | struct mmp_path_ops { |
189 | int (*check_status)(struct mmp_path *path); |
190 | struct mmp_overlay *(*get_overlay)(struct mmp_path *path, |
191 | int overlay_id); |
192 | int (*get_modelist)(struct mmp_path *path, |
193 | struct mmp_mode **modelist); |
194 | |
195 | /* follow ops should be provided by driver */ |
196 | void (*set_mode)(struct mmp_path *path, struct mmp_mode *mode); |
197 | void (*set_onoff)(struct mmp_path *path, int status); |
198 | /* todo: add query */ |
199 | }; |
200 | |
201 | /* path output types */ |
202 | enum { |
203 | PATH_OUT_PARALLEL, |
204 | PATH_OUT_DSI, |
205 | PATH_OUT_HDMI, |
206 | }; |
207 | |
208 | /* path is main part of mmp-disp */ |
209 | struct mmp_path { |
210 | /* use node to register to list */ |
211 | struct list_head node; |
212 | |
213 | /* init data */ |
214 | struct device *dev; |
215 | |
216 | int id; |
217 | const char *name; |
218 | int output_type; |
219 | struct mmp_panel *panel; |
220 | void *plat_data; |
221 | |
222 | /* dynamic use */ |
223 | struct mmp_mode mode; |
224 | |
225 | /* state */ |
226 | int open_count; |
227 | int status; |
228 | struct mutex access_ok; |
229 | |
230 | struct mmp_path_ops ops; |
231 | |
232 | /* layers */ |
233 | int overlay_num; |
234 | struct mmp_overlay overlays[] __counted_by(overlay_num); |
235 | }; |
236 | |
237 | extern struct mmp_path *mmp_get_path(const char *name); |
238 | static inline void mmp_path_set_mode(struct mmp_path *path, |
239 | struct mmp_mode *mode) |
240 | { |
241 | if (path) |
242 | path->ops.set_mode(path, mode); |
243 | } |
244 | static inline void mmp_path_set_onoff(struct mmp_path *path, int status) |
245 | { |
246 | if (path) |
247 | path->ops.set_onoff(path, status); |
248 | } |
249 | static inline int mmp_path_get_modelist(struct mmp_path *path, |
250 | struct mmp_mode **modelist) |
251 | { |
252 | if (path) |
253 | return path->ops.get_modelist(path, modelist); |
254 | return 0; |
255 | } |
256 | static inline struct mmp_overlay *mmp_path_get_overlay( |
257 | struct mmp_path *path, int overlay_id) |
258 | { |
259 | if (path) |
260 | return path->ops.get_overlay(path, overlay_id); |
261 | return NULL; |
262 | } |
263 | static inline void mmp_overlay_set_fetch(struct mmp_overlay *overlay, |
264 | int fetch_id) |
265 | { |
266 | if (overlay) |
267 | overlay->ops->set_fetch(overlay, fetch_id); |
268 | } |
269 | static inline void mmp_overlay_set_onoff(struct mmp_overlay *overlay, |
270 | int status) |
271 | { |
272 | if (overlay) |
273 | overlay->ops->set_onoff(overlay, status); |
274 | } |
275 | static inline void mmp_overlay_set_win(struct mmp_overlay *overlay, |
276 | struct mmp_win *win) |
277 | { |
278 | if (overlay) |
279 | overlay->ops->set_win(overlay, win); |
280 | } |
281 | static inline int mmp_overlay_set_addr(struct mmp_overlay *overlay, |
282 | struct mmp_addr *addr) |
283 | { |
284 | if (overlay) |
285 | return overlay->ops->set_addr(overlay, addr); |
286 | return 0; |
287 | } |
288 | |
289 | /* |
290 | * driver data is set from each detailed ctrl driver for path usage |
291 | * it defined a common interface that plat driver need to implement |
292 | */ |
293 | struct mmp_path_info { |
294 | /* driver data, set when registed*/ |
295 | const char *name; |
296 | struct device *dev; |
297 | int id; |
298 | int output_type; |
299 | int overlay_num; |
300 | void (*set_mode)(struct mmp_path *path, struct mmp_mode *mode); |
301 | void (*set_onoff)(struct mmp_path *path, int status); |
302 | struct mmp_overlay_ops *overlay_ops; |
303 | void *plat_data; |
304 | }; |
305 | |
306 | extern struct mmp_path *mmp_register_path( |
307 | struct mmp_path_info *info); |
308 | extern void mmp_unregister_path(struct mmp_path *path); |
309 | extern void mmp_register_panel(struct mmp_panel *panel); |
310 | extern void mmp_unregister_panel(struct mmp_panel *panel); |
311 | |
312 | /* defintions for platform data */ |
313 | /* interface for buffer driver */ |
314 | struct mmp_buffer_driver_mach_info { |
315 | const char *name; |
316 | const char *path_name; |
317 | int overlay_id; |
318 | int dmafetch_id; |
319 | int default_pixfmt; |
320 | }; |
321 | |
322 | /* interface for controllers driver */ |
323 | struct mmp_mach_path_config { |
324 | const char *name; |
325 | int overlay_num; |
326 | int output_type; |
327 | u32 path_config; |
328 | u32 link_config; |
329 | u32 dsi_rbswap; |
330 | }; |
331 | |
332 | struct mmp_mach_plat_info { |
333 | const char *name; |
334 | const char *clk_name; |
335 | int path_num; |
336 | struct mmp_mach_path_config *paths; |
337 | }; |
338 | |
339 | /* interface for panel drivers */ |
340 | struct mmp_mach_panel_info { |
341 | const char *name; |
342 | void (*plat_set_onoff)(int status); |
343 | const char *plat_path_name; |
344 | }; |
345 | #endif /* _MMP_DISP_H_ */ |
346 | |