diff options
author | Egbert Eich <eich@suse.de> | 2015-09-23 10:13:00 -0400 |
---|---|---|
committer | Jani Nikula <jani.nikula@intel.com> | 2015-09-30 09:04:08 -0400 |
commit | 4ad640e99e5e5514d623210bc937e665ffd8f43f (patch) | |
tree | 67c1225743fac4977baf2067376603a4cd24c2a7 | |
parent | dfc53c5e73f8b73abf920241e45eab87335ae742 (diff) |
drm: Add a non-locking version of drm_kms_helper_poll_enable(), v2
drm_kms_helper_poll_enable() was converted to lock the mode_config
mutex in commit 8c4ccc4ab6f64e859d4ff8d7c02c2ed2e956e07f
("drm/probe-helper: Grab mode_config.mutex in poll_init/enable").
This disregarded the cases where this function is called from a context
where this mutex is already locked.
Add a non-locking version as well.
Changes since v1:
- use function name suffix '_locked' for the function that
is to be called from a locked context.
Signed-off-by: Egbert Eich <eich@suse.de>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
-rw-r--r-- | drivers/gpu/drm/drm_probe_helper.c | 19 | ||||
-rw-r--r-- | include/drm/drm_crtc_helper.h | 1 |
2 files changed, 17 insertions, 3 deletions
diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c index d734780b31c0..a18164f2f6d2 100644 --- a/drivers/gpu/drm/drm_probe_helper.c +++ b/drivers/gpu/drm/drm_probe_helper.c | |||
@@ -94,7 +94,18 @@ static int drm_helper_probe_add_cmdline_mode(struct drm_connector *connector) | |||
94 | } | 94 | } |
95 | 95 | ||
96 | #define DRM_OUTPUT_POLL_PERIOD (10*HZ) | 96 | #define DRM_OUTPUT_POLL_PERIOD (10*HZ) |
97 | static void __drm_kms_helper_poll_enable(struct drm_device *dev) | 97 | /** |
98 | * drm_kms_helper_poll_enable_locked - re-enable output polling. | ||
99 | * @dev: drm_device | ||
100 | * | ||
101 | * This function re-enables the output polling work without | ||
102 | * locking the mode_config mutex. | ||
103 | * | ||
104 | * This is like drm_kms_helper_poll_enable() however it is to be | ||
105 | * called from a context where the mode_config mutex is locked | ||
106 | * already. | ||
107 | */ | ||
108 | void drm_kms_helper_poll_enable_locked(struct drm_device *dev) | ||
98 | { | 109 | { |
99 | bool poll = false; | 110 | bool poll = false; |
100 | struct drm_connector *connector; | 111 | struct drm_connector *connector; |
@@ -113,6 +124,8 @@ static void __drm_kms_helper_poll_enable(struct drm_device *dev) | |||
113 | if (poll) | 124 | if (poll) |
114 | schedule_delayed_work(&dev->mode_config.output_poll_work, DRM_OUTPUT_POLL_PERIOD); | 125 | schedule_delayed_work(&dev->mode_config.output_poll_work, DRM_OUTPUT_POLL_PERIOD); |
115 | } | 126 | } |
127 | EXPORT_SYMBOL(drm_kms_helper_poll_enable_locked); | ||
128 | |||
116 | 129 | ||
117 | static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connector *connector, | 130 | static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connector *connector, |
118 | uint32_t maxX, uint32_t maxY, bool merge_type_bits) | 131 | uint32_t maxX, uint32_t maxY, bool merge_type_bits) |
@@ -174,7 +187,7 @@ static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connect | |||
174 | 187 | ||
175 | /* Re-enable polling in case the global poll config changed. */ | 188 | /* Re-enable polling in case the global poll config changed. */ |
176 | if (drm_kms_helper_poll != dev->mode_config.poll_running) | 189 | if (drm_kms_helper_poll != dev->mode_config.poll_running) |
177 | __drm_kms_helper_poll_enable(dev); | 190 | drm_kms_helper_poll_enable_locked(dev); |
178 | 191 | ||
179 | dev->mode_config.poll_running = drm_kms_helper_poll; | 192 | dev->mode_config.poll_running = drm_kms_helper_poll; |
180 | 193 | ||
@@ -428,7 +441,7 @@ EXPORT_SYMBOL(drm_kms_helper_poll_disable); | |||
428 | void drm_kms_helper_poll_enable(struct drm_device *dev) | 441 | void drm_kms_helper_poll_enable(struct drm_device *dev) |
429 | { | 442 | { |
430 | mutex_lock(&dev->mode_config.mutex); | 443 | mutex_lock(&dev->mode_config.mutex); |
431 | __drm_kms_helper_poll_enable(dev); | 444 | drm_kms_helper_poll_enable_locked(dev); |
432 | mutex_unlock(&dev->mode_config.mutex); | 445 | mutex_unlock(&dev->mode_config.mutex); |
433 | } | 446 | } |
434 | EXPORT_SYMBOL(drm_kms_helper_poll_enable); | 447 | EXPORT_SYMBOL(drm_kms_helper_poll_enable); |
diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h index 2a747a91fded..3febb4b9fce9 100644 --- a/include/drm/drm_crtc_helper.h +++ b/include/drm/drm_crtc_helper.h | |||
@@ -240,5 +240,6 @@ extern void drm_kms_helper_hotplug_event(struct drm_device *dev); | |||
240 | 240 | ||
241 | extern void drm_kms_helper_poll_disable(struct drm_device *dev); | 241 | extern void drm_kms_helper_poll_disable(struct drm_device *dev); |
242 | extern void drm_kms_helper_poll_enable(struct drm_device *dev); | 242 | extern void drm_kms_helper_poll_enable(struct drm_device *dev); |
243 | extern void drm_kms_helper_poll_enable_locked(struct drm_device *dev); | ||
243 | 244 | ||
244 | #endif | 245 | #endif |