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