summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAjay Singh Parmar <aparmar@codeaurora.org>2016-11-29 14:57:43 -0800
committerAjay Singh Parmar <aparmar@codeaurora.org>2016-11-30 15:51:13 -0800
commit5ee2b479a9550650e0e044f9bf62924e417eb344 (patch)
treea934c45c29d22f88ead13dbef4a3d9e89335f9f3
parent2be8fc81c3adef891480d3abd19639860d838443 (diff)
msm: mdss: dp: set crypto clock rate
Crypto clock is needed for HDCP 1.x/2.x encryption. If not set, it may result in link integrity failure as source and sink may go out of synchronization. Set the crypto clock rate as per hardware recommendations. Change-Id: I768b3390fbe4728be285424d0ce27981e1a5d6cb Signed-off-by: Ajay Singh Parmar <aparmar@codeaurora.org>
-rw-r--r--drivers/video/fbdev/msm/mdss_dp.c35
-rw-r--r--drivers/video/fbdev/msm/mdss_dp.h1
2 files changed, 29 insertions, 7 deletions
diff --git a/drivers/video/fbdev/msm/mdss_dp.c b/drivers/video/fbdev/msm/mdss_dp.c
index 840df3741b21..36950fc97479 100644
--- a/drivers/video/fbdev/msm/mdss_dp.c
+++ b/drivers/video/fbdev/msm/mdss_dp.c
@@ -45,6 +45,8 @@
#define VDDA_UA_ON_LOAD 100000 /* uA units */
#define VDDA_UA_OFF_LOAD 100 /* uA units */
+#define DP_CRYPTO_CLK_RATE_KHZ 337500
+
struct mdss_dp_attention_node {
u32 vdo;
struct list_head list;
@@ -208,9 +210,9 @@ static int mdss_dp_get_dt_clk_data(struct device *dev,
&ctrl_power_data->clk_config[ctrl_clk_index];
strlcpy(clk->clk_name, clk_name, sizeof(clk->clk_name));
ctrl_clk_index++;
- if (!strcmp(clk_name, "ctrl_link_clk"))
- clk->type = DSS_CLK_PCLK;
- else if (!strcmp(clk_name, "ctrl_pixel_clk"))
+ if (!strcmp(clk_name, "ctrl_link_clk") ||
+ !strcmp(clk_name, "ctrl_pixel_clk") ||
+ !strcmp(clk_name, "ctrl_crypto_clk"))
clk->type = DSS_CLK_PCLK;
else
clk->type = DSS_CLK_AHB;
@@ -1089,6 +1091,23 @@ exit:
return ret;
}
+static void mdss_dp_set_clock_rate(struct mdss_dp_drv_pdata *dp,
+ char *name, u32 rate)
+{
+ u32 num = dp->power_data[DP_CTRL_PM].num_clk;
+ struct dss_clk *cfg = dp->power_data[DP_CTRL_PM].clk_config;
+
+ while (num && strcmp(cfg->clk_name, name)) {
+ num--;
+ cfg++;
+ }
+
+ if (num)
+ cfg->rate = rate;
+ else
+ pr_err("%s clock could not be set with rate %d\n", name, rate);
+}
+
/**
* mdss_dp_enable_mainlink_clocks() - enables Display Port main link clocks
* @dp: Display Port Driver data
@@ -1099,12 +1118,14 @@ static int mdss_dp_enable_mainlink_clocks(struct mdss_dp_drv_pdata *dp)
{
int ret = 0;
- dp->power_data[DP_CTRL_PM].clk_config[0].rate =
- ((dp->link_rate * DP_LINK_RATE_MULTIPLIER) / 1000);/* KHz */
+ mdss_dp_set_clock_rate(dp, "ctrl_link_clk",
+ (dp->link_rate * DP_LINK_RATE_MULTIPLIER) / DP_KHZ_TO_HZ);
+
+ mdss_dp_set_clock_rate(dp, "ctrl_crypto_clk", DP_CRYPTO_CLK_RATE_KHZ);
dp->pixel_rate = dp->panel_data.panel_info.clk_rate;
- dp->power_data[DP_CTRL_PM].clk_config[3].rate =
- (dp->pixel_rate / 1000);/* KHz */
+ mdss_dp_set_clock_rate(dp, "ctrl_pixel_clk",
+ (dp->pixel_rate / DP_KHZ_TO_HZ));
ret = mdss_dp_clk_ctrl(dp, DP_CTRL_PM, true);
if (ret) {
diff --git a/drivers/video/fbdev/msm/mdss_dp.h b/drivers/video/fbdev/msm/mdss_dp.h
index 04abe9221acc..dc84694f2238 100644
--- a/drivers/video/fbdev/msm/mdss_dp.h
+++ b/drivers/video/fbdev/msm/mdss_dp.h
@@ -228,6 +228,7 @@ struct dp_alt_mode {
#define DP_LINK_RATE_MAX DP_LINK_RATE_540
#define DP_LINK_RATE_MULTIPLIER 27000000
+#define DP_KHZ_TO_HZ 1000
#define DP_MAX_PIXEL_CLK_KHZ 675000
struct downstream_port_config {
/* Byte 02205h */