HDMI: implement function at rk3288_hdmi_hw.c and add some register defined
authorzwl <zwl@rock-chips.com>
Sat, 8 Mar 2014 11:13:36 +0000 (19:13 +0800)
committerzwl <zwl@rock-chips.com>
Sat, 8 Mar 2014 11:14:26 +0000 (19:14 +0800)
drivers/video/rockchip/hdmi/chips/rk3288/rk3288_hdmi.c
drivers/video/rockchip/hdmi/chips/rk3288/rk3288_hdmi_hw.c
drivers/video/rockchip/hdmi/chips/rk3288/rk3288_hdmi_hw.h

index 10b122b66e1e998b87490005ee4bdc8ac8fdba9b..9c54392a1c8e74f394a19f19b5a82f8f4d26a35b 100644 (file)
@@ -46,7 +46,7 @@ static int rk3288_hdmi_reg_show(struct seq_file *s, void *v)
        seq_printf(s, "\n-----------------------------------------------------------------");
 
        for(i=0; i<= I2CM_SCDC_UPDATE1; i++) {
-                hdmi_readl(hdmi_dev, i, &val);
+                val = hdmi_readl(hdmi_dev, i);
                if(i%16==0)
                        seq_printf(s,"\n>>>hdmi_ctl %2x:", i);
                seq_printf(s," %02x",val);
@@ -131,6 +131,9 @@ static int rk3288_hdmi_parse_dt(struct rk3288_hdmi_device *hdmi_dev)
        if(!of_property_read_u32(np, "rockchips,hdmi_lcdc_source", &val))
                hdmi_dev->lcdc_id = val;
 
+       if(!of_property_read_u32(np, "rockchips,hdmi_audio_source", &val))
+               hdmi_dev->driver.audio.type = val;
+
        return 0;
 }
 
index 383800f415c15524b8a67589c12eb24df8fe0f89..b981eccef3fd0592f332be548ceb585f23ef12f3 100644 (file)
+#include <linux/delay.h>
 #include <linux/interrupt.h>
 #include "rk3288_hdmi_hw.h"
 
+//i2c master reset
+void rk3288_hdmi_i2cm_reset(struct rk3288_hdmi_device *hdmi_dev)
+{
+       hdmi_msk_reg(hdmi_dev, I2CM_SOFTRSTZ, m_I2CM_SOFTRST, v_I2CM_SOFTRST(0));
+       msleep(5);
+}
+
 int rk3288_hdmi_detect_hotplug(struct hdmi *hdmi_drv)
 {
-       return 0;
+       struct rk3288_hdmi_device *hdmi_dev = container_of(hdmi_drv, struct rk3288_hdmi_device, driver);
+       u32 value = hdmi_readl(hdmi_dev,PHY_STAT0);
+
+       hdmi_dbg(hdmi_drv->dev, "[%s] reg%x value %02x\n", __FUNCTION__, PHY_STAT0, value);
+
+       if(value & m_PHY_HPD)
+               return HDMI_HPD_ACTIVED;
+       else
+               return HDMI_HPD_REMOVED;
 }
 
 int rk3288_hdmi_read_edid(struct hdmi *hdmi_drv, int block, unsigned char *buff)
 {
-       return 0;
+       int i = 0,index = 0,interrupt = 0,ret = -1,trytime = 2;
+       unsigned long flags;
+       struct rk3288_hdmi_device *hdmi_dev = container_of(hdmi_drv, struct rk3288_hdmi_device, driver);
+
+       hdmi_dbg(hdmi_drv->dev, "[%s] block %d\n", __FUNCTION__, block);
+       spin_lock_irqsave(&hdmi_drv->irq_lock, flags);
+       hdmi_dev->edid_status = 0;
+       spin_unlock_irqrestore(&hdmi_drv->irq_lock, flags);
+
+       //Set DDC I2C CLK which devided from DDC_CLK to 100KHz.
+       hdmi_writel(hdmi_dev, I2CM_SS_SCL_HCNT_0_ADDR, 0x7a);
+       hdmi_writel(hdmi_dev, I2CM_SS_SCL_LCNT_0_ADDR, 0x8d);
+       hdmi_msk_reg(hdmi_dev, I2CM_DIV, m_I2CM_FAST_STD_MODE, v_I2CM_FAST_STD_MODE(STANDARD_MODE));    //Set Standard Mode
+
+       //Enable edid interrupt
+       hdmi_writel(hdmi_dev, IH_MUTE_I2CM_STAT0, v_SCDC_READREQ_MUTE(0) | v_I2CM_DONE_MUTE(0) | v_I2CM_ERR_MUTE(0));
+
+       //hdmi_writel(hdmi_dev, I2CM_SLAVE,);   //TODO Daisen wait to add!!
+       while(trytime--) {
+               // Config EDID block and segment addr
+               hdmi_writel(hdmi_dev, I2CM_SEGADDR, (block%2) * 0x80);
+               hdmi_writel(hdmi_dev, I2CM_SEGPTR, block/2);
+               //enable Extended sequential read operation
+               hdmi_msk_reg(hdmi_dev, I2CM_OPERATION, m_I2CM_RD8_EXT, v_I2CM_RD8_EXT(1));
+
+               i = 100;
+               while(i--)
+               {
+                       spin_lock_irqsave(&hdmi_drv->irq_lock, flags);
+                       interrupt = hdmi_dev->edid_status;
+                       hdmi_dev->edid_status = 0;
+                       spin_unlock_irqrestore(&hdmi_drv->irq_lock, flags);
+                       if(interrupt & (m_SCDC_READREQ | m_I2CM_DONE | m_I2CM_ERROR))
+                               break;
+                       msleep(10);
+               }
+
+               if(interrupt & (m_SCDC_READREQ | m_I2CM_DONE)) {
+                       for(i = 0; i < HDMI_EDID_BLOCK_SIZE/8; i++) {
+                               for(index = 0; index < 8; index++)
+                                       buff[i] = hdmi_readl(hdmi_dev, I2CM_READ_BUFF0 + index);
+                       }
+
+                       ret = 0;
+                       hdmi_dbg(hdmi_drv->dev, "[%s] edid read sucess\n", __FUNCTION__);
+#ifdef HDMI_DEBUG
+                       for(i = 0; i < 128; i++) {
+                               printk("%02x ,", buff[i]);
+                               if( (i + 1) % 16 == 0)
+                                       printk("\n");
+                       }
+#endif
+                       break;
+               }
+
+               if(interrupt & m_I2CM_ERROR) {
+                       hdmi_err(hdmi_drv->dev, "[%s] edid read error\n", __FUNCTION__);
+                       rk3288_hdmi_i2cm_reset(hdmi_dev);
+               }
+
+               hdmi_dbg(hdmi_drv->dev, "[%s] edid try times %d\n", __FUNCTION__, trytime);
+               msleep(100);
+       }
+
+       // Disable edid interrupt
+       hdmi_writel(hdmi_dev, IH_MUTE_I2CM_STAT0, v_SCDC_READREQ_MUTE(1) | v_I2CM_DONE_MUTE(1) | v_I2CM_ERR_MUTE(1)); //TODO Daisen HDCP enable it??
+       return ret;
+}
+
+static void rk3288_hdmi_config_phy(unsigned char vic)
+{
+       //TODO Daisen wait to add code
+}
+
+static void rk3288_hdmi_config_avi(struct hdmi *hdmi_drv, unsigned char vic, unsigned char output_color)
+{
+       int clolorimetry, aspect_ratio, y1y0;
+       struct rk3288_hdmi_device *hdmi_dev = container_of(hdmi_drv, struct rk3288_hdmi_device, driver);
+
+       //Set AVI infoFrame Data byte1
+       if(output_color == VIDEO_OUTPUT_YCBCR444)
+               y1y0 = AVI_COLOR_MODE_YCBCR444;
+       else if(output_color == VIDEO_OUTPUT_YCBCR422)
+               y1y0 = AVI_COLOR_MODE_YCBCR422;
+       else
+               y1y0 = AVI_COLOR_MODE_RGB;
+
+       hdmi_msk_reg(hdmi_dev, FC_AVICONF0, m_FC_ACTIV_FORMAT | m_FC_RGC_YCC, v_FC_RGC_YCC(y1y0) | v_FC_ACTIV_FORMAT(1));
+
+       //Set AVI infoFrame Data byte2
+       switch(vic)
+       {
+               case HDMI_720x480i_60Hz_4_3:
+               case HDMI_720x576i_50Hz_4_3:
+               case HDMI_720x480p_60Hz_4_3:
+               case HDMI_720x576p_50Hz_4_3:
+                       aspect_ratio = AVI_CODED_FRAME_ASPECT_4_3;
+                       clolorimetry = AVI_COLORIMETRY_SMPTE_170M;
+                       break;
+               case HDMI_720x480i_60Hz_16_9:
+               case HDMI_720x576i_50Hz_16_9:
+               case HDMI_720x480p_60Hz_16_9:
+               case HDMI_720x576p_50Hz_16_9:
+                       aspect_ratio = AVI_CODED_FRAME_ASPECT_16_9;
+                       clolorimetry = AVI_COLORIMETRY_SMPTE_170M;
+                       break;
+               default:
+                       aspect_ratio = AVI_CODED_FRAME_ASPECT_16_9;
+                       clolorimetry = AVI_COLORIMETRY_ITU709;
+       }
+
+       if(output_color == VIDEO_OUTPUT_RGB444)
+               clolorimetry = AVI_COLORIMETRY_NO_DATA;
+
+       hdmi_writel(hdmi_dev, FC_AVICONF1, v_FC_COLORIMETRY(clolorimetry) | v_FC_PIC_ASPEC_RATIO(aspect_ratio) | v_FC_ACT_ASPEC_RATIO(ACTIVE_ASPECT_RATE_SAME_AS_CODED_FRAME));
+
+       //Set AVI infoFrame Data byte3
+       hdmi_writel(hdmi_dev, FC_AVICONF2, 0x00);
+
+       //Set AVI infoFrame Data byte4
+       hdmi_writel(hdmi_dev, FC_AVIVID, (vic & 0xff));
+
+       //Set AVI infoFrame Data byte5
+       hdmi_msk_reg(hdmi_dev, FC_AVICONF3, m_FC_YQ | m_FC_CN, v_FC_YQ(YQ_LIMITED_RANGE) | v_FC_CN(CN_GRAPHICS));
+
+       //TODO Daisen add Calculate AVI InfoFrame ChecKsum
+}
+
+
+static char coeff_csc[][24] = {                //TODO Daisen wait to modify
+               //   G          R           B           Bias
+               //   A1    |    A2     |    A3     |    A4    |
+               //   B1    |    B2     |    B3     |    B4    |
+               //   B1    |    B2     |    B3     |    B4    |
+       {       //CSC_RGB_0_255_TO_ITU601_16_235
+               0x02, 0x59, 0x01, 0x32, 0x00, 0x75, 0x00, 0x10,         //Y
+               0x11, 0xb6, 0x02, 0x0b, 0x10, 0x55, 0x00, 0x80,         //Cr
+               0x11, 0x5b, 0x10, 0xb0, 0x02, 0x0b, 0x00, 0x80,         //Cb
+       },
+       {       //CSC_RGB_0_255_TO_ITU709_16_235
+               0x02, 0xdc, 0x00, 0xda, 0x00, 0x4a, 0x00, 0x10,         //Y
+               0x11, 0xdb, 0x02, 0x0b, 0x10, 0x30, 0x00, 0x80,         //Cr
+               0x11, 0x93, 0x10, 0x78, 0x02, 0x0b, 0x00, 0x80,         //Cb
+       },
+               //Y             Cr          Cb          Bias
+       {       //CSC_ITU601_16_235_TO_RGB_16_235
+               0x04, 0x00, 0x05, 0x7c, 0x00, 0x00, 0x02, 0xaf,         //R
+               0x04, 0x00, 0x12, 0xcb, 0x11, 0x58, 0x00, 0x84,         //G
+               0x04, 0x00, 0x00, 0x00, 0x06, 0xee, 0x02, 0xde,         //B
+       },
+       {       //CSC_ITU709_16_235_TO_RGB_16_235
+               0x04, 0x00, 0x06, 0x29, 0x00, 0x00, 0x02, 0xc5,         //R
+               0x04, 0x00, 0x11, 0xd6, 0x10, 0xbb, 0x00, 0x52,         //G
+               0x04, 0x00, 0x00, 0x00, 0x07, 0x44, 0x02, 0xe8,         //B
+       },
+       {       //CSC_ITU601_16_235_TO_RGB_0_255
+               0x04, 0xa8, 0x05, 0x7c, 0x00, 0x00, 0x02, 0xc2,         //R
+               0x04, 0xa8, 0x12, 0xcb, 0x11, 0x58, 0x00, 0x72,         //G
+               0x04, 0xa8, 0x00, 0x00, 0x06, 0xee, 0x02, 0xf0,         //B
+       },
+       {       //CSC_ITU709_16_235_TO_RGB_0_255
+               0x04, 0xa8, 0x06, 0x29, 0x00, 0x00, 0x02, 0xd8,         //R
+               0x04, 0xa8, 0x11, 0xd6, 0x10, 0xbb, 0x00, 0x40,         //G
+               0x04, 0xa8, 0x00, 0x00, 0x07, 0x44, 0x02, 0xfb,         //B
+       },
+
+};
+
+#define CSCSCALE       2
+static void rk3288_hdmi_config_csc(struct hdmi *hdmi_drv, struct hdmi_video_para *vpara)
+{
+       int i, mode;
+       char *coeff = NULL;
+       struct rk3288_hdmi_device *hdmi_dev = container_of(hdmi_drv, struct rk3288_hdmi_device, driver);
+
+       if( ((vpara->input_color == VIDEO_INPUT_COLOR_RGB) && (vpara->output_color == VIDEO_OUTPUT_RGB444)) ||
+               ((vpara->input_color == VIDEO_INPUT_COLOR_YCBCR) && (vpara->output_color != VIDEO_OUTPUT_RGB444) ))
+       {
+               return;
+       }
+
+       switch(vpara->vic)
+       {
+               case HDMI_720x480i_60Hz_4_3:
+               case HDMI_720x576i_50Hz_4_3:
+               case HDMI_720x480p_60Hz_4_3:
+               case HDMI_720x576p_50Hz_4_3:
+               case HDMI_720x480i_60Hz_16_9:
+               case HDMI_720x576i_50Hz_16_9:
+               case HDMI_720x480p_60Hz_16_9:
+               case HDMI_720x576p_50Hz_16_9:
+                       if(vpara->input_color == VIDEO_INPUT_COLOR_RGB)
+                               mode = CSC_RGB_0_255_TO_ITU601_16_235;
+                       else if(vpara->output_mode == OUTPUT_HDMI)
+                               mode = CSC_ITU601_16_235_TO_RGB_16_235;
+                       else
+                               mode = CSC_ITU601_16_235_TO_RGB_0_255;
+                       break;
+               default:
+                       if(vpara->input_color == VIDEO_INPUT_COLOR_RGB)
+                               mode = CSC_RGB_0_255_TO_ITU709_16_235;
+                       else if(vpara->output_mode == OUTPUT_HDMI)
+                               mode = CSC_ITU709_16_235_TO_RGB_16_235;
+                       else
+                               mode = CSC_ITU709_16_235_TO_RGB_0_255;
+                       break;
+       }
+
+       hdmi_msk_reg(hdmi_dev, CSC_SCALE, m_CSC_SCALE, v_CSC_SCALE(CSCSCALE));
+       coeff = coeff_csc[mode];
+
+       for(i = 0; i < 24; i++)
+               hdmi_writel(hdmi_dev, CSC_COEF_A1_MSB + i, coeff[i]);
+
+       //enable CSC TODO Daisen wait to add
 }
 
