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
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
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
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
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
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
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
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
#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
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
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;
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
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
#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
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
\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
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
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;
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");
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;