From a8ee2af629d5c97d9c853b4aa2faeff2f8bfa836 Mon Sep 17 00:00:00 2001 From: Asaf Penso Date: Tue, 16 Oct 2012 11:00:19 +0200 Subject: msm: mdss: add support for different panel formats Some panels have different color format requirement such as RGB666 for EDP Panel. Add logic to detect panel resolution based on panel bpp set by panel driver. Change-Id: I4cad59033b8b4f807c2ed38b00451aab89737bb7 Signed-off-by: Asaf Penso Signed-off-by: Adrian Salido-Moreno --- drivers/video/fbdev/msm/mdss_mdp_ctl.c | 21 ++++++++++++++++++++- drivers/video/fbdev/msm/mdss_mdp_hwio.h | 1 + drivers/video/fbdev/msm/mdss_mdp_intf_video.c | 2 -- 3 files changed, 21 insertions(+), 3 deletions(-) (limited to 'drivers/video/fbdev') diff --git a/drivers/video/fbdev/msm/mdss_mdp_ctl.c b/drivers/video/fbdev/msm/mdss_mdp_ctl.c index f51a8cb450fb..d68e6ac27de5 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_ctl.c +++ b/drivers/video/fbdev/msm/mdss_mdp_ctl.c @@ -396,7 +396,6 @@ static int mdss_mdp_ctl_init(struct msm_fb_data_type *mfd) ctl->width = width; ctl->height = height; - ctl->dst_format = mfd->panel_info.out_format; if (!ctl->mixer_left) { ctl->mixer_left = @@ -467,6 +466,20 @@ static int mdss_mdp_ctl_init(struct msm_fb_data_type *mfd) ctl->opmode |= (ctl->intf_num << 4); + if (ctl->intf_num == MDSS_MDP_NO_INTF) { + ctl->dst_format = mfd->panel_info.out_format; + } else { + switch (mfd->panel_info.bpp) { + case 18: + ctl->dst_format = MDSS_MDP_PANEL_FORMAT_RGB666; + break; + case 24: + default: + ctl->dst_format = MDSS_MDP_PANEL_FORMAT_RGB888; + break; + } + } + if (ctl->mixer_right) { ctl->opmode |= MDSS_MDP_CTL_OP_PACK_3D_ENABLE | MDSS_MDP_CTL_OP_PACK_3D_H_ROW_INT; @@ -560,6 +573,12 @@ int mdss_mdp_ctl_on(struct msm_fb_data_type *mfd) temp |= (ctl->intf_type << ((ctl->intf_num - MDSS_MDP_INTF0) * 8)); MDSS_MDP_REG_WRITE(MDSS_MDP_REG_DISP_INTF_SEL, temp); + if (ctl->intf_num != MDSS_MDP_NO_INTF) { + off = MDSS_MDP_REG_INTF_OFFSET(ctl->intf_num); + MDSS_MDP_REG_WRITE(off + MDSS_MDP_REG_INTF_PANEL_FORMAT, + ctl->dst_format); + } + outsize = (mixer->height << 16) | mixer->width; off = MDSS_MDP_REG_LM_OFFSET(mixer->num); MDSS_MDP_REG_WRITE(off + MDSS_MDP_REG_LM_OUT_SIZE, outsize); diff --git a/drivers/video/fbdev/msm/mdss_mdp_hwio.h b/drivers/video/fbdev/msm/mdss_mdp_hwio.h index 130affc7b2dd..46269e79e7c0 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_hwio.h +++ b/drivers/video/fbdev/msm/mdss_mdp_hwio.h @@ -395,6 +395,7 @@ enum mdss_mpd_intf_index { #define MDSS_MDP_REG_INTF_FRAME_COUNT 0x0AC #define MDSS_MDP_REG_INTF_LINE_COUNT 0x0B0 #define MDSS_MDP_PANEL_FORMAT_RGB888 0x213F +#define MDSS_MDP_PANEL_FORMAT_RGB666 0x212A enum mdss_mdp_pingpong_index { MDSS_MDP_PINGPONG0, diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_video.c b/drivers/video/fbdev/msm/mdss_mdp_intf_video.c index 1157ca1ea9a4..097ef3888b74 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_intf_video.c +++ b/drivers/video/fbdev/msm/mdss_mdp_intf_video.c @@ -153,8 +153,6 @@ static int mdss_mdp_video_timegen_setup(struct mdss_mdp_ctl *ctl, p->hsync_skew); MDSS_MDP_REG_WRITE(off + MDSS_MDP_REG_INTF_POLARITY_CTL, polarity_ctl); - MDSS_MDP_REG_WRITE(off + MDSS_MDP_REG_INTF_PANEL_FORMAT, - MDSS_MDP_PANEL_FORMAT_RGB888); return 0; } -- cgit v1.2.3