Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 54a07c7b authored by Dave Airlie's avatar Dave Airlie
Browse files

Revert "drm/probe-helpers: Drop locking from poll_enable"

This reverts commit 3846fd9b.

There were some precursor commits missing for this around connector
locking, we should probably merge Lyude's nouveau avoid the problem patch.
parent 93279010
Loading
Loading
Loading
Loading
+31 −20
Original line number Diff line number Diff line
@@ -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;

@@ -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)
@@ -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;

@@ -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)
{
@@ -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
+2 −2
Original line number Diff line number Diff line
@@ -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));
	}
@@ -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);

+1 −0
Original line number Diff line number Diff line
@@ -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