|
@@ -712,6 +712,13 @@ static bool intel_sdvo_set_timing(struct intel_sdvo *intel_sdvo, u8 cmd,
|
|
|
intel_sdvo_set_value(intel_sdvo, cmd + 1, &dtd->part2, sizeof(dtd->part2));
|
|
|
}
|
|
|
|
|
|
+static bool intel_sdvo_get_timing(struct intel_sdvo *intel_sdvo, u8 cmd,
|
|
|
+ struct intel_sdvo_dtd *dtd)
|
|
|
+{
|
|
|
+ return intel_sdvo_get_value(intel_sdvo, cmd, &dtd->part1, sizeof(dtd->part1)) &&
|
|
|
+ intel_sdvo_get_value(intel_sdvo, cmd + 1, &dtd->part2, sizeof(dtd->part2));
|
|
|
+}
|
|
|
+
|
|
|
static bool intel_sdvo_set_input_timing(struct intel_sdvo *intel_sdvo,
|
|
|
struct intel_sdvo_dtd *dtd)
|
|
|
{
|
|
@@ -726,6 +733,13 @@ static bool intel_sdvo_set_output_timing(struct intel_sdvo *intel_sdvo,
|
|
|
SDVO_CMD_SET_OUTPUT_TIMINGS_PART1, dtd);
|
|
|
}
|
|
|
|
|
|
+static bool intel_sdvo_get_input_timing(struct intel_sdvo *intel_sdvo,
|
|
|
+ struct intel_sdvo_dtd *dtd)
|
|
|
+{
|
|
|
+ return intel_sdvo_get_timing(intel_sdvo,
|
|
|
+ SDVO_CMD_GET_INPUT_TIMINGS_PART1, dtd);
|
|
|
+}
|
|
|
+
|
|
|
static bool
|
|
|
intel_sdvo_create_preferred_input_timing(struct intel_sdvo *intel_sdvo,
|
|
|
uint16_t clock,
|
|
@@ -1295,6 +1309,33 @@ static bool intel_sdvo_get_hw_state(struct intel_encoder *encoder,
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+static void intel_sdvo_get_config(struct intel_encoder *encoder,
|
|
|
+ struct intel_crtc_config *pipe_config)
|
|
|
+{
|
|
|
+ struct intel_sdvo *intel_sdvo = to_intel_sdvo(&encoder->base);
|
|
|
+ struct intel_sdvo_dtd dtd;
|
|
|
+ u32 flags = 0;
|
|
|
+ bool ret;
|
|
|
+
|
|
|
+ ret = intel_sdvo_get_input_timing(intel_sdvo, &dtd);
|
|
|
+ if (!ret) {
|
|
|
+ DRM_DEBUG_DRIVER("failed to retrieve SDVO DTD\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (dtd.part2.dtd_flags & DTD_FLAG_HSYNC_POSITIVE)
|
|
|
+ flags |= DRM_MODE_FLAG_PHSYNC;
|
|
|
+ else
|
|
|
+ flags |= DRM_MODE_FLAG_NHSYNC;
|
|
|
+
|
|
|
+ if (dtd.part2.dtd_flags & DTD_FLAG_VSYNC_POSITIVE)
|
|
|
+ flags |= DRM_MODE_FLAG_PVSYNC;
|
|
|
+ else
|
|
|
+ flags |= DRM_MODE_FLAG_NVSYNC;
|
|
|
+
|
|
|
+ pipe_config->adjusted_mode.flags |= flags;
|
|
|
+}
|
|
|
+
|
|
|
static void intel_disable_sdvo(struct intel_encoder *encoder)
|
|
|
{
|
|
|
struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
|
|
@@ -2827,6 +2868,7 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob)
|
|
|
intel_encoder->mode_set = intel_sdvo_mode_set;
|
|
|
intel_encoder->enable = intel_enable_sdvo;
|
|
|
intel_encoder->get_hw_state = intel_sdvo_get_hw_state;
|
|
|
+ intel_encoder->get_config = intel_sdvo_get_config;
|
|
|
|
|
|
/* In default case sdvo lvds is false */
|
|
|
if (!intel_sdvo_get_capabilities(intel_sdvo, &intel_sdvo->caps))
|