diff options
| author | Kuogee Hsieh <khsieh@codeaurora.org> | 2015-04-15 10:42:02 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:40:43 -0700 |
| commit | 262c304acbf7d59583c34054cf56d8a91a979f5b (patch) | |
| tree | e8048bec8ca86ab8c06411e9eeffdd7781219f32 /drivers | |
| parent | 377c6c9ba8fd69085c4f4717263edbcc875c9b1d (diff) | |
msm: mdss: add DSC offset parsing in mdss module
DSC (display stream compression) is the new module and
supported starting MSM8996 target. Input offsets from
dtsi so that registers belong to DSC can be configured.
Change-Id: I3f06b1a2524bd0d2d408baac4309061f1f9117e8
Signed-off-by: Kuogee Hsieh <khsieh@codeaurora.org>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/video/fbdev/msm/mdss.h | 8 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.c | 71 |
2 files changed, 79 insertions, 0 deletions
diff --git a/drivers/video/fbdev/msm/mdss.h b/drivers/video/fbdev/msm/mdss.h index 8db94d1e02cf..593b8f74d684 100644 --- a/drivers/video/fbdev/msm/mdss.h +++ b/drivers/video/fbdev/msm/mdss.h @@ -108,6 +108,11 @@ struct mdss_mdp_ppb { u32 cfg_off; }; +struct mdss_mdp_dsc { + u32 num; + char __iomem *base; +}; + enum mdss_hw_index { MDSS_HW_MDP, MDSS_HW_DSI0 = 1, @@ -386,6 +391,9 @@ struct mdss_data_type { u32 ncdm; struct mutex cdm_lock; + struct mdss_mdp_dsc *dsc_off; + u32 ndsc; + struct mutex mdp_bus_lock; u32 bus_ref_cnt; }; diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c index 25f6b2987cea..c1663b7ecb90 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.c +++ b/drivers/video/fbdev/msm/mdss_mdp.c @@ -152,6 +152,7 @@ static int mdss_mdp_parse_dt_ad_cfg(struct platform_device *pdev); static int mdss_mdp_parse_dt_bus_scale(struct platform_device *pdev); static int mdss_mdp_parse_dt_ppb_off(struct platform_device *pdev); static int mdss_mdp_parse_dt_cdm(struct platform_device *pdev); +static int mdss_mdp_parse_dt_dsc(struct platform_device *pdev); /** * mdss_mdp_vbif_axi_halt() - Halt MDSS AXI ports @@ -1789,6 +1790,10 @@ static int mdss_mdp_parse_dt(struct platform_device *pdev) if (rc) pr_debug("CDM offset not found in device tree\n"); + rc = mdss_mdp_parse_dt_dsc(pdev); + if (rc) + pr_debug("DSC offset not found in device tree\n"); + /* Parse the mdp specific register base offset*/ rc = of_property_read_u32(pdev->dev.of_node, "qcom,mdss-mdp-reg-offset", &data); @@ -2401,6 +2406,72 @@ end: return rc; } +static int mdss_mdp_dsc_addr_setup(struct mdss_data_type *mdata, + u32 *dsc_offsets, u32 len) +{ + struct mdss_mdp_dsc *head; + u32 i = 0; + + head = devm_kzalloc(&mdata->pdev->dev, sizeof(struct mdss_mdp_dsc) * + len, GFP_KERNEL); + if (!head) { + pr_err("no memory for DSC info\n"); + return -ENOMEM; + } + + for (i = 0; i < len; i++) { + head[i].num = i; + head[i].base = (mdata->mdss_io.base) + dsc_offsets[i]; + pr_debug("dsc off (%d) = %p\n", i, head[i].base); + } + + mdata->dsc_off = head; + return 0; +} + +static int mdss_mdp_parse_dt_dsc(struct platform_device *pdev) +{ + int rc = 0; + u32 *dsc_offsets = NULL; + struct mdss_data_type *mdata = platform_get_drvdata(pdev); + + mdata->ndsc = mdss_mdp_parse_dt_prop_len(pdev, "qcom,mdss-dsc-off"); + if (!mdata->ndsc) { + rc = 0; + pr_debug("No DSC offsets present in DT\n"); + goto end; + } + pr_debug("dsc len == %d\n", mdata->ndsc); + + dsc_offsets = kzalloc(sizeof(u32) * mdata->ndsc, GFP_KERNEL); + if (!dsc_offsets) { + pr_err("no more memory for dsc offsets\n"); + rc = -ENOMEM; + mdata->ndsc = 0; + goto end; + } + + rc = mdss_mdp_parse_dt_handler(pdev, "qcom,mdss-dsc-off", dsc_offsets, + mdata->ndsc); + if (rc) { + pr_err("device tree err: failed to get cdm offsets\n"); + goto fail; + } + + rc = mdss_mdp_dsc_addr_setup(mdata, dsc_offsets, mdata->ndsc); + if (rc) { + pr_err("%s: DSC address setup failed\n", __func__); + goto fail; + } + +fail: + kfree(dsc_offsets); + if (rc) + mdata->ndsc = 0; +end: + return rc; +} + static int mdss_mdp_parse_dt_wb(struct platform_device *pdev) { int rc = 0; |
