+++ /dev/null
-From b792210e7d1f9fb102061e2016da96cf2ad5cdbd Mon Sep 17 00:00:00 2001
-From: Alex Deucher <alexdeucher@gmail.com>
-Date: Sat, 6 Mar 2010 10:57:30 -0500
-Subject: drm/radeon/kms/atom: spread spectrum fix
-
-From: Alex Deucher <alexdeucher@gmail.com>
-
-commit b792210e7d1f9fb102061e2016da96cf2ad5cdbd upstream.
-
-The atom spread spectrum table does not always
-disable ss. Explicitly disable it and then use
-the atom table to enable later if needed (currently
-only used for LVDS).
-
-Fixes display issues on some systems.
-
-Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
-Signed-off-by: Dave Airlie <airlied@redhat.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-
---- a/drivers/gpu/drm/radeon/atombios_crtc.c
-+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
-@@ -353,12 +353,55 @@ static void atombios_crtc_set_timing(struct drm_crtc *crtc,
- atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
- }
-
-+static void atombios_disable_ss(struct drm_crtc *crtc)
-+{
-+ struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
-+ struct drm_device *dev = crtc->dev;
-+ struct radeon_device *rdev = dev->dev_private;
-+ u32 ss_cntl;
-+
-+ if (ASIC_IS_DCE4(rdev)) {
-+ switch (radeon_crtc->pll_id) {
-+ case ATOM_PPLL1:
-+ ss_cntl = RREG32(EVERGREEN_P1PLL_SS_CNTL);
-+ ss_cntl &= ~EVERGREEN_PxPLL_SS_EN;
-+ WREG32(EVERGREEN_P1PLL_SS_CNTL, ss_cntl);
-+ break;
-+ case ATOM_PPLL2:
-+ ss_cntl = RREG32(EVERGREEN_P2PLL_SS_CNTL);
-+ ss_cntl &= ~EVERGREEN_PxPLL_SS_EN;
-+ WREG32(EVERGREEN_P2PLL_SS_CNTL, ss_cntl);
-+ break;
-+ case ATOM_DCPLL:
-+ case ATOM_PPLL_INVALID:
-+ return;
-+ }
-+ } else if (ASIC_IS_AVIVO(rdev)) {
-+ switch (radeon_crtc->pll_id) {
-+ case ATOM_PPLL1:
-+ ss_cntl = RREG32(AVIVO_P1PLL_INT_SS_CNTL);
-+ ss_cntl &= ~1;
-+ WREG32(AVIVO_P1PLL_INT_SS_CNTL, ss_cntl);
-+ break;
-+ case ATOM_PPLL2:
-+ ss_cntl = RREG32(AVIVO_P2PLL_INT_SS_CNTL);
-+ ss_cntl &= ~1;
-+ WREG32(AVIVO_P2PLL_INT_SS_CNTL, ss_cntl);
-+ break;
-+ case ATOM_DCPLL:
-+ case ATOM_PPLL_INVALID:
-+ return;
-+ }
-+ }
-+}
-+
-+
- union atom_enable_ss {
- ENABLE_LVDS_SS_PARAMETERS legacy;
- ENABLE_SPREAD_SPECTRUM_ON_PPLL_PS_ALLOCATION v1;
- };
-
--static void atombios_set_ss(struct drm_crtc *crtc, int enable)
-+static void atombios_enable_ss(struct drm_crtc *crtc)
- {
- struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
- struct drm_device *dev = crtc->dev;
-@@ -387,9 +430,9 @@ static void atombios_set_ss(struct drm_crtc *crtc, int enable)
- step = dig->ss->step;
- delay = dig->ss->delay;
- range = dig->ss->range;
-- } else if (enable)
-+ } else
- return;
-- } else if (enable)
-+ } else
- return;
- break;
- }
-@@ -406,13 +449,13 @@ static void atombios_set_ss(struct drm_crtc *crtc, int enable)
- args.v1.ucSpreadSpectrumDelay = delay;
- args.v1.ucSpreadSpectrumRange = range;
- args.v1.ucPpll = radeon_crtc->crtc_id ? ATOM_PPLL2 : ATOM_PPLL1;
-- args.v1.ucEnable = enable;
-+ args.v1.ucEnable = ATOM_ENABLE;
- } else {
- args.legacy.usSpreadSpectrumPercentage = cpu_to_le16(percentage);
- args.legacy.ucSpreadSpectrumType = type;
- args.legacy.ucSpreadSpectrumStepSize_Delay = (step & 3) << 2;
- args.legacy.ucSpreadSpectrumStepSize_Delay |= (delay & 7) << 4;
-- args.legacy.ucEnable = enable;
-+ args.legacy.ucEnable = ATOM_ENABLE;
- }
- atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
- }
-@@ -1086,12 +1129,12 @@ int atombios_crtc_mode_set(struct drm_crtc *crtc,
- /* pick pll */
- radeon_crtc->pll_id = radeon_atom_pick_pll(crtc);
-
-- atombios_set_ss(crtc, 0);
-+ atombios_disable_ss(crtc);
- /* always set DCPLL */
- if (ASIC_IS_DCE4(rdev))
- atombios_crtc_set_dcpll(crtc);
- atombios_crtc_set_pll(crtc, adjusted_mode);
-- atombios_set_ss(crtc, 1);
-+ atombios_enable_ss(crtc);
-
- if (ASIC_IS_DCE4(rdev))
- atombios_set_crtc_dtd_timing(crtc, adjusted_mode);
+++ /dev/null
-From 368d06f5b0eefcbf37d677d3b65381310a251f03 Mon Sep 17 00:00:00 2001
-From: John W. Linville <linville@tuxdriver.com>
-Date: Tue, 16 Mar 2010 15:40:59 -0400
-Subject: wireless: convert reg_regdb_search_lock to mutex
-
-From: John W. Linville <linville@tuxdriver.com>
-
-commit 368d06f5b0eefcbf37d677d3b65381310a251f03 upstream.
-
-Stanse discovered that kmalloc is being called with GFP_KERNEL while
-holding this spinlock. The spinlock can be a mutex instead, which also
-enables the removal of the unlock/lock around the lock/unlock of
-cfg80211_mutex and the call to set_regdom.
-
-Reported-by: Jiri Slaby <jirislaby@gmail.com>
-Signed-off-by: John W. Linville <linville@tuxdriver.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-
---- a/net/wireless/reg.c
-+++ b/net/wireless/reg.c
-@@ -324,7 +324,7 @@ struct reg_regdb_search_request {
- };
-
- static LIST_HEAD(reg_regdb_search_list);
--static DEFINE_SPINLOCK(reg_regdb_search_lock);
-+static DEFINE_MUTEX(reg_regdb_search_mutex);
-
- static void reg_regdb_search(struct work_struct *work)
- {
-@@ -332,7 +332,7 @@ static void reg_regdb_search(struct work_struct *work)
- const struct ieee80211_regdomain *curdom, *regdom;
- int i, r;
-
-- spin_lock(®_regdb_search_lock);
-+ mutex_lock(®_regdb_search_mutex);
- while (!list_empty(®_regdb_search_list)) {
- request = list_first_entry(®_regdb_search_list,
- struct reg_regdb_search_request,
-@@ -346,18 +346,16 @@ static void reg_regdb_search(struct work_struct *work)
- r = reg_copy_regd(®dom, curdom);
- if (r)
- break;
-- spin_unlock(®_regdb_search_lock);
- mutex_lock(&cfg80211_mutex);
- set_regdom(regdom);
- mutex_unlock(&cfg80211_mutex);
-- spin_lock(®_regdb_search_lock);
- break;
- }
- }
-
- kfree(request);
- }
-- spin_unlock(®_regdb_search_lock);
-+ mutex_unlock(®_regdb_search_mutex);
- }
-
- static DECLARE_WORK(reg_regdb_work, reg_regdb_search);
-@@ -375,9 +373,9 @@ static void reg_regdb_query(const char *alpha2)
-
- memcpy(request->alpha2, alpha2, 2);
-
-- spin_lock(®_regdb_search_lock);
-+ mutex_lock(®_regdb_search_mutex);
- list_add_tail(&request->list, ®_regdb_search_list);
-- spin_unlock(®_regdb_search_lock);
-+ mutex_unlock(®_regdb_search_mutex);
-
- schedule_work(®_regdb_work);
- }