Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
b9eb179f
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看板
提交
b9eb179f
编写于
7月 23, 2013
作者:
R
Rafael J. Wysocki
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'acpi-cleanup'
Subsequent commits depend on the 'acpi-cleanup' material.
上级
c70d6505
2efbca4d
变更
17
隐藏空白更改
内联
并排
Showing
17 changed file
with
328 addition
and
577 deletion
+328
-577
drivers/acpi/battery.c
drivers/acpi/battery.c
+5
-14
drivers/acpi/bus.c
drivers/acpi/bus.c
+1
-21
drivers/acpi/dock.c
drivers/acpi/dock.c
+123
-273
drivers/acpi/ec.c
drivers/acpi/ec.c
+1
-3
drivers/acpi/power.c
drivers/acpi/power.c
+1
-3
drivers/acpi/processor_perflib.c
drivers/acpi/processor_perflib.c
+7
-15
drivers/acpi/resource.c
drivers/acpi/resource.c
+1
-3
drivers/acpi/scan.c
drivers/acpi/scan.c
+63
-126
drivers/acpi/sleep.c
drivers/acpi/sleep.c
+2
-5
drivers/acpi/thermal.c
drivers/acpi/thermal.c
+4
-14
drivers/acpi/utils.c
drivers/acpi/utils.c
+70
-0
drivers/acpi/video.c
drivers/acpi/video.c
+17
-39
drivers/acpi/video_detect.c
drivers/acpi/video_detect.c
+8
-11
drivers/pci/hotplug/acpiphp.h
drivers/pci/hotplug/acpiphp.h
+0
-1
drivers/pci/hotplug/acpiphp_glue.c
drivers/pci/hotplug/acpiphp_glue.c
+12
-36
include/acpi/acpi_bus.h
include/acpi/acpi_bus.h
+10
-2
include/acpi/acpi_drivers.h
include/acpi/acpi_drivers.h
+3
-11
未找到文件。
drivers/acpi/battery.c
浏览文件 @
b9eb179f
...
...
@@ -525,18 +525,14 @@ static int acpi_battery_get_state(struct acpi_battery *battery)
static
int
acpi_battery_set_alarm
(
struct
acpi_battery
*
battery
)
{
acpi_status
status
=
0
;
union
acpi_object
arg0
=
{
.
type
=
ACPI_TYPE_INTEGER
};
struct
acpi_object_list
arg_list
=
{
1
,
&
arg0
};
if
(
!
acpi_battery_present
(
battery
)
||
!
test_bit
(
ACPI_BATTERY_ALARM_PRESENT
,
&
battery
->
flags
))
return
-
ENODEV
;
arg0
.
integer
.
value
=
battery
->
alarm
;
mutex_lock
(
&
battery
->
lock
);
status
=
acpi_e
valuate_object
(
battery
->
device
->
handle
,
"_BTP"
,
&
arg_list
,
NULL
);
status
=
acpi_e
xecute_simple_method
(
battery
->
device
->
handle
,
"_BTP"
,
battery
->
alarm
);
mutex_unlock
(
&
battery
->
lock
);
if
(
ACPI_FAILURE
(
status
))
...
...
@@ -548,12 +544,8 @@ static int acpi_battery_set_alarm(struct acpi_battery *battery)
static
int
acpi_battery_init_alarm
(
struct
acpi_battery
*
battery
)
{
acpi_status
status
=
AE_OK
;
acpi_handle
handle
=
NULL
;
/* See if alarms are supported, and if so, set default */
status
=
acpi_get_handle
(
battery
->
device
->
handle
,
"_BTP"
,
&
handle
);
if
(
ACPI_FAILURE
(
status
))
{
if
(
!
acpi_has_method
(
battery
->
device
->
handle
,
"_BTP"
))
{
clear_bit
(
ACPI_BATTERY_ALARM_PRESENT
,
&
battery
->
flags
);
return
0
;
}
...
...
@@ -1066,7 +1058,7 @@ static int acpi_battery_add(struct acpi_device *device)
{
int
result
=
0
;
struct
acpi_battery
*
battery
=
NULL
;
acpi_handle
handle
;
if
(
!
device
)
return
-
EINVAL
;
battery
=
kzalloc
(
sizeof
(
struct
acpi_battery
),
GFP_KERNEL
);
...
...
@@ -1078,8 +1070,7 @@ static int acpi_battery_add(struct acpi_device *device)
device
->
driver_data
=
battery
;
mutex_init
(
&
battery
->
lock
);
mutex_init
(
&
battery
->
sysfs_lock
);
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
battery
->
device
->
handle
,
"_BIX"
,
&
handle
)))
if
(
acpi_has_method
(
battery
->
device
->
handle
,
"_BIX"
))
set_bit
(
ACPI_BATTERY_XINFO_PRESENT
,
&
battery
->
flags
);
result
=
acpi_battery_update
(
battery
);
if
(
result
)
...
...
drivers/acpi/bus.c
浏览文件 @
b9eb179f
...
...
@@ -499,19 +499,6 @@ static void acpi_bus_check_scope(acpi_handle handle)
*/
}
static
BLOCKING_NOTIFIER_HEAD
(
acpi_bus_notify_list
);
int
register_acpi_bus_notifier
(
struct
notifier_block
*
nb
)
{
return
blocking_notifier_chain_register
(
&
acpi_bus_notify_list
,
nb
);
}
EXPORT_SYMBOL_GPL
(
register_acpi_bus_notifier
);
void
unregister_acpi_bus_notifier
(
struct
notifier_block
*
nb
)
{
blocking_notifier_chain_unregister
(
&
acpi_bus_notify_list
,
nb
);
}
EXPORT_SYMBOL_GPL
(
unregister_acpi_bus_notifier
);
/**
* acpi_bus_notify
* ---------------
...
...
@@ -525,9 +512,6 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Notification %#02x to handle %p
\n
"
,
type
,
handle
));
blocking_notifier_call_chain
(
&
acpi_bus_notify_list
,
type
,
(
void
*
)
handle
);
switch
(
type
)
{
case
ACPI_NOTIFY_BUS_CHECK
:
...
...
@@ -593,8 +577,6 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
static
int
__init
acpi_bus_init_irq
(
void
)
{
acpi_status
status
;
union
acpi_object
arg
=
{
ACPI_TYPE_INTEGER
};
struct
acpi_object_list
arg_list
=
{
1
,
&
arg
};
char
*
message
=
NULL
;
...
...
@@ -623,9 +605,7 @@ static int __init acpi_bus_init_irq(void)
printk
(
KERN_INFO
PREFIX
"Using %s for interrupt routing
\n
"
,
message
);
arg
.
integer
.
value
=
acpi_irq_model
;
status
=
acpi_evaluate_object
(
NULL
,
"
\\
_PIC"
,
&
arg_list
,
NULL
);
status
=
acpi_execute_simple_method
(
NULL
,
"
\\
_PIC"
,
acpi_irq_model
);
if
(
ACPI_FAILURE
(
status
)
&&
(
status
!=
AE_NOT_FOUND
))
{
ACPI_EXCEPTION
((
AE_INFO
,
status
,
"Evaluating _PIC"
));
return
-
ENODEV
;
...
...
drivers/acpi/dock.c
浏览文件 @
b9eb179f
...
...
@@ -51,8 +51,6 @@ MODULE_PARM_DESC(immediate_undock, "1 (default) will cause the driver to "
" the driver to wait for userspace to write the undock sysfs file "
" before undocking"
);
static
struct
atomic_notifier_head
dock_notifier_list
;
static
const
struct
acpi_device_id
dock_device_ids
[]
=
{
{
"LNXDOCK"
,
0
},
{
""
,
0
},
...
...
@@ -63,8 +61,6 @@ struct dock_station {
acpi_handle
handle
;
unsigned
long
last_dock_time
;
u32
flags
;
spinlock_t
dd_lock
;
struct
mutex
hp_lock
;
struct
list_head
dependent_devices
;
struct
list_head
sibling
;
...
...
@@ -91,6 +87,12 @@ struct dock_dependent_device {
#define DOCK_EVENT 3
#define UNDOCK_EVENT 2
enum
dock_callback_type
{
DOCK_CALL_HANDLER
,
DOCK_CALL_FIXUP
,
DOCK_CALL_UEVENT
,
};
/*****************************************************************************
* Dock Dependent device functions *
*****************************************************************************/
...
...
@@ -101,7 +103,7 @@ struct dock_dependent_device {
*
* Add the dependent device to the dock's dependent device list.
*/
static
int
static
int
__init
add_dock_dependent_device
(
struct
dock_station
*
ds
,
acpi_handle
handle
)
{
struct
dock_dependent_device
*
dd
;
...
...
@@ -112,14 +114,21 @@ add_dock_dependent_device(struct dock_station *ds, acpi_handle handle)
dd
->
handle
=
handle
;
INIT_LIST_HEAD
(
&
dd
->
list
);
spin_lock
(
&
ds
->
dd_lock
);
list_add_tail
(
&
dd
->
list
,
&
ds
->
dependent_devices
);
spin_unlock
(
&
ds
->
dd_lock
);
return
0
;
}
static
void
remove_dock_dependent_devices
(
struct
dock_station
*
ds
)
{
struct
dock_dependent_device
*
dd
,
*
aux
;
list_for_each_entry_safe
(
dd
,
aux
,
&
ds
->
dependent_devices
,
list
)
{
list_del
(
&
dd
->
list
);
kfree
(
dd
);
}
}
/**
* dock_init_hotplug - Initialize a hotplug device on a docking station.
* @dd: Dock-dependent device.
...
...
@@ -135,19 +144,16 @@ static int dock_init_hotplug(struct dock_dependent_device *dd,
int
ret
=
0
;
mutex_lock
(
&
hotplug_lock
);
if
(
dd
->
hp_context
)
{
if
(
WARN_ON
(
dd
->
hp_context
))
{
ret
=
-
EEXIST
;
}
else
{
dd
->
hp_refcount
=
1
;
dd
->
hp_ops
=
ops
;
dd
->
hp_context
=
context
;
dd
->
hp_release
=
release
;
if
(
init
)
init
(
context
);
}
if
(
!
WARN_ON
(
ret
)
&&
init
)
init
(
context
);
mutex_unlock
(
&
hotplug_lock
);
return
ret
;
}
...
...
@@ -162,27 +168,22 @@ static int dock_init_hotplug(struct dock_dependent_device *dd,
*/
static
void
dock_release_hotplug
(
struct
dock_dependent_device
*
dd
)
{
void
(
*
release
)(
void
*
)
=
NULL
;
void
*
context
=
NULL
;
mutex_lock
(
&
hotplug_lock
);
if
(
dd
->
hp_context
&&
!--
dd
->
hp_refcount
)
{
void
(
*
release
)(
void
*
)
=
dd
->
hp_release
;
void
*
context
=
dd
->
hp_context
;
dd
->
hp_ops
=
NULL
;
context
=
dd
->
hp_context
;
dd
->
hp_context
=
NULL
;
release
=
dd
->
hp_release
;
dd
->
hp_release
=
NULL
;
if
(
release
)
release
(
context
);
}
if
(
release
&&
context
)
release
(
context
);
mutex_unlock
(
&
hotplug_lock
);
}
static
void
dock_hotplug_event
(
struct
dock_dependent_device
*
dd
,
u32
event
,
bool
uevent
)
enum
dock_callback_type
cb_type
)
{
acpi_notify_handler
cb
=
NULL
;
bool
run
=
false
;
...
...
@@ -192,8 +193,18 @@ static void dock_hotplug_event(struct dock_dependent_device *dd, u32 event,
if
(
dd
->
hp_context
)
{
run
=
true
;
dd
->
hp_refcount
++
;
if
(
dd
->
hp_ops
)
cb
=
uevent
?
dd
->
hp_ops
->
uevent
:
dd
->
hp_ops
->
handler
;
if
(
dd
->
hp_ops
)
{
switch
(
cb_type
)
{
case
DOCK_CALL_FIXUP
:
cb
=
dd
->
hp_ops
->
fixup
;
break
;
case
DOCK_CALL_UEVENT
:
cb
=
dd
->
hp_ops
->
uevent
;
break
;
default:
cb
=
dd
->
hp_ops
->
handler
;
}
}
}
mutex_unlock
(
&
hotplug_lock
);
...
...
@@ -220,63 +231,17 @@ find_dock_dependent_device(struct dock_station *ds, acpi_handle handle)
{
struct
dock_dependent_device
*
dd
;
spin_lock
(
&
ds
->
dd_lock
);
list_for_each_entry
(
dd
,
&
ds
->
dependent_devices
,
list
)
{
if
(
handle
==
dd
->
handle
)
{
spin_unlock
(
&
ds
->
dd_lock
);
list_for_each_entry
(
dd
,
&
ds
->
dependent_devices
,
list
)
if
(
handle
==
dd
->
handle
)
return
dd
;
}
}
spin_unlock
(
&
ds
->
dd_lock
);
return
NULL
;
}
/*****************************************************************************
* Dock functions *
*****************************************************************************/
/**
* is_dock - see if a device is a dock station
* @handle: acpi handle of the device
*
* If an acpi object has a _DCK method, then it is by definition a dock
* station, so return true.
*/
static
int
is_dock
(
acpi_handle
handle
)
{
acpi_status
status
;
acpi_handle
tmp
;
status
=
acpi_get_handle
(
handle
,
"_DCK"
,
&
tmp
);
if
(
ACPI_FAILURE
(
status
))
return
0
;
return
1
;
}
static
int
is_ejectable
(
acpi_handle
handle
)
{
acpi_status
status
;
acpi_handle
tmp
;
status
=
acpi_get_handle
(
handle
,
"_EJ0"
,
&
tmp
);
if
(
ACPI_FAILURE
(
status
))
return
0
;
return
1
;
}
static
int
is_ata
(
acpi_handle
handle
)
{
acpi_handle
tmp
;
if
((
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_GTF"
,
&
tmp
)))
||
(
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_GTM"
,
&
tmp
)))
||
(
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_STM"
,
&
tmp
)))
||
(
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_SDD"
,
&
tmp
))))
return
1
;
return
0
;
}
static
int
is_battery
(
acpi_handle
handle
)
static
int
__init
is_battery
(
acpi_handle
handle
)
{
struct
acpi_device_info
*
info
;
int
ret
=
1
;
...
...
@@ -292,17 +257,13 @@ static int is_battery(acpi_handle handle)
return
ret
;
}
static
int
is_ejectable_bay
(
acpi_handle
handle
)
/* Check whether ACPI object is an ejectable battery or disk bay */
static
bool
__init
is_ejectable_bay
(
acpi_handle
handle
)
{
acpi_handle
phandle
;
if
(
acpi_has_method
(
handle
,
"_EJ0"
)
&&
is_battery
(
handle
))
return
true
;
if
(
!
is_ejectable
(
handle
))
return
0
;
if
(
is_battery
(
handle
)
||
is_ata
(
handle
))
return
1
;
if
(
!
acpi_get_parent
(
handle
,
&
phandle
)
&&
is_ata
(
phandle
))
return
1
;
return
0
;
return
acpi_bay_match
(
handle
);
}
/**
...
...
@@ -320,7 +281,7 @@ int is_dock_device(acpi_handle handle)
if
(
!
dock_station_count
)
return
0
;
if
(
is_dock
(
handle
))
if
(
acpi_dock_match
(
handle
))
return
1
;
list_for_each_entry
(
dock_station
,
&
dock_stations
,
sibling
)
...
...
@@ -359,10 +320,8 @@ static int dock_present(struct dock_station *ds)
* handle if one does not exist already. This should cause
* acpi to scan for drivers for the given devices, and call
* matching driver's add routine.
*
* Returns a pointer to the acpi_device corresponding to the handle.
*/
static
struct
acpi_device
*
dock_create_acpi_device
(
acpi_handle
handle
)
static
void
dock_create_acpi_device
(
acpi_handle
handle
)
{
struct
acpi_device
*
device
;
int
ret
;
...
...
@@ -375,10 +334,7 @@ static struct acpi_device * dock_create_acpi_device(acpi_handle handle)
ret
=
acpi_bus_scan
(
handle
);
if
(
ret
)
pr_debug
(
"error adding bus, %x
\n
"
,
-
ret
);
acpi_bus_get_device
(
handle
,
&
device
);
}
return
device
;
}
/**
...
...
@@ -397,9 +353,29 @@ static void dock_remove_acpi_device(acpi_handle handle)
}
/**
* hotplug_dock_devices - insert or remove devices on the dock station
* hot_remove_dock_devices - Remove dock station devices.
* @ds: Dock station.
*/
static
void
hot_remove_dock_devices
(
struct
dock_station
*
ds
)
{
struct
dock_dependent_device
*
dd
;
/*
* Walk the list in reverse order so that devices that have been added
* last are removed first (in case there are some indirect dependencies
* between them).
*/
list_for_each_entry_reverse
(
dd
,
&
ds
->
dependent_devices
,
list
)
dock_hotplug_event
(
dd
,
ACPI_NOTIFY_EJECT_REQUEST
,
false
);
list_for_each_entry_reverse
(
dd
,
&
ds
->
dependent_devices
,
list
)
dock_remove_acpi_device
(
dd
->
handle
);
}
/**
* hotplug_dock_devices - Insert devices on a dock station.
* @ds: the dock station
* @event: either bus check or
eject
request
* @event: either bus check or
device check
request
*
* Some devices on the dock station need to have drivers called
* to perform hotplug operations after a dock event has occurred.
...
...
@@ -410,27 +386,21 @@ static void hotplug_dock_devices(struct dock_station *ds, u32 event)
{
struct
dock_dependent_device
*
dd
;
mutex_lock
(
&
ds
->
hp_lock
);
/* Call driver specific post-dock fixups. */
list_for_each_entry
(
dd
,
&
ds
->
dependent_devices
,
list
)
dock_hotplug_event
(
dd
,
event
,
DOCK_CALL_FIXUP
);
/*
* First call driver specific hotplug functions
*/
/* Call driver specific hotplug functions. */
list_for_each_entry
(
dd
,
&
ds
->
dependent_devices
,
list
)
dock_hotplug_event
(
dd
,
event
,
false
);
dock_hotplug_event
(
dd
,
event
,
DOCK_CALL_HANDLER
);
/*
* Now make sure that an acpi_device is created for each
* dependent device, or removed if this is an eject request.
* This will cause acpi_drivers to be stopped/started if they
* exist
* Now make sure that an acpi_device is created for each dependent
* device. That will cause scan handlers to be attached to device
* objects or acpi_drivers to be stopped/started if they are present.
*/
list_for_each_entry
(
dd
,
&
ds
->
dependent_devices
,
list
)
{
if
(
event
==
ACPI_NOTIFY_EJECT_REQUEST
)
dock_remove_acpi_device
(
dd
->
handle
);
else
dock_create_acpi_device
(
dd
->
handle
);
}
mutex_unlock
(
&
ds
->
hp_lock
);
list_for_each_entry
(
dd
,
&
ds
->
dependent_devices
,
list
)
dock_create_acpi_device
(
dd
->
handle
);
}
static
void
dock_event
(
struct
dock_station
*
ds
,
u32
event
,
int
num
)
...
...
@@ -453,43 +423,12 @@ static void dock_event(struct dock_station *ds, u32 event, int num)
kobject_uevent_env
(
&
dev
->
kobj
,
KOBJ_CHANGE
,
envp
);
list_for_each_entry
(
dd
,
&
ds
->
dependent_devices
,
list
)
dock_hotplug_event
(
dd
,
event
,
true
);
dock_hotplug_event
(
dd
,
event
,
DOCK_CALL_UEVENT
);
if
(
num
!=
DOCK_EVENT
)
kobject_uevent_env
(
&
dev
->
kobj
,
KOBJ_CHANGE
,
envp
);
}
/**
* eject_dock - respond to a dock eject request
* @ds: the dock station
*
* This is called after _DCK is called, to execute the dock station's
* _EJ0 method.
*/
static
void
eject_dock
(
struct
dock_station
*
ds
)
{
struct
acpi_object_list
arg_list
;
union
acpi_object
arg
;
acpi_status
status
;
acpi_handle
tmp
;
/* all dock devices should have _EJ0, but check anyway */
status
=
acpi_get_handle
(
ds
->
handle
,
"_EJ0"
,
&
tmp
);
if
(
ACPI_FAILURE
(
status
))
{
pr_debug
(
"No _EJ0 support for dock device
\n
"
);
return
;
}
arg_list
.
count
=
1
;
arg_list
.
pointer
=
&
arg
;
arg
.
type
=
ACPI_TYPE_INTEGER
;
arg
.
integer
.
value
=
1
;
status
=
acpi_evaluate_object
(
ds
->
handle
,
"_EJ0"
,
&
arg_list
,
NULL
);
if
(
ACPI_FAILURE
(
status
))
pr_debug
(
"Failed to evaluate _EJ0!
\n
"
);
}
/**
* handle_dock - handle a dock event
* @ds: the dock station
...
...
@@ -550,27 +489,6 @@ static inline void complete_undock(struct dock_station *ds)
ds
->
flags
&=
~
(
DOCK_UNDOCKING
);
}
static
void
dock_lock
(
struct
dock_station
*
ds
,
int
lock
)
{
struct
acpi_object_list
arg_list
;
union
acpi_object
arg
;
acpi_status
status
;
arg_list
.
count
=
1
;
arg_list
.
pointer
=
&
arg
;
arg
.
type
=
ACPI_TYPE_INTEGER
;
arg
.
integer
.
value
=
!!
lock
;
status
=
acpi_evaluate_object
(
ds
->
handle
,
"_LCK"
,
&
arg_list
,
NULL
);
if
(
ACPI_FAILURE
(
status
)
&&
status
!=
AE_NOT_FOUND
)
{
if
(
lock
)
acpi_handle_warn
(
ds
->
handle
,
"Locking device failed (0x%x)
\n
"
,
status
);
else
acpi_handle_warn
(
ds
->
handle
,
"Unlocking device failed (0x%x)
\n
"
,
status
);
}
}
/**
* dock_in_progress - see if we are in the middle of handling a dock event
* @ds: the dock station
...
...
@@ -587,37 +505,6 @@ static int dock_in_progress(struct dock_station *ds)
return
0
;
}
/**
* register_dock_notifier - add yourself to the dock notifier list
* @nb: the callers notifier block
*
* If a driver wishes to be notified about dock events, they can
* use this function to put a notifier block on the dock notifier list.
* this notifier call chain will be called after a dock event, but
* before hotplugging any new devices.
*/
int
register_dock_notifier
(
struct
notifier_block
*
nb
)
{
if
(
!
dock_station_count
)
return
-
ENODEV
;
return
atomic_notifier_chain_register
(
&
dock_notifier_list
,
nb
);
}
EXPORT_SYMBOL_GPL
(
register_dock_notifier
);
/**
* unregister_dock_notifier - remove yourself from the dock notifier list
* @nb: the callers notifier block
*/
void
unregister_dock_notifier
(
struct
notifier_block
*
nb
)
{
if
(
!
dock_station_count
)
return
;
atomic_notifier_chain_unregister
(
&
dock_notifier_list
,
nb
);
}
EXPORT_SYMBOL_GPL
(
unregister_dock_notifier
);
/**
* register_hotplug_dock_device - register a hotplug function
* @handle: the handle of the device
...
...
@@ -703,10 +590,10 @@ static int handle_eject_request(struct dock_station *ds, u32 event)
*/
dock_event
(
ds
,
event
,
UNDOCK_EVENT
);
hot
plug_dock_devices
(
ds
,
ACPI_NOTIFY_EJECT_REQUEST
);
hot
_remove_dock_devices
(
ds
);
undock
(
ds
);
dock_lock
(
ds
,
0
);
eject_dock
(
ds
);
acpi_evaluate_lck
(
ds
->
handle
,
0
);
acpi_evaluate_ej0
(
ds
->
handle
);
if
(
dock_present
(
ds
))
{
acpi_handle_err
(
ds
->
handle
,
"Unable to undock!
\n
"
);
return
-
EBUSY
;
...
...
@@ -717,18 +604,17 @@ static int handle_eject_request(struct dock_station *ds, u32 event)
/**
* dock_notify - act upon an acpi dock notification
* @
handle: the dock station handle
* @
ds: dock station
* @event: the acpi event
* @data: our driver data struct
*
* If we are notified to dock, then check to see if the dock is
* present and then dock. Notify all drivers of the dock event,
* and then hotplug and devices that may need hotplugging.
*/
static
void
dock_notify
(
acpi_handle
handle
,
u32
event
,
void
*
data
)
static
void
dock_notify
(
struct
dock_station
*
ds
,
u32
event
)
{
struct
dock_station
*
ds
=
data
;
struct
acpi_device
*
tmp
;
acpi_handle
handle
=
ds
->
handle
;
struct
acpi_device
*
ad
;
int
surprise_removal
=
0
;
/*
...
...
@@ -751,8 +637,7 @@ static void dock_notify(acpi_handle handle, u32 event, void *data)
switch
(
event
)
{
case
ACPI_NOTIFY_BUS_CHECK
:
case
ACPI_NOTIFY_DEVICE_CHECK
:
if
(
!
dock_in_progress
(
ds
)
&&
acpi_bus_get_device
(
ds
->
handle
,
&
tmp
))
{
if
(
!
dock_in_progress
(
ds
)
&&
acpi_bus_get_device
(
handle
,
&
ad
))
{
begin_dock
(
ds
);
dock
(
ds
);
if
(
!
dock_present
(
ds
))
{
...
...
@@ -760,12 +645,10 @@ static void dock_notify(acpi_handle handle, u32 event, void *data)
complete_dock
(
ds
);
break
;
}
atomic_notifier_call_chain
(
&
dock_notifier_list
,
event
,
NULL
);
hotplug_dock_devices
(
ds
,
event
);
complete_dock
(
ds
);
dock_event
(
ds
,
event
,
DOCK_EVENT
);
dock_lock
(
ds
,
1
);
acpi_evaluate_lck
(
ds
->
handle
,
1
);
acpi_update_all_gpes
();
break
;
}
...
...
@@ -789,9 +672,8 @@ static void dock_notify(acpi_handle handle, u32 event, void *data)
}
struct
dock_data
{
acpi_handle
handle
;
unsigned
long
event
;
struct
dock_station
*
ds
;
u32
event
;
};
static
void
acpi_dock_deferred_cb
(
void
*
context
)
...
...
@@ -799,52 +681,31 @@ static void acpi_dock_deferred_cb(void *context)
struct
dock_data
*
data
=
context
;
acpi_scan_lock_acquire
();
dock_notify
(
data
->
handle
,
data
->
event
,
data
->
ds
);
dock_notify
(
data
->
ds
,
data
->
event
);
acpi_scan_lock_release
();
kfree
(
data
);
}
static
int
acpi_dock_notifier_call
(
struct
notifier_block
*
this
,
unsigned
long
event
,
void
*
data
)
static
void
dock_notify_handler
(
acpi_handle
handle
,
u32
event
,
void
*
data
)
{
struct
dock_station
*
dock_station
;
acpi_handle
handle
=
data
;
struct
dock_data
*
dd
;
if
(
event
!=
ACPI_NOTIFY_BUS_CHECK
&&
event
!=
ACPI_NOTIFY_DEVICE_CHECK
&&
event
!=
ACPI_NOTIFY_EJECT_REQUEST
)
return
0
;
acpi_scan_lock_acquire
();
list_for_each_entry
(
dock_station
,
&
dock_stations
,
sibling
)
{
if
(
dock_station
->
handle
==
handle
)
{
struct
dock_data
*
dd
;
acpi_status
status
;
dd
=
kmalloc
(
sizeof
(
*
dd
),
GFP_KERNEL
);
if
(
!
dd
)
break
;
return
;
dd
->
handle
=
handle
;
dd
->
event
=
event
;
dd
->
ds
=
dock_station
;
status
=
acpi_os_hotplug_execute
(
acpi_dock_deferred_cb
,
dd
);
if
(
ACPI_FAILURE
(
status
))
kfree
(
dd
);
dd
=
kmalloc
(
sizeof
(
*
dd
),
GFP_KERNEL
);
if
(
dd
)
{
acpi_status
status
;
break
;
}
dd
->
ds
=
data
;
dd
->
event
=
event
;
status
=
acpi_os_hotplug_execute
(
acpi_dock_deferred_cb
,
dd
);
if
(
ACPI_FAILURE
(
status
))
kfree
(
dd
);
}
acpi_scan_lock_release
();
return
0
;
}
static
struct
notifier_block
dock_acpi_notifier
=
{
.
notifier_call
=
acpi_dock_notifier_call
,
};
/**
* find_dock_devices - find devices on the dock station
* @handle: the handle of the device we are examining
...
...
@@ -856,29 +717,16 @@ static struct notifier_block dock_acpi_notifier = {
* check to see if an object has an _EJD method. If it does, then it
* will see if it is dependent on the dock station.
*/
static
acpi_status
find_dock_devices
(
acpi_handle
handle
,
u32
lvl
,
void
*
context
,
void
**
rv
)
static
acpi_status
__init
find_dock_devices
(
acpi_handle
handle
,
u32
lvl
,
void
*
context
,
void
**
rv
)
{
acpi_status
status
;
acpi_handle
tmp
,
parent
;
struct
dock_station
*
ds
=
context
;
acpi_handle
ejd
=
NULL
;
status
=
acpi_bus_get_ejd
(
handle
,
&
tmp
);
if
(
ACPI_FAILURE
(
status
))
{
/* try the parent device as well */
status
=
acpi_get_parent
(
handle
,
&
parent
);
if
(
ACPI_FAILURE
(
status
))
goto
fdd_out
;
/* see if parent is dependent on dock */
status
=
acpi_bus_get_ejd
(
parent
,
&
tmp
);
if
(
ACPI_FAILURE
(
status
))
goto
fdd_out
;
}
if
(
tmp
==
ds
->
handle
)
acpi_bus_get_ejd
(
handle
,
&
ejd
);
if
(
ejd
==
ds
->
handle
)
add_dock_dependent_device
(
ds
,
handle
);
fdd_out:
return
AE_OK
;
}
...
...
@@ -988,13 +836,13 @@ static struct attribute_group dock_attribute_group = {
*/
static
int
__init
dock_add
(
acpi_handle
handle
)
{
int
ret
,
id
;
struct
dock_station
ds
,
*
dock_station
;
struct
dock_station
*
dock_station
,
ds
=
{
NULL
,
};
struct
platform_device
*
dd
;
acpi_status
status
;
int
ret
;
id
=
dock_station_count
;
memset
(
&
ds
,
0
,
sizeof
(
ds
));
dd
=
platform_device_register_data
(
NULL
,
"dock"
,
id
,
&
ds
,
sizeof
(
ds
));
dd
=
platform_device_register_data
(
NULL
,
"dock"
,
dock_station_count
,
&
ds
,
sizeof
(
ds
));
if
(
IS_ERR
(
dd
))
return
PTR_ERR
(
dd
);
...
...
@@ -1004,18 +852,15 @@ static int __init dock_add(acpi_handle handle)
dock_station
->
dock_device
=
dd
;
dock_station
->
last_dock_time
=
jiffies
-
HZ
;
mutex_init
(
&
dock_station
->
hp_lock
);
spin_lock_init
(
&
dock_station
->
dd_lock
);
INIT_LIST_HEAD
(
&
dock_station
->
sibling
);
ATOMIC_INIT_NOTIFIER_HEAD
(
&
dock_notifier_list
);
INIT_LIST_HEAD
(
&
dock_station
->
dependent_devices
);
/* we want the dock device to send uevents */
dev_set_uevent_suppress
(
&
dd
->
dev
,
0
);
if
(
is_dock
(
handle
))
if
(
acpi_dock_match
(
handle
))
dock_station
->
flags
|=
DOCK_IS_DOCK
;
if
(
is_ata
(
handle
))
if
(
acpi_ata_match
(
handle
))
dock_station
->
flags
|=
DOCK_IS_ATA
;
if
(
is_battery
(
handle
))
dock_station
->
flags
|=
DOCK_IS_BAT
;
...
...
@@ -1034,11 +879,17 @@ static int __init dock_add(acpi_handle handle)
if
(
ret
)
goto
err_rmgroup
;
status
=
acpi_install_notify_handler
(
handle
,
ACPI_SYSTEM_NOTIFY
,
dock_notify_handler
,
dock_station
);
if
(
ACPI_FAILURE
(
status
))
goto
err_rmgroup
;
dock_station_count
++
;
list_add
(
&
dock_station
->
sibling
,
&
dock_stations
);
return
0
;
err_rmgroup:
remove_dock_dependent_devices
(
dock_station
);
sysfs_remove_group
(
&
dd
->
dev
.
kobj
,
&
dock_attribute_group
);
err_unregister:
platform_device_unregister
(
dd
);
...
...
@@ -1058,7 +909,7 @@ static int __init dock_add(acpi_handle handle)
static
__init
acpi_status
find_dock_and_bay
(
acpi_handle
handle
,
u32
lvl
,
void
*
context
,
void
**
rv
)
{
if
(
is_dock
(
handle
)
||
is_ejectable_bay
(
handle
))
if
(
acpi_dock_match
(
handle
)
||
is_ejectable_bay
(
handle
))
dock_add
(
handle
);
return
AE_OK
;
...
...
@@ -1078,7 +929,6 @@ void __init acpi_dock_init(void)
return
;
}
register_acpi_bus_notifier
(
&
dock_acpi_notifier
);
pr_info
(
PREFIX
"%s: %d docks/bays found
\n
"
,
ACPI_DOCK_DRIVER_DESCRIPTION
,
dock_station_count
);
}
drivers/acpi/ec.c
浏览文件 @
b9eb179f
...
...
@@ -1049,10 +1049,8 @@ int __init acpi_ec_ecdt_probe(void)
* which needs it, has fake EC._INI method, so use it as flag.
* Keep boot_ec struct as it will be needed soon.
*/
acpi_handle
dummy
;
if
(
!
dmi_name_in_vendors
(
"ASUS"
)
||
ACPI_FAILURE
(
acpi_get_handle
(
boot_ec
->
handle
,
"_INI"
,
&
dummy
)))
!
acpi_has_method
(
boot_ec
->
handle
,
"_INI"
))
return
-
ENODEV
;
}
install:
...
...
drivers/acpi/power.c
浏览文件 @
b9eb179f
...
...
@@ -637,9 +637,7 @@ int acpi_device_sleep_wake(struct acpi_device *dev,
}
/* Execute _PSW */
arg_list
.
count
=
1
;
in_arg
[
0
].
integer
.
value
=
enable
;
status
=
acpi_evaluate_object
(
dev
->
handle
,
"_PSW"
,
&
arg_list
,
NULL
);
status
=
acpi_execute_simple_method
(
dev
->
handle
,
"_PSW"
,
enable
);
if
(
ACPI_FAILURE
(
status
)
&&
(
status
!=
AE_NOT_FOUND
))
{
printk
(
KERN_ERR
PREFIX
"_PSW execution failed
\n
"
);
dev
->
wakeup
.
flags
.
valid
=
0
;
...
...
drivers/acpi/processor_perflib.c
浏览文件 @
b9eb179f
...
...
@@ -164,17 +164,12 @@ static void acpi_processor_ppc_ost(acpi_handle handle, int status)
{.
type
=
ACPI_TYPE_INTEGER
,},
};
struct
acpi_object_list
arg_list
=
{
2
,
params
};
acpi_handle
temp
;
params
[
0
].
integer
.
value
=
ACPI_PROCESSOR_NOTIFY_PERFORMANCE
;
params
[
1
].
integer
.
value
=
status
;
/* when there is no _OST , skip it */
if
(
ACPI_FAILURE
(
acpi_get_handle
(
handle
,
"_OST"
,
&
temp
)))
return
;
acpi_evaluate_object
(
handle
,
"_OST"
,
&
arg_list
,
NULL
);
return
;
if
(
acpi_has_method
(
handle
,
"_OST"
))
{
params
[
0
].
integer
.
value
=
ACPI_PROCESSOR_NOTIFY_PERFORMANCE
;
params
[
1
].
integer
.
value
=
status
;
acpi_evaluate_object
(
handle
,
"_OST"
,
&
arg_list
,
NULL
);
}
}
int
acpi_processor_ppc_has_changed
(
struct
acpi_processor
*
pr
,
int
event_flag
)
...
...
@@ -468,14 +463,11 @@ static int acpi_processor_get_performance_states(struct acpi_processor *pr)
int
acpi_processor_get_performance_info
(
struct
acpi_processor
*
pr
)
{
int
result
=
0
;
acpi_status
status
=
AE_OK
;
acpi_handle
handle
=
NULL
;
if
(
!
pr
||
!
pr
->
performance
||
!
pr
->
handle
)
return
-
EINVAL
;
status
=
acpi_get_handle
(
pr
->
handle
,
"_PCT"
,
&
handle
);
if
(
ACPI_FAILURE
(
status
))
{
if
(
!
acpi_has_method
(
pr
->
handle
,
"_PCT"
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"ACPI-based processor performance control unavailable
\n
"
));
return
-
ENODEV
;
...
...
@@ -501,7 +493,7 @@ int acpi_processor_get_performance_info(struct acpi_processor *pr)
*/
update_bios:
#ifdef CONFIG_X86
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
pr
->
handle
,
"_PPC"
,
&
handle
)))
{
if
(
acpi_has_method
(
pr
->
handle
,
"_PPC"
))
{
if
(
boot_cpu_has
(
X86_FEATURE_EST
))
printk
(
KERN_WARNING
FW_BUG
"BIOS needs update for CPU "
"frequency support
\n
"
);
...
...
drivers/acpi/resource.c
浏览文件 @
b9eb179f
...
...
@@ -505,14 +505,12 @@ int acpi_dev_get_resources(struct acpi_device *adev, struct list_head *list,
void
*
preproc_data
)
{
struct
res_proc_context
c
;
acpi_handle
not_used
;
acpi_status
status
;
if
(
!
adev
||
!
adev
->
handle
||
!
list_empty
(
list
))
return
-
EINVAL
;
status
=
acpi_get_handle
(
adev
->
handle
,
METHOD_NAME__CRS
,
&
not_used
);
if
(
ACPI_FAILURE
(
status
))
if
(
!
acpi_has_method
(
adev
->
handle
,
METHOD_NAME__CRS
))
return
0
;
c
.
list
=
list
;
...
...
drivers/acpi/scan.c
浏览文件 @
b9eb179f
...
...
@@ -193,9 +193,6 @@ static acpi_status acpi_bus_online_companions(acpi_handle handle, u32 lvl,
static
int
acpi_scan_hot_remove
(
struct
acpi_device
*
device
)
{
acpi_handle
handle
=
device
->
handle
;
acpi_handle
not_used
;
struct
acpi_object_list
arg_list
;
union
acpi_object
arg
;
struct
device
*
errdev
;
acpi_status
status
;
unsigned
long
long
sta
;
...
...
@@ -258,32 +255,15 @@ static int acpi_scan_hot_remove(struct acpi_device *device)
put_device
(
&
device
->
dev
);
device
=
NULL
;
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_LCK"
,
&
not_used
)))
{
arg_list
.
count
=
1
;
arg_list
.
pointer
=
&
arg
;
arg
.
type
=
ACPI_TYPE_INTEGER
;
arg
.
integer
.
value
=
0
;
acpi_evaluate_object
(
handle
,
"_LCK"
,
&
arg_list
,
NULL
);
}
arg_list
.
count
=
1
;
arg_list
.
pointer
=
&
arg
;
arg
.
type
=
ACPI_TYPE_INTEGER
;
arg
.
integer
.
value
=
1
;
acpi_evaluate_lck
(
handle
,
0
);
/*
* TBD: _EJD support.
*/
status
=
acpi_evaluate_object
(
handle
,
"_EJ0"
,
&
arg_list
,
NULL
);
if
(
ACPI_FAILURE
(
status
))
{
if
(
status
==
AE_NOT_FOUND
)
{
return
-
ENODEV
;
}
else
{
acpi_handle_warn
(
handle
,
"Eject failed (0x%x)
\n
"
,
status
);
return
-
EIO
;
}
}
status
=
acpi_evaluate_ej0
(
handle
);
if
(
status
==
AE_NOT_FOUND
)
return
-
ENODEV
;
else
if
(
ACPI_FAILURE
(
status
))
return
-
EIO
;
/*
* Verify if eject was indeed successful. If not, log an error
...
...
@@ -654,7 +634,6 @@ static int acpi_device_setup_files(struct acpi_device *dev)
{
struct
acpi_buffer
buffer
=
{
ACPI_ALLOCATE_BUFFER
,
NULL
};
acpi_status
status
;
acpi_handle
temp
;
unsigned
long
long
sun
;
int
result
=
0
;
...
...
@@ -680,8 +659,7 @@ static int acpi_device_setup_files(struct acpi_device *dev)
/*
* If device has _STR, 'description' file is created
*/
status
=
acpi_get_handle
(
dev
->
handle
,
"_STR"
,
&
temp
);
if
(
ACPI_SUCCESS
(
status
))
{
if
(
acpi_has_method
(
dev
->
handle
,
"_STR"
))
{
status
=
acpi_evaluate_object
(
dev
->
handle
,
"_STR"
,
NULL
,
&
buffer
);
if
(
ACPI_FAILURE
(
status
))
...
...
@@ -711,8 +689,7 @@ static int acpi_device_setup_files(struct acpi_device *dev)
* If device has _EJ0, 'eject' file is created that is used to trigger
* hot-removal function from userland.
*/
status
=
acpi_get_handle
(
dev
->
handle
,
"_EJ0"
,
&
temp
);
if
(
ACPI_SUCCESS
(
status
))
{
if
(
acpi_has_method
(
dev
->
handle
,
"_EJ0"
))
{
result
=
device_create_file
(
&
dev
->
dev
,
&
dev_attr_eject
);
if
(
result
)
return
result
;
...
...
@@ -734,9 +711,6 @@ static int acpi_device_setup_files(struct acpi_device *dev)
static
void
acpi_device_remove_files
(
struct
acpi_device
*
dev
)
{
acpi_status
status
;
acpi_handle
temp
;
if
(
dev
->
flags
.
power_manageable
)
{
device_remove_file
(
&
dev
->
dev
,
&
dev_attr_power_state
);
if
(
dev
->
power
.
flags
.
power_resources
)
...
...
@@ -747,20 +721,17 @@ static void acpi_device_remove_files(struct acpi_device *dev)
/*
* If device has _STR, remove 'description' file
*/
status
=
acpi_get_handle
(
dev
->
handle
,
"_STR"
,
&
temp
);
if
(
ACPI_SUCCESS
(
status
))
{
if
(
acpi_has_method
(
dev
->
handle
,
"_STR"
))
{
kfree
(
dev
->
pnp
.
str_obj
);
device_remove_file
(
&
dev
->
dev
,
&
dev_attr_description
);
}
/*
* If device has _EJ0, remove 'eject' file.
*/
status
=
acpi_get_handle
(
dev
->
handle
,
"_EJ0"
,
&
temp
);
if
(
ACPI_SUCCESS
(
status
))
if
(
acpi_has_method
(
dev
->
handle
,
"_EJ0"
))
device_remove_file
(
&
dev
->
dev
,
&
dev_attr_eject
);
status
=
acpi_get_handle
(
dev
->
handle
,
"_SUN"
,
&
temp
);
if
(
ACPI_SUCCESS
(
status
))
if
(
acpi_has_method
(
dev
->
handle
,
"_SUN"
))
device_remove_file
(
&
dev
->
dev
,
&
dev_attr_sun
);
if
(
dev
->
pnp
.
unique_id
)
...
...
@@ -1336,13 +1307,10 @@ static void acpi_bus_set_run_wake_flags(struct acpi_device *device)
static
void
acpi_bus_get_wakeup_device_flags
(
struct
acpi_device
*
device
)
{
acpi_handle
temp
;
acpi_status
status
=
0
;
int
err
;
/* Presence of _PRW indicates wake capable */
status
=
acpi_get_handle
(
device
->
handle
,
"_PRW"
,
&
temp
);
if
(
ACPI_FAILURE
(
status
))
if
(
!
acpi_has_method
(
device
->
handle
,
"_PRW"
))
return
;
err
=
acpi_bus_extract_wakeup_device_power_package
(
device
->
handle
,
...
...
@@ -1372,7 +1340,6 @@ static void acpi_bus_init_power_state(struct acpi_device *device, int state)
struct
acpi_device_power_state
*
ps
=
&
device
->
power
.
states
[
state
];
char
pathname
[
5
]
=
{
'_'
,
'P'
,
'R'
,
'0'
+
state
,
'\0'
};
struct
acpi_buffer
buffer
=
{
ACPI_ALLOCATE_BUFFER
,
NULL
};
acpi_handle
handle
;
acpi_status
status
;
INIT_LIST_HEAD
(
&
ps
->
resources
);
...
...
@@ -1395,8 +1362,7 @@ static void acpi_bus_init_power_state(struct acpi_device *device, int state)
/* Evaluate "_PSx" to see if we can do explicit sets */
pathname
[
2
]
=
'S'
;
status
=
acpi_get_handle
(
device
->
handle
,
pathname
,
&
handle
);
if
(
ACPI_SUCCESS
(
status
))
if
(
acpi_has_method
(
device
->
handle
,
pathname
))
ps
->
flags
.
explicit_set
=
1
;
/*
...
...
@@ -1415,28 +1381,21 @@ static void acpi_bus_init_power_state(struct acpi_device *device, int state)
static
void
acpi_bus_get_power_flags
(
struct
acpi_device
*
device
)
{
acpi_status
status
;
acpi_handle
handle
;
u32
i
;
/* Presence of _PS0|_PR0 indicates 'power manageable' */
status
=
acpi_get_handle
(
device
->
handle
,
"_PS0"
,
&
handle
);
if
(
ACPI_FAILURE
(
status
))
{
status
=
acpi_get_handle
(
device
->
handle
,
"_PR0"
,
&
handle
);
if
(
ACPI_FAILURE
(
status
))
return
;
}
if
(
!
acpi_has_method
(
device
->
handle
,
"_PS0"
)
&&
!
acpi_has_method
(
device
->
handle
,
"_PR0"
))
return
;
device
->
flags
.
power_manageable
=
1
;
/*
* Power Management Flags
*/
status
=
acpi_get_handle
(
device
->
handle
,
"_PSC"
,
&
handle
);
if
(
ACPI_SUCCESS
(
status
))
if
(
acpi_has_method
(
device
->
handle
,
"_PSC"
))
device
->
power
.
flags
.
explicit_get
=
1
;
status
=
acpi_get_handle
(
device
->
handle
,
"_IRC"
,
&
handle
);
if
(
ACPI_SUCCESS
(
status
))
if
(
acpi_has_method
(
device
->
handle
,
"_IRC"
))
device
->
power
.
flags
.
inrush_current
=
1
;
/*
...
...
@@ -1470,28 +1429,18 @@ static void acpi_bus_get_power_flags(struct acpi_device *device)
static
void
acpi_bus_get_flags
(
struct
acpi_device
*
device
)
{
acpi_status
status
=
AE_OK
;
acpi_handle
temp
=
NULL
;
/* Presence of _STA indicates 'dynamic_status' */
status
=
acpi_get_handle
(
device
->
handle
,
"_STA"
,
&
temp
);
if
(
ACPI_SUCCESS
(
status
))
if
(
acpi_has_method
(
device
->
handle
,
"_STA"
))
device
->
flags
.
dynamic_status
=
1
;
/* Presence of _RMV indicates 'removable' */
status
=
acpi_get_handle
(
device
->
handle
,
"_RMV"
,
&
temp
);
if
(
ACPI_SUCCESS
(
status
))
if
(
acpi_has_method
(
device
->
handle
,
"_RMV"
))
device
->
flags
.
removable
=
1
;
/* Presence of _EJD|_EJ0 indicates 'ejectable' */
status
=
acpi_get_handle
(
device
->
handle
,
"_EJD"
,
&
temp
);
if
(
ACPI_SUCCESS
(
status
))
if
(
acpi_has_method
(
device
->
handle
,
"_EJD"
)
||
acpi_has_method
(
device
->
handle
,
"_EJ0"
))
device
->
flags
.
ejectable
=
1
;
else
{
status
=
acpi_get_handle
(
device
->
handle
,
"_EJ0"
,
&
temp
);
if
(
ACPI_SUCCESS
(
status
))
device
->
flags
.
ejectable
=
1
;
}
}
static
void
acpi_device_get_busid
(
struct
acpi_device
*
device
)
...
...
@@ -1532,47 +1481,46 @@ static void acpi_device_get_busid(struct acpi_device *device)
}
}
/*
* acpi_ata_match - see if an acpi object is an ATA device
*
* If an acpi object has one of the ACPI ATA methods defined,
* then we can safely call it an ATA device.
*/
bool
acpi_ata_match
(
acpi_handle
handle
)
{
return
acpi_has_method
(
handle
,
"_GTF"
)
||
acpi_has_method
(
handle
,
"_GTM"
)
||
acpi_has_method
(
handle
,
"_STM"
)
||
acpi_has_method
(
handle
,
"_SDD"
);
}
/*
* acpi_bay_match - see if an acpi object is an ejectable driver bay
*
* If an acpi object is ejectable and has one of the ACPI ATA methods defined,
* then we can safely call it an ejectable drive bay
*/
static
int
acpi_bay_match
(
acpi_handle
handle
)
bool
acpi_bay_match
(
acpi_handle
handle
)
{
acpi_status
status
;
acpi_handle
tmp
;
acpi_handle
phandle
;
status
=
acpi_get_handle
(
handle
,
"_EJ0"
,
&
tmp
);
if
(
ACPI_FAILURE
(
status
))
return
-
ENODEV
;
if
((
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_GTF"
,
&
tmp
)))
||
(
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_GTM"
,
&
tmp
)))
||
(
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_STM"
,
&
tmp
)))
||
(
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_SDD"
,
&
tmp
))))
return
0
;
if
(
acpi_get_parent
(
handle
,
&
phandle
))
return
-
ENODEV
;
if
(
!
acpi_has_method
(
handle
,
"_EJ0"
))
return
false
;
if
(
acpi_ata_match
(
handle
))
return
true
;
if
(
ACPI_FAILURE
(
acpi_get_parent
(
handle
,
&
phandle
)))
return
false
;
if
((
ACPI_SUCCESS
(
acpi_get_handle
(
phandle
,
"_GTF"
,
&
tmp
)))
||
(
ACPI_SUCCESS
(
acpi_get_handle
(
phandle
,
"_GTM"
,
&
tmp
)))
||
(
ACPI_SUCCESS
(
acpi_get_handle
(
phandle
,
"_STM"
,
&
tmp
)))
||
(
ACPI_SUCCESS
(
acpi_get_handle
(
phandle
,
"_SDD"
,
&
tmp
))))
return
0
;
return
-
ENODEV
;
return
acpi_ata_match
(
phandle
);
}
/*
* acpi_dock_match - see if an acpi object has a _DCK method
*/
static
int
acpi_dock_match
(
acpi_handle
handle
)
bool
acpi_dock_match
(
acpi_handle
handle
)
{
acpi_handle
tmp
;
return
acpi_get_handle
(
handle
,
"_DCK"
,
&
tmp
);
return
acpi_has_method
(
handle
,
"_DCK"
);
}
const
char
*
acpi_device_hid
(
struct
acpi_device
*
device
)
...
...
@@ -1610,34 +1558,26 @@ static void acpi_add_id(struct acpi_device_pnp *pnp, const char *dev_id)
* lacks the SMBUS01 HID and the methods do not have the necessary "_"
* prefix. Work around this.
*/
static
int
acpi_ibm_smbus_match
(
acpi_handle
handle
)
static
bool
acpi_ibm_smbus_match
(
acpi_handle
handle
)
{
acpi_handle
h_dummy
;
struct
acpi_buffer
path
=
{
ACPI_ALLOCATE_BUFFER
,
NULL
};
int
result
;
char
node_name
[
ACPI_PATH_SEGMENT_LENGTH
];
struct
acpi_buffer
path
=
{
sizeof
(
node_name
),
node_name
};
if
(
!
dmi_name_in_vendors
(
"IBM"
))
return
-
ENODEV
;
return
false
;
/* Look for SMBS object */
result
=
acpi_get_name
(
handle
,
ACPI_SINGLE_NAME
,
&
path
);
if
(
result
)
return
result
;
if
(
strcmp
(
"SMBS"
,
path
.
pointer
))
{
result
=
-
ENODEV
;
goto
out
;
}
if
(
ACPI_FAILURE
(
acpi_get_name
(
handle
,
ACPI_SINGLE_NAME
,
&
path
))
||
strcmp
(
"SMBS"
,
path
.
pointer
))
return
false
;
/* Does it have the necessary (but misnamed) methods? */
result
=
-
ENODEV
;
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"SBI"
,
&
h_dummy
))
&&
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"SBR"
,
&
h_dummy
))
&&
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"SBW"
,
&
h_dummy
)))
result
=
0
;
out:
kfree
(
path
.
pointer
);
return
result
;
if
(
acpi_has_method
(
handle
,
"SBI"
)
&&
acpi_has_method
(
handle
,
"SBR"
)
&&
acpi_has_method
(
handle
,
"SBW"
))
return
true
;
return
false
;
}
static
void
acpi_set_pnp_ids
(
acpi_handle
handle
,
struct
acpi_device_pnp
*
pnp
,
...
...
@@ -1685,11 +1625,11 @@ static void acpi_set_pnp_ids(acpi_handle handle, struct acpi_device_pnp *pnp,
*/
if
(
acpi_is_video_device
(
handle
))
acpi_add_id
(
pnp
,
ACPI_VIDEO_HID
);
else
if
(
ACPI_SUCCESS
(
acpi_bay_match
(
handle
)
))
else
if
(
acpi_bay_match
(
handle
))
acpi_add_id
(
pnp
,
ACPI_BAY_HID
);
else
if
(
ACPI_SUCCESS
(
acpi_dock_match
(
handle
)
))
else
if
(
acpi_dock_match
(
handle
))
acpi_add_id
(
pnp
,
ACPI_DOCK_HID
);
else
if
(
!
acpi_ibm_smbus_match
(
handle
))
else
if
(
acpi_ibm_smbus_match
(
handle
))
acpi_add_id
(
pnp
,
ACPI_SMBUS_IBM_HID
);
else
if
(
list_empty
(
&
pnp
->
ids
)
&&
handle
==
ACPI_ROOT_OBJECT
)
{
acpi_add_id
(
pnp
,
ACPI_BUS_HID
);
/* \_SB, LNXSYBUS */
...
...
@@ -1900,7 +1840,6 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used,
struct
acpi_device
*
device
=
NULL
;
int
type
;
unsigned
long
long
sta
;
acpi_status
status
;
int
result
;
acpi_bus_get_device
(
handle
,
&
device
);
...
...
@@ -1921,10 +1860,8 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used,
if
(
!
(
sta
&
ACPI_STA_DEVICE_PRESENT
)
&&
!
(
sta
&
ACPI_STA_DEVICE_FUNCTIONING
))
{
struct
acpi_device_wakeup
wakeup
;
acpi_handle
temp
;
status
=
acpi_get_handle
(
handle
,
"_PRW"
,
&
temp
);
if
(
ACPI_SUCCESS
(
status
))
{
if
(
acpi_has_method
(
handle
,
"_PRW"
))
{
acpi_bus_extract_wakeup_device_power_package
(
handle
,
&
wakeup
);
acpi_power_resources_list_free
(
&
wakeup
.
resources
);
...
...
drivers/acpi/sleep.c
浏览文件 @
b9eb179f
...
...
@@ -31,12 +31,9 @@ static u8 sleep_states[ACPI_S_STATE_COUNT];
static
void
acpi_sleep_tts_switch
(
u32
acpi_state
)
{
union
acpi_object
in_arg
=
{
ACPI_TYPE_INTEGER
};
struct
acpi_object_list
arg_list
=
{
1
,
&
in_arg
};
acpi_status
status
=
AE_OK
;
acpi_status
status
;
in_arg
.
integer
.
value
=
acpi_state
;
status
=
acpi_evaluate_object
(
NULL
,
"
\\
_TTS"
,
&
arg_list
,
NULL
);
status
=
acpi_execute_simple_method
(
NULL
,
"
\\
_TTS"
,
acpi_state
);
if
(
ACPI_FAILURE
(
status
)
&&
status
!=
AE_NOT_FOUND
)
{
/*
* OS can't evaluate the _TTS object correctly. Some warning
...
...
drivers/acpi/thermal.c
浏览文件 @
b9eb179f
...
...
@@ -239,26 +239,16 @@ static int acpi_thermal_get_polling_frequency(struct acpi_thermal *tz)
static
int
acpi_thermal_set_cooling_mode
(
struct
acpi_thermal
*
tz
,
int
mode
)
{
acpi_status
status
=
AE_OK
;
union
acpi_object
arg0
=
{
ACPI_TYPE_INTEGER
};
struct
acpi_object_list
arg_list
=
{
1
,
&
arg0
};
acpi_handle
handle
=
NULL
;
if
(
!
tz
)
return
-
EINVAL
;
status
=
acpi_get_handle
(
tz
->
device
->
handle
,
"_SCP"
,
&
handle
);
if
(
ACPI_FAILURE
(
status
))
{
if
(
!
acpi_has_method
(
tz
->
device
->
handle
,
"_SCP"
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"_SCP not present
\n
"
));
return
-
ENODEV
;
}
arg0
.
integer
.
value
=
mode
;
status
=
acpi_evaluate_object
(
handle
,
NULL
,
&
arg_list
,
NULL
);
if
(
ACPI_FAILURE
(
status
))
}
else
if
(
ACPI_FAILURE
(
acpi_execute_simple_method
(
tz
->
device
->
handle
,
"_SCP"
,
mode
)))
{
return
-
ENODEV
;
}
return
0
;
}
...
...
drivers/acpi/utils.c
浏览文件 @
b9eb179f
...
...
@@ -495,3 +495,73 @@ acpi_handle_printk(const char *level, acpi_handle handle, const char *fmt, ...)
kfree
(
buffer
.
pointer
);
}
EXPORT_SYMBOL
(
acpi_handle_printk
);
/**
* acpi_has_method: Check whether @handle has a method named @name
* @handle: ACPI device handle
* @name: name of object or method
*
* Check whether @handle has a method named @name.
*/
bool
acpi_has_method
(
acpi_handle
handle
,
char
*
name
)
{
acpi_handle
tmp
;
return
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
name
,
&
tmp
));
}
EXPORT_SYMBOL
(
acpi_has_method
);
acpi_status
acpi_execute_simple_method
(
acpi_handle
handle
,
char
*
method
,
u64
arg
)
{
union
acpi_object
obj
=
{
.
type
=
ACPI_TYPE_INTEGER
};
struct
acpi_object_list
arg_list
=
{
.
count
=
1
,
.
pointer
=
&
obj
,
};
obj
.
integer
.
value
=
arg
;
return
acpi_evaluate_object
(
handle
,
method
,
&
arg_list
,
NULL
);
}
EXPORT_SYMBOL
(
acpi_execute_simple_method
);
/**
* acpi_evaluate_ej0: Evaluate _EJ0 method for hotplug operations
* @handle: ACPI device handle
*
* Evaluate device's _EJ0 method for hotplug operations.
*/
acpi_status
acpi_evaluate_ej0
(
acpi_handle
handle
)
{
acpi_status
status
;
status
=
acpi_execute_simple_method
(
handle
,
"_EJ0"
,
1
);
if
(
status
==
AE_NOT_FOUND
)
acpi_handle_warn
(
handle
,
"No _EJ0 support for device
\n
"
);
else
if
(
ACPI_FAILURE
(
status
))
acpi_handle_warn
(
handle
,
"Eject failed (0x%x)
\n
"
,
status
);
return
status
;
}
/**
* acpi_evaluate_lck: Evaluate _LCK method to lock/unlock device
* @handle: ACPI device handle
* @lock: lock device if non-zero, otherwise unlock device
*
* Evaluate device's _LCK method if present to lock/unlock device
*/
acpi_status
acpi_evaluate_lck
(
acpi_handle
handle
,
int
lock
)
{
acpi_status
status
;
status
=
acpi_execute_simple_method
(
handle
,
"_LCK"
,
!!
lock
);
if
(
ACPI_FAILURE
(
status
)
&&
status
!=
AE_NOT_FOUND
)
{
if
(
lock
)
acpi_handle_warn
(
handle
,
"Locking device failed (0x%x)
\n
"
,
status
);
else
acpi_handle_warn
(
handle
,
"Unlocking device failed (0x%x)
\n
"
,
status
);
}
return
status
;
}
drivers/acpi/video.c
浏览文件 @
b9eb179f
...
...
@@ -355,14 +355,10 @@ static int
acpi_video_device_lcd_set_level
(
struct
acpi_video_device
*
device
,
int
level
)
{
int
status
;
union
acpi_object
arg0
=
{
ACPI_TYPE_INTEGER
};
struct
acpi_object_list
args
=
{
1
,
&
arg0
};
int
state
;
arg0
.
integer
.
value
=
level
;
status
=
acpi_evaluate_object
(
device
->
dev
->
handle
,
"_BCM"
,
&
args
,
NULL
);
status
=
acpi_execute_simple_method
(
device
->
dev
->
handle
,
"_BCM"
,
level
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_ERROR
((
AE_INFO
,
"Evaluating _BCM failed"
));
return
-
EIO
;
...
...
@@ -638,18 +634,15 @@ static int
acpi_video_bus_DOS
(
struct
acpi_video_bus
*
video
,
int
bios_flag
,
int
lcd_flag
)
{
acpi_status
status
;
union
acpi_object
arg0
=
{
ACPI_TYPE_INTEGER
};
struct
acpi_object_list
args
=
{
1
,
&
arg0
};
if
(
!
video
->
cap
.
_DOS
)
return
0
;
if
(
bios_flag
<
0
||
bios_flag
>
3
||
lcd_flag
<
0
||
lcd_flag
>
1
)
return
-
EINVAL
;
arg0
.
integer
.
value
=
(
lcd_flag
<<
2
)
|
bios_flag
;
video
->
dos_setting
=
arg0
.
integer
.
value
;
status
=
acpi_evaluate_object
(
video
->
device
->
handle
,
"_DOS"
,
&
args
,
NULL
);
video
->
dos_setting
=
(
lcd_flag
<<
2
)
|
bios_flag
;
status
=
acpi_execute_simple_method
(
video
->
device
->
handle
,
"_DOS"
,
(
lcd_flag
<<
2
)
|
bios_flag
);
if
(
ACPI_FAILURE
(
status
))
return
-
EIO
;
...
...
@@ -885,28 +878,21 @@ acpi_video_init_brightness(struct acpi_video_device *device)
static
void
acpi_video_device_find_cap
(
struct
acpi_video_device
*
device
)
{
acpi_handle
h_dummy1
;
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
device
->
dev
->
handle
,
"_ADR"
,
&
h_dummy1
)))
{
if
(
acpi_has_method
(
device
->
dev
->
handle
,
"_ADR"
))
device
->
cap
.
_ADR
=
1
;
}
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
device
->
dev
->
handle
,
"_BCL"
,
&
h_dummy1
)))
{
if
(
acpi_has_method
(
device
->
dev
->
handle
,
"_BCL"
))
device
->
cap
.
_BCL
=
1
;
}
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
device
->
dev
->
handle
,
"_BCM"
,
&
h_dummy1
)))
{
if
(
acpi_has_method
(
device
->
dev
->
handle
,
"_BCM"
))
device
->
cap
.
_BCM
=
1
;
}
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
device
->
dev
->
handle
,
"_BQC"
,
&
h_dummy1
)))
if
(
acpi_has_method
(
device
->
dev
->
handle
,
"_BQC"
))
{
device
->
cap
.
_BQC
=
1
;
else
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
device
->
dev
->
handle
,
"_BCQ"
,
&
h_dummy1
)))
{
}
else
if
(
acpi_has_method
(
device
->
dev
->
handle
,
"_BCQ"
))
{
printk
(
KERN_WARNING
FW_BUG
"_BCQ is used instead of _BQC
\n
"
);
device
->
cap
.
_BCQ
=
1
;
}
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
device
->
dev
->
handle
,
"_DDC"
,
&
h_dummy1
)))
{
if
(
acpi_has_method
(
device
->
dev
->
handle
,
"_DDC"
))
device
->
cap
.
_DDC
=
1
;
}
if
(
acpi_video_init_brightness
(
device
))
return
;
...
...
@@ -999,26 +985,18 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
static
void
acpi_video_bus_find_cap
(
struct
acpi_video_bus
*
video
)
{
acpi_handle
h_dummy1
;
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
video
->
device
->
handle
,
"_DOS"
,
&
h_dummy1
)))
{
if
(
acpi_has_method
(
video
->
device
->
handle
,
"_DOS"
))
video
->
cap
.
_DOS
=
1
;
}
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
video
->
device
->
handle
,
"_DOD"
,
&
h_dummy1
)))
{
if
(
acpi_has_method
(
video
->
device
->
handle
,
"_DOD"
))
video
->
cap
.
_DOD
=
1
;
}
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
video
->
device
->
handle
,
"_ROM"
,
&
h_dummy1
)))
{
if
(
acpi_has_method
(
video
->
device
->
handle
,
"_ROM"
))
video
->
cap
.
_ROM
=
1
;
}
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
video
->
device
->
handle
,
"_GPD"
,
&
h_dummy1
)))
{
if
(
acpi_has_method
(
video
->
device
->
handle
,
"_GPD"
))
video
->
cap
.
_GPD
=
1
;
}
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
video
->
device
->
handle
,
"_SPD"
,
&
h_dummy1
)))
{
if
(
acpi_has_method
(
video
->
device
->
handle
,
"_SPD"
))
video
->
cap
.
_SPD
=
1
;
}
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
video
->
device
->
handle
,
"_VPO"
,
&
h_dummy1
)))
{
if
(
acpi_has_method
(
video
->
device
->
handle
,
"_VPO"
))
video
->
cap
.
_VPO
=
1
;
}
}
/*
...
...
drivers/acpi/video_detect.c
浏览文件 @
b9eb179f
...
...
@@ -53,14 +53,13 @@ acpi_backlight_cap_match(acpi_handle handle, u32 level, void *context,
void
**
retyurn_value
)
{
long
*
cap
=
context
;
acpi_handle
h_dummy
;
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_BCM"
,
&
h_dummy
)
)
&&
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_BCL"
,
&
h_dummy
)
))
{
if
(
acpi_has_method
(
handle
,
"_BCM"
)
&&
acpi_has_method
(
handle
,
"_BCL"
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Found generic backlight "
"support
\n
"
));
*
cap
|=
ACPI_VIDEO_BACKLIGHT
;
if
(
ACPI_FAILURE
(
acpi_get_handle
(
handle
,
"_BQC"
,
&
h_dummy
)
))
if
(
!
acpi_has_method
(
handle
,
"_BQC"
))
printk
(
KERN_WARNING
FW_BUG
PREFIX
"No _BQC method, "
"cannot determine initial brightness
\n
"
);
/* We have backlight support, no need to scan further */
...
...
@@ -79,22 +78,20 @@ acpi_backlight_cap_match(acpi_handle handle, u32 level, void *context,
*/
long
acpi_is_video_device
(
acpi_handle
handle
)
{
acpi_handle
h_dummy
;
long
video_caps
=
0
;
/* Is this device able to support video switching ? */
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_DOD"
,
&
h_dummy
))
||
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_DOS"
,
&
h_dummy
)))
if
(
acpi_has_method
(
handle
,
"_DOD"
)
||
acpi_has_method
(
handle
,
"_DOS"
))
video_caps
|=
ACPI_VIDEO_OUTPUT_SWITCHING
;
/* Is this device able to retrieve a video ROM ? */
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_ROM"
,
&
h_dummy
)
))
if
(
acpi_has_method
(
handle
,
"_ROM"
))
video_caps
|=
ACPI_VIDEO_ROM_AVAILABLE
;
/* Is this device able to configure which video head to be POSTed ? */
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_VPO"
,
&
h_dummy
)
)
&&
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_GPD"
,
&
h_dummy
)
)
&&
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_SPD"
,
&
h_dummy
)
))
if
(
acpi_has_method
(
handle
,
"_VPO"
)
&&
acpi_has_method
(
handle
,
"_GPD"
)
&&
acpi_has_method
(
handle
,
"_SPD"
))
video_caps
|=
ACPI_VIDEO_DEVICE_POSTING
;
/* Only check for backlight functionality if one of the above hit. */
...
...
drivers/pci/hotplug/acpiphp.h
浏览文件 @
b9eb179f
...
...
@@ -122,7 +122,6 @@ struct acpiphp_func {
struct
acpiphp_slot
*
slot
;
/* parent */
struct
list_head
sibling
;
struct
notifier_block
nb
;
acpi_handle
handle
;
u8
function
;
/* pci function# */
...
...
drivers/pci/hotplug/acpiphp_glue.c
浏览文件 @
b9eb179f
...
...
@@ -119,15 +119,14 @@ static void free_bridge(struct kref *kref)
* TBD - figure out a way to only call fixups for
* systems that require them.
*/
static
int
post_dock_fixups
(
struct
notifier_block
*
nb
,
unsigned
long
val
,
void
*
v
)
static
void
post_dock_fixups
(
acpi_handle
not_used
,
u32
event
,
void
*
data
)
{
struct
acpiphp_func
*
func
=
container_of
(
nb
,
struct
acpiphp_func
,
nb
)
;
struct
acpiphp_func
*
func
=
data
;
struct
pci_bus
*
bus
=
func
->
slot
->
bridge
->
pci_bus
;
u32
buses
;
if
(
!
bus
->
self
)
return
NOTIFY_OK
;
return
;
/* fixup bad _DCK function that rewrites
* secondary bridge on slot
...
...
@@ -143,11 +142,11 @@ static int post_dock_fixups(struct notifier_block *nb, unsigned long val,
|
((
unsigned
int
)(
bus
->
busn_res
.
end
)
<<
16
);
pci_write_config_dword
(
bus
->
self
,
PCI_PRIMARY_BUS
,
buses
);
}
return
NOTIFY_OK
;
}
static
const
struct
acpi_dock_ops
acpiphp_dock_ops
=
{
.
fixup
=
post_dock_fixups
,
.
handler
=
hotplug_event_func
,
};
...
...
@@ -201,7 +200,6 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
struct
acpiphp_bridge
*
bridge
=
(
struct
acpiphp_bridge
*
)
context
;
struct
acpiphp_slot
*
slot
;
struct
acpiphp_func
*
newfunc
;
acpi_handle
tmp
;
acpi_status
status
=
AE_OK
;
unsigned
long
long
adr
,
sun
;
int
device
,
function
,
retval
,
found
=
0
;
...
...
@@ -232,19 +230,19 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
newfunc
->
handle
=
handle
;
newfunc
->
function
=
function
;
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_EJ0"
,
&
tmp
)
))
if
(
acpi_has_method
(
handle
,
"_EJ0"
))
newfunc
->
flags
=
FUNC_HAS_EJ0
;
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_STA"
,
&
tmp
)
))
if
(
acpi_has_method
(
handle
,
"_STA"
))
newfunc
->
flags
|=
FUNC_HAS_STA
;
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_PS0"
,
&
tmp
)
))
if
(
acpi_has_method
(
handle
,
"_PS0"
))
newfunc
->
flags
|=
FUNC_HAS_PS0
;
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_PS3"
,
&
tmp
)
))
if
(
acpi_has_method
(
handle
,
"_PS3"
))
newfunc
->
flags
|=
FUNC_HAS_PS3
;
if
(
ACPI_SUCCESS
(
acpi_get_handle
(
handle
,
"_DCK"
,
&
tmp
)
))
if
(
acpi_has_method
(
handle
,
"_DCK"
))
newfunc
->
flags
|=
FUNC_HAS_DCK
;
status
=
acpi_evaluate_integer
(
handle
,
"_SUN"
,
NULL
,
&
sun
);
...
...
@@ -316,14 +314,6 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
&
acpiphp_dock_ops
,
newfunc
,
acpiphp_dock_init
,
acpiphp_dock_release
))
dbg
(
"failed to register dock device
\n
"
);
/* we need to be notified when dock events happen
* outside of the hotplug operation, since we may
* need to do fixups before we can hotplug.
*/
newfunc
->
nb
.
notifier_call
=
post_dock_fixups
;
if
(
register_dock_notifier
(
&
newfunc
->
nb
))
dbg
(
"failed to register a dock notifier"
);
}
/* install notify handler */
...
...
@@ -473,7 +463,6 @@ static void cleanup_bridge(struct acpiphp_bridge *bridge)
list_for_each_entry
(
func
,
&
slot
->
funcs
,
sibling
)
{
if
(
is_dock_device
(
func
->
handle
))
{
unregister_hotplug_dock_device
(
func
->
handle
);
unregister_dock_notifier
(
&
func
->
nb
);
}
if
(
!
(
func
->
flags
&
FUNC_HAS_DCK
))
{
status
=
acpi_remove_notify_handler
(
func
->
handle
,
...
...
@@ -843,25 +832,14 @@ static unsigned int get_slot_status(struct acpiphp_slot *slot)
*/
int
acpiphp_eject_slot
(
struct
acpiphp_slot
*
slot
)
{
acpi_status
status
;
struct
acpiphp_func
*
func
;
struct
acpi_object_list
arg_list
;
union
acpi_object
arg
;
list_for_each_entry
(
func
,
&
slot
->
funcs
,
sibling
)
{
/* We don't want to call _EJ0 on non-existing functions. */
if
((
func
->
flags
&
FUNC_HAS_EJ0
))
{
/* _EJ0 method take one argument */
arg_list
.
count
=
1
;
arg_list
.
pointer
=
&
arg
;
arg
.
type
=
ACPI_TYPE_INTEGER
;
arg
.
integer
.
value
=
1
;
status
=
acpi_evaluate_object
(
func
->
handle
,
"_EJ0"
,
&
arg_list
,
NULL
);
if
(
ACPI_FAILURE
(
status
))
{
warn
(
"%s: _EJ0 failed
\n
"
,
__func__
);
if
(
ACPI_FAILURE
(
acpi_evaluate_ej0
(
func
->
handle
)))
return
-
1
;
}
else
else
break
;
}
}
...
...
@@ -1171,7 +1149,6 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type,
*/
void
acpiphp_enumerate_slots
(
struct
pci_bus
*
bus
,
acpi_handle
handle
)
{
acpi_handle
dummy_handle
;
struct
acpiphp_bridge
*
bridge
;
if
(
acpiphp_disabled
)
...
...
@@ -1200,8 +1177,7 @@ void acpiphp_enumerate_slots(struct pci_bus *bus, acpi_handle handle)
get_device
(
&
bus
->
dev
);
if
(
!
pci_is_root_bus
(
bridge
->
pci_bus
)
&&
ACPI_SUCCESS
(
acpi_get_handle
(
bridge
->
handle
,
"_EJ0"
,
&
dummy_handle
)))
{
acpi_has_method
(
bridge
->
handle
,
"_EJ0"
))
{
dbg
(
"found ejectable p2p bridge
\n
"
);
bridge
->
flags
|=
BRIDGE_HAS_EJ0
;
bridge
->
func
=
acpiphp_bridge_handle_to_function
(
handle
);
...
...
include/acpi/acpi_bus.h
浏览文件 @
b9eb179f
...
...
@@ -56,6 +56,16 @@ acpi_evaluate_hotplug_ost(acpi_handle handle, u32 source_event,
acpi_status
acpi_get_physical_device_location
(
acpi_handle
handle
,
struct
acpi_pld_info
**
pld
);
bool
acpi_has_method
(
acpi_handle
handle
,
char
*
name
);
acpi_status
acpi_execute_simple_method
(
acpi_handle
handle
,
char
*
method
,
u64
arg
);
acpi_status
acpi_evaluate_ej0
(
acpi_handle
handle
);
acpi_status
acpi_evaluate_lck
(
acpi_handle
handle
,
int
lock
);
bool
acpi_ata_match
(
acpi_handle
handle
);
bool
acpi_bay_match
(
acpi_handle
handle
);
bool
acpi_dock_match
(
acpi_handle
handle
);
#ifdef CONFIG_ACPI
#include <linux/proc_fs.h>
...
...
@@ -356,8 +366,6 @@ extern int acpi_notifier_call_chain(struct acpi_device *, u32, u32);
extern
int
register_acpi_notifier
(
struct
notifier_block
*
);
extern
int
unregister_acpi_notifier
(
struct
notifier_block
*
);
extern
int
register_acpi_bus_notifier
(
struct
notifier_block
*
nb
);
extern
void
unregister_acpi_bus_notifier
(
struct
notifier_block
*
nb
);
/*
* External Functions
*/
...
...
include/acpi/acpi_drivers.h
浏览文件 @
b9eb179f
...
...
@@ -113,14 +113,13 @@ void pci_acpi_crs_quirks(void);
Dock Station
-------------------------------------------------------------------------- */
struct
acpi_dock_ops
{
acpi_notify_handler
fixup
;
acpi_notify_handler
handler
;
acpi_notify_handler
uevent
;
};
#if
defined(CONFIG_ACPI_DOCK) || defined(CONFIG_ACPI_DOCK_MODULE)
#if
def CONFIG_ACPI_DOCK
extern
int
is_dock_device
(
acpi_handle
handle
);
extern
int
register_dock_notifier
(
struct
notifier_block
*
nb
);
extern
void
unregister_dock_notifier
(
struct
notifier_block
*
nb
);
extern
int
register_hotplug_dock_device
(
acpi_handle
handle
,
const
struct
acpi_dock_ops
*
ops
,
void
*
context
,
...
...
@@ -132,13 +131,6 @@ static inline int is_dock_device(acpi_handle handle)
{
return
0
;
}
static
inline
int
register_dock_notifier
(
struct
notifier_block
*
nb
)
{
return
-
ENODEV
;
}
static
inline
void
unregister_dock_notifier
(
struct
notifier_block
*
nb
)
{
}
static
inline
int
register_hotplug_dock_device
(
acpi_handle
handle
,
const
struct
acpi_dock_ops
*
ops
,
void
*
context
,
...
...
@@ -150,6 +142,6 @@ static inline int register_hotplug_dock_device(acpi_handle handle,
static
inline
void
unregister_hotplug_dock_device
(
acpi_handle
handle
)
{
}
#endif
#endif
/* CONFIG_ACPI_DOCK */
#endif
/*__ACPI_DRIVERS_H__*/
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录