diff options
author | Per Persson <per.xb.persson@stericsson.com> | 2011-05-31 17:45:24 +0200 |
---|---|---|
committer | said m bagheri <ebgheri@steludxu2848.(none)> | 2011-06-17 13:42:09 +0200 |
commit | 3295cb454f2b8adcd83e92bfb0584b50e2b2ead9 (patch) | |
tree | 696f35376628b8a032fb581fa08868495faeaa53 /drivers | |
parent | 15060da2bf5aa38789786b02aef28ccc935311a2 (diff) |
video: av8100: Improve plug detection
- Set 5V cycle to always on when plugged.
- Keep existing 5V cycle when unplugged.
- Avoid changing 5V time value to zero.
ST-Ericsson ID: 343199
ST-Ericsson Linux next: Not tested, ER 282779
ST-Ericsson FOSS-OUT ID: Trivial
Change-Id: I999eaa5ef0cfe4ee41bb47213c174a85fc7a04a3
Signed-off-by: Per Persson <per.xb.persson@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/24313
Reviewed-by: Jimmy RUBIN <jimmy.rubin@stericsson.com>
Reviewed-by: QATOOLS
Reviewed-by: QATEST
Reviewed-by: Per-Daniel OLSSON <per-daniel.olsson@stericsson.com>
Reviewed-by: Marcel TUNNISSEN <marcel.tuennissen@stericsson.com>
Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/video/av8100/av8100.c | 58 | ||||
-rw-r--r-- | drivers/video/av8100/hdmi.c | 46 |
2 files changed, 61 insertions, 43 deletions
diff --git a/drivers/video/av8100/av8100.c b/drivers/video/av8100/av8100.c index a5e2bf4e731..1e17256194c 100644 --- a/drivers/video/av8100/av8100.c +++ b/drivers/video/av8100/av8100.c @@ -243,6 +243,7 @@ enum av8100_command_size { static unsigned int waittime_retry[10] = {1, 2, 4, 6, 8, 10, 10, 10, 10, 10}; +static int av8100_5V_w(u8 denc_off, u8 hdmi_off, u8 on); static void clr_plug_status(enum av8100_plugin_status status); static void set_plug_status(enum av8100_plugin_status status); static void cec_rx(void); @@ -537,11 +538,21 @@ static int av8100_int_event_handle(void) } if (hpdi & av8100_globals->hpdm) { + /* HDMI plugin change */ if (hpds) { + /* Plugged */ + /* Set 5V always on */ + av8100_5V_w(av8100_globals->denc_off_time, + 0, + av8100_globals->on_time); dev_dbg(av8100dev, "hpds 1\n"); set_plug_status(AV8100_HDMI_PLUGIN); } else { + /* Unplugged */ + av8100_5V_w(av8100_globals->denc_off_time, + av8100_globals->hdmi_off_time, + av8100_globals->on_time); dev_dbg(av8100dev, "hpds 0\n"); clr_plug_status(AV8100_HDMI_PLUGIN); } @@ -617,6 +628,8 @@ static int av8100_plugstartup_event_handle(void) "av8100_reg_stby_int_mask_w fail\n"); } + msleep(1); + /* Get actual plug status */ if (av8100_reg_stby_r(NULL, NULL, &hpds, &cpds, NULL)) dev_dbg(av8100dev, "av8100_reg_stby_r fail\n"); @@ -1814,17 +1827,8 @@ static int av8100_powerup1(void) msleep(AV8100_WAITTIME_1MS); if (pdata->alt_powerupseq) { - u8 denc_off_time; - u8 hdmi_off_time; - u8 on_time; - - /* Save the cycle values */ - denc_off_time = av8100_globals->denc_off_time; - hdmi_off_time = av8100_globals->hdmi_off_time; - on_time = av8100_globals->on_time; - dev_dbg(av8100dev, "powerup seq alt\n"); - retval = av8100_reg_hdmi_5_volt_time_w(0, 0, AV8100_ON_TIME); + retval = av8100_5V_w(0, 0, AV8100_ON_TIME); if (retval) { dev_err(av8100dev, "%s reg_wr err 1\n", __func__); goto av8100_powerup1_err; @@ -1832,11 +1836,6 @@ static int av8100_powerup1(void) udelay(AV8100_WATTIME_100US); - /* Get the cycle values */ - av8100_globals->denc_off_time = denc_off_time; - av8100_globals->hdmi_off_time = hdmi_off_time; - av8100_globals->on_time = on_time; - retval = av8100_reg_stby_pend_int_w( AV8100_STANDBY_PENDING_INTERRUPT_HPDI_LOW, AV8100_STANDBY_PENDING_INTERRUPT_CPDI_LOW, @@ -1927,10 +1926,9 @@ static int av8100_powerup2(void) msleep(AV8100_WAITTIME_1MS); /* ON time & OFF time on 5v HDMI plug detect */ - retval = av8100_reg_hdmi_5_volt_time_w( - av8100_globals->denc_off_time, - av8100_globals->hdmi_off_time, - av8100_globals->on_time); + retval = av8100_5V_w(av8100_globals->denc_off_time, + av8100_globals->hdmi_off_time, + av8100_globals->on_time); if (retval) { dev_err(av8100dev, "Failed to write the value to av8100 register\n"); @@ -2388,10 +2386,10 @@ int av8100_reg_stby_w( } EXPORT_SYMBOL(av8100_reg_stby_w); -int av8100_reg_hdmi_5_volt_time_w(u8 denc_off, u8 hdmi_off, u8 on) +static int av8100_5V_w(u8 denc_off, u8 hdmi_off, u8 on) { - int retval; u8 val; + int retval; if (av8100_status_get().av8100_state == AV8100_OPMODE_UNDEFINED) return -EINVAL; @@ -2412,14 +2410,28 @@ int av8100_reg_hdmi_5_volt_time_w(u8 denc_off, u8 hdmi_off, u8 on) /* Write to register */ retval = register_write_internal(AV8100_HDMI_5_VOLT_TIME, val); + UNLOCK_AV8100_HW; + + return retval; +} + +int av8100_reg_hdmi_5_volt_time_w(u8 denc_off, u8 hdmi_off, u8 on) +{ + int retval; + + if (av8100_status_get().av8100_state == AV8100_OPMODE_UNDEFINED) + return -EINVAL; + + retval = av8100_5V_w(denc_off, hdmi_off, on); + /* Set vars */ if (chip_version > 1) av8100_globals->denc_off_time = denc_off; av8100_globals->hdmi_off_time = hdmi_off; - av8100_globals->on_time = on; + if (on) + av8100_globals->on_time = on; - UNLOCK_AV8100_HW; return retval; } EXPORT_SYMBOL(av8100_reg_hdmi_5_volt_time_w); diff --git a/drivers/video/av8100/hdmi.c b/drivers/video/av8100/hdmi.c index abd467b8d57..8b409c6e6a5 100644 --- a/drivers/video/av8100/hdmi.c +++ b/drivers/video/av8100/hdmi.c @@ -139,20 +139,26 @@ static unsigned int htoi(const char *ptr) static int event_enable(bool enable, enum hdmi_event ev) { - struct av8100_status status; + struct kobject *kobj = &hdmidev->kobj; dev_dbg(hdmidev, "enable_event %d %02x\n", enable, ev); - if (enable) { - status = av8100_status_get(); - if (status.av8100_state < AV8100_OPMODE_IDLE) { - av8100_disable_interrupt(); - av8100_enable_interrupt(); - } - + if (enable) events_mask |= ev; - } else + else events_mask &= ~ev; + if (events & ev) { + /* Report pending event */ + /* Wake up application waiting for event via call to poll() */ + sysfs_notify(kobj, NULL, SYSFS_EVENT_FILENAME); + + LOCK_HDMI_EVENTS; + events_received = true; + UNLOCK_HDMI_EVENTS; + + wake_up_interruptible(&hdmi_event_wq); + } + return 0; } @@ -170,6 +176,11 @@ static int plugdeten(struct plug_detect *pldet) } } + event_enable(pldet->hdmi_detect_enable != 0, + HDMI_EVENT_HDMI_PLUGIN); + event_enable(pldet->hdmi_detect_enable != 0, + HDMI_EVENT_HDMI_PLUGOUT); + av8100_reg_hdmi_5_volt_time_r(&denc_off_time, NULL, NULL); retval = av8100_reg_hdmi_5_volt_time_w( @@ -183,11 +194,6 @@ static int plugdeten(struct plug_detect *pldet) return -EFAULT; } - event_enable(pldet->hdmi_detect_enable != 0, - HDMI_EVENT_HDMI_PLUGIN); - event_enable(pldet->hdmi_detect_enable != 0, - HDMI_EVENT_HDMI_PLUGOUT); - return retval; } @@ -2165,31 +2171,31 @@ void hdmi_event(enum av8100_hdmi_event ev) switch (ev) { case AV8100_HDMI_EVENT_HDMI_PLUGIN: events &= ~HDMI_EVENT_HDMI_PLUGOUT; - events |= events_mask & HDMI_EVENT_HDMI_PLUGIN; + events |= HDMI_EVENT_HDMI_PLUGIN; break; case AV8100_HDMI_EVENT_HDMI_PLUGOUT: events &= ~HDMI_EVENT_HDMI_PLUGIN; - events |= events_mask & HDMI_EVENT_HDMI_PLUGOUT; + events |= HDMI_EVENT_HDMI_PLUGOUT; break; case AV8100_HDMI_EVENT_CEC: - events |= events_mask & HDMI_EVENT_CEC; + events |= HDMI_EVENT_CEC; break; case AV8100_HDMI_EVENT_HDCP: - events |= events_mask & HDMI_EVENT_HDCP; + events |= HDMI_EVENT_HDCP; break; case AV8100_HDMI_EVENT_CECTXERR: - events |= events_mask & HDMI_EVENT_CECTXERR; + events |= HDMI_EVENT_CECTXERR; break; default: break; } - events_new = events; + events_new = events_mask & events; UNLOCK_HDMI_EVENTS; |