From 4a0f028c4dd88fa01600e5f6b8c4788db559bf96 Mon Sep 17 00:00:00 2001 From: Alexander von Gluck IV Date: Tue, 27 Sep 2011 20:08:46 +0000 Subject: [PATCH] * perform some i2c cleanup from xorg ati driver * read gpio pins back after setting them to improve reliability git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42772 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/accelerants/radeon_hd/gpu.cpp | 39 ++++++++++++----------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/add-ons/accelerants/radeon_hd/gpu.cpp b/src/add-ons/accelerants/radeon_hd/gpu.cpp index 6db876c5cd..242431f5c2 100644 --- a/src/add-ons/accelerants/radeon_hd/gpu.cpp +++ b/src/add-ons/accelerants/radeon_hd/gpu.cpp @@ -285,20 +285,22 @@ lock_i2c(void* cookie, bool lock) uint32 buffer = 0; - // hw_capable and > DCE3 - if (info->hw_capable == true - && sinfo.device_chipset >= (RADEON_R600 | 0x20)) { - // Switch GPIO pads to ddc mode - buffer = Read32(OUT, info->mask_scl_reg); - buffer &= ~(1 << 16); - Write32(OUT, info->mask_scl_reg, buffer); - } + if (lock == true) { + // hw_capable and > DCE3 + if (info->hw_capable == true + && sinfo.device_chipset >= (RADEON_R600 | 0x20)) { + // Switch GPIO pads to ddc mode + buffer = Read32(OUT, info->mask_scl_reg); + buffer &= ~(1 << 16); + Write32(OUT, info->mask_scl_reg, buffer); + } - // Clear pins - buffer = Read32(OUT, info->a_scl_reg) & ~info->a_scl_mask; - Write32(OUT, info->a_scl_reg, buffer); - buffer = Read32(OUT, info->a_sda_reg) & ~info->a_sda_mask; - Write32(OUT, info->a_sda_reg, buffer); + // Clear pins + buffer = Read32(OUT, info->a_scl_reg) & ~info->a_scl_mask; + Write32(OUT, info->a_scl_reg, buffer); + buffer = Read32(OUT, info->a_sda_reg) & ~info->a_sda_mask; + Write32(OUT, info->a_sda_reg, buffer); + } // Set pins to input buffer = Read32(OUT, info->en_scl_reg) & ~info->en_scl_mask; @@ -313,7 +315,6 @@ lock_i2c(void* cookie, bool lock) } else { buffer &= ~info->mask_scl_mask; } - Write32(OUT, info->mask_scl_reg, buffer); Read32(OUT, info->mask_scl_reg); @@ -323,7 +324,6 @@ lock_i2c(void* cookie, bool lock) } else { buffer &= ~info->mask_sda_mask; } - Write32(OUT, info->mask_sda_reg, buffer); Read32(OUT, info->mask_sda_reg); } @@ -353,14 +353,15 @@ set_i2c_signals(void* cookie, int clock, int data) uint32 scl = Read32(OUT, info->en_scl_reg) & ~info->en_scl_mask; + scl |= clock ? 0 : info->en_scl_mask; + Write32(OUT, info->en_scl_reg, scl); + Read32(OUT, info->en_scl_reg); + uint32 sda = Read32(OUT, info->en_sda_reg) & ~info->en_sda_mask; - - scl |= clock ? 0 : info->en_scl_mask; sda |= data ? 0 : info->en_sda_mask; - - Write32(OUT, info->en_scl_reg, scl); Write32(OUT, info->en_sda_reg, sda); + Read32(OUT, info->en_sda_reg); return B_OK; }