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