|
@@ -120,8 +120,7 @@ struct intel_sdvo {
|
|
|
*/
|
|
|
bool is_tv;
|
|
|
|
|
|
- /* On different gens SDVOB is at different places. */
|
|
|
- bool is_sdvob;
|
|
|
+ enum port port;
|
|
|
|
|
|
/* This is for current tv format name */
|
|
|
int tv_format_index;
|
|
@@ -245,7 +244,7 @@ static void intel_sdvo_write_sdvox(struct intel_sdvo *intel_sdvo, u32 val)
|
|
|
u32 bval = val, cval = val;
|
|
|
int i;
|
|
|
|
|
|
- if (intel_sdvo->sdvo_reg == PCH_SDVOB) {
|
|
|
+ if (HAS_PCH_SPLIT(dev_priv)) {
|
|
|
I915_WRITE(intel_sdvo->sdvo_reg, val);
|
|
|
POSTING_READ(intel_sdvo->sdvo_reg);
|
|
|
/*
|
|
@@ -259,7 +258,7 @@ static void intel_sdvo_write_sdvox(struct intel_sdvo *intel_sdvo, u32 val)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (intel_sdvo->sdvo_reg == GEN3_SDVOB)
|
|
|
+ if (intel_sdvo->port == PORT_B)
|
|
|
cval = I915_READ(GEN3_SDVOC);
|
|
|
else
|
|
|
bval = I915_READ(GEN3_SDVOB);
|
|
@@ -422,7 +421,7 @@ static const struct _sdvo_cmd_name {
|
|
|
SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_DATA),
|
|
|
};
|
|
|
|
|
|
-#define SDVO_NAME(svdo) ((svdo)->is_sdvob ? "SDVOB" : "SDVOC")
|
|
|
+#define SDVO_NAME(svdo) ((svdo)->port == PORT_B ? "SDVOB" : "SDVOC")
|
|
|
|
|
|
static void intel_sdvo_debug_write(struct intel_sdvo *intel_sdvo, u8 cmd,
|
|
|
const void *args, int args_len)
|
|
@@ -1282,14 +1281,10 @@ static void intel_sdvo_pre_enable(struct intel_encoder *intel_encoder)
|
|
|
sdvox |= SDVO_BORDER_ENABLE;
|
|
|
} else {
|
|
|
sdvox = I915_READ(intel_sdvo->sdvo_reg);
|
|
|
- switch (intel_sdvo->sdvo_reg) {
|
|
|
- case GEN3_SDVOB:
|
|
|
+ if (intel_sdvo->port == PORT_B)
|
|
|
sdvox &= SDVOB_PRESERVE_MASK;
|
|
|
- break;
|
|
|
- case GEN3_SDVOC:
|
|
|
+ else
|
|
|
sdvox &= SDVOC_PRESERVE_MASK;
|
|
|
- break;
|
|
|
- }
|
|
|
sdvox |= (9 << 19) | SDVO_BORDER_ENABLE;
|
|
|
}
|
|
|
|
|
@@ -2262,7 +2257,7 @@ intel_sdvo_select_ddc_bus(struct drm_i915_private *dev_priv,
|
|
|
{
|
|
|
struct sdvo_device_mapping *mapping;
|
|
|
|
|
|
- if (sdvo->is_sdvob)
|
|
|
+ if (sdvo->port == PORT_B)
|
|
|
mapping = &(dev_priv->sdvo_mappings[0]);
|
|
|
else
|
|
|
mapping = &(dev_priv->sdvo_mappings[1]);
|
|
@@ -2280,7 +2275,7 @@ intel_sdvo_select_i2c_bus(struct drm_i915_private *dev_priv,
|
|
|
struct sdvo_device_mapping *mapping;
|
|
|
u8 pin;
|
|
|
|
|
|
- if (sdvo->is_sdvob)
|
|
|
+ if (sdvo->port == PORT_B)
|
|
|
mapping = &dev_priv->sdvo_mappings[0];
|
|
|
else
|
|
|
mapping = &dev_priv->sdvo_mappings[1];
|
|
@@ -2318,7 +2313,7 @@ intel_sdvo_get_slave_addr(struct drm_device *dev, struct intel_sdvo *sdvo)
|
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
struct sdvo_device_mapping *my_mapping, *other_mapping;
|
|
|
|
|
|
- if (sdvo->is_sdvob) {
|
|
|
+ if (sdvo->port == PORT_B) {
|
|
|
my_mapping = &dev_priv->sdvo_mappings[0];
|
|
|
other_mapping = &dev_priv->sdvo_mappings[1];
|
|
|
} else {
|
|
@@ -2343,7 +2338,7 @@ intel_sdvo_get_slave_addr(struct drm_device *dev, struct intel_sdvo *sdvo)
|
|
|
/* No SDVO device info is found for another DVO port,
|
|
|
* so use mapping assumption we had before BIOS parsing.
|
|
|
*/
|
|
|
- if (sdvo->is_sdvob)
|
|
|
+ if (sdvo->port == PORT_B)
|
|
|
return 0x70;
|
|
|
else
|
|
|
return 0x72;
|
|
@@ -2950,18 +2945,30 @@ intel_sdvo_init_ddc_proxy(struct intel_sdvo *sdvo,
|
|
|
return i2c_add_adapter(&sdvo->ddc) == 0;
|
|
|
}
|
|
|
|
|
|
-bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob)
|
|
|
+static void assert_sdvo_port_valid(const struct drm_i915_private *dev_priv,
|
|
|
+ enum port port)
|
|
|
+{
|
|
|
+ if (HAS_PCH_SPLIT(dev_priv))
|
|
|
+ WARN_ON(port != PORT_B);
|
|
|
+ else
|
|
|
+ WARN_ON(port != PORT_B && port != PORT_C);
|
|
|
+}
|
|
|
+
|
|
|
+bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, enum port port)
|
|
|
{
|
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
struct intel_encoder *intel_encoder;
|
|
|
struct intel_sdvo *intel_sdvo;
|
|
|
int i;
|
|
|
+
|
|
|
+ assert_sdvo_port_valid(dev_priv, port);
|
|
|
+
|
|
|
intel_sdvo = kzalloc(sizeof(*intel_sdvo), GFP_KERNEL);
|
|
|
if (!intel_sdvo)
|
|
|
return false;
|
|
|
|
|
|
intel_sdvo->sdvo_reg = sdvo_reg;
|
|
|
- intel_sdvo->is_sdvob = is_sdvob;
|
|
|
+ intel_sdvo->port = port;
|
|
|
intel_sdvo->slave_addr = intel_sdvo_get_slave_addr(dev, intel_sdvo) >> 1;
|
|
|
intel_sdvo_select_i2c_bus(dev_priv, intel_sdvo);
|
|
|
if (!intel_sdvo_init_ddc_proxy(intel_sdvo, dev))
|
|
@@ -3011,8 +3018,10 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob)
|
|
|
* hotplug lines.
|
|
|
*/
|
|
|
if (intel_sdvo->hotplug_active) {
|
|
|
- intel_encoder->hpd_pin =
|
|
|
- intel_sdvo->is_sdvob ? HPD_SDVO_B : HPD_SDVO_C;
|
|
|
+ if (intel_sdvo->port == PORT_B)
|
|
|
+ intel_encoder->hpd_pin = HPD_SDVO_B;
|
|
|
+ else
|
|
|
+ intel_encoder->hpd_pin = HPD_SDVO_C;
|
|
|
}
|
|
|
|
|
|
/*
|