diff options
author | Algea Cao <algea.cao@rock-chips.com> | 2018-03-19 09:58:19 +0800 |
---|---|---|
committer | Tao Huang <huangtao@rock-chips.com> | 2018-03-20 20:50:19 +0800 |
commit | 6ad9ec862c1f8adc5f9191956084a68fbf331338 (patch) | |
tree | e5a25406a5140952f272e230ca7bdb001948de53 | |
parent | ef6e3f4cef1e829633682e0abf11a6b4decd9bb9 (diff) |
drm/rockchip: tve: get vdac adjust value from efuse
Change-Id: Idf50443557cfc73fb47613027785bbf88e49f567
Signed-off-by: Algea Cao <algea.cao@rock-chips.com>
-rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_tve.c | 51 |
1 files changed, 40 insertions, 11 deletions
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_tve.c b/drivers/gpu/drm/rockchip/rockchip_drm_tve.c index 23eb02585614..e6df0e1d321c 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_tve.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_tve.c @@ -4,6 +4,7 @@ #include <linux/err.h> #include <linux/hdmi.h> #include <linux/mutex.h> +#include <linux/nvmem-consumer.h> #include <linux/of_device.h> #include <linux/pm_runtime.h> @@ -18,6 +19,8 @@ #include "rockchip_drm_tve.h" #include "rockchip_drm_vop.h" +#define RK322X_VDAC_STANDARD 0x15 + static const struct drm_display_mode cvbs_mode[] = { { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED, 13500, 720, 753, @@ -320,43 +323,69 @@ rockchip_tve_encoder_helper_funcs = { static int tve_parse_dt(struct device_node *np, struct rockchip_tve *tve) { - int ret; - u32 val; + int ret, val; + u32 getdac = 0; + size_t len; + struct nvmem_cell *cell; + unsigned char *efuse_buf; ret = of_property_read_u32(np, "rockchip,saturation", &val); - if ((val == 0) || (ret < 0)) + if (val == 0 || ret < 0) return -EINVAL; tve->saturation = val; ret = of_property_read_u32(np, "rockchip,brightcontrast", &val); - if ((val == 0) || (ret < 0)) + if (val == 0 || ret < 0) return -EINVAL; tve->brightcontrast = val; ret = of_property_read_u32(np, "rockchip,adjtiming", &val); - if ((val == 0) || (ret < 0)) + if (val == 0 || ret < 0) return -EINVAL; tve->adjtiming = val; ret = of_property_read_u32(np, "rockchip,lumafilter0", &val); - if ((val == 0) || (ret < 0)) + if (val == 0 || ret < 0) return -EINVAL; tve->lumafilter0 = val; ret = of_property_read_u32(np, "rockchip,lumafilter1", &val); - if ((val == 0) || (ret < 0)) + if (val == 0 || ret < 0) return -EINVAL; tve->lumafilter1 = val; ret = of_property_read_u32(np, "rockchip,lumafilter2", &val); - if ((val == 0) || (ret < 0)) + if (val == 0 || ret < 0) return -EINVAL; tve->lumafilter2 = val; ret = of_property_read_u32(np, "rockchip,daclevel", &val); - if ((val == 0) || (ret < 0)) + if (val == 0 || ret < 0) { return -EINVAL; - tve->daclevel = val; + } else { + tve->daclevel = val; + cell = nvmem_cell_get(tve->dev, "tve_dac_adj"); + if (IS_ERR(cell)) { + dev_dbg(tve->dev, + "failed to get id cell: %ld\n", PTR_ERR(cell)); + } else { + efuse_buf = nvmem_cell_read(cell, &len); + nvmem_cell_put(cell); + if (len == 1) + getdac = efuse_buf[0]; + kfree(efuse_buf); + + if (getdac > 0) { + tve->daclevel = + getdac + 5 + val - RK322X_VDAC_STANDARD; + if (tve->daclevel > 0x3f) { + dev_err(tve->dev, + "rk322x daclevel error!\n"); + tve->daclevel = val; + } + } + } + } ret = of_property_read_u32(np, "rockchip,dac1level", &val); if ((val == 0) || (ret < 0)) @@ -428,6 +457,7 @@ static int rockchip_tve_bind(struct device *dev, struct device *master, return -EINVAL; } + tve->dev = &pdev->dev; if (!strcmp(match->compatible, "rockchip,rk3328-tve")) { tve->inputformat = INPUT_FORMAT_YUV; } else { @@ -443,7 +473,6 @@ static int rockchip_tve_bind(struct device *dev, struct device *master, tve->enable = 0; platform_set_drvdata(pdev, tve); - tve->dev = &pdev->dev; tve->drm_dev = drm_dev; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); tve->reg_phy_base = res->start; |