disp: msm: dp: add support for PLL programming

Add support for PLL programming in the DisplayPort driver.

Change-Id: I4f08a621dcae5d1f54d67bb5c34409249012cc7b
Signed-off-by: Tatenda Chipeperekwa <tatendac@codeaurora.org>
このコミットが含まれているのは:
Tatenda Chipeperekwa
2020-01-15 16:49:50 -08:00
コミット 37412f5add
15個のファイルの変更1896行の追加362行の削除

ファイルの表示

@@ -28,6 +28,7 @@
#include "dp_display.h"
#include "sde_hdcp.h"
#include "dp_debug.h"
#include "dp_pll.h"
#define DP_MST_DEBUG(fmt, ...) DP_DEBUG(fmt, ##__VA_ARGS__)
@@ -152,6 +153,7 @@ struct dp_display_private {
struct dp_panel *panel;
struct dp_ctrl *ctrl;
struct dp_debug *debug;
struct dp_pll *pll;
struct dp_panel *active_panels[DP_STREAM_MAX];
struct dp_hdcp hdcp;
@@ -493,7 +495,8 @@ static void dp_display_deinitialize_hdcp(struct dp_display_private *dp)
return;
}
sde_dp_hdcp2p2_deinit(dp->hdcp.data);
sde_hdcp_1x_deinit(dp->hdcp.dev[HDCP_VERSION_1X].fd);
sde_dp_hdcp2p2_deinit(dp->hdcp.dev[HDCP_VERSION_2P2].fd);
}
static int dp_display_initialize_hdcp(struct dp_display_private *dp)
@@ -527,19 +530,18 @@ static int dp_display_initialize_hdcp(struct dp_display_private *dp)
fd = sde_hdcp_1x_init(&hdcp_init_data);
if (IS_ERR_OR_NULL(fd)) {
DP_ERR("Error initializing HDCP 1.x\n");
rc = -EINVAL;
goto error;
DP_DEBUG("Error initializing HDCP 1.x\n");
return -EINVAL;
}
dp->hdcp.dev[HDCP_VERSION_1X].fd = fd;
dp->hdcp.dev[HDCP_VERSION_1X].ops = sde_hdcp_1x_get(fd);
dp->hdcp.dev[HDCP_VERSION_1X].ver = HDCP_VERSION_1X;
DP_DEBUG("HDCP 1.3 initialized\n");
DP_INFO("HDCP 1.3 initialized\n");
fd = sde_dp_hdcp2p2_init(&hdcp_init_data);
if (IS_ERR_OR_NULL(fd)) {
DP_ERR("Error initializing HDCP 2.x\n");
DP_DEBUG("Error initializing HDCP 2.x\n");
rc = -EINVAL;
goto error;
}
@@ -547,11 +549,11 @@ static int dp_display_initialize_hdcp(struct dp_display_private *dp)
dp->hdcp.dev[HDCP_VERSION_2P2].fd = fd;
dp->hdcp.dev[HDCP_VERSION_2P2].ops = sde_dp_hdcp2p2_get(fd);
dp->hdcp.dev[HDCP_VERSION_2P2].ver = HDCP_VERSION_2P2;
DP_DEBUG("HDCP 2.2 initialized\n");
DP_INFO("HDCP 2.2 initialized\n");
return 0;
error:
dp_display_deinitialize_hdcp(dp);
sde_hdcp_1x_deinit(dp->hdcp.dev[HDCP_VERSION_1X].fd);
return rc;
}
@@ -661,8 +663,9 @@ static void dp_display_send_hpd_event(struct dp_display_private *dp)
envp[2] = bpp;
envp[3] = pattern;
envp[4] = NULL;
kobject_uevent_env(&dev->primary->kdev->kobj, KOBJ_CHANGE,
envp);
if (!dp->debug->skip_uevent)
kobject_uevent_env(&dev->primary->kdev->kobj, KOBJ_CHANGE,
envp);
if (connector->status == connector_status_connected) {
dp_display_state_add(DP_STATE_CONNECT_NOTIFIED);
@@ -1346,17 +1349,18 @@ static int dp_display_get_usb_extcon(struct dp_display_private *dp)
static void dp_display_deinit_sub_modules(struct dp_display_private *dp)
{
dp_debug_put(dp->debug);
dp_hpd_put(dp->hpd);
dp_audio_put(dp->panel->audio);
dp_ctrl_put(dp->ctrl);
dp_link_put(dp->link);
dp_panel_put(dp->panel);
dp_aux_put(dp->aux);
dp_link_put(dp->link);
dp_power_put(dp->power);
dp_pll_put(dp->pll);
dp_aux_put(dp->aux);
dp_catalog_put(dp->catalog);
dp_parser_put(dp->parser);
dp_hpd_put(dp->hpd);
mutex_destroy(&dp->session_lock);
dp_debug_put(dp->debug);
}
static int dp_init_sub_modules(struct dp_display_private *dp)
@@ -1374,6 +1378,9 @@ static int dp_init_sub_modules(struct dp_display_private *dp)
struct dp_debug_in debug_in = {
.dev = dev,
};
struct dp_pll_in pll_in = {
.pdev = dp->pdev,
};
mutex_init(&dp->session_lock);
@@ -1401,21 +1408,6 @@ static int dp_init_sub_modules(struct dp_display_private *dp)
goto error_catalog;
}
dp->power = dp_power_get(dp->parser);
if (IS_ERR(dp->power)) {
rc = PTR_ERR(dp->power);
DP_ERR("failed to initialize power, rc = %d\n", rc);
dp->power = NULL;
goto error_power;
}
rc = dp->power->power_client_init(dp->power, &dp->priv->phandle,
dp->dp_display.drm_dev);
if (rc) {
DP_ERR("Power client create failed\n");
goto error_aux;
}
dp->aux = dp_aux_get(dev, &dp->catalog->aux, dp->parser,
dp->aux_switch_node);
if (IS_ERR(dp->aux)) {
@@ -1428,6 +1420,32 @@ static int dp_init_sub_modules(struct dp_display_private *dp)
rc = dp->aux->drm_aux_register(dp->aux);
if (rc) {
DP_ERR("DRM DP AUX register failed\n");
goto error_pll;
}
pll_in.aux = dp->aux;
pll_in.parser = dp->parser;
dp->pll = dp_pll_get(&pll_in);
if (IS_ERR(dp->pll)) {
rc = PTR_ERR(dp->pll);
DP_ERR("failed to initialize pll, rc = %d\n", rc);
dp->pll = NULL;
goto error_pll;
}
dp->power = dp_power_get(dp->parser, dp->pll);
if (IS_ERR(dp->power)) {
rc = PTR_ERR(dp->power);
DP_ERR("failed to initialize power, rc = %d\n", rc);
dp->power = NULL;
goto error_power;
}
rc = dp->power->power_client_init(dp->power, &dp->priv->phandle,
dp->dp_display.drm_dev);
if (rc) {
DP_ERR("Power client create failed\n");
goto error_link;
}
@@ -1503,6 +1521,7 @@ static int dp_init_sub_modules(struct dp_display_private *dp)
debug_in.catalog = dp->catalog;
debug_in.parser = dp->parser;
debug_in.ctrl = dp->ctrl;
debug_in.pll = dp->pll;
dp->debug = dp_debug_get(&debug_in);
if (IS_ERR(dp->debug)) {
@@ -1540,10 +1559,12 @@ error_ctrl:
error_panel:
dp_link_put(dp->link);
error_link:
dp_aux_put(dp->aux);
error_aux:
dp_power_put(dp->power);
error_power:
dp_pll_put(dp->pll);
error_pll:
dp_aux_put(dp->aux);
error_aux:
dp_catalog_put(dp->catalog);
error_catalog:
dp_parser_put(dp->parser);