drm/exynos: replace hdmi reset with hdmi disable
Before setting the core and timing generation registers, hdmi driver resets the whole hdmi hardware, which also resets the audio related registers. Hdmi reset is replaced by hdmi disable which is called just before setting the core and timing registers. It also ensure that audio settings are not changed. Signed-off-by: Rahul Sharma <rahul.sharma@samsung.com> Signed-off-by: Shirish S <s.shirish@samsung.com> Signed-off-by: Inki Dae <inki.dae@samsung.com>
This commit is contained in:
parent
5137c8ca4b
commit
bfa48423ad
|
@ -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)
|
if (hdata->current_mode.flags & DRM_MODE_FLAG_INTERLACE)
|
||||||
reg = HDMI_V13_CORE_RSTOUT;
|
val |= HDMI_FIELD_EN;
|
||||||
else
|
|
||||||
reg = HDMI_CORE_RSTOUT;
|
|
||||||
|
|
||||||
/* resetting HDMI core */
|
hdmi_reg_writemask(hdata, HDMI_CON_0, val, HDMI_EN);
|
||||||
hdmi_reg_writemask(hdata, reg, 0, HDMI_CORE_SW_RSTOUT);
|
hdmi_reg_writemask(hdata, HDMI_TG_CMD, val, HDMI_TG_EN | HDMI_FIELD_EN);
|
||||||
usleep_range(10000, 12000);
|
|
||||||
hdmi_reg_writemask(hdata, reg, ~0, HDMI_CORE_SW_RSTOUT);
|
|
||||||
usleep_range(10000, 12000);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
hdmi_start(hdata, true);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
hdmi_start(hdata, true);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue