From ba01a34d91b3cc65484edea5930ac85c5ebf524d Mon Sep 17 00:00:00 2001 From: Dominik Sliwa Date: Thu, 6 Sep 2018 11:17:37 +0200 Subject: apalis-tk1: lvds: allow setting LVDS drive strength in dt Hardcoded value was used before. This allows setting drive strength values in the devicetree. Signed-off-by: Dominik Sliwa Acked-by: Marcel Ziswiler --- .../tegra124-apalis-displays.dtsi | 1 + .../tegra124-apalis-v1.2-displays.dtsi | 1 + arch/arm/mach-tegra/include/mach/dc.h | 1 + drivers/video/tegra/dc/of_dc.c | 25 ++++++++++++++++++++++ drivers/video/tegra/dc/sor.c | 8 ++++++- drivers/video/tegra/dc/sor.h | 1 + 6 files changed, 36 insertions(+), 1 deletion(-) diff --git a/arch/arm/boot/dts/tegra124-platforms/tegra124-apalis-displays.dtsi b/arch/arm/boot/dts/tegra124-platforms/tegra124-apalis-displays.dtsi index 0ef2503b7e77..211905e74ff2 100644 --- a/arch/arm/boot/dts/tegra124-platforms/tegra124-apalis-displays.dtsi +++ b/arch/arm/boot/dts/tegra124-platforms/tegra124-apalis-displays.dtsi @@ -13,6 +13,7 @@ lvds:lvds { status = "okay"; + lvds-drive-strength = <0x40 0x40 0x40 0x40>; display { status = "okay"; disp-default-out { diff --git a/arch/arm/boot/dts/tegra124-platforms/tegra124-apalis-v1.2-displays.dtsi b/arch/arm/boot/dts/tegra124-platforms/tegra124-apalis-v1.2-displays.dtsi index da0f82024ce0..3670e63a2033 100644 --- a/arch/arm/boot/dts/tegra124-platforms/tegra124-apalis-v1.2-displays.dtsi +++ b/arch/arm/boot/dts/tegra124-platforms/tegra124-apalis-v1.2-displays.dtsi @@ -13,6 +13,7 @@ lvds:lvds { status = "okay"; + lvds-drive-strength = <0x40 0x40 0x40 0x40>; display { status = "okay"; disp-default-out { diff --git a/arch/arm/mach-tegra/include/mach/dc.h b/arch/arm/mach-tegra/include/mach/dc.h index 880545833270..6eafba0101df 100644 --- a/arch/arm/mach-tegra/include/mach/dc.h +++ b/arch/arm/mach-tegra/include/mach/dc.h @@ -578,6 +578,7 @@ struct tegra_dc_out { struct tegra_hdmi_out *hdmi_out; struct tegra_dp_out *dp_out; struct tegra_stereo_out *stereo; + u32 lvds_drive_strength; unsigned height; /* mm */ unsigned width; /* mm */ diff --git a/drivers/video/tegra/dc/of_dc.c b/drivers/video/tegra/dc/of_dc.c index aed0fda91299..4e071cf9f139 100644 --- a/drivers/video/tegra/dc/of_dc.c +++ b/drivers/video/tegra/dc/of_dc.c @@ -246,6 +246,29 @@ parse_tmds_fail: return -EINVAL; } +static u32 parse_dt_lvds_drive_strength(struct device_node *np) +{ + u32 temp[4]; + u32 drive_strength = 0; + + if(of_property_read_u32_array(np, "lvds-drive-strength", + temp, 4)) { + OF_DC_LOG("No lvds-drive-strength entry\n"); + return 0; + } + + for (int i = 0; i < 4;i++) { + if (temp[i] < 0x100) { + drive_strength += (temp[i] << i*8); + } else { + OF_DC_LOG("Invalid LVDS driver strength for lane %d\n", i); + return 0; + } + } + + return drive_strength; +} + static int parse_dt_lt(struct device_node *np, u8 *addr) { @@ -1803,6 +1826,8 @@ struct tegra_dc_platform_data pr_err("lvds/display node is NOT valid\n"); goto fail_parse; } + pdata->default_out->lvds_drive_strength = + parse_dt_lvds_drive_strength(np_target_disp); pdata->default_out->enable = dc_lvds_enable; pdata->default_out->disable = dc_lvds_disable; diff --git a/drivers/video/tegra/dc/sor.c b/drivers/video/tegra/dc/sor.c index 5fee008d122a..f80d9e8f7ac0 100644 --- a/drivers/video/tegra/dc/sor.c +++ b/drivers/video/tegra/dc/sor.c @@ -1277,8 +1277,14 @@ void tegra_dc_sor_enable_lvds(struct tegra_dc_sor_data *sor, reg_val |= (NV_SOR_LVDS_PD_TXDA_3_DISABLE); tegra_sor_writel(sor, NV_SOR_LVDS, reg_val); - tegra_sor_writel(sor, NV_SOR_LANE_DRIVE_CURRENT(sor->portnum), + if (sor->dc->pdata->default_out->lvds_drive_strength > 0 ) { + tegra_sor_writel(sor, NV_SOR_LANE_DRIVE_CURRENT(sor->portnum), + sor->dc->pdata->default_out->lvds_drive_strength); + } else { + tegra_sor_writel(sor, NV_SOR_LANE_DRIVE_CURRENT(sor->portnum), 0x40404040); + } + if (!conforming && (sor->dc->pdata->default_out->depth == 24)) { tegra_sor_write_field(sor, NV_SOR_LVDS, NV_SOR_LVDS_ROTDAT_DEFAULT_MASK, diff --git a/drivers/video/tegra/dc/sor.h b/drivers/video/tegra/dc/sor.h index 261716950372..e7282d2fd36b 100644 --- a/drivers/video/tegra/dc/sor.h +++ b/drivers/video/tegra/dc/sor.h @@ -93,6 +93,7 @@ struct tegra_dc_sor_data { u8 portnum; /* 0 or 1 */ const struct tegra_dc_dp_link_config *link_cfg; + u32 lvds_drive_strength; bool power_is_up; -- cgit v1.2.3