+
 int rk3288_hdmi_config_video(struct hdmi *hdmi_drv, struct hdmi_video_para *vpara)
 {
+       int input_color = 0;
+       int h_act,v_act,h_syncdelay,v_syncdelay,h_sync,v_sync,h_blank,v_blank;
+       struct fb_videomode *mode = NULL;
+       int vsync_pol = hdmi_drv->lcdc->cur_screen->pin_vsync;
+       int hsync_pol = hdmi_drv->lcdc->cur_screen->pin_hsync;
+       int de_pol = hdmi_drv->lcdc->cur_screen->pin_den;
+       struct rk3288_hdmi_device *hdmi_dev = container_of(hdmi_drv, struct rk3288_hdmi_device, driver);
+
+       switch(vpara->input_color)
+       {
+               case VIDEO_OUTPUT_RGB444:
+                       input_color = VIDEO_RGB444_8BIT;
+                       break;
+               case VIDEO_OUTPUT_YCBCR444:
+                       input_color = VIDEO_YCBCR444_8BIT;
+                       break;
+               case VIDEO_OUTPUT_YCBCR422:
+                       input_color = VIDEO_YCBCR422_8BIT;
+                       break;
+               default:
+                       input_color = VIDEO_RGB444_8BIT;
+                       break;
+       }
+
+       //Set Data enable signal from external and set video sample input mapping
+       hdmi_msk_reg(hdmi_dev, TX_INVID0, m_INTERNAL_DE_GEN | m_VIDEO_MAPPING, v_INTERNAL_DE_GEN(0) | v_VIDEO_MAPPING(input_color));
+
+       if(hdmi_drv->tmdsclk > 340000000) {     //used for HDMI 2.0 TX
+               hdmi_msk_reg(hdmi_dev, FC_INVIDCONF, m_FC_HDCP_KEEPOUT, v_FC_HDCP_KEEPOUT(1));
+               hdmi_msk_reg(hdmi_dev, FC_SCRAMBLER_CTRL, m_FC_SCRAMBLE_EN, v_FC_SCRAMBLE_EN(1));
+       }
+
+       //Color space convert
+       rk3288_hdmi_config_csc(hdmi_drv, vpara);
+
+       //Set video timing
+       mode = (struct fb_videomode *)hdmi_vic_to_videomode(vpara->vic);
+       if(mode == NULL)
+       {
+               hdmi_err(hdmi_drv->dev, "[%s] not found vic %d\n", __FUNCTION__, vpara->vic);
+               return -ENOENT;
+       }
+
+       hdmi_msk_reg(hdmi_dev, FC_INVIDCONF, m_FC_VSYNC_POL | m_FC_HSYNC_POL | m_FC_DE_POL | m_FC_INTERLACE_MODE,
+               v_FC_VSYNC_POL(vsync_pol) | v_FC_HSYNC_POL(hsync_pol) | v_FC_DE_POL(de_pol) | v_FC_INTERLACE_MODE(mode->vmode));        //TODO Daisen wait to set m_FC_VBLANK value!!
+
+       h_act = mode->xres;
+       hdmi_msk_reg(hdmi_dev, FC_INHACTIV1,m_FC_H_ACTIVE, v_FC_H_ACTIVE(h_act >> 8));
+       hdmi_writel(hdmi_dev, FC_INHACTIV0, (h_act & 0xff));
+
+       v_act = mode->yres;
+       hdmi_msk_reg(hdmi_dev, FC_INVACTIV1, m_FC_V_ACTIVE, v_FC_V_ACTIVE(v_act >> 8));
+       hdmi_writel(hdmi_dev, FC_INVACTIV0, (v_act & 0xff));
+
+       h_blank = mode->hsync_len + mode->left_margin + mode->right_margin;
+       hdmi_msk_reg(hdmi_dev, FC_INHBLANK1, m_FC_H_BLANK, v_FC_H_BLANK(h_blank >> 8));
+       hdmi_writel(hdmi_dev, FC_INHBLANK0, (h_blank & 0xff));
+
+       v_blank = mode->vsync_len + mode->upper_margin + mode->lower_margin;
+       hdmi_writel(hdmi_dev, FC_INVBLANK, (v_blank & 0xff));
+
+       h_syncdelay = mode->left_margin + mode->hsync_len;      //TODO Daisen wait to modify
+       hdmi_msk_reg(hdmi_dev, FC_HSYNCINDELAY1, m_FC_H_SYNCFP, v_FC_H_SYNCFP(h_syncdelay >> 8));
+       hdmi_writel(hdmi_dev, FC_HSYNCINDELAY0, (h_syncdelay & 0xff));
+
+       v_syncdelay = mode->upper_margin + mode->vsync_len;     //TODO Daisen wait to modify
+       hdmi_writel(hdmi_dev, FC_VSYNCINDELAY, (v_syncdelay & 0xff));
+
+       h_sync = mode->hsync_len;
+       hdmi_msk_reg(hdmi_dev, FC_HSYNCINWIDTH1, m_FC_HSYNC, v_FC_HSYNC(h_sync >> 8));
+       hdmi_writel(hdmi_dev, FC_HSYNCINWIDTH0, (h_sync & 0xff));
+
+       v_sync = mode->vsync_len;
+       hdmi_writel(hdmi_dev, FC_VSYNCINWIDTH, (v_sync & 0xff));
+
+       //Set HDMI/DVI mode
+       hdmi_msk_reg(hdmi_dev, FC_INVIDCONF, m_FC_HDMI_DVI, v_FC_HDMI_DVI(vpara->output_mode));
+       if(vpara->output_mode == OUTPUT_HDMI) {
+               rk3288_hdmi_config_avi(hdmi_drv, vpara->vic, vpara->output_color);
+               hdmi_dbg(hdmi_drv->dev, "[%s] sucess output HDMI.\n", __FUNCTION__);
+       }
+       else {
+               hdmi_dbg(hdmi_drv->dev, "[%s] sucess output DVI.\n", __FUNCTION__);
+       }
+
+       rk3288_hdmi_config_phy(vpara->vic);
+       rk3288_hdmi_control_output(hdmi_drv, 0);
        return 0;
 }
 
+static void rk3288_hdmi_config_aai(struct hdmi *hdmi_drv, struct hdmi_audio *audio)
+{
+       //struct rk3288_hdmi_device *hdmi_dev = container_of(hdmi_drv, struct rk3288_hdmi_device, driver);
+
+       //hdmi_writel(hdmi_dev, FC_AUDICONF0, m_FC_CHN_CNT | m_FC_CODING_TYEP, v_FC_CHN_CNT(audio->channel) | v_FC_CODING_TYEP());
+
+       //TODO Daisen wait to add
+}
+
 int rk3288_hdmi_config_audio(struct hdmi *hdmi_drv, struct hdmi_audio *audio)
 {
+       int word_length = 0,channel = 0,N = 0;
+       struct rk3288_hdmi_device *hdmi_dev = container_of(hdmi_drv, struct rk3288_hdmi_device, driver);
+
+       if(audio->channel < 3)  //TODO Daisen
+               channel = I2S_CHANNEL_1_2;
+       else if(audio->channel < 5)
+               channel = I2S_CHANNEL_3_4;
+       else if(audio->channel < 7)
+               channel = I2S_CHANNEL_5_6;
+       else
+               channel = I2S_CHANNEL_7_8;
+
+       switch(audio->rate)
+       {
+               case HDMI_AUDIO_FS_32000:
+                       if(hdmi_drv->tmdsclk >= 594000000)
+                               N = N_32K_HIGHCLK;
+                       else if(hdmi_drv->tmdsclk == 297000000)
+                               N = N_32K_MIDCLK;
+                       else
+                               N = N_32K_LOWCLK;
+                       break;
+               case HDMI_AUDIO_FS_44100:
+                       if(hdmi_drv->tmdsclk >= 594000000)
+                               N = N_441K_HIGHCLK;
+                       else if(hdmi_drv->tmdsclk == 297000000)
+                               N = N_441K_MIDCLK;
+                       else
+                               N = N_441K_LOWCLK;
+                       break;
+               case HDMI_AUDIO_FS_48000:
+                       if(hdmi_drv->tmdsclk >= 594000000)
+                               N = N_48K_HIGHCLK;
+                       else if(hdmi_drv->tmdsclk == 297000000)
+                               N = N_48K_MIDCLK;
+                       else
+                               N = N_48K_LOWCLK;
+                       break;
+               case HDMI_AUDIO_FS_88200:
+                       if(hdmi_drv->tmdsclk >= 594000000)
+                               N = N_882K_HIGHCLK;
+                       else if(hdmi_drv->tmdsclk == 297000000)
+                               N = N_882K_MIDCLK;
+                       else
+                               N = N_882K_LOWCLK;
+                       break;
+               case HDMI_AUDIO_FS_96000:
+                       if(hdmi_drv->tmdsclk >= 594000000)
+                               N = N_96K_HIGHCLK;
+                       else if(hdmi_drv->tmdsclk == 297000000)
+                               N = N_96K_MIDCLK;
+                       else
+                               N = N_96K_LOWCLK;
+                       break;
+               case HDMI_AUDIO_FS_176400:
+                       if(hdmi_drv->tmdsclk >= 594000000)
+                               N = N_1764K_HIGHCLK;
+                       else if(hdmi_drv->tmdsclk == 297000000)
+                               N = N_1764K_MIDCLK;
+                       else
+                               N = N_1764K_LOWCLK;
+                       break;
+               case HDMI_AUDIO_FS_192000:
+                       if(hdmi_drv->tmdsclk >= 594000000)
+                               N = N_192K_HIGHCLK;
+                       else if(hdmi_drv->tmdsclk == 297000000)
+                               N = N_192K_MIDCLK;
+                       else
+                               N = N_192K_LOWCLK;
+                       break;
+               default:
+                       hdmi_err(hdmi_drv->dev, "[%s] not support such sample rate %d\n", __FUNCTION__, audio->rate);
+                       return -ENOENT;
+       }
+
+       switch(audio->word_length)
+       {
+               case HDMI_AUDIO_WORD_LENGTH_16bit:
+                       word_length = I2S_16BIT_SAMPLE;
+                       break;
+               case HDMI_AUDIO_WORD_LENGTH_20bit:
+                       word_length = I2S_20BIT_SAMPLE;
+                       break;
+               case HDMI_AUDIO_WORD_LENGTH_24bit:
+                       word_length = I2S_24BIT_SAMPLE;
+                       break;
+               default:
+                       word_length = I2S_16BIT_SAMPLE;
+       }
+
+       if(hdmi_drv->audio.type == INPUT_SPDIF) {
+               hdmi_msk_reg(hdmi_dev, AUD_CONF0, m_I2S_SEL, v_I2S_SEL(AUDIO_SPDIF_GPA));
+               hdmi_msk_reg(hdmi_dev, AUD_SPDIF1, m_SET_NLPCM | m_SPDIF_WIDTH, v_SET_NLPCM(PCM_LINEAR) | v_SPDIF_WIDTH(word_length));
+       }
+       else {
+               hdmi_msk_reg(hdmi_dev, AUD_CONF0, m_I2S_SEL | m_I2S_IN_EN, v_I2S_SEL(AUDIO_I2S) | v_I2S_IN_EN(channel));
+               hdmi_writel(hdmi_dev, AUD_CONF1, v_I2S_MODE(I2S_STANDARD_MODE) | v_I2S_WIDTH(word_length));
+       }
+
+       hdmi_msk_reg(hdmi_dev, AUD_INPUTCLKFS, m_LFS_FACTOR, v_LFS_FACTOR(FS_128));
+
+       //Set N value
+       hdmi_msk_reg(hdmi_dev, AUD_N3, m_AUD_N3, v_AUD_N3(N >> 16));
+       hdmi_writel(hdmi_dev, AUD_N2, (N >> 8) & 0xff);
+       hdmi_writel(hdmi_dev, AUD_N1, N & 0xff);
+       //Set Automatic CTS generation
+       hdmi_msk_reg(hdmi_dev, AUD_CTS3, m_CTS_MANUAL, v_CTS_MANUAL(0));
+
+       rk3288_hdmi_config_aai(hdmi_drv, audio);
+
        return 0;
 }
 
