xref: /rk3399_rockchip-uboot/include/linux/dw_hdmi.h (revision 0aca89f213e8a80b8eff5385303341b2304c527d)
1 /*
2  * Copyright (C) 2011 Freescale Semiconductor, Inc.
3  * (C) Copyright 2008-2017 Fuzhou Rockchip Electronics Co., Ltd
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  */
10 #ifndef __DW_HDMI__
11 #define __DW_HDMI__
12 
13 struct dw_hdmi;
14 struct drm_display_mode;
15 struct ddc_adapter;
16 struct i2c_msg;
17 
18 /**
19  * DOC: Supported input formats and encodings
20  *
21  * Depending on the Hardware configuration of the Controller IP, it supports
22  * a subset of the following input formats and encodings on its internal
23  * 48bit bus.
24  *
25  * +----------------------+----------------------------------+------------------------------+
26  * + Format Name          + Format Code                      + Encodings                    +
27  * +----------------------+----------------------------------+------------------------------+
28  * + RGB 4:4:4 8bit       + ``MEDIA_BUS_FMT_RGB888_1X24``    + ``V4L2_YCBCR_ENC_DEFAULT``   +
29  * +----------------------+----------------------------------+------------------------------+
30  * + RGB 4:4:4 10bits     + ``MEDIA_BUS_FMT_RGB101010_1X30`` + ``V4L2_YCBCR_ENC_DEFAULT``   +
31  * +----------------------+----------------------------------+------------------------------+
32  * + RGB 4:4:4 12bits     + ``MEDIA_BUS_FMT_RGB121212_1X36`` + ``V4L2_YCBCR_ENC_DEFAULT``   +
33  * +----------------------+----------------------------------+------------------------------+
34  * + RGB 4:4:4 16bits     + ``MEDIA_BUS_FMT_RGB161616_1X48`` + ``V4L2_YCBCR_ENC_DEFAULT``   +
35  * +----------------------+----------------------------------+------------------------------+
36  * + YCbCr 4:4:4 8bit     + ``MEDIA_BUS_FMT_YUV8_1X24``      + ``V4L2_YCBCR_ENC_601``       +
37  * +                      +                                  + or ``V4L2_YCBCR_ENC_709``    +
38  * +                      +                                  + or ``V4L2_YCBCR_ENC_XV601``  +
39  * +                      +                                  + or ``V4L2_YCBCR_ENC_XV709``  +
40  * +----------------------+----------------------------------+------------------------------+
41  * + YCbCr 4:4:4 10bits   + ``MEDIA_BUS_FMT_YUV10_1X30``     + ``V4L2_YCBCR_ENC_601``       +
42  * +                      +                                  + or ``V4L2_YCBCR_ENC_709``    +
43  * +                      +                                  + or ``V4L2_YCBCR_ENC_XV601``  +
44  * +                      +                                  + or ``V4L2_YCBCR_ENC_XV709``  +
45  * +----------------------+----------------------------------+------------------------------+
46  * + YCbCr 4:4:4 12bits   + ``MEDIA_BUS_FMT_YUV12_1X36``     + ``V4L2_YCBCR_ENC_601``       +
47  * +                      +                                  + or ``V4L2_YCBCR_ENC_709``    +
48  * +                      +                                  + or ``V4L2_YCBCR_ENC_XV601``  +
49  * +                      +                                  + or ``V4L2_YCBCR_ENC_XV709``  +
50  * +----------------------+----------------------------------+------------------------------+
51  * + YCbCr 4:4:4 16bits   + ``MEDIA_BUS_FMT_YUV16_1X48``     + ``V4L2_YCBCR_ENC_601``       +
52  * +                      +                                  + or ``V4L2_YCBCR_ENC_709``    +
53  * +                      +                                  + or ``V4L2_YCBCR_ENC_XV601``  +
54  * +                      +                                  + or ``V4L2_YCBCR_ENC_XV709``  +
55  * +----------------------+----------------------------------+------------------------------+
56  * + YCbCr 4:2:2 8bit     + ``MEDIA_BUS_FMT_UYVY8_1X16``     + ``V4L2_YCBCR_ENC_601``       +
57  * +                      +                                  + or ``V4L2_YCBCR_ENC_709``    +
58  * +----------------------+----------------------------------+------------------------------+
59  * + YCbCr 4:2:2 10bits   + ``MEDIA_BUS_FMT_UYVY10_1X20``    + ``V4L2_YCBCR_ENC_601``       +
60  * +                      +                                  + or ``V4L2_YCBCR_ENC_709``    +
61  * +----------------------+----------------------------------+------------------------------+
62  * + YCbCr 4:2:2 12bits   + ``MEDIA_BUS_FMT_UYVY12_1X24``    + ``V4L2_YCBCR_ENC_601``       +
63  * +                      +                                  + or ``V4L2_YCBCR_ENC_709``    +
64  * +----------------------+----------------------------------+------------------------------+
65  * + YCbCr 4:2:0 8bit     + ``MEDIA_BUS_FMT_UYYVYY8_0_5X24`` + ``V4L2_YCBCR_ENC_601``       +
66  * +                      +                                  + or ``V4L2_YCBCR_ENC_709``    +
67  * +----------------------+----------------------------------+------------------------------+
68  * + YCbCr 4:2:0 10bits   + ``MEDIA_BUS_FMT_UYYVYY10_0_5X30``+ ``V4L2_YCBCR_ENC_601``       +
69  * +                      +                                  + or ``V4L2_YCBCR_ENC_709``    +
70  * +----------------------+----------------------------------+------------------------------+
71  * + YCbCr 4:2:0 12bits   + ``MEDIA_BUS_FMT_UYYVYY12_0_5X36``+ ``V4L2_YCBCR_ENC_601``       +
72  * +                      +                                  + or ``V4L2_YCBCR_ENC_709``    +
73  * +----------------------+----------------------------------+------------------------------+
74  * + YCbCr 4:2:0 16bits   + ``MEDIA_BUS_FMT_UYYVYY16_0_5X48``+ ``V4L2_YCBCR_ENC_601``       +
75  * +                      +                                  + or ``V4L2_YCBCR_ENC_709``    +
76  * +----------------------+----------------------------------+------------------------------+
77  */
78 
79 enum {
80 	DW_HDMI_RES_8,
81 	DW_HDMI_RES_10,
82 	DW_HDMI_RES_12,
83 	DW_HDMI_RES_MAX,
84 };
85 
86 enum dw_hdmi_devtype {
87 	IMX6Q_HDMI,
88 	IMX6DL_HDMI,
89 	RK3228_HDMI,
90 	RK3288_HDMI,
91 	RK3328_HDMI,
92 	RK3366_HDMI,
93 	RK3368_HDMI,
94 	RK3399_HDMI,
95 	RK3528_HDMI,
96 	RK3568_HDMI,
97 	RK3576_HDMI,
98 	RK3588_HDMI,
99 };
100 
101 struct dw_hdmi_audio_tmds_n {
102 	unsigned long tmds;
103 	unsigned int n_32k;
104 	unsigned int n_44k1;
105 	unsigned int n_48k;
106 };
107 
108 enum dw_hdmi_phy_type {
109 	DW_HDMI_PHY_DWC_HDMI_TX_PHY = 0x00,
110 	DW_HDMI_PHY_DWC_MHL_PHY_HEAC = 0xb2,
111 	DW_HDMI_PHY_DWC_MHL_PHY = 0xc2,
112 	DW_HDMI_PHY_DWC_HDMI_3D_TX_PHY_HEAC = 0xe2,
113 	DW_HDMI_PHY_DWC_HDMI_3D_TX_PHY = 0xf2,
114 	DW_HDMI_PHY_DWC_HDMI20_TX_PHY = 0xf3,
115 	DW_HDMI_PHY_VENDOR_PHY = 0xfe,
116 };
117 
118 struct dw_hdmi_mpll_config {
119 	unsigned long mpixelclock;
120 	struct {
121 		u16 cpce;
122 		u16 gmp;
123 	} res[DW_HDMI_RES_MAX];
124 };
125 
126 struct dw_hdmi_curr_ctrl {
127 	unsigned long mpixelclock;
128 	u16 curr[DW_HDMI_RES_MAX];
129 };
130 
131 struct dw_hdmi_phy_config {
132 	unsigned long mpixelclock;
133 	u16 sym_ctr;    /*clock symbol and transmitter control*/
134 	u16 term;       /*transmission termination value*/
135 	u16 vlev_ctr;   /* voltage level control */
136 };
137 
138 struct rockchip_connector;
139 struct dw_hdmi_phy_ops {
140 	int (*init)(struct rockchip_connector *conn, struct dw_hdmi *hdmi, void *data);
141 	void (*disable)(struct rockchip_connector *conn, struct dw_hdmi *hdmi, void *data);
142 	enum drm_connector_status (*read_hpd)(struct dw_hdmi *hdmi,
143 					      void *data);
144 	void (*mode_valid)(struct rockchip_connector *conn, struct dw_hdmi *hdmi, void *data);
145 };
146 
147 struct dw_hdmi_qp_phy_ops {
148 	int (*init)(struct rockchip_connector *conn, void *hdmi, void *data);
149 	void (*disable)(struct rockchip_connector *conn, void *hdmi, void *data);
150 	enum drm_connector_status (*read_hpd)(void *data);
151 	void (*mode_valid)(void *hdmi, void *data);
152 	void (*set_pll)(struct rockchip_connector *conn, void *hdmi, void *data);
153 };
154 
155 struct dw_hdmi_link_config {
156 	bool dsc_mode;
157 	bool frl_mode;
158 	int frl_lanes;
159 	int rate_per_lane;
160 	int hcactive;
161 	bool allm_en;
162 	u8 pps_payload[128];
163 };
164 
165 struct dw_hdmi_plat_data {
166 	enum dw_hdmi_devtype dev_type;
167 	unsigned long input_bus_format;
168 	unsigned long input_bus_encoding;
169 	u32 vop_sel_bit;
170 	u32 grf_vop_sel_reg;
171 	/* Vendor PHY support */
172 	const struct dw_hdmi_phy_ops *phy_ops;
173 	const struct dw_hdmi_qp_phy_ops *qp_phy_ops;
174 	const struct dw_hdmi_audio_tmds_n *tmds_n_table;
175 	const char *phy_name;
176 	void *phy_data;
177 	void *hdmi;
178 	void *chip_ops;
179 
180 	/* Synopsys PHY support */
181 	const struct dw_hdmi_mpll_config *mpll_cfg;
182 	const struct dw_hdmi_mpll_config *mpll_cfg_420;
183 	const struct dw_hdmi_curr_ctrl *cur_ctr;
184 	struct dw_hdmi_phy_config *phy_config;
185 	int (*configure_phy)(struct dw_hdmi *hdmi,
186 			     const struct dw_hdmi_plat_data *pdata,
187 			     unsigned long mpixelclock);
188 	unsigned long (*get_input_bus_format)(void *data);
189 	unsigned long (*get_output_bus_format)(void *data);
190 	unsigned long (*get_enc_in_encoding)(void *data);
191 	unsigned long (*get_enc_out_encoding)(void *data);
192 	unsigned long (*get_quant_range)(void *data);
193 };
194 
195 #endif /* __IMX_HDMI_H__ */
196