Attempt at panel control for SandyBridge, still disabled though as it doesn't
work yet. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42856 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
cf1d1fb4ff
commit
16cc59778b
|
@ -247,6 +247,10 @@ struct intel_free_graphics_memory {
|
||||||
#define PCH_DISPLAY_A_PLL_DIVISOR_1 0xc6044 // INTEL_DISPLAY_A_PLL_DIVISOR_1
|
#define PCH_DISPLAY_A_PLL_DIVISOR_1 0xc6044 // INTEL_DISPLAY_A_PLL_DIVISOR_1
|
||||||
#define PCH_DISPLAY_B_PLL_DIVISOR_0 0xc6048 // INTEL_DISPLAY_B_PLL_DIVISOR_0
|
#define PCH_DISPLAY_B_PLL_DIVISOR_0 0xc6048 // INTEL_DISPLAY_B_PLL_DIVISOR_0
|
||||||
#define PCH_DISPLAY_B_PLL_DIVISOR_1 0xc604c // INTEL_DISPLAY_B_PLL_DIVISOR_1
|
#define PCH_DISPLAY_B_PLL_DIVISOR_1 0xc604c // INTEL_DISPLAY_B_PLL_DIVISOR_1
|
||||||
|
#define PCH_PANEL_CONTROL 0xc7200 // INTEL_PANEL_CONTROL
|
||||||
|
#define PCH_PANEL_STATUS 0xc7204 // INTEL_PANEL_STATUS
|
||||||
|
|
||||||
|
#define PANEL_REGISTER_UNLOCK (0xabcd << 16)
|
||||||
|
|
||||||
// South Display Engine (SDE) Transcoder and Port Controls
|
// South Display Engine (SDE) Transcoder and Port Controls
|
||||||
#define PCH_DISPLAY_A_ANALOG_PORT 0xe1100 // INTEL_DISPLAY_A_ANALOG_PORT
|
#define PCH_DISPLAY_A_ANALOG_PORT 0xe1100 // INTEL_DISPLAY_A_ANALOG_PORT
|
||||||
|
|
|
@ -74,26 +74,30 @@ enable_display_pipe(bool enable)
|
||||||
static void
|
static void
|
||||||
enable_lvds_panel(bool enable)
|
enable_lvds_panel(bool enable)
|
||||||
{
|
{
|
||||||
uint32 control = read32(INTEL_PANEL_CONTROL);
|
bool isSNB = gInfo->shared_info->device_type.InGroup(INTEL_TYPE_SNB);
|
||||||
|
int controlRegister = isSNB ? PCH_PANEL_CONTROL : INTEL_PANEL_CONTROL;
|
||||||
|
int statusRegister = isSNB ? PCH_PANEL_STATUS : INTEL_PANEL_STATUS;
|
||||||
|
|
||||||
|
uint32 control = read32(controlRegister);
|
||||||
uint32 panelStatus;
|
uint32 panelStatus;
|
||||||
|
|
||||||
if (enable) {
|
if (enable) {
|
||||||
if ((control & PANEL_CONTROL_POWER_TARGET_ON) == 0) {
|
if ((control & PANEL_CONTROL_POWER_TARGET_ON) == 0) {
|
||||||
write32(INTEL_PANEL_CONTROL, control
|
write32(controlRegister, control | PANEL_CONTROL_POWER_TARGET_ON
|
||||||
| PANEL_CONTROL_POWER_TARGET_ON);
|
| (isSNB ? PANEL_REGISTER_UNLOCK : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
panelStatus = read32(INTEL_PANEL_STATUS);
|
panelStatus = read32(statusRegister);
|
||||||
} while ((panelStatus & PANEL_STATUS_POWER_ON) == 0);
|
} while ((panelStatus & PANEL_STATUS_POWER_ON) == 0);
|
||||||
} else {
|
} else {
|
||||||
if ((control & PANEL_CONTROL_POWER_TARGET_ON) != 0) {
|
if ((control & PANEL_CONTROL_POWER_TARGET_ON) != 0) {
|
||||||
write32(INTEL_PANEL_CONTROL, control
|
write32(controlRegister, (control & ~PANEL_CONTROL_POWER_TARGET_ON)
|
||||||
& ~PANEL_CONTROL_POWER_TARGET_ON);
|
| (isSNB ? PANEL_REGISTER_UNLOCK : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
panelStatus = read32(INTEL_PANEL_STATUS);
|
panelStatus = read32(statusRegister);
|
||||||
} while ((panelStatus & PANEL_STATUS_POWER_ON) != 0);
|
} while ((panelStatus & PANEL_STATUS_POWER_ON) != 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue