Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
1162cf6b
Commit
1162cf6b
authored
Apr 24, 2009
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'bjorn.button' into release
parents
5f855a8f
d68b597c
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
44 additions
and
96 deletions
+44
-96
drivers/acpi/button.c
drivers/acpi/button.c
+44
-96
No files found.
drivers/acpi/button.c
View file @
1162cf6b
/*
*
acpi_button.c - ACPI Button Driver ($Revision: 30 $)
*
button.c - ACPI Button Driver
*
* Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
* Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
...
...
@@ -41,17 +41,13 @@
#define ACPI_BUTTON_SUBCLASS_POWER "power"
#define ACPI_BUTTON_HID_POWER "PNP0C0C"
#define ACPI_BUTTON_DEVICE_NAME_POWER "Power Button (CM)"
#define ACPI_BUTTON_DEVICE_NAME_POWERF "Power Button (FF)"
#define ACPI_BUTTON_DEVICE_NAME_POWER "Power Button"
#define ACPI_BUTTON_TYPE_POWER 0x01
#define ACPI_BUTTON_TYPE_POWERF 0x02
#define ACPI_BUTTON_SUBCLASS_SLEEP "sleep"
#define ACPI_BUTTON_HID_SLEEP "PNP0C0E"
#define ACPI_BUTTON_DEVICE_NAME_SLEEP "Sleep Button (CM)"
#define ACPI_BUTTON_DEVICE_NAME_SLEEPF "Sleep Button (FF)"
#define ACPI_BUTTON_DEVICE_NAME_SLEEP "Sleep Button"
#define ACPI_BUTTON_TYPE_SLEEP 0x03
#define ACPI_BUTTON_TYPE_SLEEPF 0x04
#define ACPI_BUTTON_SUBCLASS_LID "lid"
#define ACPI_BUTTON_HID_LID "PNP0C0D"
...
...
@@ -95,7 +91,6 @@ static struct acpi_driver acpi_button_driver = {
};
struct
acpi_button
{
struct
acpi_device
*
device
;
/* Fixed button kludge */
unsigned
int
type
;
struct
input_dev
*
input
;
char
phys
[
32
];
/* for input device */
...
...
@@ -126,14 +121,10 @@ static struct proc_dir_entry *acpi_button_dir;
static
int
acpi_button_info_seq_show
(
struct
seq_file
*
seq
,
void
*
offset
)
{
struct
acpi_button
*
button
=
seq
->
private
;
if
(
!
button
||
!
button
->
device
)
return
0
;
struct
acpi_device
*
device
=
seq
->
private
;
seq_printf
(
seq
,
"type: %s
\n
"
,
acpi_device_name
(
button
->
device
));
acpi_device_name
(
device
));
return
0
;
}
...
...
@@ -144,14 +135,11 @@ static int acpi_button_info_open_fs(struct inode *inode, struct file *file)
static
int
acpi_button_state_seq_show
(
struct
seq_file
*
seq
,
void
*
offset
)
{
struct
acpi_
button
*
button
=
seq
->
private
;
struct
acpi_
device
*
device
=
seq
->
private
;
acpi_status
status
;
unsigned
long
long
state
;
if
(
!
button
||
!
button
->
device
)
return
0
;
status
=
acpi_evaluate_integer
(
button
->
device
->
handle
,
"_LID"
,
NULL
,
&
state
);
status
=
acpi_evaluate_integer
(
device
->
handle
,
"_LID"
,
NULL
,
&
state
);
seq_printf
(
seq
,
"state: %s
\n
"
,
ACPI_FAILURE
(
status
)
?
"unsupported"
:
(
state
?
"open"
:
"closed"
));
...
...
@@ -169,24 +157,17 @@ static struct proc_dir_entry *acpi_lid_dir;
static
int
acpi_button_add_fs
(
struct
acpi_device
*
device
)
{
struct
acpi_button
*
button
=
acpi_driver_data
(
device
);
struct
proc_dir_entry
*
entry
=
NULL
;
struct
acpi_button
*
button
;
if
(
!
device
||
!
acpi_driver_data
(
device
))
return
-
EINVAL
;
button
=
acpi_driver_data
(
device
);
switch
(
button
->
type
)
{
case
ACPI_BUTTON_TYPE_POWER
:
case
ACPI_BUTTON_TYPE_POWERF
:
if
(
!
acpi_power_dir
)
acpi_power_dir
=
proc_mkdir
(
ACPI_BUTTON_SUBCLASS_POWER
,
acpi_button_dir
);
entry
=
acpi_power_dir
;
break
;
case
ACPI_BUTTON_TYPE_SLEEP
:
case
ACPI_BUTTON_TYPE_SLEEPF
:
if
(
!
acpi_sleep_dir
)
acpi_sleep_dir
=
proc_mkdir
(
ACPI_BUTTON_SUBCLASS_SLEEP
,
acpi_button_dir
);
...
...
@@ -210,8 +191,7 @@ static int acpi_button_add_fs(struct acpi_device *device)
/* 'info' [R] */
entry
=
proc_create_data
(
ACPI_BUTTON_FILE_INFO
,
S_IRUGO
,
acpi_device_dir
(
device
),
&
acpi_button_info_fops
,
acpi_driver_data
(
device
));
&
acpi_button_info_fops
,
device
);
if
(
!
entry
)
return
-
ENODEV
;
...
...
@@ -219,8 +199,7 @@ static int acpi_button_add_fs(struct acpi_device *device)
if
(
button
->
type
==
ACPI_BUTTON_TYPE_LID
)
{
entry
=
proc_create_data
(
ACPI_BUTTON_FILE_STATE
,
S_IRUGO
,
acpi_device_dir
(
device
),
&
acpi_button_state_fops
,
acpi_driver_data
(
device
));
&
acpi_button_state_fops
,
device
);
if
(
!
entry
)
return
-
ENODEV
;
}
...
...
@@ -250,15 +229,16 @@ static int acpi_button_remove_fs(struct acpi_device *device)
/* --------------------------------------------------------------------------
Driver Interface
-------------------------------------------------------------------------- */
static
int
acpi_lid_send_state
(
struct
acpi_
button
*
button
)
static
int
acpi_lid_send_state
(
struct
acpi_
device
*
device
)
{
struct
acpi_button
*
button
=
acpi_driver_data
(
device
);
unsigned
long
long
state
;
acpi_status
status
;
status
=
acpi_evaluate_integer
(
button
->
device
->
handle
,
"_LID"
,
NULL
,
&
state
);
status
=
acpi_evaluate_integer
(
device
->
handle
,
"_LID"
,
NULL
,
&
state
);
if
(
ACPI_FAILURE
(
status
))
return
-
ENODEV
;
/* input layer checks if event is redundant */
input_report_switch
(
button
->
input
,
SW_LID
,
!
state
);
input_sync
(
button
->
input
);
...
...
@@ -270,9 +250,6 @@ static void acpi_button_notify(struct acpi_device *device, u32 event)
struct
acpi_button
*
button
=
acpi_driver_data
(
device
);
struct
input_dev
*
input
;
if
(
!
button
||
!
button
->
device
)
return
;
switch
(
event
)
{
case
ACPI_FIXED_HARDWARE_EVENT
:
event
=
ACPI_BUTTON_NOTIFY_STATUS
;
...
...
@@ -280,7 +257,7 @@ static void acpi_button_notify(struct acpi_device *device, u32 event)
case
ACPI_BUTTON_NOTIFY_STATUS
:
input
=
button
->
input
;
if
(
button
->
type
==
ACPI_BUTTON_TYPE_LID
)
{
acpi_lid_send_state
(
button
);
acpi_lid_send_state
(
device
);
}
else
{
int
keycode
=
test_bit
(
KEY_SLEEP
,
input
->
keybit
)
?
KEY_SLEEP
:
KEY_POWER
;
...
...
@@ -291,43 +268,35 @@ static void acpi_button_notify(struct acpi_device *device, u32 event)
input_sync
(
input
);
}
acpi_bus_generate_proc_event
(
button
->
device
,
event
,
++
button
->
pushed
);
acpi_bus_generate_proc_event
(
device
,
event
,
++
button
->
pushed
);
break
;
default:
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Unsupported event [0x%x]
\n
"
,
event
));
break
;
}
return
;
}
static
int
acpi_button_resume
(
struct
acpi_device
*
device
)
{
struct
acpi_button
*
button
;
if
(
!
device
)
return
-
EINVAL
;
button
=
acpi_driver_data
(
device
);
if
(
button
&&
button
->
type
==
ACPI_BUTTON_TYPE_LID
)
return
acpi_lid_send_state
(
button
);
struct
acpi_button
*
button
=
acpi_driver_data
(
device
);
if
(
button
->
type
==
ACPI_BUTTON_TYPE_LID
)
return
acpi_lid_send_state
(
device
);
return
0
;
}
static
int
acpi_button_add
(
struct
acpi_device
*
device
)
{
int
error
;
struct
acpi_button
*
button
;
struct
input_dev
*
input
;
if
(
!
device
)
return
-
EINVAL
;
char
*
hid
,
*
name
,
*
class
;
int
error
;
button
=
kzalloc
(
sizeof
(
struct
acpi_button
),
GFP_KERNEL
);
if
(
!
button
)
return
-
ENOMEM
;
button
->
device
=
device
;
device
->
driver_data
=
button
;
button
->
input
=
input
=
input_allocate_device
();
...
...
@@ -336,40 +305,29 @@ static int acpi_button_add(struct acpi_device *device)
goto
err_free_button
;
}
/*
* Determine the button type (via hid), as fixed-feature buttons
* need to be handled a bit differently than generic-space.
*/
if
(
!
strcmp
(
acpi_device_hid
(
device
),
ACPI_BUTTON_HID_POWER
))
{
hid
=
acpi_device_hid
(
device
);
name
=
acpi_device_name
(
device
);
class
=
acpi_device_class
(
device
);
if
(
!
strcmp
(
hid
,
ACPI_BUTTON_HID_POWER
)
||
!
strcmp
(
hid
,
ACPI_BUTTON_HID_POWERF
))
{
button
->
type
=
ACPI_BUTTON_TYPE_POWER
;
strcpy
(
acpi_device_name
(
device
),
ACPI_BUTTON_DEVICE_NAME_POWER
);
sprintf
(
acpi_device_class
(
device
),
"%s/%s"
,
ACPI_BUTTON_CLASS
,
ACPI_BUTTON_SUBCLASS_POWER
);
}
else
if
(
!
strcmp
(
acpi_device_hid
(
device
),
ACPI_BUTTON_HID_POWERF
))
{
button
->
type
=
ACPI_BUTTON_TYPE_POWERF
;
strcpy
(
acpi_device_name
(
device
),
ACPI_BUTTON_DEVICE_NAME_POWERF
);
sprintf
(
acpi_device_class
(
device
),
"%s/%s"
,
strcpy
(
name
,
ACPI_BUTTON_DEVICE_NAME_POWER
);
sprintf
(
class
,
"%s/%s"
,
ACPI_BUTTON_CLASS
,
ACPI_BUTTON_SUBCLASS_POWER
);
}
else
if
(
!
strcmp
(
acpi_device_hid
(
device
),
ACPI_BUTTON_HID_SLEEP
))
{
}
else
if
(
!
strcmp
(
hid
,
ACPI_BUTTON_HID_SLEEP
)
||
!
strcmp
(
hid
,
ACPI_BUTTON_HID_SLEEPF
))
{
button
->
type
=
ACPI_BUTTON_TYPE_SLEEP
;
strcpy
(
acpi_device_name
(
device
),
ACPI_BUTTON_DEVICE_NAME_SLEEP
);
sprintf
(
acpi_device_class
(
device
),
"%s/%s"
,
ACPI_BUTTON_CLASS
,
ACPI_BUTTON_SUBCLASS_SLEEP
);
}
else
if
(
!
strcmp
(
acpi_device_hid
(
device
),
ACPI_BUTTON_HID_SLEEPF
))
{
button
->
type
=
ACPI_BUTTON_TYPE_SLEEPF
;
strcpy
(
acpi_device_name
(
device
),
ACPI_BUTTON_DEVICE_NAME_SLEEPF
);
sprintf
(
acpi_device_class
(
device
),
"%s/%s"
,
strcpy
(
name
,
ACPI_BUTTON_DEVICE_NAME_SLEEP
);
sprintf
(
class
,
"%s/%s"
,
ACPI_BUTTON_CLASS
,
ACPI_BUTTON_SUBCLASS_SLEEP
);
}
else
if
(
!
strcmp
(
acpi_device_hid
(
device
)
,
ACPI_BUTTON_HID_LID
))
{
}
else
if
(
!
strcmp
(
hid
,
ACPI_BUTTON_HID_LID
))
{
button
->
type
=
ACPI_BUTTON_TYPE_LID
;
strcpy
(
acpi_device_name
(
device
)
,
ACPI_BUTTON_DEVICE_NAME_LID
);
sprintf
(
acpi_device_class
(
device
)
,
"%s/%s"
,
strcpy
(
name
,
ACPI_BUTTON_DEVICE_NAME_LID
);
sprintf
(
class
,
"%s/%s"
,
ACPI_BUTTON_CLASS
,
ACPI_BUTTON_SUBCLASS_LID
);
}
else
{
printk
(
KERN_ERR
PREFIX
"Unsupported hid [%s]
\n
"
,
acpi_device_hid
(
device
));
printk
(
KERN_ERR
PREFIX
"Unsupported hid [%s]
\n
"
,
hid
);
error
=
-
ENODEV
;
goto
err_free_input
;
}
...
...
@@ -378,10 +336,9 @@ static int acpi_button_add(struct acpi_device *device)
if
(
error
)
goto
err_free_input
;
snprintf
(
button
->
phys
,
sizeof
(
button
->
phys
),
"%s/button/input0"
,
acpi_device_hid
(
device
));
snprintf
(
button
->
phys
,
sizeof
(
button
->
phys
),
"%s/button/input0"
,
hid
);
input
->
name
=
acpi_device_name
(
device
)
;
input
->
name
=
name
;
input
->
phys
=
button
->
phys
;
input
->
id
.
bustype
=
BUS_HOST
;
input
->
id
.
product
=
button
->
type
;
...
...
@@ -389,13 +346,11 @@ static int acpi_button_add(struct acpi_device *device)
switch
(
button
->
type
)
{
case
ACPI_BUTTON_TYPE_POWER
:
case
ACPI_BUTTON_TYPE_POWERF
:
input
->
evbit
[
0
]
=
BIT_MASK
(
EV_KEY
);
set_bit
(
KEY_POWER
,
input
->
keybit
);
break
;
case
ACPI_BUTTON_TYPE_SLEEP
:
case
ACPI_BUTTON_TYPE_SLEEPF
:
input
->
evbit
[
0
]
=
BIT_MASK
(
EV_KEY
);
set_bit
(
KEY_SLEEP
,
input
->
keybit
);
break
;
...
...
@@ -410,7 +365,7 @@ static int acpi_button_add(struct acpi_device *device)
if
(
error
)
goto
err_remove_fs
;
if
(
button
->
type
==
ACPI_BUTTON_TYPE_LID
)
acpi_lid_send_state
(
button
);
acpi_lid_send_state
(
device
);
if
(
device
->
wakeup
.
flags
.
valid
)
{
/* Button's GPE is run-wake GPE */
...
...
@@ -422,9 +377,7 @@ static int acpi_button_add(struct acpi_device *device)
device
->
wakeup
.
state
.
enabled
=
1
;
}
printk
(
KERN_INFO
PREFIX
"%s [%s]
\n
"
,
acpi_device_name
(
device
),
acpi_device_bid
(
device
));
printk
(
KERN_INFO
PREFIX
"%s [%s]
\n
"
,
name
,
acpi_device_bid
(
device
));
return
0
;
err_remove_fs:
...
...
@@ -438,17 +391,11 @@ static int acpi_button_add(struct acpi_device *device)
static
int
acpi_button_remove
(
struct
acpi_device
*
device
,
int
type
)
{
struct
acpi_button
*
button
;
if
(
!
device
||
!
acpi_driver_data
(
device
))
return
-
EINVAL
;
button
=
acpi_driver_data
(
device
);
struct
acpi_button
*
button
=
acpi_driver_data
(
device
);
acpi_button_remove_fs
(
device
);
input_unregister_device
(
button
->
input
);
kfree
(
button
);
return
0
;
}
...
...
@@ -459,6 +406,7 @@ static int __init acpi_button_init(void)
acpi_button_dir
=
proc_mkdir
(
ACPI_BUTTON_CLASS
,
acpi_root_dir
);
if
(
!
acpi_button_dir
)
return
-
ENODEV
;
result
=
acpi_bus_register_driver
(
&
acpi_button_driver
);
if
(
result
<
0
)
{
remove_proc_entry
(
ACPI_BUTTON_CLASS
,
acpi_root_dir
);
...
...
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