xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/pl111/pl111_drm.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * (C) COPYRIGHT 2012-2013 ARM Limited. All rights reserved.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Parts of this file were based on sources as follows:
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * Copyright (c) 2006-2008 Intel Corporation
9*4882a593Smuzhiyun  * Copyright (c) 2007 Dave Airlie <airlied@linux.ie>
10*4882a593Smuzhiyun  * Copyright (C) 2011 Texas Instruments
11*4882a593Smuzhiyun  */
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #ifndef _PL111_DRM_H_
14*4882a593Smuzhiyun #define _PL111_DRM_H_
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #include <linux/clk-provider.h>
17*4882a593Smuzhiyun #include <linux/interrupt.h>
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #include <drm/drm_bridge.h>
20*4882a593Smuzhiyun #include <drm/drm_connector.h>
21*4882a593Smuzhiyun #include <drm/drm_encoder.h>
22*4882a593Smuzhiyun #include <drm/drm_gem.h>
23*4882a593Smuzhiyun #include <drm/drm_panel.h>
24*4882a593Smuzhiyun #include <drm/drm_simple_kms_helper.h>
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun /*
27*4882a593Smuzhiyun  * CLCD Controller Internal Register addresses
28*4882a593Smuzhiyun  */
29*4882a593Smuzhiyun #define CLCD_TIM0		0x00000000
30*4882a593Smuzhiyun #define CLCD_TIM1		0x00000004
31*4882a593Smuzhiyun #define CLCD_TIM2		0x00000008
32*4882a593Smuzhiyun #define CLCD_TIM3		0x0000000c
33*4882a593Smuzhiyun #define CLCD_UBAS		0x00000010
34*4882a593Smuzhiyun #define CLCD_LBAS		0x00000014
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #define CLCD_PL110_IENB		0x00000018
37*4882a593Smuzhiyun #define CLCD_PL110_CNTL		0x0000001c
38*4882a593Smuzhiyun #define CLCD_PL110_STAT		0x00000020
39*4882a593Smuzhiyun #define CLCD_PL110_INTR		0x00000024
40*4882a593Smuzhiyun #define CLCD_PL110_UCUR		0x00000028
41*4882a593Smuzhiyun #define CLCD_PL110_LCUR		0x0000002C
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun #define CLCD_PL111_CNTL		0x00000018
44*4882a593Smuzhiyun #define CLCD_PL111_IENB		0x0000001c
45*4882a593Smuzhiyun #define CLCD_PL111_RIS		0x00000020
46*4882a593Smuzhiyun #define CLCD_PL111_MIS		0x00000024
47*4882a593Smuzhiyun #define CLCD_PL111_ICR		0x00000028
48*4882a593Smuzhiyun #define CLCD_PL111_UCUR		0x0000002c
49*4882a593Smuzhiyun #define CLCD_PL111_LCUR		0x00000030
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #define CLCD_PALL		0x00000200
52*4882a593Smuzhiyun #define CLCD_PALETTE		0x00000200
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun #define TIM2_PCD_LO_MASK	GENMASK(4, 0)
55*4882a593Smuzhiyun #define TIM2_PCD_LO_BITS	5
56*4882a593Smuzhiyun #define TIM2_CLKSEL		(1 << 5)
57*4882a593Smuzhiyun #define TIM2_ACB_MASK		GENMASK(10, 6)
58*4882a593Smuzhiyun #define TIM2_IVS		(1 << 11)
59*4882a593Smuzhiyun #define TIM2_IHS		(1 << 12)
60*4882a593Smuzhiyun #define TIM2_IPC		(1 << 13)
61*4882a593Smuzhiyun #define TIM2_IOE		(1 << 14)
62*4882a593Smuzhiyun #define TIM2_BCD		(1 << 26)
63*4882a593Smuzhiyun #define TIM2_PCD_HI_MASK	GENMASK(31, 27)
64*4882a593Smuzhiyun #define TIM2_PCD_HI_BITS	5
65*4882a593Smuzhiyun #define TIM2_PCD_HI_SHIFT	27
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #define CNTL_LCDEN		(1 << 0)
68*4882a593Smuzhiyun #define CNTL_LCDBPP1		(0 << 1)
69*4882a593Smuzhiyun #define CNTL_LCDBPP2		(1 << 1)
70*4882a593Smuzhiyun #define CNTL_LCDBPP4		(2 << 1)
71*4882a593Smuzhiyun #define CNTL_LCDBPP8		(3 << 1)
72*4882a593Smuzhiyun #define CNTL_LCDBPP16		(4 << 1)
73*4882a593Smuzhiyun #define CNTL_LCDBPP16_565	(6 << 1)
74*4882a593Smuzhiyun #define CNTL_LCDBPP16_444	(7 << 1)
75*4882a593Smuzhiyun #define CNTL_LCDBPP24		(5 << 1)
76*4882a593Smuzhiyun #define CNTL_LCDBW		(1 << 4)
77*4882a593Smuzhiyun #define CNTL_LCDTFT		(1 << 5)
78*4882a593Smuzhiyun #define CNTL_LCDMONO8		(1 << 6)
79*4882a593Smuzhiyun #define CNTL_LCDDUAL		(1 << 7)
80*4882a593Smuzhiyun #define CNTL_BGR		(1 << 8)
81*4882a593Smuzhiyun #define CNTL_BEBO		(1 << 9)
82*4882a593Smuzhiyun #define CNTL_BEPO		(1 << 10)
83*4882a593Smuzhiyun #define CNTL_LCDPWR		(1 << 11)
84*4882a593Smuzhiyun #define CNTL_LCDVCOMP(x)	((x) << 12)
85*4882a593Smuzhiyun #define CNTL_LDMAFIFOTIME	(1 << 15)
86*4882a593Smuzhiyun #define CNTL_WATERMARK		(1 << 16)
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun /* ST Microelectronics variant bits */
89*4882a593Smuzhiyun #define CNTL_ST_1XBPP_444	0x0
90*4882a593Smuzhiyun #define CNTL_ST_1XBPP_5551	(1 << 17)
91*4882a593Smuzhiyun #define CNTL_ST_1XBPP_565	(1 << 18)
92*4882a593Smuzhiyun #define CNTL_ST_CDWID_12	0x0
93*4882a593Smuzhiyun #define CNTL_ST_CDWID_16	(1 << 19)
94*4882a593Smuzhiyun #define CNTL_ST_CDWID_18	(1 << 20)
95*4882a593Smuzhiyun #define CNTL_ST_CDWID_24	((1 << 19) | (1 << 20))
96*4882a593Smuzhiyun #define CNTL_ST_CEAEN		(1 << 21)
97*4882a593Smuzhiyun #define CNTL_ST_LCDBPP24_PACKED	(6 << 1)
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun #define CLCD_IRQ_NEXTBASE_UPDATE BIT(2)
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun struct drm_minor;
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun /**
104*4882a593Smuzhiyun  * struct pl111_variant_data - encodes IP differences
105*4882a593Smuzhiyun  * @name: the name of this variant
106*4882a593Smuzhiyun  * @is_pl110: this is the early PL110 variant
107*4882a593Smuzhiyun  * @is_lcdc: this is the ST Microelectronics Nomadik LCDC variant
108*4882a593Smuzhiyun  * @external_bgr: this is the Versatile Pl110 variant with external
109*4882a593Smuzhiyun  *	BGR/RGB routing
110*4882a593Smuzhiyun  * @broken_clockdivider: the clock divider is broken and we need to
111*4882a593Smuzhiyun  *	use the supplied clock directly
112*4882a593Smuzhiyun  * @broken_vblank: the vblank IRQ is broken on this variant
113*4882a593Smuzhiyun  * @st_bitmux_control: this variant is using the ST Micro bitmux
114*4882a593Smuzhiyun  *	extensions to the control register
115*4882a593Smuzhiyun  * @formats: array of supported pixel formats on this variant
116*4882a593Smuzhiyun  * @nformats: the length of the array of supported pixel formats
117*4882a593Smuzhiyun  * @fb_bpp: desired bits per pixel on the default framebuffer
118*4882a593Smuzhiyun  */
119*4882a593Smuzhiyun struct pl111_variant_data {
120*4882a593Smuzhiyun 	const char *name;
121*4882a593Smuzhiyun 	bool is_pl110;
122*4882a593Smuzhiyun 	bool is_lcdc;
123*4882a593Smuzhiyun 	bool external_bgr;
124*4882a593Smuzhiyun 	bool broken_clockdivider;
125*4882a593Smuzhiyun 	bool broken_vblank;
126*4882a593Smuzhiyun 	bool st_bitmux_control;
127*4882a593Smuzhiyun 	const u32 *formats;
128*4882a593Smuzhiyun 	unsigned int nformats;
129*4882a593Smuzhiyun 	unsigned int fb_bpp;
130*4882a593Smuzhiyun };
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun struct pl111_drm_dev_private {
133*4882a593Smuzhiyun 	struct drm_device *drm;
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun 	struct drm_connector *connector;
136*4882a593Smuzhiyun 	struct drm_panel *panel;
137*4882a593Smuzhiyun 	struct drm_bridge *bridge;
138*4882a593Smuzhiyun 	struct drm_simple_display_pipe pipe;
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun 	void *regs;
141*4882a593Smuzhiyun 	u32 memory_bw;
142*4882a593Smuzhiyun 	u32 ienb;
143*4882a593Smuzhiyun 	u32 ctrl;
144*4882a593Smuzhiyun 	/* The pixel clock (a reference to our clock divider off of CLCDCLK). */
145*4882a593Smuzhiyun 	struct clk *clk;
146*4882a593Smuzhiyun 	/* pl111's internal clock divider. */
147*4882a593Smuzhiyun 	struct clk_hw clk_div;
148*4882a593Smuzhiyun 	/* Lock to sync access to CLCD_TIM2 between the common clock
149*4882a593Smuzhiyun 	 * subsystem and pl111_display_enable().
150*4882a593Smuzhiyun 	 */
151*4882a593Smuzhiyun 	spinlock_t tim2_lock;
152*4882a593Smuzhiyun 	const struct pl111_variant_data *variant;
153*4882a593Smuzhiyun 	void (*variant_display_enable) (struct drm_device *drm, u32 format);
154*4882a593Smuzhiyun 	void (*variant_display_disable) (struct drm_device *drm);
155*4882a593Smuzhiyun 	bool use_device_memory;
156*4882a593Smuzhiyun };
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun int pl111_display_init(struct drm_device *dev);
159*4882a593Smuzhiyun irqreturn_t pl111_irq(int irq, void *data);
160*4882a593Smuzhiyun void pl111_debugfs_init(struct drm_minor *minor);
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun #endif /* _PL111_DRM_H_ */
163