Commit 7407ec6e authored by Ville Syrjälä's avatar Ville Syrjälä

drm/i915/sdvo: Make .get_modes() return the number of modes

.get_modes() is supposed to return the number of modes added to the
probed_modes list (not that anyone actually checks for anything
except zero vs. not zero). Let's do that. Also switch over to using
intel_connector_update_modes() instead of hand rolling it.
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200108181242.13650-8-ville.syrjala@linux.intel.comReviewed-by: default avatarImre Deak <imre.deak@intel.com>
parent d9757193
...@@ -2135,8 +2135,9 @@ intel_sdvo_detect(struct drm_connector *connector, bool force) ...@@ -2135,8 +2135,9 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
return ret; return ret;
} }
static void intel_sdvo_get_ddc_modes(struct drm_connector *connector) static int intel_sdvo_get_ddc_modes(struct drm_connector *connector)
{ {
int num_modes = 0;
struct edid *edid; struct edid *edid;
DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
...@@ -2151,18 +2152,19 @@ static void intel_sdvo_get_ddc_modes(struct drm_connector *connector) ...@@ -2151,18 +2152,19 @@ static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)
* DDC fails, check to see if the analog output is disconnected, in * DDC fails, check to see if the analog output is disconnected, in
* which case we'll look there for the digital DDC data. * which case we'll look there for the digital DDC data.
*/ */
if (edid == NULL) if (!edid)
edid = intel_sdvo_get_analog_edid(connector); edid = intel_sdvo_get_analog_edid(connector);
if (edid != NULL) { if (!edid)
return 0;
if (intel_sdvo_connector_matches_edid(to_intel_sdvo_connector(connector), if (intel_sdvo_connector_matches_edid(to_intel_sdvo_connector(connector),
edid)) { edid))
drm_connector_update_edid_property(connector, edid); num_modes += intel_connector_update_modes(connector, edid);
drm_add_edid_modes(connector, edid);
}
kfree(edid); kfree(edid);
}
return num_modes;
} }
/* /*
...@@ -2230,12 +2232,13 @@ static const struct drm_display_mode sdvo_tv_modes[] = { ...@@ -2230,12 +2232,13 @@ static const struct drm_display_mode sdvo_tv_modes[] = {
DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
}; };
static void intel_sdvo_get_tv_modes(struct drm_connector *connector) static int intel_sdvo_get_tv_modes(struct drm_connector *connector)
{ {
struct intel_sdvo *intel_sdvo = intel_attached_sdvo(to_intel_connector(connector)); struct intel_sdvo *intel_sdvo = intel_attached_sdvo(to_intel_connector(connector));
const struct drm_connector_state *conn_state = connector->state; const struct drm_connector_state *conn_state = connector->state;
struct intel_sdvo_sdtv_resolution_request tv_res; struct intel_sdvo_sdtv_resolution_request tv_res;
u32 reply = 0, format_map = 0; u32 reply = 0, format_map = 0;
int num_modes = 0;
int i; int i;
DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
...@@ -2250,31 +2253,37 @@ static void intel_sdvo_get_tv_modes(struct drm_connector *connector) ...@@ -2250,31 +2253,37 @@ static void intel_sdvo_get_tv_modes(struct drm_connector *connector)
min(sizeof(format_map), sizeof(struct intel_sdvo_sdtv_resolution_request))); min(sizeof(format_map), sizeof(struct intel_sdvo_sdtv_resolution_request)));
if (!intel_sdvo_set_target_output(intel_sdvo, intel_sdvo->attached_output)) if (!intel_sdvo_set_target_output(intel_sdvo, intel_sdvo->attached_output))
return; return 0;
BUILD_BUG_ON(sizeof(tv_res) != 3); BUILD_BUG_ON(sizeof(tv_res) != 3);
if (!intel_sdvo_write_cmd(intel_sdvo, if (!intel_sdvo_write_cmd(intel_sdvo,
SDVO_CMD_GET_SDTV_RESOLUTION_SUPPORT, SDVO_CMD_GET_SDTV_RESOLUTION_SUPPORT,
&tv_res, sizeof(tv_res))) &tv_res, sizeof(tv_res)))
return; return 0;
if (!intel_sdvo_read_response(intel_sdvo, &reply, 3)) if (!intel_sdvo_read_response(intel_sdvo, &reply, 3))
return; return 0;
for (i = 0; i < ARRAY_SIZE(sdvo_tv_modes); i++) for (i = 0; i < ARRAY_SIZE(sdvo_tv_modes); i++) {
if (reply & (1 << i)) { if (reply & (1 << i)) {
struct drm_display_mode *nmode; struct drm_display_mode *nmode;
nmode = drm_mode_duplicate(connector->dev, nmode = drm_mode_duplicate(connector->dev,
&sdvo_tv_modes[i]); &sdvo_tv_modes[i]);
if (nmode) if (nmode) {
drm_mode_probed_add(connector, nmode); drm_mode_probed_add(connector, nmode);
num_modes++;
}
} }
}
return num_modes;
} }
static void intel_sdvo_get_lvds_modes(struct drm_connector *connector) static int intel_sdvo_get_lvds_modes(struct drm_connector *connector)
{ {
struct intel_sdvo *intel_sdvo = intel_attached_sdvo(to_intel_connector(connector)); struct intel_sdvo *intel_sdvo = intel_attached_sdvo(to_intel_connector(connector));
struct drm_i915_private *dev_priv = to_i915(connector->dev); struct drm_i915_private *dev_priv = to_i915(connector->dev);
struct drm_display_mode *newmode; struct drm_display_mode *newmode;
int num_modes = 0;
drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s]\n", drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s]\n",
connector->base.id, connector->name); connector->base.id, connector->name);
...@@ -2291,6 +2300,7 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector) ...@@ -2291,6 +2300,7 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector)
newmode->type = (DRM_MODE_TYPE_PREFERRED | newmode->type = (DRM_MODE_TYPE_PREFERRED |
DRM_MODE_TYPE_DRIVER); DRM_MODE_TYPE_DRIVER);
drm_mode_probed_add(connector, newmode); drm_mode_probed_add(connector, newmode);
num_modes++;
} }
} }
...@@ -2299,7 +2309,9 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector) ...@@ -2299,7 +2309,9 @@ 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(connector, &intel_sdvo->ddc); num_modes += intel_ddc_get_modes(connector, &intel_sdvo->ddc);
return num_modes;
} }
static int intel_sdvo_get_modes(struct drm_connector *connector) static int intel_sdvo_get_modes(struct drm_connector *connector)
...@@ -2307,13 +2319,11 @@ static int intel_sdvo_get_modes(struct drm_connector *connector) ...@@ -2307,13 +2319,11 @@ static int intel_sdvo_get_modes(struct drm_connector *connector)
struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector); struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector);
if (IS_TV(intel_sdvo_connector)) if (IS_TV(intel_sdvo_connector))
intel_sdvo_get_tv_modes(connector); return intel_sdvo_get_tv_modes(connector);
else if (IS_LVDS(intel_sdvo_connector)) else if (IS_LVDS(intel_sdvo_connector))
intel_sdvo_get_lvds_modes(connector); return intel_sdvo_get_lvds_modes(connector);
else else
intel_sdvo_get_ddc_modes(connector); return intel_sdvo_get_ddc_modes(connector);
return !list_empty(&connector->probed_modes);
} }
static int static int
......
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