]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/commitdiff
drm/msm/dsi: Parse lane swap information from DT
authorHai Li <hali@codeaurora.org>
Thu, 3 Sep 2015 18:30:49 +0000 (14:30 -0400)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Mon, 14 Aug 2017 10:51:23 +0000 (12:51 +0200)
Lane swap configuration is based on the board design.
This change allows the DSI host to get this information
from device tree, instead of hardcoding in driver.

Signed-off-by: Hai Li <hali@codeaurora.org>
Documentation/devicetree/bindings/display/msm/dsi.txt
drivers/gpu/drm/msm/dsi/dsi_host.c

index f344b9e49198829617c9c3462f068595a1e0794f..741450fe03379ebcd1deb73a3cb5d6e035a6b7f9 100644 (file)
@@ -44,6 +44,17 @@ Optional properties:
 - port: DSI controller output port. This contains one endpoint subnode, with its
   remote-endpoint set to the phandle of the connected panel's endpoint.
   See Documentation/devicetree/bindings/graph.txt for device graph info.
+- qcom,dsi-logical-lane-swap: Character string to swap logical lane to physical
+  lane mapping. Supported lane mappings:
+  "0123": Logic 0->Phys 0; Logic 1->Phys 1; Logic 2->Phys 2; Logic 3->Phys 3;
+  "3012": Logic 3->Phys 0; Logic 0->Phys 1; Logic 1->Phys 2; Logic 2->Phys 3;
+  "2301": Logic 2->Phys 0; Logic 3->Phys 1; Logic 0->Phys 2; Logic 1->Phys 3;
+  "1230": Logic 1->Phys 0; Logic 2->Phys 1; Logic 3->Phys 2; Logic 0->Phys 3;
+  "0321": Logic 0->Phys 0; Logic 3->Phys 1; Logic 2->Phys 2; Logic 1->Phys 3;
+  "1032": Logic 1->Phys 0; Logic 0->Phys 1; Logic 3->Phys 2; Logic 2->Phys 3;
+  "2103": Logic 2->Phys 0; Logic 1->Phys 1; Logic 0->Phys 2; Logic 3->Phys 3;
+  "3210": Logic 3->Phys 0; Logic 2->Phys 1; Logic 1->Phys 2; Logic 0->Phys 3;
+  Default value is "0123", which means no lane swap.
 
 DSI PHY:
 Required properties:
@@ -129,6 +140,8 @@ Example:
                                remote-endpoint = <&panel_in>;
                        };
                };
+
+               qcom,dsi-logical-lane-swap = "0123";
        };
 
        mdss_dsi_phy0: qcom,mdss_dsi_phy@fd922a00 {
index 4c49868efcda211ad2ed8397ef4ce1d2043ea63b..8e4fcdccc128ec7f06503c14aab6851741926ad2 100644 (file)
@@ -131,6 +131,7 @@ struct msm_dsi_host {
        enum mipi_dsi_pixel_format format;
        unsigned long mode_flags;
 
+       u32 dlane_swap;
        u32 dma_cmd_ctrl_restore;
 
        bool registered;
@@ -684,19 +685,9 @@ static void dsi_ctrl_config(struct msm_dsi_host *msm_host, bool enable,
        data = DSI_CTRL_CLK_EN;
 
        DBG("lane number=%d", msm_host->lanes);
-       if (msm_host->lanes == 2) {
-               data |= DSI_CTRL_LANE1 | DSI_CTRL_LANE2;
-               /* swap lanes for 2-lane panel for better performance */
-               dsi_write(msm_host, REG_DSI_LANE_SWAP_CTRL,
-                       DSI_LANE_SWAP_CTRL_DLN_SWAP_SEL(LANE_SWAP_1230));
-       } else {
-               /* Take 4 lanes as default */
-               data |= DSI_CTRL_LANE0 | DSI_CTRL_LANE1 | DSI_CTRL_LANE2 |
-                       DSI_CTRL_LANE3;
-               /* Do not swap lanes for 4-lane panel */
-               dsi_write(msm_host, REG_DSI_LANE_SWAP_CTRL,
-                       DSI_LANE_SWAP_CTRL_DLN_SWAP_SEL(LANE_SWAP_0123));
-       }
+       data |= ((DSI_CTRL_LANE0 << msm_host->lanes) - DSI_CTRL_LANE0);
+       dsi_write(msm_host, REG_DSI_LANE_SWAP_CTRL,
+               DSI_LANE_SWAP_CTRL_DLN_SWAP_SEL(msm_host->dlane_swap));
 
        if (!(flags & MIPI_DSI_CLOCK_NON_CONTINUOUS))
                dsi_write(msm_host, REG_DSI_LANE_CTRL,
@@ -1289,6 +1280,9 @@ static int dsi_host_attach(struct mipi_dsi_host *host,
        struct msm_dsi_host *msm_host = to_msm_dsi_host(host);
        int ret;
 
+       if (dsi->lanes > 4 || dsi->channel > 3)
+               return -EINVAL;
+
        msm_host->channel = dsi->channel;
        msm_host->lanes = dsi->lanes;
        msm_host->format = dsi->format;
@@ -1344,6 +1338,33 @@ static struct mipi_dsi_host_ops dsi_host_ops = {
        .transfer = dsi_host_transfer,
 };
 
+static void dsi_parse_dlane_swap(struct msm_dsi_host *msm_host,
+                               struct device_node *np)
+{
+       const char *lane_swap;
+
+       lane_swap = of_get_property(np, "qcom,dsi-logical-lane-swap", NULL);
+
+       if (!lane_swap)
+               msm_host->dlane_swap = LANE_SWAP_0123;
+       else if (!strncmp(lane_swap, "3012", 5))
+               msm_host->dlane_swap = LANE_SWAP_3012;
+       else if (!strncmp(lane_swap, "2301", 5))
+               msm_host->dlane_swap = LANE_SWAP_2301;
+       else if (!strncmp(lane_swap, "1230", 5))
+               msm_host->dlane_swap = LANE_SWAP_1230;
+       else if (!strncmp(lane_swap, "0321", 5))
+               msm_host->dlane_swap = LANE_SWAP_0321;
+       else if (!strncmp(lane_swap, "1032", 5))
+               msm_host->dlane_swap = LANE_SWAP_1032;
+       else if (!strncmp(lane_swap, "2103", 5))
+               msm_host->dlane_swap = LANE_SWAP_2103;
+       else if (!strncmp(lane_swap, "3210", 5))
+               msm_host->dlane_swap = LANE_SWAP_3210;
+       else
+               msm_host->dlane_swap = LANE_SWAP_0123;
+}
+
 static int dsi_host_parse_dt(struct msm_dsi_host *msm_host)
 {
        struct device *dev = &msm_host->pdev->dev;
@@ -1358,6 +1379,8 @@ static int dsi_host_parse_dt(struct msm_dsi_host *msm_host)
                return ret;
        }
 
+       dsi_parse_dlane_swap(msm_host, np);
+
        /*
         * Get the first endpoint node. In our case, dsi has one output port
         * to which the panel is connected. Don't return an error if a port