xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/omapdrm/dss/omapdss.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) 2016 Texas Instruments Incorporated - http://www.ti.com/
4*4882a593Smuzhiyun  * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #ifndef __OMAP_DRM_DSS_H
8*4882a593Smuzhiyun #define __OMAP_DRM_DSS_H
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/list.h>
11*4882a593Smuzhiyun #include <linux/device.h>
12*4882a593Smuzhiyun #include <linux/interrupt.h>
13*4882a593Smuzhiyun #include <video/videomode.h>
14*4882a593Smuzhiyun #include <linux/platform_data/omapdss.h>
15*4882a593Smuzhiyun #include <uapi/drm/drm_mode.h>
16*4882a593Smuzhiyun #include <drm/drm_crtc.h>
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define DISPC_IRQ_FRAMEDONE		(1 << 0)
19*4882a593Smuzhiyun #define DISPC_IRQ_VSYNC			(1 << 1)
20*4882a593Smuzhiyun #define DISPC_IRQ_EVSYNC_EVEN		(1 << 2)
21*4882a593Smuzhiyun #define DISPC_IRQ_EVSYNC_ODD		(1 << 3)
22*4882a593Smuzhiyun #define DISPC_IRQ_ACBIAS_COUNT_STAT	(1 << 4)
23*4882a593Smuzhiyun #define DISPC_IRQ_PROG_LINE_NUM		(1 << 5)
24*4882a593Smuzhiyun #define DISPC_IRQ_GFX_FIFO_UNDERFLOW	(1 << 6)
25*4882a593Smuzhiyun #define DISPC_IRQ_GFX_END_WIN		(1 << 7)
26*4882a593Smuzhiyun #define DISPC_IRQ_PAL_GAMMA_MASK	(1 << 8)
27*4882a593Smuzhiyun #define DISPC_IRQ_OCP_ERR		(1 << 9)
28*4882a593Smuzhiyun #define DISPC_IRQ_VID1_FIFO_UNDERFLOW	(1 << 10)
29*4882a593Smuzhiyun #define DISPC_IRQ_VID1_END_WIN		(1 << 11)
30*4882a593Smuzhiyun #define DISPC_IRQ_VID2_FIFO_UNDERFLOW	(1 << 12)
31*4882a593Smuzhiyun #define DISPC_IRQ_VID2_END_WIN		(1 << 13)
32*4882a593Smuzhiyun #define DISPC_IRQ_SYNC_LOST		(1 << 14)
33*4882a593Smuzhiyun #define DISPC_IRQ_SYNC_LOST_DIGIT	(1 << 15)
34*4882a593Smuzhiyun #define DISPC_IRQ_WAKEUP		(1 << 16)
35*4882a593Smuzhiyun #define DISPC_IRQ_SYNC_LOST2		(1 << 17)
36*4882a593Smuzhiyun #define DISPC_IRQ_VSYNC2		(1 << 18)
37*4882a593Smuzhiyun #define DISPC_IRQ_VID3_END_WIN		(1 << 19)
38*4882a593Smuzhiyun #define DISPC_IRQ_VID3_FIFO_UNDERFLOW	(1 << 20)
39*4882a593Smuzhiyun #define DISPC_IRQ_ACBIAS_COUNT_STAT2	(1 << 21)
40*4882a593Smuzhiyun #define DISPC_IRQ_FRAMEDONE2		(1 << 22)
41*4882a593Smuzhiyun #define DISPC_IRQ_FRAMEDONEWB		(1 << 23)
42*4882a593Smuzhiyun #define DISPC_IRQ_FRAMEDONETV		(1 << 24)
43*4882a593Smuzhiyun #define DISPC_IRQ_WBBUFFEROVERFLOW	(1 << 25)
44*4882a593Smuzhiyun #define DISPC_IRQ_WBUNCOMPLETEERROR	(1 << 26)
45*4882a593Smuzhiyun #define DISPC_IRQ_SYNC_LOST3		(1 << 27)
46*4882a593Smuzhiyun #define DISPC_IRQ_VSYNC3		(1 << 28)
47*4882a593Smuzhiyun #define DISPC_IRQ_ACBIAS_COUNT_STAT3	(1 << 29)
48*4882a593Smuzhiyun #define DISPC_IRQ_FRAMEDONE3		(1 << 30)
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun struct dss_device;
51*4882a593Smuzhiyun struct omap_drm_private;
52*4882a593Smuzhiyun struct omap_dss_device;
53*4882a593Smuzhiyun struct dispc_device;
54*4882a593Smuzhiyun struct dss_device;
55*4882a593Smuzhiyun struct dss_lcd_mgr_config;
56*4882a593Smuzhiyun struct snd_aes_iec958;
57*4882a593Smuzhiyun struct snd_cea_861_aud_if;
58*4882a593Smuzhiyun struct hdmi_avi_infoframe;
59*4882a593Smuzhiyun struct drm_connector;
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun enum omap_display_type {
62*4882a593Smuzhiyun 	OMAP_DISPLAY_TYPE_NONE		= 0,
63*4882a593Smuzhiyun 	OMAP_DISPLAY_TYPE_DPI		= 1 << 0,
64*4882a593Smuzhiyun 	OMAP_DISPLAY_TYPE_DBI		= 1 << 1,
65*4882a593Smuzhiyun 	OMAP_DISPLAY_TYPE_SDI		= 1 << 2,
66*4882a593Smuzhiyun 	OMAP_DISPLAY_TYPE_DSI		= 1 << 3,
67*4882a593Smuzhiyun 	OMAP_DISPLAY_TYPE_VENC		= 1 << 4,
68*4882a593Smuzhiyun 	OMAP_DISPLAY_TYPE_HDMI		= 1 << 5,
69*4882a593Smuzhiyun 	OMAP_DISPLAY_TYPE_DVI		= 1 << 6,
70*4882a593Smuzhiyun };
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun enum omap_plane_id {
73*4882a593Smuzhiyun 	OMAP_DSS_GFX	= 0,
74*4882a593Smuzhiyun 	OMAP_DSS_VIDEO1	= 1,
75*4882a593Smuzhiyun 	OMAP_DSS_VIDEO2	= 2,
76*4882a593Smuzhiyun 	OMAP_DSS_VIDEO3	= 3,
77*4882a593Smuzhiyun 	OMAP_DSS_WB	= 4,
78*4882a593Smuzhiyun };
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun enum omap_channel {
81*4882a593Smuzhiyun 	OMAP_DSS_CHANNEL_LCD	= 0,
82*4882a593Smuzhiyun 	OMAP_DSS_CHANNEL_DIGIT	= 1,
83*4882a593Smuzhiyun 	OMAP_DSS_CHANNEL_LCD2	= 2,
84*4882a593Smuzhiyun 	OMAP_DSS_CHANNEL_LCD3	= 3,
85*4882a593Smuzhiyun 	OMAP_DSS_CHANNEL_WB	= 4,
86*4882a593Smuzhiyun };
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun enum omap_color_mode {
89*4882a593Smuzhiyun 	_UNUSED_,
90*4882a593Smuzhiyun };
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun enum omap_dss_load_mode {
93*4882a593Smuzhiyun 	OMAP_DSS_LOAD_CLUT_AND_FRAME	= 0,
94*4882a593Smuzhiyun 	OMAP_DSS_LOAD_CLUT_ONLY		= 1,
95*4882a593Smuzhiyun 	OMAP_DSS_LOAD_FRAME_ONLY	= 2,
96*4882a593Smuzhiyun 	OMAP_DSS_LOAD_CLUT_ONCE_FRAME	= 3,
97*4882a593Smuzhiyun };
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun enum omap_dss_trans_key_type {
100*4882a593Smuzhiyun 	OMAP_DSS_COLOR_KEY_GFX_DST = 0,
101*4882a593Smuzhiyun 	OMAP_DSS_COLOR_KEY_VID_SRC = 1,
102*4882a593Smuzhiyun };
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun enum omap_dss_signal_level {
105*4882a593Smuzhiyun 	OMAPDSS_SIG_ACTIVE_LOW,
106*4882a593Smuzhiyun 	OMAPDSS_SIG_ACTIVE_HIGH,
107*4882a593Smuzhiyun };
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun enum omap_dss_signal_edge {
110*4882a593Smuzhiyun 	OMAPDSS_DRIVE_SIG_FALLING_EDGE,
111*4882a593Smuzhiyun 	OMAPDSS_DRIVE_SIG_RISING_EDGE,
112*4882a593Smuzhiyun };
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun enum omap_dss_venc_type {
115*4882a593Smuzhiyun 	OMAP_DSS_VENC_TYPE_COMPOSITE,
116*4882a593Smuzhiyun 	OMAP_DSS_VENC_TYPE_SVIDEO,
117*4882a593Smuzhiyun };
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun enum omap_dss_dsi_pixel_format {
120*4882a593Smuzhiyun 	OMAP_DSS_DSI_FMT_RGB888,
121*4882a593Smuzhiyun 	OMAP_DSS_DSI_FMT_RGB666,
122*4882a593Smuzhiyun 	OMAP_DSS_DSI_FMT_RGB666_PACKED,
123*4882a593Smuzhiyun 	OMAP_DSS_DSI_FMT_RGB565,
124*4882a593Smuzhiyun };
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun enum omap_dss_dsi_mode {
127*4882a593Smuzhiyun 	OMAP_DSS_DSI_CMD_MODE = 0,
128*4882a593Smuzhiyun 	OMAP_DSS_DSI_VIDEO_MODE,
129*4882a593Smuzhiyun };
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun enum omap_display_caps {
132*4882a593Smuzhiyun 	OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE	= 1 << 0,
133*4882a593Smuzhiyun 	OMAP_DSS_DISPLAY_CAP_TEAR_ELIM		= 1 << 1,
134*4882a593Smuzhiyun };
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun enum omap_dss_display_state {
137*4882a593Smuzhiyun 	OMAP_DSS_DISPLAY_DISABLED = 0,
138*4882a593Smuzhiyun 	OMAP_DSS_DISPLAY_ACTIVE,
139*4882a593Smuzhiyun };
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun enum omap_dss_rotation_type {
142*4882a593Smuzhiyun 	OMAP_DSS_ROT_NONE	= 0,
143*4882a593Smuzhiyun 	OMAP_DSS_ROT_TILER	= 1 << 0,
144*4882a593Smuzhiyun };
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun enum omap_overlay_caps {
147*4882a593Smuzhiyun 	OMAP_DSS_OVL_CAP_SCALE = 1 << 0,
148*4882a593Smuzhiyun 	OMAP_DSS_OVL_CAP_GLOBAL_ALPHA = 1 << 1,
149*4882a593Smuzhiyun 	OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA = 1 << 2,
150*4882a593Smuzhiyun 	OMAP_DSS_OVL_CAP_ZORDER = 1 << 3,
151*4882a593Smuzhiyun 	OMAP_DSS_OVL_CAP_POS = 1 << 4,
152*4882a593Smuzhiyun 	OMAP_DSS_OVL_CAP_REPLICATION = 1 << 5,
153*4882a593Smuzhiyun };
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun enum omap_dss_output_id {
156*4882a593Smuzhiyun 	OMAP_DSS_OUTPUT_DPI	= 1 << 0,
157*4882a593Smuzhiyun 	OMAP_DSS_OUTPUT_DBI	= 1 << 1,
158*4882a593Smuzhiyun 	OMAP_DSS_OUTPUT_SDI	= 1 << 2,
159*4882a593Smuzhiyun 	OMAP_DSS_OUTPUT_DSI1	= 1 << 3,
160*4882a593Smuzhiyun 	OMAP_DSS_OUTPUT_DSI2	= 1 << 4,
161*4882a593Smuzhiyun 	OMAP_DSS_OUTPUT_VENC	= 1 << 5,
162*4882a593Smuzhiyun 	OMAP_DSS_OUTPUT_HDMI	= 1 << 6,
163*4882a593Smuzhiyun };
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun /* DSI */
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun enum omap_dss_dsi_trans_mode {
168*4882a593Smuzhiyun 	/* Sync Pulses: both sync start and end packets sent */
169*4882a593Smuzhiyun 	OMAP_DSS_DSI_PULSE_MODE,
170*4882a593Smuzhiyun 	/* Sync Events: only sync start packets sent */
171*4882a593Smuzhiyun 	OMAP_DSS_DSI_EVENT_MODE,
172*4882a593Smuzhiyun 	/* Burst: only sync start packets sent, pixels are time compressed */
173*4882a593Smuzhiyun 	OMAP_DSS_DSI_BURST_MODE,
174*4882a593Smuzhiyun };
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun struct omap_dss_dsi_videomode_timings {
177*4882a593Smuzhiyun 	unsigned long hsclk;
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun 	unsigned int ndl;
180*4882a593Smuzhiyun 	unsigned int bitspp;
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun 	/* pixels */
183*4882a593Smuzhiyun 	u16 hact;
184*4882a593Smuzhiyun 	/* lines */
185*4882a593Smuzhiyun 	u16 vact;
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 	/* DSI video mode blanking data */
188*4882a593Smuzhiyun 	/* Unit: byte clock cycles */
189*4882a593Smuzhiyun 	u16 hss;
190*4882a593Smuzhiyun 	u16 hsa;
191*4882a593Smuzhiyun 	u16 hse;
192*4882a593Smuzhiyun 	u16 hfp;
193*4882a593Smuzhiyun 	u16 hbp;
194*4882a593Smuzhiyun 	/* Unit: line clocks */
195*4882a593Smuzhiyun 	u16 vsa;
196*4882a593Smuzhiyun 	u16 vfp;
197*4882a593Smuzhiyun 	u16 vbp;
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	/* DSI blanking modes */
200*4882a593Smuzhiyun 	int blanking_mode;
201*4882a593Smuzhiyun 	int hsa_blanking_mode;
202*4882a593Smuzhiyun 	int hbp_blanking_mode;
203*4882a593Smuzhiyun 	int hfp_blanking_mode;
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun 	enum omap_dss_dsi_trans_mode trans_mode;
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun 	bool ddr_clk_always_on;
208*4882a593Smuzhiyun 	int window_sync;
209*4882a593Smuzhiyun };
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun struct omap_dss_dsi_config {
212*4882a593Smuzhiyun 	enum omap_dss_dsi_mode mode;
213*4882a593Smuzhiyun 	enum omap_dss_dsi_pixel_format pixel_format;
214*4882a593Smuzhiyun 	const struct videomode *vm;
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun 	unsigned long hs_clk_min, hs_clk_max;
217*4882a593Smuzhiyun 	unsigned long lp_clk_min, lp_clk_max;
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun 	bool ddr_clk_always_on;
220*4882a593Smuzhiyun 	enum omap_dss_dsi_trans_mode trans_mode;
221*4882a593Smuzhiyun };
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun struct omap_dss_cpr_coefs {
224*4882a593Smuzhiyun 	s16 rr, rg, rb;
225*4882a593Smuzhiyun 	s16 gr, gg, gb;
226*4882a593Smuzhiyun 	s16 br, bg, bb;
227*4882a593Smuzhiyun };
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun struct omap_overlay_info {
230*4882a593Smuzhiyun 	dma_addr_t paddr;
231*4882a593Smuzhiyun 	dma_addr_t p_uv_addr;  /* for NV12 format */
232*4882a593Smuzhiyun 	u16 screen_width;
233*4882a593Smuzhiyun 	u16 width;
234*4882a593Smuzhiyun 	u16 height;
235*4882a593Smuzhiyun 	u32 fourcc;
236*4882a593Smuzhiyun 	u8 rotation;
237*4882a593Smuzhiyun 	enum omap_dss_rotation_type rotation_type;
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun 	u16 pos_x;
240*4882a593Smuzhiyun 	u16 pos_y;
241*4882a593Smuzhiyun 	u16 out_width;	/* if 0, out_width == width */
242*4882a593Smuzhiyun 	u16 out_height;	/* if 0, out_height == height */
243*4882a593Smuzhiyun 	u8 global_alpha;
244*4882a593Smuzhiyun 	u8 pre_mult_alpha;
245*4882a593Smuzhiyun 	u8 zorder;
246*4882a593Smuzhiyun };
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun struct omap_overlay_manager_info {
249*4882a593Smuzhiyun 	u32 default_color;
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun 	enum omap_dss_trans_key_type trans_key_type;
252*4882a593Smuzhiyun 	u32 trans_key;
253*4882a593Smuzhiyun 	bool trans_enabled;
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun 	bool partial_alpha_enabled;
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 	bool cpr_enable;
258*4882a593Smuzhiyun 	struct omap_dss_cpr_coefs cpr_coefs;
259*4882a593Smuzhiyun };
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun /* 22 pins means 1 clk lane and 10 data lanes */
262*4882a593Smuzhiyun #define OMAP_DSS_MAX_DSI_PINS 22
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun struct omap_dsi_pin_config {
265*4882a593Smuzhiyun 	int num_pins;
266*4882a593Smuzhiyun 	/*
267*4882a593Smuzhiyun 	 * pin numbers in the following order:
268*4882a593Smuzhiyun 	 * clk+, clk-
269*4882a593Smuzhiyun 	 * data1+, data1-
270*4882a593Smuzhiyun 	 * data2+, data2-
271*4882a593Smuzhiyun 	 * ...
272*4882a593Smuzhiyun 	 */
273*4882a593Smuzhiyun 	int pins[OMAP_DSS_MAX_DSI_PINS];
274*4882a593Smuzhiyun };
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun struct omap_dss_writeback_info {
277*4882a593Smuzhiyun 	u32 paddr;
278*4882a593Smuzhiyun 	u32 p_uv_addr;
279*4882a593Smuzhiyun 	u16 buf_width;
280*4882a593Smuzhiyun 	u16 width;
281*4882a593Smuzhiyun 	u16 height;
282*4882a593Smuzhiyun 	u32 fourcc;
283*4882a593Smuzhiyun 	u8 rotation;
284*4882a593Smuzhiyun 	enum omap_dss_rotation_type rotation_type;
285*4882a593Smuzhiyun 	u8 pre_mult_alpha;
286*4882a593Smuzhiyun };
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun struct omapdss_dsi_ops {
289*4882a593Smuzhiyun 	void (*disable)(struct omap_dss_device *dssdev, bool disconnect_lanes,
290*4882a593Smuzhiyun 			bool enter_ulps);
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	/* bus configuration */
293*4882a593Smuzhiyun 	int (*set_config)(struct omap_dss_device *dssdev,
294*4882a593Smuzhiyun 			const struct omap_dss_dsi_config *cfg);
295*4882a593Smuzhiyun 	int (*configure_pins)(struct omap_dss_device *dssdev,
296*4882a593Smuzhiyun 			const struct omap_dsi_pin_config *pin_cfg);
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 	void (*enable_hs)(struct omap_dss_device *dssdev, int channel,
299*4882a593Smuzhiyun 			bool enable);
300*4882a593Smuzhiyun 	int (*enable_te)(struct omap_dss_device *dssdev, bool enable);
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 	int (*update)(struct omap_dss_device *dssdev, int channel,
303*4882a593Smuzhiyun 			void (*callback)(int, void *), void *data);
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun 	void (*bus_lock)(struct omap_dss_device *dssdev);
306*4882a593Smuzhiyun 	void (*bus_unlock)(struct omap_dss_device *dssdev);
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun 	int (*enable_video_output)(struct omap_dss_device *dssdev, int channel);
309*4882a593Smuzhiyun 	void (*disable_video_output)(struct omap_dss_device *dssdev,
310*4882a593Smuzhiyun 			int channel);
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun 	int (*request_vc)(struct omap_dss_device *dssdev, int *channel);
313*4882a593Smuzhiyun 	int (*set_vc_id)(struct omap_dss_device *dssdev, int channel,
314*4882a593Smuzhiyun 			int vc_id);
315*4882a593Smuzhiyun 	void (*release_vc)(struct omap_dss_device *dssdev, int channel);
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun 	/* data transfer */
318*4882a593Smuzhiyun 	int (*dcs_write)(struct omap_dss_device *dssdev, int channel,
319*4882a593Smuzhiyun 			u8 *data, int len);
320*4882a593Smuzhiyun 	int (*dcs_write_nosync)(struct omap_dss_device *dssdev, int channel,
321*4882a593Smuzhiyun 			u8 *data, int len);
322*4882a593Smuzhiyun 	int (*dcs_read)(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd,
323*4882a593Smuzhiyun 			u8 *data, int len);
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun 	int (*gen_write)(struct omap_dss_device *dssdev, int channel,
326*4882a593Smuzhiyun 			u8 *data, int len);
327*4882a593Smuzhiyun 	int (*gen_write_nosync)(struct omap_dss_device *dssdev, int channel,
328*4882a593Smuzhiyun 			u8 *data, int len);
329*4882a593Smuzhiyun 	int (*gen_read)(struct omap_dss_device *dssdev, int channel,
330*4882a593Smuzhiyun 			u8 *reqdata, int reqlen,
331*4882a593Smuzhiyun 			u8 *data, int len);
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun 	int (*bta_sync)(struct omap_dss_device *dssdev, int channel);
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun 	int (*set_max_rx_packet_size)(struct omap_dss_device *dssdev,
336*4882a593Smuzhiyun 			int channel, u16 plen);
337*4882a593Smuzhiyun };
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun struct omap_dss_device_ops {
340*4882a593Smuzhiyun 	int (*connect)(struct omap_dss_device *dssdev,
341*4882a593Smuzhiyun 			struct omap_dss_device *dst);
342*4882a593Smuzhiyun 	void (*disconnect)(struct omap_dss_device *dssdev,
343*4882a593Smuzhiyun 			struct omap_dss_device *dst);
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun 	void (*enable)(struct omap_dss_device *dssdev);
346*4882a593Smuzhiyun 	void (*disable)(struct omap_dss_device *dssdev);
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun 	int (*check_timings)(struct omap_dss_device *dssdev,
349*4882a593Smuzhiyun 			     struct drm_display_mode *mode);
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun 	int (*get_modes)(struct omap_dss_device *dssdev,
352*4882a593Smuzhiyun 			 struct drm_connector *connector);
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun 	const struct omapdss_dsi_ops dsi;
355*4882a593Smuzhiyun };
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun /**
358*4882a593Smuzhiyun  * enum omap_dss_device_ops_flag - Indicates which device ops are supported
359*4882a593Smuzhiyun  * @OMAP_DSS_DEVICE_OP_MODES: The device supports reading modes
360*4882a593Smuzhiyun  */
361*4882a593Smuzhiyun enum omap_dss_device_ops_flag {
362*4882a593Smuzhiyun 	OMAP_DSS_DEVICE_OP_MODES = BIT(3),
363*4882a593Smuzhiyun };
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun struct omap_dss_device {
366*4882a593Smuzhiyun 	struct device *dev;
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun 	struct module *owner;
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun 	struct dss_device *dss;
371*4882a593Smuzhiyun 	struct omap_dss_device *next;
372*4882a593Smuzhiyun 	struct drm_bridge *bridge;
373*4882a593Smuzhiyun 	struct drm_bridge *next_bridge;
374*4882a593Smuzhiyun 	struct drm_panel *panel;
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 	struct list_head list;
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun 	/*
379*4882a593Smuzhiyun 	 * DSS type that this device generates (for DSS internal devices) or
380*4882a593Smuzhiyun 	 * requires (for external encoders, connectors and panels). Must be a
381*4882a593Smuzhiyun 	 * non-zero (different than OMAP_DISPLAY_TYPE_NONE) value.
382*4882a593Smuzhiyun 	 */
383*4882a593Smuzhiyun 	enum omap_display_type type;
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun 	/*
386*4882a593Smuzhiyun 	 * True if the device is a display (panel or connector) at the end of
387*4882a593Smuzhiyun 	 * the pipeline, false otherwise.
388*4882a593Smuzhiyun 	 */
389*4882a593Smuzhiyun 	bool display;
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun 	const char *name;
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun 	const struct omap_dss_driver *driver;
394*4882a593Smuzhiyun 	const struct omap_dss_device_ops *ops;
395*4882a593Smuzhiyun 	unsigned long ops_flags;
396*4882a593Smuzhiyun 	u32 bus_flags;
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun 	enum omap_display_caps caps;
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun 	enum omap_dss_display_state state;
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun 	/* OMAP DSS output specific fields */
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun 	/* DISPC channel for this output */
405*4882a593Smuzhiyun 	enum omap_channel dispc_channel;
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun 	/* output instance */
408*4882a593Smuzhiyun 	enum omap_dss_output_id id;
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun 	/* port number in DT */
411*4882a593Smuzhiyun 	unsigned int of_port;
412*4882a593Smuzhiyun };
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun struct omap_dss_driver {
415*4882a593Smuzhiyun 	int (*update)(struct omap_dss_device *dssdev,
416*4882a593Smuzhiyun 			       u16 x, u16 y, u16 w, u16 h);
417*4882a593Smuzhiyun 	int (*sync)(struct omap_dss_device *dssdev);
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 	int (*enable_te)(struct omap_dss_device *dssdev, bool enable);
420*4882a593Smuzhiyun 	int (*get_te)(struct omap_dss_device *dssdev);
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun 	int (*memory_read)(struct omap_dss_device *dssdev,
423*4882a593Smuzhiyun 			void *buf, size_t size,
424*4882a593Smuzhiyun 			u16 x, u16 y, u16 w, u16 h);
425*4882a593Smuzhiyun };
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun struct dss_device *omapdss_get_dss(void);
428*4882a593Smuzhiyun void omapdss_set_dss(struct dss_device *dss);
omapdss_is_initialized(void)429*4882a593Smuzhiyun static inline bool omapdss_is_initialized(void)
430*4882a593Smuzhiyun {
431*4882a593Smuzhiyun 	return !!omapdss_get_dss();
432*4882a593Smuzhiyun }
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun void omapdss_display_init(struct omap_dss_device *dssdev);
435*4882a593Smuzhiyun int omapdss_display_get_modes(struct drm_connector *connector,
436*4882a593Smuzhiyun 			      const struct videomode *vm);
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun void omapdss_device_register(struct omap_dss_device *dssdev);
439*4882a593Smuzhiyun void omapdss_device_unregister(struct omap_dss_device *dssdev);
440*4882a593Smuzhiyun struct omap_dss_device *omapdss_device_get(struct omap_dss_device *dssdev);
441*4882a593Smuzhiyun void omapdss_device_put(struct omap_dss_device *dssdev);
442*4882a593Smuzhiyun struct omap_dss_device *omapdss_find_device_by_node(struct device_node *node);
443*4882a593Smuzhiyun int omapdss_device_connect(struct dss_device *dss,
444*4882a593Smuzhiyun 			   struct omap_dss_device *src,
445*4882a593Smuzhiyun 			   struct omap_dss_device *dst);
446*4882a593Smuzhiyun void omapdss_device_disconnect(struct omap_dss_device *src,
447*4882a593Smuzhiyun 			       struct omap_dss_device *dst);
448*4882a593Smuzhiyun void omapdss_device_enable(struct omap_dss_device *dssdev);
449*4882a593Smuzhiyun void omapdss_device_disable(struct omap_dss_device *dssdev);
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun int omap_dss_get_num_overlay_managers(void);
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun int omap_dss_get_num_overlays(void);
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun #define for_each_dss_output(d) \
456*4882a593Smuzhiyun 	while ((d = omapdss_device_next_output(d)) != NULL)
457*4882a593Smuzhiyun struct omap_dss_device *omapdss_device_next_output(struct omap_dss_device *from);
458*4882a593Smuzhiyun int omapdss_device_init_output(struct omap_dss_device *out,
459*4882a593Smuzhiyun 			       struct drm_bridge *local_bridge);
460*4882a593Smuzhiyun void omapdss_device_cleanup_output(struct omap_dss_device *out);
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun typedef void (*omap_dispc_isr_t) (void *arg, u32 mask);
463*4882a593Smuzhiyun int omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask);
464*4882a593Smuzhiyun int omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask);
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun int omapdss_compat_init(void);
467*4882a593Smuzhiyun void omapdss_compat_uninit(void);
468*4882a593Smuzhiyun 
omapdss_device_is_enabled(struct omap_dss_device * dssdev)469*4882a593Smuzhiyun static inline bool omapdss_device_is_enabled(struct omap_dss_device *dssdev)
470*4882a593Smuzhiyun {
471*4882a593Smuzhiyun 	return dssdev->state == OMAP_DSS_DISPLAY_ACTIVE;
472*4882a593Smuzhiyun }
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun enum dss_writeback_channel {
475*4882a593Smuzhiyun 	DSS_WB_LCD1_MGR =	0,
476*4882a593Smuzhiyun 	DSS_WB_LCD2_MGR =	1,
477*4882a593Smuzhiyun 	DSS_WB_TV_MGR =		2,
478*4882a593Smuzhiyun 	DSS_WB_OVL0 =		3,
479*4882a593Smuzhiyun 	DSS_WB_OVL1 =		4,
480*4882a593Smuzhiyun 	DSS_WB_OVL2 =		5,
481*4882a593Smuzhiyun 	DSS_WB_OVL3 =		6,
482*4882a593Smuzhiyun 	DSS_WB_LCD3_MGR =	7,
483*4882a593Smuzhiyun };
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun struct dss_mgr_ops {
486*4882a593Smuzhiyun 	void (*start_update)(struct omap_drm_private *priv,
487*4882a593Smuzhiyun 			     enum omap_channel channel);
488*4882a593Smuzhiyun 	int (*enable)(struct omap_drm_private *priv,
489*4882a593Smuzhiyun 		      enum omap_channel channel);
490*4882a593Smuzhiyun 	void (*disable)(struct omap_drm_private *priv,
491*4882a593Smuzhiyun 			enum omap_channel channel);
492*4882a593Smuzhiyun 	void (*set_timings)(struct omap_drm_private *priv,
493*4882a593Smuzhiyun 			    enum omap_channel channel,
494*4882a593Smuzhiyun 			    const struct videomode *vm);
495*4882a593Smuzhiyun 	void (*set_lcd_config)(struct omap_drm_private *priv,
496*4882a593Smuzhiyun 			       enum omap_channel channel,
497*4882a593Smuzhiyun 			       const struct dss_lcd_mgr_config *config);
498*4882a593Smuzhiyun 	int (*register_framedone_handler)(struct omap_drm_private *priv,
499*4882a593Smuzhiyun 			enum omap_channel channel,
500*4882a593Smuzhiyun 			void (*handler)(void *), void *data);
501*4882a593Smuzhiyun 	void (*unregister_framedone_handler)(struct omap_drm_private *priv,
502*4882a593Smuzhiyun 			enum omap_channel channel,
503*4882a593Smuzhiyun 			void (*handler)(void *), void *data);
504*4882a593Smuzhiyun };
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun int dss_install_mgr_ops(struct dss_device *dss,
507*4882a593Smuzhiyun 			const struct dss_mgr_ops *mgr_ops,
508*4882a593Smuzhiyun 			struct omap_drm_private *priv);
509*4882a593Smuzhiyun void dss_uninstall_mgr_ops(struct dss_device *dss);
510*4882a593Smuzhiyun 
511*4882a593Smuzhiyun void dss_mgr_set_timings(struct omap_dss_device *dssdev,
512*4882a593Smuzhiyun 		const struct videomode *vm);
513*4882a593Smuzhiyun void dss_mgr_set_lcd_config(struct omap_dss_device *dssdev,
514*4882a593Smuzhiyun 		const struct dss_lcd_mgr_config *config);
515*4882a593Smuzhiyun int dss_mgr_enable(struct omap_dss_device *dssdev);
516*4882a593Smuzhiyun void dss_mgr_disable(struct omap_dss_device *dssdev);
517*4882a593Smuzhiyun void dss_mgr_start_update(struct omap_dss_device *dssdev);
518*4882a593Smuzhiyun int dss_mgr_register_framedone_handler(struct omap_dss_device *dssdev,
519*4882a593Smuzhiyun 		void (*handler)(void *), void *data);
520*4882a593Smuzhiyun void dss_mgr_unregister_framedone_handler(struct omap_dss_device *dssdev,
521*4882a593Smuzhiyun 		void (*handler)(void *), void *data);
522*4882a593Smuzhiyun 
523*4882a593Smuzhiyun /* dispc ops */
524*4882a593Smuzhiyun 
525*4882a593Smuzhiyun struct dispc_ops {
526*4882a593Smuzhiyun 	u32 (*read_irqstatus)(struct dispc_device *dispc);
527*4882a593Smuzhiyun 	void (*clear_irqstatus)(struct dispc_device *dispc, u32 mask);
528*4882a593Smuzhiyun 	void (*write_irqenable)(struct dispc_device *dispc, u32 mask);
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun 	int (*request_irq)(struct dispc_device *dispc, irq_handler_t handler,
531*4882a593Smuzhiyun 			   void *dev_id);
532*4882a593Smuzhiyun 	void (*free_irq)(struct dispc_device *dispc, void *dev_id);
533*4882a593Smuzhiyun 
534*4882a593Smuzhiyun 	int (*runtime_get)(struct dispc_device *dispc);
535*4882a593Smuzhiyun 	void (*runtime_put)(struct dispc_device *dispc);
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun 	int (*get_num_ovls)(struct dispc_device *dispc);
538*4882a593Smuzhiyun 	int (*get_num_mgrs)(struct dispc_device *dispc);
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun 	u32 (*get_memory_bandwidth_limit)(struct dispc_device *dispc);
541*4882a593Smuzhiyun 
542*4882a593Smuzhiyun 	void (*mgr_enable)(struct dispc_device *dispc,
543*4882a593Smuzhiyun 			   enum omap_channel channel, bool enable);
544*4882a593Smuzhiyun 	bool (*mgr_is_enabled)(struct dispc_device *dispc,
545*4882a593Smuzhiyun 			       enum omap_channel channel);
546*4882a593Smuzhiyun 	u32 (*mgr_get_vsync_irq)(struct dispc_device *dispc,
547*4882a593Smuzhiyun 				 enum omap_channel channel);
548*4882a593Smuzhiyun 	u32 (*mgr_get_framedone_irq)(struct dispc_device *dispc,
549*4882a593Smuzhiyun 				     enum omap_channel channel);
550*4882a593Smuzhiyun 	u32 (*mgr_get_sync_lost_irq)(struct dispc_device *dispc,
551*4882a593Smuzhiyun 				     enum omap_channel channel);
552*4882a593Smuzhiyun 	bool (*mgr_go_busy)(struct dispc_device *dispc,
553*4882a593Smuzhiyun 			    enum omap_channel channel);
554*4882a593Smuzhiyun 	void (*mgr_go)(struct dispc_device *dispc, enum omap_channel channel);
555*4882a593Smuzhiyun 	void (*mgr_set_lcd_config)(struct dispc_device *dispc,
556*4882a593Smuzhiyun 				   enum omap_channel channel,
557*4882a593Smuzhiyun 				   const struct dss_lcd_mgr_config *config);
558*4882a593Smuzhiyun 	int (*mgr_check_timings)(struct dispc_device *dispc,
559*4882a593Smuzhiyun 				 enum omap_channel channel,
560*4882a593Smuzhiyun 				 const struct videomode *vm);
561*4882a593Smuzhiyun 	void (*mgr_set_timings)(struct dispc_device *dispc,
562*4882a593Smuzhiyun 				enum omap_channel channel,
563*4882a593Smuzhiyun 				const struct videomode *vm);
564*4882a593Smuzhiyun 	void (*mgr_setup)(struct dispc_device *dispc, enum omap_channel channel,
565*4882a593Smuzhiyun 			  const struct omap_overlay_manager_info *info);
566*4882a593Smuzhiyun 	u32 (*mgr_gamma_size)(struct dispc_device *dispc,
567*4882a593Smuzhiyun 			      enum omap_channel channel);
568*4882a593Smuzhiyun 	void (*mgr_set_gamma)(struct dispc_device *dispc,
569*4882a593Smuzhiyun 			      enum omap_channel channel,
570*4882a593Smuzhiyun 			      const struct drm_color_lut *lut,
571*4882a593Smuzhiyun 			      unsigned int length);
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun 	int (*ovl_enable)(struct dispc_device *dispc, enum omap_plane_id plane,
574*4882a593Smuzhiyun 			  bool enable);
575*4882a593Smuzhiyun 	int (*ovl_setup)(struct dispc_device *dispc, enum omap_plane_id plane,
576*4882a593Smuzhiyun 			 const struct omap_overlay_info *oi,
577*4882a593Smuzhiyun 			 const struct videomode *vm, bool mem_to_mem,
578*4882a593Smuzhiyun 			 enum omap_channel channel);
579*4882a593Smuzhiyun 
580*4882a593Smuzhiyun 	const u32 *(*ovl_get_color_modes)(struct dispc_device *dispc,
581*4882a593Smuzhiyun 					  enum omap_plane_id plane);
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun 	u32 (*wb_get_framedone_irq)(struct dispc_device *dispc);
584*4882a593Smuzhiyun 	int (*wb_setup)(struct dispc_device *dispc,
585*4882a593Smuzhiyun 		const struct omap_dss_writeback_info *wi,
586*4882a593Smuzhiyun 		bool mem_to_mem, const struct videomode *vm,
587*4882a593Smuzhiyun 		enum dss_writeback_channel channel_in);
588*4882a593Smuzhiyun 	bool (*has_writeback)(struct dispc_device *dispc);
589*4882a593Smuzhiyun 	bool (*wb_go_busy)(struct dispc_device *dispc);
590*4882a593Smuzhiyun 	void (*wb_go)(struct dispc_device *dispc);
591*4882a593Smuzhiyun };
592*4882a593Smuzhiyun 
593*4882a593Smuzhiyun struct dispc_device *dispc_get_dispc(struct dss_device *dss);
594*4882a593Smuzhiyun const struct dispc_ops *dispc_get_ops(struct dss_device *dss);
595*4882a593Smuzhiyun 
596*4882a593Smuzhiyun bool omapdss_stack_is_ready(void);
597*4882a593Smuzhiyun void omapdss_gather_components(struct device *dev);
598*4882a593Smuzhiyun 
599*4882a593Smuzhiyun #endif /* __OMAP_DRM_DSS_H */
600