Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
e857b33d
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
e857b33d
编写于
4月 05, 2009
作者:
L
Len Brown
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'bjorn-cleanups' into release
上级
9a38f4ee
1c48aa36
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
135 addition
and
164 deletion
+135
-164
drivers/acpi/Kconfig
drivers/acpi/Kconfig
+86
-64
drivers/acpi/pci_irq.c
drivers/acpi/pci_irq.c
+1
-1
drivers/acpi/pci_link.c
drivers/acpi/pci_link.c
+48
-99
未找到文件。
drivers/acpi/Kconfig
浏览文件 @
e857b33d
...
@@ -11,9 +11,9 @@ menuconfig ACPI
...
@@ -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
...
@@ -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
...
@@ -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/module
s
/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
...
@@ -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
...
@@ -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, acpi
d, typically reads
/proc/acpi/event
and handle
d all ACPI sub-system
generated events.
and handle
s 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
...
@@ -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
...
@@ -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
...
@@ -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 implement
s
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
...
@@ -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
...
@@ -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
...
@@ -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
...
@@ -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
o
nlined or offlined during runtime.
o
fflined 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
drivers/acpi/pci_irq.c
浏览文件 @
e857b33d
...
@@ -319,7 +319,7 @@ static struct acpi_prt_entry *acpi_pci_irq_lookup(struct pci_dev *dev, int pin)
...
@@ -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 */
...
...
drivers/acpi/pci_link.c
浏览文件 @
e857b33d
...
@@ -50,6 +50,7 @@ ACPI_MODULE_NAME("pci_link");
...
@@ -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 {
...
@@ -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);
...
@@ -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)
...
@@ -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)
...
@@ -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)
...
@@ -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)
...
@@ -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] = {
...
@@ -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)
...
@@ -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)
...
@@ -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)
...
@@ -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)
...
@@ -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)
...
@@ -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,
...
@@ -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)
...
@@ -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)
...
@@ -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)
...
@@ -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)
...
@@ -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)
...
@@ -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)
...
@@ -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)
...
@@ -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
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录