mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-26 06:20:54 +07:00
Merge branch 'bjorn-cleanups' into release
This commit is contained in:
commit
e857b33d18
@ -11,9 +11,9 @@ menuconfig ACPI
|
||||
select PNP
|
||||
select CPU_IDLE
|
||||
default y
|
||||
---help---
|
||||
help
|
||||
Advanced Configuration and Power Interface (ACPI) support for
|
||||
Linux requires an ACPI compliant platform (hardware/firmware),
|
||||
Linux requires an ACPI-compliant platform (hardware/firmware),
|
||||
and assumes the presence of OS-directed configuration and power
|
||||
management (OSPM) software. This option will enlarge your
|
||||
kernel by about 70K.
|
||||
@ -23,20 +23,19 @@ menuconfig ACPI
|
||||
the Plug-and-Play BIOS specification (PnP BIOS), the
|
||||
MultiProcessor Specification (MPS), and the Advanced Power
|
||||
Management (APM) specification. If both ACPI and APM support
|
||||
are configured, whichever is loaded first shall be used.
|
||||
are configured, ACPI is used.
|
||||
|
||||
The ACPI SourceForge project contains the latest source code,
|
||||
documentation, tools, mailing list subscription, and other
|
||||
information. This project is available at:
|
||||
<http://sourceforge.net/projects/acpi>
|
||||
The project home page for the Linux ACPI subsystem is here:
|
||||
<http://www.lesswatts.org/projects/acpi/>
|
||||
|
||||
Linux support for ACPI is based on Intel Corporation's ACPI
|
||||
Component Architecture (ACPI CA). For more information see:
|
||||
<http://developer.intel.com/technology/iapc/acpi>
|
||||
Component Architecture (ACPI CA). For more information on the
|
||||
ACPI CA, see:
|
||||
<http://acpica.org/>
|
||||
|
||||
ACPI is an open industry specification co-developed by Compaq,
|
||||
Intel, Microsoft, Phoenix, and Toshiba. The specification is
|
||||
available at:
|
||||
ACPI is an open industry specification co-developed by
|
||||
Hewlett-Packard, Intel, Microsoft, Phoenix, and Toshiba.
|
||||
The specification is available at:
|
||||
<http://www.acpi.info>
|
||||
|
||||
if ACPI
|
||||
@ -49,14 +48,14 @@ config ACPI_SLEEP
|
||||
config ACPI_PROCFS
|
||||
bool "Deprecated /proc/acpi files"
|
||||
depends on PROC_FS
|
||||
---help---
|
||||
help
|
||||
For backwards compatibility, this option allows
|
||||
deprecated /proc/acpi/ files to exist, even when
|
||||
they have been replaced by functions in /sys.
|
||||
The deprecated files (and their replacements) include:
|
||||
|
||||
/proc/acpi/sleep (/sys/power/state)
|
||||
/proc/acpi/info (/sys/modules/acpi/parameters/acpica_version)
|
||||
/proc/acpi/info (/sys/module/acpi/parameters/acpica_version)
|
||||
/proc/acpi/dsdt (/sys/firmware/acpi/tables/DSDT)
|
||||
/proc/acpi/fadt (/sys/firmware/acpi/tables/FACP)
|
||||
/proc/acpi/debug_layer (/sys/module/acpi/parameters/debug_layer)
|
||||
@ -66,11 +65,12 @@ config ACPI_PROCFS
|
||||
and functions which do not yet exist in /sys.
|
||||
|
||||
Say N to delete /proc/acpi/ files that have moved to /sys/
|
||||
|
||||
config ACPI_PROCFS_POWER
|
||||
bool "Deprecated power /proc/acpi directories"
|
||||
depends on PROC_FS
|
||||
default y
|
||||
---help---
|
||||
help
|
||||
For backwards compatibility, this option allows
|
||||
deprecated power /proc/acpi/ directories to exist, even when
|
||||
they have been replaced by functions in /sys.
|
||||
@ -86,19 +86,19 @@ config ACPI_SYSFS_POWER
|
||||
bool "Future power /sys interface"
|
||||
select POWER_SUPPLY
|
||||
default y
|
||||
---help---
|
||||
help
|
||||
Say N to disable power /sys interface
|
||||
|
||||
config ACPI_PROC_EVENT
|
||||
bool "Deprecated /proc/acpi/event support"
|
||||
depends on PROC_FS
|
||||
default y
|
||||
---help---
|
||||
A user-space daemon, acpi, typically read /proc/acpi/event
|
||||
and handled all ACPI sub-system generated events.
|
||||
help
|
||||
A user-space daemon, acpid, typically reads /proc/acpi/event
|
||||
and handles all ACPI-generated events.
|
||||
|
||||
These events are now delivered to user-space via
|
||||
either the input layer, or as netlink events.
|
||||
These events are now delivered to user-space either
|
||||
via the input layer or as netlink events.
|
||||
|
||||
This build option enables the old code for legacy
|
||||
user-space implementation. After some time, this will
|
||||
@ -112,10 +112,13 @@ config ACPI_AC
|
||||
depends on X86
|
||||
default y
|
||||
help
|
||||
This driver adds support for the AC Adapter object, which indicates
|
||||
whether a system is on AC, or not. If you have a system that can
|
||||
This driver supports the AC Adapter object, which indicates
|
||||
whether a system is on AC or not. If you have a system that can
|
||||
switch between A/C and battery, say Y.
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called ac.
|
||||
|
||||
config ACPI_BATTERY
|
||||
tristate "Battery"
|
||||
depends on X86
|
||||
@ -125,15 +128,21 @@ config ACPI_BATTERY
|
||||
/proc/acpi/battery. If you have a mobile system with a battery,
|
||||
say Y.
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called battery.
|
||||
|
||||
config ACPI_BUTTON
|
||||
tristate "Button"
|
||||
depends on INPUT
|
||||
default y
|
||||
help
|
||||
This driver handles events on the power, sleep and lid buttons.
|
||||
This driver handles events on the power, sleep, and lid buttons.
|
||||
A daemon reads /proc/acpi/event and perform user-defined actions
|
||||
such as shutting down the system. This is necessary for
|
||||
software controlled poweroff.
|
||||
software-controlled poweroff.
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called button.
|
||||
|
||||
config ACPI_VIDEO
|
||||
tristate "Video"
|
||||
@ -141,38 +150,45 @@ config ACPI_VIDEO
|
||||
depends on INPUT
|
||||
select THERMAL
|
||||
help
|
||||
This driver implement the ACPI Extensions For Display Adapters
|
||||
This driver implements the ACPI Extensions For Display Adapters
|
||||
for integrated graphics devices on motherboard, as specified in
|
||||
ACPI 2.0 Specification, Appendix B, allowing to perform some basic
|
||||
control like defining the video POST device, retrieving EDID information
|
||||
or to setup a video output, etc.
|
||||
Note that this is an ref. implementation only. It may or may not work
|
||||
for your integrated video device.
|
||||
ACPI 2.0 Specification, Appendix B. This supports basic operations
|
||||
such as defining the video POST device, retrieving EDID information,
|
||||
and setting up a video output.
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called video.
|
||||
|
||||
config ACPI_FAN
|
||||
tristate "Fan"
|
||||
select THERMAL
|
||||
default y
|
||||
help
|
||||
This driver adds support for ACPI fan devices, allowing user-mode
|
||||
This driver supports ACPI fan devices, allowing user-mode
|
||||
applications to perform basic fan control (on, off, status).
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called fan.
|
||||
|
||||
config ACPI_DOCK
|
||||
bool "Dock"
|
||||
depends on EXPERIMENTAL
|
||||
help
|
||||
This driver adds support for ACPI controlled docking stations and removable
|
||||
drive bays such as the IBM ultrabay or the Dell Module Bay.
|
||||
This driver supports ACPI-controlled docking stations and removable
|
||||
drive bays such as the IBM Ultrabay and the Dell Module Bay.
|
||||
|
||||
config ACPI_PROCESSOR
|
||||
tristate "Processor"
|
||||
select THERMAL
|
||||
default y
|
||||
help
|
||||
This driver installs ACPI as the idle handler for Linux, and uses
|
||||
ACPI C2 and C3 processor states to save power, on systems that
|
||||
This driver installs ACPI as the idle handler for Linux and uses
|
||||
ACPI C2 and C3 processor states to save power on systems that
|
||||
support it. It is required by several flavors of cpufreq
|
||||
Performance-state drivers.
|
||||
performance-state drivers.
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called processor.
|
||||
|
||||
config ACPI_HOTPLUG_CPU
|
||||
bool
|
||||
@ -186,11 +202,14 @@ config ACPI_THERMAL
|
||||
select THERMAL
|
||||
default y
|
||||
help
|
||||
This driver adds support for ACPI thermal zones. Most mobile and
|
||||
This driver supports ACPI thermal zones. Most mobile and
|
||||
some desktop systems support ACPI thermal zones. It is HIGHLY
|
||||
recommended that this option be enabled, as your processor(s)
|
||||
may be damaged without it.
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called thermal.
|
||||
|
||||
config ACPI_NUMA
|
||||
bool "NUMA support"
|
||||
depends on NUMA
|
||||
@ -218,7 +237,7 @@ config ACPI_BLACKLIST_YEAR
|
||||
int "Disable ACPI for systems before Jan 1st this year" if X86_32
|
||||
default 0
|
||||
help
|
||||
enter a 4-digit year, eg. 2001 to disable ACPI by default
|
||||
Enter a 4-digit year, e.g., 2001, to disable ACPI by default
|
||||
on platforms with DMI BIOS date before January 1st that year.
|
||||
"acpi=force" can be used to override this mechanism.
|
||||
|
||||
@ -249,10 +268,13 @@ config ACPI_PCI_SLOT
|
||||
tristate "PCI slot detection driver"
|
||||
default n
|
||||
help
|
||||
This driver will attempt to discover all PCI slots in your system,
|
||||
and creates entries in /sys/bus/pci/slots/. This feature can
|
||||
help you correlate PCI bus addresses with the physical geography
|
||||
of your slots. If you are unsure, say N.
|
||||
This driver creates entries in /sys/bus/pci/slots/ for all PCI
|
||||
slots in the system. This can help correlate PCI bus addresses,
|
||||
i.e., segment/bus/device/function tuples, with physical slots in
|
||||
the system. If you are unsure, say N.
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called pci_slot.
|
||||
|
||||
config X86_PM_TIMER
|
||||
bool "Power Management Timer Support" if EMBEDDED
|
||||
@ -271,43 +293,43 @@ config X86_PM_TIMER
|
||||
systems require this timer.
|
||||
|
||||
config ACPI_CONTAINER
|
||||
tristate "ACPI0004,PNP0A05 and PNP0A06 Container Driver (EXPERIMENTAL)"
|
||||
tristate "Container and Module Devices (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
default (ACPI_HOTPLUG_MEMORY || ACPI_HOTPLUG_CPU || ACPI_HOTPLUG_IO)
|
||||
---help---
|
||||
This allows _physical_ insertion and removal of CPUs and memory.
|
||||
This can be useful, for example, on NUMA machines that support
|
||||
ACPI based physical hotplug of nodes, or non-NUMA machines that
|
||||
support physical cpu/memory hot-plug.
|
||||
help
|
||||
This driver supports ACPI Container and Module devices (IDs
|
||||
ACPI0004, PNP0A05, and PNP0A06).
|
||||
|
||||
If one selects "m", this driver can be loaded with
|
||||
"modprobe container".
|
||||
This helps support hotplug of nodes, CPUs, and memory.
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called container.
|
||||
|
||||
config ACPI_HOTPLUG_MEMORY
|
||||
tristate "Memory Hotplug"
|
||||
depends on MEMORY_HOTPLUG
|
||||
default n
|
||||
help
|
||||
This driver adds supports for ACPI Memory Hotplug. This driver
|
||||
provides support for fielding notifications on ACPI memory
|
||||
devices (PNP0C80) which represent memory ranges that may be
|
||||
onlined or offlined during runtime.
|
||||
This driver supports ACPI memory hotplug. The driver
|
||||
fields notifications on ACPI memory devices (PNP0C80),
|
||||
which represent memory ranges that may be onlined or
|
||||
offlined during runtime.
|
||||
|
||||
Enabling this driver assumes that your platform hardware
|
||||
and firmware have support for hot-plugging physical memory. If
|
||||
your system does not support physically adding or ripping out
|
||||
memory DIMMs at some platform defined granularity (individually
|
||||
or as a bank) at runtime, then you need not enable this driver.
|
||||
If your hardware and firmware do not support adding or
|
||||
removing memory devices at runtime, you need not enable
|
||||
this driver.
|
||||
|
||||
If one selects "m," this driver can be loaded using the following
|
||||
command:
|
||||
$>modprobe acpi_memhotplug
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called acpi_memhotplug.
|
||||
|
||||
config ACPI_SBS
|
||||
tristate "Smart Battery System"
|
||||
depends on X86
|
||||
help
|
||||
This driver adds support for the Smart Battery System, another
|
||||
This driver supports the Smart Battery System, another
|
||||
type of access to battery information, found on some laptops.
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the modules will be called sbs and sbshc.
|
||||
|
||||
endif # ACPI
|
||||
|
@ -319,7 +319,7 @@ static struct acpi_prt_entry *acpi_pci_irq_lookup(struct pci_dev *dev, int pin)
|
||||
*/
|
||||
bridge = dev->bus->self;
|
||||
while (bridge) {
|
||||
pin = (((pin - 1) + PCI_SLOT(dev->devfn)) % 4) + 1;
|
||||
pin = pci_swizzle_interrupt_pin(dev, pin);
|
||||
|
||||
if ((bridge->class >> 8) == PCI_CLASS_BRIDGE_CARDBUS) {
|
||||
/* PC card has the same IRQ as its cardbridge */
|
||||
|
@ -43,13 +43,14 @@
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
|
||||
#define _COMPONENT ACPI_PCI_COMPONENT
|
||||
#define _COMPONENT ACPI_PCI_COMPONENT
|
||||
ACPI_MODULE_NAME("pci_link");
|
||||
#define ACPI_PCI_LINK_CLASS "pci_irq_routing"
|
||||
#define ACPI_PCI_LINK_DEVICE_NAME "PCI Interrupt Link"
|
||||
#define ACPI_PCI_LINK_FILE_INFO "info"
|
||||
#define ACPI_PCI_LINK_FILE_STATUS "state"
|
||||
#define ACPI_PCI_LINK_MAX_POSSIBLE 16
|
||||
#define ACPI_PCI_LINK_MAX_POSSIBLE 16
|
||||
|
||||
static int acpi_pci_link_add(struct acpi_device *device);
|
||||
static int acpi_pci_link_remove(struct acpi_device *device, int type);
|
||||
|
||||
@ -66,7 +67,7 @@ static struct acpi_driver acpi_pci_link_driver = {
|
||||
.ops = {
|
||||
.add = acpi_pci_link_add,
|
||||
.remove = acpi_pci_link_remove,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
@ -76,7 +77,7 @@ static struct acpi_driver acpi_pci_link_driver = {
|
||||
struct acpi_pci_link_irq {
|
||||
u8 active; /* Current IRQ */
|
||||
u8 triggering; /* All IRQs */
|
||||
u8 polarity; /* All IRQs */
|
||||
u8 polarity; /* All IRQs */
|
||||
u8 resource_type;
|
||||
u8 possible_count;
|
||||
u8 possible[ACPI_PCI_LINK_MAX_POSSIBLE];
|
||||
@ -85,16 +86,13 @@ struct acpi_pci_link_irq {
|
||||
};
|
||||
|
||||
struct acpi_pci_link {
|
||||
struct list_head node;
|
||||
struct acpi_device *device;
|
||||
struct acpi_pci_link_irq irq;
|
||||
int refcnt;
|
||||
struct list_head list;
|
||||
struct acpi_device *device;
|
||||
struct acpi_pci_link_irq irq;
|
||||
int refcnt;
|
||||
};
|
||||
|
||||
static struct {
|
||||
int count;
|
||||
struct list_head entries;
|
||||
} acpi_link;
|
||||
static LIST_HEAD(acpi_link_list);
|
||||
static DEFINE_MUTEX(acpi_link_lock);
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
@ -104,12 +102,11 @@ static DEFINE_MUTEX(acpi_link_lock);
|
||||
/*
|
||||
* set context (link) possible list from resource list
|
||||
*/
|
||||
static acpi_status
|
||||
acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)
|
||||
static acpi_status acpi_pci_link_check_possible(struct acpi_resource *resource,
|
||||
void *context)
|
||||
{
|
||||
struct acpi_pci_link *link = context;
|
||||
u32 i = 0;
|
||||
|
||||
u32 i;
|
||||
|
||||
switch (resource->type) {
|
||||
case ACPI_RESOURCE_TYPE_START_DEPENDENT:
|
||||
@ -179,10 +176,6 @@ static int acpi_pci_link_get_possible(struct acpi_pci_link *link)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
|
||||
if (!link)
|
||||
return -EINVAL;
|
||||
|
||||
status = acpi_walk_resources(link->device->handle, METHOD_NAME__PRS,
|
||||
acpi_pci_link_check_possible, link);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
@ -197,11 +190,10 @@ static int acpi_pci_link_get_possible(struct acpi_pci_link *link)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static acpi_status
|
||||
acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
|
||||
static acpi_status acpi_pci_link_check_current(struct acpi_resource *resource,
|
||||
void *context)
|
||||
{
|
||||
int *irq = (int *)context;
|
||||
|
||||
int *irq = context;
|
||||
|
||||
switch (resource->type) {
|
||||
case ACPI_RESOURCE_TYPE_START_DEPENDENT:
|
||||
@ -258,12 +250,9 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
|
||||
static int acpi_pci_link_get_current(struct acpi_pci_link *link)
|
||||
{
|
||||
int result = 0;
|
||||
acpi_status status = AE_OK;
|
||||
acpi_status status;
|
||||
int irq = 0;
|
||||
|
||||
if (!link)
|
||||
return -EINVAL;
|
||||
|
||||
link->irq.active = 0;
|
||||
|
||||
/* in practice, status disabled is meaningless, ignore it */
|
||||
@ -308,16 +297,15 @@ static int acpi_pci_link_get_current(struct acpi_pci_link *link)
|
||||
|
||||
static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
|
||||
{
|
||||
int result = 0;
|
||||
acpi_status status = AE_OK;
|
||||
int result;
|
||||
acpi_status status;
|
||||
struct {
|
||||
struct acpi_resource res;
|
||||
struct acpi_resource end;
|
||||
} *resource;
|
||||
struct acpi_buffer buffer = { 0, NULL };
|
||||
|
||||
|
||||
if (!link || !irq)
|
||||
if (!irq)
|
||||
return -EINVAL;
|
||||
|
||||
resource = kzalloc(sizeof(*resource) + 1, irqs_disabled() ? GFP_ATOMIC: GFP_KERNEL);
|
||||
@ -479,30 +467,22 @@ static int acpi_irq_penalty[ACPI_MAX_IRQS] = {
|
||||
PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ9 PCI, often acpi */
|
||||
PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ10 PCI */
|
||||
PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ11 PCI */
|
||||
PIRQ_PENALTY_ISA_USED, /* IRQ12 mouse */
|
||||
PIRQ_PENALTY_ISA_USED, /* IRQ13 fpe, sometimes */
|
||||
PIRQ_PENALTY_ISA_USED, /* IRQ14 ide0 */
|
||||
PIRQ_PENALTY_ISA_USED, /* IRQ15 ide1 */
|
||||
PIRQ_PENALTY_ISA_USED, /* IRQ12 mouse */
|
||||
PIRQ_PENALTY_ISA_USED, /* IRQ13 fpe, sometimes */
|
||||
PIRQ_PENALTY_ISA_USED, /* IRQ14 ide0 */
|
||||
PIRQ_PENALTY_ISA_USED, /* IRQ15 ide1 */
|
||||
/* >IRQ15 */
|
||||
};
|
||||
|
||||
int __init acpi_irq_penalty_init(void)
|
||||
{
|
||||
struct list_head *node = NULL;
|
||||
struct acpi_pci_link *link = NULL;
|
||||
int i = 0;
|
||||
|
||||
struct acpi_pci_link *link;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* Update penalties to facilitate IRQ balancing.
|
||||
*/
|
||||
list_for_each(node, &acpi_link.entries) {
|
||||
|
||||
link = list_entry(node, struct acpi_pci_link, node);
|
||||
if (!link) {
|
||||
printk(KERN_ERR PREFIX "Invalid link context\n");
|
||||
continue;
|
||||
}
|
||||
list_for_each_entry(link, &acpi_link_list, list) {
|
||||
|
||||
/*
|
||||
* reflect the possible and active irqs in the penalty table --
|
||||
@ -527,7 +507,6 @@ int __init acpi_irq_penalty_init(void)
|
||||
}
|
||||
/* Add a penalty for the SCI */
|
||||
acpi_irq_penalty[acpi_gbl_FADT.sci_interrupt] += PIRQ_PENALTY_PCI_USING;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -538,7 +517,6 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
|
||||
int irq;
|
||||
int i;
|
||||
|
||||
|
||||
if (link->irq.initialized) {
|
||||
if (link->refcnt == 0)
|
||||
/* This means the link is disabled but initialized */
|
||||
@ -566,11 +544,10 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
|
||||
/*
|
||||
* if active found, use it; else pick entry from end of possible list.
|
||||
*/
|
||||
if (link->irq.active) {
|
||||
if (link->irq.active)
|
||||
irq = link->irq.active;
|
||||
} else {
|
||||
else
|
||||
irq = link->irq.possible[link->irq.possible_count - 1];
|
||||
}
|
||||
|
||||
if (acpi_irq_balance || !link->irq.active) {
|
||||
/*
|
||||
@ -599,7 +576,6 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
|
||||
}
|
||||
|
||||
link->irq.initialized = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -608,16 +584,12 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
|
||||
* success: return IRQ >= 0
|
||||
* failure: return -1
|
||||
*/
|
||||
|
||||
int
|
||||
acpi_pci_link_allocate_irq(acpi_handle handle,
|
||||
int index,
|
||||
int *triggering, int *polarity, char **name)
|
||||
int acpi_pci_link_allocate_irq(acpi_handle handle, int index, int *triggering,
|
||||
int *polarity, char **name)
|
||||
{
|
||||
int result = 0;
|
||||
struct acpi_device *device = NULL;
|
||||
struct acpi_pci_link *link = NULL;
|
||||
|
||||
int result;
|
||||
struct acpi_device *device;
|
||||
struct acpi_pci_link *link;
|
||||
|
||||
result = acpi_bus_get_device(handle, &device);
|
||||
if (result) {
|
||||
@ -669,11 +641,10 @@ acpi_pci_link_allocate_irq(acpi_handle handle,
|
||||
*/
|
||||
int acpi_pci_link_free_irq(acpi_handle handle)
|
||||
{
|
||||
struct acpi_device *device = NULL;
|
||||
struct acpi_pci_link *link = NULL;
|
||||
struct acpi_device *device;
|
||||
struct acpi_pci_link *link;
|
||||
acpi_status result;
|
||||
|
||||
|
||||
result = acpi_bus_get_device(handle, &device);
|
||||
if (result) {
|
||||
printk(KERN_ERR PREFIX "Invalid link device\n");
|
||||
@ -708,9 +679,9 @@ int acpi_pci_link_free_irq(acpi_handle handle)
|
||||
"Link %s is dereferenced\n",
|
||||
acpi_device_bid(link->device)));
|
||||
|
||||
if (link->refcnt == 0) {
|
||||
if (link->refcnt == 0)
|
||||
acpi_evaluate_object(link->device->handle, "_DIS", NULL, NULL);
|
||||
}
|
||||
|
||||
mutex_unlock(&acpi_link_lock);
|
||||
return (link->irq.active);
|
||||
}
|
||||
@ -721,15 +692,11 @@ int acpi_pci_link_free_irq(acpi_handle handle)
|
||||
|
||||
static int acpi_pci_link_add(struct acpi_device *device)
|
||||
{
|
||||
int result = 0;
|
||||
struct acpi_pci_link *link = NULL;
|
||||
int i = 0;
|
||||
int result;
|
||||
struct acpi_pci_link *link;
|
||||
int i;
|
||||
int found = 0;
|
||||
|
||||
|
||||
if (!device)
|
||||
return -EINVAL;
|
||||
|
||||
link = kzalloc(sizeof(struct acpi_pci_link), GFP_KERNEL);
|
||||
if (!link)
|
||||
return -ENOMEM;
|
||||
@ -767,9 +734,7 @@ static int acpi_pci_link_add(struct acpi_device *device)
|
||||
|
||||
printk("\n");
|
||||
|
||||
/* TBD: Acquire/release lock */
|
||||
list_add_tail(&link->node, &acpi_link.entries);
|
||||
acpi_link.count++;
|
||||
list_add_tail(&link->list, &acpi_link_list);
|
||||
|
||||
end:
|
||||
/* disable all links -- to be activated on use */
|
||||
@ -784,24 +749,17 @@ static int acpi_pci_link_add(struct acpi_device *device)
|
||||
|
||||
static int acpi_pci_link_resume(struct acpi_pci_link *link)
|
||||
{
|
||||
|
||||
if (link->refcnt && link->irq.active && link->irq.initialized)
|
||||
return (acpi_pci_link_set(link, link->irq.active));
|
||||
else
|
||||
return 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int irqrouter_resume(struct sys_device *dev)
|
||||
{
|
||||
struct list_head *node = NULL;
|
||||
struct acpi_pci_link *link = NULL;
|
||||
struct acpi_pci_link *link;
|
||||
|
||||
list_for_each(node, &acpi_link.entries) {
|
||||
link = list_entry(node, struct acpi_pci_link, node);
|
||||
if (!link) {
|
||||
printk(KERN_ERR PREFIX "Invalid link context\n");
|
||||
continue;
|
||||
}
|
||||
list_for_each_entry(link, &acpi_link_list, list) {
|
||||
acpi_pci_link_resume(link);
|
||||
}
|
||||
return 0;
|
||||
@ -809,20 +767,15 @@ static int irqrouter_resume(struct sys_device *dev)
|
||||
|
||||
static int acpi_pci_link_remove(struct acpi_device *device, int type)
|
||||
{
|
||||
struct acpi_pci_link *link = NULL;
|
||||
|
||||
|
||||
if (!device || !acpi_driver_data(device))
|
||||
return -EINVAL;
|
||||
struct acpi_pci_link *link;
|
||||
|
||||
link = acpi_driver_data(device);
|
||||
|
||||
mutex_lock(&acpi_link_lock);
|
||||
list_del(&link->node);
|
||||
list_del(&link->list);
|
||||
mutex_unlock(&acpi_link_lock);
|
||||
|
||||
kfree(link);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -931,7 +884,6 @@ static int __init irqrouter_init_sysfs(void)
|
||||
{
|
||||
int error;
|
||||
|
||||
|
||||
if (acpi_disabled || acpi_noirq)
|
||||
return 0;
|
||||
|
||||
@ -957,9 +909,6 @@ static int __init acpi_pci_link_init(void)
|
||||
acpi_irq_balance = 0;
|
||||
}
|
||||
|
||||
acpi_link.count = 0;
|
||||
INIT_LIST_HEAD(&acpi_link.entries);
|
||||
|
||||
if (acpi_bus_register_driver(&acpi_pci_link_driver) < 0)
|
||||
return -ENODEV;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user