From 1b05238eb34b6419e23aa62d39ee8d6b9dbdfee0 Mon Sep 17 00:00:00 2001 From: libing Date: Sat, 8 Mar 2014 14:30:22 +0800 Subject: [PATCH] Revert "rk fb: new framework test ok at rk3188" This reverts commit fe817a682b4cf0e477b945bce9565e44f476370c. --- drivers/video/rockchip/lcdc/rk3188_lcdc.c | 422 +++++------ drivers/video/rockchip/rk_fb.c | 848 +++------------------- drivers/video/rockchip/rkfb_sysfs.c | 82 --- include/linux/rk_fb.h | 195 +---- include/linux/rk_screen.h | 6 - 5 files changed, 305 insertions(+), 1248 deletions(-) mode change 100755 => 100644 drivers/video/rockchip/rkfb_sysfs.c diff --git a/drivers/video/rockchip/lcdc/rk3188_lcdc.c b/drivers/video/rockchip/lcdc/rk3188_lcdc.c index 8d26fe0475c8..7d24755f3a4e 100755 --- a/drivers/video/rockchip/lcdc/rk3188_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk3188_lcdc.c @@ -189,37 +189,37 @@ static void rk3188_lcdc_read_reg_defalut_cfg(struct lcdc_device win0->scale_cbcr_y = (value >> 16) & 0xffff; break; case WIN0_ACT_INFO: - win0->area[0].xact = (((value >> 0) & 0x1fff) + 1); - win0->area[0].yact = (((value >> 16) & 0x1fff) + 1); + win0->xact = (((value >> 0) & 0x1fff) + 1); + win0->yact = (((value >> 16) & 0x1fff) + 1); break; case WIN0_DSP_ST: - win0->area[0].dsp_stx = (value >> 0) & 0xfff; - win0->area[0].dsp_sty = (value >> 16) & 0xfff; + win0->dsp_stx = (value >> 0) & 0xfff; + win0->dsp_sty = (value >> 16) & 0xfff; break; case WIN0_DSP_INFO: - win0->area[0].xsize = (((value >> 0) & 0x7ff) + 1); - win0->area[0].ysize = (((value >> 16) & 0x7ff) + 1); + win0->xsize = (((value >> 0) & 0x7ff) + 1); + win0->ysize = (((value >> 16) & 0x7ff) + 1); break; case WIN_VIR: - win0->area[0].y_vir_stride = (value >> 0) & 0x1fff; - win1->area[0].y_vir_stride = (value) & 0x1fff0000; + win0->vir_stride = (value >> 0) & 0x1fff; + win1->vir_stride = (value) & 0x1fff0000; break; case WIN0_YRGB_MST0: - win0->area[0].y_addr = value >> 0; + win0->y_addr = value >> 0; break; case WIN0_CBR_MST0: - win0->area[0].uv_addr = value >> 0; + win0->uv_addr = value >> 0; break; case WIN1_DSP_INFO: - win1->area[0].xsize = (((value >> 0) & 0x7ff) + 1); - win1->area[0].ysize = (((value >> 16) & 0x7ff) + 1); + win1->xsize = (((value >> 0) & 0x7ff) + 1); + win1->ysize = (((value >> 16) & 0x7ff) + 1); break; case WIN1_DSP_ST: - win1->area[0].dsp_stx = (value >> 0) & 0xfff; - win1->area[0].dsp_sty = (value >> 16) & 0xfff; + win1->dsp_stx = (value >> 0) & 0xfff; + win1->dsp_sty = (value >> 16) & 0xfff; break; case WIN1_MST: - win1->area[0].y_addr = value >> 0; + win1->y_addr = value >> 0; break; default: DBG(2, "%s:uncare reg\n", __func__); @@ -337,6 +337,7 @@ static int rk3188_lcdc_alpha_cfg(struct lcdc_device *lcdc_dev) u32 *_pv = (u32 *) lcdc_dev->regsbak; _pv += (DSP_CTRL0 >> 2); win0_top = ((*_pv) & (m_WIN0_TOP)) >> 8; + if (win0_top && (lcdc_dev->atv_layer_cnt >= 2) && (win0_alpha_en)) { lcdc_msk_reg(lcdc_dev, ALPHA_CTRL, m_WIN0_ALPHA_EN | m_WIN1_ALPHA_EN, v_WIN0_ALPHA_EN(1) | @@ -370,6 +371,7 @@ static int rk3188_lcdc_reg_update(struct rk_lcdc_driver *dev_drv) struct rk_lcdc_win *win1 = lcdc_dev->driver.win[1]; int timeout; unsigned long flags; + spin_lock(&lcdc_dev->reg_lock); if (likely(lcdc_dev->clk_on)) { lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_LCDC_STANDBY, @@ -387,32 +389,30 @@ static int rk3188_lcdc_reg_update(struct rk_lcdc_driver *dev_drv) 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_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_STY(win0->area[0].dsp_sty)); - lcdc_writel(lcdc_dev, WIN0_DSP_INFO, v_DSP_WIDTH(win0->area[0].xsize) | - v_DSP_HEIGHT(win0->area[0].ysize)); + lcdc_writel(lcdc_dev, WIN0_ACT_INFO, v_ACT_WIDTH(win0->xact) | + v_ACT_HEIGHT(win0->yact)); + lcdc_writel(lcdc_dev, WIN0_DSP_ST, v_DSP_STX(win0->dsp_stx) | + v_DSP_STY(win0->dsp_sty)); + lcdc_writel(lcdc_dev, WIN0_DSP_INFO, v_DSP_WIDTH(win0->xsize) | + v_DSP_HEIGHT(win0->ysize)); lcdc_msk_reg(lcdc_dev, WIN_VIR, m_WIN0_VIR, - v_WIN0_VIR_VAL(win0->area[0].y_vir_stride)); - lcdc_writel(lcdc_dev, WIN0_YRGB_MST0, win0->area[0].y_addr); - lcdc_writel(lcdc_dev, WIN0_CBR_MST0, win0->area[0].uv_addr); - lcdc_writel(lcdc_dev, WIN1_DSP_INFO, v_DSP_WIDTH(win1->area[0].xsize) | - 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); + v_WIN0_VIR_VAL(win0->vir_stride)); + lcdc_writel(lcdc_dev, WIN0_YRGB_MST0, win0->y_addr); + lcdc_writel(lcdc_dev, WIN0_CBR_MST0, win0->uv_addr); + lcdc_writel(lcdc_dev, WIN1_DSP_INFO, v_DSP_WIDTH(win1->xsize) | + v_DSP_HEIGHT(win1->ysize)); + lcdc_writel(lcdc_dev, WIN1_DSP_ST, v_DSP_STX(win1->dsp_stx) | + v_DSP_STY(win1->dsp_sty)); + lcdc_msk_reg(lcdc_dev, WIN_VIR, m_WIN1_VIR, win1->vir_stride); lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_WIN1_FORMAT, v_WIN1_FORMAT(win1->fmt_cfg)); - lcdc_writel(lcdc_dev, WIN1_MST, win1->area[0].y_addr); - //printk("rk3188_lcdc_reg_update,win_num=%d\n",dev_drv->atv_layer_cnt); + lcdc_writel(lcdc_dev, WIN1_MST, win1->y_addr); rk3188_lcdc_alpha_cfg(lcdc_dev); lcdc_cfg_done(lcdc_dev); } spin_unlock(&lcdc_dev->reg_lock); - //if (dev_drv->wait_fs) { - if (0) { + if (dev_drv->wait_fs) { spin_lock_irqsave(&dev_drv->cpl_lock, flags); init_completion(&dev_drv->frame_done); spin_unlock_irqrestore(&dev_drv->cpl_lock, flags); @@ -647,148 +647,6 @@ static int rk3188_lcdc_open(struct rk_lcdc_driver *dev_drv, int win_id, return 0; } -static int win0_display(struct lcdc_device *lcdc_dev, - struct rk_lcdc_win *win) -{ - u32 y_addr; - u32 uv_addr; - y_addr = win->area[0].smem_start+win->area[0].y_offset;//win->smem_start + win->y_offset; - uv_addr = win->area[0].cbr_start + win->area[0].c_offset; - DBG(2, "lcdc%d>>%s:y_addr:0x%x>>uv_addr:0x%x\n", - lcdc_dev->id, __func__, y_addr, uv_addr); - //printk("y_offset=0x%x,y_addr=0x%x\n",win->area[0].y_offset,y_addr); - spin_lock(&lcdc_dev->reg_lock); - if (likely(lcdc_dev->clk_on)) { - win->area[0].y_addr = y_addr; - win->area[0].uv_addr = uv_addr; - } - spin_unlock(&lcdc_dev->reg_lock); - - return 0; - -} - -static int win1_display(struct lcdc_device *lcdc_dev, - struct rk_lcdc_win *win) -{ - u32 y_addr; - u32 uv_addr; - y_addr = win->area[0].smem_start + win->area[0].y_offset; - uv_addr = win->area[0].cbr_start + win->area[0].c_offset; - DBG(2, "lcdc%d>>%s>>y_addr:0x%x>>uv_addr:0x%x\n", - lcdc_dev->id, __func__, y_addr, uv_addr); - - spin_lock(&lcdc_dev->reg_lock); - if (likely(lcdc_dev->clk_on)) - win->area[0].y_addr = y_addr; - spin_unlock(&lcdc_dev->reg_lock); - - return 0; -} - -static int rk3188_lcdc_win_display(struct rk_lcdc_driver *dev_drv, struct rk_lcdc_win *win,int win_id) -{ - struct lcdc_device *lcdc_dev = container_of(dev_drv, - struct lcdc_device, driver); - struct rk_screen *screen = dev_drv->cur_screen; - u32 mask, val; - - lcdc_dev->atv_layer_cnt = dev_drv->atv_layer_cnt; - if (!screen) { - dev_err(dev_drv->dev, "screen is null!\n"); - return -ENOENT; - } - if (win_id == 0) { - win0_display(lcdc_dev, win); - } else if (win_id == 1) { - win1_display(lcdc_dev, win); - } else { - dev_err(dev_drv->dev, "invalid win number:%d!\n", win_id); - return -EINVAL; - } - /*this is the first frame of the system ,enable frame start interrupt */ - if ((dev_drv->first_frame)) { - dev_drv->first_frame = 0; - mask = m_HS_INT_CLEAR | m_HS_INT_EN | m_FS_INT_CLEAR | - m_FS_INT_EN | m_LF_INT_EN | m_LF_INT_CLEAR | - m_LF_INT_NUM | m_BUS_ERR_INT_CLEAR | m_BUS_ERR_INT_EN; - val = v_FS_INT_CLEAR(1) | v_FS_INT_EN(1) | v_HS_INT_CLEAR(1) | - v_HS_INT_EN(0) | v_LF_INT_CLEAR(1) | v_LF_INT_EN(1) | - v_LF_INT_NUM(screen->mode.vsync_len + screen->mode.upper_margin + - screen->mode.yres -1); - lcdc_msk_reg(lcdc_dev, INT_STATUS, mask, val); - lcdc_cfg_done(lcdc_dev); - } - -} - -static int rk3188_lcdc_pan_display(struct rk_lcdc_driver *dev_drv, int win_id) -{ - struct lcdc_device *lcdc_dev = container_of(dev_drv, - struct lcdc_device, driver); - struct rk_lcdc_win *win = NULL; - struct rk_screen *screen = dev_drv->cur_screen; - u32 mask, val; -#if defined(WAIT_FOR_SYNC) - int timeout; - unsigned long flags; -#endif - lcdc_dev->atv_layer_cnt = dev_drv->atv_layer_cnt; - if (!screen) { - dev_err(dev_drv->dev, "screen is null!\n"); - return -ENOENT; - } - if (win_id == 0) { - win = dev_drv->win[0]; - win0_display(lcdc_dev, win); - if(win->z_order == 0){ - dev_drv->ops->ovl_mgr(dev_drv, 0, 1); - }else{ - dev_drv->ops->ovl_mgr(dev_drv, 1, 1); - } - } else if (win_id == 1) { - win = dev_drv->win[1]; - win1_display(lcdc_dev, win); - } else { - dev_err(dev_drv->dev, "invalid win number:%d!\n", win_id); - return -EINVAL; - } - - - /*this is the first frame of the system ,enable frame start interrupt */ - if ((dev_drv->first_frame)) { - dev_drv->first_frame = 0; - mask = m_HS_INT_CLEAR | m_HS_INT_EN | m_FS_INT_CLEAR | - m_FS_INT_EN | m_LF_INT_EN | m_LF_INT_CLEAR | - m_LF_INT_NUM | m_BUS_ERR_INT_CLEAR | m_BUS_ERR_INT_EN; - val = v_FS_INT_CLEAR(1) | v_FS_INT_EN(1) | v_HS_INT_CLEAR(1) | - v_HS_INT_EN(0) | v_LF_INT_CLEAR(1) | v_LF_INT_EN(1) | - v_LF_INT_NUM(screen->mode.vsync_len + screen->mode.upper_margin + - screen->mode.yres -1); - lcdc_msk_reg(lcdc_dev, INT_STATUS, mask, val); - lcdc_cfg_done(lcdc_dev); - } -#if defined(WAIT_FOR_SYNC) - spin_lock_irqsave(&dev_drv->cpl_lock, flags); - init_completion(&dev_drv->frame_done); - spin_unlock_irqrestore(&dev_drv->cpl_lock, flags); - timeout = wait_for_completion_timeout(&dev_drv->frame_done, - msecs_to_jiffies(dev_drv-> - cur_screen->ft + - 5)); - if (!timeout && (!dev_drv->frame_done.done)) { - dev_info(dev_drv->dev, "wait for new frame start time out!\n"); - return -ETIMEDOUT; - } -#endif - //printk("rk3188_lcdc_pan_display,win_num=%d\n",dev_drv->atv_layer_cnt); - - rk3188_lcdc_reg_update(dev_drv); - - return 0; -} - - static int win0_set_par(struct lcdc_device *lcdc_dev, struct rk_screen *screen, struct rk_lcdc_win *win) { @@ -799,15 +657,15 @@ static int win0_set_par(struct lcdc_device *lcdc_dev, u32 ScaleCbrY = 0x1000; u8 fmt_cfg = 0; char fmt[9] = "NULL"; - xact = win->area[0].xact;//win->xact; - yact = win->area[0].yact; - xvir = win->area[0].xvir; - yvir = win->area[0].yvir; - 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; - - ScaleYrgbX = CalScale(xact, win->area[0].xsize); - ScaleYrgbY = CalScale(yact, win->area[0].ysize); + xact = win->xact; + yact = win->yact; + xvir = win->xvir; + yvir = win->yvir; + xpos = win->xpos + screen->mode.left_margin + screen->mode.hsync_len; + ypos = win->ypos + screen->mode.upper_margin + screen->mode.vsync_len; + + ScaleYrgbX = CalScale(xact, win->xsize); + ScaleYrgbY = CalScale(yact, win->ysize); switch (win->format) { case ARGB888: case XBGR888: @@ -822,18 +680,18 @@ static int win0_set_par(struct lcdc_device *lcdc_dev, break; case YUV422: fmt_cfg = 5; - ScaleCbrX = CalScale((xact / 2), win->area[0].xsize); - ScaleCbrY = CalScale(yact, win->area[0].ysize); + ScaleCbrX = CalScale((xact / 2), win->xsize); + ScaleCbrY = CalScale(yact, win->ysize); break; case YUV420: fmt_cfg = 4; - ScaleCbrX = CalScale(xact / 2, win->area[0].xsize); - ScaleCbrY = CalScale(yact / 2, win->area[0].ysize); + ScaleCbrX = CalScale(xact / 2, win->xsize); + ScaleCbrY = CalScale(yact / 2, win->ysize); break; case YUV444: fmt_cfg = 6; - ScaleCbrX = CalScale(xact, win->area[0].xsize); - ScaleCbrY = CalScale(yact, win->area[0].ysize); + ScaleCbrX = CalScale(xact, win->xsize); + ScaleCbrY = CalScale(yact, win->ysize); break; default: dev_err(lcdc_dev->driver.dev, "%s:un supported format!\n", @@ -844,7 +702,7 @@ static int win0_set_par(struct lcdc_device *lcdc_dev, 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, - yact, win->area[0].xsize, win->area[0].ysize, xvir, yvir, xpos, ypos); + yact, win->xsize, win->ysize, xvir, yvir, xpos, ypos); spin_lock(&lcdc_dev->reg_lock); if (likely(lcdc_dev->clk_on)) { @@ -853,26 +711,30 @@ static int win0_set_par(struct lcdc_device *lcdc_dev, win->scale_cbcr_x = ScaleCbrX; win->scale_cbcr_y = ScaleCbrY; win->fmt_cfg = fmt_cfg; - win->area[0].dsp_stx = xpos; - win->area[0].dsp_sty = ypos; - + win->dsp_stx = xpos; + win->dsp_sty = ypos; switch (win->format) { case XBGR888: case ABGR888: + win->vir_stride = v_ARGB888_VIRWIDTH(xvir); win->swap_rb = 1; break; case ARGB888: + win->vir_stride = v_ARGB888_VIRWIDTH(xvir); win->swap_rb = 0; break; case RGB888: + win->vir_stride = v_RGB888_VIRWIDTH(xvir); win->swap_rb = 0; break; case RGB565: + win->vir_stride = v_RGB565_VIRWIDTH(xvir); win->swap_rb = 0; break; case YUV422: case YUV420: case YUV444: + win->vir_stride = v_YUV_VIRWIDTH(xvir); win->swap_rb = 0; break; default: @@ -894,39 +756,43 @@ static int win1_set_par(struct lcdc_device *lcdc_dev, u32 xact, yact, xvir, yvir, xpos, ypos; u8 fmt_cfg; char fmt[9] = "NULL"; - xact = win->area[0].xact; - yact = win->area[0].yact; - xvir = win->area[0].xvir; - yvir = win->area[0].yvir; - 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; + xact = win->xact; + yact = win->yact; + xvir = win->xvir; + yvir = win->yvir; + xpos = win->xpos + screen->mode.left_margin + screen->mode.hsync_len; + ypos = win->ypos + screen->mode.upper_margin + screen->mode.vsync_len; 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); + win->xsize, win->ysize, xvir, yvir, xpos, ypos); spin_lock(&lcdc_dev->reg_lock); if (likely(lcdc_dev->clk_on)) { - win->area[0].dsp_stx = xpos; - win->area[0].dsp_sty = ypos; + win->dsp_stx = xpos; + win->dsp_sty = ypos; switch (win->format) { case XBGR888: case ABGR888: fmt_cfg = 0; + win->vir_stride = v_WIN1_ARGB888_VIRWIDTH(xvir); win->swap_rb = 1; break; case ARGB888: fmt_cfg = 0; + win->vir_stride = v_WIN1_ARGB888_VIRWIDTH(xvir); win->swap_rb = 0; break; case RGB888: fmt_cfg = 1; + win->vir_stride = v_WIN1_RGB888_VIRWIDTH(xvir); win->swap_rb = 0; break; case RGB565: fmt_cfg = 2; + win->vir_stride = v_WIN1_RGB565_VIRWIDTH(xvir); win->swap_rb = 0; break; default: @@ -942,57 +808,125 @@ static int win1_set_par(struct lcdc_device *lcdc_dev, return 0; } -static int rk3188_set_win_par(struct rk_lcdc_driver *dev_drv, - struct rk_screen *screen, struct rk_lcdc_win *win,int win_id) +static int rk3188_lcdc_set_par(struct rk_lcdc_driver *dev_drv, int win_id) { struct lcdc_device *lcdc_dev = container_of(dev_drv, struct lcdc_device, driver); + struct rk_lcdc_win *win = NULL; + struct rk_screen *screen = dev_drv->cur_screen; - switch(win_id) - { - case 0: + if (!screen) { + dev_err(dev_drv->dev, "screen is null!\n"); + return -ENOENT; + } + if (win_id == 0) { + win = dev_drv->win[0]; win0_set_par(lcdc_dev, screen, win); - break; - case 1: + } else if (win_id == 1) { + win = dev_drv->win[1]; win1_set_par(lcdc_dev, screen, win); - break; - default: + } else { dev_err(dev_drv->dev, "unsupported win number:%d\n", win_id); - break; + return -EINVAL; } + return 0; } -static int rk3188_lcdc_set_par(struct rk_lcdc_driver *dev_drv,int win_id) + +static int win0_display(struct lcdc_device *lcdc_dev, + struct rk_lcdc_win *win) { - int i; - struct lcdc_device *lcdc_dev = - container_of(dev_drv, struct lcdc_device, driver); + u32 y_addr; + u32 uv_addr; + y_addr = win->smem_start + win->y_offset; + uv_addr = win->cbr_start + win->c_offset; + DBG(2, "lcdc%d>>%s:y_addr:0x%x>>uv_addr:0x%x\n", + lcdc_dev->id, __func__, y_addr, uv_addr); + + spin_lock(&lcdc_dev->reg_lock); + if (likely(lcdc_dev->clk_on)) { + win->y_addr = y_addr; + win->uv_addr = uv_addr; + } + spin_unlock(&lcdc_dev->reg_lock); + + return 0; + +} + +static int win1_display(struct lcdc_device *lcdc_dev, + struct rk_lcdc_win *win) +{ + u32 y_addr; + u32 uv_addr; + y_addr = win->smem_start + win->y_offset; + uv_addr = win->cbr_start + win->c_offset; + DBG(2, "lcdc%d>>%s>>y_addr:0x%x>>uv_addr:0x%x\n", + lcdc_dev->id, __func__, y_addr, uv_addr); + + spin_lock(&lcdc_dev->reg_lock); + if (likely(lcdc_dev->clk_on)) + win->y_addr = y_addr; + spin_unlock(&lcdc_dev->reg_lock); + + return 0; +} + +static int rk3188_lcdc_pan_display(struct rk_lcdc_driver *dev_drv, int win_id) +{ + struct lcdc_device *lcdc_dev = container_of(dev_drv, + struct lcdc_device, driver); struct rk_lcdc_win *win = NULL; struct rk_screen *screen = dev_drv->cur_screen; - + u32 mask, val; +#if defined(WAIT_FOR_SYNC) + int timeout; + unsigned long flags; +#endif if (!screen) { dev_err(dev_drv->dev, "screen is null!\n"); return -ENOENT; } - for(i=0;ilcdc_win_num;i++){ - if(dev_drv->win[i]->state == 1){ - win = dev_drv->win[i]; - rk3188_set_win_par(dev_drv,screen,win,i); - rk3188_lcdc_win_display(dev_drv,win,i); - } - } - if(dev_drv->win[0]->z_order == 0){ - dev_drv->ops->ovl_mgr(dev_drv, 0, 1); - }else{ - dev_drv->ops->ovl_mgr(dev_drv, 1, 1); + if (win_id == 0) { + win = dev_drv->win[0]; + win0_display(lcdc_dev, win); + } else if (win_id == 1) { + win = dev_drv->win[1]; + win1_display(lcdc_dev, win); + } else { + dev_err(dev_drv->dev, "invalid win number:%d!\n", win_id); + return -EINVAL; } - rk3188_lcdc_reg_update(dev_drv); - + /*this is the first frame of the system ,enable frame start interrupt */ + if ((dev_drv->first_frame)) { + dev_drv->first_frame = 0; + mask = m_HS_INT_CLEAR | m_HS_INT_EN | m_FS_INT_CLEAR | + m_FS_INT_EN | m_LF_INT_EN | m_LF_INT_CLEAR | + m_LF_INT_NUM | m_BUS_ERR_INT_CLEAR | m_BUS_ERR_INT_EN; + val = v_FS_INT_CLEAR(1) | v_FS_INT_EN(1) | v_HS_INT_CLEAR(1) | + v_HS_INT_EN(0) | v_LF_INT_CLEAR(1) | v_LF_INT_EN(1) | + v_LF_INT_NUM(screen->mode.vsync_len + screen->mode.upper_margin + + screen->mode.yres -1); + lcdc_msk_reg(lcdc_dev, INT_STATUS, mask, val); + lcdc_cfg_done(lcdc_dev); + } +#if defined(WAIT_FOR_SYNC) + spin_lock_irqsave(&dev_drv->cpl_lock, flags); + init_completion(&dev_drv->frame_done); + spin_unlock_irqrestore(&dev_drv->cpl_lock, flags); + timeout = wait_for_completion_timeout(&dev_drv->frame_done, + msecs_to_jiffies(dev_drv-> + cur_screen->ft + + 5)); + if (!timeout && (!dev_drv->frame_done.done)) { + dev_info(dev_drv->dev, "wait for new frame start time out!\n"); + return -ETIMEDOUT; + } +#endif return 0; } - static int rk3188_lcdc_blank(struct rk_lcdc_driver *dev_drv, int win_id, int blank_mode) { @@ -1064,12 +998,11 @@ static int rk3188_lcdc_early_suspend(struct rk_lcdc_driver *dev_drv) struct lcdc_device *lcdc_dev = container_of(dev_drv, struct lcdc_device, driver); + if (dev_drv->screen0->standby) dev_drv->screen0->standby(1); if (dev_drv->screen_ctr_info->io_disable) dev_drv->screen_ctr_info->io_disable(); - dev_drv->suspend_flag = 1; - flush_kthread_worker(&dev_drv->update_regs_worker); spin_lock(&lcdc_dev->reg_lock); if (likely(lcdc_dev->clk_on)) { @@ -1095,7 +1028,6 @@ static int rk3188_lcdc_early_suspend(struct rk_lcdc_driver *dev_drv) } gpio_direction_output(gpio_dclk, GPIO_LOW); #endif - return 0; } @@ -1111,10 +1043,8 @@ static int rk3188_lcdc_early_resume(struct rk_lcdc_driver *dev_drv) gpio_free(gpio_dclk); iomux_set(LCDC0_DCLK); #endif - if (dev_drv->screen_ctr_info->io_enable) dev_drv->screen_ctr_info->io_enable(); - dev_drv->suspend_flag = 0; if (lcdc_dev->atv_layer_cnt) { rk3188_lcdc_clk_enable(lcdc_dev); @@ -1480,18 +1410,6 @@ int rk3188_lcdc_poll_vblank(struct rk_lcdc_driver *dev_drv) return ret; } -static int rk3188_lcdc_get_dsp_addr(struct rk_lcdc_driver *dev_drv,unsigned int *dsp_addr) -{ - struct lcdc_device *lcdc_dev = - container_of(dev_drv, struct lcdc_device, driver); - - if(lcdc_dev->clk_on){ - dsp_addr[0] = lcdc_readl(lcdc_dev, WIN0_YRGB_MST0); - dsp_addr[1] = lcdc_readl(lcdc_dev, WIN1_MST); - } - return 0; -} - static struct rk_lcdc_win lcdc_win[] = { [0] = { @@ -1527,7 +1445,6 @@ static struct rk_lcdc_drv_ops lcdc_drv_ops = { .dpi_open = rk3188_lcdc_dpi_open, .dpi_win_sel = rk3188_lcdc_dpi_win_sel, .dpi_status = rk3188_lcdc_dpi_status, - .get_dsp_addr = rk3188_lcdc_get_dsp_addr, }; static irqreturn_t rk3188_lcdc_isr(int irq, void *dev_id) @@ -1541,8 +1458,7 @@ static irqreturn_t rk3188_lcdc_isr(int irq, void *dev_id) timestamp = ktime_get(); lcdc_msk_reg(lcdc_dev, INT_STATUS, m_FS_INT_CLEAR, v_FS_INT_CLEAR(1)); - //if (lcdc_dev->driver.wait_fs) { - if (0) { + if (lcdc_dev->driver.wait_fs) { spin_lock(&(lcdc_dev->driver.cpl_lock)); complete(&(lcdc_dev->driver.frame_done)); spin_unlock(&(lcdc_dev->driver.cpl_lock)); @@ -1636,7 +1552,7 @@ static int rk3188_lcdc_probe(struct platform_device *pdev) dev_drv->prop = prop; dev_drv->id = lcdc_dev->id; dev_drv->ops = &lcdc_drv_ops; - dev_drv->lcdc_win_num = ARRAY_SIZE(lcdc_win); + dev_drv->num_win = ARRAY_SIZE(lcdc_win); spin_lock_init(&lcdc_dev->reg_lock); lcdc_dev->irq = platform_get_irq(pdev, 0); diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index 93ea7ec1c2f5..e1844e7b2b9d 100755 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -50,7 +50,7 @@ static int hdmi_switch_complete; static struct platform_device *fb_pdev; -struct list_head saved_list; + #if defined(CONFIG_FB_MIRRORING) int (*video_data_to_mirroring)(struct fb_info *info, u32 yuv_phy[2]); @@ -58,77 +58,7 @@ EXPORT_SYMBOL(video_data_to_mirroring); #endif -int rk_fb_pixel_width(int data_format) -{ - int pixel_width; - switch(data_format){ - case XBGR888: - case ABGR888: - case ARGB888: - pixel_width = 4*8; - break; - case RGB888: - pixel_width = 3*8; - break; - case RGB565: - pixel_width = 2*8; - break; - case YUV422: - case YUV420: - case YUV444: - pixel_width = 1*8; - break; - default: - return -EINVAL; - } - return pixel_width; -} -static int rk_fb_data_fmt(int data_format,int bits_per_pixel) -{ - int fb_data_fmt; - if(bits_per_pixel == 0){ - switch(data_format){ - case HAL_PIXEL_FORMAT_RGBX_8888: - fb_data_fmt = XBGR888; - break; - case HAL_PIXEL_FORMAT_RGBA_8888: - fb_data_fmt = ABGR888; - break; - case HAL_PIXEL_FORMAT_BGRA_8888: - fb_data_fmt = ARGB888; - break; - case HAL_PIXEL_FORMAT_RGB_888: - fb_data_fmt = RGB888; - break; - case HAL_PIXEL_FORMAT_RGB_565: - fb_data_fmt = RGB565; - break; - case HAL_PIXEL_FORMAT_YCbCr_422_SP: // yuv422 - fb_data_fmt = YUV422; - break; - case HAL_PIXEL_FORMAT_YCrCb_NV12: // YUV420---uvuvuv - fb_data_fmt = YUV420; - break; - case HAL_PIXEL_FORMAT_YCrCb_444: // yuv444 - fb_data_fmt = YUV444; - break; - default: - printk("%s:un supported format:0x%x\n",__func__,data_format); - return -EINVAL; - } - }else{ - switch(bits_per_pixel){ - case 32: - fb_data_fmt = ARGB888; - break; - case 16: - fb_data_fmt = RGB565; - break; - } - } - return fb_data_fmt; -} /* rk display power control parse from dts * @@ -513,7 +443,7 @@ static int get_extend_fb_id(struct fb_info *info) fb_id = 0; else if (!strcmp(id, "fb1")) fb_id = 1; - else if (!strcmp(id, "fb2") && (dev_drv->lcdc_win_num > 2)) + else if (!strcmp(id, "fb2") && (dev_drv->num_win > 2)) fb_id = 2; return fb_id; } @@ -710,19 +640,8 @@ static int rk_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) u32 xoffset = var->xoffset; u32 yoffset = var->yoffset; u32 xvir = var->xres_virtual; - u32 yvir = var->yres_virtual; u8 data_format = var->nonstd&0xff; - u8 pixel_width; - u32 vir_width_bit; - u32 stride,uv_stride; - u32 stride_32bit_1; - u32 stride_32bit_2; - u32 stride_128bit_1; - u32 stride_128bit_2; - u16 uv_x_off,uv_y_off; - u8 is_pic_yuv=0; - win_id = dev_drv->ops->fb_get_win_id(dev_drv, info->fix.id); if (win_id < 0) return -ENODEV; @@ -737,93 +656,44 @@ static int rk_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) extend_info->fix.id); extend_win = extend_dev_drv->win[extend_win_id]; } - pixel_width = rk_fb_pixel_width(win->format); - vir_width_bit = pixel_width * xvir; - stride_128bit_1 = ((vir_width_bit + 127) & (~127))/8; //pixel_width = byte_num *8 - stride_128bit_2 = ((vir_width_bit*2 + 127) & (~127))/8; //pixel_width = byte_num *8 - stride_32bit_1 = ((vir_width_bit + 31 ) & (~31 ))/8; //pixel_width = byte_num *8 - stride_32bit_2 = ((vir_width_bit*2 + 31 ) & (~31 ))/8; //pixel_width = byte_num *8 - - stride = stride_32bit_1;//default rgb - fix->line_length = stride; - - switch (win->format){ - case YUV422: - is_pic_yuv = 1; - stride = stride_32bit_1; - uv_stride = stride_32bit_1>> 1 ;// - uv_x_off = xoffset >> 1 ;// - uv_y_off = yoffset;//0 - fix->line_length = stride; - break; - case YUV420://420sp - is_pic_yuv = 1; - stride = stride_32bit_1; - uv_stride = stride_32bit_1; - uv_x_off = xoffset; - uv_y_off = yoffset >> 1; - fix->line_length = stride; - break; - case YUV444: - is_pic_yuv = 1; - stride = stride_32bit_1; - uv_stride = stride_32bit_2; - uv_x_off = xoffset*2; - uv_y_off = yoffset; - fix->line_length = stride<<2; - break; - default: - printk(KERN_ERR "%s:un supported format:0x%x\n", __func__, data_format); - return -EINVAL; - } - - // x y mirror ,jump line - win->area[0].y_offset = yoffset*stride+xoffset*pixel_width/8; - if(is_pic_yuv == 1){ - win->area[0].c_offset = uv_y_off*uv_stride+uv_x_off*pixel_width/8; - } switch (win->format) { case XBGR888: case ARGB888: case ABGR888: - win->area[0].y_offset=(yoffset*xvir + xoffset)*4;//win->y_offset = (yoffset*xvir + xoffset)*4; + win->y_offset = (yoffset*xvir + xoffset)*4; break; case RGB888: - win->area[0].y_offset = (yoffset*xvir + xoffset)*3; + win->y_offset = (yoffset*xvir + xoffset)*3; break; case RGB565: - win->area[0].y_offset = (yoffset*xvir + xoffset)*2; + win->y_offset = (yoffset*xvir + xoffset)*2; break; case YUV422: - win->area[0].y_offset = yoffset*xvir + xoffset; - win->area[0].c_offset = win->area[0].y_offset; + win->y_offset = yoffset*xvir + xoffset; + win->c_offset = win->y_offset; break; case YUV420: - win->area[0].y_offset = yoffset*xvir + xoffset; - win->area[0].c_offset = (yoffset>>1)*xvir + xoffset; + win->y_offset = yoffset*xvir + xoffset; + win->c_offset = (yoffset>>1)*xvir + xoffset; break; case YUV444: - win->area[0].y_offset = yoffset*xvir + xoffset; - win->area[0].c_offset = yoffset*2*xvir + (xoffset<<1); + win->y_offset = yoffset*xvir + xoffset; + win->c_offset = yoffset*2*xvir + (xoffset<<1); break; default: printk(KERN_ERR "%s un supported format:0x%x\n", __func__, data_format); return -EINVAL; } - win->area[0].smem_start = fix->smem_start; - win->area[0].cbr_start = fix->smem_start + xvir * yvir; - win->state=1; - win->area[0].state=1; - win->area_num = 1; - + win->smem_start = fix->smem_start; + win->cbr_start = fix->mmio_start; dev_drv->ops->pan_display(dev_drv, win_id); if (rk_fb->disp_mode == DUAL) { if (extend_win->state && (hdmi_switch_complete)) { - extend_win->area[0].y_offset = win->area[0].y_offset; + extend_win->y_offset = win->y_offset; #if defined(CONFIG_FB_ROTATE) || !defined(CONFIG_THREE_FB_BUFFER) - rk_fb_rotate(extend_info, info, win->area[0].y_offset); + rk_fb_rotate(extend_info, info, win->y_offset); #endif extend_dev_drv->ops->pan_display(extend_dev_drv, extend_win_id); } @@ -836,440 +706,6 @@ static int rk_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) return 0; } -static int rk_fb_get_list_stat(struct rk_lcdc_driver *dev_drv) -{ - int i,j; - i = list_empty(&dev_drv->update_regs_list); - j = list_empty(&saved_list); - return i==j?0:1; - -} - -void rk_fd_fence_wait(struct rk_lcdc_driver *dev_drv, - struct sync_fence *fence) -{ - int err = sync_fence_wait(fence, 1000); - - if (err >= 0) - return; - - if (err == -ETIME) - err = sync_fence_wait(fence, 10 * MSEC_PER_SEC); - - if (err < 0) - printk("error waiting on fence\n"); -} - - -void rk_fb_free_dma_buf(struct rk_fb_reg_win_data *reg_win_data) -{ -#ifdef H_USE_FENCE - int i; - for(i=0;ireg_area_data[i].acq_fence) - sync_fence_put(reg_win_data->reg_area_data[i].acq_fence); - } -#endif - memset(reg_win_data, 0, sizeof(struct rk_fb_reg_win_data)); -} - -static void rk_fb_update_driver(struct rk_lcdc_win *win,struct rk_fb_reg_win_data *reg_win_data) -{ - int i=0; - //struct rk_lcdc_win *win; - //win = dev_drv->win[reg_win_data->win_id]; - 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 0 - for(i=0;iarea_num;i++) - { - printk("i=%d:area[%d]=%x,reg_area_data[%d]=%x,mem_start=%x\n", - i,i,&win->area[i],i,®_win_data->reg_area_data[i],reg_win_data->reg_area_data[i].smem_start); - - win->area[i].smem_start = reg_win_data->reg_area_data[i].smem_start; - win->area[i].cbr_start = reg_win_data->reg_area_data[i].cbr_start; - win->area[i].xpos = reg_win_data->reg_area_data[i].xpos; - win->area[i].ypos = reg_win_data->reg_area_data[i].ypos; - win->area[i].xsize = reg_win_data->reg_area_data[i].xsize; - win->area[i].ysize = reg_win_data->reg_area_data[i].ysize; - win->area[i].xact = reg_win_data->reg_area_data[i].xact; - win->area[i].yact = reg_win_data->reg_area_data[i].yact; - win->area[i].xvir = reg_win_data->reg_area_data[i].xvir; - win->area[i].yvir = reg_win_data->reg_area_data[i].yvir; - win->area[i].y_offset = reg_win_data->reg_area_data[i].y_offset; - win->area[i].c_offset = reg_win_data->reg_area_data[i].c_offset; - win->area[i].state = 1; - } - #else - 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 = reg_win_data->reg_area_data[0].uv_vir_stride; - win->area[0].cbr_start = reg_win_data->reg_area_data[0].cbr_start; - win->area[0].c_offset = reg_win_data->reg_area_data[0].c_offset; - 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; - for(i=0;ireg_area_data[i].smem_start > 0){ - win->area[i].smem_start = reg_win_data->reg_area_data[i].smem_start; - win->area[i].xpos = reg_win_data->reg_area_data[i].xpos; - win->area[i].ypos = reg_win_data->reg_area_data[i].ypos; - win->area[i].xsize = reg_win_data->reg_area_data[i].xsize; - win->area[i].ysize = reg_win_data->reg_area_data[i].ysize; - win->area[i].xact = reg_win_data->reg_area_data[i].xact; - win->area[i].yact = reg_win_data->reg_area_data[i].yact; - win->area[i].xvir = reg_win_data->reg_area_data[i].xvir; - win->area[i].yvir = reg_win_data->reg_area_data[i].yvir; - win->area[i].y_offset = reg_win_data->reg_area_data[i].y_offset; - win->area[i].y_vir_stride = reg_win_data->reg_area_data[i].y_vir_stride; - win->area[i].state = 1; - }else{ - win->area[i].state = 0; - } - } - }else{ - win->state = 0; - } - #endif - -} - - -static void rk_fb_update_reg(struct rk_lcdc_driver * dev_drv,struct rk_fb_reg_data *regs) -{ - int i,j,ret=0; - struct rk_lcdc_win *win; - ktime_t timestamp = dev_drv->vsync_info.timestamp; - //struct rk_fb_reg_win_data old_reg_win_data[RK30_MAX_LAYER_SUPPORT]; - - for(i=0;ilcdc_win_num;i++){ - //old_reg_win_data[i]= regs->reg_win_data[i]; - win = dev_drv->win[i]; - for(j=0;jwin_num;j++){ - if(i == regs->reg_win_data[j].win_id) - break; - } - if(jwin_num){ - rk_fb_update_driver(win,®s->reg_win_data[j]); - win->state = 1; - }else{ - win->state = 0; - } - } -#if 0 - for(i=0;i<2;i++){ - printk("win[%d]:drv_win_state=%d\n",i,dev_drv->win[i]->state); - for(j=0;j<4;j++){ - printk("area[%d]:state=%d,mem_addr=%x\n", - i,dev_drv->win[i]->area[j].state,dev_drv->win[i]->area[j].smem_start); - } - } -#endif - dev_drv->atv_layer_cnt = regs->win_num; - dev_drv->cur_screen->post_xsize = regs->post_cfg.xsize; - dev_drv->cur_screen->post_ysize = regs->post_cfg.ysize; - dev_drv->cur_screen->post_dsp_stx = regs->post_cfg.xpos; - dev_drv->cur_screen->post_dsp_sty = regs->post_cfg.ypos; - dev_drv->ops->set_par(dev_drv,0); - - ret = wait_event_interruptible_timeout(dev_drv->vsync_info.wait, - !ktime_equal(timestamp, dev_drv->vsync_info.timestamp),msecs_to_jiffies(dev_drv->cur_screen->ft+5)); - - sw_sync_timeline_inc(dev_drv->timeline, 1); - - for(i=0;iwin_num;i++){ - rk_fb_free_dma_buf(®s->reg_win_data[i]); - } -} - -static void rk_fb_update_regs_handler(struct kthread_work *work) -{ - struct rk_lcdc_driver * dev_drv = - container_of(work, struct rk_lcdc_driver, update_regs_work); - struct rk_fb_reg_data *data, *next; - //struct list_head saved_list; - mutex_lock(&dev_drv->update_regs_list_lock); - saved_list = dev_drv->update_regs_list; - list_replace_init(&dev_drv->update_regs_list, &saved_list); - mutex_unlock(&dev_drv->update_regs_list_lock); - - list_for_each_entry_safe(data, next, &saved_list, list) { - rk_fb_update_reg(dev_drv,data); - list_del(&data->list); - kfree(data); - } -} - -static int rk_fb_set_win_buffer(struct fb_info *info, - struct rk_fb_win_par *win_par,struct rk_fb_reg_win_data *reg_win_data) -{ - struct rk_fb *rk_fb = dev_get_drvdata(info->device); - //struct fb_var_screeninfo *var = &info->var; - struct fb_fix_screeninfo *fix = &info->fix; - //struct rk_lcdc_driver * dev_drv = (struct rk_lcdc_driver * )info->par; - - int i,j,ion_fd,acq_fence_fd; - u32 xvir,yvir; - u32 xoffset,yoffset; - - struct ion_handle *hdl; - ion_phys_addr_t phy_addr; - size_t len; - int index_buf; - u8 fb_data_fmt; - u8 pixel_width; - u32 vir_width_bit; - u32 stride,uv_stride; - u32 stride_32bit_1; - u32 stride_32bit_2; - u32 stride_128bit_1; - u32 stride_128bit_2; - u16 uv_x_off,uv_y_off; - u8 is_pic_yuv=0; - u8 ppixel_a=0,global_a=0; - reg_win_data->area_num = 0; - if(win_par->area_par[0].phy_addr == 0){ - for(i=0;iarea_par[i].ion_fd; - if(ion_fd > 0){ - reg_win_data->area_num++; - for(j=0;jarea_par[j].ion_fd){ - printk("region[%d] fd is same to region[%d]:fd=%d", - i,j,ion_fd); - break; - } - } - if(j == i){ - hdl = ion_import_dma_buf(rk_fb->ion_client, ion_fd); - ion_phys(rk_fb->ion_client, hdl, &phy_addr, &len); - reg_win_data->reg_area_data[i].smem_start = phy_addr; - reg_win_data->area_buf_num++; - reg_win_data->reg_area_data[i].index_buf = 1; - }else{ - reg_win_data->reg_area_data[i].smem_start = - reg_win_data->reg_area_data[j].smem_start; - } - } - #if 0 - printk("i=%d,ion_fd=%d,addr=0x%x,area_num=%d,area_buf_num=%d\n", - i,ion_fd,reg_win_data->reg_area_data[i].smem_start, - reg_win_data->area_num,reg_win_data->area_buf_num); - #endif - } - }else{ - reg_win_data->reg_area_data[0].smem_start = - win_par->area_par[0].phy_addr; - reg_win_data->area_num = 1; - } - - if(reg_win_data->area_num == 0){ - return 0; - } - - for(i=0;iarea_num;i++){ - acq_fence_fd = win_par->area_par[i].acq_fence_fd; - index_buf = reg_win_data->reg_area_data[i].index_buf; - if((acq_fence_fd > 0)&&(index_buf == 1)){ - reg_win_data->reg_area_data[i].acq_fence = - 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->z_order = win_par->z_order; - reg_win_data->win_id = win_par->win_id; - - for(i=0;iarea_num;i++){ - reg_win_data->reg_area_data[i].xpos = win_par->area_par[i].xpos;//visiable pos in panel - reg_win_data->reg_area_data[i].ypos = win_par->area_par[i].ypos; - - reg_win_data->reg_area_data[i].xsize= win_par->area_par[i].xsize;//realy size in panel - reg_win_data->reg_area_data[i].ysize= win_par->area_par[i].ysize; - - reg_win_data->reg_area_data[i].xact= win_par->area_par[i].xact;//realy size in panel - reg_win_data->reg_area_data[i].yact= win_par->area_par[i].yact; - - xoffset = win_par->area_par[i].x_offset;//buf offset - yoffset = win_par->area_par[i].y_offset; - 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].yvir = yvir; - #if 0 - printk("i=%d,xpos=%d,ypos=%d,xsize=%d,ysize=%d,xact=%d,yact=%d,x_off=%d,y_off=%d,xvir=%d,yvir=%d\n", - i,reg_win_data->reg_area_data[i].xpos,reg_win_data->reg_area_data[i].ypos,reg_win_data->reg_area_data[i].xsize,reg_win_data->reg_area_data[i].ysize, - reg_win_data->reg_area_data[i].xact,reg_win_data->reg_area_data[i].yact,xoffset,yoffset,xvir,yvir); - #endif - - vir_width_bit = pixel_width * xvir; - stride_128bit_1 = ((vir_width_bit + 127) & (~127))/8; //pixel_width = byte_num *8 - stride_128bit_2 = ((vir_width_bit*2 + 127) & (~127))/8; //pixel_width = byte_num *8 - stride_32bit_1 = ((vir_width_bit + 31 ) & (~31 ))/8; //pixel_width = byte_num *8 - stride_32bit_2 = ((vir_width_bit*2 + 31 ) & (~31 ))/8; //pixel_width = byte_num *8 - - stride = stride_32bit_1;//default rgb - fix->line_length = stride; - reg_win_data->reg_area_data[i].y_vir_stride = stride >> 2; - // x y mirror ,jump line - reg_win_data->reg_area_data[i].y_offset = yoffset*stride+xoffset*pixel_width/8; - } - switch (fb_data_fmt){ - case YUV422: - is_pic_yuv = 1; - stride = stride_32bit_1; - uv_stride = stride_32bit_1>> 1 ;// - uv_x_off = xoffset >> 1 ;// - uv_y_off = yoffset;//0 - fix->line_length = stride; - break; - case YUV420://420sp - is_pic_yuv = 1; - stride = stride_32bit_1; - uv_stride = stride_32bit_1; - uv_x_off = xoffset; - uv_y_off = yoffset >> 1; - fix->line_length = stride; - break; - case YUV444: - is_pic_yuv = 1; - stride = stride_32bit_1; - uv_stride = stride_32bit_2; - uv_x_off = xoffset*2; - uv_y_off = yoffset; - fix->line_length = stride<<2; - break; - } - if(is_pic_yuv == 1){ - 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].c_offset = - uv_y_off*uv_stride+uv_x_off*pixel_width/8; - reg_win_data->reg_area_data[0].uv_vir_stride = - uv_stride >> 2; - } - return 0; -} - -static int rk_fb_set_win_config(struct fb_info *info, - struct rk_fb_win_cfg_data *win_data) -{ - //struct rk_fb *rk_fb = dev_get_drvdata(info->device); - struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)info->par; - struct rk_fb_reg_data *regs; - struct rk_fb_reg_win_data *reg_win_data; - struct sync_fence *release_fence[RK_MAX_BUF_NUM]; - struct sync_fence *retire_fence; - struct sync_pt *release_sync_pt[RK_MAX_BUF_NUM]; - struct sync_pt *retire_sync_pt; - int ret,i,j=0,fence_fd; - char fence_name[20]; - - //mutex_lock(&dev_drv->output_lock); - regs = kzalloc(sizeof(struct rk_fb_reg_data), GFP_KERNEL); - if (!regs) { - printk("could not allocate rk_fb_reg_data\n"); - ret = -ENOMEM; - return ret; - } - - regs->post_cfg.xpos = win_data->post_cfg.xpos; - regs->post_cfg.ypos = win_data->post_cfg.ypos; - regs->post_cfg.xsize = win_data->post_cfg.xsize; - regs->post_cfg.ysize = win_data->post_cfg.xsize; - for (i=0; ilcdc_win_num; i++) { - if(win_data->win_par[i].win_id < dev_drv->lcdc_win_num){ - rk_fb_set_win_buffer(info,&win_data->win_par[i],®s->reg_win_data[j]); - if(regs->reg_win_data[j].area_num > 0){ - regs->win_num++; - regs->buf_num += regs->reg_win_data[j].area_buf_num; - } - j++; - }else{ - printk("error:win_id bigger than lcdc_win_num\n"); - printk("i=%d,win_id=%d\n",i,win_data->win_par[i].win_id); - } - } - for(i=0; iwin_num; i++){ - reg_win_data = ®s->reg_win_data[i]; - for(j=0;jreg_area_data[j].acq_fence){ - printk("acq_fence wait!!!!!\n"); - rk_fd_fence_wait(dev_drv, - reg_win_data->reg_area_data[j].acq_fence); - } - } - } - - mutex_lock(&dev_drv->output_lock); - if(!(dev_drv->suspend_flag == 0)){ - rk_fb_update_reg(dev_drv,regs); - printk("suspend_flag == 0\n"); - goto err; - } - mutex_lock(&dev_drv->update_regs_list_lock); - dev_drv->timeline_max++; -#ifdef H_USE_FENCE - for(i=0;ibuf_num){ - sprintf(fence_name,"fence%d",i); - win_data->rel_fence_fd[i] = get_unused_fd(); - if (win_data->rel_fence_fd[i] < 0){ - printk("rel_fence_fd=%d\n",win_data->rel_fence_fd[i]); - return -EFAULT; - } - release_sync_pt[i] = sw_sync_pt_create(dev_drv->timeline, - dev_drv->timeline_max); - release_fence[i] = sync_fence_create(fence_name, release_sync_pt[i]); - sync_fence_install(release_fence[i], win_data->rel_fence_fd[i]); - }else{ - win_data->rel_fence_fd[i] = -1; - } - } - - win_data->ret_fence_fd = get_unused_fd(); - if (win_data->ret_fence_fd < 0){ - printk("ret_fence_fd=%d\n",win_data->ret_fence_fd); - return -EFAULT; - } - retire_sync_pt = sw_sync_pt_create(dev_drv->timeline, dev_drv->timeline_max); - retire_fence = sync_fence_create("ret_fence", retire_sync_pt); - sync_fence_install(retire_fence, win_data->ret_fence_fd); -#else - for(i=0;irel_fence_fd[i] = -1; - } - win_data->ret_fence_fd = -1; -#endif - if(dev_drv->wait_fs == 0){ - list_add_tail(®s->list,&dev_drv->update_regs_list); - mutex_unlock(&dev_drv->update_regs_list_lock); - queue_kthread_work(&dev_drv->update_regs_worker, - &dev_drv->update_regs_work); - }else{ - mutex_unlock(&dev_drv->update_regs_list_lock); - rk_fb_update_reg(dev_drv,regs); - } - -err: - mutex_unlock(&dev_drv->output_lock); - return ret; -} - static int rk_fb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) { struct rk_fb *rk_fb = dev_get_drvdata(info->device); @@ -1284,13 +720,11 @@ static int rk_fb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg int ovl; /*overlay:0 win1 on the top of win0;1,win0 on the top of win1*/ int num_buf; /*buffer_number*/ int ret; - struct rk_fb_win_cfg_data win_data; - unsigned int dsp_addr[2]; - int list_stat; int win_id = dev_drv->ops->fb_get_win_id(dev_drv, info->fix.id); void __user *argp = (void __user *)arg; + win = dev_drv->win[win_id]; if (rk_fb->disp_mode == DUAL) { fb_id = get_extend_fb_id(info); @@ -1341,19 +775,6 @@ static int rk_fb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg return -EFAULT; dev_drv->vsync_info.active = enable; break; - - case RK_FBIOGET_DSP_ADDR: - dev_drv->ops->get_dsp_addr(dev_drv,dsp_addr); - if (copy_to_user(argp, &dsp_addr, sizeof(dsp_addr))) - return -EFAULT; - break; - case RK_FBIOGET_LIST_STAT: - list_stat = rk_fb_get_list_stat(dev_drv); - if (copy_to_user(argp, &list_stat, sizeof(list_stat))) - return -EFAULT; - - break; - #if defined(CONFIG_ION_ROCKCHIP) case RK_FBIOSET_DMABUF_FD: { @@ -1370,10 +791,11 @@ static int rk_fb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg } case RK_FBIOGET_DMABUF_FD: { - int fd = ion_share_dma_buf_fd(rk_fb->ion_client, win->area[0].ion_hdl); + int fd = ion_share_dma_buf_fd(rk_fb->ion_client, win->ion_hdl); if (fd < 0) { dev_err(info->dev, "ion_share_dma_buf_fd failed\n"); return fd; + } if (copy_to_user(argp, &fd, sizeof(fd))) return -EFAULT; @@ -1381,24 +803,9 @@ static int rk_fb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg } #endif case RK_FBIOSET_CONFIG_DONE: - if(copy_from_user(&win_data, - (struct rk_fb_win_cfg_data __user *)argp, - sizeof(win_data))){ - ret = -EFAULT; - break; - }; - - dev_drv->wait_fs = win_data.wait_fs; - rk_fb_set_win_config(info,&win_data); - - if (copy_to_user((struct rk_fb_win_cfg_data __user *)arg, - &win_data, - sizeof(win_data))) { - ret = -EFAULT; - break; - } - memset(&win_data, 0, sizeof(struct rk_fb_win_cfg_data)); - + ret = copy_from_user(&(dev_drv->wait_fs), argp, sizeof(dev_drv->wait_fs)); + if (dev_drv->ops->lcdc_reg_update) + dev_drv->ops->lcdc_reg_update(dev_drv); if (rk_fb->disp_mode == DUAL) { if (extend_win->state && (hdmi_switch_complete)) { if (rk_fb->num_fb >= 2) { @@ -1413,7 +820,7 @@ static int rk_fb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg break; } - return 0; + return 0; } static int rk_fb_blank(int blank_mode, struct fb_info *info) @@ -1485,10 +892,6 @@ static ssize_t rk_fb_read(struct fb_info *info, char __user *buf, struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)info->par; struct rk_lcdc_win *win = NULL; int win_id = 0; - int list_empty=0; - - list_empty = rk_fb_get_list_stat(dev_drv); - printk("list_empty=%d\n",list_empty); win_id = dev_drv->ops->fb_get_win_id(dev_drv, info->fix.id); if (win_id < 0) @@ -1497,9 +900,9 @@ static ssize_t rk_fb_read(struct fb_info *info, char __user *buf, win = dev_drv->win[win_id]; if (win->format == RGB565) - total_size = win->area[0].xact*win->area[0].yact<<1; /*only read the current frame buffer*/ + total_size = win->xact*win->yact<<1; /*only read the current frame buffer*/ else - total_size = win->area[0].xact*win->area[0].yact<<2; + total_size = win->xact*win->yact<<2; if (p >= total_size) @@ -1516,7 +919,7 @@ static ssize_t rk_fb_read(struct fb_info *info, char __user *buf, if (!buffer) return -ENOMEM; - src = (u8 __iomem *) (info->screen_base + p + win->area[0].y_offset); + src = (u8 __iomem *) (info->screen_base + p + win->y_offset); while (count) { c = (count > PAGE_SIZE) ? PAGE_SIZE : count; @@ -1559,9 +962,9 @@ static ssize_t rk_fb_write(struct fb_info *info, const char __user *buf, win = dev_drv->win[win_id]; if (win->format == RGB565) - total_size = win->area[0].xact*win->area[0].yact<<1; /*write the current frame buffer*/ + total_size = win->xact*win->yact<<1; /*write the current frame buffer*/ else - total_size = win->area[0].xact*win->area[0].yact<<2; + total_size = win->xact*win->yact<<2; if (p > total_size) return -EFBIG; @@ -1583,7 +986,7 @@ static ssize_t rk_fb_write(struct fb_info *info, const char __user *buf, if (!buffer) return -ENOMEM; - dst = (u8 __iomem *) (info->screen_base + p + win->area[0].y_offset); + dst = (u8 __iomem *) (info->screen_base + p + win->y_offset); while (count) { c = (count > PAGE_SIZE) ? PAGE_SIZE : count; @@ -1630,17 +1033,9 @@ static int rk_fb_set_par(struct fb_info *info) u16 ypos = (var->nonstd>>20) & 0xfff; u32 xvir = var->xres_virtual; u32 yvir = var->yres_virtual; - u8 data_format = var->nonstd&0xff; - u8 fb_data_fmt; - u8 pixel_width; - u32 vir_width_bit; - u32 stride,uv_stride; - u32 stride_32bit_1; - u32 stride_32bit_2; - u32 stride_128bit_1; - u32 stride_128bit_2; - u16 uv_x_off,uv_y_off; - u8 is_pic_yuv=0; + u8 data_format = var->nonstd&0xff; + + var->pixclock = dev_drv->pixclock; win_id = dev_drv->ops->fb_get_win_id(dev_drv, info->fix.id); @@ -1648,6 +1043,7 @@ static int rk_fb_set_par(struct fb_info *info) return -ENODEV; else win = dev_drv->win[win_id]; + if (rk_fb->disp_mode == DUAL) { fb_id = get_extend_fb_id(info); extend_info = rk_fb->fb[(rk_fb->num_fb>>1) + fb_id]; @@ -1681,85 +1077,99 @@ if (rk_fb->disp_mode != DUAL) { } } - fb_data_fmt = rk_fb_data_fmt(data_format,var->bits_per_pixel); - pixel_width = rk_fb_pixel_width(fb_data_fmt); - vir_width_bit = pixel_width * xvir; - stride_128bit_1 = ((vir_width_bit + 127) & (~127))/8; //pixel_width = byte_num *8 - stride_128bit_2 = ((vir_width_bit*2 + 127) & (~127))/8; //pixel_width = byte_num *8 - stride_32bit_1 = ((vir_width_bit + 31 ) & (~31 ))/8; //pixel_width = byte_num *8 - stride_32bit_2 = ((vir_width_bit*2 + 31 ) & (~31 ))/8; //pixel_width = byte_num *8 - - stride = stride_32bit_1;//default rgb - fix->line_length = stride; - - switch (fb_data_fmt){ - case YUV422: - is_pic_yuv = 1; - stride = stride_32bit_1; - uv_stride = stride_32bit_1>> 1 ;// - uv_x_off = xoffset >> 1 ;// - uv_y_off = yoffset;//0 - fix->line_length = stride; +#if 1 + switch (data_format) { + case HAL_PIXEL_FORMAT_RGBX_8888: + win->format = XBGR888; + fix->line_length = 4 * xvir; + win->y_offset = (yoffset*xvir + xoffset)*4; + break; + case HAL_PIXEL_FORMAT_RGBA_8888: + win->format = ABGR888; + fix->line_length = 4 * xvir; + win->y_offset = (yoffset*xvir + xoffset)*4; + break; + case HAL_PIXEL_FORMAT_BGRA_8888: + win->format = ARGB888; + fix->line_length = 4 * xvir; + win->y_offset = (yoffset*xvir + xoffset)*4; + break; + case HAL_PIXEL_FORMAT_RGB_888: + win->format = RGB888; + fix->line_length = 3 * xvir; + win->y_offset = (yoffset*xvir + xoffset)*3; + break; + case HAL_PIXEL_FORMAT_RGB_565: + win->format = RGB565; + fix->line_length = 2 * xvir; + win->y_offset = (yoffset*xvir + xoffset)*2; + break; + case HAL_PIXEL_FORMAT_YCbCr_422_SP: + win->format = YUV422; + fix->line_length = xvir; cblen = crlen = (xvir*yvir)>>1; + win->y_offset = yoffset*xvir + xoffset; + win->c_offset = win->y_offset; break; - case YUV420://420sp - is_pic_yuv = 1; - stride = stride_32bit_1; - uv_stride = stride_32bit_1; - uv_x_off = xoffset; - uv_y_off = yoffset >> 1; - fix->line_length = stride; + case HAL_PIXEL_FORMAT_YCrCb_NV12: + win->format = YUV420; + fix->line_length = xvir; cblen = crlen = (xvir*yvir)>>2; + win->y_offset = yoffset*xvir + xoffset; + win->c_offset = (yoffset>>1)*xvir + xoffset; break; - case YUV444: - is_pic_yuv = 1; - stride = stride_32bit_1; - uv_stride = stride_32bit_2; - uv_x_off = xoffset*2; - uv_y_off = yoffset; - fix->line_length = stride<<2; + case HAL_PIXEL_FORMAT_YCrCb_444: + win->format = 5; + fix->line_length = xvir<<2; + win->y_offset = yoffset*xvir + xoffset; + win->c_offset = yoffset*2*xvir + (xoffset<<1); cblen = crlen = (xvir*yvir); break; + default: + printk(KERN_ERR "%s:un supported format:0x%x\n", __func__, data_format); + return -EINVAL; } +#else + switch (var->bits_per_pixel) { + case 32: + win->format = ARGB888; + fix->line_length = 4 * xvir; + win->y_offset = (yoffset*xvir + xoffset)*4; + break; + case 16: + win->format = RGB565; + fix->line_length = 2 * xvir; + win->y_offset = (yoffset*xvir + xoffset)*2; + break; - // x y mirror ,jump line - win->area[0].y_offset = yoffset*stride+xoffset*pixel_width/8; - if(is_pic_yuv == 1){ - win->area[0].c_offset = uv_y_off*uv_stride+uv_x_off*pixel_width/8; - } - win->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].ypos = ypos; - win->area[0].xsize = xsize; - win->area[0].ysize = ysize; - - win->area[0].smem_start = fix->smem_start; - win->area[0].cbr_start = fix->smem_start+stride*yvir;//fix->mmio_start; - win->area[0].xact = var->xres; /*winx active window height,is a wint of vir*/ - 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->state=1; - win->area[0].state=1; - win->area_num = 1; + } +#endif + win->xpos = xpos; + win->ypos = ypos; + win->xsize = xsize; + win->ysize = ysize; + + win->smem_start = fix->smem_start; + win->cbr_start = fix->mmio_start; + win->xact = var->xres; /*winx active window height,is a wint of vir*/ + win->yact = var->yres; + win->xvir = var->xres_virtual; /*virtual resolution stride --->LCDC_WINx_VIR*/ + win->yvir = var->yres_virtual; if (rk_fb->disp_mode == DUAL) { if (extend_win->state && (hdmi_switch_complete)) { if (info != extend_info) { - if (win->area[0].xact < win->area[0].yact) { - //extend_win->xact = win->area[0].yact; - extend_win->area[0].xact = win->area[0].yact; - extend_win->area[0].yact = win->area[0].xact; - extend_win->area[0].xvir = win->area[0].yact; + if (win->xact < win->yact) { + extend_win->xact = win->yact; + extend_win->yact = win->xact; + extend_win->xvir = win->yact; extend_info->var.xres = var->yres; extend_info->var.yres = var->xres; extend_info->var.xres_virtual = var->yres; } else { - extend_win->area[0].xact = win->area[0].xact; - extend_win->area[0].yact = win->area[0].yact; - extend_win->area[0].xvir = win->area[0].xvir; + extend_win->xact = win->xact; + extend_win->yact = win->yact; + extend_win->xvir = win->xvir; extend_info->var.xres = var->xres; extend_info->var.yres = var->yres; extend_info->var.xres_virtual = var->xres_virtual; @@ -2001,7 +1411,7 @@ int rk_fb_switch_screen(struct rk_screen *screen , int enable, int lcdc_id) if (rk_fb->num_lcdc == 1) info = rk_fb->fb[0]; else if (rk_fb->num_lcdc == 2) - info = rk_fb->fb[dev_drv->lcdc_win_num]; /*the main fb of lcdc1*/ + info = rk_fb->fb[dev_drv->num_win]; /*the main fb of lcdc1*/ if (dev_drv->screen1) { /*device like rk2928 ,have only one lcdc but two outputs*/ if (enable) { @@ -2142,7 +1552,7 @@ int rk_fb_disp_scale(u8 scale_x, u8 scale_y, u8 lcdc_id) if (inf->num_lcdc == 1) info = inf->fb[0]; else if (inf->num_lcdc == 2) - info = inf->fb[dev_drv->lcdc_win_num]; + info = inf->fb[dev_drv->num_win]; var = &info->var; screen_x = dev_drv->cur_screen->mode.xres; @@ -2205,12 +1615,11 @@ static int rk_fb_alloc_buffer(struct fb_info *fbi, int fb_id) dev_err(fbi->device, "failed to ion_alloc:%ld\n",PTR_ERR(handle)); return -ENOMEM; } - win->area[0].ion_hdl = handle; + win->ion_hdl = handle; fbi->screen_base = ion_map_kernel(rk_fb->ion_client, handle); ion_phys(rk_fb->ion_client, handle, &phy_addr, &len); fbi->fix.smem_start = phy_addr; - fbi->fix.smem_len = len; - printk("alloc_buffer:smem_start=0x%x\n",phy_addr); + fbi->fix.smem_len = len; #else fb_mem_virt = dma_alloc_writecombine(fbi->dev, fb_mem_size, &fb_mem_phys, @@ -2271,8 +1680,8 @@ static int rk_release_fb_buffer(struct fb_info *fbi) static int init_lcdc_win(struct rk_lcdc_driver *dev_drv, struct rk_lcdc_win *def_win) { int i; - int lcdc_win_num = dev_drv->lcdc_win_num; - for (i = 0; i < lcdc_win_num; i++) { + int num_win = dev_drv->num_win; + for (i = 0; i < num_win; i++) { struct rk_lcdc_win *win = NULL; win = kzalloc(sizeof(struct rk_lcdc_win), GFP_KERNEL); if (!win) { @@ -2395,7 +1804,7 @@ int rk_fb_register(struct rk_lcdc_driver *dev_drv, index = i; init_lcdc_device_driver(rk_fb, win, index); dev_drv->fb_index_base = rk_fb->num_fb; - for (i = 0; i < dev_drv->lcdc_win_num; i++) { + for (i = 0; i < dev_drv->num_win; i++) { fbi = framebuffer_alloc(0, &fb_pdev->dev); if (!fbi) { dev_err(&fb_pdev->dev, "fb framebuffer_alloc fail!"); @@ -2445,25 +1854,6 @@ int rk_fb_register(struct rk_lcdc_driver *dev_drv, dev_drv->vsync_info.thread = NULL; } dev_drv->vsync_info.active = 1; - - mutex_init(&dev_drv->output_lock); - - INIT_LIST_HEAD(&dev_drv->update_regs_list); - mutex_init(&dev_drv->update_regs_list_lock); - init_kthread_worker(&dev_drv->update_regs_worker); - - dev_drv->update_regs_thread = kthread_run(kthread_worker_fn, - &dev_drv->update_regs_worker, "rk-fb"); - if (IS_ERR(dev_drv->update_regs_thread)) { - int err = PTR_ERR(dev_drv->update_regs_thread); - dev_drv->update_regs_thread = NULL; - - printk("failed to run update_regs thread\n"); - return err; - } - init_kthread_work(&dev_drv->update_regs_work, rk_fb_update_regs_handler); - - dev_drv->timeline = sw_sync_timeline_create("fb-timeline"); dev_drv->timeline_max = 1; } } @@ -2487,9 +1877,7 @@ if (dev_drv->prop == PRMRY) { main_fbi->fbops->fb_pan_display(&main_fbi->var, main_fbi); } #endif - //main_fbi->fbops->fb_ioctl(main_fbi, RK_FBIOSET_CONFIG_DONE, 0); - main_fbi->fbops->fb_set_par(main_fbi); - + main_fbi->fbops->fb_ioctl(main_fbi, RK_FBIOSET_CONFIG_DONE, 0); } #endif return 0; @@ -2503,7 +1891,7 @@ int rk_fb_unregister(struct rk_lcdc_driver *dev_drv) struct rk_fb *fb_inf = platform_get_drvdata(fb_pdev); struct fb_info *fbi; int fb_index_base = dev_drv->fb_index_base; - int fb_num = dev_drv->lcdc_win_num; + int fb_num = dev_drv->num_win; int i = 0; if (fb_inf->lcdc_dev_drv[i]->vsync_info.thread) { diff --git a/drivers/video/rockchip/rkfb_sysfs.c b/drivers/video/rockchip/rkfb_sysfs.c old mode 100755 new mode 100644 index ed8d93359232..2d96db83837b --- a/drivers/video/rockchip/rkfb_sysfs.c +++ b/drivers/video/rockchip/rkfb_sysfs.c @@ -291,85 +291,6 @@ static ssize_t set_dsp_lut(struct device *dev, struct device_attribute *attr, return count; } -static ssize_t show_dsp_cabc(struct device *dev, - struct device_attribute *attr, char *buf) -{ - - return 0; -} - -static ssize_t set_dsp_cabc(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - struct fb_info *fbi = dev_get_drvdata(dev); - struct rk_lcdc_driver *dev_drv = - (struct rk_lcdc_driver *)fbi->par; - int ret,mode=0; - - ret = kstrtoint(buf, 0, &mode); - if (ret) - return ret; - - ret = dev_drv->ops->set_dsp_cabc(dev_drv, mode); - if(ret < 0) - return ret; - - return count; - - -} - -static ssize_t show_hue(struct device *dev, - struct device_attribute *attr, char *buf) -{ - - return 0; -} - -static ssize_t set_hue(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - struct fb_info *fbi = dev_get_drvdata(dev); - struct rk_lcdc_driver *dev_drv = - (struct rk_lcdc_driver *)fbi->par; - int ret,hue; - - ret = kstrtoint(buf, 0, &hue); - if (ret) - return ret; - - ret = dev_drv->ops->set_dsp_hue(dev_drv, hue); - if(ret < 0) - return ret; - - return count; -} - -static ssize_t show_dsp_bcs(struct device *dev, - struct device_attribute *attr, char *buf) -{ - - return 0; -} - -static ssize_t set_dsp_bcs(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - struct fb_info *fbi = dev_get_drvdata(dev); - struct rk_lcdc_driver *dev_drv = - (struct rk_lcdc_driver *)fbi->par; - int ret,bri,con,sat; - - ret = kstrtoint(buf, 0, &bri); - if (ret) - return ret; - - ret = dev_drv->ops->set_dsp_bcsh_bcs(dev_drv, bri,con,sat); - if(ret < 0) - return ret; - - return count; -} static struct device_attribute rkfb_attrs[] = { __ATTR(phys_addr, S_IRUGO, show_phys, NULL), @@ -382,9 +303,6 @@ static struct device_attribute rkfb_attrs[] = { __ATTR(fps, S_IRUGO | S_IWUSR, show_fps, set_fps), __ATTR(map, S_IRUGO | S_IWUSR, show_fb_win_map, set_fb_win_map), __ATTR(dsp_lut, S_IRUGO | S_IWUSR, show_dsp_lut, set_dsp_lut), - __ATTR(cabc, S_IRUGO | S_IWUSR, show_dsp_cabc, set_dsp_cabc), - __ATTR(hue, S_IRUGO | S_IWUSR, show_hue, set_hue), - __ATTR(bcs, S_IRUGO | S_IWUSR, show_dsp_bcs, set_dsp_bcs), }; int rkfb_create_sysfs(struct fb_info *fbi) diff --git a/include/linux/rk_fb.h b/include/linux/rk_fb.h index f711e1f500fd..bf77050fe6f9 100755 --- a/include/linux/rk_fb.h +++ b/include/linux/rk_fb.h @@ -25,16 +25,10 @@ #if defined(CONFIG_OF) #include #endif -#include "../../drivers/staging/android/sw_sync.h" -#include -#include - #define RK30_MAX_LCDC_SUPPORT 4 #define RK30_MAX_LAYER_SUPPORT 4 -#define RK_MAX_FB_SUPPORT 4 -#define RK_WIN_MAX_AREA 4 -#define RK_MAX_BUF_NUM 10 +#define RK_MAX_FB_SUPPORT 8 #define FB0_IOCTL_STOP_TIMER_FLUSH 0x6001 #define FB0_IOCTL_SET_PANEL 0x6002 @@ -67,9 +61,6 @@ #define RK_FBIOSET_VSYNC_ENABLE 0x4629 #define RK_FBIOPUT_NUM_BUFFERS 0x4625 #define RK_FBIOPUT_COLOR_KEY_CFG 0x4626 -#define RK_FBIOGET_DSP_ADDR 0x4630 -#define RK_FBIOGET_LIST_STAT 0X4631 - /**rk fb events**/ #define RK_LF_STATUS_FC 0xef @@ -158,7 +149,6 @@ enum { HAL_PIXEL_FORMAT_YCrCb_NV12 = 0x20, // YUY2 HAL_PIXEL_FORMAT_YCrCb_NV12_VIDEO = 0x21, // YUY2 HAL_PIXEL_FORMAT_YCrCb_444 = 0x22, //yuv444 - HAL_PIXEL_FORMAT_H265 = 0x23, //yuv444 }; @@ -183,17 +173,8 @@ enum fb_win_map_order { FB0_WIN0_FB1_WIN2_FB2_WIN1 = 120, FB0_WIN0_FB1_WIN1_FB2_WIN2 = 210, FB0_WIN1_FB1_WIN0_FB2_WIN2 = 201, - FB0_WIN0_FB1_WIN1_FB2_WIN2_FB3_WIN3 = 3210, -}; - -enum -{ - SCALE_NONE = 0x0, - SCALE_UP = 0x1, - SCALE_DOWN = 0x2 }; - struct rk_fb_rgb { struct fb_bitfield red; struct fb_bitfield green; @@ -243,15 +224,11 @@ typedef enum _TRSP_MODE { TRSP_INVAL } TRSP_MODE; -struct rk_lcdc_post_cfg{ - u32 xpos; - u32 ypos; - u32 xsize; - u32 ysize; -}; - -struct rk_lcdc_area{ - bool state; +struct rk_lcdc_win { + char name[5]; + int id; + bool state; /*on or off*/ + u32 pseudo_pal[16]; 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*/ @@ -264,68 +241,28 @@ struct rk_lcdc_area{ u16 yvir; unsigned long smem_start; unsigned long cbr_start; /*Cbr memory start address*/ + enum data_format format; #if defined(CONFIG_ION_ROCKCHIP) - struct ion_handle *ion_hdl; - int dma_buf_fd; + struct ion_handle *ion_hdl; + int dma_buf_fd; #endif + bool support_3d; + u32 scale_yrgb_x; + u32 scale_yrgb_y; + u32 scale_cbcr_x; + u32 scale_cbcr_y; u32 dsp_stx; u32 dsp_sty; - u32 y_vir_stride; - u32 uv_vir_stride; + u32 vir_stride; u32 y_addr; u32 uv_addr; - -}; - - -struct rk_lcdc_win { - char name[5]; - int id; - bool state; /*on or off*/ - u32 pseudo_pal[16]; - enum data_format format; - u8 z_order; /*win sel layer*/ u8 fmt_cfg; - u8 fmt_10;; u8 swap_rb; u32 reserved; - u32 area_num; - u32 scale_yrgb_x; - u32 scale_yrgb_y; - u32 scale_cbcr_x; - u32 scale_cbcr_y; - bool support_3d; - - u8 win_lb_mode; - - u8 bic_coe_el; - u8 yrgb_hor_scl_mode;//h 01:scale up ;10:down - u8 yrgb_ver_scl_mode;//v 01:scale up ;10:down - u8 yrgb_hsd_mode;//h scale down mode - u8 yrgb_vsu_mode;//v scale up mode - u8 yrgb_vsd_mode;//v scale down mode - u8 cbr_hor_scl_mode; - u8 cbr_ver_scl_mode; - u8 cbr_hsd_mode; - u8 cbr_vsu_mode; - u8 cbr_vsd_mode; - u8 vsd_yrgb_gt4; - u8 vsd_yrgb_gt2; - u8 vsd_cbr_gt4; - u8 vsd_cbr_gt2; - - u8 alpha_en; - u32 alpha_mode; - u32 g_alpha_val; - u32 color_key_val; - - struct rk_lcdc_area area[RK_WIN_MAX_AREA]; - struct rk_lcdc_post_cfg post_cfg; }; struct rk_lcdc_driver; - struct rk_lcdc_drv_ops { int (*open) (struct rk_lcdc_driver * dev_drv, int layer_id, bool open); int (*init_lcdc) (struct rk_lcdc_driver * dev_drv); @@ -355,90 +292,7 @@ struct rk_lcdc_drv_ops { int (*dpi_open) (struct rk_lcdc_driver * dev_drv, bool open); int (*dpi_win_sel) (struct rk_lcdc_driver * dev_drv, int layer_id); int (*dpi_status) (struct rk_lcdc_driver * dev_drv); - int (*get_dsp_addr)(struct rk_lcdc_driver * dev_drv,unsigned int *dsp_addr); - int (*set_dsp_cabc) (struct rk_lcdc_driver * dev_drv, int mode); - int (*set_dsp_hue) (struct rk_lcdc_driver *dev_drv,int hue); - int (*set_dsp_bcsh_bcs)(struct rk_lcdc_driver *dev_drv,int bri,int con,int sat); -}; - -struct rk_fb_area_par { - u16 ion_fd; - unsigned long phy_addr; - u16 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; -}; - - -struct rk_fb_win_par { - u8 data_format; /*layer data fmt*/ - u8 win_id; - u8 z_order; /*win sel layer*/ - struct rk_fb_area_par area_par[RK_WIN_MAX_AREA]; - u32 alpha_mode; - u32 g_alpha_val; -}; - -struct rk_fb_win_cfg_data { - u16 ret_fence_fd; - u16 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 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 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; - unsigned long smem_start; - unsigned long cbr_start; /*Cbr memory start address*/ - u32 line_length; -}; -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; - - 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; - 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 { @@ -448,9 +302,8 @@ struct rk_lcdc_driver { struct device *dev; struct rk_lcdc_win *win[RK_MAX_FB_SUPPORT]; - int lcdc_win_num; + int num_win; int num_buf; //the num_of buffer - int atv_layer_cnt; int fb_index_base; //the first fb index of the lcdc device struct rk_screen *screen0; //some platform have only one lcdc,but extend struct rk_screen *screen1; //two display devices for dual display,such as rk2918,rk2928 @@ -460,7 +313,6 @@ struct rk_lcdc_driver { char fb0_win_id; char fb1_win_id; char fb2_win_id; - char fb3_win_id; struct mutex fb_win_id_mutex; struct completion frame_done; //sync for pan_display,whe we set a new frame address to lcdc register,we must make sure the frame begain to display @@ -468,16 +320,7 @@ struct rk_lcdc_driver { int first_frame; struct rk_fb_vsync vsync_info; int wait_fs; //wait for new frame start in kernel - struct sw_sync_timeline *timeline; - int timeline_max; - int suspend_flag; - struct list_head update_regs_list; - struct mutex update_regs_list_lock; - struct kthread_worker update_regs_worker; - struct task_struct *update_regs_thread; - struct kthread_work update_regs_work; - - struct mutex output_lock; + struct rk29fb_info *screen_ctr_info; struct list_head pwrlist_head; struct rk_lcdc_drv_ops *ops; @@ -495,7 +338,7 @@ struct rk_lcdc_driver { struct rk_fb { int disp_mode; struct rk29fb_info *mach_info; - struct fb_info *fb[RK_MAX_FB_SUPPORT*2]; + struct fb_info *fb[RK_MAX_FB_SUPPORT]; int num_fb; struct rk_lcdc_driver *lcdc_dev_drv[RK30_MAX_LCDC_SUPPORT]; @@ -535,8 +378,6 @@ extern int rkfb_create_sysfs(struct fb_info *fbi); extern char *get_format_string(enum data_format, char *fmt); extern int support_uboot_display(void); extern int rk_fb_calc_fps(struct rk_screen * screen, u32 pixclock); -extern void rk_fd_fence_wait(struct rk_lcdc_driver *dev_drv, struct sync_fence *fence); -extern void rk_fb_free_dma_buf(struct rk_fb_reg_win_data *reg_win_data); #if defined(CONFIG_BACKLIGHT_RK29_BL) void rk29_backlight_set(bool on); diff --git a/include/linux/rk_screen.h b/include/linux/rk_screen.h index f03ab5ce2cc7..19e62306796f 100755 --- a/include/linux/rk_screen.h +++ b/include/linux/rk_screen.h @@ -61,12 +61,6 @@ struct rk_screen { u8 lcdc_id; u8 screen_id; struct fb_videomode mode; - u32 post_dsp_stx; - u32 post_dsp_sty; - u32 post_xsize; - u32 post_ysize; - u16 x_mirror; - u16 y_mirror; u16 width; u16 height; u8 ft; -- 2.34.1