summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorPing li <pingli@codeaurora.org>2014-10-07 14:28:33 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:35:05 -0700
commit0db67521c184e5ebbc42cf2a2c8abb7b3464b729 (patch)
treedc41abf14eed906bd11dc79d118f7e32be294c69 /drivers
parent0d3af8c670178a4e9e14898ebcae7069824f595b (diff)
msm: mdss: dynamically set the postproc offsets
MDP hardware consists of postprocessing hardware modules which are part of different layers. Offsets of the post processing block can change based on the MDP version. Moving these module offsets into device tree makes the driver agnostic of mdp version. This change adds support to parse the offsets from device Change-Id: I586c69d0f6217cda9bb7d4ce47aa563c827ea531 Signed-off-by: Ping Li <pingli@codeaurora.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/fbdev/msm/mdss.h12
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_pp.c119
2 files changed, 131 insertions, 0 deletions
diff --git a/drivers/video/fbdev/msm/mdss.h b/drivers/video/fbdev/msm/mdss.h
index a9f2f0b65d4e..8c5bbf350a12 100644
--- a/drivers/video/fbdev/msm/mdss.h
+++ b/drivers/video/fbdev/msm/mdss.h
@@ -107,6 +107,17 @@ enum mdss_hw_index {
MDSS_MAX_HW_BLK
};
+struct mdss_pp_block_off {
+ u32 sspp_igc_lut_off;
+ u32 vig_pcc_off;
+ u32 rgb_pcc_off;
+ u32 dma_pcc_off;
+ u32 lm_pgc_off;
+ u32 dspp_gamut_off;
+ u32 dspp_pcc_off;
+ u32 dspp_pgc_off;
+};
+
struct mdss_data_type {
u32 mdp_rev;
struct clk *mdp_clk[MDSS_MAX_CLK];
@@ -248,6 +259,7 @@ struct mdss_data_type {
u64 ab_rt[MDSS_MAX_HW_BLK];
u64 ab_nrt[MDSS_MAX_HW_BLK];
u64 ib[MDSS_MAX_HW_BLK];
+ struct mdss_pp_block_off pp_block_off;
};
extern struct mdss_data_type *mdss_res;
diff --git a/drivers/video/fbdev/msm/mdss_mdp_pp.c b/drivers/video/fbdev/msm/mdss_mdp_pp.c
index 541bd2ed5ff4..aff09589521b 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_pp.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_pp.c
@@ -2031,6 +2031,122 @@ int mdss_mdp_pp_resume(struct mdss_mdp_ctl *ctl, u32 dspp_num)
return 0;
}
+static int mdss_mdp_pp_dt_parse(struct device *dev)
+{
+ int ret = -EINVAL;
+ struct device_node *node;
+ struct mdss_data_type *mdata;
+ u32 prop_val;
+
+ mdata = mdss_mdp_get_mdata();
+ if (dev && mdata) {
+ /* initialize offsets to U32_MAX */
+ memset(&mdata->pp_block_off, U8_MAX,
+ sizeof(mdata->pp_block_off));
+ node = of_get_child_by_name(dev->of_node,
+ "qcom,mdss-pp-offsets");
+ if (node) {
+ ret = of_property_read_u32(node,
+ "qcom,mdss-sspp-mdss-igc-lut-off",
+ &prop_val);
+ if (ret) {
+ pr_err("read property %s failed ret %d\n",
+ "qcom,mdss-sspp-mdss-igc-lut-off", ret);
+ goto bail_out;
+ } else {
+ mdata->pp_block_off.sspp_igc_lut_off =
+ prop_val;
+ }
+
+ ret = of_property_read_u32(node,
+ "qcom,mdss-sspp-vig-pcc-off",
+ &prop_val);
+ if (ret) {
+ pr_err("read property %s failed ret %d\n",
+ "qcom,mdss-sspp-vig-pcc-off", ret);
+ goto bail_out;
+ } else {
+ mdata->pp_block_off.vig_pcc_off = prop_val;
+ }
+
+ ret = of_property_read_u32(node,
+ "qcom,mdss-sspp-rgb-pcc-off",
+ &prop_val);
+ if (ret) {
+ pr_err("read property %s failed ret %d\n",
+ "qcom,mdss-sspp-rgb-pcc-off", ret);
+ goto bail_out;
+ } else {
+ mdata->pp_block_off.rgb_pcc_off = prop_val;
+ }
+
+ ret = of_property_read_u32(node,
+ "qcom,mdss-sspp-dma-pcc-off",
+ &prop_val);
+ if (ret) {
+ pr_err("read property %s failed ret %d\n",
+ "qcom,mdss-sspp-dma-pcc-off", ret);
+ goto bail_out;
+ } else {
+ mdata->pp_block_off.dma_pcc_off = prop_val;
+ }
+
+ ret = of_property_read_u32(node,
+ "qcom,mdss-lm-pgc-off",
+ &prop_val);
+
+ if (ret) {
+ pr_err("read property %s failed ret %d\n",
+ "qcom,mdss-lm-pgc-off", ret);
+ goto bail_out;
+ } else {
+ mdata->pp_block_off.lm_pgc_off = prop_val;
+ }
+
+ ret = of_property_read_u32(node,
+ "qcom,mdss-dspp-gamut-off",
+ &prop_val);
+ if (ret) {
+ pr_err("read property %s failed ret %d\n",
+ "qcom,mdss-dspp-gamut-off", ret);
+ goto bail_out;
+ } else {
+ mdata->pp_block_off.dspp_gamut_off = prop_val;
+ }
+
+ ret = of_property_read_u32(node,
+ "qcom,mdss-dspp-pcc-off",
+ &prop_val);
+ if (ret) {
+ pr_err("read property %s failed ret %d\n",
+ "qcom,mdss-dspp-pcc-off", ret);
+ goto bail_out;
+ } else {
+ mdata->pp_block_off.dspp_pcc_off = prop_val;
+ }
+
+ ret = of_property_read_u32(node,
+ "qcom,mdss-dspp-pgc-off",
+ &prop_val);
+ if (ret) {
+ pr_err("read property %s failed ret %d\n",
+ "qcom,mdss-dspp-pgc-off", ret);
+ goto bail_out;
+ } else {
+ mdata->pp_block_off.dspp_pgc_off = prop_val;
+ }
+ } else {
+ pr_debug("offsets are not supported\n");
+ ret = 0;
+ }
+ } else {
+ pr_err("invalid dev %p mdata %p\n", dev, mdata);
+ ret = -EINVAL;
+ }
+bail_out:
+ return ret;
+}
+
int mdss_mdp_pp_init(struct device *dev)
{
int i, ret = 0;
@@ -2049,6 +2165,9 @@ int mdss_mdp_pp_init(struct device *dev)
pr_err("%s mdss_pp_res allocation failed!\n", __func__);
ret = -ENOMEM;
} else {
+ if (mdss_mdp_pp_dt_parse(dev))
+ pr_info("No PP info in device tree\n");
+
hist = devm_kzalloc(dev,
sizeof(struct pp_hist_col_info) *
mdata->nmixers_intf,