| /* | |
| * linux/include/video/mmp_disp.h | |
| * Header file for Marvell MMP Display Controller | |
| * | |
| * Copyright (C) 2012 Marvell Technology Group Ltd. | |
| * Authors: Zhou Zhu <zzhu3@marvell.com> | |
| * | |
| * This program is free software; you can redistribute it and/or modify it | |
| * under the terms of the GNU General Public License as published by the | |
| * Free Software Foundation; either version 2 of the License, or (at your | |
| * option) any later version. | |
| * | |
| * This program is distributed in the hope that it will be useful, but WITHOUT | |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
| * more details. | |
| * | |
| * You should have received a copy of the GNU General Public License along with | |
| * this program. If not, see <http://www.gnu.org/licenses/>. | |
| * | |
| */ | |
| #ifndef _MMP_DISP_H_ | |
| #define _MMP_DISP_H_ | |
| #include <linux/kthread.h> | |
| enum { | |
| PIXFMT_UYVY = 0, | |
| PIXFMT_VYUY, | |
| PIXFMT_YUYV, | |
| PIXFMT_YUV422P, | |
| PIXFMT_YVU422P, | |
| PIXFMT_YUV420P, | |
| PIXFMT_YVU420P, | |
| PIXFMT_RGB565 = 0x100, | |
| PIXFMT_BGR565, | |
| PIXFMT_RGB1555, | |
| PIXFMT_BGR1555, | |
| PIXFMT_RGB888PACK, | |
| PIXFMT_BGR888PACK, | |
| PIXFMT_RGB888UNPACK, | |
| PIXFMT_BGR888UNPACK, | |
| PIXFMT_RGBA888, | |
| PIXFMT_BGRA888, | |
| PIXFMT_RGB666, /* for output usage */ | |
| PIXFMT_PSEUDOCOLOR = 0x200, | |
| }; | |
| static inline int pixfmt_to_stride(int pix_fmt) | |
| { | |
| switch (pix_fmt) { | |
| case PIXFMT_RGB565: | |
| case PIXFMT_BGR565: | |
| case PIXFMT_RGB1555: | |
| case PIXFMT_BGR1555: | |
| case PIXFMT_UYVY: | |
| case PIXFMT_VYUY: | |
| case PIXFMT_YUYV: | |
| return 2; | |
| case PIXFMT_RGB888UNPACK: | |
| case PIXFMT_BGR888UNPACK: | |
| case PIXFMT_RGBA888: | |
| case PIXFMT_BGRA888: | |
| return 4; | |
| case PIXFMT_RGB888PACK: | |
| case PIXFMT_BGR888PACK: | |
| return 3; | |
| case PIXFMT_YUV422P: | |
| case PIXFMT_YVU422P: | |
| case PIXFMT_YUV420P: | |
| case PIXFMT_YVU420P: | |
| case PIXFMT_PSEUDOCOLOR: | |
| return 1; | |
| default: | |
| return 0; | |
| } | |
| } | |
| /* parameters used by path/overlay */ | |
| /* overlay related para: win/addr */ | |
| struct mmp_win { | |
| /* position/size of window */ | |
| u16 xsrc; | |
| u16 ysrc; | |
| u16 xdst; | |
| u16 ydst; | |
| u16 xpos; | |
| u16 ypos; | |
| u16 left_crop; | |
| u16 right_crop; | |
| u16 up_crop; | |
| u16 bottom_crop; | |
| int pix_fmt; | |
| /* | |
| * pitch[0]: graphics/video layer line length or y pitch | |
| * pitch[1]/pitch[2]: video u/v pitch if non-zero | |
| */ | |
| u32 pitch[3]; | |
| }; | |
| struct mmp_addr { | |
| /* phys address */ | |
| u32 phys[6]; | |
| }; | |
| /* path related para: mode */ | |
| struct mmp_mode { | |
| const char *name; | |
| u32 refresh; | |
| u32 xres; | |
| u32 yres; | |
| u32 left_margin; | |
| u32 right_margin; | |
| u32 upper_margin; | |
| u32 lower_margin; | |
| u32 hsync_len; | |
| u32 vsync_len; | |
| u32 hsync_invert; | |
| u32 vsync_invert; | |
| u32 invert_pixclock; | |
| u32 pixclock_freq; | |
| int pix_fmt_out; | |
| }; | |
| /* main structures */ | |
| struct mmp_path; | |
| struct mmp_overlay; | |
| struct mmp_panel; | |
| /* status types */ | |
| enum { | |
| MMP_OFF = 0, | |
| MMP_ON, | |
| }; | |
| static inline const char *stat_name(int stat) | |
| { | |
| switch (stat) { | |
| case MMP_OFF: | |
| return "OFF"; | |
| case MMP_ON: | |
| return "ON"; | |
| default: | |
| return "UNKNOWNSTAT"; | |
| } | |
| } | |
| struct mmp_overlay_ops { | |
| /* should be provided by driver */ | |
| void (*set_fetch)(struct mmp_overlay *overlay, int fetch_id); | |
| void (*set_onoff)(struct mmp_overlay *overlay, int status); | |
| void (*set_win)(struct mmp_overlay *overlay, struct mmp_win *win); | |
| int (*set_addr)(struct mmp_overlay *overlay, struct mmp_addr *addr); | |
| }; | |
| /* overlay describes a z-order indexed slot in each path. */ | |
| struct mmp_overlay { | |
| int id; | |
| const char *name; | |
| struct mmp_path *path; | |
| /* overlay info: private data */ | |
| int dmafetch_id; | |
| struct mmp_addr addr; | |
| struct mmp_win win; | |
| /* state */ | |
| int open_count; | |
| int status; | |
| struct mutex access_ok; | |
| struct mmp_overlay_ops *ops; | |
| }; | |
| /* panel type */ | |
| enum { | |
| PANELTYPE_ACTIVE = 0, | |
| PANELTYPE_SMART, | |
| PANELTYPE_TV, | |
| PANELTYPE_DSI_CMD, | |
| PANELTYPE_DSI_VIDEO, | |
| }; | |
| struct mmp_panel { | |
| /* use node to register to list */ | |
| struct list_head node; | |
| const char *name; | |
| /* path name used to connect to proper path configed */ | |
| const char *plat_path_name; | |
| struct device *dev; | |
| int panel_type; | |
| void *plat_data; | |
| int (*get_modelist)(struct mmp_panel *panel, | |
| struct mmp_mode **modelist); | |
| void (*set_mode)(struct mmp_panel *panel, | |
| struct mmp_mode *mode); | |
| void (*set_onoff)(struct mmp_panel *panel, | |
| int status); | |
| }; | |
| struct mmp_path_ops { | |
| int (*check_status)(struct mmp_path *path); | |
| struct mmp_overlay *(*get_overlay)(struct mmp_path *path, | |
| int overlay_id); | |
| int (*get_modelist)(struct mmp_path *path, | |
| struct mmp_mode **modelist); | |
| /* follow ops should be provided by driver */ | |
| void (*set_mode)(struct mmp_path *path, struct mmp_mode *mode); | |
| void (*set_onoff)(struct mmp_path *path, int status); | |
| /* todo: add query */ | |
| }; | |
| /* path output types */ | |
| enum { | |
| PATH_OUT_PARALLEL, | |
| PATH_OUT_DSI, | |
| PATH_OUT_HDMI, | |
| }; | |
| /* path is main part of mmp-disp */ | |
| struct mmp_path { | |
| /* use node to register to list */ | |
| struct list_head node; | |
| /* init data */ | |
| struct device *dev; | |
| int id; | |
| const char *name; | |
| int output_type; | |
| struct mmp_panel *panel; | |
| void *plat_data; | |
| /* dynamic use */ | |
| struct mmp_mode mode; | |
| /* state */ | |
| int open_count; | |
| int status; | |
| struct mutex access_ok; | |
| struct mmp_path_ops ops; | |
| /* layers */ | |
| int overlay_num; | |
| struct mmp_overlay overlays[0]; | |
| }; | |
| extern struct mmp_path *mmp_get_path(const char *name); | |
| static inline void mmp_path_set_mode(struct mmp_path *path, | |
| struct mmp_mode *mode) | |
| { | |
| if (path) | |
| path->ops.set_mode(path, mode); | |
| } | |
| static inline void mmp_path_set_onoff(struct mmp_path *path, int status) | |
| { | |
| if (path) | |
| path->ops.set_onoff(path, status); | |
| } | |
| static inline int mmp_path_get_modelist(struct mmp_path *path, | |
| struct mmp_mode **modelist) | |
| { | |
| if (path) | |
| return path->ops.get_modelist(path, modelist); | |
| return 0; | |
| } | |
| static inline struct mmp_overlay *mmp_path_get_overlay( | |
| struct mmp_path *path, int overlay_id) | |
| { | |
| if (path) | |
| return path->ops.get_overlay(path, overlay_id); | |
| return NULL; | |
| } | |
| static inline void mmp_overlay_set_fetch(struct mmp_overlay *overlay, | |
| int fetch_id) | |
| { | |
| if (overlay) | |
| overlay->ops->set_fetch(overlay, fetch_id); | |
| } | |
| static inline void mmp_overlay_set_onoff(struct mmp_overlay *overlay, | |
| int status) | |
| { | |
| if (overlay) | |
| overlay->ops->set_onoff(overlay, status); | |
| } | |
| static inline void mmp_overlay_set_win(struct mmp_overlay *overlay, | |
| struct mmp_win *win) | |
| { | |
| if (overlay) | |
| overlay->ops->set_win(overlay, win); | |
| } | |
| static inline int mmp_overlay_set_addr(struct mmp_overlay *overlay, | |
| struct mmp_addr *addr) | |
| { | |
| if (overlay) | |
| return overlay->ops->set_addr(overlay, addr); | |
| return 0; | |
| } | |
| /* | |
| * driver data is set from each detailed ctrl driver for path usage | |
| * it defined a common interface that plat driver need to implement | |
| */ | |
| struct mmp_path_info { | |
| /* driver data, set when registed*/ | |
| const char *name; | |
| struct device *dev; | |
| int id; | |
| int output_type; | |
| int overlay_num; | |
| void (*set_mode)(struct mmp_path *path, struct mmp_mode *mode); | |
| void (*set_onoff)(struct mmp_path *path, int status); | |
| struct mmp_overlay_ops *overlay_ops; | |
| void *plat_data; | |
| }; | |
| extern struct mmp_path *mmp_register_path( | |
| struct mmp_path_info *info); | |
| extern void mmp_unregister_path(struct mmp_path *path); | |
| extern void mmp_register_panel(struct mmp_panel *panel); | |
| extern void mmp_unregister_panel(struct mmp_panel *panel); | |
| /* defintions for platform data */ | |
| /* interface for buffer driver */ | |
| struct mmp_buffer_driver_mach_info { | |
| const char *name; | |
| const char *path_name; | |
| int overlay_id; | |
| int dmafetch_id; | |
| int default_pixfmt; | |
| }; | |
| /* interface for controllers driver */ | |
| struct mmp_mach_path_config { | |
| const char *name; | |
| int overlay_num; | |
| int output_type; | |
| u32 path_config; | |
| u32 link_config; | |
| u32 dsi_rbswap; | |
| }; | |
| struct mmp_mach_plat_info { | |
| const char *name; | |
| const char *clk_name; | |
| int path_num; | |
| struct mmp_mach_path_config *paths; | |
| }; | |
| /* interface for panel drivers */ | |
| struct mmp_mach_panel_info { | |
| const char *name; | |
| void (*plat_set_onoff)(int status); | |
| const char *plat_path_name; | |
| }; | |
| #endif /* _MMP_DISP_H_ */ |