Merge branch 'acpi-scan' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm into pci/yinghai-survey-resources+acpi-scan
* 'acpi-scan' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: ACPI / scan: Treat power resources in a special way ACPI: Remove unused struct acpi_pci_root.id member ACPI: Drop ACPI device .bind() and .unbind() callbacks ACPI / PCI: Move the _PRT setup and cleanup code to pci-acpi.c ACPI / PCI: Rework the setup and cleanup of device wakeup ACPI: Add .setup() and .cleanup() callbacks to struct acpi_bus_type ACPI: Make acpi_bus_scan() and acpi_bus_add() take only one argument ACPI: Replace ACPI device add_type field with a match_driver flag ACPI: Drop the second argument of acpi_bus_scan() ACPI: Remove the arguments of acpi_bus_add() that are not used ACPI: Remove acpi_start_single_object() and acpi_bus_start() ACPI / PCI: Fold acpi_pci_root_start() into acpi_pci_root_add() ACPI: Change the ordering of acpi_bus_check_add() ACPI: Replace struct acpi_bus_ops with enum type ACPI: Reduce the usage of struct acpi_bus_ops ACPI: Make acpi_bus_add() and acpi_bus_start() visibly different ACPI: Change the ordering of PCI root bridge driver registrarion ACPI: Separate adding ACPI device objects from probing ACPI drivers Conflicts: drivers/acpi/pci_root.c
This commit is contained in:
@@ -734,15 +734,9 @@ 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
|
||||
@@ -752,16 +746,13 @@ static int acpiphp_bus_add(struct acpiphp_func *func)
|
||||
dbg("acpi_bus_trim return %x\n", ret_val);
|
||||
}
|
||||
|
||||
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_add(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;
|
||||
}
|
||||
|
||||
@@ -1130,8 +1121,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 +1129,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_add(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");
|
||||
|
@@ -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;
|
||||
@@ -448,8 +447,7 @@ 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_add(chandle);
|
||||
if (ACPI_FAILURE(ret)) {
|
||||
printk(KERN_ERR "%s: acpi_bus_add "
|
||||
"failed (0x%x) for slot %d "
|
||||
@@ -457,8 +455,6 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot)
|
||||
ret, (int)(adr>>16),
|
||||
(int)(adr&0xffff));
|
||||
/* try to continue on */
|
||||
} else {
|
||||
acpi_bus_start(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,67 @@ 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);
|
||||
}
|
||||
|
||||
acpi_power_resource_register_device(dev, handle);
|
||||
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);
|
||||
}
|
||||
acpi_power_resource_unregister_device(dev, handle);
|
||||
|
||||
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);
|
||||
|
Fai riferimento in un nuovo problema
Block a user