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 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 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); 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 } 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 } 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 } 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 } 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 } 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 } 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 } 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