summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.c9
-rw-r--r--drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.h6
-rw-r--r--drivers/gpu/drm/msm/hdmi-staging/sde_hdmi_bridge.c58
3 files changed, 27 insertions, 46 deletions
diff --git a/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.c b/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.c
index 4b6eeb6d1abc..4769f1333ab4 100644
--- a/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.c
+++ b/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.c
@@ -1353,13 +1353,6 @@ int sde_hdmi_core_enable(struct sde_hdmi *sde_hdmi)
const struct hdmi_platform_config *config = hdmi->config;
struct device *dev = &hdmi->pdev->dev;
int i, ret;
- struct drm_connector *connector;
- struct msm_drm_private *priv;
- struct sde_kms *sde_kms;
-
- connector = hdmi->connector;
- priv = connector->dev->dev_private;
- sde_kms = to_sde_kms(priv->kms);
for (i = 0; i < config->hpd_reg_cnt; i++) {
ret = regulator_enable(hdmi->hpd_regs[i]);
@@ -3216,7 +3209,7 @@ int sde_hdmi_drm_init(struct sde_hdmi *display, struct drm_encoder *enc)
hdmi_audio_infoframe_init(&hdmi->audio.infoframe);
- hdmi->bridge = sde_hdmi_bridge_init(hdmi);
+ hdmi->bridge = sde_hdmi_bridge_init(hdmi, display);
if (IS_ERR(hdmi->bridge)) {
rc = PTR_ERR(hdmi->bridge);
SDE_ERROR("failed to create HDMI bridge: %d\n", rc);
diff --git a/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.h b/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.h
index 471472ea23cf..607d2cf3c7b7 100644
--- a/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.h
+++ b/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -431,10 +431,12 @@ int sde_hdmi_get_property(struct drm_connector *connector,
/**
* sde_hdmi_bridge_init() - init sde hdmi bridge
* @hdmi: Handle to the hdmi.
+ * @display: Handle to the sde_hdmi
*
* Return: struct drm_bridge *.
*/
-struct drm_bridge *sde_hdmi_bridge_init(struct hdmi *hdmi);
+struct drm_bridge *sde_hdmi_bridge_init(struct hdmi *hdmi,
+ struct sde_hdmi *display);
/**
* sde_hdmi_set_mode() - Set HDMI mode API.
diff --git a/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi_bridge.c b/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi_bridge.c
index 5a4c4b02c340..8b399e02ec0c 100644
--- a/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi_bridge.c
+++ b/drivers/gpu/drm/msm/hdmi-staging/sde_hdmi_bridge.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
* Copyright (C) 2013 Red Hat
* Author: Rob Clark <robdclark@gmail.com>
*
@@ -90,6 +90,7 @@ static inline uint32_t SDE_HDMI_VSYNC_TOTAL_F2_V_TOTAL(uint32_t val)
struct sde_hdmi_bridge {
struct drm_bridge base;
struct hdmi *hdmi;
+ struct sde_hdmi *display;
};
#define to_hdmi_bridge(x) container_of(x, struct sde_hdmi_bridge, base)
@@ -129,20 +130,15 @@ static void _sde_hdmi_bridge_power_on(struct drm_bridge *bridge)
struct sde_hdmi_bridge *sde_hdmi_bridge = to_hdmi_bridge(bridge);
struct hdmi *hdmi = sde_hdmi_bridge->hdmi;
const struct hdmi_platform_config *config = hdmi->config;
- struct sde_connector *c_conn = to_sde_connector(hdmi->connector);
- struct sde_hdmi *display = NULL;
int i, ret;
+ struct sde_hdmi *display = sde_hdmi_bridge->display;
- if (c_conn)
- display = (struct sde_hdmi *)c_conn->display;
-
- if (display) {
- if (display->non_pluggable) {
- ret = sde_hdmi_core_enable(display);
- if (ret)
- SDE_ERROR("failed to enable HDMI core (%d)\n",
- ret);
- }
+ if ((display->non_pluggable) && (!hdmi->power_on)) {
+ ret = sde_hdmi_core_enable(display);
+ if (ret)
+ SDE_ERROR("failed to enable HDMI core (%d)\n", ret);
+ else
+ hdmi->power_on = true;
}
for (i = 0; i < config->pwr_reg_cnt; i++) {
@@ -176,8 +172,7 @@ static void _sde_hdmi_bridge_power_off(struct drm_bridge *bridge)
struct sde_hdmi_bridge *sde_hdmi_bridge = to_hdmi_bridge(bridge);
struct hdmi *hdmi = sde_hdmi_bridge->hdmi;
const struct hdmi_platform_config *config = hdmi->config;
- struct sde_connector *c_conn = to_sde_connector(hdmi->connector);
- struct sde_hdmi *display = (struct sde_hdmi *)c_conn->display;
+ struct sde_hdmi *display = sde_hdmi_bridge->display;
int i, ret;
/* Wait for vsync */
@@ -194,9 +189,8 @@ static void _sde_hdmi_bridge_power_off(struct drm_bridge *bridge)
}
}
- if (display->non_pluggable) {
+ if (display->non_pluggable)
sde_hdmi_core_disable(display);
- }
}
static int _sde_hdmi_bridge_ddc_clear_irq(struct hdmi *hdmi,
@@ -490,14 +484,12 @@ static void _sde_hdmi_bridge_pre_enable(struct drm_bridge *bridge)
struct sde_hdmi_bridge *sde_hdmi_bridge = to_hdmi_bridge(bridge);
struct hdmi *hdmi = sde_hdmi_bridge->hdmi;
struct hdmi_phy *phy = hdmi->phy;
- struct sde_connector *c_conn = to_sde_connector(hdmi->connector);
- struct sde_hdmi *display = (struct sde_hdmi *)c_conn->display;
+ struct sde_hdmi *display = sde_hdmi_bridge->display;
DRM_DEBUG("power up");
if (!hdmi->power_on) {
_sde_hdmi_bridge_power_on(bridge);
- hdmi->power_on = true;
}
if (phy)
@@ -572,8 +564,7 @@ static void _sde_hdmi_bridge_enable(struct drm_bridge *bridge)
{
struct sde_hdmi_bridge *sde_hdmi_bridge = to_hdmi_bridge(bridge);
struct hdmi *hdmi = sde_hdmi_bridge->hdmi;
- struct sde_connector *c_conn = to_sde_connector(hdmi->connector);
- struct sde_hdmi *display = (struct sde_hdmi *)c_conn->display;
+ struct sde_hdmi *display = sde_hdmi_bridge->display;
/* need to update hdcp info here to ensure right HDCP support*/
sde_hdmi_update_hdcp_info(hdmi->connector);
@@ -588,9 +579,7 @@ static void _sde_hdmi_bridge_enable(struct drm_bridge *bridge)
static void _sde_hdmi_bridge_disable(struct drm_bridge *bridge)
{
struct sde_hdmi_bridge *sde_hdmi_bridge = to_hdmi_bridge(bridge);
- struct hdmi *hdmi = sde_hdmi_bridge->hdmi;
- struct sde_connector *c_conn = to_sde_connector(hdmi->connector);
- struct sde_hdmi *display = (struct sde_hdmi *)c_conn->display;
+ struct sde_hdmi *display = sde_hdmi_bridge->display;
mutex_lock(&display->display_lock);
@@ -610,8 +599,7 @@ static void _sde_hdmi_bridge_post_disable(struct drm_bridge *bridge)
struct sde_hdmi_bridge *sde_hdmi_bridge = to_hdmi_bridge(bridge);
struct hdmi *hdmi = sde_hdmi_bridge->hdmi;
struct hdmi_phy *phy = hdmi->phy;
- struct sde_connector *c_conn = to_sde_connector(hdmi->connector);
- struct sde_hdmi *display = (struct sde_hdmi *)c_conn->display;
+ struct sde_hdmi *display = sde_hdmi_bridge->display;
sde_hdmi_notify_clients(display, display->connected);
@@ -835,19 +823,16 @@ static void _sde_hdmi_bridge_mode_set(struct drm_bridge *bridge,
{
struct sde_hdmi_bridge *sde_hdmi_bridge = to_hdmi_bridge(bridge);
struct hdmi *hdmi = sde_hdmi_bridge->hdmi;
- struct drm_connector *connector = hdmi->connector;
- struct sde_connector *c_conn = to_sde_connector(connector);
- struct sde_hdmi *display = (struct sde_hdmi *)c_conn->display;
+ struct sde_hdmi *display = sde_hdmi_bridge->display;
int hstart, hend, vstart, vend;
uint32_t frame_ctrl;
u32 div = 0;
mode = adjusted_mode;
- if (display->non_pluggable && !hdmi->power_on) {
+ if (display->non_pluggable && !hdmi->power_on)
if (sde_hdmi_core_enable(display))
- pr_err("mode set enable core failured\n");
- }
+ pr_err("mode set enable core failed\n");
display->dc_enable = mode->private_flags &
(MSM_MODE_FLAG_RGB444_DC_ENABLE |
@@ -925,9 +910,8 @@ static void _sde_hdmi_bridge_mode_set(struct drm_bridge *bridge,
_sde_hdmi_save_mode(hdmi, mode);
_sde_hdmi_bridge_setup_scrambler(hdmi, mode);
_sde_hdmi_bridge_setup_deep_color(hdmi);
- if (display->non_pluggable && !hdmi->power_on) {
+ if (display->non_pluggable && !hdmi->power_on)
sde_hdmi_core_disable(display);
- }
}
static bool _sde_hdmi_bridge_mode_fixup(struct drm_bridge *bridge,
@@ -961,7 +945,8 @@ static const struct drm_bridge_funcs _sde_hdmi_bridge_funcs = {
/* initialize bridge */
-struct drm_bridge *sde_hdmi_bridge_init(struct hdmi *hdmi)
+struct drm_bridge *sde_hdmi_bridge_init(struct hdmi *hdmi,
+ struct sde_hdmi *display)
{
struct drm_bridge *bridge = NULL;
struct sde_hdmi_bridge *sde_hdmi_bridge;
@@ -975,6 +960,7 @@ struct drm_bridge *sde_hdmi_bridge_init(struct hdmi *hdmi)
}
sde_hdmi_bridge->hdmi = hdmi;
+ sde_hdmi_bridge->display = display;
bridge = &sde_hdmi_bridge->base;
bridge->funcs = &_sde_hdmi_bridge_funcs;