summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenet Clark <benetc@codeaurora.org>2014-06-11 16:31:59 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:30:47 -0700
commit4b9ced0958860cd5802d37a41391e04bc469f0ed (patch)
tree06da6a9174ed717f0ead55aaeb1ebd5beb1e6b97
parent2a8882907f552abc2188cf958dc0cf4e71fea76e (diff)
msm: mdss: Move msm register bus setup outside of postproc
The msm register bus is currently configured by postprocessing. If the mdss driver wants to modify the msm register bus bandwidth at any point in the future, then the bus should be configured in a more central location of the mdss driver. Change-Id: I4ae65f4448f0b2be1371446d08bd4ab55c830d19 Signed-off-by: Benet Clark <benetc@codeaurora.org>
-rw-r--r--drivers/video/fbdev/msm/mdss.h3
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.c52
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.h6
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_overlay.c26
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_pp.c47
5 files changed, 73 insertions, 61 deletions
diff --git a/drivers/video/fbdev/msm/mdss.h b/drivers/video/fbdev/msm/mdss.h
index c46ba3ecf6d4..039844cc5c0d 100644
--- a/drivers/video/fbdev/msm/mdss.h
+++ b/drivers/video/fbdev/msm/mdss.h
@@ -160,6 +160,8 @@ struct mdss_data_type {
u32 *vbif_nrt_qos;
u32 npriority_lvl;
+ u32 reg_bus_hdl;
+
struct mdss_fudge_factor ab_factor;
struct mdss_fudge_factor ib_factor;
struct mdss_fudge_factor ib_factor_overlap;
@@ -193,7 +195,6 @@ struct mdss_data_type {
void *video_intf;
u32 nintf;
- u32 pp_bus_hdl;
struct mdss_mdp_ad *ad_off;
struct mdss_ad_info *ad_cfgs;
u32 nad_cfgs;
diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c
index 3ebe2a35e422..8178282c5829 100644
--- a/drivers/video/fbdev/msm/mdss_mdp.c
+++ b/drivers/video/fbdev/msm/mdss_mdp.c
@@ -122,6 +122,30 @@ struct mdss_hw mdss_mdp_hw = {
.irq_handler = mdss_mdp_isr,
};
+#define MDP_REG_BUS_VECTOR_ENTRY(ab_val, ib_val) \
+ { \
+ .src = MSM_BUS_MASTER_SPDM, \
+ .dst = MSM_BUS_SLAVE_IMEM_CFG, \
+ .ab = (ab_val), \
+ .ib = (ib_val), \
+ }
+
+#define SZ_37_5M (37500000 * 8)
+#define SZ_75M (75000000 * 8)
+
+static struct msm_bus_vectors mdp_reg_bus_vectors[] = {
+ MDP_REG_BUS_VECTOR_ENTRY(0, 0),
+ MDP_REG_BUS_VECTOR_ENTRY(0, SZ_37_5M),
+ MDP_REG_BUS_VECTOR_ENTRY(0, SZ_75M),
+};
+static struct msm_bus_paths mdp_reg_bus_usecases[ARRAY_SIZE(
+ mdp_reg_bus_vectors)];
+static struct msm_bus_scale_pdata mdp_reg_bus_scale_table = {
+ .usecase = mdp_reg_bus_usecases,
+ .num_usecases = ARRAY_SIZE(mdp_reg_bus_usecases),
+ .name = "mdss_reg",
+};
+
static DEFINE_SPINLOCK(mdss_lock);
struct mdss_hw *mdss_irq_handlers[MDSS_MAX_HW_BLK];
@@ -363,6 +387,9 @@ EXPORT_SYMBOL(mdss_disable_irq_nosync);
static int mdss_mdp_bus_scale_register(struct mdss_data_type *mdata)
{
+ struct msm_bus_scale_pdata *reg_bus_pdata;
+ int i;
+
if (!mdata->bus_hdl) {
mdata->bus_hdl =
msm_bus_scale_register_client(mdata->bus_scale_table);
@@ -374,6 +401,24 @@ static int mdss_mdp_bus_scale_register(struct mdss_data_type *mdata)
pr_debug("register bus_hdl=%x\n", mdata->bus_hdl);
}
+ if (!mdata->reg_bus_hdl) {
+ reg_bus_pdata = &mdp_reg_bus_scale_table;
+ for (i = 0; i < reg_bus_pdata->num_usecases; i++) {
+ mdp_reg_bus_usecases[i].num_paths = 1;
+ mdp_reg_bus_usecases[i].vectors =
+ &mdp_reg_bus_vectors[i];
+ }
+
+ mdata->reg_bus_hdl =
+ msm_bus_scale_register_client(reg_bus_pdata);
+ if (!mdata->reg_bus_hdl) {
+ /* Continue without reg_bus scaling */
+ pr_warn("reg_bus_client register failed\n");
+ } else
+ pr_debug("register reg_bus_hdl=%x\n",
+ mdata->reg_bus_hdl);
+ }
+
return mdss_mdp_bus_scale_set_quota(AB_QUOTA, IB_QUOTA);
}
@@ -383,6 +428,13 @@ static void mdss_mdp_bus_scale_unregister(struct mdss_data_type *mdata)
if (mdata->bus_hdl)
msm_bus_scale_unregister_client(mdata->bus_hdl);
+
+ pr_debug("unregister reg_bus_hdl=%x\n", mdata->reg_bus_hdl);
+
+ if (mdata->reg_bus_hdl) {
+ msm_bus_scale_unregister_client(mdata->reg_bus_hdl);
+ mdata->reg_bus_hdl = 0;
+ }
}
int mdss_mdp_bus_scale_set_quota(u64 ab_quota, u64 ib_quota)
diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h
index dcde9aa6d18d..af83d873d107 100644
--- a/drivers/video/fbdev/msm/mdss_mdp.h
+++ b/drivers/video/fbdev/msm/mdss_mdp.h
@@ -115,6 +115,12 @@ enum mdp_wfd_blk_type {
MDSS_MDP_WFD_DEDICATED,
};
+enum mdss_mdp_reg_bus_cfg {
+ REG_CLK_CFG_OFF,
+ REG_CLK_CFG_LOW,
+ REG_CLK_CFG_HIGH,
+};
+
struct mdss_mdp_ctl;
typedef void (*mdp_vsync_handler_t)(struct mdss_mdp_ctl *, ktime_t);
diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
index 52bb14172942..c8527fe92ff2 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
@@ -44,9 +44,6 @@
#define IS_RIGHT_MIXER_OV(flags, dst_x, left_lm_w) \
((flags & MDSS_MDP_RIGHT_MIXER) || (dst_x >= left_lm_w))
-#define PP_CLK_CFG_OFF 0
-#define PP_CLK_CFG_ON 1
-
#define MEM_PROTECT_SD_CTRL 0xF
#define OVERLAY_MAX 10
@@ -2527,8 +2524,8 @@ static int mdss_mdp_histo_ioctl(struct msm_fb_data_type *mfd, u32 cmd,
int ret = -ENOSYS;
struct mdp_histogram_data hist;
struct mdp_histogram_start_req hist_req;
+ struct mdss_data_type *mdata = mdss_mdp_get_mdata();
u32 block;
- u32 pp_bus_handle;
static int req = -1;
switch (cmd) {
@@ -2536,11 +2533,14 @@ static int mdss_mdp_histo_ioctl(struct msm_fb_data_type *mfd, u32 cmd,
if (!mfd->panel_power_on)
return -EPERM;
- pp_bus_handle = mdss_mdp_get_mdata()->pp_bus_hdl;
- req = msm_bus_scale_client_update_request(pp_bus_handle,
- PP_CLK_CFG_ON);
- if (req)
- pr_err("Updated pp_bus_scale failed, ret = %d", req);
+ if (mdata->reg_bus_hdl) {
+ req = msm_bus_scale_client_update_request(
+ mdata->reg_bus_hdl,
+ REG_CLK_CFG_LOW);
+ if (req)
+ pr_err("Updated pp_bus_scale failed, ret = %d",
+ req);
+ }
ret = copy_from_user(&hist_req, argp, sizeof(hist_req));
if (ret)
@@ -2558,10 +2558,10 @@ static int mdss_mdp_histo_ioctl(struct msm_fb_data_type *mfd, u32 cmd,
if (ret)
return ret;
- if (!req) {
- pp_bus_handle = mdss_mdp_get_mdata()->pp_bus_hdl;
- req = msm_bus_scale_client_update_request(pp_bus_handle,
- PP_CLK_CFG_OFF);
+ if (mdata->reg_bus_hdl && !req) {
+ req = msm_bus_scale_client_update_request(
+ mdata->reg_bus_hdl,
+ REG_CLK_CFG_OFF);
if (req)
pr_err("Updated pp_bus_scale failed, ret = %d",
req);
diff --git a/drivers/video/fbdev/msm/mdss_mdp_pp.c b/drivers/video/fbdev/msm/mdss_mdp_pp.c
index cd8f40a2c237..844a8afd4492 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_pp.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_pp.c
@@ -288,26 +288,6 @@ static int mdss_mdp_hscl_filter[] = {
#define SHARP_SMOOTH_THR_DEFAULT 8
#define SHARP_NOISE_THR_DEFAULT 2
-#define MDP_PP_BUS_VECTOR_ENTRY(ab_val, ib_val) \
- { \
- .src = MSM_BUS_MASTER_SPDM, \
- .dst = MSM_BUS_SLAVE_IMEM_CFG, \
- .ab = (ab_val), \
- .ib = (ib_val), \
- }
-
-#define SZ_37_5M (37500000 * 8)
-
-static struct msm_bus_vectors mdp_pp_bus_vectors[] = {
- MDP_PP_BUS_VECTOR_ENTRY(0, 0),
- MDP_PP_BUS_VECTOR_ENTRY(0, SZ_37_5M),
-};
-static struct msm_bus_paths mdp_pp_bus_usecases[ARRAY_SIZE(mdp_pp_bus_vectors)];
-static struct msm_bus_scale_pdata mdp_pp_bus_scale_table = {
- .usecase = mdp_pp_bus_usecases,
- .num_usecases = ARRAY_SIZE(mdp_pp_bus_usecases),
- .name = "mdss_pp",
-};
struct mdss_pp_res_type {
/* logical info */
@@ -1898,7 +1878,6 @@ int mdss_mdp_pp_init(struct device *dev)
int i, ret = 0;
struct mdss_data_type *mdata = mdss_mdp_get_mdata();
struct mdss_mdp_pipe *vig;
- struct msm_bus_scale_pdata *pp_bus_pdata;
struct pp_hist_col_info *hist;
if (!mdata)
@@ -1949,23 +1928,6 @@ int mdss_mdp_pp_init(struct device *dev)
init_completion(&vig[i].pp_res.hist.comp);
init_completion(&vig[i].pp_res.hist.first_kick);
}
- if (!mdata->pp_bus_hdl) {
- pp_bus_pdata = &mdp_pp_bus_scale_table;
- for (i = 0; i < pp_bus_pdata->num_usecases; i++) {
- mdp_pp_bus_usecases[i].num_paths = 1;
- mdp_pp_bus_usecases[i].vectors =
- &mdp_pp_bus_vectors[i];
- }
-
- mdata->pp_bus_hdl =
- msm_bus_scale_register_client(pp_bus_pdata);
- if (!mdata->pp_bus_hdl) {
- pr_err("not able to register pp_bus_scale\n");
- ret = -ENOMEM;
- }
- pr_debug("register pp_bus_hdl=%x\n", mdata->pp_bus_hdl);
- }
-
}
mutex_unlock(&mdss_pp_mutex);
return ret;
@@ -1973,15 +1935,6 @@ int mdss_mdp_pp_init(struct device *dev)
void mdss_mdp_pp_term(struct device *dev)
{
- struct mdss_data_type *mdata = mdss_mdp_get_mdata();
-
- if (!mdata)
- return;
-
- if (mdata->pp_bus_hdl) {
- msm_bus_scale_unregister_client(mdata->pp_bus_hdl);
- mdata->pp_bus_hdl = 0;
- }
if (mdss_pp_res) {
mutex_lock(&mdss_pp_mutex);
devm_kfree(dev, mdss_pp_res->dspp_hist);