Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
e8b495fe
Commit
e8b495fe
authored
Jul 22, 2007
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
Pull dock-bay into release branch
parents
22aadf8a
9254bc84
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
106 additions
and
40 deletions
+106
-40
drivers/acpi/bay.c
drivers/acpi/bay.c
+9
-10
drivers/acpi/dock.c
drivers/acpi/dock.c
+97
-30
No files found.
drivers/acpi/bay.c
View file @
e8b495fe
...
...
@@ -288,6 +288,11 @@ static int bay_add(acpi_handle handle, int id)
new_bay
->
pdev
=
pdev
;
platform_set_drvdata
(
pdev
,
new_bay
);
/*
* we want the bay driver to be able to send uevents
*/
pdev
->
dev
.
uevent_suppress
=
0
;
if
(
acpi_bay_add_fs
(
new_bay
))
{
platform_device_unregister
(
new_bay
->
pdev
);
goto
bay_add_err
;
...
...
@@ -328,18 +333,12 @@ static void bay_notify(acpi_handle handle, u32 event, void *data)
{
struct
bay
*
bay_dev
=
(
struct
bay
*
)
data
;
struct
device
*
dev
=
&
bay_dev
->
pdev
->
dev
;
char
event_string
[
12
];
char
*
envp
[]
=
{
event_string
,
NULL
};
bay_dprintk
(
handle
,
"Bay event"
);
switch
(
event
)
{
case
ACPI_NOTIFY_BUS_CHECK
:
case
ACPI_NOTIFY_DEVICE_CHECK
:
case
ACPI_NOTIFY_EJECT_REQUEST
:
kobject_uevent
(
&
dev
->
kobj
,
KOBJ_CHANGE
);
break
;
default:
printk
(
KERN_ERR
PREFIX
"Bay: unknown event %d
\n
"
,
event
);
}
sprintf
(
event_string
,
"BAY_EVENT=%d
\n
"
,
event
);
kobject_uevent_env
(
&
dev
->
kobj
,
KOBJ_CHANGE
,
envp
);
}
static
acpi_status
...
...
drivers/acpi/dock.c
View file @
e8b495fe
...
...
@@ -40,8 +40,15 @@ MODULE_AUTHOR("Kristen Carlson Accardi");
MODULE_DESCRIPTION
(
ACPI_DOCK_DRIVER_DESCRIPTION
);
MODULE_LICENSE
(
"GPL"
);
static
int
immediate_undock
=
1
;
module_param
(
immediate_undock
,
bool
,
0644
);
MODULE_PARM_DESC
(
immediate_undock
,
"1 (default) will cause the driver to "
"undock immediately when the undock button is pressed, 0 will cause"
" the driver to wait for userspace to write the undock sysfs file "
" before undocking"
);
static
struct
atomic_notifier_head
dock_notifier_list
;
static
struct
platform_device
dock_device
;
static
struct
platform_device
*
dock_device
;
static
char
dock_device_name
[]
=
"dock"
;
struct
dock_station
{
...
...
@@ -63,6 +70,7 @@ struct dock_dependent_device {
};
#define DOCK_DOCKING 0x00000001
#define DOCK_UNDOCKING 0x00000002
#define DOCK_EVENT 3
#define UNDOCK_EVENT 2
...
...
@@ -327,12 +335,20 @@ static void hotplug_dock_devices(struct dock_station *ds, u32 event)
static
void
dock_event
(
struct
dock_station
*
ds
,
u32
event
,
int
num
)
{
struct
device
*
dev
=
&
dock_device
.
dev
;
struct
device
*
dev
=
&
dock_device
->
dev
;
char
event_string
[
7
];
char
*
envp
[]
=
{
event_string
,
NULL
};
if
(
num
==
UNDOCK_EVENT
)
sprintf
(
event_string
,
"UNDOCK"
);
else
sprintf
(
event_string
,
"DOCK"
);
/*
* Indicate that the status of the dock station has
* changed.
*/
kobject_uevent
(
&
dev
->
kobj
,
KOBJ_CHANGE
);
kobject_uevent
_env
(
&
dev
->
kobj
,
KOBJ_CHANGE
,
envp
);
}
/**
...
...
@@ -380,12 +396,11 @@ static void handle_dock(struct dock_station *ds, int dock)
union
acpi_object
arg
;
struct
acpi_buffer
buffer
=
{
ACPI_ALLOCATE_BUFFER
,
NULL
};
struct
acpi_buffer
name_buffer
=
{
ACPI_ALLOCATE_BUFFER
,
NULL
};
union
acpi_object
*
obj
;
acpi_get_name
(
ds
->
handle
,
ACPI_FULL_PATHNAME
,
&
name_buffer
);
obj
=
name_buffer
.
pointer
;
printk
(
KERN_INFO
PREFIX
"%s
\n
"
,
dock
?
"docking"
:
"undocking"
);
printk
(
KERN_INFO
PREFIX
"%s - %s
\n
"
,
(
char
*
)
name_buffer
.
pointer
,
dock
?
"docking"
:
"undocking"
);
/* _DCK method has one argument */
arg_list
.
count
=
1
;
...
...
@@ -394,7 +409,8 @@ static void handle_dock(struct dock_station *ds, int dock)
arg
.
integer
.
value
=
dock
;
status
=
acpi_evaluate_object
(
ds
->
handle
,
"_DCK"
,
&
arg_list
,
&
buffer
);
if
(
ACPI_FAILURE
(
status
))
pr_debug
(
"%s: failed to execute _DCK
\n
"
,
obj
->
string
.
pointer
);
printk
(
KERN_ERR
PREFIX
"%s - failed to execute _DCK
\n
"
,
(
char
*
)
name_buffer
.
pointer
);
kfree
(
buffer
.
pointer
);
kfree
(
name_buffer
.
pointer
);
}
...
...
@@ -420,6 +436,16 @@ static inline void complete_dock(struct dock_station *ds)
ds
->
last_dock_time
=
jiffies
;
}
static
inline
void
begin_undock
(
struct
dock_station
*
ds
)
{
ds
->
flags
|=
DOCK_UNDOCKING
;
}
static
inline
void
complete_undock
(
struct
dock_station
*
ds
)
{
ds
->
flags
&=
~
(
DOCK_UNDOCKING
);
}
/**
* dock_in_progress - see if we are in the middle of handling a dock event
* @ds: the dock station
...
...
@@ -550,7 +576,7 @@ static int handle_eject_request(struct dock_station *ds, u32 event)
printk
(
KERN_ERR
PREFIX
"Unable to undock!
\n
"
);
return
-
EBUSY
;
}
complete_undock
(
ds
);
return
0
;
}
...
...
@@ -594,7 +620,11 @@ static void dock_notify(acpi_handle handle, u32 event, void *data)
* to the driver who wish to hotplug.
*/
case
ACPI_NOTIFY_EJECT_REQUEST
:
handle_eject_request
(
ds
,
event
);
begin_undock
(
ds
);
if
(
immediate_undock
)
handle_eject_request
(
ds
,
event
);
else
dock_event
(
ds
,
event
,
UNDOCK_EVENT
);
break
;
default:
printk
(
KERN_ERR
PREFIX
"Unknown dock event %d
\n
"
,
event
);
...
...
@@ -652,6 +682,17 @@ static ssize_t show_docked(struct device *dev,
}
DEVICE_ATTR
(
docked
,
S_IRUGO
,
show_docked
,
NULL
);
/*
* show_flags - read method for flags file in sysfs
*/
static
ssize_t
show_flags
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
char
*
buf
)
{
return
snprintf
(
buf
,
PAGE_SIZE
,
"%d
\n
"
,
dock_station
->
flags
);
}
DEVICE_ATTR
(
flags
,
S_IRUGO
,
show_flags
,
NULL
);
/*
* write_undock - write method for "undock" file in sysfs
*/
...
...
@@ -675,16 +716,15 @@ static ssize_t show_dock_uid(struct device *dev,
struct
device_attribute
*
attr
,
char
*
buf
)
{
unsigned
long
lbuf
;
acpi_status
status
=
acpi_evaluate_integer
(
dock_station
->
handle
,
"_UID"
,
NULL
,
&
lbuf
);
if
(
ACPI_FAILURE
(
status
))
{
acpi_status
status
=
acpi_evaluate_integer
(
dock_station
->
handle
,
"_UID"
,
NULL
,
&
lbuf
);
if
(
ACPI_FAILURE
(
status
))
return
0
;
}
return
snprintf
(
buf
,
PAGE_SIZE
,
"%lx
\n
"
,
lbuf
);
}
DEVICE_ATTR
(
uid
,
S_IRUGO
,
show_dock_uid
,
NULL
);
/**
* dock_add - add a new dock station
* @handle: the dock station handle
...
...
@@ -711,33 +751,53 @@ static int dock_add(acpi_handle handle)
ATOMIC_INIT_NOTIFIER_HEAD
(
&
dock_notifier_list
);
/* initialize platform device stuff */
dock_device
.
name
=
dock_device_name
;
ret
=
platform_device_register
(
&
dock_device
);
dock_device
=
platform_device_register_simple
(
dock_device_name
,
0
,
NULL
,
0
);
if
(
IS_ERR
(
dock_device
))
{
kfree
(
dock_station
);
dock_station
=
NULL
;
return
PTR_ERR
(
dock_device
);
}
/* we want the dock device to send uevents */
dock_device
->
dev
.
uevent_suppress
=
0
;
ret
=
device_create_file
(
&
dock_device
->
dev
,
&
dev_attr_docked
);
if
(
ret
)
{
printk
(
KERN_ERR
PREFIX
"Error %d registering dock device
\n
"
,
ret
);
printk
(
"Error %d adding sysfs file
\n
"
,
ret
);
platform_device_unregister
(
dock_device
);
kfree
(
dock_station
);
dock_station
=
NULL
;
return
ret
;
}
ret
=
device_create_file
(
&
dock_device
.
dev
,
&
dev_attr_docked
);
ret
=
device_create_file
(
&
dock_device
->
dev
,
&
dev_attr_undock
);
if
(
ret
)
{
printk
(
"Error %d adding sysfs file
\n
"
,
ret
);
platform_device_unregister
(
&
dock_device
);
device_remove_file
(
&
dock_device
->
dev
,
&
dev_attr_docked
);
platform_device_unregister
(
dock_device
);
kfree
(
dock_station
);
dock_station
=
NULL
;
return
ret
;
}
ret
=
device_create_file
(
&
dock_device
.
dev
,
&
dev_attr_undock
);
ret
=
device_create_file
(
&
dock_device
->
dev
,
&
dev_attr_uid
);
if
(
ret
)
{
printk
(
"Error %d adding sysfs file
\n
"
,
ret
);
device_remove_file
(
&
dock_device
.
dev
,
&
dev_attr_docked
);
platform_device_unregister
(
&
dock_device
);
device_remove_file
(
&
dock_device
->
dev
,
&
dev_attr_docked
);
device_remove_file
(
&
dock_device
->
dev
,
&
dev_attr_undock
);
platform_device_unregister
(
dock_device
);
kfree
(
dock_station
);
dock_station
=
NULL
;
return
ret
;
}
ret
=
device_create_file
(
&
dock_device
.
dev
,
&
dev_attr_uid
);
ret
=
device_create_file
(
&
dock_device
->
dev
,
&
dev_attr_flags
);
if
(
ret
)
{
printk
(
"Error %d adding sysfs file
\n
"
,
ret
);
platform_device_unregister
(
&
dock_device
);
device_remove_file
(
&
dock_device
->
dev
,
&
dev_attr_docked
);
device_remove_file
(
&
dock_device
->
dev
,
&
dev_attr_undock
);
device_remove_file
(
&
dock_device
->
dev
,
&
dev_attr_uid
);
platform_device_unregister
(
dock_device
);
kfree
(
dock_station
);
dock_station
=
NULL
;
return
ret
;
}
...
...
@@ -750,6 +810,7 @@ static int dock_add(acpi_handle handle)
dd
=
alloc_dock_dependent_device
(
handle
);
if
(
!
dd
)
{
kfree
(
dock_station
);
dock_station
=
NULL
;
ret
=
-
ENOMEM
;
goto
dock_add_err_unregister
;
}
...
...
@@ -773,10 +834,13 @@ static int dock_add(acpi_handle handle)
dock_add_err:
kfree
(
dd
);
dock_add_err_unregister:
device_remove_file
(
&
dock_device
.
dev
,
&
dev_attr_docked
);
device_remove_file
(
&
dock_device
.
dev
,
&
dev_attr_undock
);
platform_device_unregister
(
&
dock_device
);
device_remove_file
(
&
dock_device
->
dev
,
&
dev_attr_docked
);
device_remove_file
(
&
dock_device
->
dev
,
&
dev_attr_undock
);
device_remove_file
(
&
dock_device
->
dev
,
&
dev_attr_uid
);
device_remove_file
(
&
dock_device
->
dev
,
&
dev_attr_flags
);
platform_device_unregister
(
dock_device
);
kfree
(
dock_station
);
dock_station
=
NULL
;
return
ret
;
}
...
...
@@ -804,12 +868,15 @@ static int dock_remove(void)
printk
(
KERN_ERR
"Error removing notify handler
\n
"
);
/* cleanup sysfs */
device_remove_file
(
&
dock_device
.
dev
,
&
dev_attr_docked
);
device_remove_file
(
&
dock_device
.
dev
,
&
dev_attr_undock
);
platform_device_unregister
(
&
dock_device
);
device_remove_file
(
&
dock_device
->
dev
,
&
dev_attr_docked
);
device_remove_file
(
&
dock_device
->
dev
,
&
dev_attr_undock
);
device_remove_file
(
&
dock_device
->
dev
,
&
dev_attr_uid
);
device_remove_file
(
&
dock_device
->
dev
,
&
dev_attr_flags
);
platform_device_unregister
(
dock_device
);
/* free dock station memory */
kfree
(
dock_station
);
dock_station
=
NULL
;
return
0
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment