summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlgea Cao <algea.cao@rock-chips.com>2018-03-19 09:58:19 +0800
committerTao Huang <huangtao@rock-chips.com>2018-03-20 20:50:19 +0800
commit6ad9ec862c1f8adc5f9191956084a68fbf331338 (patch)
treee5a25406a5140952f272e230ca7bdb001948de53
parentef6e3f4cef1e829633682e0abf11a6b4decd9bb9 (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.c51
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;