update hdmi driver
authorkfx <kfx@rock-chips.com>
Fri, 6 May 2011 01:23:14 +0000 (09:23 +0800)
committerkfx <kfx@rock-chips.com>
Fri, 6 May 2011 01:23:14 +0000 (09:23 +0800)
drivers/video/hdmi/hdmi-new/chips/anx7150.c
drivers/video/hdmi/hdmi-new/chips/anx7150_hw.c
drivers/video/hdmi/hdmi-new/chips/anx7150_hw.h
drivers/video/hdmi/hdmi-new/hdmi-codec.c [changed mode: 0644->0755]
drivers/video/hdmi/hdmi-new/hdmi-core.c
drivers/video/hdmi/hdmi-new/hdmi-fb.c
drivers/video/hdmi/hdmi-new/hdmi-sysfs.c
drivers/video/hdmi/hdmi-old/chips/anx7150_hw.c
include/linux/hdmi-new.h
sound/soc/codecs/wm8900.c

index 1032398f85673ca366310c1f2e5c56a01d7b6bff..f977d7f41974add268920dab91ee5c3b966dcc3c 100755 (executable)
@@ -37,7 +37,8 @@ int anx7150_i2c_write_p1_reg(struct i2c_client *client, char reg, char *val)
 static int anx7150_param_chg(struct anx7150_pdata *anx)\r
 {\r
        int resolution_real;\r
-       \r
+\r
+       hdmi_set_spk(anx->hdmi->display_on);\r
        hdmi_switch_fb(anx->hdmi, anx->hdmi->display_on);\r
        resolution_real = ANX7150_Get_Optimal_resolution(anx->hdmi->resolution);\r
        HDMI_Set_Video_Format(resolution_real);\r
@@ -60,23 +61,22 @@ static int anx7150_insert(struct hdmi *hdmi)
        struct anx7150_pdata *anx = hdmi_priv(hdmi);\r
 \r
        anx7150_plug(anx->client);\r
-       if(anx->is_changed) {\r
-               if(ANX7150_Parse_EDID(anx->client,&anx->dev) < 0)\r
-               {\r
-                       dev_info(&anx->client->dev, "parse EDID error\n");\r
-                       anx7150_unplug(anx->client);\r
-                       return -1;\r
-               }\r
-               while(--tmo && ANX7150_GET_SENSE_STATE(anx->client) != 1)\r
-                       mdelay(10);\r
-               if(tmo <= 0)\r
-               {\r
-                       anx7150_unplug(anx->client);\r
-                       return -1;\r
-               }\r
-               anx->is_changed = 0;\r
+       if(ANX7150_Parse_EDID(anx->client,&anx->dev) < 0)\r
+       {\r
+               dev_info(&anx->client->dev, "parse EDID error\n");\r
+               anx7150_unplug(anx->client);\r
+               return -1;\r
        }\r
-       \r
+               \r
+       while(--tmo && ANX7150_GET_SENSE_STATE(anx->client) != 1)\r
+               mdelay(10);\r
+       if(tmo <= 0)\r
+       {\r
+               anx7150_unplug(anx->client);\r
+               return -1;\r
+       }\r
+       if(!hdmi->display_on)\r
+               return 0;\r
        anx7150_param_chg(anx);\r
        return 0;\r
 }\r
@@ -85,6 +85,7 @@ static int anx7150_remove(struct hdmi *hdmi)
        struct anx7150_pdata *anx = hdmi_priv(hdmi);\r
 \r
        anx7150_unplug(anx->client);\r
+       hdmi_set_spk(HDMI_DISABLE);\r
        hdmi_switch_fb(hdmi, HDMI_DISABLE);\r
 \r
        return 0;\r
@@ -166,7 +167,8 @@ static void anx7150_early_suspend(struct early_suspend *h)
        dev_info(&anx->client->dev, "anx7150 enter early suspend\n");\r
        anx->is_early_suspend = 1;\r
        flush_delayed_work(&anx->work);\r
-       hdmi_suspend(anx->hdmi);\r
+       if(anx->hdmi->display_on)\r
+               hdmi_suspend(anx->hdmi);\r
 \r
        return;\r
 }\r
@@ -179,7 +181,8 @@ static void anx7150_early_resume(struct early_suspend *h)
                                                        early_suspend);\r
        dev_info(&anx->client->dev, "anx7150 exit early suspend\n");\r
        anx->is_early_suspend = 0;\r
-       ret = hdmi_resume(anx->hdmi);\r
+       if(anx->hdmi->display_on)\r
+               ret = hdmi_resume(anx->hdmi);\r
        return;\r
 \r
 }\r
