Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 815ab0fd authored by Len Brown's avatar Len Brown
Browse files

ACPI: suspend: restore BM_RLD on resume

In 2.6.29,
31878dd8
"ACPI: remove BM_RLD access from idle entry path"
moved BM_RLD initialization to init-time from run time.

But we discovered that some BIOS do not restore BM_RLD
after suspend, causing device errors on C3 and C4
after resume.  So now the kernel restores BM_RLD.

http://bugzilla.kernel.org/show_bug.cgi?id=13032



Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 413f81eb
Loading
Loading
Loading
Loading
+23 −0
Original line number Original line Diff line number Diff line
@@ -202,15 +202,38 @@ static void acpi_state_timer_broadcast(struct acpi_processor *pr,
 * Suspend / resume control
 * Suspend / resume control
 */
 */
static int acpi_idle_suspend;
static int acpi_idle_suspend;
static u32 saved_bm_rld;

static void acpi_idle_bm_rld_save(void)
{
	acpi_read_bit_register(ACPI_BITREG_BUS_MASTER_RLD, &saved_bm_rld);
}
static void acpi_idle_bm_rld_restore(void)
{
	u32 resumed_bm_rld;

	acpi_read_bit_register(ACPI_BITREG_BUS_MASTER_RLD, &resumed_bm_rld);

	if (resumed_bm_rld != saved_bm_rld)
		acpi_write_bit_register(ACPI_BITREG_BUS_MASTER_RLD, saved_bm_rld);
}


int acpi_processor_suspend(struct acpi_device * device, pm_message_t state)
int acpi_processor_suspend(struct acpi_device * device, pm_message_t state)
{
{
	if (acpi_idle_suspend == 1)
		return 0;

	acpi_idle_bm_rld_save();
	acpi_idle_suspend = 1;
	acpi_idle_suspend = 1;
	return 0;
	return 0;
}
}


int acpi_processor_resume(struct acpi_device * device)
int acpi_processor_resume(struct acpi_device * device)
{
{
	if (acpi_idle_suspend == 0)
		return 0;

	acpi_idle_bm_rld_restore();
	acpi_idle_suspend = 0;
	acpi_idle_suspend = 0;
	return 0;
	return 0;
}
}