|
@@ -54,7 +54,7 @@ struct intel_sdvo_priv {
|
|
u8 slave_addr;
|
|
u8 slave_addr;
|
|
|
|
|
|
/* Register for the SDVO device: SDVOB or SDVOC */
|
|
/* Register for the SDVO device: SDVOB or SDVOC */
|
|
- int output_device;
|
|
|
|
|
|
+ int sdvo_reg;
|
|
|
|
|
|
/* Active outputs controlled by this SDVO output */
|
|
/* Active outputs controlled by this SDVO output */
|
|
uint16_t controlled_output;
|
|
uint16_t controlled_output;
|
|
@@ -124,7 +124,7 @@ struct intel_sdvo_priv {
|
|
*/
|
|
*/
|
|
struct intel_sdvo_encode encode;
|
|
struct intel_sdvo_encode encode;
|
|
|
|
|
|
- /* DDC bus used by this SDVO output */
|
|
|
|
|
|
+ /* DDC bus used by this SDVO encoder */
|
|
uint8_t ddc_bus;
|
|
uint8_t ddc_bus;
|
|
|
|
|
|
/* Mac mini hack -- use the same DDC as the analog connector */
|
|
/* Mac mini hack -- use the same DDC as the analog connector */
|
|
@@ -162,22 +162,22 @@ struct intel_sdvo_priv {
|
|
};
|
|
};
|
|
|
|
|
|
static bool
|
|
static bool
|
|
-intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags);
|
|
|
|
|
|
+intel_sdvo_output_setup(struct intel_encoder *intel_encoder, uint16_t flags);
|
|
|
|
|
|
/**
|
|
/**
|
|
* Writes the SDVOB or SDVOC with the given value, but always writes both
|
|
* Writes the SDVOB or SDVOC with the given value, but always writes both
|
|
* SDVOB and SDVOC to work around apparent hardware issues (according to
|
|
* SDVOB and SDVOC to work around apparent hardware issues (according to
|
|
* comments in the BIOS).
|
|
* comments in the BIOS).
|
|
*/
|
|
*/
|
|
-static void intel_sdvo_write_sdvox(struct intel_output *intel_output, u32 val)
|
|
|
|
|
|
+static void intel_sdvo_write_sdvox(struct intel_encoder *intel_encoder, u32 val)
|
|
{
|
|
{
|
|
- struct drm_device *dev = intel_output->base.dev;
|
|
|
|
|
|
+ struct drm_device *dev = intel_encoder->base.dev;
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
u32 bval = val, cval = val;
|
|
u32 bval = val, cval = val;
|
|
int i;
|
|
int i;
|
|
|
|
|
|
- if (sdvo_priv->output_device == SDVOB) {
|
|
|
|
|
|
+ if (sdvo_priv->sdvo_reg == SDVOB) {
|
|
cval = I915_READ(SDVOC);
|
|
cval = I915_READ(SDVOC);
|
|
} else {
|
|
} else {
|
|
bval = I915_READ(SDVOB);
|
|
bval = I915_READ(SDVOB);
|
|
@@ -196,10 +196,10 @@ static void intel_sdvo_write_sdvox(struct intel_output *intel_output, u32 val)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_read_byte(struct intel_output *intel_output, u8 addr,
|
|
|
|
|
|
+static bool intel_sdvo_read_byte(struct intel_encoder *intel_encoder, u8 addr,
|
|
u8 *ch)
|
|
u8 *ch)
|
|
{
|
|
{
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
u8 out_buf[2];
|
|
u8 out_buf[2];
|
|
u8 buf[2];
|
|
u8 buf[2];
|
|
int ret;
|
|
int ret;
|
|
@@ -222,7 +222,7 @@ static bool intel_sdvo_read_byte(struct intel_output *intel_output, u8 addr,
|
|
out_buf[0] = addr;
|
|
out_buf[0] = addr;
|
|
out_buf[1] = 0;
|
|
out_buf[1] = 0;
|
|
|
|
|
|
- if ((ret = i2c_transfer(intel_output->i2c_bus, msgs, 2)) == 2)
|
|
|
|
|
|
+ if ((ret = i2c_transfer(intel_encoder->i2c_bus, msgs, 2)) == 2)
|
|
{
|
|
{
|
|
*ch = buf[0];
|
|
*ch = buf[0];
|
|
return true;
|
|
return true;
|
|
@@ -232,10 +232,10 @@ static bool intel_sdvo_read_byte(struct intel_output *intel_output, u8 addr,
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_write_byte(struct intel_output *intel_output, int addr,
|
|
|
|
|
|
+static bool intel_sdvo_write_byte(struct intel_encoder *intel_encoder, int addr,
|
|
u8 ch)
|
|
u8 ch)
|
|
{
|
|
{
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
u8 out_buf[2];
|
|
u8 out_buf[2];
|
|
struct i2c_msg msgs[] = {
|
|
struct i2c_msg msgs[] = {
|
|
{
|
|
{
|
|
@@ -249,7 +249,7 @@ static bool intel_sdvo_write_byte(struct intel_output *intel_output, int addr,
|
|
out_buf[0] = addr;
|
|
out_buf[0] = addr;
|
|
out_buf[1] = ch;
|
|
out_buf[1] = ch;
|
|
|
|
|
|
- if (i2c_transfer(intel_output->i2c_bus, msgs, 1) == 1)
|
|
|
|
|
|
+ if (i2c_transfer(intel_encoder->i2c_bus, msgs, 1) == 1)
|
|
{
|
|
{
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
@@ -353,13 +353,13 @@ static const struct _sdvo_cmd_name {
|
|
SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_DATA),
|
|
SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_DATA),
|
|
};
|
|
};
|
|
|
|
|
|
-#define SDVO_NAME(dev_priv) ((dev_priv)->output_device == SDVOB ? "SDVOB" : "SDVOC")
|
|
|
|
-#define SDVO_PRIV(output) ((struct intel_sdvo_priv *) (output)->dev_priv)
|
|
|
|
|
|
+#define SDVO_NAME(dev_priv) ((dev_priv)->sdvo_reg == SDVOB ? "SDVOB" : "SDVOC")
|
|
|
|
+#define SDVO_PRIV(encoder) ((struct intel_sdvo_priv *) (encoder)->dev_priv)
|
|
|
|
|
|
-static void intel_sdvo_debug_write(struct intel_output *intel_output, u8 cmd,
|
|
|
|
|
|
+static void intel_sdvo_debug_write(struct intel_encoder *intel_encoder, u8 cmd,
|
|
void *args, int args_len)
|
|
void *args, int args_len)
|
|
{
|
|
{
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
int i;
|
|
int i;
|
|
|
|
|
|
DRM_DEBUG_KMS("%s: W: %02X ",
|
|
DRM_DEBUG_KMS("%s: W: %02X ",
|
|
@@ -379,19 +379,19 @@ static void intel_sdvo_debug_write(struct intel_output *intel_output, u8 cmd,
|
|
DRM_LOG_KMS("\n");
|
|
DRM_LOG_KMS("\n");
|
|
}
|
|
}
|
|
|
|
|
|
-static void intel_sdvo_write_cmd(struct intel_output *intel_output, u8 cmd,
|
|
|
|
|
|
+static void intel_sdvo_write_cmd(struct intel_encoder *intel_encoder, u8 cmd,
|
|
void *args, int args_len)
|
|
void *args, int args_len)
|
|
{
|
|
{
|
|
int i;
|
|
int i;
|
|
|
|
|
|
- intel_sdvo_debug_write(intel_output, cmd, args, args_len);
|
|
|
|
|
|
+ intel_sdvo_debug_write(intel_encoder, cmd, args, args_len);
|
|
|
|
|
|
for (i = 0; i < args_len; i++) {
|
|
for (i = 0; i < args_len; i++) {
|
|
- intel_sdvo_write_byte(intel_output, SDVO_I2C_ARG_0 - i,
|
|
|
|
|
|
+ intel_sdvo_write_byte(intel_encoder, SDVO_I2C_ARG_0 - i,
|
|
((u8*)args)[i]);
|
|
((u8*)args)[i]);
|
|
}
|
|
}
|
|
|
|
|
|
- intel_sdvo_write_byte(intel_output, SDVO_I2C_OPCODE, cmd);
|
|
|
|
|
|
+ intel_sdvo_write_byte(intel_encoder, SDVO_I2C_OPCODE, cmd);
|
|
}
|
|
}
|
|
|
|
|
|
static const char *cmd_status_names[] = {
|
|
static const char *cmd_status_names[] = {
|
|
@@ -404,11 +404,11 @@ static const char *cmd_status_names[] = {
|
|
"Scaling not supported"
|
|
"Scaling not supported"
|
|
};
|
|
};
|
|
|
|
|
|
-static void intel_sdvo_debug_response(struct intel_output *intel_output,
|
|
|
|
|
|
+static void intel_sdvo_debug_response(struct intel_encoder *intel_encoder,
|
|
void *response, int response_len,
|
|
void *response, int response_len,
|
|
u8 status)
|
|
u8 status)
|
|
{
|
|
{
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
int i;
|
|
int i;
|
|
|
|
|
|
DRM_DEBUG_KMS("%s: R: ", SDVO_NAME(sdvo_priv));
|
|
DRM_DEBUG_KMS("%s: R: ", SDVO_NAME(sdvo_priv));
|
|
@@ -423,7 +423,7 @@ static void intel_sdvo_debug_response(struct intel_output *intel_output,
|
|
DRM_LOG_KMS("\n");
|
|
DRM_LOG_KMS("\n");
|
|
}
|
|
}
|
|
|
|
|
|
-static u8 intel_sdvo_read_response(struct intel_output *intel_output,
|
|
|
|
|
|
+static u8 intel_sdvo_read_response(struct intel_encoder *intel_encoder,
|
|
void *response, int response_len)
|
|
void *response, int response_len)
|
|
{
|
|
{
|
|
int i;
|
|
int i;
|
|
@@ -433,16 +433,16 @@ static u8 intel_sdvo_read_response(struct intel_output *intel_output,
|
|
while (retry--) {
|
|
while (retry--) {
|
|
/* Read the command response */
|
|
/* Read the command response */
|
|
for (i = 0; i < response_len; i++) {
|
|
for (i = 0; i < response_len; i++) {
|
|
- intel_sdvo_read_byte(intel_output,
|
|
|
|
|
|
+ intel_sdvo_read_byte(intel_encoder,
|
|
SDVO_I2C_RETURN_0 + i,
|
|
SDVO_I2C_RETURN_0 + i,
|
|
&((u8 *)response)[i]);
|
|
&((u8 *)response)[i]);
|
|
}
|
|
}
|
|
|
|
|
|
/* read the return status */
|
|
/* read the return status */
|
|
- intel_sdvo_read_byte(intel_output, SDVO_I2C_CMD_STATUS,
|
|
|
|
|
|
+ intel_sdvo_read_byte(intel_encoder, SDVO_I2C_CMD_STATUS,
|
|
&status);
|
|
&status);
|
|
|
|
|
|
- intel_sdvo_debug_response(intel_output, response, response_len,
|
|
|
|
|
|
+ intel_sdvo_debug_response(intel_encoder, response, response_len,
|
|
status);
|
|
status);
|
|
if (status != SDVO_CMD_STATUS_PENDING)
|
|
if (status != SDVO_CMD_STATUS_PENDING)
|
|
return status;
|
|
return status;
|
|
@@ -470,10 +470,10 @@ static int intel_sdvo_get_pixel_multiplier(struct drm_display_mode *mode)
|
|
* another I2C transaction after issuing the DDC bus switch, it will be
|
|
* another I2C transaction after issuing the DDC bus switch, it will be
|
|
* switched to the internal SDVO register.
|
|
* switched to the internal SDVO register.
|
|
*/
|
|
*/
|
|
-static void intel_sdvo_set_control_bus_switch(struct intel_output *intel_output,
|
|
|
|
|
|
+static void intel_sdvo_set_control_bus_switch(struct intel_encoder *intel_encoder,
|
|
u8 target)
|
|
u8 target)
|
|
{
|
|
{
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
u8 out_buf[2], cmd_buf[2], ret_value[2], ret;
|
|
u8 out_buf[2], cmd_buf[2], ret_value[2], ret;
|
|
struct i2c_msg msgs[] = {
|
|
struct i2c_msg msgs[] = {
|
|
{
|
|
{
|
|
@@ -497,10 +497,10 @@ static void intel_sdvo_set_control_bus_switch(struct intel_output *intel_output,
|
|
},
|
|
},
|
|
};
|
|
};
|
|
|
|
|
|
- intel_sdvo_debug_write(intel_output, SDVO_CMD_SET_CONTROL_BUS_SWITCH,
|
|
|
|
|
|
+ intel_sdvo_debug_write(intel_encoder, SDVO_CMD_SET_CONTROL_BUS_SWITCH,
|
|
&target, 1);
|
|
&target, 1);
|
|
/* write the DDC switch command argument */
|
|
/* write the DDC switch command argument */
|
|
- intel_sdvo_write_byte(intel_output, SDVO_I2C_ARG_0, target);
|
|
|
|
|
|
+ intel_sdvo_write_byte(intel_encoder, SDVO_I2C_ARG_0, target);
|
|
|
|
|
|
out_buf[0] = SDVO_I2C_OPCODE;
|
|
out_buf[0] = SDVO_I2C_OPCODE;
|
|
out_buf[1] = SDVO_CMD_SET_CONTROL_BUS_SWITCH;
|
|
out_buf[1] = SDVO_CMD_SET_CONTROL_BUS_SWITCH;
|
|
@@ -509,7 +509,7 @@ static void intel_sdvo_set_control_bus_switch(struct intel_output *intel_output,
|
|
ret_value[0] = 0;
|
|
ret_value[0] = 0;
|
|
ret_value[1] = 0;
|
|
ret_value[1] = 0;
|
|
|
|
|
|
- ret = i2c_transfer(intel_output->i2c_bus, msgs, 3);
|
|
|
|
|
|
+ ret = i2c_transfer(intel_encoder->i2c_bus, msgs, 3);
|
|
if (ret != 3) {
|
|
if (ret != 3) {
|
|
/* failure in I2C transfer */
|
|
/* failure in I2C transfer */
|
|
DRM_DEBUG_KMS("I2c transfer returned %d\n", ret);
|
|
DRM_DEBUG_KMS("I2c transfer returned %d\n", ret);
|
|
@@ -523,7 +523,7 @@ static void intel_sdvo_set_control_bus_switch(struct intel_output *intel_output,
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_set_target_input(struct intel_output *intel_output, bool target_0, bool target_1)
|
|
|
|
|
|
+static bool intel_sdvo_set_target_input(struct intel_encoder *intel_encoder, bool target_0, bool target_1)
|
|
{
|
|
{
|
|
struct intel_sdvo_set_target_input_args targets = {0};
|
|
struct intel_sdvo_set_target_input_args targets = {0};
|
|
u8 status;
|
|
u8 status;
|
|
@@ -534,10 +534,10 @@ static bool intel_sdvo_set_target_input(struct intel_output *intel_output, bool
|
|
if (target_1)
|
|
if (target_1)
|
|
targets.target_1 = 1;
|
|
targets.target_1 = 1;
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output, SDVO_CMD_SET_TARGET_INPUT, &targets,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_SET_TARGET_INPUT, &targets,
|
|
sizeof(targets));
|
|
sizeof(targets));
|
|
|
|
|
|
- status = intel_sdvo_read_response(intel_output, NULL, 0);
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, NULL, 0);
|
|
|
|
|
|
return (status == SDVO_CMD_STATUS_SUCCESS);
|
|
return (status == SDVO_CMD_STATUS_SUCCESS);
|
|
}
|
|
}
|
|
@@ -548,13 +548,13 @@ static bool intel_sdvo_set_target_input(struct intel_output *intel_output, bool
|
|
* This function is making an assumption about the layout of the response,
|
|
* This function is making an assumption about the layout of the response,
|
|
* which should be checked against the docs.
|
|
* which should be checked against the docs.
|
|
*/
|
|
*/
|
|
-static bool intel_sdvo_get_trained_inputs(struct intel_output *intel_output, bool *input_1, bool *input_2)
|
|
|
|
|
|
+static bool intel_sdvo_get_trained_inputs(struct intel_encoder *intel_encoder, bool *input_1, bool *input_2)
|
|
{
|
|
{
|
|
struct intel_sdvo_get_trained_inputs_response response;
|
|
struct intel_sdvo_get_trained_inputs_response response;
|
|
u8 status;
|
|
u8 status;
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_TRAINED_INPUTS, NULL, 0);
|
|
|
|
- status = intel_sdvo_read_response(intel_output, &response, sizeof(response));
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_GET_TRAINED_INPUTS, NULL, 0);
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, &response, sizeof(response));
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
return false;
|
|
return false;
|
|
|
|
|
|
@@ -563,29 +563,29 @@ static bool intel_sdvo_get_trained_inputs(struct intel_output *intel_output, boo
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_get_active_outputs(struct intel_output *intel_output,
|
|
|
|
|
|
+static bool intel_sdvo_get_active_outputs(struct intel_encoder *intel_encoder,
|
|
u16 *outputs)
|
|
u16 *outputs)
|
|
{
|
|
{
|
|
u8 status;
|
|
u8 status;
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_ACTIVE_OUTPUTS, NULL, 0);
|
|
|
|
- status = intel_sdvo_read_response(intel_output, outputs, sizeof(*outputs));
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_GET_ACTIVE_OUTPUTS, NULL, 0);
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, outputs, sizeof(*outputs));
|
|
|
|
|
|
return (status == SDVO_CMD_STATUS_SUCCESS);
|
|
return (status == SDVO_CMD_STATUS_SUCCESS);
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_set_active_outputs(struct intel_output *intel_output,
|
|
|
|
|
|
+static bool intel_sdvo_set_active_outputs(struct intel_encoder *intel_encoder,
|
|
u16 outputs)
|
|
u16 outputs)
|
|
{
|
|
{
|
|
u8 status;
|
|
u8 status;
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output, SDVO_CMD_SET_ACTIVE_OUTPUTS, &outputs,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_SET_ACTIVE_OUTPUTS, &outputs,
|
|
sizeof(outputs));
|
|
sizeof(outputs));
|
|
- status = intel_sdvo_read_response(intel_output, NULL, 0);
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, NULL, 0);
|
|
return (status == SDVO_CMD_STATUS_SUCCESS);
|
|
return (status == SDVO_CMD_STATUS_SUCCESS);
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_set_encoder_power_state(struct intel_output *intel_output,
|
|
|
|
|
|
+static bool intel_sdvo_set_encoder_power_state(struct intel_encoder *intel_encoder,
|
|
int mode)
|
|
int mode)
|
|
{
|
|
{
|
|
u8 status, state = SDVO_ENCODER_STATE_ON;
|
|
u8 status, state = SDVO_ENCODER_STATE_ON;
|
|
@@ -605,24 +605,24 @@ static bool intel_sdvo_set_encoder_power_state(struct intel_output *intel_output
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output, SDVO_CMD_SET_ENCODER_POWER_STATE, &state,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_SET_ENCODER_POWER_STATE, &state,
|
|
sizeof(state));
|
|
sizeof(state));
|
|
- status = intel_sdvo_read_response(intel_output, NULL, 0);
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, NULL, 0);
|
|
|
|
|
|
return (status == SDVO_CMD_STATUS_SUCCESS);
|
|
return (status == SDVO_CMD_STATUS_SUCCESS);
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_get_input_pixel_clock_range(struct intel_output *intel_output,
|
|
|
|
|
|
+static bool intel_sdvo_get_input_pixel_clock_range(struct intel_encoder *intel_encoder,
|
|
int *clock_min,
|
|
int *clock_min,
|
|
int *clock_max)
|
|
int *clock_max)
|
|
{
|
|
{
|
|
struct intel_sdvo_pixel_clock_range clocks;
|
|
struct intel_sdvo_pixel_clock_range clocks;
|
|
u8 status;
|
|
u8 status;
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_INPUT_PIXEL_CLOCK_RANGE,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_GET_INPUT_PIXEL_CLOCK_RANGE,
|
|
NULL, 0);
|
|
NULL, 0);
|
|
|
|
|
|
- status = intel_sdvo_read_response(intel_output, &clocks, sizeof(clocks));
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, &clocks, sizeof(clocks));
|
|
|
|
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
return false;
|
|
return false;
|
|
@@ -634,31 +634,31 @@ static bool intel_sdvo_get_input_pixel_clock_range(struct intel_output *intel_ou
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_set_target_output(struct intel_output *intel_output,
|
|
|
|
|
|
+static bool intel_sdvo_set_target_output(struct intel_encoder *intel_encoder,
|
|
u16 outputs)
|
|
u16 outputs)
|
|
{
|
|
{
|
|
u8 status;
|
|
u8 status;
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output, SDVO_CMD_SET_TARGET_OUTPUT, &outputs,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_SET_TARGET_OUTPUT, &outputs,
|
|
sizeof(outputs));
|
|
sizeof(outputs));
|
|
|
|
|
|
- status = intel_sdvo_read_response(intel_output, NULL, 0);
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, NULL, 0);
|
|
return (status == SDVO_CMD_STATUS_SUCCESS);
|
|
return (status == SDVO_CMD_STATUS_SUCCESS);
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_get_timing(struct intel_output *intel_output, u8 cmd,
|
|
|
|
|
|
+static bool intel_sdvo_get_timing(struct intel_encoder *intel_encoder, u8 cmd,
|
|
struct intel_sdvo_dtd *dtd)
|
|
struct intel_sdvo_dtd *dtd)
|
|
{
|
|
{
|
|
u8 status;
|
|
u8 status;
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output, cmd, NULL, 0);
|
|
|
|
- status = intel_sdvo_read_response(intel_output, &dtd->part1,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, cmd, NULL, 0);
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, &dtd->part1,
|
|
sizeof(dtd->part1));
|
|
sizeof(dtd->part1));
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
return false;
|
|
return false;
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output, cmd + 1, NULL, 0);
|
|
|
|
- status = intel_sdvo_read_response(intel_output, &dtd->part2,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, cmd + 1, NULL, 0);
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, &dtd->part2,
|
|
sizeof(dtd->part2));
|
|
sizeof(dtd->part2));
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
return false;
|
|
return false;
|
|
@@ -666,60 +666,60 @@ static bool intel_sdvo_get_timing(struct intel_output *intel_output, u8 cmd,
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_get_input_timing(struct intel_output *intel_output,
|
|
|
|
|
|
+static bool intel_sdvo_get_input_timing(struct intel_encoder *intel_encoder,
|
|
struct intel_sdvo_dtd *dtd)
|
|
struct intel_sdvo_dtd *dtd)
|
|
{
|
|
{
|
|
- return intel_sdvo_get_timing(intel_output,
|
|
|
|
|
|
+ return intel_sdvo_get_timing(intel_encoder,
|
|
SDVO_CMD_GET_INPUT_TIMINGS_PART1, dtd);
|
|
SDVO_CMD_GET_INPUT_TIMINGS_PART1, dtd);
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_get_output_timing(struct intel_output *intel_output,
|
|
|
|
|
|
+static bool intel_sdvo_get_output_timing(struct intel_encoder *intel_encoder,
|
|
struct intel_sdvo_dtd *dtd)
|
|
struct intel_sdvo_dtd *dtd)
|
|
{
|
|
{
|
|
- return intel_sdvo_get_timing(intel_output,
|
|
|
|
|
|
+ return intel_sdvo_get_timing(intel_encoder,
|
|
SDVO_CMD_GET_OUTPUT_TIMINGS_PART1, dtd);
|
|
SDVO_CMD_GET_OUTPUT_TIMINGS_PART1, dtd);
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_set_timing(struct intel_output *intel_output, u8 cmd,
|
|
|
|
|
|
+static bool intel_sdvo_set_timing(struct intel_encoder *intel_encoder, u8 cmd,
|
|
struct intel_sdvo_dtd *dtd)
|
|
struct intel_sdvo_dtd *dtd)
|
|
{
|
|
{
|
|
u8 status;
|
|
u8 status;
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output, cmd, &dtd->part1, sizeof(dtd->part1));
|
|
|
|
- status = intel_sdvo_read_response(intel_output, NULL, 0);
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, cmd, &dtd->part1, sizeof(dtd->part1));
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, NULL, 0);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
return false;
|
|
return false;
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output, cmd + 1, &dtd->part2, sizeof(dtd->part2));
|
|
|
|
- status = intel_sdvo_read_response(intel_output, NULL, 0);
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, cmd + 1, &dtd->part2, sizeof(dtd->part2));
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, NULL, 0);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
return false;
|
|
return false;
|
|
|
|
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_set_input_timing(struct intel_output *intel_output,
|
|
|
|
|
|
+static bool intel_sdvo_set_input_timing(struct intel_encoder *intel_encoder,
|
|
struct intel_sdvo_dtd *dtd)
|
|
struct intel_sdvo_dtd *dtd)
|
|
{
|
|
{
|
|
- return intel_sdvo_set_timing(intel_output,
|
|
|
|
|
|
+ return intel_sdvo_set_timing(intel_encoder,
|
|
SDVO_CMD_SET_INPUT_TIMINGS_PART1, dtd);
|
|
SDVO_CMD_SET_INPUT_TIMINGS_PART1, dtd);
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_set_output_timing(struct intel_output *intel_output,
|
|
|
|
|
|
+static bool intel_sdvo_set_output_timing(struct intel_encoder *intel_encoder,
|
|
struct intel_sdvo_dtd *dtd)
|
|
struct intel_sdvo_dtd *dtd)
|
|
{
|
|
{
|
|
- return intel_sdvo_set_timing(intel_output,
|
|
|
|
|
|
+ return intel_sdvo_set_timing(intel_encoder,
|
|
SDVO_CMD_SET_OUTPUT_TIMINGS_PART1, dtd);
|
|
SDVO_CMD_SET_OUTPUT_TIMINGS_PART1, dtd);
|
|
}
|
|
}
|
|
|
|
|
|
static bool
|
|
static bool
|
|
-intel_sdvo_create_preferred_input_timing(struct intel_output *output,
|
|
|
|
|
|
+intel_sdvo_create_preferred_input_timing(struct intel_encoder *intel_encoder,
|
|
uint16_t clock,
|
|
uint16_t clock,
|
|
uint16_t width,
|
|
uint16_t width,
|
|
uint16_t height)
|
|
uint16_t height)
|
|
{
|
|
{
|
|
struct intel_sdvo_preferred_input_timing_args args;
|
|
struct intel_sdvo_preferred_input_timing_args args;
|
|
- struct intel_sdvo_priv *sdvo_priv = output->dev_priv;
|
|
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
uint8_t status;
|
|
uint8_t status;
|
|
|
|
|
|
memset(&args, 0, sizeof(args));
|
|
memset(&args, 0, sizeof(args));
|
|
@@ -733,32 +733,33 @@ intel_sdvo_create_preferred_input_timing(struct intel_output *output,
|
|
sdvo_priv->sdvo_lvds_fixed_mode->vdisplay != height))
|
|
sdvo_priv->sdvo_lvds_fixed_mode->vdisplay != height))
|
|
args.scaled = 1;
|
|
args.scaled = 1;
|
|
|
|
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_CREATE_PREFERRED_INPUT_TIMING,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder,
|
|
|
|
+ SDVO_CMD_CREATE_PREFERRED_INPUT_TIMING,
|
|
&args, sizeof(args));
|
|
&args, sizeof(args));
|
|
- status = intel_sdvo_read_response(output, NULL, 0);
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, NULL, 0);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
return false;
|
|
return false;
|
|
|
|
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_get_preferred_input_timing(struct intel_output *output,
|
|
|
|
|
|
+static bool intel_sdvo_get_preferred_input_timing(struct intel_encoder *intel_encoder,
|
|
struct intel_sdvo_dtd *dtd)
|
|
struct intel_sdvo_dtd *dtd)
|
|
{
|
|
{
|
|
bool status;
|
|
bool status;
|
|
|
|
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART1,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART1,
|
|
NULL, 0);
|
|
NULL, 0);
|
|
|
|
|
|
- status = intel_sdvo_read_response(output, &dtd->part1,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, &dtd->part1,
|
|
sizeof(dtd->part1));
|
|
sizeof(dtd->part1));
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
return false;
|
|
return false;
|
|
|
|
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART2,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART2,
|
|
NULL, 0);
|
|
NULL, 0);
|
|
|
|
|
|
- status = intel_sdvo_read_response(output, &dtd->part2,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, &dtd->part2,
|
|
sizeof(dtd->part2));
|
|
sizeof(dtd->part2));
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
return false;
|
|
return false;
|
|
@@ -766,12 +767,12 @@ static bool intel_sdvo_get_preferred_input_timing(struct intel_output *output,
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
-static int intel_sdvo_get_clock_rate_mult(struct intel_output *intel_output)
|
|
|
|
|
|
+static int intel_sdvo_get_clock_rate_mult(struct intel_encoder *intel_encoder)
|
|
{
|
|
{
|
|
u8 response, status;
|
|
u8 response, status;
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_CLOCK_RATE_MULT, NULL, 0);
|
|
|
|
- status = intel_sdvo_read_response(intel_output, &response, 1);
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_GET_CLOCK_RATE_MULT, NULL, 0);
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, &response, 1);
|
|
|
|
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
DRM_DEBUG_KMS("Couldn't get SDVO clock rate multiplier\n");
|
|
DRM_DEBUG_KMS("Couldn't get SDVO clock rate multiplier\n");
|
|
@@ -783,12 +784,12 @@ static int intel_sdvo_get_clock_rate_mult(struct intel_output *intel_output)
|
|
return response;
|
|
return response;
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_set_clock_rate_mult(struct intel_output *intel_output, u8 val)
|
|
|
|
|
|
+static bool intel_sdvo_set_clock_rate_mult(struct intel_encoder *intel_encoder, u8 val)
|
|
{
|
|
{
|
|
u8 status;
|
|
u8 status;
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output, SDVO_CMD_SET_CLOCK_RATE_MULT, &val, 1);
|
|
|
|
- status = intel_sdvo_read_response(intel_output, NULL, 0);
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_SET_CLOCK_RATE_MULT, &val, 1);
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, NULL, 0);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
return false;
|
|
return false;
|
|
|
|
|
|
@@ -877,13 +878,13 @@ static void intel_sdvo_get_mode_from_dtd(struct drm_display_mode * mode,
|
|
mode->flags |= DRM_MODE_FLAG_PVSYNC;
|
|
mode->flags |= DRM_MODE_FLAG_PVSYNC;
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_get_supp_encode(struct intel_output *output,
|
|
|
|
|
|
+static bool intel_sdvo_get_supp_encode(struct intel_encoder *intel_encoder,
|
|
struct intel_sdvo_encode *encode)
|
|
struct intel_sdvo_encode *encode)
|
|
{
|
|
{
|
|
uint8_t status;
|
|
uint8_t status;
|
|
|
|
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_GET_SUPP_ENCODE, NULL, 0);
|
|
|
|
- status = intel_sdvo_read_response(output, encode, sizeof(*encode));
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_GET_SUPP_ENCODE, NULL, 0);
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, encode, sizeof(*encode));
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) { /* non-support means DVI */
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) { /* non-support means DVI */
|
|
memset(encode, 0, sizeof(*encode));
|
|
memset(encode, 0, sizeof(*encode));
|
|
return false;
|
|
return false;
|
|
@@ -892,29 +893,30 @@ static bool intel_sdvo_get_supp_encode(struct intel_output *output,
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_set_encode(struct intel_output *output, uint8_t mode)
|
|
|
|
|
|
+static bool intel_sdvo_set_encode(struct intel_encoder *intel_encoder,
|
|
|
|
+ uint8_t mode)
|
|
{
|
|
{
|
|
uint8_t status;
|
|
uint8_t status;
|
|
|
|
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_SET_ENCODE, &mode, 1);
|
|
|
|
- status = intel_sdvo_read_response(output, NULL, 0);
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_SET_ENCODE, &mode, 1);
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, NULL, 0);
|
|
|
|
|
|
return (status == SDVO_CMD_STATUS_SUCCESS);
|
|
return (status == SDVO_CMD_STATUS_SUCCESS);
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_set_colorimetry(struct intel_output *output,
|
|
|
|
|
|
+static bool intel_sdvo_set_colorimetry(struct intel_encoder *intel_encoder,
|
|
uint8_t mode)
|
|
uint8_t mode)
|
|
{
|
|
{
|
|
uint8_t status;
|
|
uint8_t status;
|
|
|
|
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_SET_COLORIMETRY, &mode, 1);
|
|
|
|
- status = intel_sdvo_read_response(output, NULL, 0);
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_SET_COLORIMETRY, &mode, 1);
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, NULL, 0);
|
|
|
|
|
|
return (status == SDVO_CMD_STATUS_SUCCESS);
|
|
return (status == SDVO_CMD_STATUS_SUCCESS);
|
|
}
|
|
}
|
|
|
|
|
|
#if 0
|
|
#if 0
|
|
-static void intel_sdvo_dump_hdmi_buf(struct intel_output *output)
|
|
|
|
|
|
+static void intel_sdvo_dump_hdmi_buf(struct intel_encoder *intel_encoder)
|
|
{
|
|
{
|
|
int i, j;
|
|
int i, j;
|
|
uint8_t set_buf_index[2];
|
|
uint8_t set_buf_index[2];
|
|
@@ -923,43 +925,45 @@ static void intel_sdvo_dump_hdmi_buf(struct intel_output *output)
|
|
uint8_t buf[48];
|
|
uint8_t buf[48];
|
|
uint8_t *pos;
|
|
uint8_t *pos;
|
|
|
|
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_GET_HBUF_AV_SPLIT, NULL, 0);
|
|
|
|
- intel_sdvo_read_response(output, &av_split, 1);
|
|
|
|
|
|
+ intel_sdvo_write_cmd(encoder, SDVO_CMD_GET_HBUF_AV_SPLIT, NULL, 0);
|
|
|
|
+ intel_sdvo_read_response(encoder, &av_split, 1);
|
|
|
|
|
|
for (i = 0; i <= av_split; i++) {
|
|
for (i = 0; i <= av_split; i++) {
|
|
set_buf_index[0] = i; set_buf_index[1] = 0;
|
|
set_buf_index[0] = i; set_buf_index[1] = 0;
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_SET_HBUF_INDEX,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(encoder, SDVO_CMD_SET_HBUF_INDEX,
|
|
set_buf_index, 2);
|
|
set_buf_index, 2);
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_GET_HBUF_INFO, NULL, 0);
|
|
|
|
- intel_sdvo_read_response(output, &buf_size, 1);
|
|
|
|
|
|
+ intel_sdvo_write_cmd(encoder, SDVO_CMD_GET_HBUF_INFO, NULL, 0);
|
|
|
|
+ intel_sdvo_read_response(encoder, &buf_size, 1);
|
|
|
|
|
|
pos = buf;
|
|
pos = buf;
|
|
for (j = 0; j <= buf_size; j += 8) {
|
|
for (j = 0; j <= buf_size; j += 8) {
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_GET_HBUF_DATA,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(encoder, SDVO_CMD_GET_HBUF_DATA,
|
|
NULL, 0);
|
|
NULL, 0);
|
|
- intel_sdvo_read_response(output, pos, 8);
|
|
|
|
|
|
+ intel_sdvo_read_response(encoder, pos, 8);
|
|
pos += 8;
|
|
pos += 8;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-static void intel_sdvo_set_hdmi_buf(struct intel_output *output, int index,
|
|
|
|
- uint8_t *data, int8_t size, uint8_t tx_rate)
|
|
|
|
|
|
+static void intel_sdvo_set_hdmi_buf(struct intel_encoder *intel_encoder,
|
|
|
|
+ int index,
|
|
|
|
+ uint8_t *data, int8_t size, uint8_t tx_rate)
|
|
{
|
|
{
|
|
uint8_t set_buf_index[2];
|
|
uint8_t set_buf_index[2];
|
|
|
|
|
|
set_buf_index[0] = index;
|
|
set_buf_index[0] = index;
|
|
set_buf_index[1] = 0;
|
|
set_buf_index[1] = 0;
|
|
|
|
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_SET_HBUF_INDEX, set_buf_index, 2);
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_SET_HBUF_INDEX,
|
|
|
|
+ set_buf_index, 2);
|
|
|
|
|
|
for (; size > 0; size -= 8) {
|
|
for (; size > 0; size -= 8) {
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_SET_HBUF_DATA, data, 8);
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_SET_HBUF_DATA, data, 8);
|
|
data += 8;
|
|
data += 8;
|
|
}
|
|
}
|
|
|
|
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_SET_HBUF_TXRATE, &tx_rate, 1);
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_SET_HBUF_TXRATE, &tx_rate, 1);
|
|
}
|
|
}
|
|
|
|
|
|
static uint8_t intel_sdvo_calc_hbuf_csum(uint8_t *data, uint8_t size)
|
|
static uint8_t intel_sdvo_calc_hbuf_csum(uint8_t *data, uint8_t size)
|
|
@@ -1034,7 +1038,7 @@ struct dip_infoframe {
|
|
} __attribute__ ((packed)) u;
|
|
} __attribute__ ((packed)) u;
|
|
} __attribute__((packed));
|
|
} __attribute__((packed));
|
|
|
|
|
|
-static void intel_sdvo_set_avi_infoframe(struct intel_output *output,
|
|
|
|
|
|
+static void intel_sdvo_set_avi_infoframe(struct intel_encoder *intel_encoder,
|
|
struct drm_display_mode * mode)
|
|
struct drm_display_mode * mode)
|
|
{
|
|
{
|
|
struct dip_infoframe avi_if = {
|
|
struct dip_infoframe avi_if = {
|
|
@@ -1045,15 +1049,16 @@ static void intel_sdvo_set_avi_infoframe(struct intel_output *output,
|
|
|
|
|
|
avi_if.checksum = intel_sdvo_calc_hbuf_csum((uint8_t *)&avi_if,
|
|
avi_if.checksum = intel_sdvo_calc_hbuf_csum((uint8_t *)&avi_if,
|
|
4 + avi_if.len);
|
|
4 + avi_if.len);
|
|
- intel_sdvo_set_hdmi_buf(output, 1, (uint8_t *)&avi_if, 4 + avi_if.len,
|
|
|
|
|
|
+ intel_sdvo_set_hdmi_buf(intel_encoder, 1, (uint8_t *)&avi_if,
|
|
|
|
+ 4 + avi_if.len,
|
|
SDVO_HBUF_TX_VSYNC);
|
|
SDVO_HBUF_TX_VSYNC);
|
|
}
|
|
}
|
|
|
|
|
|
-static void intel_sdvo_set_tv_format(struct intel_output *output)
|
|
|
|
|
|
+static void intel_sdvo_set_tv_format(struct intel_encoder *intel_encoder)
|
|
{
|
|
{
|
|
|
|
|
|
struct intel_sdvo_tv_format format;
|
|
struct intel_sdvo_tv_format format;
|
|
- struct intel_sdvo_priv *sdvo_priv = output->dev_priv;
|
|
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
uint32_t format_map, i;
|
|
uint32_t format_map, i;
|
|
uint8_t status;
|
|
uint8_t status;
|
|
|
|
|
|
@@ -1066,10 +1071,10 @@ static void intel_sdvo_set_tv_format(struct intel_output *output)
|
|
memcpy(&format, &format_map, sizeof(format_map) > sizeof(format) ?
|
|
memcpy(&format, &format_map, sizeof(format_map) > sizeof(format) ?
|
|
sizeof(format) : sizeof(format_map));
|
|
sizeof(format) : sizeof(format_map));
|
|
|
|
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_SET_TV_FORMAT, &format_map,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_SET_TV_FORMAT, &format_map,
|
|
sizeof(format));
|
|
sizeof(format));
|
|
|
|
|
|
- status = intel_sdvo_read_response(output, NULL, 0);
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, NULL, 0);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
DRM_DEBUG_KMS("%s: Failed to set TV format\n",
|
|
DRM_DEBUG_KMS("%s: Failed to set TV format\n",
|
|
SDVO_NAME(sdvo_priv));
|
|
SDVO_NAME(sdvo_priv));
|
|
@@ -1079,8 +1084,8 @@ static bool intel_sdvo_mode_fixup(struct drm_encoder *encoder,
|
|
struct drm_display_mode *mode,
|
|
struct drm_display_mode *mode,
|
|
struct drm_display_mode *adjusted_mode)
|
|
struct drm_display_mode *adjusted_mode)
|
|
{
|
|
{
|
|
- struct intel_output *output = enc_to_intel_output(encoder);
|
|
|
|
- struct intel_sdvo_priv *dev_priv = output->dev_priv;
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
|
|
|
+ struct intel_sdvo_priv *dev_priv = intel_encoder->dev_priv;
|
|
|
|
|
|
if (dev_priv->is_tv) {
|
|
if (dev_priv->is_tv) {
|
|
struct intel_sdvo_dtd output_dtd;
|
|
struct intel_sdvo_dtd output_dtd;
|
|
@@ -1095,22 +1100,22 @@ static bool intel_sdvo_mode_fixup(struct drm_encoder *encoder,
|
|
|
|
|
|
/* Set output timings */
|
|
/* Set output timings */
|
|
intel_sdvo_get_dtd_from_mode(&output_dtd, mode);
|
|
intel_sdvo_get_dtd_from_mode(&output_dtd, mode);
|
|
- intel_sdvo_set_target_output(output,
|
|
|
|
|
|
+ intel_sdvo_set_target_output(intel_encoder,
|
|
dev_priv->controlled_output);
|
|
dev_priv->controlled_output);
|
|
- intel_sdvo_set_output_timing(output, &output_dtd);
|
|
|
|
|
|
+ intel_sdvo_set_output_timing(intel_encoder, &output_dtd);
|
|
|
|
|
|
/* Set the input timing to the screen. Assume always input 0. */
|
|
/* Set the input timing to the screen. Assume always input 0. */
|
|
- intel_sdvo_set_target_input(output, true, false);
|
|
|
|
|
|
+ intel_sdvo_set_target_input(intel_encoder, true, false);
|
|
|
|
|
|
|
|
|
|
- success = intel_sdvo_create_preferred_input_timing(output,
|
|
|
|
|
|
+ success = intel_sdvo_create_preferred_input_timing(intel_encoder,
|
|
mode->clock / 10,
|
|
mode->clock / 10,
|
|
mode->hdisplay,
|
|
mode->hdisplay,
|
|
mode->vdisplay);
|
|
mode->vdisplay);
|
|
if (success) {
|
|
if (success) {
|
|
struct intel_sdvo_dtd input_dtd;
|
|
struct intel_sdvo_dtd input_dtd;
|
|
|
|
|
|
- intel_sdvo_get_preferred_input_timing(output,
|
|
|
|
|
|
+ intel_sdvo_get_preferred_input_timing(intel_encoder,
|
|
&input_dtd);
|
|
&input_dtd);
|
|
intel_sdvo_get_mode_from_dtd(adjusted_mode, &input_dtd);
|
|
intel_sdvo_get_mode_from_dtd(adjusted_mode, &input_dtd);
|
|
dev_priv->sdvo_flags = input_dtd.part2.sdvo_flags;
|
|
dev_priv->sdvo_flags = input_dtd.part2.sdvo_flags;
|
|
@@ -1133,16 +1138,16 @@ static bool intel_sdvo_mode_fixup(struct drm_encoder *encoder,
|
|
intel_sdvo_get_dtd_from_mode(&output_dtd,
|
|
intel_sdvo_get_dtd_from_mode(&output_dtd,
|
|
dev_priv->sdvo_lvds_fixed_mode);
|
|
dev_priv->sdvo_lvds_fixed_mode);
|
|
|
|
|
|
- intel_sdvo_set_target_output(output,
|
|
|
|
|
|
+ intel_sdvo_set_target_output(intel_encoder,
|
|
dev_priv->controlled_output);
|
|
dev_priv->controlled_output);
|
|
- intel_sdvo_set_output_timing(output, &output_dtd);
|
|
|
|
|
|
+ intel_sdvo_set_output_timing(intel_encoder, &output_dtd);
|
|
|
|
|
|
/* Set the input timing to the screen. Assume always input 0. */
|
|
/* Set the input timing to the screen. Assume always input 0. */
|
|
- intel_sdvo_set_target_input(output, true, false);
|
|
|
|
|
|
+ intel_sdvo_set_target_input(intel_encoder, true, false);
|
|
|
|
|
|
|
|
|
|
success = intel_sdvo_create_preferred_input_timing(
|
|
success = intel_sdvo_create_preferred_input_timing(
|
|
- output,
|
|
|
|
|
|
+ intel_encoder,
|
|
mode->clock / 10,
|
|
mode->clock / 10,
|
|
mode->hdisplay,
|
|
mode->hdisplay,
|
|
mode->vdisplay);
|
|
mode->vdisplay);
|
|
@@ -1150,7 +1155,7 @@ static bool intel_sdvo_mode_fixup(struct drm_encoder *encoder,
|
|
if (success) {
|
|
if (success) {
|
|
struct intel_sdvo_dtd input_dtd;
|
|
struct intel_sdvo_dtd input_dtd;
|
|
|
|
|
|
- intel_sdvo_get_preferred_input_timing(output,
|
|
|
|
|
|
+ intel_sdvo_get_preferred_input_timing(intel_encoder,
|
|
&input_dtd);
|
|
&input_dtd);
|
|
intel_sdvo_get_mode_from_dtd(adjusted_mode, &input_dtd);
|
|
intel_sdvo_get_mode_from_dtd(adjusted_mode, &input_dtd);
|
|
dev_priv->sdvo_flags = input_dtd.part2.sdvo_flags;
|
|
dev_priv->sdvo_flags = input_dtd.part2.sdvo_flags;
|
|
@@ -1182,8 +1187,8 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder,
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
struct drm_crtc *crtc = encoder->crtc;
|
|
struct drm_crtc *crtc = encoder->crtc;
|
|
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
|
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
|
- struct intel_output *output = enc_to_intel_output(encoder);
|
|
|
|
- struct intel_sdvo_priv *sdvo_priv = output->dev_priv;
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
u32 sdvox = 0;
|
|
u32 sdvox = 0;
|
|
int sdvo_pixel_multiply;
|
|
int sdvo_pixel_multiply;
|
|
struct intel_sdvo_in_out_map in_out;
|
|
struct intel_sdvo_in_out_map in_out;
|
|
@@ -1202,12 +1207,12 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder,
|
|
in_out.in0 = sdvo_priv->controlled_output;
|
|
in_out.in0 = sdvo_priv->controlled_output;
|
|
in_out.in1 = 0;
|
|
in_out.in1 = 0;
|
|
|
|
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_SET_IN_OUT_MAP,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_SET_IN_OUT_MAP,
|
|
&in_out, sizeof(in_out));
|
|
&in_out, sizeof(in_out));
|
|
- status = intel_sdvo_read_response(output, NULL, 0);
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, NULL, 0);
|
|
|
|
|
|
if (sdvo_priv->is_hdmi) {
|
|
if (sdvo_priv->is_hdmi) {
|
|
- intel_sdvo_set_avi_infoframe(output, mode);
|
|
|
|
|
|
+ intel_sdvo_set_avi_infoframe(intel_encoder, mode);
|
|
sdvox |= SDVO_AUDIO_ENABLE;
|
|
sdvox |= SDVO_AUDIO_ENABLE;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1224,16 +1229,16 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder,
|
|
*/
|
|
*/
|
|
if (!sdvo_priv->is_tv && !sdvo_priv->is_lvds) {
|
|
if (!sdvo_priv->is_tv && !sdvo_priv->is_lvds) {
|
|
/* Set the output timing to the screen */
|
|
/* Set the output timing to the screen */
|
|
- intel_sdvo_set_target_output(output,
|
|
|
|
|
|
+ intel_sdvo_set_target_output(intel_encoder,
|
|
sdvo_priv->controlled_output);
|
|
sdvo_priv->controlled_output);
|
|
- intel_sdvo_set_output_timing(output, &input_dtd);
|
|
|
|
|
|
+ intel_sdvo_set_output_timing(intel_encoder, &input_dtd);
|
|
}
|
|
}
|
|
|
|
|
|
/* Set the input timing to the screen. Assume always input 0. */
|
|
/* Set the input timing to the screen. Assume always input 0. */
|
|
- intel_sdvo_set_target_input(output, true, false);
|
|
|
|
|
|
+ intel_sdvo_set_target_input(intel_encoder, true, false);
|
|
|
|
|
|
if (sdvo_priv->is_tv)
|
|
if (sdvo_priv->is_tv)
|
|
- intel_sdvo_set_tv_format(output);
|
|
|
|
|
|
+ intel_sdvo_set_tv_format(intel_encoder);
|
|
|
|
|
|
/* We would like to use intel_sdvo_create_preferred_input_timing() to
|
|
/* We would like to use intel_sdvo_create_preferred_input_timing() to
|
|
* provide the device with a timing it can support, if it supports that
|
|
* provide the device with a timing it can support, if it supports that
|
|
@@ -1241,29 +1246,29 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder,
|
|
* output the preferred timing, and we don't support that currently.
|
|
* output the preferred timing, and we don't support that currently.
|
|
*/
|
|
*/
|
|
#if 0
|
|
#if 0
|
|
- success = intel_sdvo_create_preferred_input_timing(output, clock,
|
|
|
|
|
|
+ success = intel_sdvo_create_preferred_input_timing(encoder, clock,
|
|
width, height);
|
|
width, height);
|
|
if (success) {
|
|
if (success) {
|
|
struct intel_sdvo_dtd *input_dtd;
|
|
struct intel_sdvo_dtd *input_dtd;
|
|
|
|
|
|
- intel_sdvo_get_preferred_input_timing(output, &input_dtd);
|
|
|
|
- intel_sdvo_set_input_timing(output, &input_dtd);
|
|
|
|
|
|
+ intel_sdvo_get_preferred_input_timing(encoder, &input_dtd);
|
|
|
|
+ intel_sdvo_set_input_timing(encoder, &input_dtd);
|
|
}
|
|
}
|
|
#else
|
|
#else
|
|
- intel_sdvo_set_input_timing(output, &input_dtd);
|
|
|
|
|
|
+ intel_sdvo_set_input_timing(intel_encoder, &input_dtd);
|
|
#endif
|
|
#endif
|
|
|
|
|
|
switch (intel_sdvo_get_pixel_multiplier(mode)) {
|
|
switch (intel_sdvo_get_pixel_multiplier(mode)) {
|
|
case 1:
|
|
case 1:
|
|
- intel_sdvo_set_clock_rate_mult(output,
|
|
|
|
|
|
+ intel_sdvo_set_clock_rate_mult(intel_encoder,
|
|
SDVO_CLOCK_RATE_MULT_1X);
|
|
SDVO_CLOCK_RATE_MULT_1X);
|
|
break;
|
|
break;
|
|
case 2:
|
|
case 2:
|
|
- intel_sdvo_set_clock_rate_mult(output,
|
|
|
|
|
|
+ intel_sdvo_set_clock_rate_mult(intel_encoder,
|
|
SDVO_CLOCK_RATE_MULT_2X);
|
|
SDVO_CLOCK_RATE_MULT_2X);
|
|
break;
|
|
break;
|
|
case 4:
|
|
case 4:
|
|
- intel_sdvo_set_clock_rate_mult(output,
|
|
|
|
|
|
+ intel_sdvo_set_clock_rate_mult(intel_encoder,
|
|
SDVO_CLOCK_RATE_MULT_4X);
|
|
SDVO_CLOCK_RATE_MULT_4X);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -1274,8 +1279,8 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder,
|
|
SDVO_VSYNC_ACTIVE_HIGH |
|
|
SDVO_VSYNC_ACTIVE_HIGH |
|
|
SDVO_HSYNC_ACTIVE_HIGH;
|
|
SDVO_HSYNC_ACTIVE_HIGH;
|
|
} else {
|
|
} else {
|
|
- sdvox |= I915_READ(sdvo_priv->output_device);
|
|
|
|
- switch (sdvo_priv->output_device) {
|
|
|
|
|
|
+ sdvox |= I915_READ(sdvo_priv->sdvo_reg);
|
|
|
|
+ switch (sdvo_priv->sdvo_reg) {
|
|
case SDVOB:
|
|
case SDVOB:
|
|
sdvox &= SDVOB_PRESERVE_MASK;
|
|
sdvox &= SDVOB_PRESERVE_MASK;
|
|
break;
|
|
break;
|
|
@@ -1299,26 +1304,26 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder,
|
|
|
|
|
|
if (sdvo_priv->sdvo_flags & SDVO_NEED_TO_STALL)
|
|
if (sdvo_priv->sdvo_flags & SDVO_NEED_TO_STALL)
|
|
sdvox |= SDVO_STALL_SELECT;
|
|
sdvox |= SDVO_STALL_SELECT;
|
|
- intel_sdvo_write_sdvox(output, sdvox);
|
|
|
|
|
|
+ intel_sdvo_write_sdvox(intel_encoder, sdvox);
|
|
}
|
|
}
|
|
|
|
|
|
static void intel_sdvo_dpms(struct drm_encoder *encoder, int mode)
|
|
static void intel_sdvo_dpms(struct drm_encoder *encoder, int mode)
|
|
{
|
|
{
|
|
struct drm_device *dev = encoder->dev;
|
|
struct drm_device *dev = encoder->dev;
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
- struct intel_output *intel_output = enc_to_intel_output(encoder);
|
|
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
u32 temp;
|
|
u32 temp;
|
|
|
|
|
|
if (mode != DRM_MODE_DPMS_ON) {
|
|
if (mode != DRM_MODE_DPMS_ON) {
|
|
- intel_sdvo_set_active_outputs(intel_output, 0);
|
|
|
|
|
|
+ intel_sdvo_set_active_outputs(intel_encoder, 0);
|
|
if (0)
|
|
if (0)
|
|
- intel_sdvo_set_encoder_power_state(intel_output, mode);
|
|
|
|
|
|
+ intel_sdvo_set_encoder_power_state(intel_encoder, mode);
|
|
|
|
|
|
if (mode == DRM_MODE_DPMS_OFF) {
|
|
if (mode == DRM_MODE_DPMS_OFF) {
|
|
- temp = I915_READ(sdvo_priv->output_device);
|
|
|
|
|
|
+ temp = I915_READ(sdvo_priv->sdvo_reg);
|
|
if ((temp & SDVO_ENABLE) != 0) {
|
|
if ((temp & SDVO_ENABLE) != 0) {
|
|
- intel_sdvo_write_sdvox(intel_output, temp & ~SDVO_ENABLE);
|
|
|
|
|
|
+ intel_sdvo_write_sdvox(intel_encoder, temp & ~SDVO_ENABLE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
@@ -1326,13 +1331,13 @@ static void intel_sdvo_dpms(struct drm_encoder *encoder, int mode)
|
|
int i;
|
|
int i;
|
|
u8 status;
|
|
u8 status;
|
|
|
|
|
|
- temp = I915_READ(sdvo_priv->output_device);
|
|
|
|
|
|
+ temp = I915_READ(sdvo_priv->sdvo_reg);
|
|
if ((temp & SDVO_ENABLE) == 0)
|
|
if ((temp & SDVO_ENABLE) == 0)
|
|
- intel_sdvo_write_sdvox(intel_output, temp | SDVO_ENABLE);
|
|
|
|
|
|
+ intel_sdvo_write_sdvox(intel_encoder, temp | SDVO_ENABLE);
|
|
for (i = 0; i < 2; i++)
|
|
for (i = 0; i < 2; i++)
|
|
intel_wait_for_vblank(dev);
|
|
intel_wait_for_vblank(dev);
|
|
|
|
|
|
- status = intel_sdvo_get_trained_inputs(intel_output, &input1,
|
|
|
|
|
|
+ status = intel_sdvo_get_trained_inputs(intel_encoder, &input1,
|
|
&input2);
|
|
&input2);
|
|
|
|
|
|
|
|
|
|
@@ -1346,8 +1351,8 @@ static void intel_sdvo_dpms(struct drm_encoder *encoder, int mode)
|
|
}
|
|
}
|
|
|
|
|
|
if (0)
|
|
if (0)
|
|
- intel_sdvo_set_encoder_power_state(intel_output, mode);
|
|
|
|
- intel_sdvo_set_active_outputs(intel_output, sdvo_priv->controlled_output);
|
|
|
|
|
|
+ intel_sdvo_set_encoder_power_state(intel_encoder, mode);
|
|
|
|
+ intel_sdvo_set_active_outputs(intel_encoder, sdvo_priv->controlled_output);
|
|
}
|
|
}
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
@@ -1356,22 +1361,22 @@ static void intel_sdvo_save(struct drm_connector *connector)
|
|
{
|
|
{
|
|
struct drm_device *dev = connector->dev;
|
|
struct drm_device *dev = connector->dev;
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
- struct intel_output *intel_output = to_intel_output(connector);
|
|
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
int o;
|
|
int o;
|
|
|
|
|
|
- sdvo_priv->save_sdvo_mult = intel_sdvo_get_clock_rate_mult(intel_output);
|
|
|
|
- intel_sdvo_get_active_outputs(intel_output, &sdvo_priv->save_active_outputs);
|
|
|
|
|
|
+ sdvo_priv->save_sdvo_mult = intel_sdvo_get_clock_rate_mult(intel_encoder);
|
|
|
|
+ intel_sdvo_get_active_outputs(intel_encoder, &sdvo_priv->save_active_outputs);
|
|
|
|
|
|
if (sdvo_priv->caps.sdvo_inputs_mask & 0x1) {
|
|
if (sdvo_priv->caps.sdvo_inputs_mask & 0x1) {
|
|
- intel_sdvo_set_target_input(intel_output, true, false);
|
|
|
|
- intel_sdvo_get_input_timing(intel_output,
|
|
|
|
|
|
+ intel_sdvo_set_target_input(intel_encoder, true, false);
|
|
|
|
+ intel_sdvo_get_input_timing(intel_encoder,
|
|
&sdvo_priv->save_input_dtd_1);
|
|
&sdvo_priv->save_input_dtd_1);
|
|
}
|
|
}
|
|
|
|
|
|
if (sdvo_priv->caps.sdvo_inputs_mask & 0x2) {
|
|
if (sdvo_priv->caps.sdvo_inputs_mask & 0x2) {
|
|
- intel_sdvo_set_target_input(intel_output, false, true);
|
|
|
|
- intel_sdvo_get_input_timing(intel_output,
|
|
|
|
|
|
+ intel_sdvo_set_target_input(intel_encoder, false, true);
|
|
|
|
+ intel_sdvo_get_input_timing(intel_encoder,
|
|
&sdvo_priv->save_input_dtd_2);
|
|
&sdvo_priv->save_input_dtd_2);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1380,8 +1385,8 @@ static void intel_sdvo_save(struct drm_connector *connector)
|
|
u16 this_output = (1 << o);
|
|
u16 this_output = (1 << o);
|
|
if (sdvo_priv->caps.output_flags & this_output)
|
|
if (sdvo_priv->caps.output_flags & this_output)
|
|
{
|
|
{
|
|
- intel_sdvo_set_target_output(intel_output, this_output);
|
|
|
|
- intel_sdvo_get_output_timing(intel_output,
|
|
|
|
|
|
+ intel_sdvo_set_target_output(intel_encoder, this_output);
|
|
|
|
+ intel_sdvo_get_output_timing(intel_encoder,
|
|
&sdvo_priv->save_output_dtd[o]);
|
|
&sdvo_priv->save_output_dtd[o]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -1389,66 +1394,66 @@ static void intel_sdvo_save(struct drm_connector *connector)
|
|
/* XXX: Save TV format/enhancements. */
|
|
/* XXX: Save TV format/enhancements. */
|
|
}
|
|
}
|
|
|
|
|
|
- sdvo_priv->save_SDVOX = I915_READ(sdvo_priv->output_device);
|
|
|
|
|
|
+ sdvo_priv->save_SDVOX = I915_READ(sdvo_priv->sdvo_reg);
|
|
}
|
|
}
|
|
|
|
|
|
static void intel_sdvo_restore(struct drm_connector *connector)
|
|
static void intel_sdvo_restore(struct drm_connector *connector)
|
|
{
|
|
{
|
|
struct drm_device *dev = connector->dev;
|
|
struct drm_device *dev = connector->dev;
|
|
- struct intel_output *intel_output = to_intel_output(connector);
|
|
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
int o;
|
|
int o;
|
|
int i;
|
|
int i;
|
|
bool input1, input2;
|
|
bool input1, input2;
|
|
u8 status;
|
|
u8 status;
|
|
|
|
|
|
- intel_sdvo_set_active_outputs(intel_output, 0);
|
|
|
|
|
|
+ intel_sdvo_set_active_outputs(intel_encoder, 0);
|
|
|
|
|
|
for (o = SDVO_OUTPUT_FIRST; o <= SDVO_OUTPUT_LAST; o++)
|
|
for (o = SDVO_OUTPUT_FIRST; o <= SDVO_OUTPUT_LAST; o++)
|
|
{
|
|
{
|
|
u16 this_output = (1 << o);
|
|
u16 this_output = (1 << o);
|
|
if (sdvo_priv->caps.output_flags & this_output) {
|
|
if (sdvo_priv->caps.output_flags & this_output) {
|
|
- intel_sdvo_set_target_output(intel_output, this_output);
|
|
|
|
- intel_sdvo_set_output_timing(intel_output, &sdvo_priv->save_output_dtd[o]);
|
|
|
|
|
|
+ intel_sdvo_set_target_output(intel_encoder, this_output);
|
|
|
|
+ intel_sdvo_set_output_timing(intel_encoder, &sdvo_priv->save_output_dtd[o]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if (sdvo_priv->caps.sdvo_inputs_mask & 0x1) {
|
|
if (sdvo_priv->caps.sdvo_inputs_mask & 0x1) {
|
|
- intel_sdvo_set_target_input(intel_output, true, false);
|
|
|
|
- intel_sdvo_set_input_timing(intel_output, &sdvo_priv->save_input_dtd_1);
|
|
|
|
|
|
+ intel_sdvo_set_target_input(intel_encoder, true, false);
|
|
|
|
+ intel_sdvo_set_input_timing(intel_encoder, &sdvo_priv->save_input_dtd_1);
|
|
}
|
|
}
|
|
|
|
|
|
if (sdvo_priv->caps.sdvo_inputs_mask & 0x2) {
|
|
if (sdvo_priv->caps.sdvo_inputs_mask & 0x2) {
|
|
- intel_sdvo_set_target_input(intel_output, false, true);
|
|
|
|
- intel_sdvo_set_input_timing(intel_output, &sdvo_priv->save_input_dtd_2);
|
|
|
|
|
|
+ intel_sdvo_set_target_input(intel_encoder, false, true);
|
|
|
|
+ intel_sdvo_set_input_timing(intel_encoder, &sdvo_priv->save_input_dtd_2);
|
|
}
|
|
}
|
|
|
|
|
|
- intel_sdvo_set_clock_rate_mult(intel_output, sdvo_priv->save_sdvo_mult);
|
|
|
|
|
|
+ intel_sdvo_set_clock_rate_mult(intel_encoder, sdvo_priv->save_sdvo_mult);
|
|
|
|
|
|
if (sdvo_priv->is_tv) {
|
|
if (sdvo_priv->is_tv) {
|
|
/* XXX: Restore TV format/enhancements. */
|
|
/* XXX: Restore TV format/enhancements. */
|
|
}
|
|
}
|
|
|
|
|
|
- intel_sdvo_write_sdvox(intel_output, sdvo_priv->save_SDVOX);
|
|
|
|
|
|
+ intel_sdvo_write_sdvox(intel_encoder, sdvo_priv->save_SDVOX);
|
|
|
|
|
|
if (sdvo_priv->save_SDVOX & SDVO_ENABLE)
|
|
if (sdvo_priv->save_SDVOX & SDVO_ENABLE)
|
|
{
|
|
{
|
|
for (i = 0; i < 2; i++)
|
|
for (i = 0; i < 2; i++)
|
|
intel_wait_for_vblank(dev);
|
|
intel_wait_for_vblank(dev);
|
|
- status = intel_sdvo_get_trained_inputs(intel_output, &input1, &input2);
|
|
|
|
|
|
+ status = intel_sdvo_get_trained_inputs(intel_encoder, &input1, &input2);
|
|
if (status == SDVO_CMD_STATUS_SUCCESS && !input1)
|
|
if (status == SDVO_CMD_STATUS_SUCCESS && !input1)
|
|
DRM_DEBUG_KMS("First %s output reported failure to "
|
|
DRM_DEBUG_KMS("First %s output reported failure to "
|
|
"sync\n", SDVO_NAME(sdvo_priv));
|
|
"sync\n", SDVO_NAME(sdvo_priv));
|
|
}
|
|
}
|
|
|
|
|
|
- intel_sdvo_set_active_outputs(intel_output, sdvo_priv->save_active_outputs);
|
|
|
|
|
|
+ intel_sdvo_set_active_outputs(intel_encoder, sdvo_priv->save_active_outputs);
|
|
}
|
|
}
|
|
|
|
|
|
static int intel_sdvo_mode_valid(struct drm_connector *connector,
|
|
static int intel_sdvo_mode_valid(struct drm_connector *connector,
|
|
struct drm_display_mode *mode)
|
|
struct drm_display_mode *mode)
|
|
{
|
|
{
|
|
- struct intel_output *intel_output = to_intel_output(connector);
|
|
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
|
|
|
|
if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
|
|
if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
|
|
return MODE_NO_DBLESCAN;
|
|
return MODE_NO_DBLESCAN;
|
|
@@ -1473,12 +1478,12 @@ static int intel_sdvo_mode_valid(struct drm_connector *connector,
|
|
return MODE_OK;
|
|
return MODE_OK;
|
|
}
|
|
}
|
|
|
|
|
|
-static bool intel_sdvo_get_capabilities(struct intel_output *intel_output, struct intel_sdvo_caps *caps)
|
|
|
|
|
|
+static bool intel_sdvo_get_capabilities(struct intel_encoder *intel_encoder, struct intel_sdvo_caps *caps)
|
|
{
|
|
{
|
|
u8 status;
|
|
u8 status;
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_DEVICE_CAPS, NULL, 0);
|
|
|
|
- status = intel_sdvo_read_response(intel_output, caps, sizeof(*caps));
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_GET_DEVICE_CAPS, NULL, 0);
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, caps, sizeof(*caps));
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
return false;
|
|
return false;
|
|
|
|
|
|
@@ -1488,22 +1493,22 @@ static bool intel_sdvo_get_capabilities(struct intel_output *intel_output, struc
|
|
struct drm_connector* intel_sdvo_find(struct drm_device *dev, int sdvoB)
|
|
struct drm_connector* intel_sdvo_find(struct drm_device *dev, int sdvoB)
|
|
{
|
|
{
|
|
struct drm_connector *connector = NULL;
|
|
struct drm_connector *connector = NULL;
|
|
- struct intel_output *iout = NULL;
|
|
|
|
|
|
+ struct intel_encoder *iout = NULL;
|
|
struct intel_sdvo_priv *sdvo;
|
|
struct intel_sdvo_priv *sdvo;
|
|
|
|
|
|
/* find the sdvo connector */
|
|
/* find the sdvo connector */
|
|
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
|
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
|
- iout = to_intel_output(connector);
|
|
|
|
|
|
+ iout = to_intel_encoder(connector);
|
|
|
|
|
|
if (iout->type != INTEL_OUTPUT_SDVO)
|
|
if (iout->type != INTEL_OUTPUT_SDVO)
|
|
continue;
|
|
continue;
|
|
|
|
|
|
sdvo = iout->dev_priv;
|
|
sdvo = iout->dev_priv;
|
|
|
|
|
|
- if (sdvo->output_device == SDVOB && sdvoB)
|
|
|
|
|
|
+ if (sdvo->sdvo_reg == SDVOB && sdvoB)
|
|
return connector;
|
|
return connector;
|
|
|
|
|
|
- if (sdvo->output_device == SDVOC && !sdvoB)
|
|
|
|
|
|
+ if (sdvo->sdvo_reg == SDVOC && !sdvoB)
|
|
return connector;
|
|
return connector;
|
|
|
|
|
|
}
|
|
}
|
|
@@ -1515,16 +1520,16 @@ int intel_sdvo_supports_hotplug(struct drm_connector *connector)
|
|
{
|
|
{
|
|
u8 response[2];
|
|
u8 response[2];
|
|
u8 status;
|
|
u8 status;
|
|
- struct intel_output *intel_output;
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder;
|
|
DRM_DEBUG_KMS("\n");
|
|
DRM_DEBUG_KMS("\n");
|
|
|
|
|
|
if (!connector)
|
|
if (!connector)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
- intel_output = to_intel_output(connector);
|
|
|
|
|
|
+ intel_encoder = to_intel_encoder(connector);
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_HOT_PLUG_SUPPORT, NULL, 0);
|
|
|
|
- status = intel_sdvo_read_response(intel_output, &response, 2);
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_GET_HOT_PLUG_SUPPORT, NULL, 0);
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, &response, 2);
|
|
|
|
|
|
if (response[0] !=0)
|
|
if (response[0] !=0)
|
|
return 1;
|
|
return 1;
|
|
@@ -1536,30 +1541,30 @@ void intel_sdvo_set_hotplug(struct drm_connector *connector, int on)
|
|
{
|
|
{
|
|
u8 response[2];
|
|
u8 response[2];
|
|
u8 status;
|
|
u8 status;
|
|
- struct intel_output *intel_output = to_intel_output(connector);
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_ACTIVE_HOT_PLUG, NULL, 0);
|
|
|
|
- intel_sdvo_read_response(intel_output, &response, 2);
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_GET_ACTIVE_HOT_PLUG, NULL, 0);
|
|
|
|
+ intel_sdvo_read_response(intel_encoder, &response, 2);
|
|
|
|
|
|
if (on) {
|
|
if (on) {
|
|
- intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_HOT_PLUG_SUPPORT, NULL, 0);
|
|
|
|
- status = intel_sdvo_read_response(intel_output, &response, 2);
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_GET_HOT_PLUG_SUPPORT, NULL, 0);
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, &response, 2);
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output, SDVO_CMD_SET_ACTIVE_HOT_PLUG, &response, 2);
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_SET_ACTIVE_HOT_PLUG, &response, 2);
|
|
} else {
|
|
} else {
|
|
response[0] = 0;
|
|
response[0] = 0;
|
|
response[1] = 0;
|
|
response[1] = 0;
|
|
- intel_sdvo_write_cmd(intel_output, SDVO_CMD_SET_ACTIVE_HOT_PLUG, &response, 2);
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_SET_ACTIVE_HOT_PLUG, &response, 2);
|
|
}
|
|
}
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_ACTIVE_HOT_PLUG, NULL, 0);
|
|
|
|
- intel_sdvo_read_response(intel_output, &response, 2);
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_GET_ACTIVE_HOT_PLUG, NULL, 0);
|
|
|
|
+ intel_sdvo_read_response(intel_encoder, &response, 2);
|
|
}
|
|
}
|
|
|
|
|
|
static bool
|
|
static bool
|
|
-intel_sdvo_multifunc_encoder(struct intel_output *intel_output)
|
|
|
|
|
|
+intel_sdvo_multifunc_encoder(struct intel_encoder *intel_encoder)
|
|
{
|
|
{
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
int caps = 0;
|
|
int caps = 0;
|
|
|
|
|
|
if (sdvo_priv->caps.output_flags &
|
|
if (sdvo_priv->caps.output_flags &
|
|
@@ -1593,11 +1598,11 @@ static struct drm_connector *
|
|
intel_find_analog_connector(struct drm_device *dev)
|
|
intel_find_analog_connector(struct drm_device *dev)
|
|
{
|
|
{
|
|
struct drm_connector *connector;
|
|
struct drm_connector *connector;
|
|
- struct intel_output *intel_output;
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder;
|
|
|
|
|
|
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
|
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
|
- intel_output = to_intel_output(connector);
|
|
|
|
- if (intel_output->type == INTEL_OUTPUT_ANALOG)
|
|
|
|
|
|
+ intel_encoder = to_intel_encoder(connector);
|
|
|
|
+ if (intel_encoder->type == INTEL_OUTPUT_ANALOG)
|
|
return connector;
|
|
return connector;
|
|
}
|
|
}
|
|
return NULL;
|
|
return NULL;
|
|
@@ -1622,16 +1627,16 @@ intel_analog_is_connected(struct drm_device *dev)
|
|
enum drm_connector_status
|
|
enum drm_connector_status
|
|
intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response)
|
|
intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response)
|
|
{
|
|
{
|
|
- struct intel_output *intel_output = to_intel_output(connector);
|
|
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
enum drm_connector_status status = connector_status_connected;
|
|
enum drm_connector_status status = connector_status_connected;
|
|
struct edid *edid = NULL;
|
|
struct edid *edid = NULL;
|
|
|
|
|
|
- edid = drm_get_edid(&intel_output->base,
|
|
|
|
- intel_output->ddc_bus);
|
|
|
|
|
|
+ edid = drm_get_edid(&intel_encoder->base,
|
|
|
|
+ intel_encoder->ddc_bus);
|
|
|
|
|
|
/* This is only applied to SDVO cards with multiple outputs */
|
|
/* This is only applied to SDVO cards with multiple outputs */
|
|
- if (edid == NULL && intel_sdvo_multifunc_encoder(intel_output)) {
|
|
|
|
|
|
+ if (edid == NULL && intel_sdvo_multifunc_encoder(intel_encoder)) {
|
|
uint8_t saved_ddc, temp_ddc;
|
|
uint8_t saved_ddc, temp_ddc;
|
|
saved_ddc = sdvo_priv->ddc_bus;
|
|
saved_ddc = sdvo_priv->ddc_bus;
|
|
temp_ddc = sdvo_priv->ddc_bus >> 1;
|
|
temp_ddc = sdvo_priv->ddc_bus >> 1;
|
|
@@ -1641,8 +1646,8 @@ intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response)
|
|
*/
|
|
*/
|
|
while(temp_ddc > 1) {
|
|
while(temp_ddc > 1) {
|
|
sdvo_priv->ddc_bus = temp_ddc;
|
|
sdvo_priv->ddc_bus = temp_ddc;
|
|
- edid = drm_get_edid(&intel_output->base,
|
|
|
|
- intel_output->ddc_bus);
|
|
|
|
|
|
+ edid = drm_get_edid(&intel_encoder->base,
|
|
|
|
+ intel_encoder->ddc_bus);
|
|
if (edid) {
|
|
if (edid) {
|
|
/*
|
|
/*
|
|
* When we can get the EDID, maybe it is the
|
|
* When we can get the EDID, maybe it is the
|
|
@@ -1661,8 +1666,8 @@ intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response)
|
|
*/
|
|
*/
|
|
if (edid == NULL &&
|
|
if (edid == NULL &&
|
|
sdvo_priv->analog_ddc_bus &&
|
|
sdvo_priv->analog_ddc_bus &&
|
|
- !intel_analog_is_connected(intel_output->base.dev))
|
|
|
|
- edid = drm_get_edid(&intel_output->base,
|
|
|
|
|
|
+ !intel_analog_is_connected(intel_encoder->base.dev))
|
|
|
|
+ edid = drm_get_edid(&intel_encoder->base,
|
|
sdvo_priv->analog_ddc_bus);
|
|
sdvo_priv->analog_ddc_bus);
|
|
if (edid != NULL) {
|
|
if (edid != NULL) {
|
|
/* Don't report the output as connected if it's a DVI-I
|
|
/* Don't report the output as connected if it's a DVI-I
|
|
@@ -1677,7 +1682,7 @@ intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response)
|
|
}
|
|
}
|
|
|
|
|
|
kfree(edid);
|
|
kfree(edid);
|
|
- intel_output->base.display_info.raw_edid = NULL;
|
|
|
|
|
|
+ intel_encoder->base.display_info.raw_edid = NULL;
|
|
|
|
|
|
} else if (response & (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1))
|
|
} else if (response & (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1))
|
|
status = connector_status_disconnected;
|
|
status = connector_status_disconnected;
|
|
@@ -1689,16 +1694,16 @@ static enum drm_connector_status intel_sdvo_detect(struct drm_connector *connect
|
|
{
|
|
{
|
|
uint16_t response;
|
|
uint16_t response;
|
|
u8 status;
|
|
u8 status;
|
|
- struct intel_output *intel_output = to_intel_output(connector);
|
|
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder,
|
|
SDVO_CMD_GET_ATTACHED_DISPLAYS, NULL, 0);
|
|
SDVO_CMD_GET_ATTACHED_DISPLAYS, NULL, 0);
|
|
if (sdvo_priv->is_tv) {
|
|
if (sdvo_priv->is_tv) {
|
|
/* add 30ms delay when the output type is SDVO-TV */
|
|
/* add 30ms delay when the output type is SDVO-TV */
|
|
mdelay(30);
|
|
mdelay(30);
|
|
}
|
|
}
|
|
- status = intel_sdvo_read_response(intel_output, &response, 2);
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, &response, 2);
|
|
|
|
|
|
DRM_DEBUG_KMS("SDVO response %d %d\n", response & 0xff, response >> 8);
|
|
DRM_DEBUG_KMS("SDVO response %d %d\n", response & 0xff, response >> 8);
|
|
|
|
|
|
@@ -1708,10 +1713,10 @@ static enum drm_connector_status intel_sdvo_detect(struct drm_connector *connect
|
|
if (response == 0)
|
|
if (response == 0)
|
|
return connector_status_disconnected;
|
|
return connector_status_disconnected;
|
|
|
|
|
|
- if (intel_sdvo_multifunc_encoder(intel_output) &&
|
|
|
|
|
|
+ if (intel_sdvo_multifunc_encoder(intel_encoder) &&
|
|
sdvo_priv->attached_output != response) {
|
|
sdvo_priv->attached_output != response) {
|
|
if (sdvo_priv->controlled_output != response &&
|
|
if (sdvo_priv->controlled_output != response &&
|
|
- intel_sdvo_output_setup(intel_output, response) != true)
|
|
|
|
|
|
+ intel_sdvo_output_setup(intel_encoder, response) != true)
|
|
return connector_status_unknown;
|
|
return connector_status_unknown;
|
|
sdvo_priv->attached_output = response;
|
|
sdvo_priv->attached_output = response;
|
|
}
|
|
}
|
|
@@ -1720,12 +1725,12 @@ static enum drm_connector_status intel_sdvo_detect(struct drm_connector *connect
|
|
|
|
|
|
static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)
|
|
static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)
|
|
{
|
|
{
|
|
- struct intel_output *intel_output = to_intel_output(connector);
|
|
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
int num_modes;
|
|
int num_modes;
|
|
|
|
|
|
/* set the bus switch and get the modes */
|
|
/* set the bus switch and get the modes */
|
|
- num_modes = intel_ddc_get_modes(intel_output);
|
|
|
|
|
|
+ num_modes = intel_ddc_get_modes(intel_encoder);
|
|
|
|
|
|
/*
|
|
/*
|
|
* Mac mini hack. On this device, the DVI-I connector shares one DDC
|
|
* Mac mini hack. On this device, the DVI-I connector shares one DDC
|
|
@@ -1735,17 +1740,17 @@ static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)
|
|
*/
|
|
*/
|
|
if (num_modes == 0 &&
|
|
if (num_modes == 0 &&
|
|
sdvo_priv->analog_ddc_bus &&
|
|
sdvo_priv->analog_ddc_bus &&
|
|
- !intel_analog_is_connected(intel_output->base.dev)) {
|
|
|
|
|
|
+ !intel_analog_is_connected(intel_encoder->base.dev)) {
|
|
struct i2c_adapter *digital_ddc_bus;
|
|
struct i2c_adapter *digital_ddc_bus;
|
|
|
|
|
|
/* Switch to the analog ddc bus and try that
|
|
/* Switch to the analog ddc bus and try that
|
|
*/
|
|
*/
|
|
- digital_ddc_bus = intel_output->ddc_bus;
|
|
|
|
- intel_output->ddc_bus = sdvo_priv->analog_ddc_bus;
|
|
|
|
|
|
+ digital_ddc_bus = intel_encoder->ddc_bus;
|
|
|
|
+ intel_encoder->ddc_bus = sdvo_priv->analog_ddc_bus;
|
|
|
|
|
|
- (void) intel_ddc_get_modes(intel_output);
|
|
|
|
|
|
+ (void) intel_ddc_get_modes(intel_encoder);
|
|
|
|
|
|
- intel_output->ddc_bus = digital_ddc_bus;
|
|
|
|
|
|
+ intel_encoder->ddc_bus = digital_ddc_bus;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1816,7 +1821,7 @@ struct drm_display_mode sdvo_tv_modes[] = {
|
|
|
|
|
|
static void intel_sdvo_get_tv_modes(struct drm_connector *connector)
|
|
static void intel_sdvo_get_tv_modes(struct drm_connector *connector)
|
|
{
|
|
{
|
|
- struct intel_output *output = to_intel_output(connector);
|
|
|
|
|
|
+ struct intel_encoder *output = to_intel_encoder(connector);
|
|
struct intel_sdvo_priv *sdvo_priv = output->dev_priv;
|
|
struct intel_sdvo_priv *sdvo_priv = output->dev_priv;
|
|
struct intel_sdvo_sdtv_resolution_request tv_res;
|
|
struct intel_sdvo_sdtv_resolution_request tv_res;
|
|
uint32_t reply = 0, format_map = 0;
|
|
uint32_t reply = 0, format_map = 0;
|
|
@@ -1858,9 +1863,9 @@ static void intel_sdvo_get_tv_modes(struct drm_connector *connector)
|
|
|
|
|
|
static void intel_sdvo_get_lvds_modes(struct drm_connector *connector)
|
|
static void intel_sdvo_get_lvds_modes(struct drm_connector *connector)
|
|
{
|
|
{
|
|
- struct intel_output *intel_output = to_intel_output(connector);
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
|
struct drm_i915_private *dev_priv = connector->dev->dev_private;
|
|
struct drm_i915_private *dev_priv = connector->dev->dev_private;
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
struct drm_display_mode *newmode;
|
|
struct drm_display_mode *newmode;
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -1868,7 +1873,7 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector)
|
|
* Assume that the preferred modes are
|
|
* Assume that the preferred modes are
|
|
* arranged in priority order.
|
|
* arranged in priority order.
|
|
*/
|
|
*/
|
|
- intel_ddc_get_modes(intel_output);
|
|
|
|
|
|
+ intel_ddc_get_modes(intel_encoder);
|
|
if (list_empty(&connector->probed_modes) == false)
|
|
if (list_empty(&connector->probed_modes) == false)
|
|
goto end;
|
|
goto end;
|
|
|
|
|
|
@@ -1897,7 +1902,7 @@ end:
|
|
|
|
|
|
static int intel_sdvo_get_modes(struct drm_connector *connector)
|
|
static int intel_sdvo_get_modes(struct drm_connector *connector)
|
|
{
|
|
{
|
|
- struct intel_output *output = to_intel_output(connector);
|
|
|
|
|
|
+ struct intel_encoder *output = to_intel_encoder(connector);
|
|
struct intel_sdvo_priv *sdvo_priv = output->dev_priv;
|
|
struct intel_sdvo_priv *sdvo_priv = output->dev_priv;
|
|
|
|
|
|
if (sdvo_priv->is_tv)
|
|
if (sdvo_priv->is_tv)
|
|
@@ -1915,8 +1920,8 @@ static int intel_sdvo_get_modes(struct drm_connector *connector)
|
|
static
|
|
static
|
|
void intel_sdvo_destroy_enhance_property(struct drm_connector *connector)
|
|
void intel_sdvo_destroy_enhance_property(struct drm_connector *connector)
|
|
{
|
|
{
|
|
- struct intel_output *intel_output = to_intel_output(connector);
|
|
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
struct drm_device *dev = connector->dev;
|
|
struct drm_device *dev = connector->dev;
|
|
|
|
|
|
if (sdvo_priv->is_tv) {
|
|
if (sdvo_priv->is_tv) {
|
|
@@ -1953,13 +1958,13 @@ void intel_sdvo_destroy_enhance_property(struct drm_connector *connector)
|
|
|
|
|
|
static void intel_sdvo_destroy(struct drm_connector *connector)
|
|
static void intel_sdvo_destroy(struct drm_connector *connector)
|
|
{
|
|
{
|
|
- struct intel_output *intel_output = to_intel_output(connector);
|
|
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
|
|
|
|
- if (intel_output->i2c_bus)
|
|
|
|
- intel_i2c_destroy(intel_output->i2c_bus);
|
|
|
|
- if (intel_output->ddc_bus)
|
|
|
|
- intel_i2c_destroy(intel_output->ddc_bus);
|
|
|
|
|
|
+ if (intel_encoder->i2c_bus)
|
|
|
|
+ intel_i2c_destroy(intel_encoder->i2c_bus);
|
|
|
|
+ if (intel_encoder->ddc_bus)
|
|
|
|
+ intel_i2c_destroy(intel_encoder->ddc_bus);
|
|
if (sdvo_priv->analog_ddc_bus)
|
|
if (sdvo_priv->analog_ddc_bus)
|
|
intel_i2c_destroy(sdvo_priv->analog_ddc_bus);
|
|
intel_i2c_destroy(sdvo_priv->analog_ddc_bus);
|
|
|
|
|
|
@@ -1977,7 +1982,7 @@ static void intel_sdvo_destroy(struct drm_connector *connector)
|
|
drm_sysfs_connector_remove(connector);
|
|
drm_sysfs_connector_remove(connector);
|
|
drm_connector_cleanup(connector);
|
|
drm_connector_cleanup(connector);
|
|
|
|
|
|
- kfree(intel_output);
|
|
|
|
|
|
+ kfree(intel_encoder);
|
|
}
|
|
}
|
|
|
|
|
|
static int
|
|
static int
|
|
@@ -1985,9 +1990,9 @@ intel_sdvo_set_property(struct drm_connector *connector,
|
|
struct drm_property *property,
|
|
struct drm_property *property,
|
|
uint64_t val)
|
|
uint64_t val)
|
|
{
|
|
{
|
|
- struct intel_output *intel_output = to_intel_output(connector);
|
|
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
- struct drm_encoder *encoder = &intel_output->enc;
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
|
|
+ struct drm_encoder *encoder = &intel_encoder->enc;
|
|
struct drm_crtc *crtc = encoder->crtc;
|
|
struct drm_crtc *crtc = encoder->crtc;
|
|
int ret = 0;
|
|
int ret = 0;
|
|
bool changed = false;
|
|
bool changed = false;
|
|
@@ -2095,8 +2100,8 @@ intel_sdvo_set_property(struct drm_connector *connector,
|
|
sdvo_priv->cur_brightness = temp_value;
|
|
sdvo_priv->cur_brightness = temp_value;
|
|
}
|
|
}
|
|
if (cmd) {
|
|
if (cmd) {
|
|
- intel_sdvo_write_cmd(intel_output, cmd, &temp_value, 2);
|
|
|
|
- status = intel_sdvo_read_response(intel_output,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, cmd, &temp_value, 2);
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder,
|
|
NULL, 0);
|
|
NULL, 0);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
DRM_DEBUG_KMS("Incorrect SDVO command \n");
|
|
DRM_DEBUG_KMS("Incorrect SDVO command \n");
|
|
@@ -2191,7 +2196,7 @@ intel_sdvo_select_ddc_bus(struct intel_sdvo_priv *dev_priv)
|
|
}
|
|
}
|
|
|
|
|
|
static bool
|
|
static bool
|
|
-intel_sdvo_get_digital_encoding_mode(struct intel_output *output)
|
|
|
|
|
|
+intel_sdvo_get_digital_encoding_mode(struct intel_encoder *output)
|
|
{
|
|
{
|
|
struct intel_sdvo_priv *sdvo_priv = output->dev_priv;
|
|
struct intel_sdvo_priv *sdvo_priv = output->dev_priv;
|
|
uint8_t status;
|
|
uint8_t status;
|
|
@@ -2205,42 +2210,42 @@ intel_sdvo_get_digital_encoding_mode(struct intel_output *output)
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
-static struct intel_output *
|
|
|
|
-intel_sdvo_chan_to_intel_output(struct intel_i2c_chan *chan)
|
|
|
|
|
|
+static struct intel_encoder *
|
|
|
|
+intel_sdvo_chan_to_intel_encoder(struct intel_i2c_chan *chan)
|
|
{
|
|
{
|
|
struct drm_device *dev = chan->drm_dev;
|
|
struct drm_device *dev = chan->drm_dev;
|
|
struct drm_connector *connector;
|
|
struct drm_connector *connector;
|
|
- struct intel_output *intel_output = NULL;
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder = NULL;
|
|
|
|
|
|
list_for_each_entry(connector,
|
|
list_for_each_entry(connector,
|
|
&dev->mode_config.connector_list, head) {
|
|
&dev->mode_config.connector_list, head) {
|
|
- if (to_intel_output(connector)->ddc_bus == &chan->adapter) {
|
|
|
|
- intel_output = to_intel_output(connector);
|
|
|
|
|
|
+ if (to_intel_encoder(connector)->ddc_bus == &chan->adapter) {
|
|
|
|
+ intel_encoder = to_intel_encoder(connector);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- return intel_output;
|
|
|
|
|
|
+ return intel_encoder;
|
|
}
|
|
}
|
|
|
|
|
|
static int intel_sdvo_master_xfer(struct i2c_adapter *i2c_adap,
|
|
static int intel_sdvo_master_xfer(struct i2c_adapter *i2c_adap,
|
|
struct i2c_msg msgs[], int num)
|
|
struct i2c_msg msgs[], int num)
|
|
{
|
|
{
|
|
- struct intel_output *intel_output;
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder;
|
|
struct intel_sdvo_priv *sdvo_priv;
|
|
struct intel_sdvo_priv *sdvo_priv;
|
|
struct i2c_algo_bit_data *algo_data;
|
|
struct i2c_algo_bit_data *algo_data;
|
|
const struct i2c_algorithm *algo;
|
|
const struct i2c_algorithm *algo;
|
|
|
|
|
|
algo_data = (struct i2c_algo_bit_data *)i2c_adap->algo_data;
|
|
algo_data = (struct i2c_algo_bit_data *)i2c_adap->algo_data;
|
|
- intel_output =
|
|
|
|
- intel_sdvo_chan_to_intel_output(
|
|
|
|
|
|
+ intel_encoder =
|
|
|
|
+ intel_sdvo_chan_to_intel_encoder(
|
|
(struct intel_i2c_chan *)(algo_data->data));
|
|
(struct intel_i2c_chan *)(algo_data->data));
|
|
- if (intel_output == NULL)
|
|
|
|
|
|
+ if (intel_encoder == NULL)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
- sdvo_priv = intel_output->dev_priv;
|
|
|
|
- algo = intel_output->i2c_bus->algo;
|
|
|
|
|
|
+ sdvo_priv = intel_encoder->dev_priv;
|
|
|
|
+ algo = intel_encoder->i2c_bus->algo;
|
|
|
|
|
|
- intel_sdvo_set_control_bus_switch(intel_output, sdvo_priv->ddc_bus);
|
|
|
|
|
|
+ intel_sdvo_set_control_bus_switch(intel_encoder, sdvo_priv->ddc_bus);
|
|
return algo->master_xfer(i2c_adap, msgs, num);
|
|
return algo->master_xfer(i2c_adap, msgs, num);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2249,12 +2254,12 @@ static struct i2c_algorithm intel_sdvo_i2c_bit_algo = {
|
|
};
|
|
};
|
|
|
|
|
|
static u8
|
|
static u8
|
|
-intel_sdvo_get_slave_addr(struct drm_device *dev, int output_device)
|
|
|
|
|
|
+intel_sdvo_get_slave_addr(struct drm_device *dev, int sdvo_reg)
|
|
{
|
|
{
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
struct sdvo_device_mapping *my_mapping, *other_mapping;
|
|
struct sdvo_device_mapping *my_mapping, *other_mapping;
|
|
|
|
|
|
- if (output_device == SDVOB) {
|
|
|
|
|
|
+ if (sdvo_reg == SDVOB) {
|
|
my_mapping = &dev_priv->sdvo_mappings[0];
|
|
my_mapping = &dev_priv->sdvo_mappings[0];
|
|
other_mapping = &dev_priv->sdvo_mappings[1];
|
|
other_mapping = &dev_priv->sdvo_mappings[1];
|
|
} else {
|
|
} else {
|
|
@@ -2279,7 +2284,7 @@ intel_sdvo_get_slave_addr(struct drm_device *dev, int output_device)
|
|
/* No SDVO device info is found for another DVO port,
|
|
/* No SDVO device info is found for another DVO port,
|
|
* so use mapping assumption we had before BIOS parsing.
|
|
* so use mapping assumption we had before BIOS parsing.
|
|
*/
|
|
*/
|
|
- if (output_device == SDVOB)
|
|
|
|
|
|
+ if (sdvo_reg == SDVOB)
|
|
return 0x70;
|
|
return 0x70;
|
|
else
|
|
else
|
|
return 0x72;
|
|
return 0x72;
|
|
@@ -2305,15 +2310,15 @@ static struct dmi_system_id intel_sdvo_bad_tv[] = {
|
|
};
|
|
};
|
|
|
|
|
|
static bool
|
|
static bool
|
|
-intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags)
|
|
|
|
|
|
+intel_sdvo_output_setup(struct intel_encoder *intel_encoder, uint16_t flags)
|
|
{
|
|
{
|
|
- struct drm_connector *connector = &intel_output->base;
|
|
|
|
- struct drm_encoder *encoder = &intel_output->enc;
|
|
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct drm_connector *connector = &intel_encoder->base;
|
|
|
|
+ struct drm_encoder *encoder = &intel_encoder->enc;
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
bool ret = true, registered = false;
|
|
bool ret = true, registered = false;
|
|
|
|
|
|
sdvo_priv->is_tv = false;
|
|
sdvo_priv->is_tv = false;
|
|
- intel_output->needs_tv_clock = false;
|
|
|
|
|
|
+ intel_encoder->needs_tv_clock = false;
|
|
sdvo_priv->is_lvds = false;
|
|
sdvo_priv->is_lvds = false;
|
|
|
|
|
|
if (device_is_registered(&connector->kdev)) {
|
|
if (device_is_registered(&connector->kdev)) {
|
|
@@ -2331,16 +2336,16 @@ intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags)
|
|
encoder->encoder_type = DRM_MODE_ENCODER_TMDS;
|
|
encoder->encoder_type = DRM_MODE_ENCODER_TMDS;
|
|
connector->connector_type = DRM_MODE_CONNECTOR_DVID;
|
|
connector->connector_type = DRM_MODE_CONNECTOR_DVID;
|
|
|
|
|
|
- if (intel_sdvo_get_supp_encode(intel_output,
|
|
|
|
|
|
+ if (intel_sdvo_get_supp_encode(intel_encoder,
|
|
&sdvo_priv->encode) &&
|
|
&sdvo_priv->encode) &&
|
|
- intel_sdvo_get_digital_encoding_mode(intel_output) &&
|
|
|
|
|
|
+ intel_sdvo_get_digital_encoding_mode(intel_encoder) &&
|
|
sdvo_priv->is_hdmi) {
|
|
sdvo_priv->is_hdmi) {
|
|
/* enable hdmi encoding mode if supported */
|
|
/* enable hdmi encoding mode if supported */
|
|
- intel_sdvo_set_encode(intel_output, SDVO_ENCODE_HDMI);
|
|
|
|
- intel_sdvo_set_colorimetry(intel_output,
|
|
|
|
|
|
+ intel_sdvo_set_encode(intel_encoder, SDVO_ENCODE_HDMI);
|
|
|
|
+ intel_sdvo_set_colorimetry(intel_encoder,
|
|
SDVO_COLORIMETRY_RGB256);
|
|
SDVO_COLORIMETRY_RGB256);
|
|
connector->connector_type = DRM_MODE_CONNECTOR_HDMIA;
|
|
connector->connector_type = DRM_MODE_CONNECTOR_HDMIA;
|
|
- intel_output->clone_mask =
|
|
|
|
|
|
+ intel_encoder->clone_mask =
|
|
(1 << INTEL_SDVO_NON_TV_CLONE_BIT) |
|
|
(1 << INTEL_SDVO_NON_TV_CLONE_BIT) |
|
|
(1 << INTEL_ANALOG_CLONE_BIT);
|
|
(1 << INTEL_ANALOG_CLONE_BIT);
|
|
}
|
|
}
|
|
@@ -2351,21 +2356,21 @@ intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags)
|
|
encoder->encoder_type = DRM_MODE_ENCODER_TVDAC;
|
|
encoder->encoder_type = DRM_MODE_ENCODER_TVDAC;
|
|
connector->connector_type = DRM_MODE_CONNECTOR_SVIDEO;
|
|
connector->connector_type = DRM_MODE_CONNECTOR_SVIDEO;
|
|
sdvo_priv->is_tv = true;
|
|
sdvo_priv->is_tv = true;
|
|
- intel_output->needs_tv_clock = true;
|
|
|
|
- intel_output->clone_mask = 1 << INTEL_SDVO_TV_CLONE_BIT;
|
|
|
|
|
|
+ intel_encoder->needs_tv_clock = true;
|
|
|
|
+ intel_encoder->clone_mask = 1 << INTEL_SDVO_TV_CLONE_BIT;
|
|
} else if (flags & SDVO_OUTPUT_RGB0) {
|
|
} else if (flags & SDVO_OUTPUT_RGB0) {
|
|
|
|
|
|
sdvo_priv->controlled_output = SDVO_OUTPUT_RGB0;
|
|
sdvo_priv->controlled_output = SDVO_OUTPUT_RGB0;
|
|
encoder->encoder_type = DRM_MODE_ENCODER_DAC;
|
|
encoder->encoder_type = DRM_MODE_ENCODER_DAC;
|
|
connector->connector_type = DRM_MODE_CONNECTOR_VGA;
|
|
connector->connector_type = DRM_MODE_CONNECTOR_VGA;
|
|
- intel_output->clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT) |
|
|
|
|
|
|
+ intel_encoder->clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT) |
|
|
(1 << INTEL_ANALOG_CLONE_BIT);
|
|
(1 << INTEL_ANALOG_CLONE_BIT);
|
|
} else if (flags & SDVO_OUTPUT_RGB1) {
|
|
} else if (flags & SDVO_OUTPUT_RGB1) {
|
|
|
|
|
|
sdvo_priv->controlled_output = SDVO_OUTPUT_RGB1;
|
|
sdvo_priv->controlled_output = SDVO_OUTPUT_RGB1;
|
|
encoder->encoder_type = DRM_MODE_ENCODER_DAC;
|
|
encoder->encoder_type = DRM_MODE_ENCODER_DAC;
|
|
connector->connector_type = DRM_MODE_CONNECTOR_VGA;
|
|
connector->connector_type = DRM_MODE_CONNECTOR_VGA;
|
|
- intel_output->clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT) |
|
|
|
|
|
|
+ intel_encoder->clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT) |
|
|
(1 << INTEL_ANALOG_CLONE_BIT);
|
|
(1 << INTEL_ANALOG_CLONE_BIT);
|
|
} else if (flags & SDVO_OUTPUT_CVBS0) {
|
|
} else if (flags & SDVO_OUTPUT_CVBS0) {
|
|
|
|
|
|
@@ -2373,15 +2378,15 @@ intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags)
|
|
encoder->encoder_type = DRM_MODE_ENCODER_TVDAC;
|
|
encoder->encoder_type = DRM_MODE_ENCODER_TVDAC;
|
|
connector->connector_type = DRM_MODE_CONNECTOR_SVIDEO;
|
|
connector->connector_type = DRM_MODE_CONNECTOR_SVIDEO;
|
|
sdvo_priv->is_tv = true;
|
|
sdvo_priv->is_tv = true;
|
|
- intel_output->needs_tv_clock = true;
|
|
|
|
- intel_output->clone_mask = 1 << INTEL_SDVO_TV_CLONE_BIT;
|
|
|
|
|
|
+ intel_encoder->needs_tv_clock = true;
|
|
|
|
+ intel_encoder->clone_mask = 1 << INTEL_SDVO_TV_CLONE_BIT;
|
|
} else if (flags & SDVO_OUTPUT_LVDS0) {
|
|
} else if (flags & SDVO_OUTPUT_LVDS0) {
|
|
|
|
|
|
sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS0;
|
|
sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS0;
|
|
encoder->encoder_type = DRM_MODE_ENCODER_LVDS;
|
|
encoder->encoder_type = DRM_MODE_ENCODER_LVDS;
|
|
connector->connector_type = DRM_MODE_CONNECTOR_LVDS;
|
|
connector->connector_type = DRM_MODE_CONNECTOR_LVDS;
|
|
sdvo_priv->is_lvds = true;
|
|
sdvo_priv->is_lvds = true;
|
|
- intel_output->clone_mask = (1 << INTEL_ANALOG_CLONE_BIT) |
|
|
|
|
|
|
+ intel_encoder->clone_mask = (1 << INTEL_ANALOG_CLONE_BIT) |
|
|
(1 << INTEL_SDVO_LVDS_CLONE_BIT);
|
|
(1 << INTEL_SDVO_LVDS_CLONE_BIT);
|
|
} else if (flags & SDVO_OUTPUT_LVDS1) {
|
|
} else if (flags & SDVO_OUTPUT_LVDS1) {
|
|
|
|
|
|
@@ -2389,7 +2394,7 @@ intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags)
|
|
encoder->encoder_type = DRM_MODE_ENCODER_LVDS;
|
|
encoder->encoder_type = DRM_MODE_ENCODER_LVDS;
|
|
connector->connector_type = DRM_MODE_CONNECTOR_LVDS;
|
|
connector->connector_type = DRM_MODE_CONNECTOR_LVDS;
|
|
sdvo_priv->is_lvds = true;
|
|
sdvo_priv->is_lvds = true;
|
|
- intel_output->clone_mask = (1 << INTEL_ANALOG_CLONE_BIT) |
|
|
|
|
|
|
+ intel_encoder->clone_mask = (1 << INTEL_ANALOG_CLONE_BIT) |
|
|
(1 << INTEL_SDVO_LVDS_CLONE_BIT);
|
|
(1 << INTEL_SDVO_LVDS_CLONE_BIT);
|
|
} else {
|
|
} else {
|
|
|
|
|
|
@@ -2402,7 +2407,7 @@ intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags)
|
|
bytes[0], bytes[1]);
|
|
bytes[0], bytes[1]);
|
|
ret = false;
|
|
ret = false;
|
|
}
|
|
}
|
|
- intel_output->crtc_mask = (1 << 0) | (1 << 1);
|
|
|
|
|
|
+ intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
|
|
|
|
|
|
if (ret && registered)
|
|
if (ret && registered)
|
|
ret = drm_sysfs_connector_add(connector) == 0 ? true : false;
|
|
ret = drm_sysfs_connector_add(connector) == 0 ? true : false;
|
|
@@ -2414,18 +2419,18 @@ intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags)
|
|
|
|
|
|
static void intel_sdvo_tv_create_property(struct drm_connector *connector)
|
|
static void intel_sdvo_tv_create_property(struct drm_connector *connector)
|
|
{
|
|
{
|
|
- struct intel_output *intel_output = to_intel_output(connector);
|
|
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
struct intel_sdvo_tv_format format;
|
|
struct intel_sdvo_tv_format format;
|
|
uint32_t format_map, i;
|
|
uint32_t format_map, i;
|
|
uint8_t status;
|
|
uint8_t status;
|
|
|
|
|
|
- intel_sdvo_set_target_output(intel_output,
|
|
|
|
|
|
+ intel_sdvo_set_target_output(intel_encoder,
|
|
sdvo_priv->controlled_output);
|
|
sdvo_priv->controlled_output);
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder,
|
|
SDVO_CMD_GET_SUPPORTED_TV_FORMATS, NULL, 0);
|
|
SDVO_CMD_GET_SUPPORTED_TV_FORMATS, NULL, 0);
|
|
- status = intel_sdvo_read_response(intel_output,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder,
|
|
&format, sizeof(format));
|
|
&format, sizeof(format));
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
return;
|
|
return;
|
|
@@ -2463,16 +2468,16 @@ static void intel_sdvo_tv_create_property(struct drm_connector *connector)
|
|
|
|
|
|
static void intel_sdvo_create_enhance_property(struct drm_connector *connector)
|
|
static void intel_sdvo_create_enhance_property(struct drm_connector *connector)
|
|
{
|
|
{
|
|
- struct intel_output *intel_output = to_intel_output(connector);
|
|
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
|
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_encoder->dev_priv;
|
|
struct intel_sdvo_enhancements_reply sdvo_data;
|
|
struct intel_sdvo_enhancements_reply sdvo_data;
|
|
struct drm_device *dev = connector->dev;
|
|
struct drm_device *dev = connector->dev;
|
|
uint8_t status;
|
|
uint8_t status;
|
|
uint16_t response, data_value[2];
|
|
uint16_t response, data_value[2];
|
|
|
|
|
|
- intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_SUPPORTED_ENHANCEMENTS,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder, SDVO_CMD_GET_SUPPORTED_ENHANCEMENTS,
|
|
NULL, 0);
|
|
NULL, 0);
|
|
- status = intel_sdvo_read_response(intel_output, &sdvo_data,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder, &sdvo_data,
|
|
sizeof(sdvo_data));
|
|
sizeof(sdvo_data));
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
DRM_DEBUG_KMS(" incorrect response is returned\n");
|
|
DRM_DEBUG_KMS(" incorrect response is returned\n");
|
|
@@ -2488,18 +2493,18 @@ static void intel_sdvo_create_enhance_property(struct drm_connector *connector)
|
|
* property
|
|
* property
|
|
*/
|
|
*/
|
|
if (sdvo_data.overscan_h) {
|
|
if (sdvo_data.overscan_h) {
|
|
- intel_sdvo_write_cmd(intel_output,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder,
|
|
SDVO_CMD_GET_MAX_OVERSCAN_H, NULL, 0);
|
|
SDVO_CMD_GET_MAX_OVERSCAN_H, NULL, 0);
|
|
- status = intel_sdvo_read_response(intel_output,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder,
|
|
&data_value, 4);
|
|
&data_value, 4);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
DRM_DEBUG_KMS("Incorrect SDVO max "
|
|
DRM_DEBUG_KMS("Incorrect SDVO max "
|
|
"h_overscan\n");
|
|
"h_overscan\n");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- intel_sdvo_write_cmd(intel_output,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder,
|
|
SDVO_CMD_GET_OVERSCAN_H, NULL, 0);
|
|
SDVO_CMD_GET_OVERSCAN_H, NULL, 0);
|
|
- status = intel_sdvo_read_response(intel_output,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder,
|
|
&response, 2);
|
|
&response, 2);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
DRM_DEBUG_KMS("Incorrect SDVO h_overscan\n");
|
|
DRM_DEBUG_KMS("Incorrect SDVO h_overscan\n");
|
|
@@ -2529,18 +2534,18 @@ static void intel_sdvo_create_enhance_property(struct drm_connector *connector)
|
|
data_value[0], data_value[1], response);
|
|
data_value[0], data_value[1], response);
|
|
}
|
|
}
|
|
if (sdvo_data.overscan_v) {
|
|
if (sdvo_data.overscan_v) {
|
|
- intel_sdvo_write_cmd(intel_output,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder,
|
|
SDVO_CMD_GET_MAX_OVERSCAN_V, NULL, 0);
|
|
SDVO_CMD_GET_MAX_OVERSCAN_V, NULL, 0);
|
|
- status = intel_sdvo_read_response(intel_output,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder,
|
|
&data_value, 4);
|
|
&data_value, 4);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
DRM_DEBUG_KMS("Incorrect SDVO max "
|
|
DRM_DEBUG_KMS("Incorrect SDVO max "
|
|
"v_overscan\n");
|
|
"v_overscan\n");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- intel_sdvo_write_cmd(intel_output,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder,
|
|
SDVO_CMD_GET_OVERSCAN_V, NULL, 0);
|
|
SDVO_CMD_GET_OVERSCAN_V, NULL, 0);
|
|
- status = intel_sdvo_read_response(intel_output,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder,
|
|
&response, 2);
|
|
&response, 2);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
DRM_DEBUG_KMS("Incorrect SDVO v_overscan\n");
|
|
DRM_DEBUG_KMS("Incorrect SDVO v_overscan\n");
|
|
@@ -2570,17 +2575,17 @@ static void intel_sdvo_create_enhance_property(struct drm_connector *connector)
|
|
data_value[0], data_value[1], response);
|
|
data_value[0], data_value[1], response);
|
|
}
|
|
}
|
|
if (sdvo_data.position_h) {
|
|
if (sdvo_data.position_h) {
|
|
- intel_sdvo_write_cmd(intel_output,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder,
|
|
SDVO_CMD_GET_MAX_POSITION_H, NULL, 0);
|
|
SDVO_CMD_GET_MAX_POSITION_H, NULL, 0);
|
|
- status = intel_sdvo_read_response(intel_output,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder,
|
|
&data_value, 4);
|
|
&data_value, 4);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
DRM_DEBUG_KMS("Incorrect SDVO Max h_pos\n");
|
|
DRM_DEBUG_KMS("Incorrect SDVO Max h_pos\n");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- intel_sdvo_write_cmd(intel_output,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder,
|
|
SDVO_CMD_GET_POSITION_H, NULL, 0);
|
|
SDVO_CMD_GET_POSITION_H, NULL, 0);
|
|
- status = intel_sdvo_read_response(intel_output,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder,
|
|
&response, 2);
|
|
&response, 2);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
DRM_DEBUG_KMS("Incorrect SDVO get h_postion\n");
|
|
DRM_DEBUG_KMS("Incorrect SDVO get h_postion\n");
|
|
@@ -2601,17 +2606,17 @@ static void intel_sdvo_create_enhance_property(struct drm_connector *connector)
|
|
data_value[0], data_value[1], response);
|
|
data_value[0], data_value[1], response);
|
|
}
|
|
}
|
|
if (sdvo_data.position_v) {
|
|
if (sdvo_data.position_v) {
|
|
- intel_sdvo_write_cmd(intel_output,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder,
|
|
SDVO_CMD_GET_MAX_POSITION_V, NULL, 0);
|
|
SDVO_CMD_GET_MAX_POSITION_V, NULL, 0);
|
|
- status = intel_sdvo_read_response(intel_output,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder,
|
|
&data_value, 4);
|
|
&data_value, 4);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
DRM_DEBUG_KMS("Incorrect SDVO Max v_pos\n");
|
|
DRM_DEBUG_KMS("Incorrect SDVO Max v_pos\n");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- intel_sdvo_write_cmd(intel_output,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder,
|
|
SDVO_CMD_GET_POSITION_V, NULL, 0);
|
|
SDVO_CMD_GET_POSITION_V, NULL, 0);
|
|
- status = intel_sdvo_read_response(intel_output,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder,
|
|
&response, 2);
|
|
&response, 2);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
DRM_DEBUG_KMS("Incorrect SDVO get v_postion\n");
|
|
DRM_DEBUG_KMS("Incorrect SDVO get v_postion\n");
|
|
@@ -2634,17 +2639,17 @@ static void intel_sdvo_create_enhance_property(struct drm_connector *connector)
|
|
}
|
|
}
|
|
if (sdvo_priv->is_tv) {
|
|
if (sdvo_priv->is_tv) {
|
|
if (sdvo_data.saturation) {
|
|
if (sdvo_data.saturation) {
|
|
- intel_sdvo_write_cmd(intel_output,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder,
|
|
SDVO_CMD_GET_MAX_SATURATION, NULL, 0);
|
|
SDVO_CMD_GET_MAX_SATURATION, NULL, 0);
|
|
- status = intel_sdvo_read_response(intel_output,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder,
|
|
&data_value, 4);
|
|
&data_value, 4);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
DRM_DEBUG_KMS("Incorrect SDVO Max sat\n");
|
|
DRM_DEBUG_KMS("Incorrect SDVO Max sat\n");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- intel_sdvo_write_cmd(intel_output,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder,
|
|
SDVO_CMD_GET_SATURATION, NULL, 0);
|
|
SDVO_CMD_GET_SATURATION, NULL, 0);
|
|
- status = intel_sdvo_read_response(intel_output,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder,
|
|
&response, 2);
|
|
&response, 2);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
DRM_DEBUG_KMS("Incorrect SDVO get sat\n");
|
|
DRM_DEBUG_KMS("Incorrect SDVO get sat\n");
|
|
@@ -2666,17 +2671,17 @@ static void intel_sdvo_create_enhance_property(struct drm_connector *connector)
|
|
data_value[0], data_value[1], response);
|
|
data_value[0], data_value[1], response);
|
|
}
|
|
}
|
|
if (sdvo_data.contrast) {
|
|
if (sdvo_data.contrast) {
|
|
- intel_sdvo_write_cmd(intel_output,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder,
|
|
SDVO_CMD_GET_MAX_CONTRAST, NULL, 0);
|
|
SDVO_CMD_GET_MAX_CONTRAST, NULL, 0);
|
|
- status = intel_sdvo_read_response(intel_output,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder,
|
|
&data_value, 4);
|
|
&data_value, 4);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
DRM_DEBUG_KMS("Incorrect SDVO Max contrast\n");
|
|
DRM_DEBUG_KMS("Incorrect SDVO Max contrast\n");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- intel_sdvo_write_cmd(intel_output,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder,
|
|
SDVO_CMD_GET_CONTRAST, NULL, 0);
|
|
SDVO_CMD_GET_CONTRAST, NULL, 0);
|
|
- status = intel_sdvo_read_response(intel_output,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder,
|
|
&response, 2);
|
|
&response, 2);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
DRM_DEBUG_KMS("Incorrect SDVO get contrast\n");
|
|
DRM_DEBUG_KMS("Incorrect SDVO get contrast\n");
|
|
@@ -2697,17 +2702,17 @@ static void intel_sdvo_create_enhance_property(struct drm_connector *connector)
|
|
data_value[0], data_value[1], response);
|
|
data_value[0], data_value[1], response);
|
|
}
|
|
}
|
|
if (sdvo_data.hue) {
|
|
if (sdvo_data.hue) {
|
|
- intel_sdvo_write_cmd(intel_output,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder,
|
|
SDVO_CMD_GET_MAX_HUE, NULL, 0);
|
|
SDVO_CMD_GET_MAX_HUE, NULL, 0);
|
|
- status = intel_sdvo_read_response(intel_output,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder,
|
|
&data_value, 4);
|
|
&data_value, 4);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
DRM_DEBUG_KMS("Incorrect SDVO Max hue\n");
|
|
DRM_DEBUG_KMS("Incorrect SDVO Max hue\n");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- intel_sdvo_write_cmd(intel_output,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder,
|
|
SDVO_CMD_GET_HUE, NULL, 0);
|
|
SDVO_CMD_GET_HUE, NULL, 0);
|
|
- status = intel_sdvo_read_response(intel_output,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder,
|
|
&response, 2);
|
|
&response, 2);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
DRM_DEBUG_KMS("Incorrect SDVO get hue\n");
|
|
DRM_DEBUG_KMS("Incorrect SDVO get hue\n");
|
|
@@ -2730,17 +2735,17 @@ static void intel_sdvo_create_enhance_property(struct drm_connector *connector)
|
|
}
|
|
}
|
|
if (sdvo_priv->is_tv || sdvo_priv->is_lvds) {
|
|
if (sdvo_priv->is_tv || sdvo_priv->is_lvds) {
|
|
if (sdvo_data.brightness) {
|
|
if (sdvo_data.brightness) {
|
|
- intel_sdvo_write_cmd(intel_output,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder,
|
|
SDVO_CMD_GET_MAX_BRIGHTNESS, NULL, 0);
|
|
SDVO_CMD_GET_MAX_BRIGHTNESS, NULL, 0);
|
|
- status = intel_sdvo_read_response(intel_output,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder,
|
|
&data_value, 4);
|
|
&data_value, 4);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
DRM_DEBUG_KMS("Incorrect SDVO Max bright\n");
|
|
DRM_DEBUG_KMS("Incorrect SDVO Max bright\n");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- intel_sdvo_write_cmd(intel_output,
|
|
|
|
|
|
+ intel_sdvo_write_cmd(intel_encoder,
|
|
SDVO_CMD_GET_BRIGHTNESS, NULL, 0);
|
|
SDVO_CMD_GET_BRIGHTNESS, NULL, 0);
|
|
- status = intel_sdvo_read_response(intel_output,
|
|
|
|
|
|
+ status = intel_sdvo_read_response(intel_encoder,
|
|
&response, 2);
|
|
&response, 2);
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
if (status != SDVO_CMD_STATUS_SUCCESS) {
|
|
DRM_DEBUG_KMS("Incorrect SDVO get brigh\n");
|
|
DRM_DEBUG_KMS("Incorrect SDVO get brigh\n");
|
|
@@ -2765,81 +2770,81 @@ static void intel_sdvo_create_enhance_property(struct drm_connector *connector)
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
-bool intel_sdvo_init(struct drm_device *dev, int output_device)
|
|
|
|
|
|
+bool intel_sdvo_init(struct drm_device *dev, int sdvo_reg)
|
|
{
|
|
{
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
struct drm_connector *connector;
|
|
struct drm_connector *connector;
|
|
- struct intel_output *intel_output;
|
|
|
|
|
|
+ struct intel_encoder *intel_encoder;
|
|
struct intel_sdvo_priv *sdvo_priv;
|
|
struct intel_sdvo_priv *sdvo_priv;
|
|
|
|
|
|
u8 ch[0x40];
|
|
u8 ch[0x40];
|
|
int i;
|
|
int i;
|
|
|
|
|
|
- intel_output = kcalloc(sizeof(struct intel_output)+sizeof(struct intel_sdvo_priv), 1, GFP_KERNEL);
|
|
|
|
- if (!intel_output) {
|
|
|
|
|
|
+ intel_encoder = kcalloc(sizeof(struct intel_encoder)+sizeof(struct intel_sdvo_priv), 1, GFP_KERNEL);
|
|
|
|
+ if (!intel_encoder) {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
- sdvo_priv = (struct intel_sdvo_priv *)(intel_output + 1);
|
|
|
|
- sdvo_priv->output_device = output_device;
|
|
|
|
|
|
+ sdvo_priv = (struct intel_sdvo_priv *)(intel_encoder + 1);
|
|
|
|
+ sdvo_priv->sdvo_reg = sdvo_reg;
|
|
|
|
|
|
- intel_output->dev_priv = sdvo_priv;
|
|
|
|
- intel_output->type = INTEL_OUTPUT_SDVO;
|
|
|
|
|
|
+ intel_encoder->dev_priv = sdvo_priv;
|
|
|
|
+ intel_encoder->type = INTEL_OUTPUT_SDVO;
|
|
|
|
|
|
/* setup the DDC bus. */
|
|
/* setup the DDC bus. */
|
|
- if (output_device == SDVOB)
|
|
|
|
- intel_output->i2c_bus = intel_i2c_create(dev, GPIOE, "SDVOCTRL_E for SDVOB");
|
|
|
|
|
|
+ if (sdvo_reg == SDVOB)
|
|
|
|
+ intel_encoder->i2c_bus = intel_i2c_create(dev, GPIOE, "SDVOCTRL_E for SDVOB");
|
|
else
|
|
else
|
|
- intel_output->i2c_bus = intel_i2c_create(dev, GPIOE, "SDVOCTRL_E for SDVOC");
|
|
|
|
|
|
+ intel_encoder->i2c_bus = intel_i2c_create(dev, GPIOE, "SDVOCTRL_E for SDVOC");
|
|
|
|
|
|
- if (!intel_output->i2c_bus)
|
|
|
|
|
|
+ if (!intel_encoder->i2c_bus)
|
|
goto err_inteloutput;
|
|
goto err_inteloutput;
|
|
|
|
|
|
- sdvo_priv->slave_addr = intel_sdvo_get_slave_addr(dev, output_device);
|
|
|
|
|
|
+ sdvo_priv->slave_addr = intel_sdvo_get_slave_addr(dev, sdvo_reg);
|
|
|
|
|
|
/* Save the bit-banging i2c functionality for use by the DDC wrapper */
|
|
/* Save the bit-banging i2c functionality for use by the DDC wrapper */
|
|
- intel_sdvo_i2c_bit_algo.functionality = intel_output->i2c_bus->algo->functionality;
|
|
|
|
|
|
+ intel_sdvo_i2c_bit_algo.functionality = intel_encoder->i2c_bus->algo->functionality;
|
|
|
|
|
|
/* Read the regs to test if we can talk to the device */
|
|
/* Read the regs to test if we can talk to the device */
|
|
for (i = 0; i < 0x40; i++) {
|
|
for (i = 0; i < 0x40; i++) {
|
|
- if (!intel_sdvo_read_byte(intel_output, i, &ch[i])) {
|
|
|
|
|
|
+ if (!intel_sdvo_read_byte(intel_encoder, i, &ch[i])) {
|
|
DRM_DEBUG_KMS("No SDVO device found on SDVO%c\n",
|
|
DRM_DEBUG_KMS("No SDVO device found on SDVO%c\n",
|
|
- output_device == SDVOB ? 'B' : 'C');
|
|
|
|
|
|
+ sdvo_reg == SDVOB ? 'B' : 'C');
|
|
goto err_i2c;
|
|
goto err_i2c;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/* setup the DDC bus. */
|
|
/* setup the DDC bus. */
|
|
- if (output_device == SDVOB) {
|
|
|
|
- intel_output->ddc_bus = intel_i2c_create(dev, GPIOE, "SDVOB DDC BUS");
|
|
|
|
|
|
+ if (sdvo_reg == SDVOB) {
|
|
|
|
+ intel_encoder->ddc_bus = intel_i2c_create(dev, GPIOE, "SDVOB DDC BUS");
|
|
sdvo_priv->analog_ddc_bus = intel_i2c_create(dev, GPIOA,
|
|
sdvo_priv->analog_ddc_bus = intel_i2c_create(dev, GPIOA,
|
|
"SDVOB/VGA DDC BUS");
|
|
"SDVOB/VGA DDC BUS");
|
|
dev_priv->hotplug_supported_mask |= SDVOB_HOTPLUG_INT_STATUS;
|
|
dev_priv->hotplug_supported_mask |= SDVOB_HOTPLUG_INT_STATUS;
|
|
} else {
|
|
} else {
|
|
- intel_output->ddc_bus = intel_i2c_create(dev, GPIOE, "SDVOC DDC BUS");
|
|
|
|
|
|
+ intel_encoder->ddc_bus = intel_i2c_create(dev, GPIOE, "SDVOC DDC BUS");
|
|
sdvo_priv->analog_ddc_bus = intel_i2c_create(dev, GPIOA,
|
|
sdvo_priv->analog_ddc_bus = intel_i2c_create(dev, GPIOA,
|
|
"SDVOC/VGA DDC BUS");
|
|
"SDVOC/VGA DDC BUS");
|
|
dev_priv->hotplug_supported_mask |= SDVOC_HOTPLUG_INT_STATUS;
|
|
dev_priv->hotplug_supported_mask |= SDVOC_HOTPLUG_INT_STATUS;
|
|
}
|
|
}
|
|
|
|
|
|
- if (intel_output->ddc_bus == NULL)
|
|
|
|
|
|
+ if (intel_encoder->ddc_bus == NULL)
|
|
goto err_i2c;
|
|
goto err_i2c;
|
|
|
|
|
|
/* Wrap with our custom algo which switches to DDC mode */
|
|
/* Wrap with our custom algo which switches to DDC mode */
|
|
- intel_output->ddc_bus->algo = &intel_sdvo_i2c_bit_algo;
|
|
|
|
|
|
+ intel_encoder->ddc_bus->algo = &intel_sdvo_i2c_bit_algo;
|
|
|
|
|
|
/* In default case sdvo lvds is false */
|
|
/* In default case sdvo lvds is false */
|
|
- intel_sdvo_get_capabilities(intel_output, &sdvo_priv->caps);
|
|
|
|
|
|
+ intel_sdvo_get_capabilities(intel_encoder, &sdvo_priv->caps);
|
|
|
|
|
|
- if (intel_sdvo_output_setup(intel_output,
|
|
|
|
|
|
+ if (intel_sdvo_output_setup(intel_encoder,
|
|
sdvo_priv->caps.output_flags) != true) {
|
|
sdvo_priv->caps.output_flags) != true) {
|
|
DRM_DEBUG_KMS("SDVO output failed to setup on SDVO%c\n",
|
|
DRM_DEBUG_KMS("SDVO output failed to setup on SDVO%c\n",
|
|
- output_device == SDVOB ? 'B' : 'C');
|
|
|
|
|
|
+ sdvo_reg == SDVOB ? 'B' : 'C');
|
|
goto err_i2c;
|
|
goto err_i2c;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
- connector = &intel_output->base;
|
|
|
|
|
|
+ connector = &intel_encoder->base;
|
|
drm_connector_init(dev, connector, &intel_sdvo_connector_funcs,
|
|
drm_connector_init(dev, connector, &intel_sdvo_connector_funcs,
|
|
connector->connector_type);
|
|
connector->connector_type);
|
|
|
|
|
|
@@ -2848,12 +2853,12 @@ bool intel_sdvo_init(struct drm_device *dev, int output_device)
|
|
connector->doublescan_allowed = 0;
|
|
connector->doublescan_allowed = 0;
|
|
connector->display_info.subpixel_order = SubPixelHorizontalRGB;
|
|
connector->display_info.subpixel_order = SubPixelHorizontalRGB;
|
|
|
|
|
|
- drm_encoder_init(dev, &intel_output->enc,
|
|
|
|
- &intel_sdvo_enc_funcs, intel_output->enc.encoder_type);
|
|
|
|
|
|
+ drm_encoder_init(dev, &intel_encoder->enc,
|
|
|
|
+ &intel_sdvo_enc_funcs, intel_encoder->enc.encoder_type);
|
|
|
|
|
|
- drm_encoder_helper_add(&intel_output->enc, &intel_sdvo_helper_funcs);
|
|
|
|
|
|
+ drm_encoder_helper_add(&intel_encoder->enc, &intel_sdvo_helper_funcs);
|
|
|
|
|
|
- drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc);
|
|
|
|
|
|
+ drm_mode_connector_attach_encoder(&intel_encoder->base, &intel_encoder->enc);
|
|
if (sdvo_priv->is_tv)
|
|
if (sdvo_priv->is_tv)
|
|
intel_sdvo_tv_create_property(connector);
|
|
intel_sdvo_tv_create_property(connector);
|
|
|
|
|
|
@@ -2865,9 +2870,9 @@ bool intel_sdvo_init(struct drm_device *dev, int output_device)
|
|
intel_sdvo_select_ddc_bus(sdvo_priv);
|
|
intel_sdvo_select_ddc_bus(sdvo_priv);
|
|
|
|
|
|
/* Set the input timing to the screen. Assume always input 0. */
|
|
/* Set the input timing to the screen. Assume always input 0. */
|
|
- intel_sdvo_set_target_input(intel_output, true, false);
|
|
|
|
|
|
+ intel_sdvo_set_target_input(intel_encoder, true, false);
|
|
|
|
|
|
- intel_sdvo_get_input_pixel_clock_range(intel_output,
|
|
|
|
|
|
+ intel_sdvo_get_input_pixel_clock_range(intel_encoder,
|
|
&sdvo_priv->pixel_clock_min,
|
|
&sdvo_priv->pixel_clock_min,
|
|
&sdvo_priv->pixel_clock_max);
|
|
&sdvo_priv->pixel_clock_max);
|
|
|
|
|
|
@@ -2894,12 +2899,12 @@ bool intel_sdvo_init(struct drm_device *dev, int output_device)
|
|
err_i2c:
|
|
err_i2c:
|
|
if (sdvo_priv->analog_ddc_bus != NULL)
|
|
if (sdvo_priv->analog_ddc_bus != NULL)
|
|
intel_i2c_destroy(sdvo_priv->analog_ddc_bus);
|
|
intel_i2c_destroy(sdvo_priv->analog_ddc_bus);
|
|
- if (intel_output->ddc_bus != NULL)
|
|
|
|
- intel_i2c_destroy(intel_output->ddc_bus);
|
|
|
|
- if (intel_output->i2c_bus != NULL)
|
|
|
|
- intel_i2c_destroy(intel_output->i2c_bus);
|
|
|
|
|
|
+ if (intel_encoder->ddc_bus != NULL)
|
|
|
|
+ intel_i2c_destroy(intel_encoder->ddc_bus);
|
|
|
|
+ if (intel_encoder->i2c_bus != NULL)
|
|
|
|
+ intel_i2c_destroy(intel_encoder->i2c_bus);
|
|
err_inteloutput:
|
|
err_inteloutput:
|
|
- kfree(intel_output);
|
|
|
|
|
|
+ kfree(intel_encoder);
|
|
|
|
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|