brintos

brintos / linux-shallow public Read only

0
0
Text · 7.1 KiB · 41354bd Raw
346 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 * linux/include/video/mmp_disp.h4 * Header file for Marvell MMP Display Controller5 *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 pitch83	 * pitch[1]/pitch[2]: video u/v pitch if non-zero84	 */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	const 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[] __counted_by(overlay_num);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 usage291 * it defined a common interface that plat driver need to implement292 */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	const 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_ */346