@@ -282,7 +282,8 @@ void drm_kms_helper_poll_enable(struct drm_device *dev)
282
282
bool poll = false;
283
283
unsigned long delay = DRM_OUTPUT_POLL_PERIOD ;
284
284
285
- if (!dev -> mode_config .poll_enabled || !drm_kms_helper_poll )
285
+ if (!dev -> mode_config .poll_enabled || !drm_kms_helper_poll ||
286
+ dev -> mode_config .poll_running )
286
287
return ;
287
288
288
289
poll = drm_kms_helper_enable_hpd (dev );
@@ -304,6 +305,8 @@ void drm_kms_helper_poll_enable(struct drm_device *dev)
304
305
305
306
if (poll )
306
307
schedule_delayed_work (& dev -> mode_config .output_poll_work , delay );
308
+
309
+ dev -> mode_config .poll_running = true;
307
310
}
308
311
EXPORT_SYMBOL (drm_kms_helper_poll_enable );
309
312
@@ -592,10 +595,7 @@ int drm_helper_probe_single_connector_modes(struct drm_connector *connector,
592
595
}
593
596
594
597
/* Re-enable polling in case the global poll config changed. */
595
- if (drm_kms_helper_poll != dev -> mode_config .poll_running )
596
- drm_kms_helper_poll_enable (dev );
597
-
598
- dev -> mode_config .poll_running = drm_kms_helper_poll ;
598
+ drm_kms_helper_poll_enable (dev );
599
599
600
600
if (connector -> status == connector_status_disconnected ) {
601
601
DRM_DEBUG_KMS ("[CONNECTOR:%d:%s] disconnected\n" ,
@@ -735,8 +735,11 @@ static void output_poll_execute(struct work_struct *work)
735
735
changed = dev -> mode_config .delayed_event ;
736
736
dev -> mode_config .delayed_event = false;
737
737
738
- if (!drm_kms_helper_poll )
738
+ if (!drm_kms_helper_poll && dev -> mode_config .poll_running ) {
739
+ drm_kms_helper_disable_hpd (dev );
740
+ dev -> mode_config .poll_running = false;
739
741
goto out ;
742
+ }
740
743
741
744
if (!mutex_trylock (& dev -> mode_config .mutex )) {
742
745
repoll = true;
@@ -833,19 +836,6 @@ bool drm_kms_helper_is_poll_worker(void)
833
836
}
834
837
EXPORT_SYMBOL (drm_kms_helper_is_poll_worker );
835
838
836
- static void drm_kms_helper_poll_disable_fini (struct drm_device * dev , bool fini )
837
- {
838
- if (!dev -> mode_config .poll_enabled )
839
- return ;
840
-
841
- if (fini )
842
- dev -> mode_config .poll_enabled = false;
843
-
844
- drm_kms_helper_disable_hpd (dev );
845
-
846
- cancel_delayed_work_sync (& dev -> mode_config .output_poll_work );
847
- }
848
-
849
839
/**
850
840
* drm_kms_helper_poll_disable - disable output polling
851
841
* @dev: drm_device
@@ -862,7 +852,12 @@ static void drm_kms_helper_poll_disable_fini(struct drm_device *dev, bool fini)
862
852
*/
863
853
void drm_kms_helper_poll_disable (struct drm_device * dev )
864
854
{
865
- drm_kms_helper_poll_disable_fini (dev , false);
855
+ if (dev -> mode_config .poll_running )
856
+ drm_kms_helper_disable_hpd (dev );
857
+
858
+ cancel_delayed_work_sync (& dev -> mode_config .output_poll_work );
859
+
860
+ dev -> mode_config .poll_running = false;
866
861
}
867
862
EXPORT_SYMBOL (drm_kms_helper_poll_disable );
868
863
@@ -900,7 +895,12 @@ EXPORT_SYMBOL(drm_kms_helper_poll_init);
900
895
*/
901
896
void drm_kms_helper_poll_fini (struct drm_device * dev )
902
897
{
903
- drm_kms_helper_poll_disable_fini (dev , true);
898
+ if (!dev -> mode_config .poll_enabled )
899
+ return ;
900
+
901
+ drm_kms_helper_poll_disable (dev );
902
+
903
+ dev -> mode_config .poll_enabled = false;
904
904
}
905
905
EXPORT_SYMBOL (drm_kms_helper_poll_fini );
906
906
0 commit comments