index c8be59e6162a28f2c8aefc2041bbb8e878add4d5..0b0a79371e38fba4c5b5c04ecc613885ea9e2356 100755 (executable)
@@ -461,7 +461,7 @@ static int anx7150_hardware_initial(struct i2c_client *client)
        rc = anx7150_i2c_write_p0_reg(client, ANX7150_SYS_CTRL1_REG, &c);//power down HDCP, 090630\r
 \r
        rc = anx7150_i2c_read_p0_reg(client, ANX7150_SYS_CTRL3_REG, &c);//jack wen, for spdif input from SD0.\r
-       c &= (0xef);\r
+       c &= (0xfe);\r
        rc = anx7150_i2c_write_p0_reg(client, ANX7150_SYS_CTRL3_REG, &c);//power down all, 090630\r
 \r
        return rc;\r
@@ -598,7 +598,7 @@ int anx7150_plug(struct i2c_client *client)
        return rc;\r
 }\r
 \r
-static int anx7150_set_avmute(struct i2c_client *client)\r
+int anx7150_set_avmute(struct i2c_client *client)\r
 {\r
        int rc = 0;\r
        char c;\r
index 63fb5a5b181c856a824cc4ce6c21bdf5ccbbf06d..baf289e389f3282fd288d82cf3e94e9f26a992c4 100755 (executable)
@@ -1262,6 +1262,7 @@ void  HDMI_Set_Video_Format(u8 video_format);
 void  HDMI_Set_Audio_Fs( u8 audio_fs);\r
 int ANX7150_PLAYBACK_Process(void);\r
 int ANX7150_Blue_Screen(struct anx7150_pdata *anx);\r
+int anx7150_set_avmute(struct i2c_client *client);\r
 \r
 \r
 #endif\r
old mode 100644 (file)
new mode 100755 (executable)
index e10c312..fe0adfd
@@ -1,6 +1,11 @@
 #include <linux/hdmi-new.h>
+extern void wm8990_set_spk(bool on);
 
 int hdmi_codec_set_audio_fs(unsigned char audio_fs)
 {
        return 0;
 }
+void hdmi_set_spk(int on)
+{
+       wm8990_set_spk(!on);
+}
\ No newline at end of file
index 3a7f04f9a6c623e0216b616ac5bbfa18cc53b697..f5d64984d51988694ca59f4add12640329f2b429 100755 (executable)
@@ -133,6 +133,15 @@ struct hdmi *get_hdmi_struct(int nr)
        else\r
                return ref_info[nr].hdmi;\r
 }\r
