Commit fff8e050 authored by Thomas Zimmermann's avatar Thomas Zimmermann Committed by Alex Deucher
Browse files

drm/radeon: Do not hold console lock during resume



The function radeon_resume_kms() acquires the console lock. It is
inconsistent, as it depends on the notify_client argument. That
lock then covers a number of suspend operations that are unrelated
to the console.

Remove the calls to console_lock() and console_unlock() from the
radeon function. The console lock is only required by DRM's fbdev
emulation, which acquires it as necessary.

Also fixes a possible circular dependency between the console lock
and the client-list mutex, where the mutex is supposed to be taken
first.

Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 612ec7c6
Loading
Loading
Loading
Loading
+3 −12
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@
 *          Jerome Glisse
 */

#include <linux/console.h>
#include <linux/efi.h>
#include <linux/pci.h>
#include <linux/pm_runtime.h>
@@ -1659,18 +1658,12 @@ int radeon_resume_kms(struct drm_device *dev, bool resume, bool notify_clients)
	if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
		return 0;

	if (notify_clients) {
		console_lock();
	}
	if (resume) {
		pci_set_power_state(pdev, PCI_D0);
		pci_restore_state(pdev);
		if (pci_enable_device(pdev)) {
			if (notify_clients)
				console_unlock();
		if (pci_enable_device(pdev))
			return -1;
	}
	}
	/* resume AGP if in use */
	radeon_agp_resume(rdev);
	radeon_resume(rdev);
@@ -1745,10 +1738,8 @@ int radeon_resume_kms(struct drm_device *dev, bool resume, bool notify_clients)
	if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled)
		radeon_pm_compute_clocks(rdev);

	if (notify_clients) {
		drm_client_dev_resume(dev, true);
		console_unlock();
	}
	if (notify_clients)
		drm_client_dev_resume(dev, false);

	return 0;
}