Lines Matching full:connector
57 * track of a per-connector hpd interrupt.
91 struct drm_connector *connector, in drm_mode_validate_pipeline() argument
95 struct drm_device *dev = connector->dev; in drm_mode_validate_pipeline()
99 /* Step 1: Validate against connector */ in drm_mode_validate_pipeline()
100 ret = drm_connector_mode_valid(connector, mode, ctx, status); in drm_mode_validate_pipeline()
105 drm_connector_for_each_possible_encoder(connector, encoder) { in drm_mode_validate_pipeline()
120 &connector->display_info, in drm_mode_validate_pipeline()
145 static int drm_helper_probe_add_cmdline_mode(struct drm_connector *connector) in drm_helper_probe_add_cmdline_mode() argument
150 cmdline_mode = &connector->cmdline_mode; in drm_helper_probe_add_cmdline_mode()
155 list_for_each_entry(mode, &connector->probed_modes, head) { in drm_helper_probe_add_cmdline_mode()
171 mode = drm_mode_create_from_cmdline_mode(connector->dev, in drm_helper_probe_add_cmdline_mode()
176 drm_mode_probed_add(connector, mode); in drm_helper_probe_add_cmdline_mode()
204 drm_connector_mode_valid(struct drm_connector *connector, in drm_connector_mode_valid() argument
210 connector->helper_private; in drm_connector_mode_valid()
216 ret = connector_funcs->mode_valid_ctx(connector, mode, ctx, in drm_connector_mode_valid()
219 *status = connector_funcs->mode_valid(connector, mode); in drm_connector_mode_valid()
245 struct drm_connector *connector; in drm_kms_helper_poll_enable() local
253 drm_for_each_connector_iter(connector, &conn_iter) { in drm_kms_helper_poll_enable()
254 if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT | in drm_kms_helper_poll_enable()
281 drm_helper_probe_detect_ctx(struct drm_connector *connector, bool force) in drm_helper_probe_detect_ctx() argument
283 const struct drm_connector_helper_funcs *funcs = connector->helper_private; in drm_helper_probe_detect_ctx()
290 ret = drm_modeset_lock(&connector->dev->mode_config.connection_mutex, &ctx); in drm_helper_probe_detect_ctx()
293 ret = funcs->detect_ctx(connector, &ctx, force); in drm_helper_probe_detect_ctx()
294 else if (connector->funcs->detect) in drm_helper_probe_detect_ctx()
295 ret = connector->funcs->detect(connector, force); in drm_helper_probe_detect_ctx()
308 if (ret != connector->status) in drm_helper_probe_detect_ctx()
309 connector->epoch_counter += 1; in drm_helper_probe_detect_ctx()
318 * drm_helper_probe_detect - probe connector status
319 * @connector: connector to probe
323 * This function calls the detect callbacks of the connector.
328 drm_helper_probe_detect(struct drm_connector *connector, in drm_helper_probe_detect() argument
332 const struct drm_connector_helper_funcs *funcs = connector->helper_private; in drm_helper_probe_detect()
333 struct drm_device *dev = connector->dev; in drm_helper_probe_detect()
337 return drm_helper_probe_detect_ctx(connector, force); in drm_helper_probe_detect()
344 ret = funcs->detect_ctx(connector, ctx, force); in drm_helper_probe_detect()
345 else if (connector->funcs->detect) in drm_helper_probe_detect()
346 ret = connector->funcs->detect(connector, force); in drm_helper_probe_detect()
350 if (ret != connector->status) in drm_helper_probe_detect()
351 connector->epoch_counter += 1; in drm_helper_probe_detect()
359 * @connector: connector to probe
363 * Based on the helper callbacks implemented by @connector in struct
365 * be added to the connector's probed_modes list, then culled (based on validity
374 * 1. All modes currently on the connector's modes list are marked as stale
376 * 2. New modes are added to the connector's probed_modes list with
381 * - if the connector status is connector_status_connected, standard
399 * - drm_mode_validate_flag() checks the modes against basic connector
409 * 5. Any mode whose status is not OK is pruned from the connector's modes list,
414 * The number of modes found on @connector.
416 int drm_helper_probe_single_connector_modes(struct drm_connector *connector, in drm_helper_probe_single_connector_modes() argument
419 struct drm_device *dev = connector->dev; in drm_helper_probe_single_connector_modes()
422 connector->helper_private; in drm_helper_probe_single_connector_modes()
433 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", connector->base.id, in drm_helper_probe_single_connector_modes()
434 connector->name); in drm_helper_probe_single_connector_modes()
445 list_for_each_entry(mode, &connector->modes, head) in drm_helper_probe_single_connector_modes()
448 old_status = connector->status; in drm_helper_probe_single_connector_modes()
450 if (connector->force) { in drm_helper_probe_single_connector_modes()
451 if (connector->force == DRM_FORCE_ON || in drm_helper_probe_single_connector_modes()
452 connector->force == DRM_FORCE_ON_DIGITAL) in drm_helper_probe_single_connector_modes()
453 connector->status = connector_status_connected; in drm_helper_probe_single_connector_modes()
455 connector->status = connector_status_disconnected; in drm_helper_probe_single_connector_modes()
456 if (connector->funcs->force) in drm_helper_probe_single_connector_modes()
457 connector->funcs->force(connector); in drm_helper_probe_single_connector_modes()
459 ret = drm_helper_probe_detect(connector, &ctx, true); in drm_helper_probe_single_connector_modes()
464 } else if (WARN(ret < 0, "Invalid return value %i for connector detection\n", ret)) in drm_helper_probe_single_connector_modes()
467 connector->status = ret; in drm_helper_probe_single_connector_modes()
476 if (old_status != connector->status) { in drm_helper_probe_single_connector_modes()
477 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to %s\n", in drm_helper_probe_single_connector_modes()
478 connector->base.id, in drm_helper_probe_single_connector_modes()
479 connector->name, in drm_helper_probe_single_connector_modes()
481 drm_get_connector_status_name(connector->status)); in drm_helper_probe_single_connector_modes()
501 if (connector->status == connector_status_disconnected) { in drm_helper_probe_single_connector_modes()
502 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] disconnected\n", in drm_helper_probe_single_connector_modes()
503 connector->base.id, connector->name); in drm_helper_probe_single_connector_modes()
504 drm_connector_update_edid_property(connector, NULL); in drm_helper_probe_single_connector_modes()
509 count = (*connector_funcs->get_modes)(connector); in drm_helper_probe_single_connector_modes()
515 if (count == 0 && connector->status == connector_status_connected) in drm_helper_probe_single_connector_modes()
516 count = drm_add_override_edid_modes(connector); in drm_helper_probe_single_connector_modes()
518 if (count == 0 && connector->status == connector_status_connected) in drm_helper_probe_single_connector_modes()
519 count = drm_add_modes_noedid(connector, 1024, 768); in drm_helper_probe_single_connector_modes()
520 count += drm_helper_probe_add_cmdline_mode(connector); in drm_helper_probe_single_connector_modes()
524 drm_connector_list_update(connector); in drm_helper_probe_single_connector_modes()
526 if (connector->interlace_allowed) in drm_helper_probe_single_connector_modes()
528 if (connector->doublescan_allowed) in drm_helper_probe_single_connector_modes()
530 if (connector->stereo_allowed) in drm_helper_probe_single_connector_modes()
533 list_for_each_entry(mode, &connector->modes, head) { in drm_helper_probe_single_connector_modes()
549 ret = drm_mode_validate_pipeline(mode, connector, &ctx, in drm_helper_probe_single_connector_modes()
566 mode->status = drm_mode_validate_ycbcr420(mode, connector); in drm_helper_probe_single_connector_modes()
570 drm_mode_prune_invalid(dev, &connector->modes, verbose_prune); in drm_helper_probe_single_connector_modes()
575 if (list_empty(&connector->modes)) in drm_helper_probe_single_connector_modes()
578 drm_mode_sort(&connector->modes); in drm_helper_probe_single_connector_modes()
580 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] probed modes :\n", connector->base.id, in drm_helper_probe_single_connector_modes()
581 connector->name); in drm_helper_probe_single_connector_modes()
582 list_for_each_entry(mode, &connector->modes, head) { in drm_helper_probe_single_connector_modes()
593 * @dev: drm_device whose connector state changed
622 struct drm_connector *connector; in output_poll_execute() local
643 drm_for_each_connector_iter(connector, &conn_iter) { in output_poll_execute()
645 if (connector->force) in output_poll_execute()
650 if (!connector->polled || connector->polled == DRM_CONNECTOR_POLL_HPD) in output_poll_execute()
653 old_status = connector->status; in output_poll_execute()
657 !(connector->polled & DRM_CONNECTOR_POLL_DISCONNECT)) in output_poll_execute()
662 connector->status = drm_helper_probe_detect(connector, NULL, false); in output_poll_execute()
663 if (old_status != connector->status) { in output_poll_execute()
679 if (connector->status == connector_status_unknown) { in output_poll_execute()
680 connector->status = old_status; in output_poll_execute()
685 new = drm_get_connector_status_name(connector->status); in output_poll_execute()
687 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] " in output_poll_execute()
689 connector->base.id, in output_poll_execute()
690 connector->name, in output_poll_execute()
718 * connector ->detect hook.
766 * Note that a connector can be both polled and probed from the hotplug handler,
802 * interrupts for each connector.
804 * Drivers which support hotplug interrupts for each connector individually and
806 * directly call drm_kms_helper_hotplug_event() in case the connector state
812 * Note that a connector can be both polled and probed from the hotplug handler,
817 struct drm_connector *connector; in drm_helper_hpd_irq_event() local
828 drm_for_each_connector_iter(connector, &conn_iter) { in drm_helper_hpd_irq_event()
830 if (!(connector->polled & DRM_CONNECTOR_POLL_HPD)) in drm_helper_hpd_irq_event()
833 old_status = connector->status; in drm_helper_hpd_irq_event()
835 old_epoch_counter = connector->epoch_counter; in drm_helper_hpd_irq_event()
837 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Old epoch counter %llu\n", connector->base.id, in drm_helper_hpd_irq_event()
838 connector->name, in drm_helper_hpd_irq_event()
841 connector->status = drm_helper_probe_detect(connector, NULL, false); in drm_helper_hpd_irq_event()
842 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to %s\n", in drm_helper_hpd_irq_event()
843 connector->base.id, in drm_helper_hpd_irq_event()
844 connector->name, in drm_helper_hpd_irq_event()
846 drm_get_connector_status_name(connector->status)); in drm_helper_hpd_irq_event()
848 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] New epoch counter %llu\n", in drm_helper_hpd_irq_event()
849 connector->base.id, in drm_helper_hpd_irq_event()
850 connector->name, in drm_helper_hpd_irq_event()
851 connector->epoch_counter); in drm_helper_hpd_irq_event()
857 if (old_epoch_counter != connector->epoch_counter) in drm_helper_hpd_irq_event()