Commit 9a27d591 authored by Guoqing Li's avatar Guoqing Li Committed by Tomi Valkeinen

video: mmp: rb swap setting update for mmp display

We could set rb swap in two modules: DMA controler input part and
dsi interface output part.
DMA input part is based on pix_fmt to set rbswap, dsi output interface
part will set rbswap based on platform dsi_rbswap configuration.

This patch include below change and enhancement:

1) The input format which support rbswap is based on RGB format,
eg. RGB565 indicates the source data in memory is that Red is [15~11],
Green is [10~5], Blue is [4:0], Red is MSB, Blue is LSB, but for the
display dma input default setting(rbswap = 0), it only support Blue
is [15~11], Green is [10~5], Red is [4:0], Red is LSB, Blue is MSB,
so for this format(RGB565), display controller need to set rbswap
 = 1 and it can support the MSB/LSB correctly.
BGR/YUV format will not set it in mmp display driver.

2) The dsi output part of rbswap is depend on dsi_rbswap which is
defined in specific platfrom. For output dsi interface, it has this
feature to do rbswap again if it needs specifc byte sequence of RGB
byte for DSI panel.
eg. If display content is set RGB565 in memory and DMA input part set
rbswap in driver to support Red as MSB , Blue LSB, but dsi panel only
support Red as LSB, Blue as MSB, then it can use this feature.
If there is no this requirement of panel, this dsi output part is not
needed.
Signed-off-by: default avatarGuoqing Li <ligq@marvell.com>
Signed-off-by: default avatarJett.Zhou <jtzhou@marvell.com>
Signed-off-by: default avatarZhou Zhu <zzhu3@marvell.com>
Reviewed-by: default avatarDaniel Drake <dsd@laptop.org>
Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
parent 91f8628b
...@@ -60,8 +60,7 @@ static irqreturn_t ctrl_handle_irq(int irq, void *dev_id) ...@@ -60,8 +60,7 @@ static irqreturn_t ctrl_handle_irq(int irq, void *dev_id)
static u32 fmt_to_reg(struct mmp_overlay *overlay, int pix_fmt) static u32 fmt_to_reg(struct mmp_overlay *overlay, int pix_fmt)
{ {
u32 link_config = path_to_path_plat(overlay->path)->link_config; u32 rbswap = 0, uvswap = 0, yuvswap = 0,
u32 rbswap, uvswap = 0, yuvswap = 0,
csc_en = 0, val = 0, csc_en = 0, val = 0,
vid = overlay_is_vid(overlay); vid = overlay_is_vid(overlay);
...@@ -71,27 +70,23 @@ static u32 fmt_to_reg(struct mmp_overlay *overlay, int pix_fmt) ...@@ -71,27 +70,23 @@ static u32 fmt_to_reg(struct mmp_overlay *overlay, int pix_fmt)
case PIXFMT_RGB888PACK: case PIXFMT_RGB888PACK:
case PIXFMT_RGB888UNPACK: case PIXFMT_RGB888UNPACK:
case PIXFMT_RGBA888: case PIXFMT_RGBA888:
rbswap = !(link_config & 0x1); rbswap = 1;
break; break;
case PIXFMT_VYUY: case PIXFMT_VYUY:
case PIXFMT_YVU422P: case PIXFMT_YVU422P:
case PIXFMT_YVU420P: case PIXFMT_YVU420P:
rbswap = link_config & 0x1;
uvswap = 1; uvswap = 1;
break; break;
case PIXFMT_YUYV: case PIXFMT_YUYV:
rbswap = link_config & 0x1;
yuvswap = 1; yuvswap = 1;
break; break;
default: default:
rbswap = link_config & 0x1;
break; break;
} }
switch (pix_fmt) { switch (pix_fmt) {
case PIXFMT_RGB565: case PIXFMT_RGB565:
case PIXFMT_BGR565: case PIXFMT_BGR565:
val = 0;
break; break;
case PIXFMT_RGB1555: case PIXFMT_RGB1555:
case PIXFMT_BGR1555: case PIXFMT_BGR1555:
...@@ -248,7 +243,8 @@ static void path_set_mode(struct mmp_path *path, struct mmp_mode *mode) ...@@ -248,7 +243,8 @@ static void path_set_mode(struct mmp_path *path, struct mmp_mode *mode)
{ {
struct lcd_regs *regs = path_regs(path); struct lcd_regs *regs = path_regs(path);
u32 total_x, total_y, vsync_ctrl, tmp, sclk_src, sclk_div, u32 total_x, total_y, vsync_ctrl, tmp, sclk_src, sclk_div,
link_config = path_to_path_plat(path)->link_config; link_config = path_to_path_plat(path)->link_config,
dsi_rbswap = path_to_path_plat(path)->link_config;
/* FIXME: assert videomode supported */ /* FIXME: assert videomode supported */
memcpy(&path->mode, mode, sizeof(struct mmp_mode)); memcpy(&path->mode, mode, sizeof(struct mmp_mode));
...@@ -263,6 +259,12 @@ static void path_set_mode(struct mmp_path *path, struct mmp_mode *mode) ...@@ -263,6 +259,12 @@ static void path_set_mode(struct mmp_path *path, struct mmp_mode *mode)
tmp |= CFG_DUMB_ENA(1); tmp |= CFG_DUMB_ENA(1);
writel_relaxed(tmp, ctrl_regs(path) + intf_ctrl(path->id)); writel_relaxed(tmp, ctrl_regs(path) + intf_ctrl(path->id));
/* interface rb_swap setting */
tmp = readl_relaxed(ctrl_regs(path) + intf_rbswap_ctrl(path->id)) &
(~(CFG_INTFRBSWAP_MASK));
tmp |= dsi_rbswap & CFG_INTFRBSWAP_MASK;
writel_relaxed(tmp, ctrl_regs(path) + intf_rbswap_ctrl(path->id));
writel_relaxed((mode->yres << 16) | mode->xres, &regs->screen_active); writel_relaxed((mode->yres << 16) | mode->xres, &regs->screen_active);
writel_relaxed((mode->left_margin << 16) | mode->right_margin, writel_relaxed((mode->left_margin << 16) | mode->right_margin,
&regs->screen_h_porch); &regs->screen_h_porch);
...@@ -419,6 +421,7 @@ static int path_init(struct mmphw_path_plat *path_plat, ...@@ -419,6 +421,7 @@ static int path_init(struct mmphw_path_plat *path_plat,
path_plat->path = path; path_plat->path = path;
path_plat->path_config = config->path_config; path_plat->path_config = config->path_config;
path_plat->link_config = config->link_config; path_plat->link_config = config->link_config;
path_plat->dsi_rbswap = config->dsi_rbswap;
path_set_default(path); path_set_default(path);
kfree(path_info); kfree(path_info);
......
...@@ -163,6 +163,8 @@ struct lcd_regs { ...@@ -163,6 +163,8 @@ struct lcd_regs {
#define LCD_SCLK(path) ((PATH_PN == path->id) ? LCD_CFG_SCLK_DIV :\ #define LCD_SCLK(path) ((PATH_PN == path->id) ? LCD_CFG_SCLK_DIV :\
((PATH_TV == path->id) ? LCD_TCLK_DIV : LCD_PN2_SCLK_DIV)) ((PATH_TV == path->id) ? LCD_TCLK_DIV : LCD_PN2_SCLK_DIV))
#define intf_rbswap_ctrl(id) ((id) ? (((id) & 1) ? LCD_TVIF_CTRL : \
PN2_IOPAD_CONTROL) : LCD_TOP_CTRL)
/* dither configure */ /* dither configure */
#ifdef CONFIG_CPU_PXA988 #ifdef CONFIG_CPU_PXA988
...@@ -615,6 +617,8 @@ struct lcd_regs { ...@@ -615,6 +617,8 @@ struct lcd_regs {
#define LCD_SPU_DUMB_CTRL 0x01B8 #define LCD_SPU_DUMB_CTRL 0x01B8
#define CFG_DUMBMODE(mode) ((mode)<<28) #define CFG_DUMBMODE(mode) ((mode)<<28)
#define CFG_DUMBMODE_MASK 0xF0000000 #define CFG_DUMBMODE_MASK 0xF0000000
#define CFG_INTFRBSWAP(mode) ((mode)<<24)
#define CFG_INTFRBSWAP_MASK 0x0F000000
#define CFG_LCDGPIO_O(data) ((data)<<20) #define CFG_LCDGPIO_O(data) ((data)<<20)
#define CFG_LCDGPIO_O_MASK 0x0FF00000 #define CFG_LCDGPIO_O_MASK 0x0FF00000
#define CFG_LCDGPIO_ENA(gpio) ((gpio)<<12) #define CFG_LCDGPIO_ENA(gpio) ((gpio)<<12)
...@@ -1427,6 +1431,7 @@ struct mmphw_path_plat { ...@@ -1427,6 +1431,7 @@ struct mmphw_path_plat {
struct mmp_path *path; struct mmp_path *path;
u32 path_config; u32 path_config;
u32 link_config; u32 link_config;
u32 dsi_rbswap;
}; };
/* mmp ctrl describes mmp controller related info */ /* mmp ctrl describes mmp controller related info */
......
...@@ -334,6 +334,7 @@ struct mmp_mach_path_config { ...@@ -334,6 +334,7 @@ struct mmp_mach_path_config {
int output_type; int output_type;
u32 path_config; u32 path_config;
u32 link_config; u32 link_config;
u32 dsi_rbswap;
}; };
struct mmp_mach_plat_info { struct mmp_mach_plat_info {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment