185993e5fSAlgea Cao /* 285993e5fSAlgea Cao * Copyright (C) 2011 Freescale Semiconductor, Inc. 385993e5fSAlgea Cao * (C) Copyright 2008-2017 Fuzhou Rockchip Electronics Co., Ltd 485993e5fSAlgea Cao * 585993e5fSAlgea Cao * This program is free software; you can redistribute it and/or modify 685993e5fSAlgea Cao * it under the terms of the GNU General Public License as published by 785993e5fSAlgea Cao * the Free Software Foundation; either version 2 of the License, or 885993e5fSAlgea Cao * (at your option) any later version. 985993e5fSAlgea Cao */ 1085993e5fSAlgea Cao #ifndef __DW_HDMI__ 1185993e5fSAlgea Cao #define __DW_HDMI__ 1285993e5fSAlgea Cao 138e2bab3fSAlgea Cao struct dw_hdmi; 148e2bab3fSAlgea Cao struct drm_display_mode; 158e2bab3fSAlgea Cao struct ddc_adapter; 168e2bab3fSAlgea Cao struct i2c_msg; 178e2bab3fSAlgea Cao 1885993e5fSAlgea Cao /** 1985993e5fSAlgea Cao * DOC: Supported input formats and encodings 2085993e5fSAlgea Cao * 2185993e5fSAlgea Cao * Depending on the Hardware configuration of the Controller IP, it supports 2285993e5fSAlgea Cao * a subset of the following input formats and encodings on its internal 2385993e5fSAlgea Cao * 48bit bus. 2485993e5fSAlgea Cao * 2585993e5fSAlgea Cao * +----------------------+----------------------------------+------------------------------+ 2685993e5fSAlgea Cao * + Format Name + Format Code + Encodings + 2785993e5fSAlgea Cao * +----------------------+----------------------------------+------------------------------+ 2885993e5fSAlgea Cao * + RGB 4:4:4 8bit + ``MEDIA_BUS_FMT_RGB888_1X24`` + ``V4L2_YCBCR_ENC_DEFAULT`` + 2985993e5fSAlgea Cao * +----------------------+----------------------------------+------------------------------+ 3085993e5fSAlgea Cao * + RGB 4:4:4 10bits + ``MEDIA_BUS_FMT_RGB101010_1X30`` + ``V4L2_YCBCR_ENC_DEFAULT`` + 3185993e5fSAlgea Cao * +----------------------+----------------------------------+------------------------------+ 3285993e5fSAlgea Cao * + RGB 4:4:4 12bits + ``MEDIA_BUS_FMT_RGB121212_1X36`` + ``V4L2_YCBCR_ENC_DEFAULT`` + 3385993e5fSAlgea Cao * +----------------------+----------------------------------+------------------------------+ 3485993e5fSAlgea Cao * + RGB 4:4:4 16bits + ``MEDIA_BUS_FMT_RGB161616_1X48`` + ``V4L2_YCBCR_ENC_DEFAULT`` + 3585993e5fSAlgea Cao * +----------------------+----------------------------------+------------------------------+ 3685993e5fSAlgea Cao * + YCbCr 4:4:4 8bit + ``MEDIA_BUS_FMT_YUV8_1X24`` + ``V4L2_YCBCR_ENC_601`` + 3785993e5fSAlgea Cao * + + + or ``V4L2_YCBCR_ENC_709`` + 3885993e5fSAlgea Cao * + + + or ``V4L2_YCBCR_ENC_XV601`` + 3985993e5fSAlgea Cao * + + + or ``V4L2_YCBCR_ENC_XV709`` + 4085993e5fSAlgea Cao * +----------------------+----------------------------------+------------------------------+ 4185993e5fSAlgea Cao * + YCbCr 4:4:4 10bits + ``MEDIA_BUS_FMT_YUV10_1X30`` + ``V4L2_YCBCR_ENC_601`` + 4285993e5fSAlgea Cao * + + + or ``V4L2_YCBCR_ENC_709`` + 4385993e5fSAlgea Cao * + + + or ``V4L2_YCBCR_ENC_XV601`` + 4485993e5fSAlgea Cao * + + + or ``V4L2_YCBCR_ENC_XV709`` + 4585993e5fSAlgea Cao * +----------------------+----------------------------------+------------------------------+ 4685993e5fSAlgea Cao * + YCbCr 4:4:4 12bits + ``MEDIA_BUS_FMT_YUV12_1X36`` + ``V4L2_YCBCR_ENC_601`` + 4785993e5fSAlgea Cao * + + + or ``V4L2_YCBCR_ENC_709`` + 4885993e5fSAlgea Cao * + + + or ``V4L2_YCBCR_ENC_XV601`` + 4985993e5fSAlgea Cao * + + + or ``V4L2_YCBCR_ENC_XV709`` + 5085993e5fSAlgea Cao * +----------------------+----------------------------------+------------------------------+ 5185993e5fSAlgea Cao * + YCbCr 4:4:4 16bits + ``MEDIA_BUS_FMT_YUV16_1X48`` + ``V4L2_YCBCR_ENC_601`` + 5285993e5fSAlgea Cao * + + + or ``V4L2_YCBCR_ENC_709`` + 5385993e5fSAlgea Cao * + + + or ``V4L2_YCBCR_ENC_XV601`` + 5485993e5fSAlgea Cao * + + + or ``V4L2_YCBCR_ENC_XV709`` + 5585993e5fSAlgea Cao * +----------------------+----------------------------------+------------------------------+ 5685993e5fSAlgea Cao * + YCbCr 4:2:2 8bit + ``MEDIA_BUS_FMT_UYVY8_1X16`` + ``V4L2_YCBCR_ENC_601`` + 5785993e5fSAlgea Cao * + + + or ``V4L2_YCBCR_ENC_709`` + 5885993e5fSAlgea Cao * +----------------------+----------------------------------+------------------------------+ 5985993e5fSAlgea Cao * + YCbCr 4:2:2 10bits + ``MEDIA_BUS_FMT_UYVY10_1X20`` + ``V4L2_YCBCR_ENC_601`` + 6085993e5fSAlgea Cao * + + + or ``V4L2_YCBCR_ENC_709`` + 6185993e5fSAlgea Cao * +----------------------+----------------------------------+------------------------------+ 6285993e5fSAlgea Cao * + YCbCr 4:2:2 12bits + ``MEDIA_BUS_FMT_UYVY12_1X24`` + ``V4L2_YCBCR_ENC_601`` + 6385993e5fSAlgea Cao * + + + or ``V4L2_YCBCR_ENC_709`` + 6485993e5fSAlgea Cao * +----------------------+----------------------------------+------------------------------+ 6585993e5fSAlgea Cao * + YCbCr 4:2:0 8bit + ``MEDIA_BUS_FMT_UYYVYY8_0_5X24`` + ``V4L2_YCBCR_ENC_601`` + 6685993e5fSAlgea Cao * + + + or ``V4L2_YCBCR_ENC_709`` + 6785993e5fSAlgea Cao * +----------------------+----------------------------------+------------------------------+ 6885993e5fSAlgea Cao * + YCbCr 4:2:0 10bits + ``MEDIA_BUS_FMT_UYYVYY10_0_5X30``+ ``V4L2_YCBCR_ENC_601`` + 6985993e5fSAlgea Cao * + + + or ``V4L2_YCBCR_ENC_709`` + 7085993e5fSAlgea Cao * +----------------------+----------------------------------+------------------------------+ 7185993e5fSAlgea Cao * + YCbCr 4:2:0 12bits + ``MEDIA_BUS_FMT_UYYVYY12_0_5X36``+ ``V4L2_YCBCR_ENC_601`` + 7285993e5fSAlgea Cao * + + + or ``V4L2_YCBCR_ENC_709`` + 7385993e5fSAlgea Cao * +----------------------+----------------------------------+------------------------------+ 7485993e5fSAlgea Cao * + YCbCr 4:2:0 16bits + ``MEDIA_BUS_FMT_UYYVYY16_0_5X48``+ ``V4L2_YCBCR_ENC_601`` + 7585993e5fSAlgea Cao * + + + or ``V4L2_YCBCR_ENC_709`` + 7685993e5fSAlgea Cao * +----------------------+----------------------------------+------------------------------+ 7785993e5fSAlgea Cao */ 7885993e5fSAlgea Cao 7985993e5fSAlgea Cao enum { 8085993e5fSAlgea Cao DW_HDMI_RES_8, 8185993e5fSAlgea Cao DW_HDMI_RES_10, 8285993e5fSAlgea Cao DW_HDMI_RES_12, 8385993e5fSAlgea Cao DW_HDMI_RES_MAX, 8485993e5fSAlgea Cao }; 8585993e5fSAlgea Cao 8685993e5fSAlgea Cao enum dw_hdmi_devtype { 8785993e5fSAlgea Cao IMX6Q_HDMI, 8885993e5fSAlgea Cao IMX6DL_HDMI, 8985993e5fSAlgea Cao RK3228_HDMI, 9085993e5fSAlgea Cao RK3288_HDMI, 9185993e5fSAlgea Cao RK3328_HDMI, 9285993e5fSAlgea Cao RK3366_HDMI, 9385993e5fSAlgea Cao RK3368_HDMI, 9485993e5fSAlgea Cao RK3399_HDMI, 95cb24dc0eSAlgea Cao RK3528_HDMI, 965ccad8f6SAlgea Cao RK3568_HDMI, 97*463abfccSAlgea Cao RK3576_HDMI, 98*463abfccSAlgea Cao RK3588_HDMI, 9985993e5fSAlgea Cao }; 10085993e5fSAlgea Cao 10185993e5fSAlgea Cao struct dw_hdmi_audio_tmds_n { 10285993e5fSAlgea Cao unsigned long tmds; 10385993e5fSAlgea Cao unsigned int n_32k; 10485993e5fSAlgea Cao unsigned int n_44k1; 10585993e5fSAlgea Cao unsigned int n_48k; 10685993e5fSAlgea Cao }; 10785993e5fSAlgea Cao 10885993e5fSAlgea Cao enum dw_hdmi_phy_type { 10985993e5fSAlgea Cao DW_HDMI_PHY_DWC_HDMI_TX_PHY = 0x00, 11085993e5fSAlgea Cao DW_HDMI_PHY_DWC_MHL_PHY_HEAC = 0xb2, 11185993e5fSAlgea Cao DW_HDMI_PHY_DWC_MHL_PHY = 0xc2, 11285993e5fSAlgea Cao DW_HDMI_PHY_DWC_HDMI_3D_TX_PHY_HEAC = 0xe2, 11385993e5fSAlgea Cao DW_HDMI_PHY_DWC_HDMI_3D_TX_PHY = 0xf2, 11485993e5fSAlgea Cao DW_HDMI_PHY_DWC_HDMI20_TX_PHY = 0xf3, 11585993e5fSAlgea Cao DW_HDMI_PHY_VENDOR_PHY = 0xfe, 11685993e5fSAlgea Cao }; 11785993e5fSAlgea Cao 11885993e5fSAlgea Cao struct dw_hdmi_mpll_config { 11985993e5fSAlgea Cao unsigned long mpixelclock; 12085993e5fSAlgea Cao struct { 12185993e5fSAlgea Cao u16 cpce; 12285993e5fSAlgea Cao u16 gmp; 12385993e5fSAlgea Cao } res[DW_HDMI_RES_MAX]; 12485993e5fSAlgea Cao }; 12585993e5fSAlgea Cao 12685993e5fSAlgea Cao struct dw_hdmi_curr_ctrl { 12785993e5fSAlgea Cao unsigned long mpixelclock; 12885993e5fSAlgea Cao u16 curr[DW_HDMI_RES_MAX]; 12985993e5fSAlgea Cao }; 13085993e5fSAlgea Cao 13185993e5fSAlgea Cao struct dw_hdmi_phy_config { 13285993e5fSAlgea Cao unsigned long mpixelclock; 13385993e5fSAlgea Cao u16 sym_ctr; /*clock symbol and transmitter control*/ 13485993e5fSAlgea Cao u16 term; /*transmission termination value*/ 13585993e5fSAlgea Cao u16 vlev_ctr; /* voltage level control */ 13685993e5fSAlgea Cao }; 13785993e5fSAlgea Cao 1380594ce39SZhang Yubing struct rockchip_connector; 13985993e5fSAlgea Cao struct dw_hdmi_phy_ops { 1400594ce39SZhang Yubing int (*init)(struct rockchip_connector *conn, struct dw_hdmi *hdmi, void *data); 1410594ce39SZhang Yubing void (*disable)(struct rockchip_connector *conn, struct dw_hdmi *hdmi, void *data); 1428e2bab3fSAlgea Cao enum drm_connector_status (*read_hpd)(struct dw_hdmi *hdmi, 1438e2bab3fSAlgea Cao void *data); 1440594ce39SZhang Yubing void (*mode_valid)(struct rockchip_connector *conn, struct dw_hdmi *hdmi, void *data); 14585993e5fSAlgea Cao }; 14685993e5fSAlgea Cao 14728671edaSAlgea Cao struct dw_hdmi_qp_phy_ops { 1480594ce39SZhang Yubing int (*init)(struct rockchip_connector *conn, void *hdmi, void *data); 1490594ce39SZhang Yubing void (*disable)(struct rockchip_connector *conn, void *hdmi, void *data); 15028671edaSAlgea Cao enum drm_connector_status (*read_hpd)(void *data); 15128671edaSAlgea Cao void (*mode_valid)(void *hdmi, void *data); 1520594ce39SZhang Yubing void (*set_pll)(struct rockchip_connector *conn, void *hdmi, void *data); 15328671edaSAlgea Cao }; 15428671edaSAlgea Cao 15528671edaSAlgea Cao struct dw_hdmi_link_config { 15628671edaSAlgea Cao bool dsc_mode; 15728671edaSAlgea Cao bool frl_mode; 15828671edaSAlgea Cao int frl_lanes; 15928671edaSAlgea Cao int rate_per_lane; 16028671edaSAlgea Cao int hcactive; 1612afea1f0SAlgea Cao bool allm_en; 16228671edaSAlgea Cao u8 pps_payload[128]; 16328671edaSAlgea Cao }; 16428671edaSAlgea Cao 16585993e5fSAlgea Cao struct dw_hdmi_plat_data { 16685993e5fSAlgea Cao enum dw_hdmi_devtype dev_type; 16785993e5fSAlgea Cao unsigned long input_bus_format; 16885993e5fSAlgea Cao unsigned long input_bus_encoding; 16985993e5fSAlgea Cao u32 vop_sel_bit; 17085993e5fSAlgea Cao u32 grf_vop_sel_reg; 17185993e5fSAlgea Cao /* Vendor PHY support */ 17285993e5fSAlgea Cao const struct dw_hdmi_phy_ops *phy_ops; 17328671edaSAlgea Cao const struct dw_hdmi_qp_phy_ops *qp_phy_ops; 17485993e5fSAlgea Cao const struct dw_hdmi_audio_tmds_n *tmds_n_table; 17585993e5fSAlgea Cao const char *phy_name; 17685993e5fSAlgea Cao void *phy_data; 17728671edaSAlgea Cao void *hdmi; 178*463abfccSAlgea Cao void *chip_ops; 17985993e5fSAlgea Cao 18085993e5fSAlgea Cao /* Synopsys PHY support */ 18185993e5fSAlgea Cao const struct dw_hdmi_mpll_config *mpll_cfg; 1828e2bab3fSAlgea Cao const struct dw_hdmi_mpll_config *mpll_cfg_420; 18385993e5fSAlgea Cao const struct dw_hdmi_curr_ctrl *cur_ctr; 1847ff748e1SAlgea Cao struct dw_hdmi_phy_config *phy_config; 18585993e5fSAlgea Cao int (*configure_phy)(struct dw_hdmi *hdmi, 18685993e5fSAlgea Cao const struct dw_hdmi_plat_data *pdata, 18785993e5fSAlgea Cao unsigned long mpixelclock); 18885993e5fSAlgea Cao unsigned long (*get_input_bus_format)(void *data); 18985993e5fSAlgea Cao unsigned long (*get_output_bus_format)(void *data); 19085993e5fSAlgea Cao unsigned long (*get_enc_in_encoding)(void *data); 19185993e5fSAlgea Cao unsigned long (*get_enc_out_encoding)(void *data); 192b5016cf2SAlgea Cao unsigned long (*get_quant_range)(void *data); 19385993e5fSAlgea Cao }; 19485993e5fSAlgea Cao 19585993e5fSAlgea Cao #endif /* __IMX_HDMI_H__ */ 196