aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_connectors.c
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2018-06-28 09:13:12 -0400
committerVille Syrjälä <ville.syrjala@linux.intel.com>2018-07-05 09:52:08 -0400
commit7b71ca249b265fe69ab3152a15bc6c305554a7da (patch)
treefaaa463507f51cbd58959b0a0da515f436835bbd /drivers/gpu/drm/radeon/radeon_connectors.c
parentddba766dd07e67d0ca70b632d3bbac72234b547e (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.c90
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
394static struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector) 379static 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 */
1459static struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector) 1441static 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;