rk2928: hdmi driver work OK
authoryzq <yzq@rock-chips.com>
Thu, 9 Aug 2012 03:00:22 +0000 (11:00 +0800)
committeryzq <yzq@rock-chips.com>
Thu, 9 Aug 2012 03:06:06 +0000 (11:06 +0800)
drivers/video/rockchip/hdmi/chips/rk2928/rk2928_hdmi.c
drivers/video/rockchip/hdmi/chips/rk2928/rk2928_hdmi_hw.c

index 09b55b1c9d8634c08028f0a9c6862513cc989957..e3d4bcc5763d558ff200a3b468797c64c4c2e80e 100755 (executable)
@@ -65,8 +65,8 @@ static void hdmi_early_suspend(struct early_suspend *h)
        flush_delayed_work(&hdmi->delay_work);\r
        // When HDMI 1.1V and 2.5V power off, DDC channel will be pull down, current is produced\r
        // from VCC_IO which is pull up outside soc. We need to switch DDC IO to GPIO.\r
-//     rk2928_mux_api_set(GPIO0A7_I2C3_SDA_HDMI_DDCSDA_NAME, GPIO0A_GPIO0A7);\r
-//     rk2928_mux_api_set(GPIO0A6_I2C3_SCL_HDMI_DDCSCL_NAME, GPIO0A_GPIO0A6);\r
+       rk30_mux_api_set(GPIO0A7_I2C3_SDA_HDMI_DDCSDA_NAME, GPIO0A_GPIO0A7);\r
+       rk30_mux_api_set(GPIO0A6_I2C3_SCL_HDMI_DDCSCL_NAME, GPIO0A_GPIO0A6);\r
        return;\r
 }\r
 \r
@@ -75,8 +75,8 @@ static void hdmi_early_resume(struct early_suspend *h)
        hdmi_dbg(hdmi->dev, "hdmi exit early resume\n");\r
        mutex_lock(&hdmi->enable_mutex);\r
        \r
-//     rk2928_mux_api_set(GPIO0A7_I2C3_SDA_HDMI_DDCSDA_NAME, GPIO0A_HDMI_DDCSDA);\r
-//     rk2928_mux_api_set(GPIO0A6_I2C3_SCL_HDMI_DDCSCL_NAME, GPIO0A_HDMI_DDCSCL);\r
+       rk30_mux_api_set(GPIO0A7_I2C3_SDA_HDMI_DDCSDA_NAME, GPIO0A_HDMI_DDCSDA);\r
+       rk30_mux_api_set(GPIO0A6_I2C3_SCL_HDMI_DDCSCL_NAME, GPIO0A_HDMI_DDCSCL);\r
        \r
        hdmi->suspend = 0;\r
        rk2928_hdmi_initial();\r
@@ -93,9 +93,9 @@ static inline void hdmi_io_remap(void)
        unsigned int value;\r
        \r
        // Remap HDMI IO Pin\r
-//     rk2928_mux_api_set(GPIO0A7_I2C3_SDA_HDMI_DDCSDA_NAME, GPIO0A_HDMI_DDCSDA);\r
-//     rk2928_mux_api_set(GPIO0A6_I2C3_SCL_HDMI_DDCSCL_NAME, GPIO0A_HDMI_DDCSCL);\r
-//     rk2928_mux_api_set(GPIO0B7_HDMI_HOTPLUGIN_NAME, GPIO0B_HDMI_HOTPLUGIN);\r
+       rk30_mux_api_set(GPIO0A7_I2C3_SDA_HDMI_DDCSDA_NAME, GPIO0A_HDMI_DDCSDA);\r
+       rk30_mux_api_set(GPIO0A6_I2C3_SCL_HDMI_DDCSCL_NAME, GPIO0A_HDMI_DDCSCL);\r
+       rk30_mux_api_set(GPIO0B7_HDMI_HOTPLUGIN_NAME, GPIO0B_HDMI_HOTPLUGIN);\r
                \r
        // Select LCDC0 as video source and enabled.\r
 //     value = (HDMI_SOURCE_DEFAULT << 14) | (1 << 30);\r
@@ -130,8 +130,8 @@ static int __devinit rk2928_hdmi_probe (struct platform_device *pdev)
        }\r
        hdmi->xscale = 95;\r
        hdmi->yscale = 95;\r
