Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
gsplhtlxg
clone-Linux
提交
2e33b234
C
clone-Linux
项目概览
gsplhtlxg
/
clone-Linux
通知
2
Star
0
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
clone-Linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2e33b234
编写于
4月 05, 2009
作者:
L
Len Brown
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'dell-wmi' into release
上级
e2fae0ab
0b3f6109
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
226 addition
and
0 deletion
+226
-0
MAINTAINERS
MAINTAINERS
+5
-0
drivers/platform/x86/Kconfig
drivers/platform/x86/Kconfig
+10
-0
drivers/platform/x86/Makefile
drivers/platform/x86/Makefile
+1
-0
drivers/platform/x86/dell-wmi.c
drivers/platform/x86/dell-wmi.c
+210
-0
未找到文件。
MAINTAINERS
浏览文件 @
2e33b234
...
...
@@ -1393,6 +1393,11 @@ P: Doug Warzecha
M: Douglas_Warzecha@dell.com
S: Maintained
DELL WMI EXTRAS DRIVER
P: Matthew Garrett
M: mjg59@srcf.ucam.org
S: Maintained
DEVICE NUMBER REGISTRY
P: Torben Mathiasen
M: device@lanana.org
...
...
drivers/platform/x86/Kconfig
浏览文件 @
2e33b234
...
...
@@ -67,6 +67,16 @@ config DELL_LAPTOP
This driver adds support for rfkill and backlight control to Dell
laptops.
config DELL_WMI
tristate "Dell WMI extras"
depends on ACPI_WMI
depends on INPUT
---help---
Say Y here if you want to support WMI-based hotkeys on Dell laptops.
To compile this driver as a module, choose M here: the module will
be called dell-wmi.
config FUJITSU_LAPTOP
tristate "Fujitsu Laptop Extras"
depends on ACPI
...
...
drivers/platform/x86/Makefile
浏览文件 @
2e33b234
...
...
@@ -7,6 +7,7 @@ obj-$(CONFIG_EEEPC_LAPTOP) += eeepc-laptop.o
obj-$(CONFIG_MSI_LAPTOP)
+=
msi-laptop.o
obj-$(CONFIG_COMPAL_LAPTOP)
+=
compal-laptop.o
obj-$(CONFIG_DELL_LAPTOP)
+=
dell-laptop.o
obj-$(CONFIG_DELL_WMI)
+=
dell-wmi.o
obj-$(CONFIG_ACER_WMI)
+=
acer-wmi.o
obj-$(CONFIG_HP_WMI)
+=
hp-wmi.o
obj-$(CONFIG_TC1100_WMI)
+=
tc1100-wmi.o
...
...
drivers/platform/x86/dell-wmi.c
0 → 100644
浏览文件 @
2e33b234
/*
* Dell WMI hotkeys
*
* Copyright (C) 2008 Red Hat <mjg@redhat.com>
*
* Portions based on wistron_btns.c:
* Copyright (C) 2005 Miloslav Trmac <mitr@volny.cz>
* Copyright (C) 2005 Bernhard Rosenkraenzer <bero@arklinux.org>
* Copyright (C) 2005 Dmitry Torokhov <dtor@mail.ru>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/input.h>
#include <acpi/acpi_drivers.h>
#include <linux/acpi.h>
#include <linux/string.h>
MODULE_AUTHOR
(
"Matthew Garrett <mjg@redhat.com>"
);
MODULE_DESCRIPTION
(
"Dell laptop WMI hotkeys driver"
);
MODULE_LICENSE
(
"GPL"
);
#define DELL_EVENT_GUID "9DBB5994-A997-11DA-B012-B622A1EF5492"
MODULE_ALIAS
(
"wmi:"
DELL_EVENT_GUID
);
struct
key_entry
{
char
type
;
/* See KE_* below */
u16
code
;
u16
keycode
;
};
enum
{
KE_KEY
,
KE_SW
,
KE_END
};
static
struct
key_entry
dell_wmi_keymap
[]
=
{
{
KE_KEY
,
0xe045
,
KEY_PROG1
},
{
KE_END
,
0
}
};
static
struct
input_dev
*
dell_wmi_input_dev
;
static
struct
key_entry
*
dell_wmi_get_entry_by_scancode
(
int
code
)
{
struct
key_entry
*
key
;
for
(
key
=
dell_wmi_keymap
;
key
->
type
!=
KE_END
;
key
++
)
if
(
code
==
key
->
code
)
return
key
;
return
NULL
;
}
static
struct
key_entry
*
dell_wmi_get_entry_by_keycode
(
int
keycode
)
{
struct
key_entry
*
key
;
for
(
key
=
dell_wmi_keymap
;
key
->
type
!=
KE_END
;
key
++
)
if
(
key
->
type
==
KE_KEY
&&
keycode
==
key
->
keycode
)
return
key
;
return
NULL
;
}
static
int
dell_wmi_getkeycode
(
struct
input_dev
*
dev
,
int
scancode
,
int
*
keycode
)
{
struct
key_entry
*
key
=
dell_wmi_get_entry_by_scancode
(
scancode
);
if
(
key
&&
key
->
type
==
KE_KEY
)
{
*
keycode
=
key
->
keycode
;
return
0
;
}
return
-
EINVAL
;
}
static
int
dell_wmi_setkeycode
(
struct
input_dev
*
dev
,
int
scancode
,
int
keycode
)
{
struct
key_entry
*
key
;
int
old_keycode
;
if
(
keycode
<
0
||
keycode
>
KEY_MAX
)
return
-
EINVAL
;
key
=
dell_wmi_get_entry_by_scancode
(
scancode
);
if
(
key
&&
key
->
type
==
KE_KEY
)
{
old_keycode
=
key
->
keycode
;
key
->
keycode
=
keycode
;
set_bit
(
keycode
,
dev
->
keybit
);
if
(
!
dell_wmi_get_entry_by_keycode
(
old_keycode
))
clear_bit
(
old_keycode
,
dev
->
keybit
);
return
0
;
}
return
-
EINVAL
;
}
static
void
dell_wmi_notify
(
u32
value
,
void
*
context
)
{
struct
acpi_buffer
response
=
{
ACPI_ALLOCATE_BUFFER
,
NULL
};
static
struct
key_entry
*
key
;
union
acpi_object
*
obj
;
wmi_get_event_data
(
value
,
&
response
);
obj
=
(
union
acpi_object
*
)
response
.
pointer
;
if
(
obj
&&
obj
->
type
==
ACPI_TYPE_BUFFER
)
{
int
*
buffer
=
(
int
*
)
obj
->
buffer
.
pointer
;
key
=
dell_wmi_get_entry_by_scancode
(
buffer
[
1
]);
if
(
key
)
{
input_report_key
(
dell_wmi_input_dev
,
key
->
keycode
,
1
);
input_sync
(
dell_wmi_input_dev
);
input_report_key
(
dell_wmi_input_dev
,
key
->
keycode
,
0
);
input_sync
(
dell_wmi_input_dev
);
}
else
printk
(
KERN_INFO
"dell-wmi: Unknown key %x pressed
\n
"
,
buffer
[
1
]);
}
}
static
int
__init
dell_wmi_input_setup
(
void
)
{
struct
key_entry
*
key
;
int
err
;
dell_wmi_input_dev
=
input_allocate_device
();
if
(
!
dell_wmi_input_dev
)
return
-
ENOMEM
;
dell_wmi_input_dev
->
name
=
"Dell WMI hotkeys"
;
dell_wmi_input_dev
->
phys
=
"wmi/input0"
;
dell_wmi_input_dev
->
id
.
bustype
=
BUS_HOST
;
dell_wmi_input_dev
->
getkeycode
=
dell_wmi_getkeycode
;
dell_wmi_input_dev
->
setkeycode
=
dell_wmi_setkeycode
;
for
(
key
=
dell_wmi_keymap
;
key
->
type
!=
KE_END
;
key
++
)
{
switch
(
key
->
type
)
{
case
KE_KEY
:
set_bit
(
EV_KEY
,
dell_wmi_input_dev
->
evbit
);
set_bit
(
key
->
keycode
,
dell_wmi_input_dev
->
keybit
);
break
;
case
KE_SW
:
set_bit
(
EV_SW
,
dell_wmi_input_dev
->
evbit
);
set_bit
(
key
->
keycode
,
dell_wmi_input_dev
->
swbit
);
break
;
}
}
err
=
input_register_device
(
dell_wmi_input_dev
);
if
(
err
)
{
input_free_device
(
dell_wmi_input_dev
);
return
err
;
}
return
0
;
}
static
int
__init
dell_wmi_init
(
void
)
{
int
err
;
if
(
wmi_has_guid
(
DELL_EVENT_GUID
))
{
err
=
dell_wmi_input_setup
();
if
(
err
)
return
err
;
err
=
wmi_install_notify_handler
(
DELL_EVENT_GUID
,
dell_wmi_notify
,
NULL
);
if
(
err
)
{
input_unregister_device
(
dell_wmi_input_dev
);
printk
(
KERN_ERR
"dell-wmi: Unable to register"
" notify handler - %d
\n
"
,
err
);
return
err
;
}
}
else
printk
(
KERN_WARNING
"dell-wmi: No known WMI GUID found
\n
"
);
return
0
;
}
static
void
__exit
dell_wmi_exit
(
void
)
{
if
(
wmi_has_guid
(
DELL_EVENT_GUID
))
{
wmi_remove_notify_handler
(
DELL_EVENT_GUID
);
input_unregister_device
(
dell_wmi_input_dev
);
}
}
module_init
(
dell_wmi_init
);
module_exit
(
dell_wmi_exit
);
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录