diff options
Diffstat (limited to 'drivers/gpu/drm/drm_probe_helper.c')
| -rw-r--r-- | drivers/gpu/drm/drm_probe_helper.c | 45 | 
1 files changed, 27 insertions, 18 deletions
diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c index 04203c0d2ecb..d734780b31c0 100644 --- a/drivers/gpu/drm/drm_probe_helper.c +++ b/drivers/gpu/drm/drm_probe_helper.c @@ -93,6 +93,27 @@ static int drm_helper_probe_add_cmdline_mode(struct drm_connector *connector)  	return 1;  } +#define DRM_OUTPUT_POLL_PERIOD (10*HZ) +static void __drm_kms_helper_poll_enable(struct drm_device *dev) +{ +	bool poll = false; +	struct drm_connector *connector; + +	WARN_ON(!mutex_is_locked(&dev->mode_config.mutex)); + +	if (!dev->mode_config.poll_enabled || !drm_kms_helper_poll) +		return; + +	drm_for_each_connector(connector, dev) { +		if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT | +					 DRM_CONNECTOR_POLL_DISCONNECT)) +			poll = true; +	} + +	if (poll) +		schedule_delayed_work(&dev->mode_config.output_poll_work, DRM_OUTPUT_POLL_PERIOD); +} +  static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connector *connector,  							      uint32_t maxX, uint32_t maxY, bool merge_type_bits)  { @@ -153,7 +174,7 @@ static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connect  	/* Re-enable polling in case the global poll config changed. */  	if (drm_kms_helper_poll != dev->mode_config.poll_running) -		drm_kms_helper_poll_enable(dev); +		__drm_kms_helper_poll_enable(dev);  	dev->mode_config.poll_running = drm_kms_helper_poll; @@ -295,7 +316,6 @@ void drm_kms_helper_hotplug_event(struct drm_device *dev)  }  EXPORT_SYMBOL(drm_kms_helper_hotplug_event); -#define DRM_OUTPUT_POLL_PERIOD (10*HZ)  static void output_poll_execute(struct work_struct *work)  {  	struct delayed_work *delayed_work = to_delayed_work(work); @@ -312,7 +332,7 @@ static void output_poll_execute(struct work_struct *work)  		goto out;  	mutex_lock(&dev->mode_config.mutex); -	list_for_each_entry(connector, &dev->mode_config.connector_list, head) { +	drm_for_each_connector(connector, dev) {  		/* Ignore forced connectors. */  		if (connector->force) @@ -407,20 +427,9 @@ EXPORT_SYMBOL(drm_kms_helper_poll_disable);   */  void drm_kms_helper_poll_enable(struct drm_device *dev)  { -	bool poll = false; -	struct drm_connector *connector; - -	if (!dev->mode_config.poll_enabled || !drm_kms_helper_poll) -		return; - -	list_for_each_entry(connector, &dev->mode_config.connector_list, head) { -		if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT | -					 DRM_CONNECTOR_POLL_DISCONNECT)) -			poll = true; -	} - -	if (poll) -		schedule_delayed_work(&dev->mode_config.output_poll_work, DRM_OUTPUT_POLL_PERIOD); +	mutex_lock(&dev->mode_config.mutex); +	__drm_kms_helper_poll_enable(dev); +	mutex_unlock(&dev->mode_config.mutex);  }  EXPORT_SYMBOL(drm_kms_helper_poll_enable); @@ -495,7 +504,7 @@ bool drm_helper_hpd_irq_event(struct drm_device *dev)  		return false;  	mutex_lock(&dev->mode_config.mutex); -	list_for_each_entry(connector, &dev->mode_config.connector_list, head) { +	drm_for_each_connector(connector, dev) {  		/* Only handle HPD capable connectors. */  		if (!(connector->polled & DRM_CONNECTOR_POLL_HPD))  |