summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorKuogee Hsieh <khsieh@codeaurora.org>2015-04-15 10:42:02 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:40:43 -0700
commit262c304acbf7d59583c34054cf56d8a91a979f5b (patch)
treee8048bec8ca86ab8c06411e9eeffdd7781219f32 /drivers
parent377c6c9ba8fd69085c4f4717263edbcc875c9b1d (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.h8
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.c71
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;