xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/sun4i/sun4i_hdmi.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) 2016 Maxime Ripard
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Maxime Ripard <maxime.ripard@free-electrons.com>
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef _SUN4I_HDMI_H_
9*4882a593Smuzhiyun #define _SUN4I_HDMI_H_
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <drm/drm_connector.h>
12*4882a593Smuzhiyun #include <drm/drm_encoder.h>
13*4882a593Smuzhiyun #include <linux/regmap.h>
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #include <media/cec-pin.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define SUN4I_HDMI_CTRL_REG		0x004
18*4882a593Smuzhiyun #define SUN4I_HDMI_CTRL_ENABLE			BIT(31)
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define SUN4I_HDMI_IRQ_REG		0x008
21*4882a593Smuzhiyun #define SUN4I_HDMI_IRQ_STA_MASK			0x73
22*4882a593Smuzhiyun #define SUN4I_HDMI_IRQ_STA_FIFO_OF		BIT(1)
23*4882a593Smuzhiyun #define SUN4I_HDMI_IRQ_STA_FIFO_UF		BIT(0)
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #define SUN4I_HDMI_HPD_REG		0x00c
26*4882a593Smuzhiyun #define SUN4I_HDMI_HPD_HIGH			BIT(0)
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #define SUN4I_HDMI_VID_CTRL_REG		0x010
29*4882a593Smuzhiyun #define SUN4I_HDMI_VID_CTRL_ENABLE		BIT(31)
30*4882a593Smuzhiyun #define SUN4I_HDMI_VID_CTRL_HDMI_MODE		BIT(30)
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_ACT_REG	0x014
33*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_BP_REG	0x018
34*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_FP_REG	0x01c
35*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_SPW_REG	0x020
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_X(x)		((((x) - 1) & GENMASK(11, 0)))
38*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_Y(y)		((((y) - 1) & GENMASK(11, 0)) << 16)
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_POL_REG	0x024
41*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_POL_TX_CLK        (0x3e0 << 16)
42*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_POL_VSYNC		BIT(1)
43*4882a593Smuzhiyun #define SUN4I_HDMI_VID_TIMING_POL_HSYNC		BIT(0)
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #define SUN4I_HDMI_AVI_INFOFRAME_REG(n)	(0x080 + (n))
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL0_REG	0x200
48*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL0_BIASEN		BIT(31)
49*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL0_LDOCEN		BIT(30)
50*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL0_LDODEN		BIT(29)
51*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL0_PWENC		BIT(28)
52*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL0_PWEND		BIT(27)
53*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL0_PWENG		BIT(26)
54*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL0_CKEN		BIT(25)
55*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL0_TXEN		BIT(23)
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_REG	0x204
58*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_UNKNOWN		BIT(24)	/* set on A31 */
59*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_AMP_OPT		BIT(23)
60*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_AMPCK_OPT		BIT(22)
61*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_EMP_OPT		BIT(20)
62*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_EMPCK_OPT		BIT(19)
63*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_PWSCK		BIT(18)
64*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_PWSDT		BIT(17)
65*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_REG_DEN		BIT(15)
66*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_REG_DENCK		BIT(14)
67*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_REG_EMP(n)		(((n) & 7) << 10)
68*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_HALVE_CLK		BIT(6)
69*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_REG_AMP(n)		(((n) & 7) << 3)
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun /* These bits seem to invert the TMDS data channels */
72*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_INVERT_R		BIT(2)
73*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_INVERT_G		BIT(1)
74*4882a593Smuzhiyun #define SUN4I_HDMI_PAD_CTRL1_INVERT_B		BIT(0)
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_REG		0x208
77*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_PLL_EN		BIT(31)
78*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_BWS			BIT(30)
79*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_HV_IS_33		BIT(29)
80*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_LDO1_EN		BIT(28)
81*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_LDO2_EN		BIT(27)
82*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_SDIV2		BIT(25)
83*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_VCO_GAIN(n)		(((n) & 7) << 20)
84*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_S(n)		(((n) & 7) << 17)
85*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_CP_S(n)		(((n) & 0x1f) << 12)
86*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_CS(n)		(((n) & 0xf) << 8)
87*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_DIV(n)		(((n) & 0xf) << 4)
88*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_DIV_MASK		GENMASK(7, 4)
89*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_CTRL_VCO_S(n)		((n) & 0xf)
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_DBG0_REG		0x20c
92*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_DBG0_TMDS_PARENT(n)	(((n) & 1) << 21)
93*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_DBG0_TMDS_PARENT_MASK	BIT(21)
94*4882a593Smuzhiyun #define SUN4I_HDMI_PLL_DBG0_TMDS_PARENT_SHIFT	21
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun #define SUN4I_HDMI_CEC			0x214
97*4882a593Smuzhiyun #define SUN4I_HDMI_CEC_ENABLE			BIT(11)
98*4882a593Smuzhiyun #define SUN4I_HDMI_CEC_TX			BIT(9)
99*4882a593Smuzhiyun #define SUN4I_HDMI_CEC_RX			BIT(8)
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun #define SUN4I_HDMI_PKT_CTRL_REG(n)	(0x2f0 + (4 * (n)))
102*4882a593Smuzhiyun #define SUN4I_HDMI_PKT_CTRL_TYPE(n, t)		((t) << (((n) % 4) * 4))
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun #define SUN4I_HDMI_UNKNOWN_REG		0x300
105*4882a593Smuzhiyun #define SUN4I_HDMI_UNKNOWN_INPUT_SYNC		BIT(27)
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CTRL_REG		0x500
108*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CTRL_ENABLE		BIT(31)
109*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CTRL_START_CMD		BIT(30)
110*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CTRL_FIFO_DIR_MASK	BIT(8)
111*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CTRL_FIFO_DIR_WRITE	(1 << 8)
112*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CTRL_FIFO_DIR_READ	(0 << 8)
113*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CTRL_RESET		BIT(0)
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_ADDR_REG		0x504
116*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_ADDR_SEGMENT(seg)	(((seg) & 0xff) << 24)
117*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_ADDR_EDDC(addr)		(((addr) & 0xff) << 16)
118*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_ADDR_OFFSET(off)		(((off) & 0xff) << 8)
119*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_ADDR_SLAVE(addr)		((addr) & 0xff)
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_INT_STATUS_REG		0x50c
122*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_INT_STATUS_ILLEGAL_FIFO_OPERATION	BIT(7)
123*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_INT_STATUS_DDC_RX_FIFO_UNDERFLOW		BIT(6)
124*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_INT_STATUS_DDC_TX_FIFO_OVERFLOW		BIT(5)
125*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_INT_STATUS_FIFO_REQUEST			BIT(4)
126*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_INT_STATUS_ARBITRATION_ERROR		BIT(3)
127*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_INT_STATUS_ACK_ERROR			BIT(2)
128*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_INT_STATUS_BUS_ERROR			BIT(1)
129*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_INT_STATUS_TRANSFER_COMPLETE		BIT(0)
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_CTRL_REG	0x510
132*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_CTRL_CLEAR		BIT(31)
133*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_CTRL_RX_THRES(n)	(((n) & 0xf) << 4)
134*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_CTRL_RX_THRES_MASK	GENMASK(7, 4)
135*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_CTRL_RX_THRES_MAX	(BIT(4) - 1)
136*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_CTRL_TX_THRES(n)	((n) & 0xf)
137*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_CTRL_TX_THRES_MASK	GENMASK(3, 0)
138*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_CTRL_TX_THRES_MAX	(BIT(4) - 1)
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_DATA_REG	0x518
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_BYTE_COUNT_REG	0x51c
143*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_BYTE_COUNT_MAX		(BIT(10) - 1)
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CMD_REG		0x520
146*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CMD_EXPLICIT_EDDC_READ	6
147*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CMD_IMPLICIT_READ	5
148*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CMD_IMPLICIT_WRITE	3
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CLK_REG		0x528
151*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CLK_M(m)			(((m) & 0xf) << 3)
152*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_CLK_N(n)			((n) & 0x7)
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_LINE_CTRL_REG	0x540
155*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_LINE_CTRL_SDA_ENABLE	BIT(9)
156*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_LINE_CTRL_SCL_ENABLE	BIT(8)
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun #define SUN4I_HDMI_DDC_FIFO_SIZE	16
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun /* A31 specific */
161*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_CTRL_REG		0x500
162*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_CTRL_RESET		BIT(31)
163*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_CTRL_START_CMD		BIT(27)
164*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_CTRL_SDA_ENABLE		BIT(6)
165*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_CTRL_SCL_ENABLE		BIT(4)
166*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_CTRL_ENABLE		BIT(0)
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_CMD_REG		0x508
169*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_CMD_BYTE_COUNT(count)	((count) << 16)
170*4882a593Smuzhiyun /* command types in lower 3 bits are the same as sun4i */
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_ADDR_REG		0x50c
173*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_ADDR_SEGMENT(seg)	(((seg) & 0xff) << 24)
174*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_ADDR_EDDC(addr)		(((addr) & 0xff) << 16)
175*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_ADDR_OFFSET(off)		(((off) & 0xff) << 8)
176*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_ADDR_SLAVE(addr)		(((addr) & 0xff) << 1)
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_INT_STATUS_REG	0x514
179*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_INT_STATUS_TIMEOUT	BIT(8)
180*4882a593Smuzhiyun /* lower 8 bits are the same as sun4i */
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_FIFO_CTRL_REG	0x518
183*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_FIFO_CTRL_CLEAR		BIT(15)
184*4882a593Smuzhiyun /* lower 9 bits are the same as sun4i */
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_CLK_REG		0x520
187*4882a593Smuzhiyun /* DDC CLK bit fields are the same, but the formula is not */
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun #define SUN6I_HDMI_DDC_FIFO_DATA_REG	0x580
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun enum sun4i_hdmi_pkt_type {
192*4882a593Smuzhiyun 	SUN4I_HDMI_PKT_AVI = 2,
193*4882a593Smuzhiyun 	SUN4I_HDMI_PKT_END = 15,
194*4882a593Smuzhiyun };
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun struct sun4i_hdmi_variant {
197*4882a593Smuzhiyun 	bool has_ddc_parent_clk;
198*4882a593Smuzhiyun 	bool has_reset_control;
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun 	u32 pad_ctrl0_init_val;
201*4882a593Smuzhiyun 	u32 pad_ctrl1_init_val;
202*4882a593Smuzhiyun 	u32 pll_ctrl_init_val;
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun 	struct reg_field ddc_clk_reg;
205*4882a593Smuzhiyun 	u8 ddc_clk_pre_divider;
206*4882a593Smuzhiyun 	u8 ddc_clk_m_offset;
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun 	u8 tmds_clk_div_offset;
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	/* Register fields for I2C adapter */
211*4882a593Smuzhiyun 	struct reg_field	field_ddc_en;
212*4882a593Smuzhiyun 	struct reg_field	field_ddc_start;
213*4882a593Smuzhiyun 	struct reg_field	field_ddc_reset;
214*4882a593Smuzhiyun 	struct reg_field	field_ddc_addr_reg;
215*4882a593Smuzhiyun 	struct reg_field	field_ddc_slave_addr;
216*4882a593Smuzhiyun 	struct reg_field	field_ddc_int_mask;
217*4882a593Smuzhiyun 	struct reg_field	field_ddc_int_status;
218*4882a593Smuzhiyun 	struct reg_field	field_ddc_fifo_clear;
219*4882a593Smuzhiyun 	struct reg_field	field_ddc_fifo_rx_thres;
220*4882a593Smuzhiyun 	struct reg_field	field_ddc_fifo_tx_thres;
221*4882a593Smuzhiyun 	struct reg_field	field_ddc_byte_count;
222*4882a593Smuzhiyun 	struct reg_field	field_ddc_cmd;
223*4882a593Smuzhiyun 	struct reg_field	field_ddc_sda_en;
224*4882a593Smuzhiyun 	struct reg_field	field_ddc_sck_en;
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun 	/* DDC FIFO register offset */
227*4882a593Smuzhiyun 	u32			ddc_fifo_reg;
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun 	/*
230*4882a593Smuzhiyun 	 * DDC FIFO threshold boundary conditions
231*4882a593Smuzhiyun 	 *
232*4882a593Smuzhiyun 	 * This is used to cope with the threshold boundary condition
233*4882a593Smuzhiyun 	 * being slightly different on sun5i and sun6i.
234*4882a593Smuzhiyun 	 *
235*4882a593Smuzhiyun 	 * On sun5i the threshold is exclusive, i.e. does not include,
236*4882a593Smuzhiyun 	 * the value of the threshold. ( > for RX; < for TX )
237*4882a593Smuzhiyun 	 * On sun6i the threshold is inclusive, i.e. includes, the
238*4882a593Smuzhiyun 	 * value of the threshold. ( >= for RX; <= for TX )
239*4882a593Smuzhiyun 	 */
240*4882a593Smuzhiyun 	bool			ddc_fifo_thres_incl;
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 	bool			ddc_fifo_has_dir;
243*4882a593Smuzhiyun };
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun struct sun4i_hdmi {
246*4882a593Smuzhiyun 	struct drm_connector	connector;
247*4882a593Smuzhiyun 	struct drm_encoder	encoder;
248*4882a593Smuzhiyun 	struct device		*dev;
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	void __iomem		*base;
251*4882a593Smuzhiyun 	struct regmap		*regmap;
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 	/* Reset control */
254*4882a593Smuzhiyun 	struct reset_control	*reset;
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	/* Parent clocks */
257*4882a593Smuzhiyun 	struct clk		*bus_clk;
258*4882a593Smuzhiyun 	struct clk		*mod_clk;
259*4882a593Smuzhiyun 	struct clk		*ddc_parent_clk;
260*4882a593Smuzhiyun 	struct clk		*pll0_clk;
261*4882a593Smuzhiyun 	struct clk		*pll1_clk;
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	/* And the clocks we create */
264*4882a593Smuzhiyun 	struct clk		*ddc_clk;
265*4882a593Smuzhiyun 	struct clk		*tmds_clk;
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun 	struct i2c_adapter	*i2c;
268*4882a593Smuzhiyun 	struct i2c_adapter	*ddc_i2c;
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun 	/* Regmap fields for I2C adapter */
271*4882a593Smuzhiyun 	struct regmap_field	*field_ddc_en;
272*4882a593Smuzhiyun 	struct regmap_field	*field_ddc_start;
273*4882a593Smuzhiyun 	struct regmap_field	*field_ddc_reset;
274*4882a593Smuzhiyun 	struct regmap_field	*field_ddc_addr_reg;
275*4882a593Smuzhiyun 	struct regmap_field	*field_ddc_slave_addr;
276*4882a593Smuzhiyun 	struct regmap_field	*field_ddc_int_mask;
277*4882a593Smuzhiyun 	struct regmap_field	*field_ddc_int_status;
278*4882a593Smuzhiyun 	struct regmap_field	*field_ddc_fifo_clear;
279*4882a593Smuzhiyun 	struct regmap_field	*field_ddc_fifo_rx_thres;
280*4882a593Smuzhiyun 	struct regmap_field	*field_ddc_fifo_tx_thres;
281*4882a593Smuzhiyun 	struct regmap_field	*field_ddc_byte_count;
282*4882a593Smuzhiyun 	struct regmap_field	*field_ddc_cmd;
283*4882a593Smuzhiyun 	struct regmap_field	*field_ddc_sda_en;
284*4882a593Smuzhiyun 	struct regmap_field	*field_ddc_sck_en;
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	struct sun4i_drv	*drv;
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun 	bool			hdmi_monitor;
289*4882a593Smuzhiyun 	struct cec_adapter	*cec_adap;
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun 	const struct sun4i_hdmi_variant	*variant;
292*4882a593Smuzhiyun };
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun int sun4i_ddc_create(struct sun4i_hdmi *hdmi, struct clk *clk);
295*4882a593Smuzhiyun int sun4i_tmds_create(struct sun4i_hdmi *hdmi);
296*4882a593Smuzhiyun int sun4i_hdmi_i2c_create(struct device *dev, struct sun4i_hdmi *hdmi);
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun #endif /* _SUN4I_HDMI_H_ */
299