diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2018-06-28 09:13:12 -0400 |
---|---|---|
committer | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2018-07-05 09:52:08 -0400 |
commit | 7b71ca249b265fe69ab3152a15bc6c305554a7da (patch) | |
tree | faaa463507f51cbd58959b0a0da515f436835bbd /drivers/gpu/drm/radeon/radeon_connectors.c | |
parent | ddba766dd07e67d0ca70b632d3bbac72234b547e (diff) |
drm/radeon: Use drm_connector_for_each_possible_encoder()
Use drm_connector_for_each_possible_encoder() for iterating
connector->encoder_ids[]. A bit more convenient not having
to deal with the implementation details.
v2: Replace drm_for_each_connector_encoder_ids() with
drm_connector_for_each_possible_encoder() (Daniel)
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: "Christian König" <christian.koenig@amd.com>
Cc: "David (ChunMing) Zhou" <David1.Zhou@amd.com>
Cc: Harry Wentland <harry.wentland@amd.com>
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180628131315.14156-7-ville.syrjala@linux.intel.com
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_connectors.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 90 |
1 files changed, 26 insertions, 64 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 2aea2bdff99b..0655698f2956 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
@@ -244,23 +244,15 @@ radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_c | |||
244 | { | 244 | { |
245 | struct drm_device *dev = connector->dev; | 245 | struct drm_device *dev = connector->dev; |
246 | struct radeon_device *rdev = dev->dev_private; | 246 | struct radeon_device *rdev = dev->dev_private; |
247 | struct drm_encoder *best_encoder = NULL; | 247 | struct drm_encoder *best_encoder; |
248 | struct drm_encoder *encoder = NULL; | 248 | struct drm_encoder *encoder; |
249 | const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; | 249 | const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; |
250 | bool connected; | 250 | bool connected; |
251 | int i; | 251 | int i; |
252 | 252 | ||
253 | best_encoder = connector_funcs->best_encoder(connector); | 253 | best_encoder = connector_funcs->best_encoder(connector); |
254 | 254 | ||
255 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { | 255 | drm_connector_for_each_possible_encoder(connector, encoder, i) { |
256 | if (connector->encoder_ids[i] == 0) | ||
257 | break; | ||
258 | |||
259 | encoder = drm_encoder_find(connector->dev, NULL, | ||
260 | connector->encoder_ids[i]); | ||
261 | if (!encoder) | ||
262 | continue; | ||
263 | |||
264 | if ((encoder == best_encoder) && (status == connector_status_connected)) | 256 | if ((encoder == best_encoder) && (status == connector_status_connected)) |
265 | connected = true; | 257 | connected = true; |
266 | else | 258 | else |
@@ -270,7 +262,6 @@ radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_c | |||
270 | radeon_atombios_connected_scratch_regs(connector, encoder, connected); | 262 | radeon_atombios_connected_scratch_regs(connector, encoder, connected); |
271 | else | 263 | else |
272 | radeon_combios_connected_scratch_regs(connector, encoder, connected); | 264 | radeon_combios_connected_scratch_regs(connector, encoder, connected); |
273 | |||
274 | } | 265 | } |
275 | } | 266 | } |
276 | 267 | ||
@@ -279,17 +270,11 @@ static struct drm_encoder *radeon_find_encoder(struct drm_connector *connector, | |||
279 | struct drm_encoder *encoder; | 270 | struct drm_encoder *encoder; |
280 | int i; | 271 | int i; |
281 | 272 | ||
282 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { | 273 | drm_connector_for_each_possible_encoder(connector, encoder, i) { |
283 | if (connector->encoder_ids[i] == 0) | ||
284 | break; | ||
285 | |||
286 | encoder = drm_encoder_find(connector->dev, NULL, connector->encoder_ids[i]); | ||
287 | if (!encoder) | ||
288 | continue; | ||
289 | |||
290 | if (encoder->encoder_type == encoder_type) | 274 | if (encoder->encoder_type == encoder_type) |
291 | return encoder; | 275 | return encoder; |
292 | } | 276 | } |
277 | |||
293 | return NULL; | 278 | return NULL; |
294 | } | 279 | } |
295 | 280 | ||
@@ -393,10 +378,13 @@ static int radeon_ddc_get_modes(struct drm_connector *connector) | |||
393 | 378 | ||
394 | static struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector) | 379 | static struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector) |
395 | { | 380 | { |
396 | int enc_id = connector->encoder_ids[0]; | 381 | struct drm_encoder *encoder; |
397 | /* pick the encoder ids */ | 382 | int i; |
398 | if (enc_id) | 383 | |
399 | return drm_encoder_find(connector->dev, NULL, enc_id); | 384 | /* pick the first one */ |
385 | drm_connector_for_each_possible_encoder(connector, encoder, i) | ||
386 | return encoder; | ||
387 | |||
400 | return NULL; | 388 | return NULL; |
401 | } | 389 | } |
402 | 390 | ||
@@ -436,19 +424,19 @@ radeon_connector_analog_encoder_conflict_solve(struct drm_connector *connector, | |||
436 | struct drm_device *dev = connector->dev; | 424 | struct drm_device *dev = connector->dev; |
437 | struct drm_connector *conflict; | 425 | struct drm_connector *conflict; |
438 | struct radeon_connector *radeon_conflict; | 426 | struct radeon_connector *radeon_conflict; |
439 | int i; | ||
440 | 427 | ||
441 | list_for_each_entry(conflict, &dev->mode_config.connector_list, head) { | 428 | list_for_each_entry(conflict, &dev->mode_config.connector_list, head) { |
429 | struct drm_encoder *enc; | ||
430 | int i; | ||
431 | |||
442 | if (conflict == connector) | 432 | if (conflict == connector) |
443 | continue; | 433 | continue; |
444 | 434 | ||
445 | radeon_conflict = to_radeon_connector(conflict); | 435 | radeon_conflict = to_radeon_connector(conflict); |
446 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { | ||
447 | if (conflict->encoder_ids[i] == 0) | ||
448 | break; | ||
449 | 436 | ||
437 | drm_connector_for_each_possible_encoder(conflict, enc, i) { | ||
450 | /* if the IDs match */ | 438 | /* if the IDs match */ |
451 | if (conflict->encoder_ids[i] == encoder->base.id) { | 439 | if (enc == encoder) { |
452 | if (conflict->status != connector_status_connected) | 440 | if (conflict->status != connector_status_connected) |
453 | continue; | 441 | continue; |
454 | 442 | ||
@@ -1256,7 +1244,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) | |||
1256 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | 1244 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1257 | struct drm_encoder *encoder = NULL; | 1245 | struct drm_encoder *encoder = NULL; |
1258 | const struct drm_encoder_helper_funcs *encoder_funcs; | 1246 | const struct drm_encoder_helper_funcs *encoder_funcs; |
1259 | int i, r; | 1247 | int r; |
1260 | enum drm_connector_status ret = connector_status_disconnected; | 1248 | enum drm_connector_status ret = connector_status_disconnected; |
1261 | bool dret = false, broken_edid = false; | 1249 | bool dret = false, broken_edid = false; |
1262 | 1250 | ||
@@ -1374,15 +1362,9 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) | |||
1374 | 1362 | ||
1375 | /* find analog encoder */ | 1363 | /* find analog encoder */ |
1376 | if (radeon_connector->dac_load_detect) { | 1364 | if (radeon_connector->dac_load_detect) { |
1377 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { | 1365 | int i; |
1378 | if (connector->encoder_ids[i] == 0) | ||
1379 | break; | ||
1380 | |||
1381 | encoder = drm_encoder_find(connector->dev, NULL, | ||
1382 | connector->encoder_ids[i]); | ||
1383 | if (!encoder) | ||
1384 | continue; | ||
1385 | 1366 | ||
1367 | drm_connector_for_each_possible_encoder(connector, encoder, i) { | ||
1386 | if (encoder->encoder_type != DRM_MODE_ENCODER_DAC && | 1368 | if (encoder->encoder_type != DRM_MODE_ENCODER_DAC && |
1387 | encoder->encoder_type != DRM_MODE_ENCODER_TVDAC) | 1369 | encoder->encoder_type != DRM_MODE_ENCODER_TVDAC) |
1388 | continue; | 1370 | continue; |
@@ -1458,18 +1440,11 @@ exit: | |||
1458 | /* okay need to be smart in here about which encoder to pick */ | 1440 | /* okay need to be smart in here about which encoder to pick */ |
1459 | static struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector) | 1441 | static struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector) |
1460 | { | 1442 | { |
1461 | int enc_id = connector->encoder_ids[0]; | ||
1462 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | 1443 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1463 | struct drm_encoder *encoder; | 1444 | struct drm_encoder *encoder; |
1464 | int i; | 1445 | int i; |
1465 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { | ||
1466 | if (connector->encoder_ids[i] == 0) | ||
1467 | break; | ||
1468 | |||
1469 | encoder = drm_encoder_find(connector->dev, NULL, connector->encoder_ids[i]); | ||
1470 | if (!encoder) | ||
1471 | continue; | ||
1472 | 1446 | ||
1447 | drm_connector_for_each_possible_encoder(connector, encoder, i) { | ||
1473 | if (radeon_connector->use_digital == true) { | 1448 | if (radeon_connector->use_digital == true) { |
1474 | if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS) | 1449 | if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS) |
1475 | return encoder; | 1450 | return encoder; |
@@ -1484,8 +1459,9 @@ static struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector) | |||
1484 | 1459 | ||
1485 | /* then check use digitial */ | 1460 | /* then check use digitial */ |
1486 | /* pick the first one */ | 1461 | /* pick the first one */ |
1487 | if (enc_id) | 1462 | drm_connector_for_each_possible_encoder(connector, encoder, i) |
1488 | return drm_encoder_find(connector->dev, NULL, enc_id); | 1463 | return encoder; |
1464 | |||
1489 | return NULL; | 1465 | return NULL; |
1490 | } | 1466 | } |
1491 | 1467 | ||
@@ -1628,14 +1604,7 @@ u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *conn | |||
1628 | struct radeon_encoder *radeon_encoder; | 1604 | struct radeon_encoder *radeon_encoder; |
1629 | int i; | 1605 | int i; |
1630 | 1606 | ||
1631 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { | 1607 | drm_connector_for_each_possible_encoder(connector, encoder, i) { |
1632 | if (connector->encoder_ids[i] == 0) | ||
1633 | break; | ||
1634 | |||
1635 | encoder = drm_encoder_find(connector->dev, NULL, connector->encoder_ids[i]); | ||
1636 | if (!encoder) | ||
1637 | continue; | ||
1638 | |||
1639 | radeon_encoder = to_radeon_encoder(encoder); | 1608 | radeon_encoder = to_radeon_encoder(encoder); |
1640 | 1609 | ||
1641 | switch (radeon_encoder->encoder_id) { | 1610 | switch (radeon_encoder->encoder_id) { |
@@ -1657,14 +1626,7 @@ static bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector) | |||
1657 | int i; | 1626 | int i; |
1658 | bool found = false; | 1627 | bool found = false; |
1659 | 1628 | ||
1660 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { | 1629 | drm_connector_for_each_possible_encoder(connector, encoder, i) { |
1661 | if (connector->encoder_ids[i] == 0) | ||
1662 | break; | ||
1663 | |||
1664 | encoder = drm_encoder_find(connector->dev, NULL, connector->encoder_ids[i]); | ||
1665 | if (!encoder) | ||
1666 | continue; | ||
1667 | |||
1668 | radeon_encoder = to_radeon_encoder(encoder); | 1630 | radeon_encoder = to_radeon_encoder(encoder); |
1669 | if (radeon_encoder->caps & ATOM_ENCODER_CAP_RECORD_HBR2) | 1631 | if (radeon_encoder->caps & ATOM_ENCODER_CAP_RECORD_HBR2) |
1670 | found = true; | 1632 | found = true; |