Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/include/video/mmp_disp.h
26281 views
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 <[email protected]>
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
const 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
const 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
347