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