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