aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorEugeni Dodonov <eugeni.dodonov@intel.com>2012-05-09 14:37:10 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-05-19 16:39:43 -0400
commita416edefbbaf942b588595ad6fa63ac700f5d73c (patch)
tree12becbc853c7725d0fee3dbe2212e269e10226ed /drivers
parent7d4e146f7509b872fbcfbbbb39476eb9afaf2ba2 (diff)
drm/i915: add support for SBI ops
With Lynx Point, we need to use SBI to communicate with the display clock control. This commit adds helper functions to access the registers via SBI. v2: de-inline the function and address changes in bits names v3: protect operations with dpio_lock, increase timeout to 100 for paranoia sake. v4: decrease paranoia a bit, as noticed by Chris Wilson Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com> Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: Eugeni Dodonov <eugeni.dodonov@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 42b9e20782b0..45b93a096191 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -1299,6 +1299,69 @@ static void intel_disable_pll(struct drm_i915_private *dev_priv, enum pipe pipe)
1299 POSTING_READ(reg); 1299 POSTING_READ(reg);
1300} 1300}
1301 1301
1302/* SBI access */
1303static void
1304intel_sbi_write(struct drm_i915_private *dev_priv, u16 reg, u32 value)
1305{
1306 unsigned long flags;
1307
1308 spin_lock_irqsave(&dev_priv->dpio_lock, flags);
1309 if (wait_for((I915_READ(SBI_CTL_STAT) & SBI_READY) == 0,
1310 100)) {
1311 DRM_ERROR("timeout waiting for SBI to become ready\n");
1312 goto out_unlock;
1313 }
1314
1315 I915_WRITE(SBI_ADDR,
1316 (reg << 16));
1317 I915_WRITE(SBI_DATA,
1318 value);
1319 I915_WRITE(SBI_CTL_STAT,
1320 SBI_BUSY |
1321 SBI_CTL_OP_CRWR);
1322
1323 if (wait_for((I915_READ(SBI_CTL_STAT) & (SBI_READY | SBI_RESPONSE_SUCCESS)) == 0,
1324 100)) {
1325 DRM_ERROR("timeout waiting for SBI to complete write transaction\n");
1326 goto out_unlock;
1327 }
1328
1329out_unlock:
1330 spin_unlock_irqrestore(&dev_priv->dpio_lock, flags);
1331}
1332
1333static u32
1334intel_sbi_read(struct drm_i915_private *dev_priv, u16 reg)
1335{
1336 unsigned long flags;
1337 u32 value;
1338
1339 spin_lock_irqsave(&dev_priv->dpio_lock, flags);
1340 if (wait_for((I915_READ(SBI_CTL_STAT) & SBI_READY) == 0,
1341 100)) {
1342 DRM_ERROR("timeout waiting for SBI to become ready\n");
1343 goto out_unlock;
1344 }
1345
1346 I915_WRITE(SBI_ADDR,
1347 (reg << 16));
1348 I915_WRITE(SBI_CTL_STAT,
1349 SBI_BUSY |
1350 SBI_CTL_OP_CRRD);
1351
1352 if (wait_for((I915_READ(SBI_CTL_STAT) & (SBI_READY | SBI_RESPONSE_SUCCESS)) == 0,
1353 100)) {
1354 DRM_ERROR("timeout waiting for SBI to complete read transaction\n");
1355 goto out_unlock;
1356 }
1357
1358 value = I915_READ(SBI_DATA);
1359
1360out_unlock:
1361 spin_unlock_irqrestore(&dev_priv->dpio_lock, flags);
1362 return value;
1363}
1364
1302/** 1365/**
1303 * intel_enable_pch_pll - enable PCH PLL 1366 * intel_enable_pch_pll - enable PCH PLL
1304 * @dev_priv: i915 private structure 1367 * @dev_priv: i915 private structure