return 0;
}
-static int rk3368_lcdc_area_swap(struct rk_lcdc_win *win, int area_num)
+static int __maybe_unused
+ rk3368_lcdc_area_swap(struct rk_lcdc_win *win, int area_num)
{
struct rk_lcdc_win_area area_temp;
mb_w_size = 16;
break;
case VOP_FORMAT_RGB565:
- mb_w_size = 32;
fbdc_dsp_width_ratio = 1;
+ mb_w_size = 32;
break;
default:
dev_err(lcdc_dev->dev,
struct lcdc_device *lcdc_dev =
container_of(dev_drv, struct lcdc_device, driver);
struct rk_lcdc_win *win = dev_drv->win[win_id];
- struct rk_screen *screen = dev_drv->cur_screen;
unsigned int mask, val, off;
off = (win_id - 2) * 0x50;
rk3368_lcdc_area_xst(win, win->area_num);
- if (((screen->y_mirror == 1) || (win->mirror_en)) &&
- (win->area_num > 1)) {
- rk3368_lcdc_area_swap(win, win->area_num);
- }
if (win->state == 1) {
rk3368_lcdc_csc_mode(lcdc_dev, win);
static struct lcdc_cabc_mode cabc_mode[4] = {
/* pixel_num,8 stage_up, stage_down */
- {5, 148, 20, 300}, /*mode 1 */
- {10, 148, 20, 300}, /*mode 2 */
- {15, 148, 20, 300}, /*mode 3 */
- {20, 148, 20, 300}, /*mode 4 */
+ {5, 282, 171, 300}, /*mode 1 */
+ {10, 282, 171, 300}, /*mode 2 */
+ {15, 282, 171, 300}, /*mode 3 */
+ {20, 282, 171, 300}, /*mode 4 */
};
static int rk3368_lcdc_set_dsp_cabc(struct rk_lcdc_driver *dev_drv, int mode)
u32 pixel_num, global_su;
u32 stage_up_rec, stage_down_rec, global_su_rec;
u32 mask = 0, val = 0, cabc_en = 0;
- u32 __maybe_unused max_mode_num =
- sizeof(cabc_mode) / sizeof(struct lcdc_cabc_mode);
dev_drv->cabc_mode = mode;
-#if 0/*ndef CONFIG_RK_FPGA*/
- /* iomux connect to vop or pwm */
- if (mode == 0) {
- DBG(3, "close cabc and select rk pwm\n");
- val = 0x30002;
- writel_relaxed(val, RK_GRF_VIRT + rk3368_GRF_GPIO3C_IOMUX);
- cabc_en = 0;
- } else if (mode > 0 && mode <= max_mode_num) {
- DBG(3, "open cabc and select vop pwm\n");
- val = 0x30003;
- writel_relaxed(val, RK_GRF_VIRT + rk3368_GRF_GPIO3C_IOMUX);
- cabc_en = 1;
- } else if (mode > 0x10 && mode <= (max_mode_num + 0x10)) {
- DBG(3, "open cabc and select rk pwm\n");
- val = 0x30003;
- writel_relaxed(val, RK_GRF_VIRT + rk3368_GRF_GPIO3C_IOMUX);
- cabc_en = 1;
- mode -= 0x10;
- } else if (mode == 0xff) {
- DBG(3, "close cabc and select vop pwm\n");
- val = 0x30002;
- writel_relaxed(val, RK_GRF_VIRT + rk3368_GRF_GPIO3C_IOMUX);
- cabc_en = 0;
- } else {
- dev_err(lcdc_dev->dev, "invalid cabc mode value:%d", mode);
- return 0;
- }
-#endif
+ cabc_en = (mode > 0) ? 1 : 0;
+
if (cabc_en == 0) {
spin_lock(&lcdc_dev->reg_lock);
if (lcdc_dev->clk_on) {
spin_lock(&lcdc_dev->reg_lock);
if (lcdc_dev->clk_on) {
- mask = m_CABC_CALC_PIXEL_NUM;
- val = v_CABC_CALC_PIXEL_NUM(calc_pixel);
+ mask = m_CABC_CALC_PIXEL_NUM | m_CABC_EN;
+ val = v_CABC_CALC_PIXEL_NUM(calc_pixel) |
+ v_CABC_EN(cabc_en);
lcdc_msk_reg(lcdc_dev, CABC_CTRL0, mask, val);
- mask = m_CABC_TOTAL_PIXEL_NUM;
- val = v_CABC_TOTAL_PIXEL_NUM(total_pixel);
+ mask = m_CABC_TOTAL_PIXEL_NUM | m_CABC_LUT_EN;
+ val = v_CABC_TOTAL_PIXEL_NUM(total_pixel) | v_CABC_LUT_EN(0);
lcdc_msk_reg(lcdc_dev, CABC_CTRL1, mask, val);
mask = m_CABC_STAGE_UP | m_CABC_STAGE_UP_REC |
}
/* x y mirror ,jump line */
- if (screen->y_mirror == 1) {
+ if ((screen->y_mirror == 1) ||
+ (win->mirror_en == 1)) {
if (screen->interlace == 1) {
win->area[0].y_offset = yoffset * stride * 2 +
((win->area[0].yact - 1) * 2 + 1) * stride +
}
}
if (is_pic_yuv == 1) {
- if (screen->y_mirror == 1) {
+ if ((screen->y_mirror == 1) ||
+ (win->mirror_en == 1)) {
if (screen->interlace == 1) {
win->area[0].c_offset =
uv_y_off * uv_stride * 2 +
break;
}
- /* x y mirror ,jump line */
- if (screen->y_mirror == 1) {
- if (screen->interlace == 1) {
- win->area[0].y_offset = yoffset * stride * 2 +
- ((win->area[0].yact - 1) * 2 + 1) * stride +
- xoffset * pixel_width / 8;
- } else {
- win->area[0].y_offset = yoffset * stride +
- (win->area[0].yact - 1) * stride +
- xoffset * pixel_width / 8;
- }
- } else {
- if (screen->interlace == 1) {
- win->area[0].y_offset =
- yoffset * stride * 2 + xoffset * pixel_width / 8;
- } else {
- win->area[0].y_offset =
- yoffset * stride + xoffset * pixel_width / 8;
- }
- }
- if (is_pic_yuv == 1) {
- if (screen->y_mirror == 1) {
- if (screen->interlace == 1) {
- win->area[0].c_offset =
- uv_y_off * uv_stride * 2 +
- ((uv_y_act - 1) * 2 + 1) * uv_stride +
- uv_x_off * pixel_width / 8;
- } else {
- win->area[0].c_offset = uv_y_off * uv_stride +
- (uv_y_act - 1) * uv_stride +
- uv_x_off * pixel_width / 8;
- }
- } else {
- if (screen->interlace == 1) {
- win->area[0].c_offset =
- uv_y_off * uv_stride * 2 +
- uv_x_off * pixel_width / 8;
- } else {
- win->area[0].c_offset =
- uv_y_off * uv_stride +
- uv_x_off * pixel_width / 8;
- }
- }
- }
-
win->area[0].format = fb_data_fmt;
win->area[0].y_vir_stride = stride >> 2;
win->area[0].uv_vir_stride = uv_stride >> 2;
dev_drv->ops->backlight_close(dev_drv, 1);
if (dev_drv->ops->dsp_black)
dev_drv->ops->dsp_black(dev_drv, 1);
- if (dev_drv->ops->set_screen_scaler)
+ if ((dev_drv->ops->set_screen_scaler) &&
+ (rk_fb->disp_policy != DISPLAY_POLICY_BOX))
dev_drv->ops->set_screen_scaler(dev_drv,
dev_drv->screen0, 0);
}
}
hdmi_switch_complete = 1;
if ((rk_fb->disp_mode == ONE_DUAL) || (rk_fb->disp_mode == NO_DUAL)) {
- if (dev_drv->ops->set_screen_scaler)
+ if ((dev_drv->ops->set_screen_scaler) &&
+ (rk_fb->disp_policy != DISPLAY_POLICY_BOX))
dev_drv->ops->set_screen_scaler(dev_drv, dev_drv->screen0, 1);
if (dev_drv->ops->dsp_black)
dev_drv->ops->dsp_black(dev_drv, 0);