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>
This commit is contained in:
Ping li 2014-10-07 14:28:33 -07:00 committed by David Keitel
parent 0d3af8c670
commit 0db67521c1
3 changed files with 160 additions and 0 deletions

View file

@ -451,6 +451,24 @@ Subnode properties:
- qcom,mdss-idle-power-collapse-enabled: Boolean property that enables support
for mdss power collapse in idle
screen use cases with smart panels.
- qcom,mdss-pp-offets: A node that lists the offsets of post processing blocks
from base module.
-- qcom,mdss-mdss-sspp-igc-lut-off: This 32 bit value provides the
offset to the IGC lut rams from mdp_phys base.
-- qcom,mdss-sspp-vig-pcc-off: This 32 bit value provides the offset
to PCC block from the VIG pipe base address.
-- qcom,mdss-sspp-rgb-pcc-off: This 32 bit value provides the offset
to PCC block from the RGB pipe base address.
-- qcom,mdss-sspp-dma-pcc-off: This 32 bit value provides the offset
to PCC block from the DMA pipe base address.
-- qcom,mdss-dspp-pcc-off: This 32 bit value provides the offset
to PCC block from the DSPP pipe base address.
-- qcom,mdss-lm-pgc-off: This 32 bit value provides the offset
to PGC block from the layer mixer base address.
-- qcom,mdss-dspp-gamut-off: This 32 bit value provides the offset
to gamut block from DSPP base address.
-- qcom,mdss-dspp-pgc-off: This 32 bit value provides the offset to
PGC block from the DSPP base address.
Example:
mdss_mdp: qcom,mdss_mdp@fd900000 {
@ -592,5 +610,16 @@ Example:
linux,contiguous-region = <&cont_splash_mem>;
};
};
qcom,mdss-pp-offsets {
qcom,mdss-sspp-mdss-igc-lut-off = <0x3000>;
qcom,mdss-sspp-vig-pcc-off = <0x1580>;
qcom,mdss-sspp-rgb-pcc-off = <0x180>;
qcom,mdss-sspp-dma-pcc-off = <0x180>;
qcom,mdss-lm-pgc-off = <0x3C0>;
qcom,mdss-dspp-gamut-off = <0x1600>;
qcom,mdss-dspp-pcc-off = <0x1700>;
qcom,mdss-dspp-pgc-off = <0x17C0>;
};
};

View file

@ -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;

View file

@ -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,