diff options
author | Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> | 2014-10-25 18:14:27 -0400 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> | 2014-12-23 05:01:49 -0500 |
commit | 5e433b6312d9d05ac83078bfd2e6371f24d6eb46 (patch) | |
tree | 8506147813c96fa7caa600a822677e20a5e3e06e | |
parent | 49785e25816b0567112ba599504c3b78901a7db4 (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.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c | 15 |
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 | ||
25 | struct rcar_du_hdmienc { | 26 | struct 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 | ||