mmp_disp.h (7188B)
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 14enum { 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 36static 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 */ 68struct 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 88struct mmp_addr { 89 /* phys address */ 90 u32 phys[6]; 91}; 92 93/* path related para: mode */ 94struct 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 */ 113struct mmp_path; 114struct mmp_overlay; 115struct mmp_panel; 116 117/* status types */ 118enum { 119 MMP_OFF = 0, 120 MMP_ON, 121}; 122 123static 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 135struct 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. */ 144struct 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 */ 163enum { 164 PANELTYPE_ACTIVE = 0, 165 PANELTYPE_SMART, 166 PANELTYPE_TV, 167 PANELTYPE_DSI_CMD, 168 PANELTYPE_DSI_VIDEO, 169}; 170 171struct 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 188struct 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 */ 202enum { 203 PATH_OUT_PARALLEL, 204 PATH_OUT_DSI, 205 PATH_OUT_HDMI, 206}; 207 208/* path is main part of mmp-disp */ 209struct 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[]; 235}; 236 237extern struct mmp_path *mmp_get_path(const char *name); 238static 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} 244static inline void mmp_path_set_onoff(struct mmp_path *path, int status) 245{ 246 if (path) 247 path->ops.set_onoff(path, status); 248} 249static 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} 256static 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} 263static 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} 269static 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} 275static 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} 281static 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 */ 293struct 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 306extern struct mmp_path *mmp_register_path( 307 struct mmp_path_info *info); 308extern void mmp_unregister_path(struct mmp_path *path); 309extern void mmp_register_panel(struct mmp_panel *panel); 310extern void mmp_unregister_panel(struct mmp_panel *panel); 311 312/* defintions for platform data */ 313/* interface for buffer driver */ 314struct 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 */ 323struct 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 332struct 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 */ 340struct 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_ */