xref: /linux/drivers/gpu/drm/i915/display/intel_encoder.c (revision 260f6f4fda93c8485c8037865c941b42b9cba5d2)
1 // SPDX-License-Identifier: MIT
2 /*
3  * Copyright © 2024 Intel Corporation
4  */
5 
6 #include <linux/workqueue.h>
7 
8 #include "intel_display_core.h"
9 #include "intel_display_types.h"
10 #include "intel_encoder.h"
11 
12 static void intel_encoder_link_check_work_fn(struct work_struct *work)
13 {
14 	struct intel_encoder *encoder =
15 		container_of(work, typeof(*encoder), link_check_work.work);
16 
17 	encoder->link_check(encoder);
18 }
19 
20 void intel_encoder_link_check_init(struct intel_encoder *encoder,
21 				   void (*callback)(struct intel_encoder *encoder))
22 {
23 	INIT_DELAYED_WORK(&encoder->link_check_work, intel_encoder_link_check_work_fn);
24 	encoder->link_check = callback;
25 }
26 
27 void intel_encoder_link_check_flush_work(struct intel_encoder *encoder)
28 {
29 	cancel_delayed_work_sync(&encoder->link_check_work);
30 }
31 
32 void intel_encoder_link_check_queue_work(struct intel_encoder *encoder, int delay_ms)
33 {
34 	struct intel_display *display = to_intel_display(encoder);
35 
36 	mod_delayed_work(display->wq.unordered,
37 			 &encoder->link_check_work, msecs_to_jiffies(delay_ms));
38 }
39 
40 void intel_encoder_suspend_all(struct intel_display *display)
41 {
42 	struct intel_encoder *encoder;
43 
44 	if (!HAS_DISPLAY(display))
45 		return;
46 
47 	/*
48 	 * TODO: check and remove holding the modeset locks if none of
49 	 * the encoders depends on this.
50 	 */
51 	drm_modeset_lock_all(display->drm);
52 	for_each_intel_encoder(display->drm, encoder)
53 		if (encoder->suspend)
54 			encoder->suspend(encoder);
55 	drm_modeset_unlock_all(display->drm);
56 
57 	for_each_intel_encoder(display->drm, encoder)
58 		if (encoder->suspend_complete)
59 			encoder->suspend_complete(encoder);
60 }
61 
62 void intel_encoder_shutdown_all(struct intel_display *display)
63 {
64 	struct intel_encoder *encoder;
65 
66 	if (!HAS_DISPLAY(display))
67 		return;
68 
69 	/*
70 	 * TODO: check and remove holding the modeset locks if none of
71 	 * the encoders depends on this.
72 	 */
73 	drm_modeset_lock_all(display->drm);
74 	for_each_intel_encoder(display->drm, encoder)
75 		if (encoder->shutdown)
76 			encoder->shutdown(encoder);
77 	drm_modeset_unlock_all(display->drm);
78 
79 	for_each_intel_encoder(display->drm, encoder)
80 		if (encoder->shutdown_complete)
81 			encoder->shutdown_complete(encoder);
82 }
83