|
@@ -195,6 +195,7 @@ struct hdmi_context {
|
|
struct i2c_client *hdmiphy_port;
|
|
struct i2c_client *hdmiphy_port;
|
|
|
|
|
|
/* current hdmiphy conf regs */
|
|
/* current hdmiphy conf regs */
|
|
|
|
+ struct drm_display_mode current_mode;
|
|
struct hdmi_conf_regs mode_conf;
|
|
struct hdmi_conf_regs mode_conf;
|
|
|
|
|
|
struct hdmi_resources res;
|
|
struct hdmi_resources res;
|
|
@@ -1124,20 +1125,15 @@ static void hdmi_audio_control(struct hdmi_context *hdata, bool onoff)
|
|
HDMI_ASP_EN : HDMI_ASP_DIS, HDMI_ASP_MASK);
|
|
HDMI_ASP_EN : HDMI_ASP_DIS, HDMI_ASP_MASK);
|
|
}
|
|
}
|
|
|
|
|
|
-static void hdmi_conf_reset(struct hdmi_context *hdata)
|
|
|
|
|
|
+static void hdmi_start(struct hdmi_context *hdata, bool start)
|
|
{
|
|
{
|
|
- u32 reg;
|
|
|
|
|
|
+ u32 val = start ? HDMI_TG_EN : 0;
|
|
|
|
|
|
- if (hdata->type == HDMI_TYPE13)
|
|
|
|
- reg = HDMI_V13_CORE_RSTOUT;
|
|
|
|
- else
|
|
|
|
- reg = HDMI_CORE_RSTOUT;
|
|
|
|
|
|
+ if (hdata->current_mode.flags & DRM_MODE_FLAG_INTERLACE)
|
|
|
|
+ val |= HDMI_FIELD_EN;
|
|
|
|
|
|
- /* resetting HDMI core */
|
|
|
|
- hdmi_reg_writemask(hdata, reg, 0, HDMI_CORE_SW_RSTOUT);
|
|
|
|
- usleep_range(10000, 12000);
|
|
|
|
- hdmi_reg_writemask(hdata, reg, ~0, HDMI_CORE_SW_RSTOUT);
|
|
|
|
- usleep_range(10000, 12000);
|
|
|
|
|
|
+ hdmi_reg_writemask(hdata, HDMI_CON_0, val, HDMI_EN);
|
|
|
|
+ hdmi_reg_writemask(hdata, HDMI_TG_CMD, val, HDMI_TG_EN | HDMI_FIELD_EN);
|
|
}
|
|
}
|
|
|
|
|
|
static void hdmi_conf_init(struct hdmi_context *hdata)
|
|
static void hdmi_conf_init(struct hdmi_context *hdata)
|
|
@@ -1274,12 +1270,7 @@ static void hdmi_v13_mode_apply(struct hdmi_context *hdata)
|
|
clk_prepare_enable(hdata->res.sclk_hdmi);
|
|
clk_prepare_enable(hdata->res.sclk_hdmi);
|
|
|
|
|
|
/* enable HDMI and timing generator */
|
|
/* enable HDMI and timing generator */
|
|
- hdmi_reg_writemask(hdata, HDMI_CON_0, ~0, HDMI_EN);
|
|
|
|
- if (core->int_pro_mode[0])
|
|
|
|
- hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN |
|
|
|
|
- HDMI_FIELD_EN);
|
|
|
|
- else
|
|
|
|
- hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN);
|
|
|
|
|
|
+ hdmi_start(hdata, true);
|
|
}
|
|
}
|
|
|
|
|
|
static void hdmi_v14_mode_apply(struct hdmi_context *hdata)
|
|
static void hdmi_v14_mode_apply(struct hdmi_context *hdata)
|
|
@@ -1441,12 +1432,7 @@ static void hdmi_v14_mode_apply(struct hdmi_context *hdata)
|
|
clk_prepare_enable(hdata->res.sclk_hdmi);
|
|
clk_prepare_enable(hdata->res.sclk_hdmi);
|
|
|
|
|
|
/* enable HDMI and timing generator */
|
|
/* enable HDMI and timing generator */
|
|
- hdmi_reg_writemask(hdata, HDMI_CON_0, ~0, HDMI_EN);
|
|
|
|
- if (core->int_pro_mode[0])
|
|
|
|
- hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN |
|
|
|
|
- HDMI_FIELD_EN);
|
|
|
|
- else
|
|
|
|
- hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN);
|
|
|
|
|
|
+ hdmi_start(hdata, true);
|
|
}
|
|
}
|
|
|
|
|
|
static void hdmi_mode_apply(struct hdmi_context *hdata)
|
|
static void hdmi_mode_apply(struct hdmi_context *hdata)
|
|
@@ -1561,7 +1547,7 @@ static void hdmi_conf_apply(struct hdmi_context *hdata)
|
|
hdmiphy_conf_apply(hdata);
|
|
hdmiphy_conf_apply(hdata);
|
|
|
|
|
|
mutex_lock(&hdata->hdmi_mutex);
|
|
mutex_lock(&hdata->hdmi_mutex);
|
|
- hdmi_conf_reset(hdata);
|
|
|
|
|
|
+ hdmi_start(hdata, false);
|
|
hdmi_conf_init(hdata);
|
|
hdmi_conf_init(hdata);
|
|
mutex_unlock(&hdata->hdmi_mutex);
|
|
mutex_unlock(&hdata->hdmi_mutex);
|
|
|
|
|
|
@@ -1802,6 +1788,9 @@ static void hdmi_mode_set(struct exynos_drm_display *display,
|
|
m->vrefresh, (m->flags & DRM_MODE_FLAG_INTERLACE) ?
|
|
m->vrefresh, (m->flags & DRM_MODE_FLAG_INTERLACE) ?
|
|
"INTERLACED" : "PROGERESSIVE");
|
|
"INTERLACED" : "PROGERESSIVE");
|
|
|
|
|
|
|
|
+ /* preserve mode information for later use. */
|
|
|
|
+ drm_mode_copy(&hdata->current_mode, mode);
|
|
|
|
+
|
|
if (hdata->type == HDMI_TYPE13)
|
|
if (hdata->type == HDMI_TYPE13)
|
|
hdmi_v13_mode_set(hdata, mode);
|
|
hdmi_v13_mode_set(hdata, mode);
|
|
else
|
|
else
|
|
@@ -1860,6 +1849,9 @@ static void hdmi_poweroff(struct exynos_drm_display *display)
|
|
goto out;
|
|
goto out;
|
|
mutex_unlock(&hdata->hdmi_mutex);
|
|
mutex_unlock(&hdata->hdmi_mutex);
|
|
|
|
|
|
|
|
+ /* HDMI System Disable */
|
|
|
|
+ hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_EN);
|
|
|
|
+
|
|
hdmiphy_poweroff(hdata);
|
|
hdmiphy_poweroff(hdata);
|
|
|
|
|
|
cancel_delayed_work(&hdata->hotplug_work);
|
|
cancel_delayed_work(&hdata->hotplug_work);
|