@@ -47,6 +484,43 @@ int rk3288_hdmi_initial(struct hdmi *hdmi_drv)
 
 irqreturn_t hdmi_irq(int irq, void *priv)
 {
+       struct hdmi *hdmi_drv = (struct hdmi *)priv;
+       struct rk3288_hdmi_device *hdmi_dev = container_of(hdmi_drv, struct rk3288_hdmi_device, driver);
+       int phy_int,i2cm_int,cec_int,hdcp_int;
+
+       phy_int = hdmi_readl(hdmi_dev, IH_PHY_STAT0);
+       i2cm_int = hdmi_readl(hdmi_dev, IH_I2CM_STAT0);
+       cec_int = hdmi_readl(hdmi_dev, IH_CEC_STAT0);
+       hdcp_int = hdmi_readl(hdmi_dev, A_APIINTSTAT);
+
+       //clear interrupt
+       hdmi_writel(hdmi_dev, IH_PHY_STAT0, phy_int);
+       hdmi_writel(hdmi_dev, IH_I2CM_STAT0, i2cm_int);
+       hdmi_writel(hdmi_dev, IH_CEC_STAT0, cec_int);
+       hdmi_writel(hdmi_dev, A_APIINTCLR, hdcp_int);
+
+       //HPD
+       if(phy_int & m_HPD) {
+               if(hdmi_drv->state == HDMI_SLEEP)
+                       hdmi_drv->state = WAIT_HOTPLUG;
+               queue_delayed_work(hdmi_drv->workqueue, &hdmi_drv->delay_work, msecs_to_jiffies(5));
+       }
+
+       //EDID Ready
+       if(i2cm_int & (m_SCDC_READREQ | m_I2CM_DONE | m_I2CM_ERROR)) {
+               spin_lock(&hdmi_drv->irq_lock);
+               hdmi_dev->edid_status = i2cm_int;
+               spin_unlock(&hdmi_drv->irq_lock);
+       }
+
+       //CEC
+       if(cec_int) {   //TODO Daisen wait to modify
+       }
+
+       //HDCP
+       if(hdmi_drv->hdcp_irq_cb)
+               hdmi_drv->hdcp_irq_cb(hdcp_int);
+
        return IRQ_HANDLED;
 }
 
