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