Skip to content

Commit

Permalink
Revert "drm/probe-helpers: Drop locking from poll_enable"
Browse files Browse the repository at this point in the history
This reverts commit 3846fd9.

There were some precursor commits missing for this around connector
locking, we should probably merge Lyude's nouveau avoid the problem patch.
  • Loading branch information
Dave Airlie committed Jan 25, 2017
1 parent 9327901 commit 54a07c7
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 22 deletions.
51 changes: 31 additions & 20 deletions drivers/gpu/drm/drm_probe_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,27 +115,24 @@ static int drm_helper_probe_add_cmdline_mode(struct drm_connector *connector)

#define DRM_OUTPUT_POLL_PERIOD (10*HZ)
/**
* drm_kms_helper_poll_enable - re-enable output polling.
* drm_kms_helper_poll_enable_locked - re-enable output polling.
* @dev: drm_device
*
* This function re-enables the output polling work, after it has been
* temporarily disabled using drm_kms_helper_poll_disable(), for example over
* suspend/resume.
* This function re-enables the output polling work without
* locking the mode_config mutex.
*
* Drivers can call this helper from their device resume implementation. It is
* an error to call this when the output polling support has not yet been set
* up.
*
* Note that calls to enable and disable polling must be strictly ordered, which
* is automatically the case when they're only call from suspend/resume
* callbacks.
* This is like drm_kms_helper_poll_enable() however it is to be
* called from a context where the mode_config mutex is locked
* already.
*/
void drm_kms_helper_poll_enable(struct drm_device *dev)
void drm_kms_helper_poll_enable_locked(struct drm_device *dev)
{
bool poll = false;
struct drm_connector *connector;
unsigned long delay = DRM_OUTPUT_POLL_PERIOD;

WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));

if (!dev->mode_config.poll_enabled || !drm_kms_helper_poll)
return;

Expand Down Expand Up @@ -163,7 +160,7 @@ void drm_kms_helper_poll_enable(struct drm_device *dev)
if (poll)
schedule_delayed_work(&dev->mode_config.output_poll_work, delay);
}
EXPORT_SYMBOL(drm_kms_helper_poll_enable);
EXPORT_SYMBOL(drm_kms_helper_poll_enable_locked);

static enum drm_connector_status
drm_connector_detect(struct drm_connector *connector, bool force)
Expand Down Expand Up @@ -290,7 +287,7 @@ int drm_helper_probe_single_connector_modes(struct drm_connector *connector,

/* 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_locked(dev);

dev->mode_config.poll_running = drm_kms_helper_poll;

Expand Down Expand Up @@ -482,12 +479,8 @@ static void output_poll_execute(struct work_struct *work)
* This function disables the output polling work.
*
* Drivers can call this helper from their device suspend implementation. It is
* not an error to call this even when output polling isn't enabled or already
* disabled. Polling is re-enabled by calling drm_kms_helper_poll_enable().
*
* Note that calls to enable and disable polling must be strictly ordered, which
* is automatically the case when they're only call from suspend/resume
* callbacks.
* not an error to call this even when output polling isn't enabled or arlready
* disabled.
*/
void drm_kms_helper_poll_disable(struct drm_device *dev)
{
Expand All @@ -497,6 +490,24 @@ void drm_kms_helper_poll_disable(struct drm_device *dev)
}
EXPORT_SYMBOL(drm_kms_helper_poll_disable);

/**
* drm_kms_helper_poll_enable - re-enable output polling.
* @dev: drm_device
*
* This function re-enables the output polling work.
*
* Drivers can call this helper from their device resume implementation. It is
* an error to call this when the output polling support has not yet been set
* up.
*/
void drm_kms_helper_poll_enable(struct drm_device *dev)
{
mutex_lock(&dev->mode_config.mutex);
drm_kms_helper_poll_enable_locked(dev);
mutex_unlock(&dev->mode_config.mutex);
}
EXPORT_SYMBOL(drm_kms_helper_poll_enable);

/**
* drm_kms_helper_poll_init - initialize and enable output polling
* @dev: drm_device
Expand Down
4 changes: 2 additions & 2 deletions drivers/gpu/drm/i915/intel_hotplug.c
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ static void intel_hpd_irq_storm_disable(struct drm_i915_private *dev_priv)

/* Enable polling and queue hotplug re-enabling. */
if (hpd_disabled) {
drm_kms_helper_poll_enable(dev);
drm_kms_helper_poll_enable_locked(dev);
mod_delayed_work(system_wq, &dev_priv->hotplug.reenable_work,
msecs_to_jiffies(HPD_STORM_REENABLE_DELAY));
}
Expand Down Expand Up @@ -511,7 +511,7 @@ static void i915_hpd_poll_init_work(struct work_struct *work)
}

if (enabled)
drm_kms_helper_poll_enable(dev);
drm_kms_helper_poll_enable_locked(dev);

mutex_unlock(&dev->mode_config.mutex);

Expand Down
1 change: 1 addition & 0 deletions include/drm/drm_crtc_helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,5 +73,6 @@ extern void drm_kms_helper_hotplug_event(struct drm_device *dev);

extern void drm_kms_helper_poll_disable(struct drm_device *dev);
extern void drm_kms_helper_poll_enable(struct drm_device *dev);
extern void drm_kms_helper_poll_enable_locked(struct drm_device *dev);

#endif

0 comments on commit 54a07c7

Please sign in to comment.