From 163a7283e7fbd1da3b9b45dbbc7e241078314773 Mon Sep 17 00:00:00 2001 From: hjc Date: Wed, 4 Mar 2015 15:25:26 +0800 Subject: [PATCH] rk3368 lcdc: add support overscan Signed-off-by: hjc --- drivers/video/rockchip/lcdc/rk3368_lcdc.c | 23 ++++++++---- drivers/video/rockchip/rkfb_sysfs.c | 44 +++++++++++------------ 2 files changed, 37 insertions(+), 30 deletions(-) mode change 100644 => 100755 drivers/video/rockchip/rkfb_sysfs.c diff --git a/drivers/video/rockchip/lcdc/rk3368_lcdc.c b/drivers/video/rockchip/lcdc/rk3368_lcdc.c index 17b5f01191d1..16c5bed990d7 100755 --- a/drivers/video/rockchip/lcdc/rk3368_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk3368_lcdc.c @@ -483,6 +483,13 @@ static int rk3368_lcdc_post_cfg(struct rk_lcdc_driver *dev_drv) u16 post_dsp_vact_st_f1, post_dsp_vact_end_f1; u16 post_h_fac, post_v_fac; + screen->post_dsp_stx = x_res * (100 - dev_drv->overscan.left) / 200; + screen->post_dsp_sty = y_res * (100 - dev_drv->overscan.top) / 200; + screen->post_xsize = x_res * + (dev_drv->overscan.left + dev_drv->overscan.right) / 200; + screen->post_ysize = y_res * + (dev_drv->overscan.top + dev_drv->overscan.bottom) / 200; + h_total = screen->mode.hsync_len + screen->mode.left_margin + x_res + screen->mode.right_margin; v_total = screen->mode.vsync_len + screen->mode.upper_margin + @@ -1486,13 +1493,6 @@ static int rk3368_config_timing(struct rk_lcdc_driver *dev_drv) h_total = hsync_len + left_margin + x_res + right_margin; v_total = vsync_len + upper_margin + y_res + lower_margin; - screen->post_dsp_stx = x_res * (100 - screen->overscan.left) / 200; - screen->post_dsp_sty = y_res * (100 - screen->overscan.top) / 200; - screen->post_xsize = x_res * - (screen->overscan.left + screen->overscan.right) / 200; - screen->post_ysize = y_res * - (screen->overscan.top + screen->overscan.bottom) / 200; - mask = m_DSP_HS_PW | m_DSP_HTOTAL; val = v_DSP_HS_PW(hsync_len) | v_DSP_HTOTAL(h_total); lcdc_msk_reg(lcdc_dev, DSP_HTOTAL_HS_END, mask, val); @@ -4196,6 +4196,14 @@ static int rk3368_lcdc_backlight_close(struct rk_lcdc_driver *dev_drv, return 0; } +static int rk3368_lcdc_set_overscan(struct rk_lcdc_driver *dev_drv, + struct overscan *overscan) +{ + rk3368_lcdc_post_cfg(dev_drv); + + return 0; +} + static struct rk_lcdc_drv_ops lcdc_drv_ops = { .open = rk3368_lcdc_open, .win_direct_en = rk3368_lcdc_win_direct_en, @@ -4235,6 +4243,7 @@ static struct rk_lcdc_drv_ops lcdc_drv_ops = { .dsp_black = rk3368_lcdc_dsp_black, .backlight_close = rk3368_lcdc_backlight_close, .mmu_en = rk3368_lcdc_mmu_en, + .set_overscan = rk3368_lcdc_set_overscan, }; #ifdef LCDC_IRQ_EMPTY_DEBUG diff --git a/drivers/video/rockchip/rkfb_sysfs.c b/drivers/video/rockchip/rkfb_sysfs.c old mode 100644 new mode 100755 index 0a18f27cdb58..a6a2f61b8771 --- a/drivers/video/rockchip/rkfb_sysfs.c +++ b/drivers/video/rockchip/rkfb_sysfs.c @@ -732,14 +732,13 @@ static ssize_t show_scale(struct device *dev, struct fb_info *fbi = dev_get_drvdata(dev); struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par; struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv; - struct rk_screen *screen = dev_drv->cur_screen; return snprintf(buf, PAGE_SIZE, "xscale=%d yscale=%d\nleft=%d top=%d right=%d bottom=%d\n", - (screen->overscan.left + screen->overscan.right)/2, - (screen->overscan.top + screen->overscan.bottom)/2, - screen->overscan.left, screen->overscan.top, - screen->overscan.right, screen->overscan.bottom); + (dev_drv->overscan.left + dev_drv->overscan.right) / 2, + (dev_drv->overscan.top + dev_drv->overscan.bottom) / 2, + dev_drv->overscan.left, dev_drv->overscan.top, + dev_drv->overscan.right, dev_drv->overscan.bottom); } static ssize_t set_scale(struct device *dev, struct device_attribute *attr, @@ -748,60 +747,59 @@ static ssize_t set_scale(struct device *dev, struct device_attribute *attr, struct fb_info *fbi = dev_get_drvdata(dev); struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par; struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv; - struct rk_screen *screen = dev_drv->cur_screen; u32 left, top, right, bottom; if (!strncmp(buf, "overscan", 8)) { sscanf(buf, "overscan %d,%d,%d,%d", &left, &top, &right, &bottom); if (left > 0 && left <= 100) - screen->overscan.left = left; + dev_drv->overscan.left = left; if (top > 0 && top <= 100) - screen->overscan.top = top; + dev_drv->overscan.top = top; if (right > 0 && right <= 100) - screen->overscan.right = right; + dev_drv->overscan.right = right; if (bottom > 0 && bottom <= 100) - screen->overscan.bottom = bottom; + dev_drv->overscan.bottom = bottom; } else if (!strncmp(buf, "left", 4)) { sscanf(buf, "left=%d", &left); if (left > 0 && left <= 100) - screen->overscan.left = left; + dev_drv->overscan.left = left; } else if (!strncmp(buf, "top", 3)) { sscanf(buf, "top=%d", &top); if (top > 0 && top <= 100) - screen->overscan.top = top; + dev_drv->overscan.top = top; } else if (!strncmp(buf, "right", 5)) { sscanf(buf, "right=%d", &right); if (right > 0 && right <= 100) - screen->overscan.right = right; + dev_drv->overscan.right = right; } else if (!strncmp(buf, "bottom", 6)) { sscanf(buf, "bottom=%d", &bottom); if (bottom > 0 && bottom <= 100) - screen->overscan.bottom = bottom; + dev_drv->overscan.bottom = bottom; } else if (!strncmp(buf, "xscale", 6)) { sscanf(buf, "xscale=%d", &left); if (left > 0 && left <= 100) { - screen->overscan.left = left; - screen->overscan.right = left; + dev_drv->overscan.left = left; + dev_drv->overscan.right = left; } } else if (!strncmp(buf, "yscale", 6)) { sscanf(buf, "yscale=%d", &left); if (left > 0 && left <= 100) { - screen->overscan.top = left; - screen->overscan.bottom = left; + dev_drv->overscan.top = left; + dev_drv->overscan.bottom = left; } } else { sscanf(buf, "%d", &left); if (left > 0 && left <= 100) { - screen->overscan.left = left; - screen->overscan.right = left; - screen->overscan.top = left; - screen->overscan.bottom = left; + dev_drv->overscan.left = left; + dev_drv->overscan.right = left; + dev_drv->overscan.top = left; + dev_drv->overscan.bottom = left; } } if (dev_drv->ops->set_overscan) - dev_drv->ops->set_overscan(dev_drv, &screen->overscan); + dev_drv->ops->set_overscan(dev_drv, &dev_drv->overscan); return count; } -- 2.34.1