aboutsummaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorPer Persson <per.xb.persson@stericsson.com>2011-05-31 17:45:24 +0200
committersaid m bagheri <ebgheri@steludxu2848.(none)>2011-06-17 13:42:09 +0200
commit3295cb454f2b8adcd83e92bfb0584b50e2b2ead9 (patch)
tree696f35376628b8a032fb581fa08868495faeaa53 /drivers
parent15060da2bf5aa38789786b02aef28ccc935311a2 (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.c58
-rw-r--r--drivers/video/av8100/hdmi.c46
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;