Merge branch 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6
* 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6: (72 commits) Revert "x86/PCI: ACPI based PCI gap calculation" PCI: remove unnecessary volatile in PCIe hotplug struct controller x86/PCI: ACPI based PCI gap calculation PCI: include linux/pm_wakeup.h for device_set_wakeup_capable PCI PM: Fix pci_prepare_to_sleep x86/PCI: Fix PCI config space for domains > 0 Fix acpi_pm_device_sleep_wake() by providing a stub for CONFIG_PM_SLEEP=n PCI: Simplify PCI device PM code PCI PM: Introduce pci_prepare_to_sleep and pci_back_from_sleep PCI ACPI: Rework PCI handling of wake-up ACPI: Introduce new device wakeup flag 'prepared' ACPI: Introduce acpi_device_sleep_wake function PCI: rework pci_set_power_state function to call platform first PCI: Introduce platform_pci_power_manageable function ACPI: Introduce acpi_bus_power_manageable function PCI: make pci_name use dev_name PCI: handle pci_name() being const PCI: add stub for pci_set_consistent_dma_mask() PCI: remove unused arch pcibios_update_resource() functions PCI: fix pci_setup_device()'s sprinting into a const buffer ... Fixed up conflicts in various files (arch/x86/kernel/setup_64.c, arch/x86/pci/irq.c, arch/x86/pci/pci.h, drivers/acpi/sleep/main.c, drivers/pci/pci.c, drivers/pci/pci.h, include/acpi/acpi_bus.h) from x86 and ACPI updates manually.
This commit is contained in:
@ -179,6 +179,17 @@ static void platform_restore_cleanup(int platform_mode)
|
||||
hibernation_ops->restore_cleanup();
|
||||
}
|
||||
|
||||
/**
|
||||
* platform_recover - recover the platform from a failure to suspend
|
||||
* devices.
|
||||
*/
|
||||
|
||||
static void platform_recover(int platform_mode)
|
||||
{
|
||||
if (platform_mode && hibernation_ops && hibernation_ops->recover)
|
||||
hibernation_ops->recover();
|
||||
}
|
||||
|
||||
/**
|
||||
* create_image - freeze devices that need to be frozen with interrupts
|
||||
* off, create the hibernation image and thaw those devices. Control
|
||||
@ -193,6 +204,7 @@ static int create_image(int platform_mode)
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
device_pm_lock();
|
||||
local_irq_disable();
|
||||
/* At this point, device_suspend() has been called, but *not*
|
||||
* device_power_down(). We *must* call device_power_down() now.
|
||||
@ -224,9 +236,11 @@ static int create_image(int platform_mode)
|
||||
/* NOTE: device_power_up() is just a resume() for devices
|
||||
* that suspended with irqs off ... no overall powerup.
|
||||
*/
|
||||
device_power_up();
|
||||
device_power_up(in_suspend ?
|
||||
(error ? PMSG_RECOVER : PMSG_THAW) : PMSG_RESTORE);
|
||||
Enable_irqs:
|
||||
local_irq_enable();
|
||||
device_pm_unlock();
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -255,10 +269,10 @@ int hibernation_snapshot(int platform_mode)
|
||||
suspend_console();
|
||||
error = device_suspend(PMSG_FREEZE);
|
||||
if (error)
|
||||
goto Resume_console;
|
||||
goto Recover_platform;
|
||||
|
||||
if (hibernation_test(TEST_DEVICES))
|
||||
goto Resume_devices;
|
||||
goto Recover_platform;
|
||||
|
||||
error = platform_pre_snapshot(platform_mode);
|
||||
if (error || hibernation_test(TEST_PLATFORM))
|
||||
@ -280,12 +294,16 @@ int hibernation_snapshot(int platform_mode)
|
||||
Finish:
|
||||
platform_finish(platform_mode);
|
||||
Resume_devices:
|
||||
device_resume();
|
||||
Resume_console:
|
||||
device_resume(in_suspend ?
|
||||
(error ? PMSG_RECOVER : PMSG_THAW) : PMSG_RESTORE);
|
||||
resume_console();
|
||||
Close:
|
||||
platform_end(platform_mode);
|
||||
return error;
|
||||
|
||||
Recover_platform:
|
||||
platform_recover(platform_mode);
|
||||
goto Resume_devices;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -300,8 +318,9 @@ static int resume_target_kernel(void)
|
||||
{
|
||||
int error;
|
||||
|
||||
device_pm_lock();
|
||||
local_irq_disable();
|
||||
error = device_power_down(PMSG_PRETHAW);
|
||||
error = device_power_down(PMSG_QUIESCE);
|
||||
if (error) {
|
||||
printk(KERN_ERR "PM: Some devices failed to power down, "
|
||||
"aborting resume\n");
|
||||
@ -329,9 +348,10 @@ static int resume_target_kernel(void)
|
||||
swsusp_free();
|
||||
restore_processor_state();
|
||||
touch_softlockup_watchdog();
|
||||
device_power_up();
|
||||
device_power_up(PMSG_RECOVER);
|
||||
Enable_irqs:
|
||||
local_irq_enable();
|
||||
device_pm_unlock();
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -350,7 +370,7 @@ int hibernation_restore(int platform_mode)
|
||||
|
||||
pm_prepare_console();
|
||||
suspend_console();
|
||||
error = device_suspend(PMSG_PRETHAW);
|
||||
error = device_suspend(PMSG_QUIESCE);
|
||||
if (error)
|
||||
goto Finish;
|
||||
|
||||
@ -362,7 +382,7 @@ int hibernation_restore(int platform_mode)
|
||||
enable_nonboot_cpus();
|
||||
}
|
||||
platform_restore_cleanup(platform_mode);
|
||||
device_resume();
|
||||
device_resume(PMSG_RECOVER);
|
||||
Finish:
|
||||
resume_console();
|
||||
pm_restore_console();
|
||||
@ -392,8 +412,11 @@ int hibernation_platform_enter(void)
|
||||
|
||||
suspend_console();
|
||||
error = device_suspend(PMSG_HIBERNATE);
|
||||
if (error)
|
||||
goto Resume_console;
|
||||
if (error) {
|
||||
if (hibernation_ops->recover)
|
||||
hibernation_ops->recover();
|
||||
goto Resume_devices;
|
||||
}
|
||||
|
||||
error = hibernation_ops->prepare();
|
||||
if (error)
|
||||
@ -403,6 +426,7 @@ int hibernation_platform_enter(void)
|
||||
if (error)
|
||||
goto Finish;
|
||||
|
||||
device_pm_lock();
|
||||
local_irq_disable();
|
||||
error = device_power_down(PMSG_HIBERNATE);
|
||||
if (!error) {
|
||||
@ -411,6 +435,7 @@ int hibernation_platform_enter(void)
|
||||
while (1);
|
||||
}
|
||||
local_irq_enable();
|
||||
device_pm_unlock();
|
||||
|
||||
/*
|
||||
* We don't need to reenable the nonboot CPUs or resume consoles, since
|
||||
@ -419,8 +444,7 @@ int hibernation_platform_enter(void)
|
||||
Finish:
|
||||
hibernation_ops->finish();
|
||||
Resume_devices:
|
||||
device_resume();
|
||||
Resume_console:
|
||||
device_resume(PMSG_RESTORE);
|
||||
resume_console();
|
||||
Close:
|
||||
hibernation_ops->end();
|
||||
|
@ -228,6 +228,7 @@ static int suspend_enter(suspend_state_t state)
|
||||
{
|
||||
int error = 0;
|
||||
|
||||
device_pm_lock();
|
||||
arch_suspend_disable_irqs();
|
||||
BUG_ON(!irqs_disabled());
|
||||
|
||||
@ -239,10 +240,11 @@ static int suspend_enter(suspend_state_t state)
|
||||
if (!suspend_test(TEST_CORE))
|
||||
error = suspend_ops->enter(state);
|
||||
|
||||
device_power_up();
|
||||
device_power_up(PMSG_RESUME);
|
||||
Done:
|
||||
arch_suspend_enable_irqs();
|
||||
BUG_ON(irqs_disabled());
|
||||
device_pm_unlock();
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -267,11 +269,11 @@ int suspend_devices_and_enter(suspend_state_t state)
|
||||
error = device_suspend(PMSG_SUSPEND);
|
||||
if (error) {
|
||||
printk(KERN_ERR "PM: Some devices failed to suspend\n");
|
||||
goto Resume_console;
|
||||
goto Recover_platform;
|
||||
}
|
||||
|
||||
if (suspend_test(TEST_DEVICES))
|
||||
goto Resume_devices;
|
||||
goto Recover_platform;
|
||||
|
||||
if (suspend_ops->prepare) {
|
||||
error = suspend_ops->prepare();
|
||||
@ -291,13 +293,17 @@ int suspend_devices_and_enter(suspend_state_t state)
|
||||
if (suspend_ops->finish)
|
||||
suspend_ops->finish();
|
||||
Resume_devices:
|
||||
device_resume();
|
||||
Resume_console:
|
||||
device_resume(PMSG_RESUME);
|
||||
resume_console();
|
||||
Close:
|
||||
if (suspend_ops->end)
|
||||
suspend_ops->end();
|
||||
return error;
|
||||
|
||||
Recover_platform:
|
||||
if (suspend_ops->recover)
|
||||
suspend_ops->recover();
|
||||
goto Resume_devices;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user