summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev
diff options
context:
space:
mode:
authorAsaf Penso <apenso@codeaurora.org>2012-10-16 11:00:19 +0200
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:12:56 -0700
commita8ee2af629d5c97d9c853b4aa2faeff2f8bfa836 (patch)
tree43df747c017ad8948f5a309e3f2dc9f66af9d5d0 /drivers/video/fbdev
parente4eb6694d4fe32e35bab97ca77e07496558d828e (diff)
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 <apenso@codeaurora.org> Signed-off-by: Adrian Salido-Moreno <adrianm@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev')
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_ctl.c21
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_hwio.h1
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_intf_video.c2
3 files changed, 21 insertions, 3 deletions
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;
}