aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2014-10-25 18:14:27 -0400
committerLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2014-12-23 05:01:49 -0500
commit5e433b6312d9d05ac83078bfd2e6371f24d6eb46 (patch)
tree8506147813c96fa7caa600a822677e20a5e3e06e
parent49785e25816b0567112ba599504c3b78901a7db4 (diff)
drm: rcar-du: Remove LVDS and HDMI encoders chaining restriction
The rcar-du driver refuses connecting an LVDS output to an HDMI encoder. There is not technical reason for that restriction, remove it. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
-rw-r--r--drivers/gpu/drm/rcar-du/rcar_du_encoder.c7
-rw-r--r--drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c15
2 files changed, 15 insertions, 7 deletions
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
index 7c74ecf2ca67..243aba8d4dd2 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
@@ -190,13 +190,6 @@ int rcar_du_encoder_init(struct rcar_du_device *rcdu,
190 } 190 }
191 191
192 if (type == RCAR_DU_ENCODER_HDMI) { 192 if (type == RCAR_DU_ENCODER_HDMI) {
193 if (renc->lvds) {
194 dev_err(rcdu->dev,
195 "Chaining LVDS and HDMI encoders not supported\n");
196 ret = -EINVAL;
197 goto done;
198 }
199
200 ret = rcar_du_hdmienc_init(rcdu, renc, enc_node); 193 ret = rcar_du_hdmienc_init(rcdu, renc, enc_node);
201 if (ret < 0) 194 if (ret < 0)
202 goto done; 195 goto done;
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c b/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
index 359bc999a9c8..0d774a937e79 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
@@ -21,6 +21,7 @@
21#include "rcar_du_drv.h" 21#include "rcar_du_drv.h"
22#include "rcar_du_encoder.h" 22#include "rcar_du_encoder.h"
23#include "rcar_du_hdmienc.h" 23#include "rcar_du_hdmienc.h"
24#include "rcar_du_lvdsenc.h"
24 25
25struct rcar_du_hdmienc { 26struct rcar_du_hdmienc {
26 struct rcar_du_encoder *renc; 27 struct rcar_du_encoder *renc;
@@ -39,9 +40,15 @@ static void rcar_du_hdmienc_dpms(struct drm_encoder *encoder, int mode)
39 if (hdmienc->dpms == mode) 40 if (hdmienc->dpms == mode)
40 return; 41 return;
41 42
43 if (mode == DRM_MODE_DPMS_ON && hdmienc->renc->lvds)
44 rcar_du_lvdsenc_dpms(hdmienc->renc->lvds, encoder->crtc, mode);
45
42 if (sfuncs->dpms) 46 if (sfuncs->dpms)
43 sfuncs->dpms(encoder, mode); 47 sfuncs->dpms(encoder, mode);
44 48
49 if (mode != DRM_MODE_DPMS_ON && hdmienc->renc->lvds)
50 rcar_du_lvdsenc_dpms(hdmienc->renc->lvds, encoder->crtc, mode);
51
45 hdmienc->dpms = mode; 52 hdmienc->dpms = mode;
46} 53}
47 54
@@ -49,8 +56,16 @@ static bool rcar_du_hdmienc_mode_fixup(struct drm_encoder *encoder,
49 const struct drm_display_mode *mode, 56 const struct drm_display_mode *mode,
50 struct drm_display_mode *adjusted_mode) 57 struct drm_display_mode *adjusted_mode)
51{ 58{
59 struct rcar_du_hdmienc *hdmienc = to_rcar_hdmienc(encoder);
52 struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder); 60 struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder);
53 61
62 /* The internal LVDS encoder has a clock frequency operating range of
63 * 30MHz to 150MHz. Clamp the clock accordingly.
64 */
65 if (hdmienc->renc->lvds)
66 adjusted_mode->clock = clamp(adjusted_mode->clock,
67 30000, 150000);
68
54 if (sfuncs->mode_fixup == NULL) 69 if (sfuncs->mode_fixup == NULL)
55 return true; 70 return true;
56 71