* 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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user