mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-31 12:10:52 -04:00
ACPI and power management updates for 3.9-rc1
- Rework of the ACPI namespace scanning code from Rafael J. Wysocki with contributions from Bjorn Helgaas, Jiang Liu, Mika Westerberg, Toshi Kani, and Yinghai Lu. - ACPI power resources handling and ACPI device PM update from Rafael J. Wysocki. - ACPICA update to version 20130117 from Bob Moore and Lv Zheng with contributions from Aaron Lu, Chao Guan, Jesper Juhl, and Tim Gardner. - Support for Intel Lynxpoint LPSS from Mika Westerberg. - cpuidle update from Len Brown including Intel Haswell support, C1 state for intel_idle, removal of global pm_idle. - cpuidle fixes and cleanups from Daniel Lezcano. - cpufreq fixes and cleanups from Viresh Kumar and Fabio Baltieri with contributions from Stratos Karafotis and Rickard Andersson. - Intel P-states driver for Sandy Bridge processors from Dirk Brandewie. - cpufreq driver for Marvell Kirkwood SoCs from Andrew Lunn. - cpufreq fixes related to ordering issues between acpi-cpufreq and powernow-k8 from Borislav Petkov and Matthew Garrett. - cpufreq support for Calxeda Highbank processors from Mark Langsdorf and Rob Herring. - cpufreq driver for the Freescale i.MX6Q SoC and cpufreq-cpu0 update from Shawn Guo. - cpufreq Exynos fixes and cleanups from Jonghwan Choi, Sachin Kamat, and Inderpal Singh. - Support for "lightweight suspend" from Zhang Rui. - Removal of the deprecated power trace API from Paul Gortmaker. - Assorted updates from Andreas Fleig, Colin Ian King, Davidlohr Bueso, Joseph Salisbury, Kees Cook, Li Fei, Nishanth Menon, ShuoX Liu, Srinivas Pandruvada, Tejun Heo, Thomas Renninger, and Yasuaki Ishimatsu. / -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iQIcBAABAgAGBQJRIsArAAoJEKhOf7ml8uNsD6MP/j7C4NA+GTq6RdwoJt+Yki0K 9Ep8I4pEuRFoN/oskv24EyQhpGJIk6UxWcJ/DWFBc+1VhmKORta7k2Idv/wlJA77 s7AcDveA9xcDh+TVfbh87TeuiMSXiSdDZbiaQO+wMizWJAF3F84AnjiAqqqyQcSK bA5/Siz/vWlt9PyYDaQtHTVE4lpvPuVcQdYewsdaH2PsmUjvIg/TUzg28CTrdyvv eHOdBK9R0/OLQLhzRbL0VOGJ//wEl+HJRO0QEhTKPgdQ1e/VH/4Zu5WSzF8P/x4C s2f8U4IKQqulDuDHXtpMpelFm7hRWgsOqZLkcyXLs+0dvSM9CTPO6P0ZaImxUctk 5daHWEsXUnCErDQawt1mcZP8l6qnxofMQIfLXyPVzvlSnHyToTmrtXa1v2u4AuL/ hOo4MYWsFNUmRdtGFFGlExGgEDZ4G5NwiYjRBl/6XJ3v4nhnnMbuzxP8scpoe5m1 8tjroJHZFUUs/mFU/H+oRbHzSzXPmp1sddNaTg4OpVmTn3DDh6ljnFhiItd1Ndw0 5ldVbSe6ETq5RoK0TbzvQOeVpa9F3JfqbrXLQPqfd2iz/No41LQYG1uShRYuXKuA wfEcc+c9VMd3FILu05pGwBnU8VS9VbxTYMz7xDxg6b29Ywnb7u+Q1ycCk2gFYtkS E2oZDuyewTJxaskzYsNr =wijn -----END PGP SIGNATURE----- Merge tag 'pm+acpi-3.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm Pull ACPI and power management updates from Rafael Wysocki: - Rework of the ACPI namespace scanning code from Rafael J. Wysocki with contributions from Bjorn Helgaas, Jiang Liu, Mika Westerberg, Toshi Kani, and Yinghai Lu. - ACPI power resources handling and ACPI device PM update from Rafael J Wysocki. - ACPICA update to version 20130117 from Bob Moore and Lv Zheng with contributions from Aaron Lu, Chao Guan, Jesper Juhl, and Tim Gardner. - Support for Intel Lynxpoint LPSS from Mika Westerberg. - cpuidle update from Len Brown including Intel Haswell support, C1 state for intel_idle, removal of global pm_idle. - cpuidle fixes and cleanups from Daniel Lezcano. - cpufreq fixes and cleanups from Viresh Kumar and Fabio Baltieri with contributions from Stratos Karafotis and Rickard Andersson. - Intel P-states driver for Sandy Bridge processors from Dirk Brandewie. - cpufreq driver for Marvell Kirkwood SoCs from Andrew Lunn. - cpufreq fixes related to ordering issues between acpi-cpufreq and powernow-k8 from Borislav Petkov and Matthew Garrett. - cpufreq support for Calxeda Highbank processors from Mark Langsdorf and Rob Herring. - cpufreq driver for the Freescale i.MX6Q SoC and cpufreq-cpu0 update from Shawn Guo. - cpufreq Exynos fixes and cleanups from Jonghwan Choi, Sachin Kamat, and Inderpal Singh. - Support for "lightweight suspend" from Zhang Rui. - Removal of the deprecated power trace API from Paul Gortmaker. - Assorted updates from Andreas Fleig, Colin Ian King, Davidlohr Bueso, Joseph Salisbury, Kees Cook, Li Fei, Nishanth Menon, ShuoX Liu, Srinivas Pandruvada, Tejun Heo, Thomas Renninger, and Yasuaki Ishimatsu. * tag 'pm+acpi-3.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (267 commits) PM idle: remove global declaration of pm_idle unicore32 idle: delete stray pm_idle comment openrisc idle: delete pm_idle mn10300 idle: delete pm_idle microblaze idle: delete pm_idle m32r idle: delete pm_idle, and other dead idle code ia64 idle: delete pm_idle cris idle: delete idle and pm_idle ARM64 idle: delete pm_idle ARM idle: delete pm_idle blackfin idle: delete pm_idle sparc idle: rename pm_idle to sparc_idle sh idle: rename global pm_idle to static sh_idle x86 idle: rename global pm_idle to static x86_idle APM idle: register apm_cpu_idle via cpuidle cpufreq / intel_pstate: Add kernel command line option disable intel_pstate. cpufreq / intel_pstate: Change to disallow module build tools/power turbostat: display SMI count by default intel_idle: export both C1 and C1E ACPI / hotplug: Fix concurrency issues and memory leaks ...
This commit is contained in:
commit
8793422fd9
374 changed files with 10713 additions and 8060 deletions
|
|
@ -734,34 +734,24 @@ static unsigned char acpiphp_max_busnr(struct pci_bus *bus)
|
|||
*/
|
||||
static int acpiphp_bus_add(struct acpiphp_func *func)
|
||||
{
|
||||
acpi_handle phandle;
|
||||
struct acpi_device *device, *pdevice;
|
||||
struct acpi_device *device;
|
||||
int ret_val;
|
||||
|
||||
acpi_get_parent(func->handle, &phandle);
|
||||
if (acpi_bus_get_device(phandle, &pdevice)) {
|
||||
dbg("no parent device, assuming NULL\n");
|
||||
pdevice = NULL;
|
||||
}
|
||||
if (!acpi_bus_get_device(func->handle, &device)) {
|
||||
dbg("bus exists... trim\n");
|
||||
/* this shouldn't be in here, so remove
|
||||
* the bus then re-add it...
|
||||
*/
|
||||
ret_val = acpi_bus_trim(device, 1);
|
||||
dbg("acpi_bus_trim return %x\n", ret_val);
|
||||
acpi_bus_trim(device);
|
||||
}
|
||||
|
||||
ret_val = acpi_bus_add(&device, pdevice, func->handle,
|
||||
ACPI_BUS_TYPE_DEVICE);
|
||||
if (ret_val) {
|
||||
dbg("error adding bus, %x\n",
|
||||
-ret_val);
|
||||
goto acpiphp_bus_add_out;
|
||||
}
|
||||
ret_val = acpi_bus_start(device);
|
||||
ret_val = acpi_bus_scan(func->handle);
|
||||
if (!ret_val)
|
||||
ret_val = acpi_bus_get_device(func->handle, &device);
|
||||
|
||||
if (ret_val)
|
||||
dbg("error adding bus, %x\n", -ret_val);
|
||||
|
||||
acpiphp_bus_add_out:
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
|
|
@ -781,11 +771,8 @@ static int acpiphp_bus_trim(acpi_handle handle)
|
|||
return retval;
|
||||
}
|
||||
|
||||
retval = acpi_bus_trim(device, 1);
|
||||
if (retval)
|
||||
err("cannot remove from acpi list\n");
|
||||
|
||||
return retval;
|
||||
acpi_bus_trim(device);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void acpiphp_set_acpi_region(struct acpiphp_slot *slot)
|
||||
|
|
@ -1130,8 +1117,7 @@ static int acpiphp_configure_bridge (acpi_handle handle)
|
|||
|
||||
static void handle_bridge_insertion(acpi_handle handle, u32 type)
|
||||
{
|
||||
struct acpi_device *device, *pdevice;
|
||||
acpi_handle phandle;
|
||||
struct acpi_device *device;
|
||||
|
||||
if ((type != ACPI_NOTIFY_BUS_CHECK) &&
|
||||
(type != ACPI_NOTIFY_DEVICE_CHECK)) {
|
||||
|
|
@ -1139,17 +1125,15 @@ static void handle_bridge_insertion(acpi_handle handle, u32 type)
|
|||
return;
|
||||
}
|
||||
|
||||
acpi_get_parent(handle, &phandle);
|
||||
if (acpi_bus_get_device(phandle, &pdevice)) {
|
||||
dbg("no parent device, assuming NULL\n");
|
||||
pdevice = NULL;
|
||||
}
|
||||
if (acpi_bus_add(&device, pdevice, handle, ACPI_BUS_TYPE_DEVICE)) {
|
||||
if (acpi_bus_scan(handle)) {
|
||||
err("cannot add bridge to acpi list\n");
|
||||
return;
|
||||
}
|
||||
if (!acpiphp_configure_bridge(handle) &&
|
||||
!acpi_bus_start(device))
|
||||
if (acpi_bus_get_device(handle, &device)) {
|
||||
err("ACPI device object missing\n");
|
||||
return;
|
||||
}
|
||||
if (!acpiphp_configure_bridge(handle))
|
||||
add_bridge(handle);
|
||||
else
|
||||
err("cannot configure and start bridge\n");
|
||||
|
|
@ -1234,6 +1218,8 @@ static void _handle_hotplug_event_bridge(struct work_struct *work)
|
|||
handle = hp_work->handle;
|
||||
type = hp_work->type;
|
||||
|
||||
acpi_scan_lock_acquire();
|
||||
|
||||
if (acpi_bus_get_device(handle, &device)) {
|
||||
/* This bridge must have just been physically inserted */
|
||||
handle_bridge_insertion(handle, type);
|
||||
|
|
@ -1311,6 +1297,7 @@ static void _handle_hotplug_event_bridge(struct work_struct *work)
|
|||
}
|
||||
|
||||
out:
|
||||
acpi_scan_lock_release();
|
||||
kfree(hp_work); /* allocated in handle_hotplug_event_bridge */
|
||||
}
|
||||
|
||||
|
|
@ -1357,6 +1344,8 @@ static void _handle_hotplug_event_func(struct work_struct *work)
|
|||
|
||||
func = (struct acpiphp_func *)context;
|
||||
|
||||
acpi_scan_lock_acquire();
|
||||
|
||||
switch (type) {
|
||||
case ACPI_NOTIFY_BUS_CHECK:
|
||||
/* bus re-enumerate */
|
||||
|
|
@ -1387,6 +1376,7 @@ static void _handle_hotplug_event_func(struct work_struct *work)
|
|||
break;
|
||||
}
|
||||
|
||||
acpi_scan_lock_release();
|
||||
kfree(hp_work); /* allocated in handle_hotplug_event_func */
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -412,7 +412,6 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot)
|
|||
if (SN_ACPI_BASE_SUPPORT() && ssdt) {
|
||||
unsigned long long adr;
|
||||
struct acpi_device *pdevice;
|
||||
struct acpi_device *device;
|
||||
acpi_handle phandle;
|
||||
acpi_handle chandle = NULL;
|
||||
acpi_handle rethandle;
|
||||
|
|
@ -426,6 +425,7 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot)
|
|||
pdevice = NULL;
|
||||
}
|
||||
|
||||
acpi_scan_lock_acquire();
|
||||
/*
|
||||
* Walk the rootbus node's immediate children looking for
|
||||
* the slot's device node(s). There can be more than
|
||||
|
|
@ -448,20 +448,18 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot)
|
|||
if (ACPI_SUCCESS(ret) &&
|
||||
(adr>>16) == (slot->device_num + 1)) {
|
||||
|
||||
ret = acpi_bus_add(&device, pdevice, chandle,
|
||||
ACPI_BUS_TYPE_DEVICE);
|
||||
ret = acpi_bus_scan(chandle);
|
||||
if (ACPI_FAILURE(ret)) {
|
||||
printk(KERN_ERR "%s: acpi_bus_add "
|
||||
printk(KERN_ERR "%s: acpi_bus_scan "
|
||||
"failed (0x%x) for slot %d "
|
||||
"func %d\n", __func__,
|
||||
ret, (int)(adr>>16),
|
||||
(int)(adr&0xffff));
|
||||
/* try to continue on */
|
||||
} else {
|
||||
acpi_bus_start(device);
|
||||
}
|
||||
}
|
||||
}
|
||||
acpi_scan_lock_release();
|
||||
}
|
||||
|
||||
/* Call the driver for the new device */
|
||||
|
|
@ -512,6 +510,7 @@ static int disable_slot(struct hotplug_slot *bss_hotplug_slot)
|
|||
/* Get the rootbus node pointer */
|
||||
phandle = PCI_CONTROLLER(slot->pci_bus)->acpi_handle;
|
||||
|
||||
acpi_scan_lock_acquire();
|
||||
/*
|
||||
* Walk the rootbus node's immediate children looking for
|
||||
* the slot's device node(s). There can be more than
|
||||
|
|
@ -539,10 +538,10 @@ static int disable_slot(struct hotplug_slot *bss_hotplug_slot)
|
|||
ret = acpi_bus_get_device(chandle,
|
||||
&device);
|
||||
if (ACPI_SUCCESS(ret))
|
||||
acpi_bus_trim(device, 1);
|
||||
acpi_bus_trim(device);
|
||||
}
|
||||
}
|
||||
|
||||
acpi_scan_lock_release();
|
||||
}
|
||||
|
||||
/* Free the SN resources assigned to the Linux device.*/
|
||||
|
|
|
|||
|
|
@ -283,7 +283,6 @@ static struct pci_platform_pm_ops acpi_pci_platform_pm = {
|
|||
.is_manageable = acpi_pci_power_manageable,
|
||||
.set_state = acpi_pci_set_power_state,
|
||||
.choose_state = acpi_pci_choose_state,
|
||||
.can_wakeup = acpi_pci_can_wakeup,
|
||||
.sleep_wake = acpi_pci_sleep_wake,
|
||||
.run_wake = acpi_pci_run_wake,
|
||||
};
|
||||
|
|
@ -321,10 +320,65 @@ static int acpi_pci_find_root_bridge(struct device *dev, acpi_handle *handle)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void pci_acpi_setup(struct device *dev)
|
||||
{
|
||||
struct pci_dev *pci_dev = to_pci_dev(dev);
|
||||
acpi_handle handle = ACPI_HANDLE(dev);
|
||||
struct acpi_device *adev;
|
||||
acpi_status status;
|
||||
acpi_handle dummy;
|
||||
|
||||
/*
|
||||
* Evaluate and parse _PRT, if exists. This code allows parsing of
|
||||
* _PRT objects within the scope of non-bridge devices. Note that
|
||||
* _PRTs within the scope of a PCI bridge assume the bridge's
|
||||
* subordinate bus number.
|
||||
*
|
||||
* TBD: Can _PRTs exist within the scope of non-bridge PCI devices?
|
||||
*/
|
||||
status = acpi_get_handle(handle, METHOD_NAME__PRT, &dummy);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
unsigned char bus;
|
||||
|
||||
bus = pci_dev->subordinate ?
|
||||
pci_dev->subordinate->number : pci_dev->bus->number;
|
||||
acpi_pci_irq_add_prt(handle, pci_domain_nr(pci_dev->bus), bus);
|
||||
}
|
||||
|
||||
if (acpi_bus_get_device(handle, &adev) || !adev->wakeup.flags.valid)
|
||||
return;
|
||||
|
||||
device_set_wakeup_capable(dev, true);
|
||||
acpi_pci_sleep_wake(pci_dev, false);
|
||||
|
||||
pci_acpi_add_pm_notifier(adev, pci_dev);
|
||||
if (adev->wakeup.flags.run_wake)
|
||||
device_set_run_wake(dev, true);
|
||||
}
|
||||
|
||||
static void pci_acpi_cleanup(struct device *dev)
|
||||
{
|
||||
struct pci_dev *pci_dev = to_pci_dev(dev);
|
||||
acpi_handle handle = ACPI_HANDLE(dev);
|
||||
struct acpi_device *adev;
|
||||
|
||||
if (!acpi_bus_get_device(handle, &adev) && adev->wakeup.flags.valid) {
|
||||
device_set_wakeup_capable(dev, false);
|
||||
device_set_run_wake(dev, false);
|
||||
pci_acpi_remove_pm_notifier(adev);
|
||||
}
|
||||
|
||||
if (pci_dev->subordinate)
|
||||
acpi_pci_irq_del_prt(pci_domain_nr(pci_dev->bus),
|
||||
pci_dev->subordinate->number);
|
||||
}
|
||||
|
||||
static struct acpi_bus_type acpi_pci_bus = {
|
||||
.bus = &pci_bus_type,
|
||||
.find_device = acpi_pci_find_device,
|
||||
.find_bridge = acpi_pci_find_root_bridge,
|
||||
.setup = pci_acpi_setup,
|
||||
.cleanup = pci_acpi_cleanup,
|
||||
};
|
||||
|
||||
static int __init acpi_pci_init(void)
|
||||
|
|
|
|||
|
|
@ -450,7 +450,7 @@ static struct pci_platform_pm_ops *pci_platform_pm;
|
|||
int pci_set_platform_pm(struct pci_platform_pm_ops *ops)
|
||||
{
|
||||
if (!ops->is_manageable || !ops->set_state || !ops->choose_state
|
||||
|| !ops->sleep_wake || !ops->can_wakeup)
|
||||
|| !ops->sleep_wake)
|
||||
return -EINVAL;
|
||||
pci_platform_pm = ops;
|
||||
return 0;
|
||||
|
|
@ -473,11 +473,6 @@ static inline pci_power_t platform_pci_choose_state(struct pci_dev *dev)
|
|||
pci_platform_pm->choose_state(dev) : PCI_POWER_ERROR;
|
||||
}
|
||||
|
||||
static inline bool platform_pci_can_wakeup(struct pci_dev *dev)
|
||||
{
|
||||
return pci_platform_pm ? pci_platform_pm->can_wakeup(dev) : false;
|
||||
}
|
||||
|
||||
static inline int platform_pci_sleep_wake(struct pci_dev *dev, bool enable)
|
||||
{
|
||||
return pci_platform_pm ?
|
||||
|
|
@ -1985,25 +1980,6 @@ void pci_pm_init(struct pci_dev *dev)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* platform_pci_wakeup_init - init platform wakeup if present
|
||||
* @dev: PCI device
|
||||
*
|
||||
* Some devices don't have PCI PM caps but can still generate wakeup
|
||||
* events through platform methods (like ACPI events). If @dev supports
|
||||
* platform wakeup events, set the device flag to indicate as much. This
|
||||
* may be redundant if the device also supports PCI PM caps, but double
|
||||
* initialization should be safe in that case.
|
||||
*/
|
||||
void platform_pci_wakeup_init(struct pci_dev *dev)
|
||||
{
|
||||
if (!platform_pci_can_wakeup(dev))
|
||||
return;
|
||||
|
||||
device_set_wakeup_capable(&dev->dev, true);
|
||||
platform_pci_sleep_wake(dev, false);
|
||||
}
|
||||
|
||||
static void pci_add_saved_cap(struct pci_dev *pci_dev,
|
||||
struct pci_cap_saved_state *new_cap)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -43,9 +43,6 @@ int pci_probe_reset_function(struct pci_dev *dev);
|
|||
* platform; to be used during system-wide transitions from a
|
||||
* sleeping state to the working state and vice versa
|
||||
*
|
||||
* @can_wakeup: returns 'true' if given device is capable of waking up the
|
||||
* system from a sleeping state
|
||||
*
|
||||
* @sleep_wake: enables/disables the system wake up capability of given device
|
||||
*
|
||||
* @run_wake: enables/disables the platform to generate run-time wake-up events
|
||||
|
|
@ -59,7 +56,6 @@ struct pci_platform_pm_ops {
|
|||
bool (*is_manageable)(struct pci_dev *dev);
|
||||
int (*set_state)(struct pci_dev *dev, pci_power_t state);
|
||||
pci_power_t (*choose_state)(struct pci_dev *dev);
|
||||
bool (*can_wakeup)(struct pci_dev *dev);
|
||||
int (*sleep_wake)(struct pci_dev *dev, bool enable);
|
||||
int (*run_wake)(struct pci_dev *dev, bool enable);
|
||||
};
|
||||
|
|
@ -74,7 +70,6 @@ extern void pci_wakeup_bus(struct pci_bus *bus);
|
|||
extern void pci_config_pm_runtime_get(struct pci_dev *dev);
|
||||
extern void pci_config_pm_runtime_put(struct pci_dev *dev);
|
||||
extern void pci_pm_init(struct pci_dev *dev);
|
||||
extern void platform_pci_wakeup_init(struct pci_dev *dev);
|
||||
extern void pci_allocate_cap_save_buffers(struct pci_dev *dev);
|
||||
void pci_free_cap_save_buffers(struct pci_dev *dev);
|
||||
|
||||
|
|
|
|||
|
|
@ -1280,7 +1280,6 @@ static void pci_init_capabilities(struct pci_dev *dev)
|
|||
|
||||
/* Power Management */
|
||||
pci_pm_init(dev);
|
||||
platform_pci_wakeup_init(dev);
|
||||
|
||||
/* Vital Product Data */
|
||||
pci_vpd_pci22_init(dev);
|
||||
|
|
|
|||
Loading…
Reference in a new issue