* 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
This commit is contained in:
Alexander von Gluck IV
2011-09-27 20:08:46 +00:00
parent 2815c2d2c6
commit 4a0f028c4d
+20 -19
View File
@@ -285,20 +285,22 @@ lock_i2c(void* cookie, bool lock)
uint32 buffer = 0; uint32 buffer = 0;
// hw_capable and > DCE3 if (lock == true) {
if (info->hw_capable == true // hw_capable and > DCE3
&& sinfo.device_chipset >= (RADEON_R600 | 0x20)) { if (info->hw_capable == true
// Switch GPIO pads to ddc mode && sinfo.device_chipset >= (RADEON_R600 | 0x20)) {
buffer = Read32(OUT, info->mask_scl_reg); // Switch GPIO pads to ddc mode
buffer &= ~(1 << 16); buffer = Read32(OUT, info->mask_scl_reg);
Write32(OUT, info->mask_scl_reg, buffer); buffer &= ~(1 << 16);
} Write32(OUT, info->mask_scl_reg, buffer);
}
// Clear pins // Clear pins
buffer = Read32(OUT, info->a_scl_reg) & ~info->a_scl_mask; buffer = Read32(OUT, info->a_scl_reg) & ~info->a_scl_mask;
Write32(OUT, info->a_scl_reg, buffer); Write32(OUT, info->a_scl_reg, buffer);
buffer = Read32(OUT, info->a_sda_reg) & ~info->a_sda_mask; buffer = Read32(OUT, info->a_sda_reg) & ~info->a_sda_mask;
Write32(OUT, info->a_sda_reg, buffer); Write32(OUT, info->a_sda_reg, buffer);
}
// Set pins to input // Set pins to input
buffer = Read32(OUT, info->en_scl_reg) & ~info->en_scl_mask; buffer = Read32(OUT, info->en_scl_reg) & ~info->en_scl_mask;
@@ -313,7 +315,6 @@ lock_i2c(void* cookie, bool lock)
} else { } else {
buffer &= ~info->mask_scl_mask; buffer &= ~info->mask_scl_mask;
} }
Write32(OUT, info->mask_scl_reg, buffer); Write32(OUT, info->mask_scl_reg, buffer);
Read32(OUT, info->mask_scl_reg); Read32(OUT, info->mask_scl_reg);
@@ -323,7 +324,6 @@ lock_i2c(void* cookie, bool lock)
} else { } else {
buffer &= ~info->mask_sda_mask; buffer &= ~info->mask_sda_mask;
} }
Write32(OUT, info->mask_sda_reg, buffer); Write32(OUT, info->mask_sda_reg, buffer);
Read32(OUT, info->mask_sda_reg); 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) uint32 scl = Read32(OUT, info->en_scl_reg)
& ~info->en_scl_mask; & ~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) uint32 sda = Read32(OUT, info->en_sda_reg)
& ~info->en_sda_mask; & ~info->en_sda_mask;
scl |= clock ? 0 : info->en_scl_mask;
sda |= data ? 0 : info->en_sda_mask; sda |= data ? 0 : info->en_sda_mask;
Write32(OUT, info->en_scl_reg, scl);
Write32(OUT, info->en_sda_reg, sda); Write32(OUT, info->en_sda_reg, sda);
Read32(OUT, info->en_sda_reg);
return B_OK; return B_OK;
} }