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