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 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 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[0]; 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 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