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, 9585993e5fSAlgea Cao }; 9685993e5fSAlgea Cao 9785993e5fSAlgea Cao struct dw_hdmi_audio_tmds_n { 9885993e5fSAlgea Cao unsigned long tmds; 9985993e5fSAlgea Cao unsigned int n_32k; 10085993e5fSAlgea Cao unsigned int n_44k1; 10185993e5fSAlgea Cao unsigned int n_48k; 10285993e5fSAlgea Cao }; 10385993e5fSAlgea Cao 10485993e5fSAlgea Cao enum dw_hdmi_phy_type { 10585993e5fSAlgea Cao DW_HDMI_PHY_DWC_HDMI_TX_PHY = 0x00, 10685993e5fSAlgea Cao DW_HDMI_PHY_DWC_MHL_PHY_HEAC = 0xb2, 10785993e5fSAlgea Cao DW_HDMI_PHY_DWC_MHL_PHY = 0xc2, 10885993e5fSAlgea Cao DW_HDMI_PHY_DWC_HDMI_3D_TX_PHY_HEAC = 0xe2, 10985993e5fSAlgea Cao DW_HDMI_PHY_DWC_HDMI_3D_TX_PHY = 0xf2, 11085993e5fSAlgea Cao DW_HDMI_PHY_DWC_HDMI20_TX_PHY = 0xf3, 11185993e5fSAlgea Cao DW_HDMI_PHY_VENDOR_PHY = 0xfe, 11285993e5fSAlgea Cao }; 11385993e5fSAlgea Cao 11485993e5fSAlgea Cao struct dw_hdmi_mpll_config { 11585993e5fSAlgea Cao unsigned long mpixelclock; 11685993e5fSAlgea Cao struct { 11785993e5fSAlgea Cao u16 cpce; 11885993e5fSAlgea Cao u16 gmp; 11985993e5fSAlgea Cao } res[DW_HDMI_RES_MAX]; 12085993e5fSAlgea Cao }; 12185993e5fSAlgea Cao 12285993e5fSAlgea Cao struct dw_hdmi_curr_ctrl { 12385993e5fSAlgea Cao unsigned long mpixelclock; 12485993e5fSAlgea Cao u16 curr[DW_HDMI_RES_MAX]; 12585993e5fSAlgea Cao }; 12685993e5fSAlgea Cao 12785993e5fSAlgea Cao struct dw_hdmi_phy_config { 12885993e5fSAlgea Cao unsigned long mpixelclock; 12985993e5fSAlgea Cao u16 sym_ctr; /*clock symbol and transmitter control*/ 13085993e5fSAlgea Cao u16 term; /*transmission termination value*/ 13185993e5fSAlgea Cao u16 vlev_ctr; /* voltage level control */ 13285993e5fSAlgea Cao }; 13385993e5fSAlgea Cao 13485993e5fSAlgea Cao struct dw_hdmi_phy_ops { 1358e2bab3fSAlgea Cao int (*init)(struct dw_hdmi *hdmi, void *data); 13685993e5fSAlgea Cao void (*disable)(struct dw_hdmi *hdmi, void *data); 1378e2bab3fSAlgea Cao enum drm_connector_status (*read_hpd)(struct dw_hdmi *hdmi, 1388e2bab3fSAlgea Cao void *data); 1398e2bab3fSAlgea Cao void (*mode_valid)(struct dw_hdmi *hdmi, void *data); 14085993e5fSAlgea Cao }; 14185993e5fSAlgea Cao 14285993e5fSAlgea Cao struct dw_hdmi_plat_data { 14385993e5fSAlgea Cao enum dw_hdmi_devtype dev_type; 14485993e5fSAlgea Cao unsigned long input_bus_format; 14585993e5fSAlgea Cao unsigned long input_bus_encoding; 14685993e5fSAlgea Cao u32 vop_sel_bit; 14785993e5fSAlgea Cao u32 grf_vop_sel_reg; 14885993e5fSAlgea Cao /* Vendor PHY support */ 14985993e5fSAlgea Cao const struct dw_hdmi_phy_ops *phy_ops; 15085993e5fSAlgea Cao const struct dw_hdmi_audio_tmds_n *tmds_n_table; 15185993e5fSAlgea Cao const char *phy_name; 15285993e5fSAlgea Cao void *phy_data; 15385993e5fSAlgea Cao 15485993e5fSAlgea Cao /* Synopsys PHY support */ 15585993e5fSAlgea Cao const struct dw_hdmi_mpll_config *mpll_cfg; 1568e2bab3fSAlgea Cao const struct dw_hdmi_mpll_config *mpll_cfg_420; 15785993e5fSAlgea Cao const struct dw_hdmi_curr_ctrl *cur_ctr; 15885993e5fSAlgea Cao const struct dw_hdmi_phy_config *phy_config; 15985993e5fSAlgea Cao int (*configure_phy)(struct dw_hdmi *hdmi, 16085993e5fSAlgea Cao const struct dw_hdmi_plat_data *pdata, 16185993e5fSAlgea Cao unsigned long mpixelclock); 16285993e5fSAlgea Cao unsigned long (*get_input_bus_format)(void *data); 16385993e5fSAlgea Cao unsigned long (*get_output_bus_format)(void *data); 16485993e5fSAlgea Cao unsigned long (*get_enc_in_encoding)(void *data); 16585993e5fSAlgea Cao unsigned long (*get_enc_out_encoding)(void *data); 166*b5016cf2SAlgea Cao unsigned long (*get_quant_range)(void *data); 16785993e5fSAlgea Cao }; 16885993e5fSAlgea Cao 16985993e5fSAlgea Cao #endif /* __IMX_HDMI_H__ */ 170