Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e857b33d authored by Len Brown's avatar Len Brown
Browse files

Merge branch 'bjorn-cleanups' into release

parents 9a38f4ee 1c48aa36
Loading
Loading
Loading
Loading
+86 −64
Original line number Original line Diff line number Diff line
@@ -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
+1 −1
Original line number Original line Diff line number Diff line
@@ -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 */
+48 −99
Original line number Original line Diff line number Diff line
@@ -50,6 +50,7 @@ ACPI_MODULE_NAME("pci_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);


@@ -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);
@@ -488,21 +476,13 @@ static int acpi_irq_penalty[ACPI_MAX_IRQS] = {


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;