diff options
| author | Jayant Shekhar <jshekhar@codeaurora.org> | 2015-06-19 13:58:12 +0530 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 21:13:02 -0700 |
| commit | e58f908e4c3754b6b11054d80b7110a0ee867d7d (patch) | |
| tree | b4d276f59abdd827cf73beefabe242de4a2d06bf /drivers/video/fbdev | |
| parent | 588411ea51f10d2497c20c07c263649468a741f7 (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.c | 50 |
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); |
