123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359 |
- /*
- * 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_ */
|