Commit df0e9248 authored by Chris Wilson's avatar Chris Wilson

drm/i915: Make the connector->encoder relationship explicit

Currently we have a exact mapping of a connector onto an encoder for its
whole lifetime. Make this an explicit property of the structure and so
simplify the code.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
parent f875c15a
...@@ -404,8 +404,7 @@ intel_crt_load_detect(struct drm_crtc *crtc, struct intel_encoder *intel_encoder ...@@ -404,8 +404,7 @@ intel_crt_load_detect(struct drm_crtc *crtc, struct intel_encoder *intel_encoder
static enum drm_connector_status intel_crt_detect(struct drm_connector *connector) static enum drm_connector_status intel_crt_detect(struct drm_connector *connector)
{ {
struct drm_device *dev = connector->dev; struct drm_device *dev = connector->dev;
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_encoder *encoder = intel_attached_encoder(connector);
struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
struct drm_crtc *crtc; struct drm_crtc *crtc;
int dpms_mode; int dpms_mode;
enum drm_connector_status status; enum drm_connector_status status;
...@@ -417,18 +416,18 @@ static enum drm_connector_status intel_crt_detect(struct drm_connector *connecto ...@@ -417,18 +416,18 @@ static enum drm_connector_status intel_crt_detect(struct drm_connector *connecto
return connector_status_disconnected; return connector_status_disconnected;
} }
if (intel_crt_detect_ddc(encoder)) if (intel_crt_detect_ddc(&encoder->base))
return connector_status_connected; return connector_status_connected;
/* for pre-945g platforms use load detect */ /* for pre-945g platforms use load detect */
if (encoder->crtc && encoder->crtc->enabled) { if (encoder->base.crtc && encoder->base.crtc->enabled) {
status = intel_crt_load_detect(encoder->crtc, intel_encoder); status = intel_crt_load_detect(encoder->base.crtc, encoder);
} else { } else {
crtc = intel_get_load_detect_pipe(intel_encoder, connector, crtc = intel_get_load_detect_pipe(encoder, connector,
NULL, &dpms_mode); NULL, &dpms_mode);
if (crtc) { if (crtc) {
status = intel_crt_load_detect(crtc, intel_encoder); status = intel_crt_load_detect(crtc, encoder);
intel_release_load_detect_pipe(intel_encoder, intel_release_load_detect_pipe(encoder,
connector, dpms_mode); connector, dpms_mode);
} else } else
status = connector_status_unknown; status = connector_status_unknown;
...@@ -447,13 +446,12 @@ static void intel_crt_destroy(struct drm_connector *connector) ...@@ -447,13 +446,12 @@ static void intel_crt_destroy(struct drm_connector *connector)
static int intel_crt_get_modes(struct drm_connector *connector) static int intel_crt_get_modes(struct drm_connector *connector)
{ {
int ret; int ret;
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_encoder *encoder = intel_attached_encoder(connector);
struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
struct i2c_adapter *ddc_bus; struct i2c_adapter *ddc_bus;
struct drm_device *dev = connector->dev; struct drm_device *dev = connector->dev;
ret = intel_ddc_get_modes(connector, intel_encoder->ddc_bus); ret = intel_ddc_get_modes(connector, encoder->ddc_bus);
if (ret || !IS_G4X(dev)) if (ret || !IS_G4X(dev))
goto end; goto end;
...@@ -504,7 +502,7 @@ static const struct drm_connector_funcs intel_crt_connector_funcs = { ...@@ -504,7 +502,7 @@ static const struct drm_connector_funcs intel_crt_connector_funcs = {
static const struct drm_connector_helper_funcs intel_crt_connector_helper_funcs = { static const struct drm_connector_helper_funcs intel_crt_connector_helper_funcs = {
.mode_valid = intel_crt_mode_valid, .mode_valid = intel_crt_mode_valid,
.get_modes = intel_crt_get_modes, .get_modes = intel_crt_get_modes,
.best_encoder = intel_attached_encoder, .best_encoder = intel_best_encoder,
}; };
static const struct drm_encoder_funcs intel_crt_enc_funcs = { static const struct drm_encoder_funcs intel_crt_enc_funcs = {
...@@ -536,8 +534,7 @@ void intel_crt_init(struct drm_device *dev) ...@@ -536,8 +534,7 @@ void intel_crt_init(struct drm_device *dev)
drm_encoder_init(dev, &intel_encoder->base, &intel_crt_enc_funcs, drm_encoder_init(dev, &intel_encoder->base, &intel_crt_enc_funcs,
DRM_MODE_ENCODER_DAC); DRM_MODE_ENCODER_DAC);
drm_mode_connector_attach_encoder(&intel_connector->base, intel_connector_attach_encoder(intel_connector, intel_encoder);
&intel_encoder->base);
/* Set up the DDC bus. */ /* Set up the DDC bus. */
if (HAS_PCH_SPLIT(dev)) if (HAS_PCH_SPLIT(dev))
......
...@@ -6120,26 +6120,17 @@ void intel_modeset_cleanup(struct drm_device *dev) ...@@ -6120,26 +6120,17 @@ void intel_modeset_cleanup(struct drm_device *dev)
/* /*
* Return which encoder is currently attached for connector. * Return which encoder is currently attached for connector.
*/ */
struct drm_encoder *intel_attached_encoder (struct drm_connector *connector) struct drm_encoder *intel_best_encoder(struct drm_connector *connector)
{ {
struct drm_mode_object *obj; return &intel_attached_encoder(connector)->base;
struct drm_encoder *encoder; }
int i;
for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
if (connector->encoder_ids[i] == 0)
break;
obj = drm_mode_object_find(connector->dev,
connector->encoder_ids[i],
DRM_MODE_OBJECT_ENCODER);
if (!obj)
continue;
encoder = obj_to_encoder(obj); void intel_connector_attach_encoder(struct intel_connector *connector,
return encoder; struct intel_encoder *encoder)
} {
return NULL; connector->encoder = encoder;
drm_mode_connector_attach_encoder(&connector->base,
&encoder->base);
} }
/* /*
......
...@@ -67,6 +67,12 @@ static struct intel_dp *enc_to_intel_dp(struct drm_encoder *encoder) ...@@ -67,6 +67,12 @@ static struct intel_dp *enc_to_intel_dp(struct drm_encoder *encoder)
return container_of(encoder, struct intel_dp, base.base); return container_of(encoder, struct intel_dp, base.base);
} }
static struct intel_dp *intel_attached_dp(struct drm_connector *connector)
{
return container_of(intel_attached_encoder(connector),
struct intel_dp, base);
}
static void intel_dp_start_link_train(struct intel_dp *intel_dp); static void intel_dp_start_link_train(struct intel_dp *intel_dp);
static void intel_dp_complete_link_train(struct intel_dp *intel_dp); static void intel_dp_complete_link_train(struct intel_dp *intel_dp);
static void intel_dp_link_down(struct intel_dp *intel_dp); static void intel_dp_link_down(struct intel_dp *intel_dp);
...@@ -148,8 +154,7 @@ static int ...@@ -148,8 +154,7 @@ static int
intel_dp_mode_valid(struct drm_connector *connector, intel_dp_mode_valid(struct drm_connector *connector,
struct drm_display_mode *mode) struct drm_display_mode *mode)
{ {
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_dp *intel_dp = intel_attached_dp(connector);
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
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;
int max_link_clock = intel_dp_link_clock(intel_dp_max_link_bw(intel_dp)); int max_link_clock = intel_dp_link_clock(intel_dp_max_link_bw(intel_dp));
...@@ -1405,8 +1410,7 @@ intel_dp_check_link_status(struct intel_dp *intel_dp) ...@@ -1405,8 +1410,7 @@ intel_dp_check_link_status(struct intel_dp *intel_dp)
static enum drm_connector_status static enum drm_connector_status
ironlake_dp_detect(struct drm_connector *connector) ironlake_dp_detect(struct drm_connector *connector)
{ {
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_dp *intel_dp = intel_attached_dp(connector);
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
enum drm_connector_status status; enum drm_connector_status status;
/* Panel needs power for AUX to work */ /* Panel needs power for AUX to work */
...@@ -1436,8 +1440,7 @@ ironlake_dp_detect(struct drm_connector *connector) ...@@ -1436,8 +1440,7 @@ ironlake_dp_detect(struct drm_connector *connector)
static enum drm_connector_status static enum drm_connector_status
intel_dp_detect(struct drm_connector *connector) intel_dp_detect(struct drm_connector *connector)
{ {
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_dp *intel_dp = intel_attached_dp(connector);
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
struct drm_device *dev = intel_dp->base.base.dev; struct drm_device *dev = intel_dp->base.base.dev;
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
uint32_t temp, bit; uint32_t temp, bit;
...@@ -1480,8 +1483,7 @@ intel_dp_detect(struct drm_connector *connector) ...@@ -1480,8 +1483,7 @@ intel_dp_detect(struct drm_connector *connector)
static int intel_dp_get_modes(struct drm_connector *connector) static int intel_dp_get_modes(struct drm_connector *connector)
{ {
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_dp *intel_dp = intel_attached_dp(connector);
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
struct drm_device *dev = intel_dp->base.base.dev; struct drm_device *dev = intel_dp->base.base.dev;
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
int ret; int ret;
...@@ -1554,7 +1556,7 @@ static const struct drm_connector_funcs intel_dp_connector_funcs = { ...@@ -1554,7 +1556,7 @@ static const struct drm_connector_funcs intel_dp_connector_funcs = {
static const struct drm_connector_helper_funcs intel_dp_connector_helper_funcs = { static const struct drm_connector_helper_funcs intel_dp_connector_helper_funcs = {
.get_modes = intel_dp_get_modes, .get_modes = intel_dp_get_modes,
.mode_valid = intel_dp_mode_valid, .mode_valid = intel_dp_mode_valid,
.best_encoder = intel_attached_encoder, .best_encoder = intel_best_encoder,
}; };
static const struct drm_encoder_funcs intel_dp_enc_funcs = { static const struct drm_encoder_funcs intel_dp_enc_funcs = {
...@@ -1674,8 +1676,7 @@ intel_dp_init(struct drm_device *dev, int output_reg) ...@@ -1674,8 +1676,7 @@ intel_dp_init(struct drm_device *dev, int output_reg)
DRM_MODE_ENCODER_TMDS); DRM_MODE_ENCODER_TMDS);
drm_encoder_helper_add(&intel_encoder->base, &intel_dp_helper_funcs); drm_encoder_helper_add(&intel_encoder->base, &intel_dp_helper_funcs);
drm_mode_connector_attach_encoder(&intel_connector->base, intel_connector_attach_encoder(intel_connector, intel_encoder);
&intel_encoder->base);
drm_sysfs_connector_add(connector); drm_sysfs_connector_add(connector);
/* Set up the DDC bus. */ /* Set up the DDC bus. */
......
...@@ -150,6 +150,7 @@ struct intel_encoder { ...@@ -150,6 +150,7 @@ struct intel_encoder {
struct intel_connector { struct intel_connector {
struct drm_connector base; struct drm_connector base;
struct intel_encoder *encoder;
}; };
struct intel_crtc { struct intel_crtc {
...@@ -234,7 +235,14 @@ extern void intel_encoder_prepare (struct drm_encoder *encoder); ...@@ -234,7 +235,14 @@ extern void intel_encoder_prepare (struct drm_encoder *encoder);
extern void intel_encoder_commit (struct drm_encoder *encoder); extern void intel_encoder_commit (struct drm_encoder *encoder);
extern void intel_encoder_destroy(struct drm_encoder *encoder); extern void intel_encoder_destroy(struct drm_encoder *encoder);
extern struct drm_encoder *intel_attached_encoder(struct drm_connector *connector); static inline struct intel_encoder *intel_attached_encoder(struct drm_connector *connector)
{
return to_intel_connector(connector)->encoder;
}
extern void intel_connector_attach_encoder(struct intel_connector *connector,
struct intel_encoder *encoder);
extern struct drm_encoder *intel_best_encoder(struct drm_connector *connector);
extern struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev, extern struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev,
struct drm_crtc *crtc); struct drm_crtc *crtc);
......
...@@ -91,6 +91,12 @@ static struct intel_dvo *enc_to_intel_dvo(struct drm_encoder *encoder) ...@@ -91,6 +91,12 @@ static struct intel_dvo *enc_to_intel_dvo(struct drm_encoder *encoder)
return container_of(encoder, struct intel_dvo, base.base); return container_of(encoder, struct intel_dvo, base.base);
} }
static struct intel_dvo *intel_attached_dvo(struct drm_connector *connector)
{
return container_of(intel_attached_encoder(connector),
struct intel_dvo, base);
}
static void intel_dvo_dpms(struct drm_encoder *encoder, int mode) static void intel_dvo_dpms(struct drm_encoder *encoder, int mode)
{ {
struct drm_i915_private *dev_priv = encoder->dev->dev_private; struct drm_i915_private *dev_priv = encoder->dev->dev_private;
...@@ -112,8 +118,7 @@ static void intel_dvo_dpms(struct drm_encoder *encoder, int mode) ...@@ -112,8 +118,7 @@ static void intel_dvo_dpms(struct drm_encoder *encoder, int mode)
static int intel_dvo_mode_valid(struct drm_connector *connector, static int intel_dvo_mode_valid(struct drm_connector *connector,
struct drm_display_mode *mode) struct drm_display_mode *mode)
{ {
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_dvo *intel_dvo = intel_attached_dvo(connector);
struct intel_dvo *intel_dvo = enc_to_intel_dvo(encoder);
if (mode->flags & DRM_MODE_FLAG_DBLSCAN) if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
return MODE_NO_DBLESCAN; return MODE_NO_DBLESCAN;
...@@ -223,16 +228,13 @@ static void intel_dvo_mode_set(struct drm_encoder *encoder, ...@@ -223,16 +228,13 @@ static void intel_dvo_mode_set(struct drm_encoder *encoder,
*/ */
static enum drm_connector_status intel_dvo_detect(struct drm_connector *connector) static enum drm_connector_status intel_dvo_detect(struct drm_connector *connector)
{ {
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_dvo *intel_dvo = intel_attached_dvo(connector);
struct intel_dvo *intel_dvo = enc_to_intel_dvo(encoder);
return intel_dvo->dev.dev_ops->detect(&intel_dvo->dev); return intel_dvo->dev.dev_ops->detect(&intel_dvo->dev);
} }
static int intel_dvo_get_modes(struct drm_connector *connector) static int intel_dvo_get_modes(struct drm_connector *connector)
{ {
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_dvo *intel_dvo = intel_attached_dvo(connector);
struct intel_dvo *intel_dvo = enc_to_intel_dvo(encoder);
/* We should probably have an i2c driver get_modes function for those /* We should probably have an i2c driver get_modes function for those
* devices which will have a fixed set of modes determined by the chip * devices which will have a fixed set of modes determined by the chip
...@@ -280,7 +282,7 @@ static const struct drm_connector_funcs intel_dvo_connector_funcs = { ...@@ -280,7 +282,7 @@ static const struct drm_connector_funcs intel_dvo_connector_funcs = {
static const struct drm_connector_helper_funcs intel_dvo_connector_helper_funcs = { static const struct drm_connector_helper_funcs intel_dvo_connector_helper_funcs = {
.mode_valid = intel_dvo_mode_valid, .mode_valid = intel_dvo_mode_valid,
.get_modes = intel_dvo_get_modes, .get_modes = intel_dvo_get_modes,
.best_encoder = intel_attached_encoder, .best_encoder = intel_best_encoder,
}; };
static void intel_dvo_enc_destroy(struct drm_encoder *encoder) static void intel_dvo_enc_destroy(struct drm_encoder *encoder)
...@@ -310,8 +312,7 @@ intel_dvo_get_current_mode(struct drm_connector *connector) ...@@ -310,8 +312,7 @@ intel_dvo_get_current_mode(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 drm_encoder *encoder = intel_attached_encoder(connector); struct intel_dvo *intel_dvo = intel_attached_dvo(connector);
struct intel_dvo *intel_dvo = enc_to_intel_dvo(encoder);
uint32_t dvo_val = I915_READ(intel_dvo->dev.dvo_reg); uint32_t dvo_val = I915_READ(intel_dvo->dev.dvo_reg);
struct drm_display_mode *mode = NULL; struct drm_display_mode *mode = NULL;
...@@ -431,8 +432,7 @@ void intel_dvo_init(struct drm_device *dev) ...@@ -431,8 +432,7 @@ void intel_dvo_init(struct drm_device *dev)
drm_encoder_helper_add(&intel_encoder->base, drm_encoder_helper_add(&intel_encoder->base,
&intel_dvo_helper_funcs); &intel_dvo_helper_funcs);
drm_mode_connector_attach_encoder(&intel_connector->base, intel_connector_attach_encoder(intel_connector, intel_encoder);
&intel_encoder->base);
if (dvo->type == INTEL_DVO_CHIP_LVDS) { if (dvo->type == INTEL_DVO_CHIP_LVDS) {
/* For our LVDS chipsets, we should hopefully be able /* For our LVDS chipsets, we should hopefully be able
* to dig the fixed panel mode out of the BIOS data. * to dig the fixed panel mode out of the BIOS data.
......
...@@ -48,6 +48,12 @@ static struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder) ...@@ -48,6 +48,12 @@ static struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder)
return container_of(encoder, struct intel_hdmi, base.base); return container_of(encoder, struct intel_hdmi, base.base);
} }
static struct intel_hdmi *intel_attached_hdmi(struct drm_connector *connector)
{
return container_of(intel_attached_encoder(connector),
struct intel_hdmi, base);
}
static void intel_hdmi_mode_set(struct drm_encoder *encoder, static void intel_hdmi_mode_set(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)
...@@ -141,8 +147,7 @@ static bool intel_hdmi_mode_fixup(struct drm_encoder *encoder, ...@@ -141,8 +147,7 @@ static bool intel_hdmi_mode_fixup(struct drm_encoder *encoder,
static enum drm_connector_status static enum drm_connector_status
intel_hdmi_detect(struct drm_connector *connector) intel_hdmi_detect(struct drm_connector *connector)
{ {
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
struct edid *edid = NULL; struct edid *edid = NULL;
enum drm_connector_status status = connector_status_disconnected; enum drm_connector_status status = connector_status_disconnected;
...@@ -163,8 +168,7 @@ intel_hdmi_detect(struct drm_connector *connector) ...@@ -163,8 +168,7 @@ intel_hdmi_detect(struct drm_connector *connector)
static int intel_hdmi_get_modes(struct drm_connector *connector) static int intel_hdmi_get_modes(struct drm_connector *connector)
{ {
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
/* We should parse the EDID data and find out if it's an HDMI sink so /* We should parse the EDID data and find out if it's an HDMI sink so
* we can send audio to it. * we can send audio to it.
...@@ -198,7 +202,7 @@ static const struct drm_connector_funcs intel_hdmi_connector_funcs = { ...@@ -198,7 +202,7 @@ static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = { static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
.get_modes = intel_hdmi_get_modes, .get_modes = intel_hdmi_get_modes,
.mode_valid = intel_hdmi_mode_valid, .mode_valid = intel_hdmi_mode_valid,
.best_encoder = intel_attached_encoder, .best_encoder = intel_best_encoder,
}; };
static const struct drm_encoder_funcs intel_hdmi_enc_funcs = { static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
...@@ -270,8 +274,7 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg) ...@@ -270,8 +274,7 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg)
DRM_MODE_ENCODER_TMDS); DRM_MODE_ENCODER_TMDS);
drm_encoder_helper_add(&intel_encoder->base, &intel_hdmi_helper_funcs); drm_encoder_helper_add(&intel_encoder->base, &intel_hdmi_helper_funcs);
drm_mode_connector_attach_encoder(&intel_connector->base, intel_connector_attach_encoder(intel_connector, intel_encoder);
&intel_encoder->base);
drm_sysfs_connector_add(connector); drm_sysfs_connector_add(connector);
/* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
......
...@@ -436,14 +436,11 @@ static enum drm_connector_status intel_lvds_detect(struct drm_connector *connect ...@@ -436,14 +436,11 @@ static enum drm_connector_status intel_lvds_detect(struct drm_connector *connect
static int intel_lvds_get_modes(struct drm_connector *connector) static int intel_lvds_get_modes(struct drm_connector *connector)
{ {
struct drm_device *dev = connector->dev; struct drm_device *dev = connector->dev;
struct drm_encoder *encoder = intel_attached_encoder(connector);
struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
int ret = 0;
if (dev_priv->lvds_edid_good) { if (dev_priv->lvds_edid_good) {
ret = intel_ddc_get_modes(connector, intel_encoder->ddc_bus); struct intel_encoder *encoder = intel_attached_encoder(connector);
int ret = intel_ddc_get_modes(connector, encoder->ddc_bus);
if (ret) if (ret)
return ret; return ret;
} }
...@@ -596,7 +593,7 @@ static const struct drm_encoder_helper_funcs intel_lvds_helper_funcs = { ...@@ -596,7 +593,7 @@ static const struct drm_encoder_helper_funcs intel_lvds_helper_funcs = {
static const struct drm_connector_helper_funcs intel_lvds_connector_helper_funcs = { static const struct drm_connector_helper_funcs intel_lvds_connector_helper_funcs = {
.get_modes = intel_lvds_get_modes, .get_modes = intel_lvds_get_modes,
.mode_valid = intel_lvds_mode_valid, .mode_valid = intel_lvds_mode_valid,
.best_encoder = intel_attached_encoder, .best_encoder = intel_best_encoder,
}; };
static const struct drm_connector_funcs intel_lvds_connector_funcs = { static const struct drm_connector_funcs intel_lvds_connector_funcs = {
...@@ -847,7 +844,7 @@ void intel_lvds_init(struct drm_device *dev) ...@@ -847,7 +844,7 @@ void intel_lvds_init(struct drm_device *dev)
drm_encoder_init(dev, &intel_encoder->base, &intel_lvds_enc_funcs, drm_encoder_init(dev, &intel_encoder->base, &intel_lvds_enc_funcs,
DRM_MODE_ENCODER_LVDS); DRM_MODE_ENCODER_LVDS);
drm_mode_connector_attach_encoder(&intel_connector->base, &intel_encoder->base); intel_connector_attach_encoder(intel_connector, intel_encoder);
intel_encoder->type = INTEL_OUTPUT_LVDS; intel_encoder->type = INTEL_OUTPUT_LVDS;
intel_encoder->clone_mask = (1 << INTEL_LVDS_CLONE_BIT); intel_encoder->clone_mask = (1 << INTEL_LVDS_CLONE_BIT);
......
...@@ -189,6 +189,12 @@ static struct intel_sdvo *enc_to_intel_sdvo(struct drm_encoder *encoder) ...@@ -189,6 +189,12 @@ static struct intel_sdvo *enc_to_intel_sdvo(struct drm_encoder *encoder)
return container_of(encoder, struct intel_sdvo, base.base); return container_of(encoder, struct intel_sdvo, base.base);
} }
static struct intel_sdvo *intel_attached_sdvo(struct drm_connector *connector)
{
return container_of(intel_attached_encoder(connector),
struct intel_sdvo, base);
}
static struct intel_sdvo_connector *to_intel_sdvo_connector(struct drm_connector *connector) static struct intel_sdvo_connector *to_intel_sdvo_connector(struct drm_connector *connector)
{ {
return container_of(to_intel_connector(connector), struct intel_sdvo_connector, base); return container_of(to_intel_connector(connector), struct intel_sdvo_connector, base);
...@@ -1239,8 +1245,7 @@ static void intel_sdvo_dpms(struct drm_encoder *encoder, int mode) ...@@ -1239,8 +1245,7 @@ static void intel_sdvo_dpms(struct drm_encoder *encoder, int mode)
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 drm_encoder *encoder = intel_attached_encoder(connector); struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
struct intel_sdvo *intel_sdvo = enc_to_intel_sdvo(encoder);
if (mode->flags & DRM_MODE_FLAG_DBLSCAN) if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
return MODE_NO_DBLESCAN; return MODE_NO_DBLESCAN;
...@@ -1372,18 +1377,22 @@ static struct drm_connector * ...@@ -1372,18 +1377,22 @@ 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 drm_encoder *encoder; struct intel_sdvo *encoder;
struct intel_sdvo *intel_sdvo;
list_for_each_entry(encoder,
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { &dev->mode_config.encoder_list,
intel_sdvo = enc_to_intel_sdvo(encoder); base.base.head) {
if (intel_sdvo->base.type == INTEL_OUTPUT_ANALOG) { if (encoder->base.type == INTEL_OUTPUT_ANALOG) {
list_for_each_entry(connector, &dev->mode_config.connector_list, head) { list_for_each_entry(connector,
if (encoder == intel_attached_encoder(connector)) &dev->mode_config.connector_list,
head) {
if (&encoder->base ==
intel_attached_encoder(connector))
return connector; return connector;
} }
} }
} }
return NULL; return NULL;
} }
...@@ -1406,8 +1415,7 @@ intel_analog_is_connected(struct drm_device *dev) ...@@ -1406,8 +1415,7 @@ 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) intel_sdvo_hdmi_sink_detect(struct drm_connector *connector)
{ {
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
struct intel_sdvo *intel_sdvo = enc_to_intel_sdvo(encoder);
struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector); struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector);
enum drm_connector_status status = connector_status_connected; enum drm_connector_status status = connector_status_connected;
struct edid *edid = NULL; struct edid *edid = NULL;
...@@ -1468,8 +1476,7 @@ intel_sdvo_hdmi_sink_detect(struct drm_connector *connector) ...@@ -1468,8 +1476,7 @@ intel_sdvo_hdmi_sink_detect(struct drm_connector *connector)
static enum drm_connector_status intel_sdvo_detect(struct drm_connector *connector) static enum drm_connector_status intel_sdvo_detect(struct drm_connector *connector)
{ {
uint16_t response; uint16_t response;
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
struct intel_sdvo *intel_sdvo = enc_to_intel_sdvo(encoder);
struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector); struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector);
enum drm_connector_status ret; enum drm_connector_status ret;
...@@ -1516,8 +1523,7 @@ static enum drm_connector_status intel_sdvo_detect(struct drm_connector *connect ...@@ -1516,8 +1523,7 @@ 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 drm_encoder *encoder = intel_attached_encoder(connector); struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
struct intel_sdvo *intel_sdvo = enc_to_intel_sdvo(encoder);
int num_modes; int num_modes;
/* set the bus switch and get the modes */ /* set the bus switch and get the modes */
...@@ -1605,8 +1611,7 @@ struct drm_display_mode sdvo_tv_modes[] = { ...@@ -1605,8 +1611,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 drm_encoder *encoder = intel_attached_encoder(connector); struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
struct intel_sdvo *intel_sdvo = enc_to_intel_sdvo(encoder);
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;
int i; int i;
...@@ -1640,8 +1645,7 @@ static void intel_sdvo_get_tv_modes(struct drm_connector *connector) ...@@ -1640,8 +1645,7 @@ 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 drm_encoder *encoder = intel_attached_encoder(connector); struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
struct intel_sdvo *intel_sdvo = enc_to_intel_sdvo(encoder);
struct drm_i915_private *dev_priv = connector->dev->dev_private; struct drm_i915_private *dev_priv = connector->dev->dev_private;
struct drm_display_mode *newmode; struct drm_display_mode *newmode;
...@@ -1757,8 +1761,7 @@ intel_sdvo_set_property(struct drm_connector *connector, ...@@ -1757,8 +1761,7 @@ intel_sdvo_set_property(struct drm_connector *connector,
struct drm_property *property, struct drm_property *property,
uint64_t val) uint64_t val)
{ {
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
struct intel_sdvo *intel_sdvo = enc_to_intel_sdvo(encoder);
struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector); struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector);
uint16_t temp_value; uint16_t temp_value;
uint8_t cmd; uint8_t cmd;
...@@ -1861,9 +1864,8 @@ intel_sdvo_set_property(struct drm_connector *connector, ...@@ -1861,9 +1864,8 @@ intel_sdvo_set_property(struct drm_connector *connector,
done: done:
if (encoder->crtc) { if (intel_sdvo->base.base.crtc) {
struct drm_crtc *crtc = encoder->crtc; struct drm_crtc *crtc = intel_sdvo->base.base.crtc;
drm_crtc_helper_set_mode(crtc, &crtc->mode, crtc->x, drm_crtc_helper_set_mode(crtc, &crtc->mode, crtc->x,
crtc->y, crtc->fb); crtc->y, crtc->fb);
} }
...@@ -1891,7 +1893,7 @@ static const struct drm_connector_funcs intel_sdvo_connector_funcs = { ...@@ -1891,7 +1893,7 @@ static const struct drm_connector_funcs intel_sdvo_connector_funcs = {
static const struct drm_connector_helper_funcs intel_sdvo_connector_helper_funcs = { static const struct drm_connector_helper_funcs intel_sdvo_connector_helper_funcs = {
.get_modes = intel_sdvo_get_modes, .get_modes = intel_sdvo_get_modes,
.mode_valid = intel_sdvo_mode_valid, .mode_valid = intel_sdvo_mode_valid,
.best_encoder = intel_attached_encoder, .best_encoder = intel_best_encoder,
}; };
static void intel_sdvo_enc_destroy(struct drm_encoder *encoder) static void intel_sdvo_enc_destroy(struct drm_encoder *encoder)
...@@ -2058,20 +2060,23 @@ intel_sdvo_get_slave_addr(struct drm_device *dev, int sdvo_reg) ...@@ -2058,20 +2060,23 @@ intel_sdvo_get_slave_addr(struct drm_device *dev, int sdvo_reg)
} }
static void static void
intel_sdvo_connector_init(struct drm_encoder *encoder, intel_sdvo_connector_init(struct intel_sdvo_connector *connector,
struct drm_connector *connector) struct intel_sdvo *encoder)
{ {
drm_connector_init(encoder->dev, connector, &intel_sdvo_connector_funcs, drm_connector_init(encoder->base.base.dev,
connector->connector_type); &connector->base.base,
&intel_sdvo_connector_funcs,
connector->base.base.connector_type);
drm_connector_helper_add(connector, &intel_sdvo_connector_helper_funcs); drm_connector_helper_add(&connector->base.base,
&intel_sdvo_connector_helper_funcs);
connector->interlace_allowed = 0; connector->base.base.interlace_allowed = 0;
connector->doublescan_allowed = 0; connector->base.base.doublescan_allowed = 0;
connector->display_info.subpixel_order = SubPixelHorizontalRGB; connector->base.base.display_info.subpixel_order = SubPixelHorizontalRGB;
drm_mode_connector_attach_encoder(connector, encoder); intel_connector_attach_encoder(&connector->base, &encoder->base);
drm_sysfs_connector_add(connector); drm_sysfs_connector_add(&connector->base.base);
} }
static bool static bool
...@@ -2112,7 +2117,7 @@ intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device) ...@@ -2112,7 +2117,7 @@ intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device)
intel_sdvo->base.clone_mask = ((1 << INTEL_SDVO_NON_TV_CLONE_BIT) | intel_sdvo->base.clone_mask = ((1 << INTEL_SDVO_NON_TV_CLONE_BIT) |
(1 << INTEL_ANALOG_CLONE_BIT)); (1 << INTEL_ANALOG_CLONE_BIT));
intel_sdvo_connector_init(encoder, connector); intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo);
return true; return true;
} }
...@@ -2141,7 +2146,7 @@ intel_sdvo_tv_init(struct intel_sdvo *intel_sdvo, int type) ...@@ -2141,7 +2146,7 @@ intel_sdvo_tv_init(struct intel_sdvo *intel_sdvo, int type)
intel_sdvo->base.needs_tv_clock = true; intel_sdvo->base.needs_tv_clock = true;
intel_sdvo->base.clone_mask = 1 << INTEL_SDVO_TV_CLONE_BIT; intel_sdvo->base.clone_mask = 1 << INTEL_SDVO_TV_CLONE_BIT;
intel_sdvo_connector_init(encoder, connector); intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo);
if (!intel_sdvo_tv_create_property(intel_sdvo, intel_sdvo_connector, type)) if (!intel_sdvo_tv_create_property(intel_sdvo, intel_sdvo_connector, type))
goto err; goto err;
...@@ -2186,7 +2191,8 @@ intel_sdvo_analog_init(struct intel_sdvo *intel_sdvo, int device) ...@@ -2186,7 +2191,8 @@ intel_sdvo_analog_init(struct intel_sdvo *intel_sdvo, int device)
intel_sdvo->base.clone_mask = ((1 << INTEL_SDVO_NON_TV_CLONE_BIT) | intel_sdvo->base.clone_mask = ((1 << INTEL_SDVO_NON_TV_CLONE_BIT) |
(1 << INTEL_ANALOG_CLONE_BIT)); (1 << INTEL_ANALOG_CLONE_BIT));
intel_sdvo_connector_init(encoder, connector); intel_sdvo_connector_init(intel_sdvo_connector,
intel_sdvo);
return true; return true;
} }
...@@ -2218,7 +2224,7 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, int device) ...@@ -2218,7 +2224,7 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, int device)
intel_sdvo->base.clone_mask = ((1 << INTEL_ANALOG_CLONE_BIT) | intel_sdvo->base.clone_mask = ((1 << INTEL_ANALOG_CLONE_BIT) |
(1 << INTEL_SDVO_LVDS_CLONE_BIT)); (1 << INTEL_SDVO_LVDS_CLONE_BIT));
intel_sdvo_connector_init(encoder, connector); intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo);
if (!intel_sdvo_create_enhance_property(intel_sdvo, intel_sdvo_connector)) if (!intel_sdvo_create_enhance_property(intel_sdvo, intel_sdvo_connector))
goto err; goto err;
......
...@@ -903,6 +903,13 @@ static struct intel_tv *enc_to_intel_tv(struct drm_encoder *encoder) ...@@ -903,6 +903,13 @@ static struct intel_tv *enc_to_intel_tv(struct drm_encoder *encoder)
return container_of(encoder, struct intel_tv, base.base); return container_of(encoder, struct intel_tv, base.base);
} }
static struct intel_tv *intel_attached_tv(struct drm_connector *connector)
{
return container_of(intel_attached_encoder(connector),
struct intel_tv,
base);
}
static void static void
intel_tv_dpms(struct drm_encoder *encoder, int mode) intel_tv_dpms(struct drm_encoder *encoder, int mode)
{ {
...@@ -945,8 +952,7 @@ static enum drm_mode_status ...@@ -945,8 +952,7 @@ static enum drm_mode_status
intel_tv_mode_valid(struct drm_connector *connector, intel_tv_mode_valid(struct drm_connector *connector,
struct drm_display_mode *mode) struct drm_display_mode *mode)
{ {
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_tv *intel_tv = intel_attached_tv(connector);
struct intel_tv *intel_tv = enc_to_intel_tv(encoder);
const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv); const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv);
/* Ensure TV refresh is close to desired refresh */ /* Ensure TV refresh is close to desired refresh */
...@@ -1306,8 +1312,7 @@ intel_tv_detect_type (struct intel_tv *intel_tv) ...@@ -1306,8 +1312,7 @@ intel_tv_detect_type (struct intel_tv *intel_tv)
*/ */
static void intel_tv_find_better_format(struct drm_connector *connector) static void intel_tv_find_better_format(struct drm_connector *connector)
{ {
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_tv *intel_tv = intel_attached_tv(connector);
struct intel_tv *intel_tv = enc_to_intel_tv(encoder);
const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv); const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv);
int i; int i;
...@@ -1339,14 +1344,13 @@ static enum drm_connector_status ...@@ -1339,14 +1344,13 @@ static enum drm_connector_status
intel_tv_detect(struct drm_connector *connector) intel_tv_detect(struct drm_connector *connector)
{ {
struct drm_display_mode mode; struct drm_display_mode mode;
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_tv *intel_tv = intel_attached_tv(connector);
struct intel_tv *intel_tv = enc_to_intel_tv(encoder);
int type; int type;
mode = reported_modes[0]; mode = reported_modes[0];
drm_mode_set_crtcinfo(&mode, CRTC_INTERLACE_HALVE_V); drm_mode_set_crtcinfo(&mode, CRTC_INTERLACE_HALVE_V);
if (encoder->crtc && encoder->crtc->enabled) { if (intel_tv->base.base.crtc && intel_tv->base.base.crtc->enabled) {
type = intel_tv_detect_type(intel_tv); type = intel_tv_detect_type(intel_tv);
} else { } else {
struct drm_crtc *crtc; struct drm_crtc *crtc;
...@@ -1391,8 +1395,7 @@ static void ...@@ -1391,8 +1395,7 @@ static void
intel_tv_chose_preferred_modes(struct drm_connector *connector, intel_tv_chose_preferred_modes(struct drm_connector *connector,
struct drm_display_mode *mode_ptr) struct drm_display_mode *mode_ptr)
{ {
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_tv *intel_tv = intel_attached_tv(connector);
struct intel_tv *intel_tv = enc_to_intel_tv(encoder);
const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv); const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv);
if (tv_mode->nbr_end < 480 && mode_ptr->vdisplay == 480) if (tv_mode->nbr_end < 480 && mode_ptr->vdisplay == 480)
...@@ -1417,8 +1420,7 @@ static int ...@@ -1417,8 +1420,7 @@ static int
intel_tv_get_modes(struct drm_connector *connector) intel_tv_get_modes(struct drm_connector *connector)
{ {
struct drm_display_mode *mode_ptr; struct drm_display_mode *mode_ptr;
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_tv *intel_tv = intel_attached_tv(connector);
struct intel_tv *intel_tv = enc_to_intel_tv(encoder);
const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv); const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv);
int j, count = 0; int j, count = 0;
u64 tmp; u64 tmp;
...@@ -1483,9 +1485,8 @@ intel_tv_set_property(struct drm_connector *connector, struct drm_property *prop ...@@ -1483,9 +1485,8 @@ intel_tv_set_property(struct drm_connector *connector, struct drm_property *prop
uint64_t val) uint64_t val)
{ {
struct drm_device *dev = connector->dev; struct drm_device *dev = connector->dev;
struct drm_encoder *encoder = intel_attached_encoder(connector); struct intel_tv *intel_tv = intel_attached_tv(connector);
struct intel_tv *intel_tv = enc_to_intel_tv(encoder); struct drm_crtc *crtc = intel_tv->base.base.crtc;
struct drm_crtc *crtc = encoder->crtc;
int ret = 0; int ret = 0;
bool changed = false; bool changed = false;
...@@ -1550,7 +1551,7 @@ static const struct drm_connector_funcs intel_tv_connector_funcs = { ...@@ -1550,7 +1551,7 @@ static const struct drm_connector_funcs intel_tv_connector_funcs = {
static const struct drm_connector_helper_funcs intel_tv_connector_helper_funcs = { static const struct drm_connector_helper_funcs intel_tv_connector_helper_funcs = {
.mode_valid = intel_tv_mode_valid, .mode_valid = intel_tv_mode_valid,
.get_modes = intel_tv_get_modes, .get_modes = intel_tv_get_modes,
.best_encoder = intel_attached_encoder, .best_encoder = intel_best_encoder,
}; };
static const struct drm_encoder_funcs intel_tv_enc_funcs = { static const struct drm_encoder_funcs intel_tv_enc_funcs = {
...@@ -1659,8 +1660,7 @@ intel_tv_init(struct drm_device *dev) ...@@ -1659,8 +1660,7 @@ intel_tv_init(struct drm_device *dev)
drm_encoder_init(dev, &intel_encoder->base, &intel_tv_enc_funcs, drm_encoder_init(dev, &intel_encoder->base, &intel_tv_enc_funcs,
DRM_MODE_ENCODER_TVDAC); DRM_MODE_ENCODER_TVDAC);
drm_mode_connector_attach_encoder(&intel_connector->base, intel_connector_attach_encoder(intel_connector, intel_encoder);
&intel_encoder->base);
intel_encoder->type = INTEL_OUTPUT_TVOUT; intel_encoder->type = INTEL_OUTPUT_TVOUT;
intel_encoder->crtc_mask = (1 << 0) | (1 << 1); intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
intel_encoder->clone_mask = (1 << INTEL_TV_CLONE_BIT); intel_encoder->clone_mask = (1 << INTEL_TV_CLONE_BIT);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment