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