diff options
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.h | 2 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_ctl.c | 13 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 22 |
3 files changed, 24 insertions, 13 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h index 035fec502634..c452b53f9a51 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.h +++ b/drivers/video/fbdev/msm/mdss_mdp.h @@ -29,7 +29,7 @@ #define MDP_CLK_DEFAULT_RATE 37500000 #define PHASE_STEP_SHIFT 21 #define MAX_MIXER_WIDTH 2048 -#define MAX_MIXER_HEIGHT 2048 +#define MAX_MIXER_HEIGHT 2400 #define MAX_IMG_WIDTH 0x3FFF #define MAX_IMG_HEIGHT 0x3FFF #define MIN_DST_W 10 diff --git a/drivers/video/fbdev/msm/mdss_mdp_ctl.c b/drivers/video/fbdev/msm/mdss_mdp_ctl.c index bebcc4bbef56..9f1bab657422 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_ctl.c +++ b/drivers/video/fbdev/msm/mdss_mdp_ctl.c @@ -382,17 +382,18 @@ static int mdss_mdp_ctl_init(struct msm_fb_data_type *mfd) return -ENOMEM; } - ctl->mixer_left->width = MIN(width, MAX_MIXER_WIDTH); + if (width > MAX_MIXER_WIDTH) + width /= 2; + + ctl->mixer_left->width = width; ctl->mixer_left->height = height; ctl->mixer_left->ctl = ctl; - width -= ctl->mixer_left->width; - - if (width) { + if (width < ctl->width) { ctl->mixer_right = - mdss_mdp_mixer_alloc(MDSS_MDP_MIXER_TYPE_INTF); + mdss_mdp_mixer_alloc(MDSS_MDP_MIXER_TYPE_INTF); if (!ctl->mixer_right) { - pr_err("unable to allocate layer mixer\n"); + pr_err("unable to allocate right layer mixer\n"); mdss_mdp_mixer_free(ctl->mixer_left); mdss_mdp_ctl_free(ctl); return -ENOMEM; diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index d7e7a3f14542..098849016fb2 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -636,8 +636,15 @@ static int mdss_mdp_overlay_get_fb_pipe(struct msm_fb_data_type *mfd, if (pipe == NULL) { struct mdp_overlay req; struct fb_info *fbi = mfd->fbi; + struct mdss_mdp_mixer *mixer; int ret, bpp; + mixer = mdss_mdp_mixer_get(mfd->ctl, MDSS_MDP_MIXER_MUX_LEFT); + if (!mixer) { + pr_err("unable to retrieve mixer\n"); + return -ENODEV; + } + memset(&req, 0, sizeof(req)); bpp = fbi->var.bits_per_pixel / 8; @@ -646,20 +653,22 @@ static int mdss_mdp_overlay_get_fb_pipe(struct msm_fb_data_type *mfd, req.src.height = fbi->var.yres; req.src.width = fbi->fix.line_length / bpp; if (mixer_mux == MDSS_MDP_MIXER_MUX_RIGHT) { - if (req.src.width <= MAX_MIXER_WIDTH) - return -ENODEV; + if (req.src.width <= mixer->width) { + pr_warn("right fb pipe not needed\n"); + return -EINVAL; + } req.flags |= MDSS_MDP_RIGHT_MIXER; - req.src_rect.x = MAX_MIXER_WIDTH; - req.src_rect.w = fbi->var.xres - MAX_MIXER_WIDTH; + req.src_rect.x = mixer->width; + req.src_rect.w = fbi->var.xres - mixer->width; } else { req.src_rect.x = 0; - req.src_rect.w = MIN(fbi->var.xres, MAX_MIXER_WIDTH); + req.src_rect.w = MIN(fbi->var.xres, mixer->width); } req.src_rect.y = 0; req.src_rect.h = req.src.height; - req.dst_rect.x = req.src_rect.x; + req.dst_rect.x = 0; req.dst_rect.y = 0; req.dst_rect.w = req.src_rect.w; req.dst_rect.h = req.src_rect.h; @@ -696,6 +705,7 @@ static void mdss_mdp_overlay_pan_display(struct msm_fb_data_type *mfd) if (fbi->fix.smem_len == 0) { pr_warn("fb memory not allocated\n"); + mdss_mdp_overlay_kickoff(mfd->ctl); return; } |