-#if 0  \r
-       hdmi->hclk = clk_get(NULL,"hclk_hdmi");\r
+#if 1  \r
+       hdmi->hclk = clk_get(NULL,"pclk_hdmi");\r
        if(IS_ERR(hdmi->hclk))\r
        {\r
                dev_err(hdmi->dev, "Unable to get hdmi hclk\n");\r
index 4f6e636cc956a5e31622ca6cc3d50f3cb990b740..fb1c0686cbef9b9afda602012983ff07a4b0d174 100755 (executable)
@@ -33,17 +33,19 @@ static void rk2928_hdmi_sys_power_down(void)
 
 static void rk2928_hdmi_set_pwr_mode(int mode)
 {
+       int c=0;
        hdmi_dbg(hdmi->dev,"%s \n",__FUNCTION__);
        if(hdmi->pwr_mode == mode)
-               return;
+               return; 
     switch(mode){
      case NORMAL:
                rk2928_hdmi_sys_power_down();
-           HDMIWrReg(0xe3, 0x82);
-           HDMIWrReg(0xe5, 0x00);
-           HDMIWrReg(0xe4, 0x00);
-           HDMIWrReg(0xe7, 0x00);
-               HDMIWrReg(0xe1, 0x8e);
+           HDMIWrReg(0xe0, 0x0a);
+           HDMIWrReg(0xe1, 0x03);
+           HDMIWrReg(0xe2, 0x99);
+           HDMIWrReg(0xe3, 0x0f);
+               HDMIWrReg(0xe4, 0x00);
+               HDMIWrReg(0xec, 0x02);
                HDMIWrReg(0xce, 0x00);
                HDMIWrReg(0xce, 0x01);
                rk2928_hdmi_av_mute(1);
@@ -53,11 +55,12 @@ static void rk2928_hdmi_set_pwr_mode(int mode)
        case LOWER_PWR:
                rk2928_hdmi_av_mute(0);
                rk2928_hdmi_sys_power_down();
-           HDMIWrReg(0xe3, 0x02);
-           HDMIWrReg(0xe5, 0x1c);
-           HDMIWrReg(0xe1, 0x8c);
-           HDMIWrReg(0xe7, 0x04);
-           HDMIWrReg(0xe4, 0x03);
+               HDMIWrReg(0xe0, 0x0a);
+           HDMIWrReg(0xe1, 0x03);
+           HDMIWrReg(0xe2, 0x99);
+           HDMIWrReg(0xe3, 0x0f);
+               HDMIWrReg(0xe4, 0x00);
+               HDMIWrReg(0xec, 0x02);
                break;
        default:
            hdmi_dbg(hdmi->dev,"unkown rk2928 hdmi pwr mode %d\n",mode);
@@ -266,13 +269,6 @@ static int rk2928_hdmi_config_video(struct hdmi_video_para *vpara)
        else {
                hdmi_dbg(hdmi->dev, "[%s] sucess output DVI.\n", __FUNCTION__); 
        }
-       // Power on TMDS
-       HDMIWrReg(PHY_PRE_EMPHASIS, v_PRE_EMPHASIS(0) | v_TMDS_PWRDOWN(0)); // TMDS power on
-       
-       // Enable TMDS
-       value = HDMIRdReg(PHY_DRIVER);
-       value |= v_TX_ENABLE(1);
-       HDMIWrReg(PHY_DRIVER, value);
 
        return 0;
 }
@@ -412,8 +408,8 @@ irqreturn_t hdmi_irq(int irq, void *priv)
        interrupt1 = HDMIRdReg(INTERRUPT_STATUS1);
        HDMIWrReg(INTERRUPT_STATUS1, interrupt1);
 #if 1
-               hdmi_dbg(hdmi->dev, "[%s] interrupt1 %02x interrupt2 %02x \n",\
-                        __FUNCTION__, interrupt1, interrupt2);
+               hdmi_dbg(hdmi->dev, "[%s] interrupt1 %02x  \n",\
+                        __FUNCTION__, interrupt1);
 #endif
        if(interrupt1 & m_INT_HOTPLUG ){
                if(hdmi->state == HDMI_SLEEP)
@@ -435,6 +431,14 @@ irqreturn_t hdmi_irq(int irq, void *priv)
        return IRQ_HANDLED;
 }
 
+static void rk2928_hdmi_reset(void)
+{
+       writel_relaxed(0x00010001,RK2928_CRU_BASE+ 0x128);
+       msleep(100);
+       writel_relaxed(0x00010000, RK2928_CRU_BASE + 0x128);
+       rk2928_hdmi_set_pwr_mode(NORMAL);
+}
+
 int rk2928_hdmi_initial(void)
 {
        int rc = HDMI_ERROR_SUCESS;
@@ -446,8 +450,8 @@ int rk2928_hdmi_initial(void)
        hdmi->config_audio = rk2928_hdmi_config_audio;
        hdmi->detect_hotplug = rk2928_hdmi_detect_hotplug;
        hdmi->read_edid = rk2928_hdmi_read_edid;
-       // internal hclk = hdmi_hclk/20
-       //HDMIWrReg(0x800, HDMI_INTERANL_CLK_DIV);
+       
+       rk2928_hdmi_reset();
        
        if(hdmi->hdcp_power_on_cb)
                rc = hdmi->hdcp_power_on_cb();