Message ID | 20190511210702.18394-8-laurent.pinchart+renesas@ideasonboard.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | R-Car DU: LVDS dual-link mode support | expand |
HI Laurent, On Sun, May 12, 2019 at 12:06:59AM +0300, Laurent Pinchart wrote: > 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+renesas@ideasonboard.com> > --- > 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..fe046d194944 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 (bridge && rcar_lvds_dual_link(bridge)) { If you get here, 'bridge' is guaranteed to be valid. > + 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) Apart from the minor above Reviewed-by: Jacopo Mondi <jacopo+renesas@jmondi.org> Thanks j > dev_warn(rcdu->dev, > "failed to initialize encoder %pOF on output %u (%d), skipping\n", > entity, output, ret); > -- > Regards, > > Laurent Pinchart >
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c index 6c91753af7bc..fe046d194944 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 (bridge && 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);
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+renesas@ideasonboard.com> --- 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(-)