+int hdmi_is_insert(void)\r
+{\r
+       struct hdmi *hdmi = get_hdmi_struct(0);\r
+\r
+       if(hdmi && hdmi->ops && hdmi->ops->hdmi_precent)\r
+               return hdmi->ops->hdmi_precent(hdmi);\r
+       else\r
+               return 0;\r
+}\r
 static int __init hdmi_class_init(void)\r
 {\r
        int i;\r
index 057d413f3a88d9185907d74bb8f524d567119e19..6673def1ba98dbab1611f9eb98aa0719fee066da 100755 (executable)
@@ -257,8 +257,8 @@ int hdmi_switch_fb(struct hdmi *hdmi, int type)
 int hdmi_resolution_changed(struct hdmi *hdmi, int xres, int yres, int video_on)
 {
        int ret = 0;
-       if(hdmi->display_on == 0|| hdmi->plug == 0)
-               return ret;
+       if(!hdmi->display_on || !hdmi->ops->hdmi_precent(hdmi) || !hdmi->auto_switch)
+               return 0;
        if(xres > 1280 && hdmi->resolution != HDMI_1920x1080p_50Hz) 
        {
                hdmi->resolution = HDMI_1920x1080p_50Hz;
index c3dc2afa0eb56e2f278bf7baddc301dd18c4cf4d..6a8523dae90532e895c32644d52ae11c7f1c8b11 100755 (executable)
@@ -10,20 +10,20 @@ static ssize_t hdmi_show_state_attrs(struct device *dev,
        struct hdmi *hdmi = dev_get_drvdata(dev);\r
 \r
        return sprintf(buf, "display_on=%d\n"\r
-                                               //"plug=%d\n"\r
+                                               "plug=%d\n"\r
+                                               "auto_switch=%d\n"\r
+                                               "hdcp_on=%d\n"\r
+                                               "audio_fs=%d\n"\r
+                                               "resolution=%d\n"\r
                                                "--------------------------\n"\r
                                                "resolution support:\n"\r
                                                "0 -- 1280x720p_50Hz\n"\r
                                                "1 -- 1280x720p_60Hz\n"\r
                                                "2 -- 720x576p_50Hz\n"\r
                                                "3 -- 1920x1080p_50Hz\n"\r
-                                               "--------------------------\n"\r
-                                               //"auto_switch=%d\n"\r
-                                               "hdcp_on=%d\n"\r
-                                               "audio_fs=%d\n"\r
-                                               "resolution=%d\n", \r
-                                               hdmi->display_on,/*hdmi->plug,*/\r
-                                               /*hdmi->auto_switch,*/ hdmi->hdcp_on,\r
+                                               "--------------------------\n", \r
+                                               hdmi->display_on,hdmi->ops->hdmi_precent(hdmi),\r
+                                               hdmi->auto_switch, hdmi->hdcp_on,\r
                                                hdmi->audio_fs, hdmi->resolution);\r
 }\r
 static ssize_t hdmi_restore_state_attrs(struct device *dev, \r
index 811e607a8f41e2fcdccc76d94c648a9610b4166c..8c3e49e3b59f2483b897097c62b05702478b93ff 100755 (executable)
@@ -461,7 +461,7 @@ static int anx7150_hardware_initial(struct i2c_client *client)
        rc = anx7150_i2c_write_p0_reg(client, ANX7150_SYS_CTRL1_REG, &c);//power down HDCP, 090630\r
 \r
        rc = anx7150_i2c_read_p0_reg(client, ANX7150_SYS_CTRL3_REG, &c);//jack wen, for spdif input from SD0.\r
-       c &= (0xef);\r
+       c &= (0xfe);\r
        rc = anx7150_i2c_write_p0_reg(client, ANX7150_SYS_CTRL3_REG, &c);//power down all, 090630\r
 \r
        return rc;\r
index 78790ee53af79b9dc3e0883e996af82a8fcb76da..9c6a534fb90b84f635b52348aba903313388b40b 100755 (executable)
@@ -13,6 +13,7 @@
 #include <linux/workqueue.h>\r
 #include <linux/i2c.h>\r
 #include <linux/completion.h>\r
+#include <linux/wakelock.h>\r
 \r
 \r
 #ifdef CONFIG_HDMI_DEBUG\r
@@ -67,6 +68,8 @@ struct hdmi {
        u8 resolution;\r
        u8 audio_fs;\r
 \r
+       int hdmi_stay_awake;\r
+\r
        struct device *dev;\r
        struct delayed_work changed_work;\r
        struct completion       complete;\r
@@ -74,6 +77,7 @@ struct hdmi {
 \r
        unsigned long           priv[0] ____cacheline_aligned;\r
 };\r
+extern int hdmi_is_insert(void);\r
 extern void *hdmi_priv(struct hdmi *hdmi);\r
 extern struct hdmi *hdmi_register(int extra, struct device *parent);\r
 extern void hdmi_unregister(struct hdmi *hdmi);\r
@@ -90,5 +94,6 @@ extern int hdmi_resolution_changed(struct hdmi *hdmi, int xres, int yres, int vi
 extern struct hdmi *get_hdmi_struct(int nr);\r
 \r
 extern int hdmi_get_default_resolution(void *screen);\r
+extern void hdmi_set_spk(int on);\r
 \r
 #endif\r
index fab1029649ae2963e1a7cf74e87d84a9774eb635..d723a2e9179d3f4f29323dd6256f7e852525de84 100755 (executable)
@@ -160,6 +160,7 @@ static int wm8900_current_status = WM8900_IS_SHUTDOWN;
 
 struct snd_soc_codec_device soc_codec_dev_wm8900;
 static struct snd_soc_codec *wm8900_codec;
+static bool isSPKon = true;
 
 struct wm8900_priv {
        struct snd_soc_codec codec;
@@ -227,6 +228,22 @@ static void wm8900_reset(struct snd_soc_codec *codec)
               sizeof(codec->reg_cache));
 }
 
+void wm8990_set_spk(bool on)
+{
+       isSPKon = on;
+       if (on) {
+#ifdef SPK_CON
+               gpio_set_value(SPK_CON, GPIO_HIGH);
+#endif
+       } else {
+#ifdef SPK_CON
+               gpio_set_value(SPK_CON, GPIO_LOW);
+#endif
+       }
+}
+
+EXPORT_SYMBOL_GPL(wm8990_set_spk);
+
 static void wm8900_powerdown(void)
 {
        printk("Power down wm8900\n");
@@ -310,7 +327,9 @@ static void wm8900_set_hw(struct snd_soc_codec *codec)
        msleep(20);
 
 #ifdef SPK_CON
-       gpio_set_value(SPK_CON, GPIO_HIGH);
+       if (isSPKon) {
+               gpio_set_value(SPK_CON, GPIO_HIGH);
+       }
 #endif
 
        wm8900_current_status |= WM8900_IS_STARTUP;