{
int win0_top = 0;
u32 mask, val;
- enum data_format win0_format = lcdc_dev->driver.win[0]->format;
- enum data_format win1_format = lcdc_dev->driver.win[1]->format;
+ enum data_format win0_format = lcdc_dev->driver.win[0]->area[0].format;
+ enum data_format win1_format = lcdc_dev->driver.win[1]->area[0].format;
int win0_alpha_en = ((win0_format == ARGB888) ||
(win0_format == ABGR888)) ? 1 : 0;
if (win->id == 0) {
mask = m_WIN0_EN | m_WIN0_FORMAT | m_WIN0_RB_SWAP;
val = v_WIN0_EN(win->state) |
- v_WIN0_FORMAT(win->fmt_cfg) |
- v_WIN0_RB_SWAP(win->swap_rb);
+ v_WIN0_FORMAT(win->area[0].fmt_cfg) |
+ v_WIN0_RB_SWAP(win->area[0].swap_rb);
lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
lcdc_writel(lcdc_dev, WIN0_SCL_FACTOR_YRGB,
v_X_SCL_FACTOR(win->scale_yrgb_x) |
} else if (win->id == 1) {
mask = m_WIN1_EN | m_WIN1_FORMAT | m_WIN1_RB_SWAP;
val = v_WIN1_EN(win->state) |
- v_WIN1_FORMAT(win->fmt_cfg) |
- v_WIN1_RB_SWAP(win->swap_rb);
+ v_WIN1_FORMAT(win->area[0].fmt_cfg) |
+ v_WIN1_RB_SWAP(win->area[0].swap_rb);
lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
lcdc_writel(lcdc_dev, WIN1_SCL_FACTOR_YRGB,
v_X_SCL_FACTOR(win->scale_yrgb_x) |
win->scale_yrgb_x = calscale(win->area[0].xact, win->post_cfg.xsize);
win->scale_yrgb_y = calscale(win->area[0].yact, win->post_cfg.ysize);
- switch (win->format) {
+ switch (win->area[0].format) {
case ARGB888:
- win->fmt_cfg = VOP_FORMAT_ARGB888;
- win->swap_rb = 0;
+ win->area[0].fmt_cfg = VOP_FORMAT_ARGB888;
+ win->area[0].swap_rb = 0;
break;
case XBGR888:
- win->fmt_cfg = VOP_FORMAT_ARGB888;
- win->swap_rb = 1;
+ win->area[0].fmt_cfg = VOP_FORMAT_ARGB888;
+ win->area[0].swap_rb = 1;
break;
case ABGR888:
- win->fmt_cfg = VOP_FORMAT_ARGB888;
- win->swap_rb = 1;
+ win->area[0].fmt_cfg = VOP_FORMAT_ARGB888;
+ win->area[0].swap_rb = 1;
break;
case RGB888:
- win->fmt_cfg = VOP_FORMAT_RGB888;
- win->swap_rb = 0;
+ win->area[0].fmt_cfg = VOP_FORMAT_RGB888;
+ win->area[0].swap_rb = 0;
break;
case RGB565:
- win->fmt_cfg = VOP_FORMAT_RGB565;
- win->swap_rb = 0;
+ win->area[0].fmt_cfg = VOP_FORMAT_RGB565;
+ win->area[0].swap_rb = 0;
break;
case YUV444:
if (win_id == 0) {
- win->fmt_cfg = VOP_FORMAT_YCBCR444;
+ win->area[0].fmt_cfg = VOP_FORMAT_YCBCR444;
win->scale_cbcr_x = calscale(win->area[0].xact,
win->post_cfg.xsize);
win->scale_cbcr_y = calscale(win->area[0].yact,
win->post_cfg.ysize);
- win->swap_rb = 0;
+ win->area[0].swap_rb = 0;
} else {
dev_err(lcdc_dev->driver.dev,
"%s:un supported format!\n",
break;
case YUV422:
if (win_id == 0) {
- win->fmt_cfg = VOP_FORMAT_YCBCR422;
+ win->area[0].fmt_cfg = VOP_FORMAT_YCBCR422;
win->scale_cbcr_x = calscale((win->area[0].xact / 2),
win->post_cfg.xsize);
win->scale_cbcr_y = calscale(win->area[0].yact,
win->post_cfg.ysize);
- win->swap_rb = 0;
+ win->area[0].swap_rb = 0;
} else {
dev_err(lcdc_dev->driver.dev,
"%s:un supported format!\n",
break;
case YUV420:
if (win_id == 0) {
- win->fmt_cfg = VOP_FORMAT_YCBCR420;
+ win->area[0].fmt_cfg = VOP_FORMAT_YCBCR420;
win->scale_cbcr_x = calscale(win->area[0].xact / 2,
win->post_cfg.xsize);
win->scale_cbcr_y = calscale(win->area[0].yact / 2,
win->post_cfg.ysize);
- win->swap_rb = 0;
+ win->area[0].swap_rb = 0;
} else {
dev_err(lcdc_dev->driver.dev,
"%s:un supported format!\n",
DBG(2, "lcdc%d>>%s\n"
">>format:%s>>>xact:%d>>yact:%d>>xsize:%d>>ysize:%d\n"
">>xvir:%d>>yvir:%d>>xpos:%d>>ypos:%d>>\n", lcdc_dev->id,
- __func__, get_format_string(win->format, fmt),
+ __func__, get_format_string(win->area[0].format, fmt),
win->area[0].xact, win->area[0].yact, win->post_cfg.xsize,
win->post_cfg.ysize, win->area[0].xvir, win->area[0].yvir,
win->post_cfg.xpos, win->post_cfg.ypos);
}
size = snprintf(buf, PAGE_SIZE, "win%d: %s\n", win_id,
- get_format_string(win->format, fmt));
+ get_format_string(win->area[0].format, fmt));
size += snprintf(buf + size, PAGE_SIZE - size,
" xact %d yact %d xvir %d yvir %d\n",
win->area[0].xact, win->area[0].yact,
{
int win0_top = 0;
u32 mask, val;
- enum data_format win0_format = lcdc_dev->driver.win[0]->format;
- enum data_format win1_format = lcdc_dev->driver.win[1]->format;
+ enum data_format win0_format = lcdc_dev->driver.win[0]->area[0].format;
+ enum data_format win1_format = lcdc_dev->driver.win[1]->area[0].format;
int win0_alpha_en = ((win0_format == ARGB888) ||
(win0_format == ABGR888)) ? 1 : 0;
struct rk_screen *screen = dev_drv->cur_screen;
if (dev_drv->overlay_mode == VOP_YUV_DOMAIN) {
- switch (win->fmt_cfg) {
+ switch (win->area[0].fmt_cfg) {
case VOP_FORMAT_ARGB888:
case VOP_FORMAT_RGB888:
case VOP_FORMAT_RGB565:
v_WIN1_CSC_MODE(win->csc_mode));
}
} else if (dev_drv->overlay_mode == VOP_RGB_DOMAIN) {
- switch (win->fmt_cfg) {
+ switch (win->area[0].fmt_cfg) {
case VOP_FORMAT_YCBCR420:
if (win->id == 0) {
win->csc_mode = VOP_Y2R_CSC_MPEG;
if (win->id == 0) {
mask = m_WIN0_EN | m_WIN0_FORMAT | m_WIN0_RB_SWAP;
val = v_WIN0_EN(win->state) |
- v_WIN0_FORMAT(win->fmt_cfg) |
- v_WIN0_RB_SWAP(win->swap_rb);
+ v_WIN0_FORMAT(win->area[0].fmt_cfg) |
+ v_WIN0_RB_SWAP(win->area[0].swap_rb);
lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
lcdc_writel(lcdc_dev, WIN0_SCL_FACTOR_YRGB,
v_X_SCL_FACTOR(win->scale_yrgb_x) |
} else if (win->id == 1) {
mask = m_WIN1_EN | m_WIN1_FORMAT | m_WIN1_RB_SWAP;
val = v_WIN1_EN(win->state) |
- v_WIN1_FORMAT(win->fmt_cfg) |
- v_WIN1_RB_SWAP(win->swap_rb);
+ v_WIN1_FORMAT(win->area[0].fmt_cfg) |
+ v_WIN1_RB_SWAP(win->area[0].swap_rb);
lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
/* rk312x unsupport win1 scale */
if (lcdc_dev->soc_type == VOP_RK3036) {
win->scale_yrgb_x = CalScale(win->area[0].xact, win->area[0].xsize);
win->scale_yrgb_y = CalScale(win->area[0].yact, win->area[0].ysize);
- switch (win->format) {
+ switch (win->area[0].format) {
case ARGB888:
- win->fmt_cfg = VOP_FORMAT_ARGB888;
- win->swap_rb = 0;
+ win->area[0].fmt_cfg = VOP_FORMAT_ARGB888;
+ win->area[0].swap_rb = 0;
break;
case XBGR888:
- win->fmt_cfg = VOP_FORMAT_ARGB888;
- win->swap_rb = 1;
+ win->area[0].fmt_cfg = VOP_FORMAT_ARGB888;
+ win->area[0].swap_rb = 1;
break;
case ABGR888:
- win->fmt_cfg = VOP_FORMAT_ARGB888;
- win->swap_rb = 1;
+ win->area[0].fmt_cfg = VOP_FORMAT_ARGB888;
+ win->area[0].swap_rb = 1;
break;
case RGB888:
- win->fmt_cfg = VOP_FORMAT_RGB888;
- win->swap_rb = 0;
+ win->area[0].fmt_cfg = VOP_FORMAT_RGB888;
+ win->area[0].swap_rb = 0;
break;
case RGB565:
- win->fmt_cfg = VOP_FORMAT_RGB565;
- win->swap_rb = 0;
+ win->area[0].fmt_cfg = VOP_FORMAT_RGB565;
+ win->area[0].swap_rb = 0;
break;
case YUV444:
if (win_id == 0) {
- win->fmt_cfg = VOP_FORMAT_YCBCR444;
+ win->area[0].fmt_cfg = VOP_FORMAT_YCBCR444;
win->scale_cbcr_x =
CalScale(win->area[0].xact, win->area[0].xsize);
win->scale_cbcr_y =
CalScale(win->area[0].yact, win->area[0].ysize);
- win->swap_rb = 0;
+ win->area[0].swap_rb = 0;
} else {
dev_err(lcdc_dev->driver.dev,
"%s:un supported format!\n", __func__);
break;
case YUV422:
if (win_id == 0) {
- win->fmt_cfg = VOP_FORMAT_YCBCR422;
+ win->area[0].fmt_cfg = VOP_FORMAT_YCBCR422;
win->scale_cbcr_x = CalScale((win->area[0].xact / 2),
win->area[0].xsize);
win->scale_cbcr_y =
CalScale(win->area[0].yact, win->area[0].ysize);
- win->swap_rb = 0;
+ win->area[0].swap_rb = 0;
} else {
dev_err(lcdc_dev->driver.dev,
"%s:un supported format!\n", __func__);
break;
case YUV420:
if (win_id == 0) {
- win->fmt_cfg = VOP_FORMAT_YCBCR420;
+ win->area[0].fmt_cfg = VOP_FORMAT_YCBCR420;
win->scale_cbcr_x =
CalScale(win->area[0].xact / 2, win->area[0].xsize);
win->scale_cbcr_y =
CalScale(win->area[0].yact / 2, win->area[0].ysize);
- win->swap_rb = 0;
+ win->area[0].swap_rb = 0;
} else {
dev_err(lcdc_dev->driver.dev,
"%s:un supported format!\n", __func__);
DBG(1,
"lcdc%d>>%s\n>>format:%s>>>xact:%d>>yact:%d>>xsize:%d>>ysize:%d\n"
">>xvir:%d>>yvir:%d>>xpos:%d>>ypos:%d>>\n", lcdc_dev->id, __func__,
- get_format_string(win->format, fmt), win->area[0].xact,
+ get_format_string(win->area[0].format, fmt), win->area[0].xact,
win->area[0].yact, win->area[0].xsize, win->area[0].ysize,
win->area[0].xvir, win->area[0].yvir, win->area[0].xpos,
win->area[0].ypos);
lcdc_dev->atv_layer_cnt = win0->state;
else
lcdc_dev->atv_layer_cnt = win1->state;
- win0->swap_rb = (value & m_WIN0_RB_SWAP) >> 15;
- win1->swap_rb = (value & m_WIN1_RB_SWAP) >> 19;
- win0->fmt_cfg = (value & m_WIN0_FORMAT) >> 3;
- win1->fmt_cfg = (value & m_WIN1_FORMAT) >> 6;
+ win0->area[0].swap_rb = (value & m_WIN0_RB_SWAP) >> 15;
+ win1->area[0].swap_rb = (value & m_WIN1_RB_SWAP) >> 19;
+ win0->area[0].fmt_cfg = (value & m_WIN0_FORMAT) >> 3;
+ win1->area[0].fmt_cfg = (value & m_WIN1_FORMAT) >> 6;
break;
case WIN0_SCL_FACTOR_YRGB:
win0->scale_yrgb_x = (value >> 0) & 0xffff;
{
int win0_top = 0;
u32 mask, val;
- enum data_format win0_format = lcdc_dev->driver.win[0]->format;
- enum data_format win1_format = lcdc_dev->driver.win[1]->format;
+ enum data_format win0_format = lcdc_dev->driver.win[0]->area[0].format;
+ enum data_format win1_format = lcdc_dev->driver.win[1]->area[0].format;
int win0_alpha_en = ((win0_format == ARGB888)
|| (win0_format == ABGR888)) ? 1 : 0;
m_WIN0_EN | m_WIN1_EN | m_WIN0_RB_SWAP |
m_WIN1_RB_SWAP,
v_WIN0_EN(win0->state) | v_WIN1_EN(win1->state) |
- v_WIN0_RB_SWAP(win0->swap_rb) |
- v_WIN1_RB_SWAP(win1->swap_rb));
+ v_WIN0_RB_SWAP(win0->area[0].swap_rb) |
+ v_WIN1_RB_SWAP(win1->area[0].swap_rb));
lcdc_writel(lcdc_dev, WIN0_SCL_FACTOR_YRGB,
v_X_SCL_FACTOR(win0->scale_yrgb_x) |
v_Y_SCL_FACTOR(win0->scale_yrgb_y));
lcdc_writel(lcdc_dev, WIN0_SCL_FACTOR_CBR,
v_X_SCL_FACTOR(win0->scale_cbcr_x) |
v_Y_SCL_FACTOR(win0->scale_cbcr_y));
- lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_WIN0_FORMAT, v_WIN0_FORMAT(win0->fmt_cfg));
+ lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_WIN0_FORMAT,
+ v_WIN0_FORMAT(win0->area[0].fmt_cfg));
lcdc_writel(lcdc_dev, WIN0_ACT_INFO, v_ACT_WIDTH(win0->area[0].xact) |
v_ACT_HEIGHT(win0->area[0].yact));
lcdc_writel(lcdc_dev, WIN0_DSP_ST, v_DSP_STX(win0->area[0].dsp_stx) |
v_DSP_HEIGHT(win1->area[0].ysize));
lcdc_writel(lcdc_dev, WIN1_DSP_ST, v_DSP_STX(win1->area[0].dsp_stx) |
v_DSP_STY(win1->area[0].dsp_sty));
- lcdc_msk_reg(lcdc_dev, WIN_VIR, m_WIN1_VIR, ((win1->area[0].y_vir_stride)&0x1fff)<<16);
+ lcdc_msk_reg(lcdc_dev, WIN_VIR, m_WIN1_VIR,
+ ((win1->area[0].y_vir_stride)&0x1fff)<<16);
lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_WIN1_FORMAT,
- v_WIN1_FORMAT(win1->fmt_cfg));
+ v_WIN1_FORMAT(win1->area[0].fmt_cfg));
lcdc_writel(lcdc_dev, WIN1_MST, win1->area[0].y_addr);
rk3188_lcdc_alpha_cfg(lcdc_dev);
lcdc_cfg_done(lcdc_dev);
ScaleYrgbX = CalScale(xact, win->area[0].xsize);
ScaleYrgbY = CalScale(yact, win->area[0].ysize);
- switch (win->format) {
+ switch (win->area[0].format) {
case ARGB888:
case XBGR888:
case ABGR888:
DBG(1, "lcdc%d>>%s\n>>format:%s>>>xact:%d>>yact:%d>>xsize:%d>>ysize:%d\n"
">>xvir:%d>>yvir:%d>>xpos:%d>>ypos:%d>>\n", lcdc_dev->id,
- __func__, get_format_string(win->format, fmt), xact,
+ __func__, get_format_string(win->area[0].format, fmt), xact,
yact, win->area[0].xsize, win->area[0].ysize, xvir, yvir, xpos, ypos);
spin_lock(&lcdc_dev->reg_lock);
win->scale_yrgb_y = ScaleYrgbY;
win->scale_cbcr_x = ScaleCbrX;
win->scale_cbcr_y = ScaleCbrY;
- win->fmt_cfg = fmt_cfg;
+ win->area[0].fmt_cfg = fmt_cfg;
win->area[0].dsp_stx = xpos;
win->area[0].dsp_sty = ypos;
- switch (win->format) {
+ switch (win->area[0].format) {
case XBGR888:
case ABGR888:
- win->swap_rb = 1;
+ win->area[0].swap_rb = 1;
break;
case ARGB888:
- win->swap_rb = 0;
+ win->area[0].swap_rb = 0;
break;
case RGB888:
- win->swap_rb = 0;
+ win->area[0].swap_rb = 0;
break;
case RGB565:
- win->swap_rb = 0;
+ win->area[0].swap_rb = 0;
break;
case YUV422:
case YUV420:
case YUV444:
- win->swap_rb = 0;
+ win->area[0].swap_rb = 0;
break;
default:
dev_err(lcdc_dev->driver.dev,
v_DSP_HEIGHT(win->area[0].ysize));
lcdc_msk_reg(lcdc_dev, WIN_VIR, m_WIN0_VIR, v_WIN0_VIR_VAL(win->area[0].y_vir_stride));
lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_WIN0_EN | m_WIN0_RB_SWAP,
- v_WIN0_EN(win->state) | v_WIN0_RB_SWAP(win->swap_rb));
+ v_WIN0_EN(win->state) |
+ v_WIN0_RB_SWAP(win->area[0].swap_rb));
lcdc_msk_reg(lcdc_dev, WIN0_COLOR_KEY, m_COLOR_KEY_EN, v_COLOR_KEY_EN(0));
}
spin_unlock(&lcdc_dev->reg_lock);
DBG(1, "lcdc%d>>%s>>format:%s>>>xact:%d>>yact:%d>>xsize:%d>>ysize:%d\n"
">>xvir:%d>>yvir:%d>>xpos:%d>>ypos:%d>>\n", lcdc_dev->id,
- __func__, get_format_string(win->format, fmt), xact, yact,
- win->area[0].xsize, win->area[0].ysize, xvir, yvir, xpos, ypos);
+ __func__, get_format_string(win->area[0].format, fmt),
+ xact, yact, win->area[0].xsize, win->area[0].ysize,
+ xvir, yvir, xpos, ypos);
spin_lock(&lcdc_dev->reg_lock);
win->area[0].dsp_stx = xpos;
win->area[0].dsp_sty = ypos;
- switch (win->format) {
+ switch (win->area[0].format) {
case XBGR888:
case ABGR888:
fmt_cfg = 0;
- win->swap_rb = 1;
+ win->area[0].swap_rb = 1;
break;
case ARGB888:
fmt_cfg = 0;
- win->swap_rb = 0;
+ win->area[0].swap_rb = 0;
break;
case RGB888:
fmt_cfg = 1;
- win->swap_rb = 0;
+ win->area[0].swap_rb = 0;
break;
case RGB565:
fmt_cfg = 2;
- win->swap_rb = 0;
+ win->area[0].swap_rb = 0;
break;
default:
dev_err(lcdc_dev->driver.dev,
"%s:un supported format!\n", __func__);
break;
}
- win->fmt_cfg = fmt_cfg;
+ win->area[0].fmt_cfg = fmt_cfg;
if (likely(lcdc_dev->clk_on)) {
lcdc_writel(lcdc_dev, WIN1_DSP_INFO,v_DSP_WIDTH(win->area[0].xsize) |
v_DSP_HEIGHT(win->area[0].ysize));
lcdc_writel(lcdc_dev, WIN1_DSP_ST,v_DSP_STX(xpos) | v_DSP_STY(ypos));
lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_WIN1_EN | m_WIN1_RB_SWAP,
- v_WIN1_EN(win->state) | v_WIN1_RB_SWAP(win->swap_rb));
+ v_WIN1_EN(win->state) |
+ v_WIN1_RB_SWAP(win->area[0].swap_rb));
lcdc_msk_reg(lcdc_dev, SYS_CTRL,m_WIN1_FORMAT, v_WIN1_FORMAT(fmt_cfg));
- lcdc_msk_reg(lcdc_dev, WIN_VIR, m_WIN1_VIR, ((win->area[0].y_vir_stride)&0x1fff)<<16);
+ lcdc_msk_reg(lcdc_dev, WIN_VIR, m_WIN1_VIR,
+ ((win->area[0].y_vir_stride)&0x1fff)<<16);
}
spin_unlock(&lcdc_dev->reg_lock);
break;
case WIN0_CTRL0:
win0->state = val & m_WIN0_EN;
- win0->fmt_cfg = (val & m_WIN0_DATA_FMT) >> 1;
+ win0->area[0].fmt_cfg =
+ (val & m_WIN0_DATA_FMT) >> 1;
win0->fmt_10 = (val & m_WIN0_FMT_10) >> 4;
- win0->format = win0->fmt_cfg;
+ win0->area[0].format = win0->area[0].fmt_cfg;
break;
case WIN0_VIR:
win0->area[0].y_vir_stride =
val & m_WIN0_VIR_STRIDE;
win0->area[0].uv_vir_stride =
(val & m_WIN0_VIR_STRIDE_UV) >> 16;
- if (win0->format == ARGB888)
+ if (win0->area[0].format == ARGB888)
win0->area[0].xvir =
win0->area[0].y_vir_stride;
- else if (win0->format == RGB888)
+ else if (win0->area[0].format == RGB888)
win0->area[0].xvir =
win0->area[0].y_vir_stride * 4 / 3;
- else if (win0->format == RGB565)
+ else if (win0->area[0].format == RGB565)
win0->area[0].xvir =
2 * win0->area[0].y_vir_stride;
else /* YUV */
/*backup reg config at uboot*/
lcdc_read_reg_defalut_cfg(lcdc_dev);
+ v = 0;
#ifndef CONFIG_RK_FPGA
if (lcdc_dev->pwr18 == true) {
v = 0x00010001; /*bit14: 1,1.8v;0,3.3v*/
u32 mask, val;
int ppixel_alpha,global_alpha;
u32 src_alpha_ctl,dst_alpha_ctl;
- ppixel_alpha = ((win->format == ARGB888)||(win->format == ABGR888)) ? 1 : 0;
+ ppixel_alpha = ((win->area[0].format == ARGB888) ||
+ (win->area[0].format == ABGR888)) ? 1 : 0;
global_alpha = (win->g_alpha_val == 0) ? 0 : 1;
alpha_config.src_global_alpha_val = win->g_alpha_val;
win->alpha_mode = AB_SRC_OVER;
if(win->state == 1){
mask = m_WIN0_EN | m_WIN0_DATA_FMT | m_WIN0_FMT_10 |
m_WIN0_LB_MODE | m_WIN0_RB_SWAP;
- val = v_WIN0_EN(win->state) | v_WIN0_DATA_FMT(win->fmt_cfg) |
+ val = v_WIN0_EN(win->state) |
+ v_WIN0_DATA_FMT(win->area[0].fmt_cfg) |
v_WIN0_FMT_10(win->fmt_10) |
v_WIN0_LB_MODE(win->win_lb_mode) |
- v_WIN0_RB_SWAP(win->swap_rb);
+ v_WIN0_RB_SWAP(win->area[0].swap_rb);
lcdc_msk_reg(lcdc_dev, WIN0_CTRL0+off, mask,val);
mask = m_WIN0_BIC_COE_SEL |
if(win->state == 1){
mask = m_WIN2_EN | m_WIN2_DATA_FMT | m_WIN2_RB_SWAP;
- val = v_WIN2_EN(1) | v_WIN2_DATA_FMT(win->fmt_cfg) |
- v_WIN2_RB_SWAP(win->swap_rb);
+ val = v_WIN2_EN(1) |
+ v_WIN2_DATA_FMT(win->area[0].fmt_cfg) |
+ v_WIN2_RB_SWAP(win->area[0].swap_rb);
lcdc_msk_reg(lcdc_dev,WIN2_CTRL0+off,mask,val);
/*area 0*/
if(win->area[0].state == 1){
}
spin_unlock(&lcdc_dev->reg_lock);
rk3288_lcdc_set_dclk(dev_drv);
- if (dev_drv->trsm_ops && dev_drv->trsm_ops->enable)
+ if (screen->type != SCREEN_HDMI && dev_drv->trsm_ops &&
+ dev_drv->trsm_ops->enable)
dev_drv->trsm_ops->enable();
if (screen->init)
screen->init();
yrgb_srcH = srcH;
yrgb_dstW = dstW;
yrgb_dstH = dstH;
- if ((yrgb_dstW >= yrgb_srcW*8) || (yrgb_dstH >= yrgb_srcH*8) ||
- (yrgb_dstW*8 <= yrgb_srcW) || (yrgb_dstH*8 <= yrgb_srcH)) {
+ if ((yrgb_dstW*8 <= yrgb_srcW) || (yrgb_dstH*8 <= yrgb_srcH)) {
pr_err("ERROR: yrgb scale exceed 8,"
"srcW=%d,srcH=%d,dstW=%d,dstH=%d\n",
yrgb_srcW,yrgb_srcH,yrgb_dstW,yrgb_dstH);
}
/*cbcr scl mode*/
- switch (win->format) {
+ switch (win->area[0].format) {
case YUV422:
case YUV422_A:
cbcr_srcW = srcW/2;
break;
}
if (yuv_fmt) {
- if ((cbcr_dstW >= cbcr_srcW*8) || (cbcr_dstH >= cbcr_srcH*8) ||
- (cbcr_dstW*8 <= cbcr_srcW)||(cbcr_dstH*8 <= cbcr_srcH)) {
+ if ((cbcr_dstW*8 <= cbcr_srcW) || (cbcr_dstH*8 <= cbcr_srcH)) {
pr_err("ERROR: cbcr scale exceed 8,"
"srcW=%d,srcH=%d,dstW=%d,dstH=%d\n",
cbcr_srcW,cbcr_srcH,cbcr_dstW,cbcr_dstH);
win->cbr_hor_scl_mode,win->cbr_ver_scl_mode);
/*line buffer mode*/
- if((win->format == YUV422) || (win->format == YUV420) || (win->format == YUV422_A) || (win->format == YUV420_A)){
- if(win->cbr_hor_scl_mode == SCALE_DOWN){
+ if ((win->area[0].format == YUV422) ||
+ (win->area[0].format == YUV420) ||
+ (win->area[0].format == YUV422_A) ||
+ (win->area[0].format == YUV420_A)) {
+ if (win->cbr_hor_scl_mode == SCALE_DOWN) {
if ((cbcr_dstW > 3840) || (cbcr_dstW == 0)) {
pr_err("ERROR cbcr_dstW = %d\n",cbcr_dstW);
- }else if(cbcr_dstW > 2560){
+ } else if (cbcr_dstW > 2560) {
win->win_lb_mode = LB_RGB_3840X2;
- }else if(cbcr_dstW > 1920){
- if(win->yrgb_hor_scl_mode == SCALE_DOWN){
+ } else if (cbcr_dstW > 1920) {
+ if (win->yrgb_hor_scl_mode == SCALE_DOWN) {
if(yrgb_dstW > 3840){
pr_err("ERROR yrgb_dst_width exceeds 3840\n");
}else if(yrgb_dstW > 2560){
}else{
pr_err("ERROR never run here!yrgb_dstW<1920 ==> cbcr_dstW>1920\n");
}
- }
- }else if(cbcr_dstW > 1280){
+ }
+ } else if (cbcr_dstW > 1280) {
win->win_lb_mode = LB_YUV_3840X5;
- }else{
+ } else {
win->win_lb_mode = LB_YUV_2560X8;
}
- } else { /*SCALE_UP or SCALE_NONE*/
+ } else { /*SCALE_UP or SCALE_NONE*/
if ((cbcr_srcW > 3840) || (cbcr_srcW == 0)) {
pr_err("ERROR cbcr_srcW = %d\n",cbcr_srcW);
}else if(cbcr_srcW > 2560){
struct rk_screen *screen, struct rk_lcdc_win *win)
{
u32 xact,yact,xvir, yvir,xpos, ypos;
- u8 fmt_cfg = 0;
+ u8 fmt_cfg = 0, swap_rb;
char fmt[9] = "NULL";
xpos = win->area[0].xpos + screen->mode.left_margin + screen->mode.hsync_len;
spin_lock(&lcdc_dev->reg_lock);
if(likely(lcdc_dev->clk_on)){
rk3288_lcdc_cal_scl_fac(win);/*fac,lb,gt2,gt4*/
- switch (win->format){
+ switch (win->area[0].format) {
case ARGB888:
fmt_cfg = 0;
- win->swap_rb = 0;
+ swap_rb = 0;
win->fmt_10 = 0;
break;
case XBGR888:
case ABGR888:
fmt_cfg = 0;
- win->swap_rb = 1;
+ swap_rb = 1;
win->fmt_10 = 0;
break;
case RGB888:
fmt_cfg = 1;
- win->swap_rb = 0;
+ swap_rb = 0;
win->fmt_10 = 0;
break;
case RGB565:
fmt_cfg = 2;
- win->swap_rb = 0;
+ swap_rb = 0;
win->fmt_10 = 0;
break;
case YUV422:
fmt_cfg = 5;
- win->swap_rb = 0;
+ swap_rb = 0;
win->fmt_10 = 0;
break;
case YUV420:
fmt_cfg = 4;
- win->swap_rb = 0;
+ swap_rb = 0;
win->fmt_10 = 0;
break;
case YUV444:
fmt_cfg = 6;
- win->swap_rb = 0;
+ swap_rb = 0;
win->fmt_10 = 0;
case YUV422_A:
fmt_cfg = 5;
- win->swap_rb = 0;
+ swap_rb = 0;
win->fmt_10 = 1;
break;
case YUV420_A:
fmt_cfg = 4;
- win->swap_rb = 0;
+ swap_rb = 0;
win->fmt_10 = 1;
break;
case YUV444_A:
fmt_cfg = 6;
- win->swap_rb = 0;
+ swap_rb = 0;
win->fmt_10 = 1;
break;
default:
__func__);
break;
}
- win->fmt_cfg = fmt_cfg;
+ win->area[0].fmt_cfg = fmt_cfg;
+ win->area[0].swap_rb = swap_rb;
win->area[0].dsp_stx = xpos;
win->area[0].dsp_sty = ypos;
xact = win->area[0].xact;
DBG(1, "lcdc%d>>%s\n>>format:%s>>>xact:%d>>yact:%d>>xsize:%d>>ysize:%d\n"
">>xvir:%d>>yvir:%d>>xpos:%d>>ypos:%d>>\n", lcdc_dev->id,
- __func__, get_format_string(win->format, fmt), xact,
+ __func__, get_format_string(win->area[0].format, fmt), xact,
yact, win->area[0].xsize, win->area[0].ysize, xvir, yvir, xpos, ypos);
return 0;
static int win1_set_par(struct lcdc_device *lcdc_dev,
struct rk_screen *screen, struct rk_lcdc_win *win)
{
- u32 xact,yact,xvir, yvir,xpos, ypos;
- u8 fmt_cfg = 0;
+ u32 xact, yact, xvir, yvir, xpos, ypos;
+ u8 fmt_cfg = 0, swap_rb;
char fmt[9] = "NULL";
xpos = win->area[0].xpos + screen->mode.left_margin + screen->mode.hsync_len;
ypos = win->area[0].ypos + screen->mode.upper_margin + screen->mode.vsync_len;
spin_lock(&lcdc_dev->reg_lock);
- if(likely(lcdc_dev->clk_on)){
+ if (likely(lcdc_dev->clk_on)) {
rk3288_lcdc_cal_scl_fac(win);/*fac,lb,gt2,gt4*/
- switch (win->format){
+ switch (win->area[0].format) {
case ARGB888:
fmt_cfg = 0;
- win->swap_rb = 0;
+ swap_rb = 0;
win->fmt_10 = 0;
break;
case XBGR888:
case ABGR888:
fmt_cfg = 0;
- win->swap_rb = 1;
+ swap_rb = 1;
win->fmt_10 = 0;
break;
case RGB888:
fmt_cfg = 1;
- win->swap_rb = 0;
+ swap_rb = 0;
win->fmt_10 = 0;
break;
case RGB565:
fmt_cfg = 2;
- win->swap_rb = 0;
+ swap_rb = 0;
win->fmt_10 = 0;
break;
case YUV422:
fmt_cfg = 5;
- win->swap_rb = 0;
+ swap_rb = 0;
win->fmt_10 = 0;
break;
case YUV420:
fmt_cfg = 4;
- win->swap_rb = 0;
+ swap_rb = 0;
win->fmt_10 = 0;
break;
case YUV444:
fmt_cfg = 6;
- win->swap_rb = 0;
+ swap_rb = 0;
win->fmt_10 = 0;
break;
case YUV422_A:
fmt_cfg = 5;
- win->swap_rb = 0;
+ swap_rb = 0;
win->fmt_10 = 1;
break;
case YUV420_A:
fmt_cfg = 4;
- win->swap_rb = 0;
+ swap_rb = 0;
win->fmt_10 = 1;
break;
case YUV444_A:
fmt_cfg = 6;
- win->swap_rb = 0;
+ swap_rb = 0;
win->fmt_10 = 1;
break;
default:
__func__);
break;
}
- win->fmt_cfg = fmt_cfg;
+ win->area[0].fmt_cfg = fmt_cfg;
+ win->area[0].swap_rb = swap_rb;
win->area[0].dsp_stx = xpos;
win->area[0].dsp_sty = ypos;
xact = win->area[0].xact;
DBG(1, "lcdc%d>>%s\n>>format:%s>>>xact:%d>>yact:%d>>xsize:%d>>ysize:%d\n"
">>xvir:%d>>yvir:%d>>xpos:%d>>ypos:%d>>\n", lcdc_dev->id,
- __func__, get_format_string(win->format, fmt), xact,
+ __func__, get_format_string(win->area[0].format, fmt), xact,
yact, win->area[0].xsize, win->area[0].ysize, xvir, yvir, xpos, ypos);
return 0;
struct rk_screen *screen, struct rk_lcdc_win *win)
{
int i;
- u8 fmt_cfg;
+ u8 fmt_cfg, swap_rb;
spin_lock(&lcdc_dev->reg_lock);
- if(likely(lcdc_dev->clk_on)){
- for(i=0;i<win->area_num;i++){
- switch (win->format){
+ if (likely(lcdc_dev->clk_on)) {
+ for (i = 0; i < win->area_num; i++) {
+ switch (win->area[i].format) {
case ARGB888:
fmt_cfg = 0;
- win->swap_rb = 0;
+ swap_rb = 0;
break;
case XBGR888:
case ABGR888:
fmt_cfg = 0;
- win->swap_rb = 1;
+ swap_rb = 1;
break;
case RGB888:
fmt_cfg = 1;
- win->swap_rb = 0;
+ swap_rb = 0;
break;
case RGB565:
fmt_cfg = 2;
- win->swap_rb = 0;
+ swap_rb = 0;
break;
default:
dev_err(lcdc_dev->driver.dev,
__func__);
break;
}
- win->fmt_cfg = fmt_cfg;
+ win->area[i].fmt_cfg = fmt_cfg;
+ win->area[i].swap_rb = swap_rb;
win->area[i].dsp_stx = win->area[i].xpos +
screen->mode.left_margin +
screen->mode.hsync_len;
{
int i;
- u8 fmt_cfg;
+ u8 fmt_cfg, swap_rb;
spin_lock(&lcdc_dev->reg_lock);
- if(likely(lcdc_dev->clk_on)){
- for(i=0;i<win->area_num;i++){
- switch (win->format){
+ if (likely(lcdc_dev->clk_on)) {
+ for (i = 0; i < win->area_num; i++) {
+ switch (win->area[i].format) {
case ARGB888:
fmt_cfg = 0;
- win->swap_rb = 0;
+ swap_rb = 0;
break;
case XBGR888:
case ABGR888:
fmt_cfg = 0;
- win->swap_rb = 1;
+ swap_rb = 1;
break;
case RGB888:
fmt_cfg = 1;
- win->swap_rb = 0;
+ swap_rb = 0;
break;
case RGB565:
fmt_cfg = 2;
- win->swap_rb = 0;
+ swap_rb = 0;
break;
default:
dev_err(lcdc_dev->driver.dev,
__func__);
break;
}
- win->fmt_cfg = fmt_cfg;
+ win->area[i].fmt_cfg = fmt_cfg;
+ win->area[i].swap_rb = swap_rb;
win->area[i].dsp_stx = win->area[i].xpos +
screen->mode.left_margin +
screen->mode.hsync_len;
#define HWC_MST (0x0158)
#define HWC_DSP_ST (0x015c)
-#define v_HWC_DSP_XST3(x) (((x)&0x1fff)<<0)
-#define v_HWC_DSP_YST3(x) (((x)&0x1fff)<<16)
-#define m_HWC_DSP_XST3 (0x1fff<<0)
-#define m_HWC_DSP_YST3 (0x1fff<<16)
+#define v_HWC_DSP_XST(x) (((x)&0x1fff)<<0)
+#define v_HWC_DSP_YST(x) (((x)&0x1fff)<<16)
+#define m_HWC_DSP_XST (0x1fff<<0)
+#define m_HWC_DSP_YST (0x1fff<<16)
#define HWC_SRC_ALPHA_CTRL (0x0160)
#define v_HWC_SRC_ALPHA_EN(x) (((x)&1)<<0)
struct lcdc_cabc_mode {
u32 pixel_num; /* pixel precent number */
- char stage_up; /* up stride */
- char stage_down; /* down stride */
+ u16 stage_up; /* up stride */
+ u16 stage_down; /* down stride */
};
static inline void lcdc_writel(struct lcdc_device *lcdc_dev,u32 offset,u32 v)
fb_id = 2;
else if (!strcmp(id, "fb3") && (dev_drv->lcdc_win_num > 3))
fb_id = 3;
+ else if (!strcmp(id, "fb4") && (dev_drv->lcdc_win_num > 4))
+ fb_id = 4;
+ else
+ dev_err(dev_drv->dev, "get_extend_fb_id info error\n");
return fb_id;
}
{
int format = 0;
- format = get_rga_format(src_win->format);
+ format = get_rga_format(src_win->area[0].format);
/* width and height must be even number */
if (format >= RK_FORMAT_YCbCr_422_SP &&
format <= RK_FORMAT_YCrCb_420_P) {
if (src_win->area[0].yvir < src_win->area[0].yact)
src_win->area[0].yvir = src_win->area[0].yact;
- format = get_rga_format(dst_win->format);
+ format = get_rga_format(dst_win->area[0].format);
if (format >= RK_FORMAT_YCbCr_422_SP &&
format <= RK_FORMAT_YCrCb_420_P) {
if ((dst_win->area[0].xact % 2) != 0)
Rga_Request.src.vir_w = src_win->area[0].xvir;
Rga_Request.src.vir_h = src_win->area[0].yvir;
- Rga_Request.src.format = get_rga_format(src_win->format);
+ Rga_Request.src.format = get_rga_format(src_win->area[0].format);
Rga_Request.src.act_w = src_win->area[0].xact;
Rga_Request.src.act_h = src_win->area[0].yact;
Rga_Request.src.x_offset = 0;
Rga_Request.dst.vir_w = dst_win->area[0].xvir;
Rga_Request.dst.vir_h = dst_win->area[0].yvir;
- Rga_Request.dst.format = get_rga_format(dst_win->format);
+ Rga_Request.dst.format = get_rga_format(dst_win->area[0].format);
Rga_Request.clip.xmin = 0;
Rga_Request.clip.xmax = dst_win->area[0].xact - 1;
return 0;
}
-static int rk_fb_win_rotate(struct rk_lcdc_win *dst_win,
- struct rk_lcdc_win *src_win,
- u16 rotate, int iommu_en)
+static int __maybe_unused rk_fb_win_rotate(struct rk_lcdc_win *dst_win,
+ struct rk_lcdc_win *src_win,
+ u16 rotate, int iommu_en)
{
#if defined(CONFIG_ROCKCHIP_RGA) || defined(CONFIG_ROCKCHIP_RGA2)
win_copy_by_rga(dst_win, src_win, rotate, iommu_en);
if (rk_fb->disp_mode != DUAL || ext_info == NULL)
return 0;
- switch (ext_win->format) {
+ switch (ext_win->area[0].format) {
case YUV422:
case YUV420:
case YUV444:
extend_win = extend_dev_drv->win[extend_win_id];
}
- pixel_width = rk_fb_pixel_width(win->format);
+ pixel_width = rk_fb_pixel_width(win->area[0].format);
vir_width_bit = pixel_width * xvir;
/* pixel_width = byte_num * 8 */
stride_32bit_1 = ALIGN_N_TIMES(vir_width_bit, 32) / 8;
stride_32bit_2 = ALIGN_N_TIMES(vir_width_bit * 2, 32) / 8;
- switch (win->format) {
+ switch (win->area[0].format) {
case YUV422:
case YUV422_A:
is_pic_yuv = 1;
video_data_to_mirroring(info, NULL);
#endif
dev_drv->ops->cfg_done(dev_drv);
+ /*msleep(1000);
+ dev_drv->ops->dump_reg(dev_drv);
+ while(1);*/
return 0;
}
}
ext_win->area[0].state = win->area[0].state;
+ ext_win->area[0].format = win->area[0].format;
ext_win->area_num = win->area_num;
- ext_win->format = win->format;
ext_win->fmt_10 = win->fmt_10;
ext_win->z_order = win->z_order;
ext_win->alpha_en = win->alpha_en;
ext_win->alpha_mode = win->alpha_mode;
ext_win->g_alpha_val = win->g_alpha_val;
+ ext_win->mirror_en = win->mirror_en;
+ ext_win->area[0].fbdc_en = win->area[0].fbdc_en;
+ ext_win->area[0].fbdc_cor_en = win->area[0].fbdc_cor_en;
+ ext_win->area[0].fbdc_data_format = win->area[0].fbdc_data_format;
- switch (ext_win->format) {
+ switch (ext_win->area[0].format) {
case YUV422:
case YUV420:
case YUV444:
ext_win->area[0].xvir = win->area[0].yact;
ext_win->area[0].yvir = win->area[0].xact;
- pixel_width = rk_fb_pixel_width(ext_win->format);
+ pixel_width = rk_fb_pixel_width(ext_win->area[0].format);
vir_width_bit = pixel_width * ext_win->area[0].xvir;
y_stride = ALIGN_N_TIMES(vir_width_bit, 32) / 8;
ext_win->area[0].y_vir_stride = y_stride >> 2;
rk_fb_get_prmry_screen(&primary_screen);
win->area_num = reg_win_data->area_num;
- win->format = reg_win_data->data_format;
win->id = reg_win_data->win_id;
win->z_order = reg_win_data->z_order;
if (reg_win_data->reg_area_data[0].smem_start > 0) {
win->state = 1;
win->area_num = reg_win_data->area_num;
- win->format = reg_win_data->data_format;
win->id = reg_win_data->win_id;
win->z_order = reg_win_data->z_order;
win->area[0].uv_vir_stride =
win->alpha_en = reg_win_data->alpha_en;
win->alpha_mode = reg_win_data->alpha_mode;
win->g_alpha_val = reg_win_data->g_alpha_val;
+ win->mirror_en = reg_win_data->mirror_en;
+ win->area[0].fbdc_en =
+ reg_win_data->reg_area_data[0].fbdc_en;
+ win->area[0].fbdc_cor_en =
+ reg_win_data->reg_area_data[0].fbdc_cor_en;
+ win->area[0].fbdc_data_format =
+ reg_win_data->reg_area_data[0].fbdc_data_format;
for (i = 0; i < RK_WIN_MAX_AREA; i++) {
if (reg_win_data->reg_area_data[i].smem_start > 0) {
+ win->area[i].format =
+ reg_win_data->reg_area_data[i].data_format;
if (inf->disp_policy != DISPLAY_POLICY_BOX)
win->area[i].ion_hdl =
reg_win_data->reg_area_data[i].ion_handle;
reg_win_data->reg_area_data[i].xvir;
win->area[i].yvir =
reg_win_data->reg_area_data[i].yvir;
+ win->area[i].xoff =
+ reg_win_data->reg_area_data[i].xoff;
+ win->area[i].yoff =
+ reg_win_data->reg_area_data[i].yoff;
win->area[i].y_offset =
reg_win_data->reg_area_data[i].y_offset;
win->area[i].y_vir_stride =
struct rk_lcdc_win *win;
ktime_t timestamp = dev_drv->vsync_info.timestamp;
struct rk_fb *rk_fb = platform_get_drvdata(fb_pdev);
+#if defined(CONFIG_RK_HDMI)
struct rk_lcdc_driver *ext_dev_drv;
struct rk_lcdc_win *ext_win;
+#endif
struct rk_fb_reg_win_data *win_data;
bool wait_for_vsync;
int count = 100;
win_data = rk_fb_get_win_data(regs, i);
if (win_data) {
if (rk_fb->disp_policy == DISPLAY_POLICY_BOX &&
- (win_data->data_format == YUV420 ||
- win_data->data_format == YUV420_A))
+ (win_data->reg_area_data[0].data_format == YUV420 ||
+ win_data->reg_area_data[0].data_format == YUV420_A))
continue;
mutex_lock(&dev_drv->win_config);
rk_fb_update_win(dev_drv, win, win_data);
dev_drv->ops->ovl_mgr(dev_drv, 0, 1);
if (rk_fb->disp_policy == DISPLAY_POLICY_BOX)
dev_drv->ops->cfg_done(dev_drv);
+#if defined(CONFIG_RK_HDMI)
if ((rk_fb->disp_mode == DUAL)
&& (hdmi_get_hotplug() == HDMI_HPD_ACTIVED)
&& hdmi_switch_complete) {
ext_dev_drv->ops->cfg_done(ext_dev_drv);
}
ext_win_exit:
+#endif
dev_drv->ops->cfg_done(dev_drv);
do {
timeout = wait_event_interruptible_timeout(dev_drv->vsync_info.wait,
ktime_compare(dev_drv->vsync_info.timestamp, timestamp) > 0,
msecs_to_jiffies(25));
+#if defined(CONFIG_RK_HDMI)
if ((rk_fb->disp_mode == DUAL) &&
(hdmi_get_hotplug() == HDMI_HPD_ACTIVED) &&
hdmi_switch_complete) {
ktime_compare(ext_dev_drv->vsync_info.timestamp, timestamp) > 0,
msecs_to_jiffies(25));
}
-
+#endif
dev_drv->ops->get_dsp_addr(dev_drv, dsp_addr);
wait_for_vsync = false;
for (i = 0; i < dev_drv->lcdc_win_num; i++) {
if (dev_drv->win[i]->state == 1) {
if (rk_fb->disp_policy == DISPLAY_POLICY_BOX &&
- (dev_drv->win[i]->format == YUV420 ||
- dev_drv->win[i]->format == YUV420_A ||
+ (dev_drv->win[i]->area[0].format == YUV420 ||
+ dev_drv->win[i]->area[0].format == YUV420_A ||
!strcmp(dev_drv->win[i]->name, "hwc"))) {
continue;
} else {
struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv;
struct rk_screen *screen = dev_drv->cur_screen;
struct rk_screen primary_screen;
- struct fb_info *fbi = rk_fb->fb[0];
+ struct fb_info *fbi;
int i, ion_fd, acq_fence_fd;
u32 xvir, yvir;
u32 xoffset, yoffset;
ion_import_dma_buf(rk_fb->ion_client,
ion_fd);
if (IS_ERR(hdl)) {
- pr_info
- ("%s: Could not import handle: %d\n",
- __func__, (int)hdl);
+ pr_info("%s: Could not import handle:"
+ " %ld\n", __func__, (long)hdl);
/*return -EINVAL; */
break;
}
sync_fence_fdget(win_par->area_par[i].acq_fence_fd);
}
}
- fb_data_fmt = rk_fb_data_fmt(win_par->data_format, 0);
- reg_win_data->data_format = fb_data_fmt;
- pixel_width = rk_fb_pixel_width(fb_data_fmt);
-
- ppixel_a = ((fb_data_fmt == ARGB888) ||
- (fb_data_fmt == ABGR888)) ? 1 : 0;
- global_a = (win_par->g_alpha_val == 0) ? 0 : 1;
- reg_win_data->alpha_en = ppixel_a | global_a;
- reg_win_data->g_alpha_val = win_par->g_alpha_val;
- reg_win_data->alpha_mode = win_par->alpha_mode;
if (reg_win_data->reg_area_data[0].smem_start > 0) {
reg_win_data->z_order = win_par->z_order;
reg_win_data->win_id = win_par->win_id;
}
rk_fb_get_prmry_screen(&primary_screen);
+ reg_win_data->mirror_en = win_par->mirror_en;
+ reg_win_data->reg_area_data[0].fbdc_en = win_par->area_par[0].fbdc_en;
+ reg_win_data->reg_area_data[0].fbdc_cor_en =
+ win_par->area_par[0].fbdc_cor_en;
+ reg_win_data->reg_area_data[0].fbdc_data_format =
+ win_par->area_par[0].fbdc_data_format;
for (i = 0; i < reg_win_data->area_num; i++) {
if (rk_fb->disp_policy == DISPLAY_POLICY_BOX)
rk_fb_check_config_var(&win_par->area_par[i], screen);
else
rk_fb_check_config_var(&win_par->area_par[i], &primary_screen);
+
+ fb_data_fmt = rk_fb_data_fmt(win_par->area_par[i].data_format, 0);
+ reg_win_data->reg_area_data[i].data_format = fb_data_fmt;
+ pixel_width = rk_fb_pixel_width(fb_data_fmt);
+
+ ppixel_a |= ((fb_data_fmt == ARGB888) ||
+ (fb_data_fmt == ABGR888)) ? 1 : 0;
/* visiable pos in panel */
reg_win_data->reg_area_data[i].xpos = win_par->area_par[i].xpos;
reg_win_data->reg_area_data[i].ypos = win_par->area_par[i].ypos;
xoffset = win_par->area_par[i].x_offset; /* buf offset */
yoffset = win_par->area_par[i].y_offset;
+ reg_win_data->reg_area_data[i].xoff = xoffset;
+ reg_win_data->reg_area_data[i].yoff = yoffset;
+
xvir = win_par->area_par[i].xvir;
reg_win_data->reg_area_data[i].xvir = xvir;
yvir = win_par->area_par[i].yvir;
* reg_win_data->reg_area_data[i].y_offset =
* yoffset*stride+xoffset*pixel_width/8;
*/
- if (screen->y_mirror == 1) {
+ if ((screen->y_mirror == 1) || (reg_win_data->mirror_en)) {
if (screen->interlace == 1) {
reg_win_data->reg_area_data[i].y_offset =
yoffset * stride * 2 +
}
}
}
+
+ global_a = (win_par->g_alpha_val == 0) ? 0 : 1;
+ reg_win_data->alpha_en = ppixel_a | global_a;
+ reg_win_data->g_alpha_val = win_par->g_alpha_val;
+ reg_win_data->alpha_mode = win_par->alpha_mode;
+
switch (fb_data_fmt) {
case YUV422:
case YUV422_A:
reg_win_data->reg_area_data[0].cbr_start =
reg_win_data->reg_area_data[0].smem_start + xvir * yvir;
reg_win_data->reg_area_data[0].uv_vir_stride = uv_stride >> 2;
- if (screen->y_mirror == 1) {
+ if ((screen->y_mirror == 1) || (reg_win_data->mirror_en)) {
if (screen->interlace == 1) {
reg_win_data->reg_area_data[0].c_offset =
uv_y_off * uv_stride * 2 +
win = dev_drv->win[win_id];
/* only read the current frame buffer */
- if (win->format == RGB565) {
+ if (win->area[0].format == RGB565) {
total_size = win->area[0].y_vir_stride * win->area[0].yact << 1;
- } else if (win->format == YUV420) {
+ } else if (win->area[0].format == YUV420) {
total_size =
(win->area[0].y_vir_stride * win->area[0].yact * 6);
} else {
win = dev_drv->win[win_id];
/* write the current frame buffer */
- if (win->format == RGB565)
+ if (win->area[0].format == RGB565)
total_size = win->area[0].xact * win->area[0].yact << 1;
else
total_size = win->area[0].xact * win->area[0].yact << 2;
}
}
- win->format = fb_data_fmt;
+ win->area[0].format = fb_data_fmt;
win->area[0].y_vir_stride = stride >> 2;
win->area[0].uv_vir_stride = uv_stride >> 2;
win->area[0].xpos = xpos;
win->area[0].yact = var->yres;
win->area[0].xvir = var->xres_virtual; /* virtual resolution stride --->LCDC_WINx_VIR */
win->area[0].yvir = var->yres_virtual;
+ win->area[0].xoff = xoffset;
+ win->area[0].yoff = yoffset;
win->area_num = 1;
win->alpha_mode = 4; /* AB_SRC_OVER; */
- win->alpha_en = ((win->format == ARGB888) ||
- (win->format == ABGR888)) ? 1 : 0;
+ win->alpha_en = ((win->area[0].format == ARGB888) ||
+ (win->area[0].format == ABGR888)) ? 1 : 0;
win->g_alpha_val = 0;
if (rk_fb->disp_policy == DISPLAY_POLICY_BOX &&
- (win->format == YUV420 || win->format == YUV420_A))
+ (win->area[0].format == YUV420 || win->area[0].format == YUV420_A))
win->state = 1;
if (rk_fb->disp_mode == DUAL) {
if (extend_win->state && hdmi_switch_complete) {
dev_drv->ops->dsp_black(dev_drv, 1);
if (dev_drv->ops->set_screen_scaler)
dev_drv->ops->set_screen_scaler(dev_drv, dev_drv->screen0, 0);
+ } else if ((rk_fb->disp_mode == NO_DUAL) && (enable)) {
+ if (dev_drv->ops->dsp_black)
+ dev_drv->ops->dsp_black(dev_drv, 1);
}
if (!enable) {
return 0;
/* if used one lcdc to dual disp, no need to close win */
- if (rk_fb->disp_mode == ONE_DUAL) {
+ if ((rk_fb->disp_mode == ONE_DUAL) ||
+ (rk_fb->disp_mode == NO_DUAL)) {
dev_drv->cur_screen = dev_drv->screen0;
dev_drv->ops->load_screen(dev_drv, 1);
info->var.activate |= FB_ACTIVATE_FORCE;
if (rk_fb->disp_mode == DUAL) {
rk_fb_update_ext_info(info, pmy_info, 1);
- } else if (rk_fb->disp_mode == ONE_DUAL) {
+ } else if ((rk_fb->disp_mode == ONE_DUAL) ||
+ (rk_fb->disp_mode == NO_DUAL)) {
info->var.grayscale &= 0xff;
info->var.grayscale |=
(dev_drv->cur_screen->xsize << 8) +
for (j = 0; j < RK_WIN_MAX_AREA; j++) {
win_data = &front_regs->reg_win_data[i];
if (dump_win(rk_fb, &win_data->reg_area_data[j],
- win_data->data_format, i, j, is_img))
+ win_data->reg_area_data[i].data_format,i,
+ j, is_img))
continue;
}
}
#define OUT_CCIR656 6
#define OUT_S888 8
#define OUT_S888DUMY 12
+#define OUT_YUV_420 14
#define OUT_P16BPP4 24
#define OUT_D888_P666 0x21 //18bit screen,connect to lcdc D2~D7, D10~D15, D18~D23
#define OUT_D888_P565 0x22
#define FB0_WIN0_FB1_WIN2_FB2_WIN1 120
#define FB0_WIN0_FB1_WIN1_FB2_WIN2 210
#define FB0_WIN1_FB1_WIN0_FB2_WIN2 201
-#define FB0_WIN0_FB1_WIN1_FB2_WIN2_FB3_WIN3 3210
+#define FB0_WIN0_FB1_WIN1_FB2_WIN2_FB3_WIN3 3210
+#define FB0_WIN0_FB1_WIN1_FB2_WIN2_FB3_WIN3_FB4_HWC 43210
#define DISPLAY_POLICY_SDK 0
#define DISPLAY_POLICY_BOX 1
#include <linux/kthread.h>
-#define RK30_MAX_LCDC_SUPPORT 4
-#define RK30_MAX_LAYER_SUPPORT 4
-#define RK_MAX_FB_SUPPORT 4
+#define RK30_MAX_LCDC_SUPPORT 2
+#define RK30_MAX_LAYER_SUPPORT 5
+#define RK_MAX_FB_SUPPORT 5
#define RK_WIN_MAX_AREA 4
-#define RK_MAX_BUF_NUM 10
+#define RK_MAX_BUF_NUM 11
#define FB0_IOCTL_STOP_TIMER_FLUSH 0x6001
#define FB0_IOCTL_SET_PANEL 0x6002
#define OUT_CCIR656 6
#define OUT_S888 8
#define OUT_S888DUMY 12
+#define OUT_YUV_420 14
#define OUT_RGB_AAA 15
#define OUT_P16BPP4 24
#define OUT_D888_P666 0x21 //18bit screen,connect to lcdc D2~D7, D10~D15, D18~D23
TRSP_INVAL
} TRSP_MODE;
-struct rk_lcdc_post_cfg{
+struct rk_lcdc_post_cfg {
u32 xpos;
u32 ypos;
u32 xsize;
u16 cos_hue;
};
-struct rk_lcdc_win_area{
+struct rk_lcdc_win_area {
bool state;
+ enum data_format format;
+ u8 fmt_cfg;
+ u8 swap_rb;
u32 y_offset; /*yuv/rgb offset -->LCDC_WINx_YRGB_MSTx*/
u32 c_offset; /*cb cr offset--->LCDC_WINx_CBR_MSTx*/
- u32 xpos; /*start point in panel --->LCDC_WINx_DSP_ST*/
- u32 ypos;
+ u16 xpos; /*start point in panel --->LCDC_WINx_DSP_ST*/
+ u16 ypos;
u16 xsize; /* display window width/height -->LCDC_WINx_DSP_INFO*/
u16 ysize;
u16 xact; /*origin display window size -->LCDC_WINx_ACT_INFO*/
u16 yact;
u16 xvir; /*virtual width/height -->LCDC_WINx_VIR*/
u16 yvir;
+ u16 xoff; /*mem offset*/
+ u16 yoff;
unsigned long smem_start;
unsigned long cbr_start; /*Cbr memory start address*/
#if defined(CONFIG_ION_ROCKCHIP)
int dma_buf_fd;
struct dma_buf *dma_buf;
#endif
- u32 dsp_stx;
- u32 dsp_sty;
- u32 y_vir_stride;
- u32 uv_vir_stride;
+ u16 dsp_stx;
+ u16 dsp_sty;
+ u16 y_vir_stride;
+ u16 uv_vir_stride;
u32 y_addr;
u32 uv_addr;
+ u8 fbdc_en;
+ u8 fbdc_cor_en;
+ u8 fbdc_data_format;
+ u8 fbdc_dsp_width_ratio;
+ u8 fbdc_fmt_cfg;
+ u16 fbdc_mb_vir_width;
+ u16 fbdc_mb_vir_height;
+ u16 fbdc_mb_width;
+ u16 fbdc_mb_height;
+ u16 fbdc_mb_xst;
+ u16 fbdc_mb_yst;
+ u16 fbdc_num_tiles;
+ u16 fbdc_cmp_index_init;
};
bool state; /*on or off*/
bool last_state; /*on or off*/
u32 pseudo_pal[16];
- enum data_format format;
int z_order; /*win sel layer*/
- u8 fmt_cfg;
- u8 fmt_10;;
- u8 swap_rb;
+ u8 fmt_10;
u32 reserved;
u32 area_num;
u32 scale_yrgb_x;
u8 vsd_cbr_gt2;
u8 alpha_en;
- u32 alpha_mode;
- u32 g_alpha_val;
+ u8 alpha_mode;
+ u16 g_alpha_val;
+ u8 mirror_en;
u32 color_key_val;
u8 csc_mode;
};
struct rk_fb_area_par {
- int ion_fd;
+ u8 data_format; /*layer data fmt*/
+ short ion_fd;
unsigned long phy_addr;
- int acq_fence_fd;
- u32 x_offset;
- u32 y_offset;
- u32 xpos; /*start point in panel --->LCDC_WINx_DSP_ST*/
- u32 ypos;
- u32 xsize; /* display window width/height -->LCDC_WINx_DSP_INFO*/
- u32 ysize;
- u32 xact; /*origin display window size -->LCDC_WINx_ACT_INFO*/
- u32 yact;
- u32 xvir; /*virtual width/height -->LCDC_WINx_VIR*/
- u32 yvir;
+ short acq_fence_fd;
+ u16 x_offset;
+ u16 y_offset;
+ u16 xpos; /*start point in panel --->LCDC_WINx_DSP_ST*/
+ u16 ypos;
+ u16 xsize; /* display window width/height -->LCDC_WINx_DSP_INFO*/
+ u16 ysize;
+ u16 xact; /*origin display window size -->LCDC_WINx_ACT_INFO*/
+ u16 yact;
+ u16 xvir; /*virtual width/height -->LCDC_WINx_VIR*/
+ u16 yvir;
+ u8 fbdc_en;
+ u8 fbdc_cor_en;
+ u8 fbdc_data_format;
+ u16 reserved0;
+ u32 reserved1;
};
struct rk_fb_win_par {
- u8 data_format; /*layer data fmt*/
- u8 win_id;
- u8 z_order; /*win sel layer*/
+ u8 win_id;
+ u8 z_order; /*win sel layer*/
+ u8 alpha_mode;
+ u16 g_alpha_val;
+ u8 mirror_en;
struct rk_fb_area_par area_par[RK_WIN_MAX_AREA];
- u32 alpha_mode;
- u32 g_alpha_val;
+ u32 reserved0;
};
struct rk_fb_win_cfg_data {
- int ret_fence_fd;
- int rel_fence_fd[RK_MAX_BUF_NUM];
+ u8 wait_fs;
+ short ret_fence_fd;
+ short rel_fence_fd[RK_MAX_BUF_NUM];
struct rk_fb_win_par win_par[RK30_MAX_LAYER_SUPPORT];
struct rk_lcdc_post_cfg post_cfg;
- u8 wait_fs;
- //u8 fence_begin;
};
struct rk_fb_reg_area_data {
struct sync_fence *acq_fence;
+ u8 data_format; /*layer data fmt*/
u8 index_buf; /*judge if the buffer is index*/
u32 y_offset; /*yuv/rgb offset -->LCDC_WINx_YRGB_MSTx*/
u32 c_offset; /*cb cr offset--->LCDC_WINx_CBR_MSTx*/
u32 y_vir_stride;
u32 uv_vir_stride;
- u32 xpos; /*start point in panel --->LCDC_WINx_DSP_ST*/
- u32 ypos;
+ u16 xpos; /*start point in panel --->LCDC_WINx_DSP_ST*/
+ u16 ypos;
u16 xsize; /* display window width/height -->LCDC_WINx_DSP_INFO*/
u16 ysize;
u16 xact; /*origin display window size -->LCDC_WINx_ACT_INFO*/
u16 yact;
u16 xvir; /*virtual width/height -->LCDC_WINx_VIR*/
u16 yvir;
+ u16 xoff; /*mem offset*/
+ u16 yoff;
unsigned long smem_start;
unsigned long cbr_start; /*Cbr memory start address*/
u32 line_length;
struct dma_buf_attachment *attachment;
struct sg_table *sg_table;
dma_addr_t dma_addr;
-#endif
+#endif
+ u8 fbdc_en;
+ u8 fbdc_cor_en;
+ u8 fbdc_data_format;
};
struct rk_fb_reg_win_data {
- u8 data_format; /*layer data fmt*/
u8 win_id;
u8 z_order; /*win sel layer*/
u32 area_num; /*maybe two region have the same dma buff,*/
u32 area_buf_num; /*so area_num maybe not equal to area_buf_num*/
u8 alpha_en;
- u32 alpha_mode;
- u32 g_alpha_val;
- u32 color_key_val;
+ u8 alpha_mode;
+ u16 g_alpha_val;
+ u8 mirror_en;
struct rk_fb_reg_area_data reg_area_data[RK_WIN_MAX_AREA];
};
struct rk_fb_reg_data {
struct list_head list;
- int win_num;
- int buf_num;
- int acq_num;
+ int win_num;
+ int buf_num;
+ int acq_num;
struct rk_fb_reg_win_data reg_win_data[RK30_MAX_LAYER_SUPPORT];
struct rk_lcdc_post_cfg post_cfg;
- //struct sync_fence *acq_fence[RK_MAX_BUF_NUM];
- //int fence_wait_begin;
};
struct rk_lcdc_driver {
char name[6];
- int id;
- int prop;
+ int id;
+ int prop;
struct device *dev;
struct rk_lcdc_win *win[RK_MAX_FB_SUPPORT];
u16 overlay_mode;
u16 output_color;
- u16 fb_win_map;
+ u16 fb_win_map;
char fb0_win_id;
char fb1_win_id;
char fb2_win_id;
char fb3_win_id;
+ char fb4_win_id;
char mmu_dts_name[40];
struct device *mmu_dev;