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 
pixfmt_to_stride(int pix_fmt)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 
stat_name(int stat)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);
mmp_path_set_mode(struct mmp_path * path,struct mmp_mode * mode)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 }
mmp_path_set_onoff(struct mmp_path * path,int status)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 }
mmp_path_get_modelist(struct mmp_path * path,struct mmp_mode ** modelist)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 }
mmp_path_get_overlay(struct mmp_path * path,int overlay_id)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 }
mmp_overlay_set_fetch(struct mmp_overlay * overlay,int fetch_id)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 }
mmp_overlay_set_onoff(struct mmp_overlay * overlay,int status)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 }
mmp_overlay_set_win(struct mmp_overlay * overlay,struct mmp_win * win)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 }
mmp_overlay_set_addr(struct mmp_overlay * overlay,struct mmp_addr * addr)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