index fade0975a54328c0d088bf90fc1263e20260dc56..75966b175796fb5a2c9b09749b2ec7c6fb22da06 100644 (file)
@@ -17,18 +17,13 @@ enum {
 /*Register and Field Descriptions*/
 /*Identification Registers*/
 #define IDENTIFICATION_BASE            0x0000
-enum IDENTIFICATION_REG{
-       DESIGN_ID = IDENTIFICATION_BASE,
-       REVISION_ID,
-       PRODUCT_ID0,
-       PRODUCT_ID1,
-       CONFIG0_ID,
-       CONFIG1_ID,
-       CONFIG2_ID,
-       CONFIG3_ID
-};
 
-//CONFIG0_ID
+#define        DESIGN_ID                       0x0000
+#define REVISION_ID                    0x0001
+#define PRODUCT_ID0                    0x0002
+#define PRODUCT_ID1                    0x0003
+
+#define CONFIG0_ID                     0x0004
 #define m_PREPEN               (1 << 7)
 #define m_AUDSPDIF             (1 << 5)
 #define m_AUDI2S               (1 << 4)
@@ -37,11 +32,11 @@ enum IDENTIFICATION_REG{
 #define m_CEC                  (1 << 1)
 #define m_HDCP                 (1 << 0)
 
-//CONFIG1_ID
+#define CONFIG1_ID                     0x0005
 #define m_HDMI20               (1 << 5)
 #define m_CONFAPB              (1 << 1)
 
-//CONFIG2_ID
+#define CONFIG2_ID                     0x0006
 enum PHYTYPE {
        HDMI_TX_PHY = 0x00,
        HDMI_MHL_WITH_HEAC_PHY = 0xb2,
@@ -50,39 +45,15 @@ enum PHYTYPE {
        HDMI_3D_TX_PHY = 0xf2
 };
 
-//CONFIG3_ID
+#define CONFIG3_ID                     0x0007
 #define m_AHB_AUD_DMA          (1 << 1)
 #define m_GP_AUD               (1 << 0)
 
 
 /*Interrupt Registers*/
 #define INTERRUPT_BASE                  0x0100
-enum INTERRUPT_REG {
-       IH_FC_STAT0 = INTERRUPT_BASE,
-       IH_FC_STAT1,
-       IH_FC_STAT2,
-       IH_AS_STAT0,
-       IH_PHY_STAT0,
-       IH_I2CM_STAT0,
-       IH_CEC_STAT0,
-       IH_VP_STAT0,
-       IH_I2CMPHY_STAT0,
-       IH_AHBDMAAUD_STAT0,
-       IH_DECODE = 0x0170,
-       IH_MUTE_FC_STAT0 = 0x0180,
-       IH_MUTE_FC_STAT1,
-       IH_MUTE_FC_STAT2,
-       IH_MUTE_AS_STAT0,
-       IH_MUTE_PHY_STAT0,
-       IH_MUTE_I2CM_STAT0,
-       IH_MUTE_CEC_STAT0,
-       IH_MUTE_VP_STAT0,
-       IH_MUTE_I2CMPHY_STAT0,
-       IH_MUTE_AHBDMAAUD_STAT0,
-       IH_MUTE = 0x1ff
-};
 
-//IH_FC_STAT0
+#define IH_FC_STAT0                    0x0100
 #define m_AUD_INFOFRAME                (1 << 7)
 #define m_AUD_CONTENT_PROTECT  (1 << 6)
 #define m_AUD_HBR              (1 << 5)
@@ -90,7 +61,7 @@ enum INTERRUPT_REG {
 #define m_AUD_CLK_REGEN                (1 << 1)
 #define m_NULL_PACKET          (1 << 0)
 
-//IH_FC_STAT1
+#define IH_FC_STAT1                    0x0101
 #define m_GMD                  (1 << 7)
 #define m_ISCR1                        (1 << 6)
 #define m_ISCR2                        (1 << 5)
@@ -99,18 +70,18 @@ enum INTERRUPT_REG {
 #define m_AVI_INFOFRAME                (1 << 1)
 #define m_GCP                  (1 << 0)
 
-//IH_FC_STAT2
+#define IH_FC_STAT2                    0x0102
 #define m_LOWPRIO_OVERFLOW     (1 << 1)
 #define m_HIGHPRIO_OVERFLOW    (1 << 0)
 
-//IH_AS_SATA0
+#define IH_AS_SATA0                    0x0103
 #define m_FIFO_UNDERRUN                (1 << 4)
 #define m_FIFO_OVERRUN         (1 << 3)
 #define m_AUD_FIFO_UDFLOW_THR  (1 << 2)
 #define m_AUD_FIFO_UDFLOW      (1 << 1)
 #define m_AUD_FIFO_OVERFLOW    (1 << 0)
 
-//IH_PHY_STAT0
+#define IH_PHY_STAT0                   0x0104
 #define m_RX_SENSE3            (1 << 5)
 #define m_RX_SENSE2            (1 << 4)
 #define m_RX_SENSE1            (1 << 3)
@@ -118,12 +89,12 @@ enum INTERRUPT_REG {
 #define m_TX_PHY_LOCK          (1 << 1)
 #define m_HPD                  (1 << 0)
 
-//IH_I2CM_STAT0
+#define IH_I2CM_STAT0                  0x0105
 #define m_SCDC_READREQ         (1 << 2)
 #define m_I2CM_DONE            (1 << 1)
 #define m_I2CM_ERROR           (1 << 0)
 
-//IH_CEC_STAT0
+#define IH_CEC_STAT0                   0x0106
 #define m_WAKEUP               (1 << 6)
 #define m_ERR_FOLLOW           (1 << 5)
 #define m_ERR_INITIATOR                (1 << 4)
@@ -132,7 +103,7 @@ enum INTERRUPT_REG {
 #define m_EOM                  (1 << 1)
 #define m_DONE                 (1 << 0)
 
-//IH_VP_STAT0
+#define IH_VP_STAT0                    0x0107
 #define m_FIFOFULL_REPET       (1 << 7)
 #define m_FIFOEMPTY_REPET      (1 << 6)
 #define m_FIFOFULL_PACK                (1 << 5)
@@ -142,11 +113,11 @@ enum INTERRUPT_REG {
 #define m_FIFOFULL_BYPASS      (1 << 1)
 #define m_FIFOEMPTY_BYPASS     (1 << 0)
 
-//IH_I2CMPHY_STAT0
+#define IH_I2CMPHY_STAT0               0x0108
 #define m_I2CMPHY_DONE         (1 << 1)
 #define m_I2CMPHY_ERR          (1 << 0)
 
-//IH_AHBDMAAUD_STAT0
+#define IH_AHBDMAAUD_STAT0             0x0109
 #define m_AUDDMA_INT_BUFOVERRUN        (1 << 6)
 #define m_AUDDMA_INT_ERR       (1 << 5)
 #define m_AUDDMA_INT_LOST      (1 << 4)
@@ -155,7 +126,7 @@ enum INTERRUPT_REG {
 #define m_AUDDMA_INT_BUFFULL   (1 << 1)
 #define m_AUDDMA_INT_BUFEMPTY  (1 << 0)
 
-//IH_DECODE
+#define IH_DECODE                      0x0170
 #define m_IH_FC_STAT0          (1 << 7)
 #define m_IH_FC_STAT1          (1 << 6)
 #define m_IH_FC_STAT2_VP       (1 << 5)
@@ -165,7 +136,7 @@ enum INTERRUPT_REG {
 #define m_IH_CEC_STAT0         (1 << 1)
 #define m_IH_AHBDMAAUD_STAT0   (1 << 0)
 
-//IH_MUTE_FC_STAT0
+#define IH_MUTE_FC_STAT0               0x0180
 #define m_AUDI_MUTE            (1 << 7)
 #define m_ACP_MUTE             (1 << 6)
 #define m_DST_MUTE             (1 << 4)
@@ -174,7 +145,7 @@ enum INTERRUPT_REG {
 #define m_ACR_MUTE             (1 << 1)
 #define m_NULL_MUTE            (1 << 0)
 
-//Ih_MUTE_FC_STAT1
+#define IH_MUTE_FC_STAT1               0x0181
 #define m_GMD_MUTE             (1 << 7)
 #define m_ISCR1_MUTE           (1 << 6)
 #define m_ISCR2_MUTE           (1 << 5)
@@ -183,18 +154,18 @@ enum INTERRUPT_REG {
 #define m_AVI_MUTE             (1 << 1)
 #define m_GCP_MUTE             (1 << 0)
 
-//IH_MUTE_FC_STAT2
+#define IH_MUTE_FC_STAT2               0x0182
 #define m_LPRIO_OVERFLOW_MUTE  (1 << 1)
 #define m_HPRIO_OVERFLOW_MUTE  (1 << 0)
 
-//IH_MUTE_AS_STAT0
+#define IH_MUTE_AS_STAT0               0x0183
 #define m_FIFO_UNDERRUN_MUTE   (1 << 4)
 #define m_FIFO_OVERRUN_MUTE    (1 << 3)
 #define m_AUD_FIFO_UDF_THR_MUTE        (1 << 2)
 #define m_AUD_FIFO_UDF_MUTE    (1 << 1)
 #define m_AUD_FIFO_OVF_MUTE    (1 << 0)
 
-//IH_MUTE_PHY_STAT0
+#define IH_MUTE_PHY_STAT0              0x0184
 #define m_RX_SENSE3_MUTE       (1 << 5)
 #define m_RX_SENSE2_MUTE       (1 << 4)
 #define m_RX_SENSE1_MUTE       (1 << 3)
@@ -202,12 +173,15 @@ enum INTERRUPT_REG {
 #define m_TX_PHY_LOCK_MUTE     (1 << 1)
 #define m_HPD_MUTE             (1 << 0)
 
-//IH_MUTE_I2CM_STAT0
+#define IH_MUTE_I2CM_STAT0             0x0185
 #define m_SCDC_READREQ_MUTE    (1 << 2)
+#define v_SCDC_READREQ_MUTE(n) (((n)&0x01) << 2)
 #define m_I2CM_DONE_MUTE       (1 << 1)
+#define v_I2CM_DONE_MUTE(n)    (((n)&0x01) << 1)
 #define m_I2CM_ERR_MUTE                (1 << 0)
+#define v_I2CM_ERR_MUTE(n)     (((n)&0x01) << 0)
 
-//IH_MUTE_CEC_STAT0
+#define IH_MUTE_CEC_STAT0              0x0186
 #define m_WAKEUP_MUTE          (1 << 6)
 #define m_ERR_FOLLOW_MUTE      (1 << 5)
 #define m_ERR_INITIATOR_MUTE   (1 << 4)
@@ -216,7 +190,7 @@ enum INTERRUPT_REG {
 #define m_EOM_MUTE             (1 << 1)
 #define m_DONE_MUTE            (1 << 0)
 
-//IH_MUTE_VP_STAT0
+#define IH_MUTE_VP_STAT0               0x0187
 #define m_FIFOFULL_REP_MUTE    (1 << 7)
 #define m_FIFOEMPTY_REP_MUTE   (1 << 6)
 #define m_FIFOFULL_PACK_MUTE   (1 << 5)
@@ -226,25 +200,17 @@ enum INTERRUPT_REG {
 #define m_FIFOFULL_BYP_MUTE    (1 << 1)
 #define m_FIFOEMPTY_BYP_MUTE   (1 << 0)
 
-//IH_MUTE_I2CMPHY_STAT0
+#define IH_MUTE_I2CMPHY_STAT0          0x0188
 #define m_I2CMPHY_DONE_MUTE    (1 << 1)
 #define m_I2CMPHY_ERR_MUTE     (1 << 0)
 
+#define IH_MUTE_AHBDMAAUD_STAT0                0x0189
+#define IH_MUTE                                0x01ff
 
 /*Video Sampler Registers*/
 #define VIDEO_SAMPLER_BASE             0x0200
-enum VIDEO_SAMPLER_REG {
-       TX_INVID0 = VIDEO_SAMPLER_BASE,
-       TX_INSTUFFING,
-       TX_GYDATA0,
-       TX_GYDATA1,
-       TX_RCRDATA0,
-       TX_RCRDATA1,
-       TX_BCBDATA0,
-       TX_BCBDATA1
-};
 
-//TX_INVID0
+#define TX_INVID0                      0x0200
 #define m_INTERNAL_DE_GEN      (1 << 7)
 #define v_INTERNAL_DE_GEN(n)   (((n)&0x01) << 7)
 enum VIDEO_MODE{
@@ -263,7 +229,7 @@ enum VIDEO_MODE{
 #define m_VIDEO_MAPPING                (0x1f << 0)
 #define v_VIDEO_MAPPING(n)     ((n)&0x1f)
 
-//TX_INSTUFFING
+#define TX_INSTUFFING                  0x0201
 #define m_BCBDATA_STUFF                (1 << 2)
 #define v_BCBDATA_STUFF(n)     (((n)&0x01) << 2)
 #define m_RCRDATA_STUFF                (1 << 1)
@@ -271,22 +237,21 @@ enum VIDEO_MODE{
 #define m_GYDATA_STUFF         (1 << 0)
 #define v_GYDATA_STUFF(n)      (((n)&0x01) << 0)
 
+#define TX_GYDATA0                     0x0202
+#define TX_GYDATA1                     0x0203
+#define TX_RCRDATA0                    0x0204
+#define TX_RCRDATA1                    0x0205
+#define TX_BCBDATA0                    0x0206
+#define TX_BCBDATA1                    0x0207
+
 
 /*Video Packetizer Registers*/
 #define VIDEO_PACKETIZER_BASE          0x0800
-enum VIDEO_PACKETIZER_REG {
-       VP_STATUS = VIDEO_PACKETIZER_BASE,
-       VP_PR_CD,
-       VP_STUFF,
-       VP_REMAP,
-       VP_CONF,
-       VP_MASK = 0x0807
-};
 
-//VP_STATUS
+#define VP_STATUS                      0x0800
 #define m_PACKING_PHASE                (0x0f << 0)
 
-//VP_PR_CD
+#define VP_PR_CD                       0x0801
 enum COLOR_DEPTH {
        COLOR_DEPTH_24BIT_DEFAULT = 0,
        COLOR_DEPTH_24BIT = 0x04,
@@ -311,7 +276,7 @@ enum PIXEL_REPET {
 #define m_DESIRED_PR_FACTOR    (0x07 << 0)
 #define v_DESIRED_PR_FACTOR(n) (((n)&0x07) << 0)
 
-//VP_STUFF
+#define VP_STUFF                       0x0802
 #define m_IDEFAULT_PHASE       (1 << 5)
 #define v_IDEFAULT_PHASE(n)    (((n)&0x01) << 5)
 #define m_IFIX_PP_TO_LAST      (1 << 4)
@@ -325,7 +290,7 @@ enum {
 #define m_PR_STUFFING          (1 << 0)
 #define v_PR_STUFFING(n)       (((n)&0x01) << 0)
 
-//VP_REMAP
+#define VP_REMAP                       0x0803
 enum YCC422_SIZE{
        YCC422_16BIT = 0,
        YCC422_20BIT,
@@ -334,7 +299,7 @@ enum YCC422_SIZE{
 #define m_YCC422_SIZE          (0x03 << 0)
 #define v_YCC422_SIZE(n)       (((n)&0x03) << 0)
 
-//VP_CONF
+#define VP_CONF                                0x0804
 #define m_BYPASS_EN            (1 << 6)
 #define v_BYPASS_EN(n)         (((n)&0x01) << 6)
 #define m_PIXEL_PACK_EN                (1 << 5)
@@ -353,7 +318,7 @@ enum {
 #define m_OUTPUT_SEL           (0x03 << 0)
 #define v_OUTPUT_SEL(n)                ((n&0x03) << 0)
 
-//VP_MASK
+#define VP_MASK                                0x0807
 #define m_OINTFULL_REPET       (1 << 7)
 #define m_OINTEMPTY_REPET      (1 << 6)
 #define m_OINTFULL_PACK                (1 << 5)
@@ -366,125 +331,262 @@ enum {
 
 /*Frame Composer Registers*/
 #define FRAME_COMPOSER_BASE            0x1000
-enum FRAME_COMPOSER_REG {
-       FC_INVIDCONF = FRAME_COMPOSER_BASE,
-       FC_INHACTIV0,
-       FC_INHACTIV1,
-       FC_INHBLANK0,
-       FC_INHBLANK1,
-       FC_INVACTIV0,
-       FC_INVACTIV1,
-       FC_INVBLANK,
-       FC_HSYNCINDELAY0,
-       FC_HSYNCINDELAY1,
-       FC_HSYNCINWIDTH0,
-       FC_HSYNCINWIDTH1,
-       FC_VSYNCINDELAY,
-       FC_VSYNCINWIDTH,
-       FC_INFREQ0,
-       FC_INFREQ1,
-       FC_INFREQ2,
-       FC_CTRLDUR,
-       FC_EXCTRLDUR,
-       FC_EXCTRLSPAC,
-       FC_CH0PREAM,
-       FC_CH1PREAM,
-       FC_CH2PREAM,
-       FC_AVICONF3,
-       FC_GCP,
-       FC_AVICONF0,
-       FC_AVICONF1,
-       FC_AVICONF2,
-       FC_AVIVID,
-       FC_AVIETB0,
-       FC_AVIETB1,
-       FC_AVISBB0,
-       FC_AVISBB1,
-       FC_AVIELB0,
-       FC_AVIELB1,
-       FC_AVISRB0,
-       FC_AVISRB1,
-       FC_AUDICONF0,
-       FC_AUDICONF1,
-       FC_AUDICONF2,
-       FC_AUDICONF3,
-       FC_VSDIEEEID2,
-       FC_VSDSIZE,
-       FC_VSDIEEEID1,
-       FC_VSDIEEEID0,
-       FC_VSDPAYLOAD0 = 0x1032,        //0~23
-       FC_SPDVENDORNAME0 = 0x104a,     //0~7
-       FC_SPDPRODUCTNAME0 = 0x1052,    //0~15
-       FC_SPDDEVICEINF = 0x1062,
-       FC_AUDSCONF,
-       FC_AUDSSTAT,
-       FC_AUDSV,
-       FC_AUDSU,
-       FC_AUDSCHNLS0,                  //0~8
-       FC_CTRLQHIGH = 0x1073,
-       FC_CTRLQLOW,
-       FC_ACP0,
-       FC_ACP16 = 0x1082,              //16~1
-       FC_ISCR1_0 = 0x1092,
-       FC_ISCR1_16,                    //16~1
-       FC_ISCR2_15 = 0x10a3,           //15~0
-       FC_DATAUTO0 = 0x10B3,
-       FC_DATAUTO1,
-       FC_DATAUTO2,
-       FC_DATMAN,
-       FC_DATAUTO3,
-       FC_RDRB0,
-       FC_RDRB1,
-       FC_RDRB2,
-       FC_RDRB3,
-       FC_RDRB4,
-       FC_RDRB5,
-       FC_RDRB6,
-       FC_RDRB7,
-       FC_MASK0 = 0x10d2,
-       FC_MASK1 = 0x10d6,
-       FC_MASK2 = 0x10da,
-       FC_PRCONF = 0x10e0,
-       FC_SCRAMBLER_CTRL,
-       FC_GMD_STAT,
-       FC_GMD_EN,
-       FC_GMD_UP,
-       FC_GMD_CONF,
-       FC_GMD_HB,
-       FC_GMD_PB0,                     //0~27
-       FC_DBGFORCE = 0x1200,
-       FC_DBGAUD0CH0,                  //aud0~aud2 ch0
-       FC_DBGAUD0CH1 = 0x1204,         //aud0~aud2 ch1
-       FC_DBGAUD0CH2 = 0x1207,         //aud0~aud2 ch2
-       FC_DBGAUD0CH3 = 0x120a,         //aud0~aud2 ch3
-       FC_DBGAUD0CH4 = 0x120d,         //aud0~aud2 ch4 
-       FC_DBGAUD0CH5 = 0x1210,         //aud0~aud2 ch5
-       FC_DBGAUD0CH6 = 0x1213,         //aud0~aud2 ch6
-       FC_DBGAUD0CH7 = 0x1216,         //aud0~aud2 ch7
-       FC_DBGTMDS0 = 0x1219,
-       FC_DBGTMDS1,
-       FC_DBGTMDS2             
+
+#define        FC_INVIDCONF                    0x1000
+#define m_FC_HDCP_KEEPOUT      (1 << 7)
+#define v_FC_HDCP_KEEPOUT(n)   (((n)&0x01) << 7)
+#define m_FC_VSYNC_POL         (1 << 6)
+#define v_FC_VSYNC_POL(n)      (((n)&0x01) << 6)
+#define m_FC_HSYNC_POL         (1 << 5)
+#define v_FC_HSYNC_POL(n)      (((n)&0x01) << 5)
+#define m_FC_DE_POL            (1 << 4)
+#define v_FC_DE_POL(n)         (((n)&0x01) << 4)
+#define m_FC_HDMI_DVI          (1 << 3)
+#define v_FC_HDMI_DVI(n)       (((n)&0x01) << 3)
+#define m_FC_VBLANK            (1 << 1)
+#define v_FC_VBLANK(n)         (((n)&0x01) << 1)
+#define m_FC_INTERLACE_MODE    (1 << 0)
+#define v_FC_INTERLACE_MODE(n) (((n)&0x01) << 0)
+
+#define        FC_INHACTIV0                    0x1001
+
+#define        FC_INHACTIV1                    0x1002
+#define m_FC_H_ACTIVE_13       (1 << 5)
+#define v_FC_H_ACTIVE_13(n)    (((n)&0x01) << 5)
+#define m_FC_H_ACTIVE_12       (1 << 4)
+#define v_FC_H_ACTIVE_12(n)    (((n)&0x01) << 4)
+#define m_FC_H_ACTIVE          (0x0f << 0)
+#define v_FC_H_ACTIVE(n)               (((n)&0x0f) << 0)
+
+#define        FC_INHBLANK0                    0x1003
+
+#define        FC_INHBLANK1                    0x1004
+#define m_FC_H_BLANK_12_11     (0x07 << 2)
+#define v_FC_H_BLANK_12_11(n)  (((n)&0x07) << 2)
+#define m_FC_H_BLANK           (0x03 << 0)
+#define v_FC_H_BLANK(n)                (((n)&0x03) << 0)
+
+#define        FC_INVACTIV0                    0x1005
+
+#define        FC_INVACTIV1                    0x1006
+#define m_FC_V_ACTIVE_12_11    (0x03 << 3)
+#define v_FC_V_ACTIVE_12_11(n) (((n)&0x03) << 3)
+#define m_FC_V_ACTIVE          (0x07 << 0)
+#define v_FC_V_ACTIVE(n)       (((n)&0x07) << 0)
+
+#define        FC_INVBLANK                     0x1007
+#define        FC_HSYNCINDELAY0                0x1008
+
+#define        FC_HSYNCINDELAY1                0x1009
+#define m_FC_H_SYNCFP_12_11    (0x03 << 3)
+#define v_FC_H_SYNCFP_12_11(n) (((n)&0x03) << 3)
+#define m_FC_H_SYNCFP          (0x07 << 0)
+#define v_FC_H_SYNCFP(n)       (((n)&0x07) << 0)
+
+#define        FC_HSYNCINWIDTH0                0x100a
+
+#define        FC_HSYNCINWIDTH1                0x100b
+#define m_FC_HSYNC_9           (1 << 1)
+#define v_FC_HSYNC_9(n)                (((n)&0x01) << 1)
+#define m_FC_HSYNC             (1 << 0)
+#define v_FC_HSYNC(n)          (((n)&0x01) << 0)
+
+#define        FC_VSYNCINDELAY                 0x100c
+#define        FC_VSYNCINWIDTH                 0x100d
+#define        FC_INFREQ0                      0x100e
+#define        FC_INFREQ1                      0x100f
+#define        FC_INFREQ2                      0x1010
+#define        FC_CTRLDUR                      0x1011
+#define        FC_EXCTRLDUR                    0x1012
+#define        FC_EXCTRLSPAC                   0x1013
+#define        FC_CH0PREAM                     0x1014
+#define        FC_CH1PREAM                     0x1015
+#define        FC_CH2PREAM                     0x1016
+
+#define        FC_AVICONF3                     0x1017
+enum YCC_QUAN_RANGE {
+       YQ_LIMITED_RANGE = 0,
+       YQ_FULL_RANGE,
+       RESERVED,
+};
+#define m_FC_YQ                        (0x03 << 2)
+#define v_FC_YQ(n)             (((n)&0x03) << 2)
+enum IT_CONTENT_TYPE {
+       CN_GRAPHICS = 0,
+       CN_PHOTO,
+       CN_CINEMA,
+       CN_GAME,
+};
+#define m_FC_CN                        (0x03 << 0)
+#define v_FC_CN(n)             (((n)&0x03) << 0)
+
+#define        FC_GCP                          0x1018
+#define m_FC_DEFAULT_PHASE     (1 << 2)
+#define v_FC_DEFAULT_PHASE(n)  (((n)&0x01) << 2)
+#define m_FC_SET_AVMUTE                (1 << 1)
+#define v_FC_SET_AVMUTE(n)     (((n)&0x01) << 1)
+#define m_FC_CLR_AVMUTE                (1 << 0)
+#define v_FC_CLR_AVMUTE(n)     (((n)&0x01) << 0)
+
+enum {
+       AVI_COLOR_MODE_RGB = 0,
+       AVI_COLOR_MODE_YCBCR422,
+       AVI_COLOR_MODE_YCBCR444
+};
+enum {
+       AVI_COLORIMETRY_NO_DATA = 0,
+       AVI_COLORIMETRY_SMPTE_170M,
+       AVI_COLORIMETRY_ITU709,
+       AVI_COLORIMETRY_EXTENDED
+};
+enum {
+       AVI_CODED_FRAME_ASPECT_NO_DATA,
+       AVI_CODED_FRAME_ASPECT_4_3,
+       AVI_CODED_FRAME_ASPECT_16_9
+};
+enum {
+       ACTIVE_ASPECT_RATE_SAME_AS_CODED_FRAME = 0x08,
+       ACTIVE_ASPECT_RATE_4_3,
+       ACTIVE_ASPECT_RATE_16_9,
+       ACTIVE_ASPECT_RATE_14_9
 };
 
+
+#define        FC_AVICONF0                     0x1019
+#define m_FC_RGC_YCC_2         (1 << 7)        //use for HDMI2.0 TX
+#define v_FC_RGC_YCC_2(n)      (((n)&0x01) << 7)
+#define m_FC_ACTIV_FORMAT      (1 << 6)
+#define v_FC_ACTIV_FORMAT(n)   (((n)&0x01) << 6)
+#define m_FC_SCAN_INFO         (0x03 << 4)
+#define v_FC_SCAN_INFO(n)      (((n)&0x03) << 4)
+#define m_FC_BAR_FORMAT                (0x03 << 2)
+#define v_FC_BAR_FORMAT(n)     (((n)&0x03) << 2)
+#define m_FC_RGC_YCC           (0x03 << 0)
+#define v_FC_RGC_YCC(n)                (((n)&0x03) << 0)
+
+#define        FC_AVICONF1                     0x101a
+#define m_FC_COLORIMETRY       (0x03 << 6)
+#define v_FC_COLORIMETRY(n)    (((n)&0x03) << 6)
+#define m_FC_PIC_ASPEC_RATIO   (0x03 << 4)
+#define v_FC_PIC_ASPEC_RATIO(n)        (((n)&0x03) << 4)
+#define m_FC_ACT_ASPEC_RATIO   (0x0f << 0)
+#define v_FC_ACT_ASPEC_RATIO(n)        (((n)&0x0f) << 0)
+
+#define        FC_AVICONF2                     0x101b
+#define m_FC_IT_CONTENT                (1 << 7)
+#define v_FC_IT_CONTENT(n)     (((n)&0x01) << 7)
+#define m_FC_EXT_COLORIMETRY   (0x07 << 4)
+#define v_FC_EXT_COLORIMETRY(n)        (((n)&0x07) << 4)
+#define m_FC_QUAN_RANGE                (0x03 << 2)
+#define v_FC_QUAN_RANGE(n)     (((n)&0x03) << 2)
+#define m_FC_NUN_PIC_SCALE     (0x03 << 0)
+#define v_FC_NUN_PIC_SCALE(n)  (((n)&0x03) << 0)
+
+#define        FC_AVIVID                       0x101c
+#define m_FC_AVIVID_H          (1 << 7)        //use for HDMI2.0 TX
+#define v_FC_AVIVID_H(n)       (((n)&0x01) << 7)
+#define m_FC_AVIVID            (0x7f << 0)
+#define v_FC_AVIVID(n)         (((n)&0x7f) << 0)
+
+#define        FC_AVIETB0                      0x101d
+#define        FC_AVIETB1                      0x101e
+#define        FC_AVISBB0                      0x101f
+#define        FC_AVISBB1                      0x1020
+#define        FC_AVIELB0                      0x1021
+#define        FC_AVIELB1                      0x1022
+#define        FC_AVISRB0                      0x1023
+#define        FC_AVISRB1                      0x1024
+
+#define        FC_AUDICONF0                    0x1025
+#define m_FC_CHN_CNT           (0x07 << 4)
+#define v_FC_CHN_CNT(n)                (((n)&0x07) << 4)
+#define m_FC_CODING_TYEP       (0x0f << 0)
+#define v_FC_CODING_TYEP(n)    (((n)&0x0f) << 0)
+
+#define        FC_AUDICONF1                    0x1026
+#define m_FC_SAMPLE_SIZE       (0x03 << 4)
+#define v_FC_SAMPLE_SIZE(n)    (((n)&0x03) << 4)
+#define m_FC_SAMPLE_FREQ       (0x07 << 0)
+#define v_FC_SAMPLE_FREQ(n)    (((n)&0x07) << 0)
+
+#define        FC_AUDICONF2                    0x1027
+
+#define        FC_AUDICONF3                    0x1028
+#define m_FC_LFE_PBL           (0x03 << 5)     //only use for HDMI1.4 TX
+#define v_FC_LFE_PBL(n)                (((n)&0x03) << 5)
+#define m_FC_DM_INH            (1 << 4)
+#define v_FC_DM_INH(n)         (((n)&0x01) << 4)
+#define m_FC_LSV               (0x0f << 0)
+#define v_FC_LSV(n)            (((n)&0x0f) << 0)
+
+#define        FC_VSDIEEEID2                   0x1029
+#define        FC_VSDSIZE                      0x102a
+#define        FC_VSDIEEEID1                   0x1030
+#define        FC_VSDIEEEID0                   0x1031
+#define        FC_VSDPAYLOAD0                  0x1032  //0~23
+#define        FC_SPDVENDORNAME0               0x104a  //0~7
+#define        FC_SPDPRODUCTNAME0              0x1052  //0~15
+#define        FC_SPDDEVICEINF                 0x1062
+#define        FC_AUDSCONF                     0x1063
+#define        FC_AUDSSTAT                     0x1064
+#define        FC_AUDSV                        0x1065
+#define        FC_AUDSU                        0x1066
+#define        FC_AUDSCHNLS0                   0x1067  //0~8
+#define        FC_CTRLQHIGH                    0x1073
+#define        FC_CTRLQLOW                     0x1074
+#define        FC_ACP0                         0x1075
+#define        FC_ACP16                        0x1082  //16~1
+#define        FC_ISCR1_0                      0x1092
+#define        FC_ISCR1_16                     0x1093  //16~1
+#define        FC_ISCR2_15                     0x10a3  //15~0
+#define        FC_DATAUTO0                     0x10b3
+#define        FC_DATAUTO1                     0x10b4
+#define        FC_DATAUTO2                     0x10b5
+#define        FC_DATMAN                       0x10b6
+#define        FC_DATAUTO3                     0x10b7
+#define        FC_RDRB0                        0x10b8
+#define        FC_RDRB1                        0x10b9
+#define        FC_RDRB2                        0x10ba
+#define        FC_RDRB3                        0x10bb
+#define        FC_RDRB4                        0x10bc
+#define        FC_RDRB5                        0x10bd
+#define        FC_RDRB6                        0x10be
+#define        FC_RDRB7                        0x10bf
+#define        FC_MASK0                        0x10d2
+#define        FC_MASK1                        0x10d6
+#define        FC_MASK2                        0x10da
+#define        FC_PRCONF                       0x10e0
+
+#define        FC_SCRAMBLER_CTRL               0x10e1
+#define m_FC_SCRAMBLE_UCP      (1 << 4)
+#define v_FC_SCRAMBLE_UCP(n)   (((n)&0x01) << 4)
+#define m_FC_SCRAMBLE_EN       (1 << 0)
+#define v_FC_SCRAMBLE_EN(n)    (((n)&0x01) << 0)
+
+#define        FC_GMD_STAT                     0x1100
+#define        FC_GMD_EN                       0x1101
+#define        FC_GMD_UP                       0x1102
+#define        FC_GMD_CONF                     0x1103
+#define        FC_GMD_HB                       0x1104
+#define        FC_GMD_PB0                      0x1105  //0~27
+#define        FC_DBGFORCE                     0x1200
+#define        FC_DBGAUD0CH0                   0x1201  //aud0~aud2 ch0
+#define        FC_DBGAUD0CH1                   0x1204  //aud0~aud2 ch1
+#define        FC_DBGAUD0CH2                   0x1207  //aud0~aud2 ch2
+#define        FC_DBGAUD0CH3                   0x120a  //aud0~aud2 ch3
+#define        FC_DBGAUD0CH4                   0x120d  //aud0~aud2 ch4
+#define        FC_DBGAUD0CH5                   0x1210  //aud0~aud2 ch5
+#define        FC_DBGAUD0CH6                   0x1213  //aud0~aud2 ch6
+#define        FC_DBGAUD0CH7                   0x1216  //aud0~aud2 ch7
+#define        FC_DBGTMDS0                     0x1219
+#define        FC_DBGTMDS1                     0x121a
+#define        FC_DBGTMDS2                     0x121b
+
+
 /*HDMI Source PHY Registers*/
 #define HDMI_SOURCE_PHY_BASE           0x3000
-enum HDMI_SOURCE_PHY_REG {
-       PHY_CONF0 = HDMI_SOURCE_PHY_BASE,
-       PHY_TST0,
-       PHY_TST1,
-       PHY_TST2,
-       PHY_STAT0,
-       PHY_INT0,
-       PHY_MASK0,
-       PHY_POL0,
-       PHY_PCLFREQ0,
-       PHY_PCLFREQ1,
-       PHY_PLLCFGFREQ0,
-       PHY_PLLCFGFREQ1,
-       PHY_PLLCFGFREQ2
-};
 
-//PHY_CONF0
+#define PHY_CONF0                      0x3000
 #define m_POWER_DOWN_EN                (1 << 7)                //enable depend on PHY_GEN2=0 and PHY_EXTERNAL=0
 #define v_POWER_DOWN_EN(n)     (((n)&0x01) << 7)
 #define m_TMDS_EN              (1 << 6)                //enable depend on PHY_GEN2=0 and PHY_EXTERNAL=0
@@ -502,12 +604,17 @@ enum HDMI_SOURCE_PHY_REG {
 #define m_SEL_INTERFACE                (1 << 0)
 #define v_SEL_INTERFACE(n)     (((n)&0x01) << 0)
 
-//PHY_TST0
+#define PHY_TST0                       0x3001
 #define m_TEST_CLR_SIG         (1 << 5)
 #define m_TEST_EN_SIG          (1 << 4)
 #define m_TEST_CLK_SIG         (1 << 0)
 
-//PHY_STAT0/PHY_INI0/PHY_MASK/PHY_POL0
+#define PHY_TST1                       0x3002
+#define PHY_TST2                       0x3003
+#define PHY_STAT0                      0x3004
+#define PHY_INI0                       0x3005
+#define PHY_MASK                       0x3006
+#define PHY_POL0                       0x3007
 #define m_PHY_RX_SENSE3                (1 << 7)
 #define v_PHY_TX_SENSE3(n)     (((n)&0x01) << 7)
 #define m_PHY_RX_SENSE2                (1 << 6)
@@ -521,93 +628,72 @@ enum HDMI_SOURCE_PHY_REG {
 #define m_PHY_LOCK             (1 << 0)
 #define v_PHY_LOCK(n)          (((n)&0x01) << 0)
 
+#define PHY_PCLFREQ0                   0x3008
+#define PHY_PCLFREQ1                   0x3009
+#define PHY_PLLCFGFREQ0                        0x300a
+#define PHY_PLLCFGFREQ1                        0x300b
+#define PHY_PLLCFGFREQ2                        0x300c
+
 
 /*I2C Master PHY Registers*/
 #define I2C_MASTER_PHY_BASE            0x3020
-enum I2C_MASTER_PHY_REG {
-       PHY_I2CM_SLAVE = I2C_MASTER_PHY_BASE,
-       PHY_I2CM_ADDRESS,
-       PHY_I2CM_DATAO_1,
-       PHY_I2CM_DATAO_0,
-       PHY_I2CM_DATAI_1,
-       PHY_I2CM_DATAI_0,
-       PHY_I2CM_OPERATION,
-       PHY_I2CM_INT,
-       PHY_I2CM_CTLINT,
-       PHY_I2CM_DIV,
-       PHY_I2CM_SOFTRSTZ,
-       PHY_I2CM_SS_SCL_HCNT_1_ADDR,
-       PHY_I2CM_SS_SCL_HCNT_0_ADDR,
-       PHY_I2CM_SS_SCL_LCNT_1_ADDR,
-       PHY_I2CM_SS_SCL_LCNT_0_ADDR,
-       PHY_I2CM_FS_SCL_HCNT_1_ADDR,
-       PHY_I2CM_FS_SCL_HCNT_0_ADDR,
-       PHY_I2CM_FS_SCL_LCNT_1_ADDR,
-       PHY_I2CM_FS_SCL_LCNT_0_ADDR,
-       I2CM_PHY_SDA_HOLD
-};
 
-//PHY_I2CM_OPERATION
-#define v_I2CM_WRITE           (1 << 4)
-#define v_I2CM_READ            (1 << 0)
-
-//PHY_I2CM_INT
-#define m_I2CM_DONE_INT_POL    (1 << 3)
-#define v_I2CM_DONE_INT_POL(n) (((n)&0x01) << 3)
-#define m_I2CM_DONE_MASK       (1 << 2)
-#define v_I2CM_DONE_MASK(n)    (((n)&0x01) << 2)
-#define m_I2CM_DONE_INT                (1 << 1)
-#define m_I2CM_DONE_STATUS     (1 << 0)
-
-//PHY_I2CM_CTLINT
-#define m_I2CM_NACK_POL                (1 << 7)
-#define v_I2CM_NACK_POL(n)     (((n)&0x01) << 7)
-#define m_I2CM_NACK_MASK       (1 << 6)
-#define v_I2CM_NACK_MASK(n)    (((n)&0x01) << 6)
-#define m_I2CM_NACK_INT                (1 << 5)
-#define m_I2CM_NACK_STATUS     (1 << 4)
-#define m_I2CM_ARB_POL         (1 << 3)
-#define v_I2CM_ARB_POL(n)      (((n)&0x01) << 3)
-#define m_I2CM_ARB_MASK                (1 << 2)
-#define v_I2CM_ARB_MASK(n)     (((n)&0x01) << 2)
-#define m_I2CM_ARB_INT         (1 << 1)
-#define m_I2CM_ARB_STATUS      (1 << 0)
-
-//PHY_I2CM_DIV
-enum {
-       STANDARD_MODE = 0,
-       FAST_MODE
-};
-#define m_I2CM_FAST_STD_MODE   (1 << 3)
-#define v_I2CM_FAST_STD_MODE   (((n)&0x01) << 3)
-
-//PHY_I2CM_SOFTRSTZ
-#define m_I2CM_SOFTRST         (1 << 0)
-#define v_I2CM_SOFTRST         (((n)&0x01) << 0)
+#define        PHY_I2CM_SLAVE                  0x3020
+#define        PHY_I2CM_ADDRESS                0x3021
+#define        PHY_I2CM_DATAO_1                0x3022
+#define        PHY_I2CM_DATAO_0                0x3023
+#define        PHY_I2CM_DATAI_1                0x3024
+#define        PHY_I2CM_DATAI_0                0x3025
+
+#define        PHY_I2CM_OPERATION              0x3026
+#define m_PHY_I2CM_WRITE       (1 << 4)
+#define m_PHY_I2CM_READ                (1 << 0)
+
+#define        PHY_I2CM_INT                    0x3027
+#define m_PHY_I2CM_DONE_INT_POL        (1 << 3)
+#define v_PHY_I2CM_DONE_INT_POL(n) (((n)&0x01) << 3)
+#define m_PHY_I2CM_DONE_MASK   (1 << 2)
+#define v_PHY_I2CM_DONE_MASK(n)        (((n)&0x01) << 2)
+#define m_PHY_I2CM_DONE_INT    (1 << 1)
+#define m_PHY_I2CM_DONE_STATUS (1 << 0)
+
+#define        PHY_I2CM_CTLINT                 0x3028
+#define m_PHY_I2CM_NACK_POL    (1 << 7)
+#define v_PHY_I2CM_NACK_POL(n) (((n)&0x01) << 7)
+#define m_PHY_I2CM_NACK_MASK   (1 << 6)
+#define v_PHY_I2CM_NACK_MASK(n)        (((n)&0x01) << 6)
+#define m_PHY_I2CM_NACK_INT    (1 << 5)
+#define m_PHY_I2CM_NACK_STATUS (1 << 4)
+#define m_PHY_I2CM_ARB_POL     (1 << 3)
+#define v_PHY_I2CM_ARB_POL(n)  (((n)&0x01) << 3)
+#define m_PHY_I2CM_ARB_MASK    (1 << 2)
+#define v_PHY_I2CM_ARB_MASK(n) (((n)&0x01) << 2)
+#define m_PHY_I2CM_ARB_INT     (1 << 1)
+#define m_PHY_I2CM_ARB_STATUS  (1 << 0)
+
+#define        PHY_I2CM_DIV                    0x3029
+#define m_PHY_I2CM_FAST_STD    (1 << 3)
+#define v_PHY_I2CM_FAST_STD(n) (((n)&0x01) << 3)
+
+#define        PHY_I2CM_SOFTRSTZ               0x302a
+#define m_PHY_I2CM_SOFTRST     (1 << 0)
+#define v_PHY_I2CM_SOFTRST(n)  (((n)&0x01) << 0)
+
+#define        PHY_I2CM_SS_SCL_HCNT_1_ADDR     0x302b
+#define        PHY_I2CM_SS_SCL_HCNT_0_ADDR     0x302c
+#define        PHY_I2CM_SS_SCL_LCNT_1_ADDR     0x302d
+#define        PHY_I2CM_SS_SCL_LCNT_0_ADDR     0x302e
+#define        PHY_I2CM_FS_SCL_HCNT_1_ADDR     0x302f
+#define        PHY_I2CM_FS_SCL_HCNT_0_ADDR     0x3030
+#define        PHY_I2CM_FS_SCL_LCNT_1_ADDR     0x3031
+#define        PHY_I2CM_FS_SCL_LCNT_0_ADDR     0x3032
+#define        I2CM_PHY_SDA_HOLD               0x3033
 
 
 /*Audio Sampler Registers*/
 #define AUDIO_SAMPLER_BASE             0x3100
-enum AUDIO_SAMPLER_REG {
-       AUD_CONF0 = AUDIO_SAMPLER_BASE,
-       AUD_CONF1,
-       AUD_INT,
-       AUD_CONF2,
-       AUD_INT1,
-       AUD_N1 = 0x3200,
-       AUD_N2,
-       AUD_N3,
-       AUD_CTS1,
-       AUD_CTS2,
-       AUD_CTS3,
-       AUD_INPUTCLKFS,
-       AUD_SPDIF0 = 0x3300,
-       AUD_SPDIF1,
-       AUD_SPDIFINT,
-       AUD_SPDIFINT1
-};
 
-//AUD_CONF0
+#define AUD_CONF0                      0x3100
 #define m_SW_AUD_FIFO_RST      (1 << 7)
 #define v_SW_AUD_FIFO_RST(n)   (((n)&0x01) << 7)
 enum {
@@ -616,10 +702,16 @@ enum {
 };
 #define m_I2S_SEL              (1 << 5)
 #define v_I2S_SEL(n)           (((n)&0x01) << 5)
+enum {
+       I2S_CHANNEL_1_2 = 1,
+       I2S_CHANNEL_3_4 = 3,
+       I2S_CHANNEL_5_6 = 7,
+       I2S_CHANNEL_7_8 = 0xf
+};
 #define m_I2S_IN_EN            (0x0f << 0)
-#define v_I2S_IN_EN(v)         (((n)&0x0f) << 0)
+#define v_I2S_IN_EN(n)         (((n)&0x0f) << 0)
 
-//AUD_CONF1
+#define AUD_CONF1                      0x3101
 enum I2S_MODE {
        I2S_STANDARD_MODE = 0,
        I2S_RIGHT_JUSTIFIED_MODE,
@@ -643,29 +735,64 @@ enum I2S_WIDTH {
 #define m_I2S_WIDTH            (0x1f << 0)
 #define v_I2S_WIDTH(n)         (((n)&0x1f) << 0)
 
-//AUD_INT/AUD_SPDIFINT
+#define AUD_INT                                0x3102
+#define AUD_SPDIFINT                   0x3302
 #define m_FIFO_EMPTY_MASK      (1 << 3)
 #define v_FIFO_EMPTY_MASK(n)   (((n)&0x01) << 3)
 #define m_FIFO_FULL_MASK       (1 << 2)
 #define v_FIFO_FULL_MASK(n)    (((n)&0x01) << 2)
 
-//AUD_CONF2
+#define AUD_CONF2                      0x3103
 #define m_NLPCM_EN             (1 << 1)
 #define v_NLPCM_EN(n)          (((n)&0x01) << 1)
 #define m_HBR_EN               (1 << 0)
 #define v_HBR_EN(n)            (((n)&0x01) << 0)
 
-//AUD_INT1/AUD_SPDIFINT1
+#define AUD_INT1                       0x3104
+#define AUD_SPDIFINT1                  0x3303
 #define m_FIFO_OVERRUN_MASK    (1 << 4)
 #define v_FIFO_OVERRUN_MASK(n) (((n)&0x01) << 4)
 
-//AUD_N3
+/***************N-CTS Table**************/
+/*     TMDS LOWCLK:    <=148.5M        */
+/*     TMDS MIDCLK:    297M            */
+/*     TMDS HIGHCLK:   594M            */
+#define N_32K_LOWCLK           0x1000
+#define N_32K_MIDCLK           0x0c00
+#define N_32K_HIGHCLK          0x0c00
+#define N_441K_LOWCLK          0x1880
+#define N_441K_MIDCLK          0x1260
+#define N_441K_HIGHCLK         0x24c0
+#define N_48K_LOWCLK           0x1800
+#define N_48K_MIDCLK           0x1400
+#define N_48K_HIGHCLK          0x1800
+#define N_882K_LOWCLK          0x3100
+#define N_882K_MIDCLK          0x24c0
+#define N_882K_HIGHCLK                 0x4980
+#define N_96K_LOWCLK           0x3000
+#define N_96K_MIDCLK           0x2800
+#define N_96K_HIGHCLK          0x3000
+#define N_1764K_LOWCLK                 0x6200
+#define N_1764K_MIDCLK                 0x4980
+#define N_1764K_HIGHCLK        0x9300
+#define N_192K_LOWCLK          0x6000
+#define N_192K_MIDCLK          0x5000
+#define N_192K_HIGHCLK                 0x6000
+/****************************************/
+
+#define AUD_N1                         0x3200
+#define AUD_N2                         0x3201
+
+#define AUD_N3                         0x3202
 #define m_NCTS_ATOMIC_WR       (1 << 7)
 #define v_NCTS_ATOMIC_WR(n)    (((n)&0x01) << 7)
 #define m_AUD_N3               (0x0f << 0)
 #define v_AUD_N3(n)            (((n)&0x0f) << 0)
 
-//AUD_CTS3
+#define AUD_CTS1                       0x3203
+#define AUD_CTS2                       0x3204
+
+#define AUD_CTS3                       0x3205
 enum {
        N_SHIFT_1 = 0,
        N_SHIFT_16,
@@ -682,7 +809,7 @@ enum {
 #define m_AUD_CTS3             (0x0f << 0)
 #define v_AUD_CTS3(n)          (((n)&0x0f) << 0)
 
-//AUD_INPUTCLKFS
+#define AUD_INPUTCLKFS                 0x3206
 enum {
        FS_128 = 0,
        FS_256,
@@ -693,13 +820,17 @@ enum {
 #define m_LFS_FACTOR           (0x07 << 0)
 #define v_LFS_FACTOR(n)                (((n)&0x07) << 0)
 
-//AUD_SPDIF0
+#define AUD_SPDIF0                     0x3300
 #define m_SW_SAUD_FIFO_RST     (1 << 7)
 #define v_SW_SAUD_FIFO_RST     (((n)&0x01) << 7)
 
-//AUD_SPDIF1
+#define AUD_SPDIF1                     0x3301
+enum {
+       PCM_LINEAR = 0,
+       PCM_NONLINEAR
+};
 #define m_SET_NLPCM            (1 << 7)
-#define v_SET_NLPCM            (((n)&0x01) << 7)
+#define v_SET_NLPCM(n)         (((n)&0x01) << 7)
 #define m_SPDIF_HBR_MODE       (1 << 6)
 #define v_SPDIF_HBR_MODE(n)    (((n)&0x01) << 6)
 #define m_SPDIF_WIDTH          (0x1f << 0)
@@ -708,49 +839,38 @@ enum {
 
 /*Generic Parallel Audio Interface Registers*/
 #define GP_AUDIO_INTERFACE_BASE                0x3500
-enum GP_AUDIO_INTERFACE_REG {
-       GP_CONF0 = GP_AUDIO_INTERFACE_BASE,
-       GP_CONF1,
-       GP_CONF2,
-       GP_MASK = 0x3506
-};
+
+#define        GP_CONF0                        0x3500
+#define        GP_CONF1                        0x3501
+#define        GP_CONF2                        0x3502
+#define        GP_MASK                         0x3506
+
 
 /*Audio DMA Registers*/
 #define AUDIO_DMA_BASE                 0x3600
-enum AUDIO_DMA_REG {
-       AHB_DMA_CONF0 = AUDIO_DMA_BASE,
-       AHB_DMA_START,
-       AHB_DMA_STOP,
-       AHB_DMA_THRSLD,
-       AHB_DMA_STRADDR_SET0_0,         //0~3
-       AHB_DMA_STPADDR_SET0_0 = 0x3608,//0~3
-       AHB_DMA_BSTADDR0 = 0x360c,      //0~3
-       AHB_DMA_MBLENGTH0 = 0x3610,     //0~3,
-       AHB_DMA_MASK = 0x3614,
-       AHB_DMA_CONF1 = 0x3616,
-       AHB_DMA_BUFFMASK = 0x3619,
-       AHB_DMA_MASK1 = 0x361b,
-       AHB_DMA_STATUS,
-       AHB_DMA_CONF2,
-       AHB_DMA_STRADDR_SET1_0 = 0x3620,//0~3
-       AHB_DMA_STPADDR_SET1_0 = 0x3624 //0~3
-};
+
+#define        AHB_DMA_CONF0                   0x3600
+#define        AHB_DMA_START                   0x3601
+#define        AHB_DMA_STOP                    0x3602
+#define        AHB_DMA_THRSLD                  0x3603
+#define        AHB_DMA_STRADDR_SET0_0          0x3604  //0~3
+#define        AHB_DMA_STPADDR_SET0_0          0x3608  //0~3
+#define        AHB_DMA_BSTADDR0                0x360c  //0~3
+#define        AHB_DMA_MBLENGTH0               0x3610  //0~3,
+#define        AHB_DMA_MASK                    0x3614
+#define        AHB_DMA_CONF1                   0x3616
+#define        AHB_DMA_BUFFMASK                0x3619
+#define        AHB_DMA_MASK1                   0x361b
+#define        AHB_DMA_STATUS                  0x361c
+#define        AHB_DMA_CONF2                   0x361d
+#define        AHB_DMA_STRADDR_SET1_0          0x3620  //0~3
+#define        AHB_DMA_STPADDR_SET1_0          0x3624  //0~3
+
 
 /*Main Controller Registers*/
-#define MAIN_CONTROLLER_BASE           0X4000
-enum MAIN_CONTROLLER_REG {
-       MC_CLKDIS = 0x4001,
-       MC_SWRSTZREQ,
-       MC_OPCTRL,
-       MC_FLOWCTRL,
-       MC_PHYRSTZ,
-       MC_LOCKONCLOCK,
-       MC_HEACPHY_RST,
-       MC_LOCKONCLOCK2,
-       MC_SWRSTZREQ_2
-};
+#define MAIN_CONTROLLER_BASE           0x4000
 
-//MC_CLKDIS
+#define MC_CLKDIS                      0x4001
 #define m_HDCPCLK_DISABLE      (1 << 6)
 #define v_HDCPCLK_DISABLE(n)   (((n)&0x01) << 6)
 #define m_CECCLK_DISABLE       (1 << 5)
@@ -766,7 +886,7 @@ enum MAIN_CONTROLLER_REG {
 #define m_PIXELCLK_DISABLE     (1 << 0)
 #define v_PIXELCLK_DISABLE(n)  (((n)&0x01) << 0)
 
-//MC_SWRSTZREQ
+#define MC_SWRSTZREQ                   0x4002
 #define m_IGPA_SWRST           (1 << 7)
 #define v_IGPA_SWRST(n)                (((n)&0x01) << 7)
 #define m_CEC_SWRST            (1 << 6)
@@ -782,19 +902,19 @@ enum MAIN_CONTROLLER_REG {
 #define m_PIXEL_SWRST           (1 << 0)
 #define v_PIXEL_SWRST(n)        (((n)&0x01) << 0)
 
-//MC_OPCTRL
+#define MC_OPCTRL                      0x4003
 #define m_HDCP_BLOCK_BYP       (1 << 0)
 #define v_HDCP_BLOCK_BYP(n)    (((n)&0x01) << 0)
 
-//MC_FLOWCTRL
+#define MC_FLOWCTRL                    0x4004
 #define m_FEED_THROUGH_OFF      (1 << 0)
 #define v_FEED_THROUGH_OFF(n)   (((n)&0x01) << 0)
 
-//MC_PHYRSTZ
+#define MC_PHYRSTZ                     0x4005
 #define m_PHY_RSTZ             (1 << 0)
 #define v_PHY_RSTZ(n)          (((n)&0x01) << 0)
 
-//MC_LOCKONCLOCK
+#define MC_LOCKONCLOCK                 0x4006
 #define m_IGPACLK_ON           (1 << 7)
 #define v_IGPACLK_ON(n)                (((n)&0x01) << 7)
 #define m_PCLK_ON              (1 << 6)
@@ -810,183 +930,237 @@ enum MAIN_CONTROLLER_REG {
 #define m_CECCLK_ON                    (1 << 0)
 #define v_CECCLK_ON(n)                 (((n)&0x01) << 0)
 
-//MC_HEACPHY_RST
+#define MC_HEACPHY_RST                 0x4007
 #define m_HEAC_PHY_RST         (1 << 0)
 #define v_HEAC_PHY_RST(n)      (((n)&0x01) << 0)
 
-//MC_LOCKONCLOCK_2
+#define MC_LOCKONCLOCK_2               0x4009
 #define m_AHB_AUD_DMA_CLK       (1 << 0)
 #define v_AHB_AUD_DMA_CLK(n)    (((n)&0x01) << 0)
 
-//MC_SWRSTZREQ_2
+#define MC_SWRSTZREQ_2                 0x400a
 #define m_AHB_AUD_DMA_RST       (1 << 7)
 #define v_AHB_AUD_DMA_RST(n)    (((n)&0x01) << 7)
 
 
 /*Color Space Converter Registers*/
 #define COLOR_SPACE_CONVERTER_BASE     0x4100
-enum COLOR_SPACE_CONVERTER_REG {
-       CSC_CFG = COLOR_SPACE_CONVERTER_BASE,
-       CSC_SCALE,
-       CSC_COEF_A1_MSB,
-       CSC_COEF_A1_LSB,
-       CSC_COEF_A2_MSB,
-       CSC_COEF_A2_LSB,
-       CSC_COEF_A3_MSB,
-       CSC_COEF_A3_LSB,
-       CSC_COEF_A4_MSB,
-       CSC_COEF_A4_LSB,
-       CSC_COEF_B1_MSB,
-       CSC_COEF_B1_LSB,
-       CSC_COEF_B2_MSB,
-       CSC_COEF_B2_LSB,
-       CSC_COEF_B3_MSB,
-       CSC_COEF_B3_LSB,
-       CSC_COEF_B4_MSB,
-       CSC_COEF_B4_LSB,
-       CSC_COEF_C1_MSB,
-       CSC_COEF_C1_LSB,
-       CSC_COEF_C2_MSB,
-       CSC_COEF_C2_LSB,
-       CSC_COEF_C3_MSB,
-       CSC_COEF_C3_LSB,
-       CSC_COEF_C4_MSB,
-       CSC_COEF_C4_LSB,
-       CSC_SPARE_1,
-       CSC_SPARE_2
-};
 
-//CSC_CFG
-#define m_INTMODE              (0x03 << 4)
-#define v_INTMODE(n)           (((n)&0x03) << 4)
-#define m_DECMODE              (0x03 << 0)
-#define v_DECMODE(n)           (((n)&0x03) << 0)
+#define        CSC_CFG                         0x4100
+#define m_CSC_INTMODE          (0x03 << 4)
+#define v_CSC_INTMODE(n)       (((n)&0x03) << 4)
+#define m_CSC_DECMODE          (0x03 << 0)
+#define v_CSC_DECMODE(n)       (((n)&0x03) << 0)
 
-//CSC_SCALE
+#define        CSC_SCALE                       0x4101
 #define m_CSC_COLOR_DEPTH      (0x0f << 4)
-#define v_CSC_COLOR_DEPTH      (((n)&0x0f) >> 4)
+#define v_CSC_COLOR_DEPTH(n)   (((n)&0x0f) >> 4)
 #define m_CSC_SCALE            (0x03 << 0)
-#define v_CSC_SCALE            (((n)&0x03) >> 0)
-
+#define v_CSC_SCALE(n)         (((n)&0x03) >> 0)
+
+#define        CSC_COEF_A1_MSB                 0x4102
+#define        CSC_COEF_A1_LSB                 0x4103
+#define        CSC_COEF_A2_MSB                 0x4104
+#define        CSC_COEF_A2_LSB                 0x4105
+#define        CSC_COEF_A3_MSB                 0x4106
+#define        CSC_COEF_A3_LSB                 0x4107
+#define        CSC_COEF_A4_MSB                 0x4108
+#define        CSC_COEF_A4_LSB                 0x4109
+#define        CSC_COEF_B1_MSB                 0x410a
+#define        CSC_COEF_B1_LSB                 0x410b
+#define        CSC_COEF_B2_MSB                 0x410c
+#define        CSC_COEF_B2_LSB                 0x410d
+#define        CSC_COEF_B3_MSB                 0x410e
+#define        CSC_COEF_B3_LSB                 0x410f
+#define        CSC_COEF_B4_MSB                 0x4110
+#define        CSC_COEF_B4_LSB                 0x4111
+#define        CSC_COEF_C1_MSB                 0x4112
+#define        CSC_COEF_C1_LSB                 0x4113
+#define        CSC_COEF_C2_MSB                 0x4114
+#define        CSC_COEF_C2_LSB                 0x4115
+#define        CSC_COEF_C3_MSB                 0x4116
+#define        CSC_COEF_C3_LSB                 0x4117
+#define        CSC_COEF_C4_MSB                 0x4118
+#define        CSC_COEF_C4_LSB                 0x4119
+#define        CSC_SPARE_1                     0x411a
+#define        CSC_SPARE_2                     0x411b
 
 
 /*HDCP Encryption Engine Registers*/
 #define HDCP_ENCRYPTION_ENGINE_BASE    0x5000
-enum HDCP_ENCRYPTION_REG {
-       A_HDCPCFG0 = HDCP_ENCRYPTION_ENGINE_BASE,
-       A_HDCPCFG1,
-       A_HDCPOBS0,
-       A_HDCPOBS1,
-       A_HDCPOBS2,
-       A_HDCPOBS3,
-       A_APIINTCLR,
-       A_APIINTSTAT,
-       A_APIINTMSK,
-       A_VIDPOLCFG,
-       A_OESSWCFG,
-       A_COREVERLSB = 0x5014,
-       A_COREVERMSB,
-       A_KSVMEMCTRL,
-       HDCP_BSTATUS_0 = 0x5020,
-       HDCP_BSTATUS_1,
-       HDCP_M0_0,
-       HDCP_M0_1,
-       HDCP_M0_2,
-       HDCP_M0_3,
-       HDCP_M0_4,
-       HDCP_M0_5,
-       HDCP_M0_6,
-       HDCP_M0_7,
-       HDCP_KSV,                       //0~634
-       HDCP_VH = 0x52a5,               //0~19
-       HDCP_REVOC_SIZE_0 = 0x52b9,
-       HDCP_REVOC_SIZE_1,
-       HDCP_REVOC_LIST,                //0~5059
-};
+
+#define        A_HDCPCFG0                      0x5000
+#define        A_HDCPCFG1                      0x5001
+#define        A_HDCPOBS0                      0x5002
+#define        A_HDCPOBS1                      0x5003
+#define        A_HDCPOBS2                      0x5004
+#define        A_HDCPOBS3                      0x5005
+#define        A_APIINTCLR                     0x5006
+#define        A_APIINTSTAT                    0x5007
+#define        A_APIINTMSK                     0x5008
+#define        A_VIDPOLCFG                     0x5009
+#define        A_OESSWCFG                      0x500a
+#define        A_COREVERLSB                    0x5014
+#define        A_COREVERMSB                    0x5015
+#define        A_KSVMEMCTRL                    0x5016
+#define        HDCP_BSTATUS_0                  0x5020
+#define        HDCP_BSTATUS_1                  0x5021
+#define        HDCP_M0_0                       0x5022
+#define        HDCP_M0_1                       0x5023
+#define        HDCP_M0_2                       0x5024
+#define        HDCP_M0_3                       0x5025
+#define        HDCP_M0_4                       0x5026
+#define        HDCP_M0_5                       0x5027
+#define        HDCP_M0_6                       0x5028
+#define        HDCP_M0_7                       0x5029
+#define        HDCP_KSV                        0x502a  //0~634
+#define        HDCP_VH                         0x52a5  //0~19
+#define        HDCP_REVOC_SIZE_0               0x52b9
+#define        HDCP_REVOC_SIZE_1               0x52ba
+#define        HDCP_REVOC_LIST                 0x52bb  //0~5059
+
 
 /*HDCP BKSV Registers*/
 #define HDCP_BKSV_BASE                 0x7800
-enum HDCP_BKSV_REG {
-       HDCPREG_BKSV0 = HDCP_BKSV_BASE,
-       HDCPREG_BKSV1,
-       HDCPREG_BKSV2,
-       HDCPREG_BKSV3,
-       HDCPREG_BKSV4
-};
+
+#define        HDCPREG_BKSV0                   0x7800
+#define        HDCPREG_BKSV1                   0x7801
+#define        HDCPREG_BKSV2                   0x7802
+#define        HDCPREG_BKSV3                   0x7803
+#define        HDCPREG_BKSV4                   0x7804
+
 
 /*HDCP AN Registers*/
 #define HDCP_AN_BASE                   0x7805
-enum HDCP_AN_REG {
-       HDCPREG_ANCONF = HDCP_AN_BASE,
-       HDCPREG_AN0,
-       HDCPREG_AN1,
-       HDCPREG_AN2,
-       HDCPREG_AN3,
-       HDCPREG_AN4,
-       HDCPREG_AN5,
-       HDCPREG_AN6,
-       HDCPREG_AN7
-};
+
+#define        HDCPREG_ANCONF                  0x7805
+#define        HDCPREG_AN0                     0x7806
+#define        HDCPREG_AN1                     0x7807
+#define        HDCPREG_AN2                     0x7808
+#define        HDCPREG_AN3                     0x7809
+#define        HDCPREG_AN4                     0x780a
+#define        HDCPREG_AN5                     0x780b
+#define        HDCPREG_AN6                     0x780c
+#define        HDCPREG_AN7                     0x780d
+
 
 /*Encrypted DPK Embedded Storage Registers*/
 #define ENCRYPTED_DPK_EMBEDDED_BASE    0x780e
-enum ENCRYPTED_DPK_EMBEDDED_REG {
-       HDCPREG_RMCTL = ENCRYPTED_DPK_EMBEDDED_BASE,
-       HDCPREG_RMSTS,
-       HDCPREG_SEED0,
-       HDCPREG_SEED1,
-       HDCPREG_DPK0,
-       HDCPREG_DPK1,
-       HDCPREG_DPK2,
-       HDCPREG_DPK3,
-       HDCPREG_DPK4,
-       HDCPREG_DPK5,
-       HDCPREG_DPK6
-};
+
+#define        HDCPREG_RMCTL                   0x780e
+#define        HDCPREG_RMSTS                   0x780f
+#define        HDCPREG_SEED0                   0x7810
+#define        HDCPREG_SEED1                   0x7811
+#define        HDCPREG_DPK0                    0x7812
+#define        HDCPREG_DPK1                    0x7813
+#define        HDCPREG_DPK2                    0x7814
+#define        HDCPREG_DPK3                    0x7815
+#define        HDCPREG_DPK4                    0x7816
+#define        HDCPREG_DPK5                    0x7817
+#define        HDCPREG_DPK6                    0x7818
+
 
 /*CEC Engine Registers*/
 #define CEC_ENGINE_BASE                        0x7d00
-enum CEC_ENGINE_REG {
-       CEC_CTRL = CEC_ENGINE_BASE,
-       CEC_MASK = 0x7d02,
-       CEC_ADDR_L = 0x7d05,
-       CEC_ADDR_H,
-       CEC_TX_CNT,
-       CEC_RX_CNT,
-       CEC_TX_DATA0 = 0x7d10,          //txdata0~txdata15
-       CEC_RX_DATA0 = 0x7d20,          //rxdata0~rxdata15
-       CEC_LOCK = 0x7d30,
-       CEC_WKUPCTRL
-};
+
+#define        CEC_CTRL                        0x7d00
+#define        CEC_MASK                        0x7d02
+#define        CEC_ADDR_L                      0x7d05
+#define        CEC_ADDR_H                      0x7d06
+#define        CEC_TX_CNT                      0x7d07
+#define        CEC_RX_CNT                      0x7d08
+#define        CEC_TX_DATA0                    0x7d10  //txdata0~txdata15
+#define        CEC_RX_DATA0                    0x7d20  //rxdata0~rxdata15
+#define        CEC_LOCK                        0x7d30
+#define        CEC_WKUPCTRL                    0x7d31
+
 
 /*I2C Master Registers*/
 #define I2C_MASTER_BASE                        0x7e00
-enum I2C_MASTER_REG {
-       I2CM_SLAVE = I2C_MASTER_BASE,
-       I2CM_ADDRESS,
-       I2CM_DATAO,
-       I2CM_DATAI,
-       I2CM_OPERATION,
-       I2CM_INT,
-       I2CM_CTLINT,
-       I2CM_DIV,
-       I2CM_SEGADDR,
-       I2CM_SOFTRSTZ,
-       I2CM_SEGPTR,
-       I2CM_SS_SCL_HCNT_1_ADDR,
-       I2CM_SS_SCL_HCNT_0_ADDR,
-       I2CM_SS_SCL_LCNT_1_ADDR,
-       I2CM_SS_SCL_LCNT_0_ADDR,
-       I2CM_FS_SCL_HCNT_1_ADDR,
-       I2CM_FS_SCL_HCNT_0_ADDR,
-       I2CM_FS_SCL_LCNT_1_ADDR,
-       I2CM_FS_SCL_LCNT_0_ADDR,
-       I2CM_SDA_HOLD,
-       I2CM_SCDC_READ_UPDATE,
-       I2CM_READ_BUFF0 = 0x7e20,               //buff0~buff7
-       I2CM_SCDC_UPDATE0 = 0x7e30,
-       I2CM_SCDC_UPDATE1
-};   
+
+#define        I2CM_SLAVE                      0x7e00
+#define        I2CM_ADDRESS                    0x7e01
+#define        I2CM_DATAO                      0x7e02
+#define        I2CM_DATAI                      0x7e03
+
+#define I2CM_OPERATION                 0x7e04
+#define m_I2CM_WR              (1 << 4)
+#define v_I2CM_WR(n)           (((n)&0x01) << 4)
+#define m_I2CM_RD8_EXT         (1 << 3)
+#define v_I2CM_RD8_EXT(n)      (((n)&0x01) << 3)
+#define m_I2CM_RD8             (1 << 2)
+#define v_I2CM_RD8(n)          (((n)&0x01) << 2)
+#define m_I2CM_RD_EXT          (1 << 1)
+#define v_I2CM_RD_EXT(n)       (((n)&0x01) << 1)
+#define m_I2CM_RD              (1 << 0)
+#define v_I2CM_RD(n)           (((n)&0x01) << 0)
+
+#define        I2CM_INT                        0x7e05
+#define m_I2CM_RD_REQ_MASK     (1 << 6)
+#define v_I2CM_RD_REQ_MASK(n)  (((n)&0x01) << 6)
+#define m_I2CM_DONE_MASK       (1 << 2)
+#define v_I2CM_DONE_MASK(n)    (((n)&0x01) << 2)
+
+#define        I2CM_CTLINT                     0x7e06
+#define m_I2CM_NACK_MASK       (1 << 6)
+#define v_I2CM_NACK_MASK(n)    (((n)&0x01) << 6)
+#define m_I2CM_ARB_MASK                (1 << 2)
+#define v_I2CM_ARB_MASK(n)     (((n)&0x01) << 2)
+
+#define        I2CM_DIV                        0x7e07
+enum {
+       STANDARD_MODE = 0,
+       FAST_MODE
+};
+#define m_I2CM_FAST_STD_MODE   (1 << 3)
+#define v_I2CM_FAST_STD_MODE(n)        (((n)&0x01) << 3)
+
+#define        I2CM_SEGADDR                    0x7e08
+#define m_I2CM_SEG_ADDR                (0x7f << 0)
+#define v_I2CM_SEG_ADDR(n)     (((n)&0x7f) << 0)
+
+#define        I2CM_SOFTRSTZ                   0x7e09
+#define m_I2CM_SOFTRST         (1 << 0)
+#define v_I2CM_SOFTRST(n)      (((n)&0x01) << 0)
+
+#define        I2CM_SEGPTR                     0x7e0a
+#define        I2CM_SS_SCL_HCNT_1_ADDR         0x7e0b
+#define        I2CM_SS_SCL_HCNT_0_ADDR         0x7e0c
+#define        I2CM_SS_SCL_LCNT_1_ADDR         0x7e0d
+#define        I2CM_SS_SCL_LCNT_0_ADDR         0x7e0e
+#define        I2CM_FS_SCL_HCNT_1_ADDR         0x7e0f
+#define        I2CM_FS_SCL_HCNT_0_ADDR         0x7e10
+#define        I2CM_FS_SCL_LCNT_1_ADDR         0x7e11
+#define        I2CM_FS_SCL_LCNT_0_ADDR         0x7e12
+#define        I2CM_SDA_HOLD                   0x7e13
+
+#define        I2CM_SCDC_READ_UPDATE           0x7e14
+#define m_I2CM_UPRD_VSYNC_EN   (1 << 5)
+#define v_I2CM_UPRD_VSYNC_EN(n) (((n)&0x01) << 5)
+#define m_I2CM_READ_REQ_EN     (1 << 4)
+#define v_I2CM_READ_REQ_EN(n)  (((n)&0x01) << 4)
+#define m_I2CM_READ_UPDATE     (1 << 0)
+#define v_I2CM_READ_UPDATE(n)  (((n)&0x01) << 0)
+
+#define        I2CM_READ_BUFF0                 0x7e20  //buff0~buff7
+#define        I2CM_SCDC_UPDATE0               0x7e30
+#define        I2CM_SCDC_UPDATE1               0x7e31
+
+
+enum{
+       INPUT_IIS,
+       INPUT_SPDIF
+};
+
+/* Color Space Convertion Mode */
+enum {
+       CSC_RGB_0_255_TO_ITU601_16_235 = 0,     //RGB 0-255 input to YCbCr 16-235 output according BT601
+       CSC_RGB_0_255_TO_ITU709_16_235,         //RGB 0-255 input to YCbCr 16-235 output accroding BT709
+       CSC_ITU601_16_235_TO_RGB_16_235,        //YCbCr 16-235 input to RGB 16-235 output according BT601
+       CSC_ITU709_16_235_TO_RGB_16_235,        //YCbCr 16-235 input to RGB 16-235 output according BT709
+       CSC_ITU601_16_235_TO_RGB_0_255,         //YCbCr 16-235 input to RGB 0-255 output according BT601
+       CSC_ITU709_16_235_TO_RGB_0_255          //YCbCr 16-235 input to RGB 0-255 output according BT709
+};
 
 
 struct rk3288_hdmi_device {
@@ -995,6 +1169,7 @@ struct rk3288_hdmi_device {
        int                     regbase_phy;
        int                     regsize_phy;
        int                     lcdc_id;
+       int                     edid_status;
        struct device           *dev;
        struct clk              *hclk;                          //HDMI AHP clk
        struct hdmi             driver;
@@ -1002,11 +1177,9 @@ struct rk3288_hdmi_device {
 };
 
 
-static inline int hdmi_readl(struct rk3288_hdmi_device *hdmi_dev, u16 offset, u32 *val)
+static inline u32 hdmi_readl(struct rk3288_hdmi_device *hdmi_dev, u16 offset)
 {
-        int ret = 0;
-       *val = readl_relaxed(hdmi_dev->regbase + (offset) * 0x04);
-        return ret;
+       return readl_relaxed(hdmi_dev->regbase + (offset) * 0x04);
 }
 
 static inline int hdmi_writel(struct rk3288_hdmi_device *hdmi_dev, u16 offset, u32 val)
@@ -1026,6 +1199,7 @@ static inline int hdmi_msk_reg(struct rk3288_hdmi_device *hdmi_dev, u16 offset,
 }
 
 int rk3288_hdmi_initial(struct hdmi *hdmi_drv);
+void rk3288_hdmi_control_output(struct hdmi *hdmi_drv, int enable);
 
 
 #endif