From 8a387fc0ab71bb084696ebb3298084cb5d569362 Mon Sep 17 00:00:00 2001 From: zwl Date: Tue, 26 Aug 2014 08:51:00 +0800 Subject: [PATCH] rk3288:lcdc: add support set default bcsh value which read from dts when open lcdc --- drivers/video/rockchip/lcdc/rk3288_lcdc.c | 80 +++++++++++++++++++++-- include/linux/rk_fb.h | 10 +++ 2 files changed, 83 insertions(+), 7 deletions(-) diff --git a/drivers/video/rockchip/lcdc/rk3288_lcdc.c b/drivers/video/rockchip/lcdc/rk3288_lcdc.c index 6cbcbaaa658b..cfc6e7c83ea4 100755 --- a/drivers/video/rockchip/lcdc/rk3288_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk3288_lcdc.c @@ -48,6 +48,9 @@ module_param(dbg_thresd, int, S_IRUGO | S_IWUSR); if (unlikely(dbg_thresd >= level)) \ printk(KERN_INFO x); } while (0) +static int rk3288_lcdc_set_bcsh(struct rk_lcdc_driver *dev_drv, + bool enable); + /*#define WAIT_FOR_SYNC 1*/ static int rk3288_lcdc_get_id(u32 phy_base) @@ -1325,6 +1328,8 @@ static int rk3288_lcdc_open(struct rk_lcdc_driver *dev_drv, int win_id, } else { rk3288_load_screen(dev_drv, 1); } + if (dev_drv->bcsh.enable) + rk3288_lcdc_set_bcsh(dev_drv, 1); spin_lock(&lcdc_dev->reg_lock); if (dev_drv->cur_screen->dsp_lut) rk3288_lcdc_set_lut(dev_drv); @@ -3386,6 +3391,37 @@ static int rk3288_lcdc_open_bcsh(struct rk_lcdc_driver *dev_drv, bool open) return 0; } +static int rk3288_lcdc_set_bcsh(struct rk_lcdc_driver *dev_drv, + bool enable) +{ + if (!enable || !dev_drv->bcsh.enable) { + rk3288_lcdc_open_bcsh(dev_drv, false); + return 0; + } + + if (dev_drv->bcsh.brightness <= 255 || + dev_drv->bcsh.contrast <= 510 || + dev_drv->bcsh.sat_con <= 1015 || + (dev_drv->bcsh.sin_hue <= 511 && dev_drv->bcsh.cos_hue <= 511)) { + rk3288_lcdc_open_bcsh(dev_drv, true); + if (dev_drv->bcsh.brightness <= 255) + rk3288_lcdc_set_bcsh_bcs(dev_drv, BRIGHTNESS, + dev_drv->bcsh.brightness); + if (dev_drv->bcsh.contrast <= 510) + rk3288_lcdc_set_bcsh_bcs(dev_drv, CONTRAST, + dev_drv->bcsh.contrast); + if (dev_drv->bcsh.sat_con <= 1015) + rk3288_lcdc_set_bcsh_bcs(dev_drv, SAT_CON, + dev_drv->bcsh.sat_con); + if (dev_drv->bcsh.sin_hue <= 511 && + dev_drv->bcsh.cos_hue <= 511) + rk3288_lcdc_set_bcsh_hue(dev_drv, + dev_drv->bcsh.sin_hue, + dev_drv->bcsh.cos_hue); + } + return 0; +} + static struct rk_lcdc_win lcdc_win[] = { [0] = { .name = "win0", @@ -3546,6 +3582,7 @@ static int rk3288_lcdc_resume(struct platform_device *pdev) static int rk3288_lcdc_parse_dt(struct lcdc_device *lcdc_dev) { struct device_node *np = lcdc_dev->dev->of_node; + struct rk_lcdc_driver *dev_drv = &lcdc_dev->driver; int val; if (of_property_read_u32(np, "rockchip,prop", &val)) @@ -3554,26 +3591,55 @@ static int rk3288_lcdc_parse_dt(struct lcdc_device *lcdc_dev) lcdc_dev->prop = val; if (of_property_read_u32(np, "rockchip,mirror", &val)) - lcdc_dev->driver.rotate_mode = NO_MIRROR; + dev_drv->rotate_mode = NO_MIRROR; else - lcdc_dev->driver.rotate_mode = val; + dev_drv->rotate_mode = val; if (of_property_read_u32(np, "rockchip,cabc_mode", &val)) - lcdc_dev->driver.cabc_mode = 0; /* default set close cabc */ + dev_drv->cabc_mode = 0; /* default set close cabc */ else - lcdc_dev->driver.cabc_mode = val; + dev_drv->cabc_mode = val; if (of_property_read_u32(np, "rockchip,pwr18", &val)) lcdc_dev->pwr18 = false; /*default set it as 3.xv power supply */ else lcdc_dev->pwr18 = (val ? true : false); + + if (of_property_read_u32(np, "rockchip,bcsh-en", &val)) + dev_drv->bcsh.enable = false; + else + dev_drv->bcsh.enable = (val ? true : false); + + if (of_property_read_u32(np, "rockchip,brightness", &val)) + dev_drv->bcsh.brightness = 0xffff; + else + dev_drv->bcsh.brightness = val; + + if (of_property_read_u32(np, "rockchip,contrast", &val)) + dev_drv->bcsh.contrast = 0xffff; + else + dev_drv->bcsh.contrast = val; + + if (of_property_read_u32(np, "rockchip,sat-con", &val)) + dev_drv->bcsh.sat_con = 0xffff; + else + dev_drv->bcsh.sat_con = val; + + if (of_property_read_u32(np, "rockchip,hue", &val)) { + dev_drv->bcsh.sin_hue = 0xffff; + dev_drv->bcsh.cos_hue = 0xffff; + } else { + dev_drv->bcsh.sin_hue = val & 0xff; + dev_drv->bcsh.cos_hue = (val >> 8) & 0xff; + } + #if defined(CONFIG_ROCKCHIP_IOMMU) if (of_property_read_u32(np, "rockchip,iommu-enabled", &val)) - lcdc_dev->driver.iommu_enabled = 0; + dev_drv->iommu_enabled = 0; else - lcdc_dev->driver.iommu_enabled = val; + dev_drv->iommu_enabled = val; #else - lcdc_dev->driver.iommu_enabled = 0; + dev_drv->iommu_enabled = 0; #endif return 0; } diff --git a/include/linux/rk_fb.h b/include/linux/rk_fb.h index 44b581dbca1e..f86ffbbbb0cc 100755 --- a/include/linux/rk_fb.h +++ b/include/linux/rk_fb.h @@ -310,6 +310,15 @@ struct rk_lcdc_post_cfg{ u32 ysize; }; +struct rk_lcdc_bcsh { + bool enable; + u16 brightness; + u16 contrast; + u16 sat_con; + u16 sin_hue; + u16 cos_hue; +}; + struct rk_lcdc_win_area{ bool state; u32 y_offset; /*yuv/rgb offset -->LCDC_WINx_YRGB_MSTx*/ @@ -589,6 +598,7 @@ struct rk_lcdc_driver { void (*irq_call_back)(struct rk_lcdc_driver *driver); #endif struct overscan overscan; + struct rk_lcdc_bcsh bcsh; }; /*disp_mode: dual display mode -- 2.34.1