summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev
diff options
context:
space:
mode:
authorJayant Shekhar <jshekhar@codeaurora.org>2015-06-19 13:58:12 +0530
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:13:02 -0700
commite58f908e4c3754b6b11054d80b7110a0ee867d7d (patch)
treeb4d276f59abdd827cf73beefabe242de4a2d06bf /drivers/video/fbdev
parent588411ea51f10d2497c20c07c263649468a741f7 (diff)
mdss: mdp: Create virtual wb mixers for rotation if not available
Create virtual wb mixers to support rotation, if no matching mixers are available in the model. The number of virtual mixers is equal to the number of DMA pipes available for rotation. Change-Id: I3f4df3175595168d55373eb91e5cd05ef5f65919 Signed-off-by: Jayant Shekhar <jshekhar@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev')
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.c50
1 files changed, 39 insertions, 11 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c
index 2e7403b24b15..44be82631f5d 100644
--- a/drivers/video/fbdev/msm/mdss_mdp.c
+++ b/drivers/video/fbdev/msm/mdss_mdp.c
@@ -2576,6 +2576,7 @@ static int mdss_mdp_parse_dt_mixer(struct platform_device *pdev)
int rc = 0;
u32 *mixer_offsets = NULL, *dspp_offsets = NULL,
*pingpong_offsets = NULL;
+ u32 is_virtual_mixer_req = false;
struct mdss_data_type *mdata = platform_get_drvdata(pdev);
@@ -2630,10 +2631,22 @@ static int mdss_mdp_parse_dt_mixer(struct platform_device *pdev)
if (rc)
goto parse_done;
- rc = mdss_mdp_parse_dt_handler(pdev, "qcom,mdss-mixer-wb-off",
- mixer_offsets + mdata->nmixers_intf, mdata->nmixers_wb);
- if (rc)
- goto parse_done;
+ if (mdata->nmixers_wb) {
+ rc = mdss_mdp_parse_dt_handler(pdev, "qcom,mdss-mixer-wb-off",
+ mixer_offsets + mdata->nmixers_intf,
+ mdata->nmixers_wb);
+ if (rc)
+ goto parse_done;
+ } else {
+ /*
+ * If writeback mixers are not available, put the number of
+ * writeback mixers equal to number of DMA pipes so that
+ * later same number of virtual writeback mixers can be
+ * allocated.
+ */
+ mdata->nmixers_wb = mdata->ndma_pipes;
+ is_virtual_mixer_req = true;
+ }
rc = mdss_mdp_parse_dt_handler(pdev, "qcom,mdss-dspp-off",
dspp_offsets, mdata->ndspp);
@@ -2651,11 +2664,27 @@ static int mdss_mdp_parse_dt_mixer(struct platform_device *pdev)
if (rc)
goto parse_done;
- rc = mdss_mdp_mixer_addr_setup(mdata, mixer_offsets +
- mdata->nmixers_intf, NULL, NULL,
- MDSS_MDP_MIXER_TYPE_WRITEBACK, mdata->nmixers_wb);
- if (rc)
- goto parse_done;
+ if (mdata->nmixers_wb) {
+ if (is_virtual_mixer_req) {
+ /*
+ * Replicate last interface mixers based on number of
+ * dma pipes available as virtual writeback mixers.
+ */
+ rc = mdss_mdp_mixer_addr_setup(mdata, mixer_offsets +
+ mdata->nmixers_intf - mdata->ndma_pipes,
+ NULL, NULL, MDSS_MDP_MIXER_TYPE_WRITEBACK,
+ mdata->nmixers_wb);
+ if (rc)
+ goto parse_done;
+ } else {
+ rc = mdss_mdp_mixer_addr_setup(mdata, mixer_offsets +
+ mdata->nmixers_intf, NULL, NULL,
+ MDSS_MDP_MIXER_TYPE_WRITEBACK,
+ mdata->nmixers_wb);
+ if (rc)
+ goto parse_done;
+ }
+ }
parse_done:
kfree(pingpong_offsets);
@@ -2812,8 +2841,7 @@ static int mdss_mdp_parse_dt_wb(struct platform_device *pdev)
mdata = platform_get_drvdata(pdev);
- num_wb_mixer = mdss_mdp_parse_dt_prop_len(pdev,
- "qcom,mdss-mixer-wb-off");
+ num_wb_mixer = mdata->nmixers_wb;
wfd_data = of_get_property(pdev->dev.of_node,
"qcom,mdss-wfd-mode", NULL);