In dual-link LVDS mode, the LVDS1 encoder is used as a companion for
LVDS0, and both encoders transmit data from DU0. The LVDS1 output of DU1
can't be used in that case, don't create an encoder and connector for
it.

Signed-off-by: Laurent Pinchart <laurent.pinchart+rene...@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo+rene...@jmondi.org>
Tested-by: Jacopo Mondi <jacopo+rene...@jmondi.org>
---
Changess since v2:

- Remove unneeded bridge NULL check
---
 drivers/gpu/drm/rcar-du/rcar_du_encoder.c | 12 ++++++++++++
 drivers/gpu/drm/rcar-du/rcar_du_kms.c     |  2 +-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c 
b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
index 6c91753af7bc..0f00bdfe2366 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
@@ -16,6 +16,7 @@
 #include "rcar_du_drv.h"
 #include "rcar_du_encoder.h"
 #include "rcar_du_kms.h"
+#include "rcar_lvds.h"
 
 /* 
-----------------------------------------------------------------------------
  * Encoder
@@ -97,6 +98,17 @@ int rcar_du_encoder_init(struct rcar_du_device *rcdu,
                }
        }
 
+       /*
+        * On Gen3 skip the LVDS1 output if the LVDS1 encoder is used as a
+        * companion for LVDS0 in dual-link mode.
+        */
+       if (rcdu->info->gen >= 3 && output == RCAR_DU_OUTPUT_LVDS1) {
+               if (rcar_lvds_dual_link(bridge)) {
+                       ret = -ENOLINK;
+                       goto done;
+               }
+       }
+
        ret = drm_encoder_init(rcdu->ddev, encoder, &encoder_funcs,
                               DRM_MODE_ENCODER_NONE, NULL);
        if (ret < 0)
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c 
b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
index f8f7fff34dff..95c81e59e2f1 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
@@ -378,7 +378,7 @@ static int rcar_du_encoders_init_one(struct rcar_du_device 
*rcdu,
        }
 
        ret = rcar_du_encoder_init(rcdu, output, entity);
-       if (ret && ret != -EPROBE_DEFER)
+       if (ret && ret != -EPROBE_DEFER && ret != -ENOLINK)
                dev_warn(rcdu->dev,
                         "failed to initialize encoder %pOF on output %u (%d), 
skipping\n",
                         entity, output, ret);
-- 
Regards,

Laurent Pinchart

Reply via email to