]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
video: tegra20: dc: pass DC id to internal devices
authorSvyatoslav Ryhel <clamor95@gmail.com>
Tue, 23 Jan 2024 17:16:19 +0000 (19:16 +0200)
committerAnatolij Gustschin <agust@denx.de>
Sun, 21 Apr 2024 07:07:01 +0000 (09:07 +0200)
Tegra SoC has 2 independent display controllers called DC_A and
DC_B, they are handled differently by internal video devices like
DSI and HDMI controllers so it is important for last to know
which display controller is used to properly set up registers.
To achieve this, a pipe field was added to pdata to pass display
controller id to internal Tegra SoC devices.

Tested-by: Agneli <poczt@protonmail.ch> # Toshiba AC100 T20
Tested-by: Robert Eckelmann <longnoserob@gmail.com> # ASUS TF101
Tested-by: Andreas Westman Dorcsak <hedmoo@yahoo.com> # ASUS Grouper E1565
Tested-by: Ion Agorria <ion@agorria.com> # HTC One X
Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # Nvidia Tegratab T114
Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
drivers/video/tegra20/tegra-dc.c
drivers/video/tegra20/tegra-dc.h

index 5d8874f323abb14e39c85f036866e4db88a94982..0e94e665efc2a2e5117c465211c6b0f3ed3f4b56 100644 (file)
@@ -45,6 +45,7 @@ struct tegra_lcd_priv {
        unsigned pixel_clock;           /* Pixel clock in Hz */
        int dc_clk[2];                  /* Contains clk and its parent */
        bool rotation;                  /* 180 degree panel turn */
+       bool pipe;                      /* DC controller: 0 for A, 1 for B */
 };
 
 enum {
@@ -406,6 +407,9 @@ static int tegra_lcd_of_to_plat(struct udevice *dev)
 
        priv->rotation = dev_read_bool(dev, "nvidia,180-rotation");
 
+       if (!strcmp(dev->name, TEGRA_DC_B))
+               priv->pipe = 1;
+
        rgb = fdt_subnode_offset(blob, node, "rgb");
        if (rgb < 0) {
                debug("%s: Cannot find rgb subnode for '%s' (ret=%d)\n",
@@ -431,12 +435,14 @@ static int tegra_lcd_of_to_plat(struct udevice *dev)
                return ret;
        }
 
+       /* Fill the platform data for internal devices */
        if (!strcmp(priv->panel->name, TEGRA_DSI_A) ||
            !strcmp(priv->panel->name, TEGRA_DSI_B)) {
                struct tegra_dc_plat *dc_plat = dev_get_plat(priv->panel);
 
                dc_plat->dev = dev;
                dc_plat->dc = priv->dc;
+               dc_plat->pipe = priv->pipe;
        }
 
        ret = panel_get_display_timing(priv->panel, &priv->timing);
index 5c05221038c22231f99d90c83cc405d0fe75d37e..75fc0fa4de4f78b2f6f9e0fcb7c13263b4967d17 100644 (file)
 /* arch-tegra/dc exists only because T124 uses it */
 #include <asm/arch-tegra/dc.h>
 
+#define TEGRA_DC_A             "dc@54200000"
+#define TEGRA_DC_B             "dc@54240000"
 #define TEGRA_DSI_A            "dsi@54300000"
 #define TEGRA_DSI_B            "dsi@54400000"
 
 struct tegra_dc_plat {
        struct udevice *dev;            /* Display controller device */
        struct dc_ctlr *dc;             /* Display controller regmap */
+       bool pipe;                      /* DC number: 0 for A, 1 for B */
 };
 
 /* This holds information about a window which can be displayed */