[Nouveau] [PATCHv2 6/6] drm/i2c/ch7006: Reject TV norm changes when there is a mode set.
Francisco Jerez
currojerez at riseup.net
Mon Aug 17 08:24:23 PDT 2009
Signed-off-by: Francisco Jerez <currojerez at riseup.net>
---
drivers/gpu/drm/i2c/ch7006_drv.c | 26 ++++++++++++++++++++++++--
1 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/i2c/ch7006_drv.c b/drivers/gpu/drm/i2c/ch7006_drv.c
index 7df4b86..a890652 100644
--- a/drivers/gpu/drm/i2c/ch7006_drv.c
+++ b/drivers/gpu/drm/i2c/ch7006_drv.c
@@ -287,6 +287,8 @@ static int ch7006_encoder_set_property(struct drm_encoder *encoder,
struct ch7006_priv *priv = to_ch7006_priv(encoder);
struct ch7006_state *state = &priv->state;
struct drm_mode_config *conf = &encoder->dev->mode_config;
+ struct drm_crtc *crtc = encoder->crtc;
+ bool modes_changed = false;
ch7006_dbg(client, "\n");
@@ -314,9 +316,12 @@ static int ch7006_encoder_set_property(struct drm_encoder *encoder,
ch7006_load_reg(client, state, CH7006_VPOS);
} else if (property == conf->tv_mode_property) {
+ if (connector->dpms != DRM_MODE_DPMS_OFF)
+ return -EINVAL;
+
priv->norm = val;
- drm_helper_probe_single_connector_modes(connector, 0, 0);
+ modes_changed = true;
} else if (property == conf->tv_brightness_property) {
priv->brightness = val;
@@ -340,14 +345,31 @@ static int ch7006_encoder_set_property(struct drm_encoder *encoder,
ch7006_load_reg(client, state, CH7006_FFILTER);
} else if (property == priv->scale_property) {
+ if (connector->dpms != DRM_MODE_DPMS_OFF)
+ return -EINVAL;
+
priv->scale = val;
- drm_helper_probe_single_connector_modes(connector, 0, 0);
+ modes_changed = true;
} else {
return -EINVAL;
}
+ if (modes_changed) {
+ drm_helper_probe_single_connector_modes(connector, 0, 0);
+
+ /* Disable the crtc to ensure a full modeset is
+ * performed whenever it's turned on again. */
+ if (crtc) {
+ struct drm_mode_set modeset = {
+ .crtc = crtc,
+ };
+
+ crtc->funcs->set_config(&modeset);
+ }
+ }
+
return 0;
}
--
1.6.3.3
More information about the Nouveau
mailing list