video: tegra-dc: request timings from panel driver first
authorSvyatoslav Ryhel <clamor95@gmail.com>
Mon, 27 Mar 2023 08:11:43 +0000 (11:11 +0300)
committerAnatolij Gustschin <agust@denx.de>
Fri, 7 Apr 2023 17:43:14 +0000 (19:43 +0200)
Check if panel driver has display timings and get those.
If panel driver does not pass timing, try to find timing
under rgb node for backwards compatibility.

Tested-by: Robert Eckelmann <longnoserob@gmail.com> # ASUS TF101 T20
Tested-by: Nicolas Chauvet <kwizart@gmail.com> # Paz00
Tested-by: Andreas Westman Dorcsak <hedmoo@yahoo.com> # ASUS TF T30
Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # LG P895 T30
Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
drivers/video/tegra20/tegra-dc.c

index ff67cc8..91298b7 100644 (file)
@@ -380,18 +380,6 @@ static int tegra_lcd_of_to_plat(struct udevice *dev)
                return -EINVAL;
        }
 
-       ret = fdtdec_decode_display_timing(blob, rgb, 0, &priv->timing);
-       if (ret) {
-               debug("%s: Cannot read display timing for '%s' (ret=%d)\n",
-                     __func__, dev->name, ret);
-               return -EINVAL;
-       }
-       timing = &priv->timing;
-       priv->width = timing->hactive.typ;
-       priv->height = timing->vactive.typ;
-       priv->pixel_clock = timing->pixelclock.typ;
-       priv->log2_bpp = VIDEO_BPP16;
-
        /*
         * Sadly the panel phandle is in an rgb subnode so we cannot use
         * uclass_get_device_by_phandle().
@@ -401,6 +389,7 @@ static int tegra_lcd_of_to_plat(struct udevice *dev)
                debug("%s: Cannot find panel information\n", __func__);
                return -EINVAL;
        }
+
        ret = uclass_get_device_by_of_offset(UCLASS_PANEL, panel_node,
                                             &priv->panel);
        if (ret) {
@@ -409,6 +398,22 @@ static int tegra_lcd_of_to_plat(struct udevice *dev)
                return ret;
        }
 
+       ret = panel_get_display_timing(priv->panel, &priv->timing);
+       if (ret) {
+               ret = fdtdec_decode_display_timing(blob, rgb, 0, &priv->timing);
+               if (ret) {
+                       debug("%s: Cannot read display timing for '%s' (ret=%d)\n",
+                             __func__, dev->name, ret);
+                       return -EINVAL;
+               }
+       }
+
+       timing = &priv->timing;
+       priv->width = timing->hactive.typ;
+       priv->height = timing->vactive.typ;
+       priv->pixel_clock = timing->pixelclock.typ;
+       priv->log2_bpp = VIDEO_BPP16;
+
        return 0;
 }