summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Sliwa <dominik.sliwa@toradex.com>2018-11-16 16:25:42 +0100
committerMarcel Ziswiler <marcel.ziswiler@toradex.com>2018-11-29 10:35:26 +0100
commitd41e30fc1d8d1e35eb3abfa0e60084cd93624735 (patch)
tree00093ceb27438b9377970c6705c1586bc1598e3e
parent364dc45a769467959e48df215a55677d6f8f01e3 (diff)
apalis-tk1: lvds: fix dts and allow setting lane4 drive strength
Previously, lvds-drive-strength was located in a wrong node and there was no control of the 5th lane. Signed-off-by: Dominik Sliwa <dominik.sliwa@toradex.com> Acked-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
-rw-r--r--arch/arm/boot/dts/tegra124-platforms/tegra124-apalis-displays.dtsi2
-rw-r--r--arch/arm/boot/dts/tegra124-platforms/tegra124-apalis-v1.2-displays.dtsi2
-rw-r--r--arch/arm/mach-tegra/include/mach/dc.h3
-rw-r--r--drivers/video/tegra/dc/of_dc.c25
-rw-r--r--drivers/video/tegra/dc/sor.c10
5 files changed, 26 insertions, 16 deletions
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 211905e74ff2..05079c6596ae 100644
--- a/arch/arm/boot/dts/tegra124-platforms/tegra124-apalis-displays.dtsi
+++ b/arch/arm/boot/dts/tegra124-platforms/tegra124-apalis-displays.dtsi
@@ -13,9 +13,9 @@
lvds:lvds {
status = "okay";
- lvds-drive-strength = <0x40 0x40 0x40 0x40>;
display {
status = "okay";
+ lvds-drive-strength = <0x40 0x40 0x40 0x40 0x40>;
disp-default-out {
status = "okay";
nvidia,out-type = <TEGRA_DC_OUT_LVDS>;
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 3670e63a2033..7c0b13363183 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,9 +13,9 @@
lvds:lvds {
status = "okay";
- lvds-drive-strength = <0x40 0x40 0x40 0x40>;
display {
status = "okay";
+ lvds-drive-strength = <0x40 0x40 0x40 0x40 0x40>;
disp-default-out {
status = "okay";
nvidia,out-type = <TEGRA_DC_OUT_LVDS>;
diff --git a/arch/arm/mach-tegra/include/mach/dc.h b/arch/arm/mach-tegra/include/mach/dc.h
index 6eafba0101df..6c98a2d3b68d 100644
--- a/arch/arm/mach-tegra/include/mach/dc.h
+++ b/arch/arm/mach-tegra/include/mach/dc.h
@@ -578,7 +578,8 @@ 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;
+ u32 lvds_lane_drive_str;
+ u8 lvds_lane4_drive_str;
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 4e071cf9f139..57ebf761531d 100644
--- a/drivers/video/tegra/dc/of_dc.c
+++ b/drivers/video/tegra/dc/of_dc.c
@@ -144,7 +144,7 @@ static int parse_dc_out_type(struct device_node *np,
struct tegra_dc_out *default_out)
{
int out_type;
-
+
out_type = out_type_from_pn(
of_get_child_by_name(np, "display"));
if (out_type >= 0) {
@@ -246,20 +246,20 @@ parse_tmds_fail:
return -EINVAL;
}
-static u32 parse_dt_lvds_drive_strength(struct device_node *np)
+static u64 parse_dt_lvds_drive_strength(struct device_node *np)
{
- u32 temp[4];
- u32 drive_strength = 0;
+ u32 temp[5];
+ u64 drive_strength = 0;
if(of_property_read_u32_array(np, "lvds-drive-strength",
- temp, 4)) {
+ temp, 5)) {
OF_DC_LOG("No lvds-drive-strength entry\n");
return 0;
}
- for (int i = 0; i < 4;i++) {
+ for (int i = 0; i < 5;i++) {
if (temp[i] < 0x100) {
- drive_strength += (temp[i] << i*8);
+ drive_strength += ((u64)temp[i] << i*8);
} else {
OF_DC_LOG("Invalid LVDS driver strength for lane %d\n", i);
return 0;
@@ -1732,9 +1732,9 @@ struct tegra_dc_platform_data
* what out type of display is used for
* current dc id.
*/
-
+
dc_connection = of_parse_phandle(np, "nvidia,dc-connection", 0);
-
+
if (dc_connection == NULL) {
pr_err("no nvidia,dc-connection\n");
goto fail_parse;
@@ -1819,6 +1819,7 @@ struct tegra_dc_platform_data
if (err)
goto fail_parse;
} else if (pdata->default_out->type == TEGRA_DC_OUT_LVDS) {
+ u64 lvds_ds;
np_target_disp =
of_get_child_by_name(dc_connection, "display");
if (!np_target_disp ||
@@ -1826,8 +1827,10 @@ 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);
+ lvds_ds = parse_dt_lvds_drive_strength(np_target_disp);
+ pdata->default_out->lvds_lane_drive_str = lvds_ds & 0xFFFFFFFF;
+ pdata->default_out->lvds_lane4_drive_str = (lvds_ds >> 32)
+ & 0xFF;
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 f80d9e8f7ac0..77cbcbd72441 100644
--- a/drivers/video/tegra/dc/sor.c
+++ b/drivers/video/tegra/dc/sor.c
@@ -1277,9 +1277,9 @@ 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);
- if (sor->dc->pdata->default_out->lvds_drive_strength > 0 ) {
+ if (sor->dc->pdata->default_out->lvds_lane_drive_str > 0 ) {
tegra_sor_writel(sor, NV_SOR_LANE_DRIVE_CURRENT(sor->portnum),
- sor->dc->pdata->default_out->lvds_drive_strength);
+ sor->dc->pdata->default_out->lvds_lane_drive_str);
} else {
tegra_sor_writel(sor, NV_SOR_LANE_DRIVE_CURRENT(sor->portnum),
0x40404040);
@@ -1292,8 +1292,14 @@ void tegra_dc_sor_enable_lvds(struct tegra_dc_sor_data *sor,
TEGRA_DC_LVDS_24_1 ?
6 << NV_SOR_LVDS_ROTDAT_SHIFT:
0 << NV_SOR_LVDS_ROTDAT_SHIFT);
+ if (sor->dc->pdata->default_out->lvds_lane4_drive_str > 0 ) {
+ tegra_sor_writel(sor,
+ NV_SOR_LANE4_DRIVE_CURRENT(sor->portnum),
+ sor->dc->pdata->default_out->lvds_lane4_drive_str);
+ } else {
tegra_sor_writel(sor, NV_SOR_LANE4_DRIVE_CURRENT(sor->portnum),
0x40);
+ }
}
#if 0