Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
07176b98
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
07176b98
编写于
9月 06, 2013
作者:
D
Dmitry Torokhov
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'next' into for-linus
Merge first round of changes for 3.12 merge window.
上级
fa46c798
52764fed
变更
33
隐藏空白更改
内联
并排
Showing
33 changed file
with
770 addition
and
321 deletion
+770
-321
Documentation/devicetree/bindings/input/input-reset.txt
Documentation/devicetree/bindings/input/input-reset.txt
+33
-0
Documentation/devicetree/bindings/input/touchscreen/egalax-ts.txt
...ation/devicetree/bindings/input/touchscreen/egalax-ts.txt
+1
-1
MAINTAINERS
MAINTAINERS
+9
-2
drivers/input/joystick/as5011.c
drivers/input/joystick/as5011.c
+2
-1
drivers/input/joystick/maplecontrol.c
drivers/input/joystick/maplecontrol.c
+2
-2
drivers/input/keyboard/imx_keypad.c
drivers/input/keyboard/imx_keypad.c
+1
-6
drivers/input/keyboard/max7359_keypad.c
drivers/input/keyboard/max7359_keypad.c
+1
-1
drivers/input/keyboard/nspire-keypad.c
drivers/input/keyboard/nspire-keypad.c
+1
-6
drivers/input/keyboard/omap4-keypad.c
drivers/input/keyboard/omap4-keypad.c
+71
-24
drivers/input/keyboard/qt1070.c
drivers/input/keyboard/qt1070.c
+27
-0
drivers/input/keyboard/spear-keyboard.c
drivers/input/keyboard/spear-keyboard.c
+1
-6
drivers/input/keyboard/tegra-kbc.c
drivers/input/keyboard/tegra-kbc.c
+1
-6
drivers/input/misc/Kconfig
drivers/input/misc/Kconfig
+10
-0
drivers/input/misc/Makefile
drivers/input/misc/Makefile
+1
-0
drivers/input/misc/ideapad_slidebar.c
drivers/input/misc/ideapad_slidebar.c
+358
-0
drivers/input/misc/pwm-beeper.c
drivers/input/misc/pwm-beeper.c
+1
-1
drivers/input/misc/twl6040-vibra.c
drivers/input/misc/twl6040-vibra.c
+15
-26
drivers/input/misc/wistron_btns.c
drivers/input/misc/wistron_btns.c
+3
-3
drivers/input/mouse/lifebook.c
drivers/input/mouse/lifebook.c
+1
-1
drivers/input/mouse/synaptics.c
drivers/input/mouse/synaptics.c
+2
-2
drivers/input/serio/arc_ps2.c
drivers/input/serio/arc_ps2.c
+1
-6
drivers/input/serio/i8042.h
drivers/input/serio/i8042.h
+0
-24
drivers/input/serio/olpc_apsp.c
drivers/input/serio/olpc_apsp.c
+0
-3
drivers/input/tablet/wacom_sys.c
drivers/input/tablet/wacom_sys.c
+42
-45
drivers/input/tablet/wacom_wac.c
drivers/input/tablet/wacom_wac.c
+4
-15
drivers/input/touchscreen/cy8ctmg110_ts.c
drivers/input/touchscreen/cy8ctmg110_ts.c
+2
-4
drivers/input/touchscreen/cyttsp4_core.c
drivers/input/touchscreen/cyttsp4_core.c
+100
-103
drivers/input/touchscreen/eeti_ts.c
drivers/input/touchscreen/eeti_ts.c
+2
-4
drivers/input/touchscreen/htcpen.c
drivers/input/touchscreen/htcpen.c
+1
-1
drivers/input/touchscreen/max11801_ts.c
drivers/input/touchscreen/max11801_ts.c
+9
-28
drivers/tty/sysrq.c
drivers/tty/sysrq.c
+42
-0
include/linux/i8042.h
include/linux/i8042.h
+24
-0
include/uapi/linux/input.h
include/uapi/linux/input.h
+2
-0
未找到文件。
Documentation/devicetree/bindings/input/input-reset.txt
0 → 100644
浏览文件 @
07176b98
Input: sysrq reset sequence
A simple binding to represent a set of keys as described in
include/uapi/linux/input.h. This is to communicate a sequence of keys to the
sysrq driver. Upon holding the keys for a specified amount of time (if
specified) the system is sync'ed and reset.
Key sequences are global to the system but all the keys in a set must be coming
from the same input device.
The /chosen node should contain a 'linux,sysrq-reset-seq' child node to define
a set of keys.
Required property:
sysrq-reset-seq: array of Linux keycodes, one keycode per cell.
Optional property:
timeout-ms: duration keys must be pressed together in milliseconds before
generating a sysrq. If omitted the system is rebooted immediately when a valid
sequence has been recognized.
Example:
chosen {
linux,sysrq-reset-seq {
keyset = <0x03
0x04
0x0a>;
timeout-ms = <3000>;
};
};
Would represent KEY_2, KEY_3 and KEY_9.
Documentation/devicetree/bindings/input/touchscreen/egalax-ts.txt
浏览文件 @
07176b98
...
...
@@ -6,7 +6,7 @@ Required properties:
- interrupt-parent: the phandle for the interrupt controller
- interrupts: touch controller interrupt
- wakeup-gpios: the gpio pin to be used for waking up the controller
a
s well as ua
sed as irq pin
a
nd also u
sed as irq pin
Example:
...
...
MAINTAINERS
浏览文件 @
07176b98
...
...
@@ -2411,9 +2411,9 @@ S: Maintained
F: drivers/media/common/cypress_firmware*
CYTTSP TOUCHSCREEN DRIVER
M:
Javier Martinez Canillas <javier@dowhile0.org
>
M:
Ferruh Yigit <fery@cypress.com
>
L: linux-input@vger.kernel.org
S:
Maintain
ed
S:
Support
ed
F: drivers/input/touchscreen/cyttsp*
F: include/linux/input/cyttsp.h
...
...
@@ -4038,6 +4038,13 @@ W: http://launchpad.net/ideapad-laptop
S: Maintained
F: drivers/platform/x86/ideapad-laptop.c
IDEAPAD LAPTOP SLIDEBAR DRIVER
M: Andrey Moiseev <o2g.org.ru@gmail.com>
L: linux-input@vger.kernel.org
W: https://github.com/o2genum/ideapad-slidebar
S: Maintained
F: drivers/input/misc/ideapad_slidebar.c
IDE/ATAPI DRIVERS
M: Borislav Petkov <bp@alien8.de>
L: linux-ide@vger.kernel.org
...
...
drivers/input/joystick/as5011.c
浏览文件 @
07176b98
...
...
@@ -234,7 +234,7 @@ static int as5011_probe(struct i2c_client *client,
int
irq
;
int
error
;
plat_data
=
client
->
dev
.
platform_data
;
plat_data
=
dev_get_platdata
(
&
client
->
dev
)
;
if
(
!
plat_data
)
return
-
EINVAL
;
...
...
@@ -288,6 +288,7 @@ static int as5011_probe(struct i2c_client *client,
if
(
irq
<
0
)
{
dev_err
(
&
client
->
dev
,
"Failed to get irq number for button gpio
\n
"
);
error
=
irq
;
goto
err_free_button_gpio
;
}
...
...
drivers/input/joystick/maplecontrol.c
浏览文件 @
07176b98
...
...
@@ -61,7 +61,7 @@ static void dc_pad_callback(struct mapleq *mq)
static
int
dc_pad_open
(
struct
input_dev
*
dev
)
{
struct
dc_pad
*
pad
=
dev
->
dev
.
platform_data
;
struct
dc_pad
*
pad
=
dev
_get_platdata
(
&
dev
->
dev
)
;
maple_getcond_callback
(
pad
->
mdev
,
dc_pad_callback
,
HZ
/
20
,
MAPLE_FUNC_CONTROLLER
);
...
...
@@ -71,7 +71,7 @@ static int dc_pad_open(struct input_dev *dev)
static
void
dc_pad_close
(
struct
input_dev
*
dev
)
{
struct
dc_pad
*
pad
=
dev
->
dev
.
platform_data
;
struct
dc_pad
*
pad
=
dev
_get_platdata
(
&
dev
->
dev
)
;
maple_getcond_callback
(
pad
->
mdev
,
dc_pad_callback
,
0
,
MAPLE_FUNC_CONTROLLER
);
...
...
drivers/input/keyboard/imx_keypad.c
浏览文件 @
07176b98
...
...
@@ -442,12 +442,6 @@ static int imx_keypad_probe(struct platform_device *pdev)
return
-
EINVAL
;
}
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
if
(
res
==
NULL
)
{
dev_err
(
&
pdev
->
dev
,
"no I/O memory defined in platform data
\n
"
);
return
-
EINVAL
;
}
input_dev
=
devm_input_allocate_device
(
&
pdev
->
dev
);
if
(
!
input_dev
)
{
dev_err
(
&
pdev
->
dev
,
"failed to allocate the input device
\n
"
);
...
...
@@ -468,6 +462,7 @@ static int imx_keypad_probe(struct platform_device *pdev)
setup_timer
(
&
keypad
->
check_matrix_timer
,
imx_keypad_check_for_events
,
(
unsigned
long
)
keypad
);
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
keypad
->
mmio_base
=
devm_ioremap_resource
(
&
pdev
->
dev
,
res
);
if
(
IS_ERR
(
keypad
->
mmio_base
))
return
PTR_ERR
(
keypad
->
mmio_base
);
...
...
drivers/input/keyboard/max7359_keypad.c
浏览文件 @
07176b98
...
...
@@ -271,7 +271,7 @@ static int max7359_remove(struct i2c_client *client)
return
0
;
}
#ifdef CONFIG_PM
#ifdef CONFIG_PM
_SLEEP
static
int
max7359_suspend
(
struct
device
*
dev
)
{
struct
i2c_client
*
client
=
to_i2c_client
(
dev
);
...
...
drivers/input/keyboard/nspire-keypad.c
浏览文件 @
07176b98
...
...
@@ -171,12 +171,6 @@ static int nspire_keypad_probe(struct platform_device *pdev)
return
-
EINVAL
;
}
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
if
(
!
res
)
{
dev_err
(
&
pdev
->
dev
,
"missing platform resources
\n
"
);
return
-
EINVAL
;
}
keypad
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
struct
nspire_keypad
),
GFP_KERNEL
);
if
(
!
keypad
)
{
...
...
@@ -208,6 +202,7 @@ static int nspire_keypad_probe(struct platform_device *pdev)
return
PTR_ERR
(
keypad
->
clk
);
}
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
keypad
->
reg_base
=
devm_ioremap_resource
(
&
pdev
->
dev
,
res
);
if
(
IS_ERR
(
keypad
->
reg_base
))
return
PTR_ERR
(
keypad
->
reg_base
);
...
...
drivers/input/keyboard/omap4-keypad.c
浏览文件 @
07176b98
...
...
@@ -53,21 +53,17 @@
#define OMAP4_KBD_FULLCODE63_32 0x48
/* OMAP4 bit definitions */
#define OMAP4_DEF_IRQENABLE_EVENTEN (1 << 0)
#define OMAP4_DEF_IRQENABLE_LONGKEY (1 << 1)
#define OMAP4_DEF_IRQENABLE_TIMEOUTEN (1 << 2)
#define OMAP4_DEF_WUP_EVENT_ENA (1 << 0)
#define OMAP4_DEF_WUP_LONG_KEY_ENA (1 << 1)
#define OMAP4_DEF_CTRL_NOSOFTMODE (1 << 1)
#define OMAP4_DEF_CTRLPTVVALUE (1 << 2)
#define OMAP4_DEF_CTRLPTV (1 << 1)
#define OMAP4_DEF_IRQENABLE_EVENTEN BIT(0)
#define OMAP4_DEF_IRQENABLE_LONGKEY BIT(1)
#define OMAP4_DEF_WUP_EVENT_ENA BIT(0)
#define OMAP4_DEF_WUP_LONG_KEY_ENA BIT(1)
#define OMAP4_DEF_CTRL_NOSOFTMODE BIT(1)
#define OMAP4_DEF_CTRL_PTV_SHIFT 2
/* OMAP4 values */
#define OMAP4_VAL_IRQDISABLE 0x00
#define OMAP4_VAL_DEBOUNCINGTIME 0x07
#define OMAP4_VAL_FUNCTIONALCFG 0x1E
#define OMAP4_MASK_IRQSTATUSDISABLE 0xFFFF
#define OMAP4_VAL_IRQDISABLE 0x0
#define OMAP4_VAL_DEBOUNCINGTIME 0x7
#define OMAP4_VAL_PVT 0x7
enum
{
KBD_REVISION_OMAP4
=
0
,
...
...
@@ -78,6 +74,7 @@ struct omap4_keypad {
struct
input_dev
*
input
;
void
__iomem
*
base
;
bool
irq_wake_enabled
;
unsigned
int
irq
;
unsigned
int
rows
;
...
...
@@ -116,8 +113,22 @@ static void kbd_write_irqreg(struct omap4_keypad *keypad_data,
}
/* Interrupt handler */
static
irqreturn_t
omap4_keypad_interrupt
(
int
irq
,
void
*
dev_id
)
/* Interrupt handlers */
static
irqreturn_t
omap4_keypad_irq_handler
(
int
irq
,
void
*
dev_id
)
{
struct
omap4_keypad
*
keypad_data
=
dev_id
;
if
(
kbd_read_irqreg
(
keypad_data
,
OMAP4_KBD_IRQSTATUS
))
{
/* Disable interrupts */
kbd_write_irqreg
(
keypad_data
,
OMAP4_KBD_IRQENABLE
,
OMAP4_VAL_IRQDISABLE
);
return
IRQ_WAKE_THREAD
;
}
return
IRQ_NONE
;
}
static
irqreturn_t
omap4_keypad_irq_thread_fn
(
int
irq
,
void
*
dev_id
)
{
struct
omap4_keypad
*
keypad_data
=
dev_id
;
struct
input_dev
*
input_dev
=
keypad_data
->
input
;
...
...
@@ -125,10 +136,6 @@ static irqreturn_t omap4_keypad_interrupt(int irq, void *dev_id)
unsigned
int
col
,
row
,
code
,
changed
;
u32
*
new_state
=
(
u32
*
)
key_state
;
/* Disable interrupts */
kbd_write_irqreg
(
keypad_data
,
OMAP4_KBD_IRQENABLE
,
OMAP4_VAL_IRQDISABLE
);
*
new_state
=
kbd_readl
(
keypad_data
,
OMAP4_KBD_FULLCODE31_0
);
*
(
new_state
+
1
)
=
kbd_readl
(
keypad_data
,
OMAP4_KBD_FULLCODE63_32
);
...
...
@@ -175,11 +182,13 @@ static int omap4_keypad_open(struct input_dev *input)
disable_irq
(
keypad_data
->
irq
);
kbd_writel
(
keypad_data
,
OMAP4_KBD_CTRL
,
OMAP4_VAL_FUNCTIONALCFG
);
OMAP4_DEF_CTRL_NOSOFTMODE
|
(
OMAP4_VAL_PVT
<<
OMAP4_DEF_CTRL_PTV_SHIFT
));
kbd_writel
(
keypad_data
,
OMAP4_KBD_DEBOUNCINGTIME
,
OMAP4_VAL_DEBOUNCINGTIME
);
/* clear pending interrupts */
kbd_write_irqreg
(
keypad_data
,
OMAP4_KBD_IRQSTATUS
,
OMAP4_VAL_IRQDISABLE
);
kbd_read_irqreg
(
keypad_data
,
OMAP4_KBD_IRQSTATUS
)
);
kbd_write_irqreg
(
keypad_data
,
OMAP4_KBD_IRQENABLE
,
OMAP4_DEF_IRQENABLE_EVENTEN
|
OMAP4_DEF_IRQENABLE_LONGKEY
);
...
...
@@ -363,14 +372,15 @@ static int omap4_keypad_probe(struct platform_device *pdev)
goto
err_free_keymap
;
}
error
=
request_
irq
(
keypad_data
->
irq
,
omap4_keypad_interrupt
,
IRQF_TRIGGER_RISING
,
"omap4-keypad"
,
keypad_data
);
error
=
request_
threaded_irq
(
keypad_data
->
irq
,
omap4_keypad_irq_handler
,
omap4_keypad_irq_thread_fn
,
0
,
"omap4-keypad"
,
keypad_data
);
if
(
error
)
{
dev_err
(
&
pdev
->
dev
,
"failed to register interrupt
\n
"
);
goto
err_free_input
;
}
device_init_wakeup
(
&
pdev
->
dev
,
true
);
pm_runtime_put_sync
(
&
pdev
->
dev
);
error
=
input_register_device
(
keypad_data
->
input
);
...
...
@@ -384,6 +394,7 @@ static int omap4_keypad_probe(struct platform_device *pdev)
err_pm_disable:
pm_runtime_disable
(
&
pdev
->
dev
);
device_init_wakeup
(
&
pdev
->
dev
,
false
);
free_irq
(
keypad_data
->
irq
,
keypad_data
);
err_free_keymap:
kfree
(
keypad_data
->
keymap
);
...
...
@@ -409,6 +420,8 @@ static int omap4_keypad_remove(struct platform_device *pdev)
pm_runtime_disable
(
&
pdev
->
dev
);
device_init_wakeup
(
&
pdev
->
dev
,
false
);
input_unregister_device
(
keypad_data
->
input
);
iounmap
(
keypad_data
->
base
);
...
...
@@ -430,12 +443,46 @@ static const struct of_device_id omap_keypad_dt_match[] = {
MODULE_DEVICE_TABLE
(
of
,
omap_keypad_dt_match
);
#endif
#ifdef CONFIG_PM_SLEEP
static
int
omap4_keypad_suspend
(
struct
device
*
dev
)
{
struct
platform_device
*
pdev
=
to_platform_device
(
dev
);
struct
omap4_keypad
*
keypad_data
=
platform_get_drvdata
(
pdev
);
int
error
;
if
(
device_may_wakeup
(
&
pdev
->
dev
))
{
error
=
enable_irq_wake
(
keypad_data
->
irq
);
if
(
!
error
)
keypad_data
->
irq_wake_enabled
=
true
;
}
return
0
;
}
static
int
omap4_keypad_resume
(
struct
device
*
dev
)
{
struct
platform_device
*
pdev
=
to_platform_device
(
dev
);
struct
omap4_keypad
*
keypad_data
=
platform_get_drvdata
(
pdev
);
if
(
device_may_wakeup
(
&
pdev
->
dev
)
&&
keypad_data
->
irq_wake_enabled
)
{
disable_irq_wake
(
keypad_data
->
irq
);
keypad_data
->
irq_wake_enabled
=
false
;
}
return
0
;
}
#endif
static
SIMPLE_DEV_PM_OPS
(
omap4_keypad_pm_ops
,
omap4_keypad_suspend
,
omap4_keypad_resume
);
static
struct
platform_driver
omap4_keypad_driver
=
{
.
probe
=
omap4_keypad_probe
,
.
remove
=
omap4_keypad_remove
,
.
driver
=
{
.
name
=
"omap4-keypad"
,
.
owner
=
THIS_MODULE
,
.
pm
=
&
omap4_keypad_pm_ops
,
.
of_match_table
=
of_match_ptr
(
omap_keypad_dt_match
),
},
};
...
...
drivers/input/keyboard/qt1070.c
浏览文件 @
07176b98
...
...
@@ -243,6 +243,32 @@ static int qt1070_remove(struct i2c_client *client)
return
0
;
}
#ifdef CONFIG_PM_SLEEP
static
int
qt1070_suspend
(
struct
device
*
dev
)
{
struct
i2c_client
*
client
=
to_i2c_client
(
dev
);
struct
qt1070_data
*
data
=
i2c_get_clientdata
(
client
);
if
(
device_may_wakeup
(
dev
))
enable_irq_wake
(
data
->
irq
);
return
0
;
}
static
int
qt1070_resume
(
struct
device
*
dev
)
{
struct
i2c_client
*
client
=
to_i2c_client
(
dev
);
struct
qt1070_data
*
data
=
i2c_get_clientdata
(
client
);
if
(
device_may_wakeup
(
dev
))
disable_irq_wake
(
data
->
irq
);
return
0
;
}
#endif
static
SIMPLE_DEV_PM_OPS
(
qt1070_pm_ops
,
qt1070_suspend
,
qt1070_resume
);
static
const
struct
i2c_device_id
qt1070_id
[]
=
{
{
"qt1070"
,
0
},
{
},
...
...
@@ -253,6 +279,7 @@ static struct i2c_driver qt1070_driver = {
.
driver
=
{
.
name
=
"qt1070"
,
.
owner
=
THIS_MODULE
,
.
pm
=
&
qt1070_pm_ops
,
},
.
id_table
=
qt1070_id
,
.
probe
=
qt1070_probe
,
...
...
drivers/input/keyboard/spear-keyboard.c
浏览文件 @
07176b98
...
...
@@ -191,12 +191,6 @@ static int spear_kbd_probe(struct platform_device *pdev)
int
irq
;
int
error
;
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
if
(
!
res
)
{
dev_err
(
&
pdev
->
dev
,
"no keyboard resource defined
\n
"
);
return
-
EBUSY
;
}
irq
=
platform_get_irq
(
pdev
,
0
);
if
(
irq
<
0
)
{
dev_err
(
&
pdev
->
dev
,
"not able to get irq for the device
\n
"
);
...
...
@@ -228,6 +222,7 @@ static int spear_kbd_probe(struct platform_device *pdev)
kbd
->
suspended_rate
=
pdata
->
suspended_rate
;
}
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
kbd
->
io_base
=
devm_ioremap_resource
(
&
pdev
->
dev
,
res
);
if
(
IS_ERR
(
kbd
->
io_base
))
return
PTR_ERR
(
kbd
->
io_base
);
...
...
drivers/input/keyboard/tegra-kbc.c
浏览文件 @
07176b98
...
...
@@ -638,12 +638,6 @@ static int tegra_kbc_probe(struct platform_device *pdev)
if
(
!
tegra_kbc_check_pin_cfg
(
kbc
,
&
num_rows
))
return
-
EINVAL
;
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
if
(
!
res
)
{
dev_err
(
&
pdev
->
dev
,
"failed to get I/O memory
\n
"
);
return
-
ENXIO
;
}
kbc
->
irq
=
platform_get_irq
(
pdev
,
0
);
if
(
kbc
->
irq
<
0
)
{
dev_err
(
&
pdev
->
dev
,
"failed to get keyboard IRQ
\n
"
);
...
...
@@ -658,6 +652,7 @@ static int tegra_kbc_probe(struct platform_device *pdev)
setup_timer
(
&
kbc
->
timer
,
tegra_kbc_keypress_timer
,
(
unsigned
long
)
kbc
);
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
kbc
->
mmio
=
devm_ioremap_resource
(
&
pdev
->
dev
,
res
);
if
(
IS_ERR
(
kbc
->
mmio
))
return
PTR_ERR
(
kbc
->
mmio
);
...
...
drivers/input/misc/Kconfig
浏览文件 @
07176b98
...
...
@@ -647,4 +647,14 @@ config INPUT_SIRFSOC_ONKEY
If unsure, say N.
config INPUT_IDEAPAD_SLIDEBAR
tristate "IdeaPad Laptop Slidebar"
depends on INPUT
depends on SERIO_I8042
help
Say Y here if you have an IdeaPad laptop with a slidebar.
To compile this driver as a module, choose M here: the
module will be called ideapad_slidebar.
endif
drivers/input/misc/Makefile
浏览文件 @
07176b98
...
...
@@ -61,3 +61,4 @@ obj-$(CONFIG_INPUT_WISTRON_BTNS) += wistron_btns.o
obj-$(CONFIG_INPUT_WM831X_ON)
+=
wm831x-on.o
obj-$(CONFIG_INPUT_XEN_KBDDEV_FRONTEND)
+=
xen-kbdfront.o
obj-$(CONFIG_INPUT_YEALINK)
+=
yealink.o
obj-$(CONFIG_INPUT_IDEAPAD_SLIDEBAR)
+=
ideapad_slidebar.o
drivers/input/misc/ideapad_slidebar.c
0 → 100644
浏览文件 @
07176b98
/*
* Input driver for slidebars on some Lenovo IdeaPad laptops
*
* Copyright (C) 2013 Andrey Moiseev <o2g.org.ru@gmail.com>
*
* Reverse-engineered from Lenovo SlideNav software (SBarHook.dll).
*
* 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.
*
* Trademarks are the property of their respective owners.
*/
/*
* Currently tested and works on:
* Lenovo IdeaPad Y550
* Lenovo IdeaPad Y550P
*
* Other models can be added easily. To test,
* load with 'force' parameter set 'true'.
*
* LEDs blinking and input mode are managed via sysfs,
* (hex, unsigned byte value):
* /sys/devices/platform/ideapad_slidebar/slidebar_mode
*
* The value is in byte range, however, I only figured out
* how bits 0b10011001 work. Some other bits, probably,
* are meaningfull too.
*
* Possible states:
*
* STD_INT, ONMOV_INT, OFF_INT, LAST_POLL, OFF_POLL
*
* Meaning:
* released touched
* STD 'heartbeat' lights follow the finger
* ONMOV no lights lights follow the finger
* LAST at last pos lights follow the finger
* OFF no lights no lights
*
* INT all input events are generated, interrupts are used
* POLL no input events by default, to get them,
* send 0b10000000 (read below)
*
* Commands: write
*
* All | 0b01001 -> STD_INT
* possible | 0b10001 -> ONMOV_INT
* states | 0b01000 -> OFF_INT
*
* | 0b0 -> LAST_POLL
* STD_INT or ONMOV_INT |
* | 0b1 -> STD_INT
*
* | 0b0 -> OFF_POLL
* OFF_INT or OFF_POLL |
* | 0b1 -> OFF_INT
*
* Any state | 0b10000000 -> if the slidebar has updated data,
* produce one input event (last position),
* switch to respective POLL mode
* (like 0x0), if not in POLL mode yet.
*
* Get current state: read
*
* masked by 0x11 read value means:
*
* 0x00 LAST
* 0x01 STD
* 0x10 OFF
* 0x11 ONMOV
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/dmi.h>
#include <linux/spinlock.h>
#include <linux/platform_device.h>
#include <linux/input.h>
#include <linux/io.h>
#include <linux/ioport.h>
#include <linux/i8042.h>
#include <linux/serio.h>
#define IDEAPAD_BASE 0xff29
static
bool
force
;
module_param
(
force
,
bool
,
0
);
MODULE_PARM_DESC
(
force
,
"Force driver load, ignore DMI data"
);
static
DEFINE_SPINLOCK
(
io_lock
);
static
struct
input_dev
*
slidebar_input_dev
;
static
struct
platform_device
*
slidebar_platform_dev
;
static
u8
slidebar_pos_get
(
void
)
{
u8
res
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
io_lock
,
flags
);
outb
(
0xf4
,
0xff29
);
outb
(
0xbf
,
0xff2a
);
res
=
inb
(
0xff2b
);
spin_unlock_irqrestore
(
&
io_lock
,
flags
);
return
res
;
}
static
u8
slidebar_mode_get
(
void
)
{
u8
res
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
io_lock
,
flags
);
outb
(
0xf7
,
0xff29
);
outb
(
0x8b
,
0xff2a
);
res
=
inb
(
0xff2b
);
spin_unlock_irqrestore
(
&
io_lock
,
flags
);
return
res
;
}
static
void
slidebar_mode_set
(
u8
mode
)
{
unsigned
long
flags
;
spin_lock_irqsave
(
&
io_lock
,
flags
);
outb
(
0xf7
,
0xff29
);
outb
(
0x8b
,
0xff2a
);
outb
(
mode
,
0xff2b
);
spin_unlock_irqrestore
(
&
io_lock
,
flags
);
}
static
bool
slidebar_i8042_filter
(
unsigned
char
data
,
unsigned
char
str
,
struct
serio
*
port
)
{
static
bool
extended
=
false
;
/* We are only interested in data coming form KBC port */
if
(
str
&
I8042_STR_AUXDATA
)
return
false
;
/* Scancodes: e03b on move, e0bb on release. */
if
(
data
==
0xe0
)
{
extended
=
true
;
return
true
;
}
if
(
!
extended
)
return
false
;
extended
=
false
;
if
(
likely
((
data
&
0x7f
)
!=
0x3b
))
{
serio_interrupt
(
port
,
0xe0
,
0
);
return
false
;
}
if
(
data
&
0x80
)
{
input_report_key
(
slidebar_input_dev
,
BTN_TOUCH
,
0
);
}
else
{
input_report_key
(
slidebar_input_dev
,
BTN_TOUCH
,
1
);
input_report_abs
(
slidebar_input_dev
,
ABS_X
,
slidebar_pos_get
());
}
input_sync
(
slidebar_input_dev
);
return
true
;
}
static
ssize_t
show_slidebar_mode
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
char
*
buf
)
{
return
sprintf
(
buf
,
"%x
\n
"
,
slidebar_mode_get
());
}
static
ssize_t
store_slidebar_mode
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
{
u8
mode
;
int
error
;
error
=
kstrtou8
(
buf
,
0
,
&
mode
);
if
(
error
)
return
error
;
slidebar_mode_set
(
mode
);
return
count
;
}
static
DEVICE_ATTR
(
slidebar_mode
,
S_IWUSR
|
S_IRUGO
,
show_slidebar_mode
,
store_slidebar_mode
);
static
struct
attribute
*
ideapad_attrs
[]
=
{
&
dev_attr_slidebar_mode
.
attr
,
NULL
};
static
struct
attribute_group
ideapad_attr_group
=
{
.
attrs
=
ideapad_attrs
};
static
const
struct
attribute_group
*
ideapad_attr_groups
[]
=
{
&
ideapad_attr_group
,
NULL
};
static
int
__init
ideapad_probe
(
struct
platform_device
*
pdev
)
{
int
err
;
if
(
!
request_region
(
IDEAPAD_BASE
,
3
,
"ideapad_slidebar"
))
{
dev_err
(
&
pdev
->
dev
,
"IO ports are busy
\n
"
);
return
-
EBUSY
;
}
slidebar_input_dev
=
input_allocate_device
();
if
(
!
slidebar_input_dev
)
{
dev_err
(
&
pdev
->
dev
,
"Failed to allocate input device
\n
"
);
err
=
-
ENOMEM
;
goto
err_release_ports
;
}
slidebar_input_dev
->
name
=
"IdeaPad Slidebar"
;
slidebar_input_dev
->
id
.
bustype
=
BUS_HOST
;
slidebar_input_dev
->
dev
.
parent
=
&
pdev
->
dev
;
input_set_capability
(
slidebar_input_dev
,
EV_KEY
,
BTN_TOUCH
);
input_set_capability
(
slidebar_input_dev
,
EV_ABS
,
ABS_X
);
input_set_abs_params
(
slidebar_input_dev
,
ABS_X
,
0
,
0xff
,
0
,
0
);
err
=
i8042_install_filter
(
slidebar_i8042_filter
);
if
(
err
)
{
dev_err
(
&
pdev
->
dev
,
"Failed to install i8042 filter: %d
\n
"
,
err
);
goto
err_free_dev
;
}
err
=
input_register_device
(
slidebar_input_dev
);
if
(
err
)
{
dev_err
(
&
pdev
->
dev
,
"Failed to register input device: %d
\n
"
,
err
);
goto
err_remove_filter
;
}
return
0
;
err_remove_filter:
i8042_remove_filter
(
slidebar_i8042_filter
);
err_free_dev:
input_free_device
(
slidebar_input_dev
);
err_release_ports:
release_region
(
IDEAPAD_BASE
,
3
);
return
err
;
}
static
int
ideapad_remove
(
struct
platform_device
*
pdev
)
{
i8042_remove_filter
(
slidebar_i8042_filter
);
input_unregister_device
(
slidebar_input_dev
);
release_region
(
IDEAPAD_BASE
,
3
);
return
0
;
}
static
struct
platform_driver
slidebar_drv
=
{
.
driver
=
{
.
name
=
"ideapad_slidebar"
,
.
owner
=
THIS_MODULE
,
},
.
remove
=
ideapad_remove
,
};
static
int
__init
ideapad_dmi_check
(
const
struct
dmi_system_id
*
id
)
{
pr_info
(
"Laptop model '%s'
\n
"
,
id
->
ident
);
return
1
;
}
static
const
struct
dmi_system_id
ideapad_dmi
[]
__initconst
=
{
{
.
ident
=
"Lenovo IdeaPad Y550"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"LENOVO"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"20017"
),
DMI_MATCH
(
DMI_PRODUCT_VERSION
,
"Lenovo IdeaPad Y550"
)
},
.
callback
=
ideapad_dmi_check
},
{
.
ident
=
"Lenovo IdeaPad Y550P"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"LENOVO"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"20035"
),
DMI_MATCH
(
DMI_PRODUCT_VERSION
,
"Lenovo IdeaPad Y550P"
)
},
.
callback
=
ideapad_dmi_check
},
{
NULL
,
}
};
MODULE_DEVICE_TABLE
(
dmi
,
ideapad_dmi
);
static
int
__init
slidebar_init
(
void
)
{
int
err
;
if
(
!
force
&&
!
dmi_check_system
(
ideapad_dmi
))
{
pr_err
(
"DMI does not match
\n
"
);
return
-
ENODEV
;
}
slidebar_platform_dev
=
platform_device_alloc
(
"ideapad_slidebar"
,
-
1
);
if
(
!
slidebar_platform_dev
)
{
pr_err
(
"Not enough memory
\n
"
);
return
-
ENOMEM
;
}
slidebar_platform_dev
->
dev
.
groups
=
ideapad_attr_groups
;
err
=
platform_device_add
(
slidebar_platform_dev
);
if
(
err
)
{
pr_err
(
"Failed to register platform device
\n
"
);
goto
err_free_dev
;
}
err
=
platform_driver_probe
(
&
slidebar_drv
,
ideapad_probe
);
if
(
err
)
{
pr_err
(
"Failed to register platform driver
\n
"
);
goto
err_delete_dev
;
}
return
0
;
err_delete_dev:
platform_device_del
(
slidebar_platform_dev
);
err_free_dev:
platform_device_put
(
slidebar_platform_dev
);
return
err
;
}
static
void
__exit
slidebar_exit
(
void
)
{
platform_device_unregister
(
slidebar_platform_dev
);
platform_driver_unregister
(
&
slidebar_drv
);
}
module_init
(
slidebar_init
);
module_exit
(
slidebar_exit
);
MODULE_AUTHOR
(
"Andrey Moiseev <o2g.org.ru@gmail.com>"
);
MODULE_DESCRIPTION
(
"Slidebar input support for some Lenovo IdeaPad laptops"
);
MODULE_LICENSE
(
"GPL"
);
drivers/input/misc/pwm-beeper.c
浏览文件 @
07176b98
...
...
@@ -143,7 +143,7 @@ static int pwm_beeper_remove(struct platform_device *pdev)
return
0
;
}
#ifdef CONFIG_PM
#ifdef CONFIG_PM
_SLEEP
static
int
pwm_beeper_suspend
(
struct
device
*
dev
)
{
struct
pwm_beeper
*
beeper
=
dev_get_drvdata
(
dev
);
...
...
drivers/input/misc/twl6040-vibra.c
浏览文件 @
07176b98
...
...
@@ -257,7 +257,6 @@ static SIMPLE_DEV_PM_OPS(twl6040_vibra_pm_ops, twl6040_vibra_suspend, NULL);
static
int
twl6040_vibra_probe
(
struct
platform_device
*
pdev
)
{
struct
twl6040_vibra_data
*
pdata
=
pdev
->
dev
.
platform_data
;
struct
device
*
twl6040_core_dev
=
pdev
->
dev
.
parent
;
struct
device_node
*
twl6040_core_node
=
NULL
;
struct
vibra_info
*
info
;
...
...
@@ -270,8 +269,8 @@ static int twl6040_vibra_probe(struct platform_device *pdev)
"vibra"
);
#endif
if
(
!
pdata
&&
!
twl6040_core_node
)
{
dev_err
(
&
pdev
->
dev
,
"p
latform_data not available
\n
"
);
if
(
!
twl6040_core_node
)
{
dev_err
(
&
pdev
->
dev
,
"p
arent of node is missing?
\n
"
);
return
-
EINVAL
;
}
...
...
@@ -284,27 +283,17 @@ static int twl6040_vibra_probe(struct platform_device *pdev)
info
->
dev
=
&
pdev
->
dev
;
info
->
twl6040
=
dev_get_drvdata
(
pdev
->
dev
.
parent
);
if
(
pdata
)
{
info
->
vibldrv_res
=
pdata
->
vibldrv_res
;
info
->
vibrdrv_res
=
pdata
->
vibrdrv_res
;
info
->
viblmotor_res
=
pdata
->
viblmotor_res
;
info
->
vibrmotor_res
=
pdata
->
vibrmotor_res
;
vddvibl_uV
=
pdata
->
vddvibl_uV
;
vddvibr_uV
=
pdata
->
vddvibr_uV
;
}
else
{
of_property_read_u32
(
twl6040_core_node
,
"ti,vibldrv-res"
,
&
info
->
vibldrv_res
);
of_property_read_u32
(
twl6040_core_node
,
"ti,vibrdrv-res"
,
&
info
->
vibrdrv_res
);
of_property_read_u32
(
twl6040_core_node
,
"ti,viblmotor-res"
,
&
info
->
viblmotor_res
);
of_property_read_u32
(
twl6040_core_node
,
"ti,vibrmotor-res"
,
&
info
->
vibrmotor_res
);
of_property_read_u32
(
twl6040_core_node
,
"ti,vddvibl-uV"
,
&
vddvibl_uV
);
of_property_read_u32
(
twl6040_core_node
,
"ti,vddvibr-uV"
,
&
vddvibr_uV
);
}
of_property_read_u32
(
twl6040_core_node
,
"ti,vibldrv-res"
,
&
info
->
vibldrv_res
);
of_property_read_u32
(
twl6040_core_node
,
"ti,vibrdrv-res"
,
&
info
->
vibrdrv_res
);
of_property_read_u32
(
twl6040_core_node
,
"ti,viblmotor-res"
,
&
info
->
viblmotor_res
);
of_property_read_u32
(
twl6040_core_node
,
"ti,vibrmotor-res"
,
&
info
->
vibrmotor_res
);
of_property_read_u32
(
twl6040_core_node
,
"ti,vddvibl-uV"
,
&
vddvibl_uV
);
of_property_read_u32
(
twl6040_core_node
,
"ti,vddvibr-uV"
,
&
vddvibr_uV
);
if
((
!
info
->
vibldrv_res
&&
!
info
->
viblmotor_res
)
||
(
!
info
->
vibrdrv_res
&&
!
info
->
vibrmotor_res
))
{
...
...
@@ -334,8 +323,8 @@ static int twl6040_vibra_probe(struct platform_device *pdev)
* When booted with Device tree the regulators are attached to the
* parent device (twl6040 MFD core)
*/
ret
=
regulator_bulk_get
(
pdata
?
info
->
dev
:
twl6040_core_dev
,
ARRAY_SIZE
(
info
->
supplies
),
info
->
supplies
);
ret
=
regulator_bulk_get
(
twl6040_core_dev
,
ARRAY_SIZE
(
info
->
supplies
)
,
info
->
supplies
);
if
(
ret
)
{
dev_err
(
info
->
dev
,
"couldn't get regulators %d
\n
"
,
ret
);
return
ret
;
...
...
drivers/input/misc/wistron_btns.c
浏览文件 @
07176b98
...
...
@@ -46,7 +46,6 @@
MODULE_AUTHOR
(
"Miloslav Trmac <mitr@volny.cz>"
);
MODULE_DESCRIPTION
(
"Wistron laptop button driver"
);
MODULE_LICENSE
(
"GPL v2"
);
MODULE_VERSION
(
"0.3"
);
static
bool
force
;
/* = 0; */
module_param
(
force
,
bool
,
0
);
...
...
@@ -563,7 +562,7 @@ static struct key_entry keymap_wistron_md96500[] __initdata = {
{
KE_KEY
,
0x36
,
{
KEY_WWW
}
},
{
KE_WIFI
,
0x30
},
{
KE_BLUETOOTH
,
0x44
},
{
KE_END
,
FE_UNTESTED
}
{
KE_END
,
0
}
};
static
struct
key_entry
keymap_wistron_generic
[]
__initdata
=
{
...
...
@@ -635,7 +634,7 @@ static struct key_entry keymap_prestigio[] __initdata = {
* a list of buttons and their key codes (reported when loading this module
* with force=1) and the output of dmidecode to $MODULE_AUTHOR.
*/
static
const
struct
dmi_system_id
__initconst
dmi_ids
[]
=
{
static
const
struct
dmi_system_id
dmi_ids
[]
__initconst
=
{
{
/* Fujitsu-Siemens Amilo Pro V2000 */
.
callback
=
dmi_matched
,
...
...
@@ -972,6 +971,7 @@ static const struct dmi_system_id __initconst dmi_ids[] = {
},
{
NULL
,
}
};
MODULE_DEVICE_TABLE
(
dmi
,
dmi_ids
);
/* Copy the good keymap, as the original ones are free'd */
static
int
__init
copy_keymap
(
void
)
...
...
drivers/input/mouse/lifebook.c
浏览文件 @
07176b98
...
...
@@ -44,7 +44,7 @@ static int lifebook_set_6byte_proto(const struct dmi_system_id *d)
return
1
;
}
static
const
struct
dmi_system_id
__initconst
lifebook_dmi_table
[]
=
{
static
const
struct
dmi_system_id
lifebook_dmi_table
[]
__initconst
=
{
{
/* FLORA-ie 55mi */
.
matches
=
{
...
...
drivers/input/mouse/synaptics.c
浏览文件 @
07176b98
...
...
@@ -1433,7 +1433,7 @@ static int synaptics_reconnect(struct psmouse *psmouse)
static
bool
impaired_toshiba_kbc
;
static
const
struct
dmi_system_id
__initconst
toshiba_dmi_table
[]
=
{
static
const
struct
dmi_system_id
toshiba_dmi_table
[]
__initconst
=
{
#if defined(CONFIG_DMI) && defined(CONFIG_X86)
{
/* Toshiba Satellite */
...
...
@@ -1472,7 +1472,7 @@ static const struct dmi_system_id __initconst toshiba_dmi_table[] = {
static
bool
broken_olpc_ec
;
static
const
struct
dmi_system_id
__initconst
olpc_dmi_table
[]
=
{
static
const
struct
dmi_system_id
olpc_dmi_table
[]
__initconst
=
{
#if defined(CONFIG_DMI) && defined(CONFIG_OLPC)
{
/* OLPC XO-1 or XO-1.5 */
...
...
drivers/input/serio/arc_ps2.c
浏览文件 @
07176b98
...
...
@@ -189,12 +189,6 @@ static int arc_ps2_probe(struct platform_device *pdev)
int
irq
;
int
error
,
id
,
i
;
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
if
(
!
res
)
{
dev_err
(
&
pdev
->
dev
,
"no IO memory defined
\n
"
);
return
-
EINVAL
;
}
irq
=
platform_get_irq_byname
(
pdev
,
"arc_ps2_irq"
);
if
(
irq
<
0
)
{
dev_err
(
&
pdev
->
dev
,
"no IRQ defined
\n
"
);
...
...
@@ -208,6 +202,7 @@ static int arc_ps2_probe(struct platform_device *pdev)
return
-
ENOMEM
;
}
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
arc_ps2
->
addr
=
devm_ioremap_resource
(
&
pdev
->
dev
,
res
);
if
(
IS_ERR
(
arc_ps2
->
addr
))
return
PTR_ERR
(
arc_ps2
->
addr
);
...
...
drivers/input/serio/i8042.h
浏览文件 @
07176b98
...
...
@@ -40,30 +40,6 @@
#define I8042_CTL_TIMEOUT 10000
/*
* Status register bits.
*/
#define I8042_STR_PARITY 0x80
#define I8042_STR_TIMEOUT 0x40
#define I8042_STR_AUXDATA 0x20
#define I8042_STR_KEYLOCK 0x10
#define I8042_STR_CMDDAT 0x08
#define I8042_STR_MUXERR 0x04
#define I8042_STR_IBF 0x02
#define I8042_STR_OBF 0x01
/*
* Control register bits.
*/
#define I8042_CTR_KBDINT 0x01
#define I8042_CTR_AUXINT 0x02
#define I8042_CTR_IGNKEYLOCK 0x08
#define I8042_CTR_KBDDIS 0x10
#define I8042_CTR_AUXDIS 0x20
#define I8042_CTR_XLATE 0x40
/*
* Return codes.
*/
...
...
drivers/input/serio/olpc_apsp.c
浏览文件 @
07176b98
...
...
@@ -183,9 +183,6 @@ static int olpc_apsp_probe(struct platform_device *pdev)
np
=
pdev
->
dev
.
of_node
;
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
if
(
!
res
)
return
-
ENOENT
;
priv
->
base
=
devm_ioremap_resource
(
&
pdev
->
dev
,
res
);
if
(
IS_ERR
(
priv
->
base
))
{
dev_err
(
&
pdev
->
dev
,
"Failed to map WTM registers
\n
"
);
...
...
drivers/input/tablet/wacom_sys.c
浏览文件 @
07176b98
...
...
@@ -221,39 +221,6 @@ static int wacom_calc_hid_res(int logical_extents, int physical_extents,
return
logical_extents
/
physical_extents
;
}
/*
* The physical dimension specified by the HID descriptor is likely not in
* the "100th of a mm" units expected by wacom_calculate_touch_res. This
* function adjusts the value of [xy]_phy based on the unit and exponent
* provided by the HID descriptor. If an error occurs durring conversion
* (e.g. from the unit being left unspecified) [xy]_phy is not modified.
*/
static
void
wacom_fix_phy_from_hid
(
struct
wacom_features
*
features
)
{
int
xres
=
wacom_calc_hid_res
(
features
->
x_max
,
features
->
x_phy
,
features
->
unit
,
features
->
unitExpo
);
int
yres
=
wacom_calc_hid_res
(
features
->
y_max
,
features
->
y_phy
,
features
->
unit
,
features
->
unitExpo
);
if
(
xres
>
0
&&
yres
>
0
)
{
features
->
x_phy
=
(
100
*
features
->
x_max
)
/
xres
;
features
->
y_phy
=
(
100
*
features
->
y_max
)
/
yres
;
}
}
/*
* Static values for max X/Y and resolution of Pen interface is stored in
* features. This mean physical size of active area can be computed.
* This is useful to do when Pen and Touch have same active area of tablet.
* This means for Touch device, we only need to find max X/Y value and we
* have enough information to compute resolution of touch.
*/
static
void
wacom_set_phy_from_res
(
struct
wacom_features
*
features
)
{
features
->
x_phy
=
(
features
->
x_max
*
100
)
/
features
->
x_resolution
;
features
->
y_phy
=
(
features
->
y_max
*
100
)
/
features
->
y_resolution
;
}
static
int
wacom_parse_logical_collection
(
unsigned
char
*
report
,
struct
wacom_features
*
features
)
{
...
...
@@ -265,8 +232,6 @@ static int wacom_parse_logical_collection(unsigned char *report,
features
->
pktlen
=
WACOM_PKGLEN_BBTOUCH3
;
features
->
device_type
=
BTN_TOOL_FINGER
;
wacom_set_phy_from_res
(
features
);
features
->
x_max
=
features
->
y_max
=
get_unaligned_le16
(
&
report
[
10
]);
...
...
@@ -640,9 +605,6 @@ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf,
}
}
error
=
wacom_parse_hid
(
intf
,
hid_desc
,
features
);
if
(
error
)
goto
out
;
wacom_fix_phy_from_hid
(
features
);
out:
return
error
;
...
...
@@ -1228,7 +1190,6 @@ static void wacom_wireless_work(struct work_struct *work)
*
((
struct
wacom_features
*
)
id
->
driver_info
);
wacom_wac2
->
features
.
pktlen
=
WACOM_PKGLEN_BBTOUCH3
;
wacom_wac2
->
features
.
device_type
=
BTN_TOOL_FINGER
;
wacom_set_phy_from_res
(
&
wacom_wac2
->
features
);
wacom_wac2
->
features
.
x_max
=
wacom_wac2
->
features
.
y_max
=
4096
;
error
=
wacom_register_input
(
wacom2
);
if
(
error
)
...
...
@@ -1251,6 +1212,33 @@ static void wacom_wireless_work(struct work_struct *work)
return
;
}
/*
* Not all devices report physical dimensions from HID.
* Compute the default from hardcoded logical dimension
* and resolution before driver overwrites them.
*/
static
void
wacom_set_default_phy
(
struct
wacom_features
*
features
)
{
if
(
features
->
x_resolution
)
{
features
->
x_phy
=
(
features
->
x_max
*
100
)
/
features
->
x_resolution
;
features
->
y_phy
=
(
features
->
y_max
*
100
)
/
features
->
y_resolution
;
}
}
static
void
wacom_calculate_res
(
struct
wacom_features
*
features
)
{
features
->
x_resolution
=
wacom_calc_hid_res
(
features
->
x_max
,
features
->
x_phy
,
features
->
unit
,
features
->
unitExpo
);
features
->
y_resolution
=
wacom_calc_hid_res
(
features
->
y_max
,
features
->
y_phy
,
features
->
unit
,
features
->
unitExpo
);
}
static
int
wacom_probe
(
struct
usb_interface
*
intf
,
const
struct
usb_device_id
*
id
)
{
struct
usb_device
*
dev
=
interface_to_usbdev
(
intf
);
...
...
@@ -1297,6 +1285,9 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
endpoint
=
&
intf
->
cur_altsetting
->
endpoint
[
0
].
desc
;
/* set the default size in case we do not get them from hid */
wacom_set_default_phy
(
features
);
/* Retrieve the physical and logical size for touch devices */
error
=
wacom_retrieve_hid_descriptor
(
intf
,
features
);
if
(
error
)
...
...
@@ -1312,8 +1303,6 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
features
->
device_type
=
BTN_TOOL_FINGER
;
features
->
pktlen
=
WACOM_PKGLEN_BBTOUCH3
;
wacom_set_phy_from_res
(
features
);
features
->
x_max
=
4096
;
features
->
y_max
=
4096
;
}
else
{
...
...
@@ -1323,6 +1312,13 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
wacom_setup_device_quirks
(
features
);
/* set unit to "100th of a mm" for devices not reported by HID */
if
(
!
features
->
unit
)
{
features
->
unit
=
0x11
;
features
->
unitExpo
=
16
-
3
;
}
wacom_calculate_res
(
features
);
strlcpy
(
wacom_wac
->
name
,
features
->
name
,
sizeof
(
wacom_wac
->
name
));
if
(
features
->
quirks
&
WACOM_QUIRK_MULTI_INPUT
)
{
...
...
@@ -1334,7 +1330,6 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
" Pen"
:
" Finger"
,
sizeof
(
wacom_wac
->
name
));
other_dev
=
wacom_get_sibling
(
dev
,
features
->
oVid
,
features
->
oPid
);
if
(
other_dev
==
NULL
||
wacom_get_usbdev_data
(
other_dev
)
==
NULL
)
other_dev
=
dev
;
...
...
@@ -1366,8 +1361,10 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
usb_set_intfdata
(
intf
,
wacom
);
if
(
features
->
quirks
&
WACOM_QUIRK_MONITOR
)
{
if
(
usb_submit_urb
(
wacom
->
irq
,
GFP_KERNEL
))
if
(
usb_submit_urb
(
wacom
->
irq
,
GFP_KERNEL
))
{
error
=
-
EIO
;
goto
fail5
;
}
}
return
0
;
...
...
@@ -1422,8 +1419,8 @@ static int wacom_resume(struct usb_interface *intf)
wacom_query_tablet_data
(
intf
,
features
);
wacom_led_control
(
wacom
);
if
((
wacom
->
open
||
features
->
quirks
&
WACOM_QUIRK_MONITOR
)
&&
usb_submit_urb
(
wacom
->
irq
,
GFP_NOIO
)
<
0
)
if
((
wacom
->
open
||
(
features
->
quirks
&
WACOM_QUIRK_MONITOR
))
&&
usb_submit_urb
(
wacom
->
irq
,
GFP_NOIO
)
<
0
)
rv
=
-
EIO
;
mutex_unlock
(
&
wacom
->
lock
);
...
...
drivers/input/tablet/wacom_wac.c
浏览文件 @
07176b98
...
...
@@ -1445,13 +1445,6 @@ void wacom_setup_device_quirks(struct wacom_features *features)
}
}
static
unsigned
int
wacom_calculate_touch_res
(
unsigned
int
logical_max
,
unsigned
int
physical_max
)
{
/* Touch physical dimensions are in 100th of mm */
return
(
logical_max
*
100
)
/
physical_max
;
}
static
void
wacom_abs_set_axis
(
struct
input_dev
*
input_dev
,
struct
wacom_wac
*
wacom_wac
)
{
...
...
@@ -1475,11 +1468,9 @@ static void wacom_abs_set_axis(struct input_dev *input_dev,
input_set_abs_params
(
input_dev
,
ABS_Y
,
0
,
features
->
y_max
,
features
->
y_fuzz
,
0
);
input_abs_set_res
(
input_dev
,
ABS_X
,
wacom_calculate_touch_res
(
features
->
x_max
,
features
->
x_phy
));
features
->
x_resolution
);
input_abs_set_res
(
input_dev
,
ABS_Y
,
wacom_calculate_touch_res
(
features
->
y_max
,
features
->
y_phy
));
features
->
y_resolution
);
}
if
(
features
->
touch_max
>
1
)
{
...
...
@@ -1488,11 +1479,9 @@ static void wacom_abs_set_axis(struct input_dev *input_dev,
input_set_abs_params
(
input_dev
,
ABS_MT_POSITION_Y
,
0
,
features
->
y_max
,
features
->
y_fuzz
,
0
);
input_abs_set_res
(
input_dev
,
ABS_MT_POSITION_X
,
wacom_calculate_touch_res
(
features
->
x_max
,
features
->
x_phy
));
features
->
x_resolution
);
input_abs_set_res
(
input_dev
,
ABS_MT_POSITION_Y
,
wacom_calculate_touch_res
(
features
->
y_max
,
features
->
y_phy
));
features
->
y_resolution
);
}
}
}
...
...
drivers/input/touchscreen/cy8ctmg110_ts.c
浏览文件 @
07176b98
...
...
@@ -291,7 +291,7 @@ static int cy8ctmg110_probe(struct i2c_client *client,
return
err
;
}
#ifdef CONFIG_PM
#ifdef CONFIG_PM
_SLEEP
static
int
cy8ctmg110_suspend
(
struct
device
*
dev
)
{
struct
i2c_client
*
client
=
to_i2c_client
(
dev
);
...
...
@@ -319,9 +319,9 @@ static int cy8ctmg110_resume(struct device *dev)
}
return
0
;
}
#endif
static
SIMPLE_DEV_PM_OPS
(
cy8ctmg110_pm
,
cy8ctmg110_suspend
,
cy8ctmg110_resume
);
#endif
static
int
cy8ctmg110_remove
(
struct
i2c_client
*
client
)
{
...
...
@@ -351,9 +351,7 @@ static struct i2c_driver cy8ctmg110_driver = {
.
driver
=
{
.
owner
=
THIS_MODULE
,
.
name
=
CY8CTMG110_DRIVER_NAME
,
#ifdef CONFIG_PM
.
pm
=
&
cy8ctmg110_pm
,
#endif
},
.
id_table
=
cy8ctmg110_idtable
,
.
probe
=
cy8ctmg110_probe
,
...
...
drivers/input/touchscreen/cyttsp4_core.c
浏览文件 @
07176b98
...
...
@@ -1246,9 +1246,6 @@ static void cyttsp4_watchdog_timer(unsigned long handle)
dev_vdbg
(
cd
->
dev
,
"%s: Watchdog timer triggered
\n
"
,
__func__
);
if
(
!
cd
)
return
;
if
(
!
work_pending
(
&
cd
->
watchdog_work
))
schedule_work
(
&
cd
->
watchdog_work
);
...
...
@@ -1552,106 +1549,6 @@ static int cyttsp4_core_sleep_(struct cyttsp4 *cd)
return
rc
;
}
static
int
cyttsp4_core_sleep
(
struct
cyttsp4
*
cd
)
{
int
rc
;
rc
=
cyttsp4_request_exclusive
(
cd
,
cd
->
dev
,
CY_CORE_SLEEP_REQUEST_EXCLUSIVE_TIMEOUT
);
if
(
rc
<
0
)
{
dev_err
(
cd
->
dev
,
"%s: fail get exclusive ex=%p own=%p
\n
"
,
__func__
,
cd
->
exclusive_dev
,
cd
->
dev
);
return
0
;
}
rc
=
cyttsp4_core_sleep_
(
cd
);
if
(
cyttsp4_release_exclusive
(
cd
,
cd
->
dev
)
<
0
)
dev_err
(
cd
->
dev
,
"%s: fail to release exclusive
\n
"
,
__func__
);
else
dev_vdbg
(
cd
->
dev
,
"%s: pass release exclusive
\n
"
,
__func__
);
return
rc
;
}
static
int
cyttsp4_core_wake_
(
struct
cyttsp4
*
cd
)
{
struct
device
*
dev
=
cd
->
dev
;
int
rc
;
u8
mode
;
int
t
;
/* Already woken? */
mutex_lock
(
&
cd
->
system_lock
);
if
(
cd
->
sleep_state
==
SS_SLEEP_OFF
)
{
mutex_unlock
(
&
cd
->
system_lock
);
return
0
;
}
cd
->
int_status
&=
~
CY_INT_IGNORE
;
cd
->
int_status
|=
CY_INT_AWAKE
;
cd
->
sleep_state
=
SS_WAKING
;
if
(
cd
->
cpdata
->
power
)
{
dev_dbg
(
dev
,
"%s: Power up HW
\n
"
,
__func__
);
rc
=
cd
->
cpdata
->
power
(
cd
->
cpdata
,
1
,
dev
,
&
cd
->
ignore_irq
);
}
else
{
dev_dbg
(
dev
,
"%s: No power function
\n
"
,
__func__
);
rc
=
-
ENOSYS
;
}
if
(
rc
<
0
)
{
dev_err
(
dev
,
"%s: HW Power up fails r=%d
\n
"
,
__func__
,
rc
);
/* Initiate a read transaction to wake up */
cyttsp4_adap_read
(
cd
,
CY_REG_BASE
,
sizeof
(
mode
),
&
mode
);
}
else
dev_vdbg
(
cd
->
dev
,
"%s: HW power up succeeds
\n
"
,
__func__
);
mutex_unlock
(
&
cd
->
system_lock
);
t
=
wait_event_timeout
(
cd
->
wait_q
,
(
cd
->
int_status
&
CY_INT_AWAKE
)
==
0
,
msecs_to_jiffies
(
CY_CORE_WAKEUP_TIMEOUT
));
if
(
IS_TMO
(
t
))
{
dev_err
(
dev
,
"%s: TMO waiting for wakeup
\n
"
,
__func__
);
mutex_lock
(
&
cd
->
system_lock
);
cd
->
int_status
&=
~
CY_INT_AWAKE
;
/* Try starting up */
cyttsp4_queue_startup_
(
cd
);
mutex_unlock
(
&
cd
->
system_lock
);
}
mutex_lock
(
&
cd
->
system_lock
);
cd
->
sleep_state
=
SS_SLEEP_OFF
;
mutex_unlock
(
&
cd
->
system_lock
);
cyttsp4_start_wd_timer
(
cd
);
return
0
;
}
static
int
cyttsp4_core_wake
(
struct
cyttsp4
*
cd
)
{
int
rc
;
rc
=
cyttsp4_request_exclusive
(
cd
,
cd
->
dev
,
CY_CORE_REQUEST_EXCLUSIVE_TIMEOUT
);
if
(
rc
<
0
)
{
dev_err
(
cd
->
dev
,
"%s: fail get exclusive ex=%p own=%p
\n
"
,
__func__
,
cd
->
exclusive_dev
,
cd
->
dev
);
return
0
;
}
rc
=
cyttsp4_core_wake_
(
cd
);
if
(
cyttsp4_release_exclusive
(
cd
,
cd
->
dev
)
<
0
)
dev_err
(
cd
->
dev
,
"%s: fail to release exclusive
\n
"
,
__func__
);
else
dev_vdbg
(
cd
->
dev
,
"%s: pass release exclusive
\n
"
,
__func__
);
return
rc
;
}
static
int
cyttsp4_startup_
(
struct
cyttsp4
*
cd
)
{
int
retry
=
CY_CORE_STARTUP_RETRY_COUNT
;
...
...
@@ -1821,6 +1718,106 @@ static void cyttsp4_free_si_ptrs(struct cyttsp4 *cd)
}
#if defined(CONFIG_PM_SLEEP) || defined(CONFIG_PM_RUNTIME)
static
int
cyttsp4_core_sleep
(
struct
cyttsp4
*
cd
)
{
int
rc
;
rc
=
cyttsp4_request_exclusive
(
cd
,
cd
->
dev
,
CY_CORE_SLEEP_REQUEST_EXCLUSIVE_TIMEOUT
);
if
(
rc
<
0
)
{
dev_err
(
cd
->
dev
,
"%s: fail get exclusive ex=%p own=%p
\n
"
,
__func__
,
cd
->
exclusive_dev
,
cd
->
dev
);
return
0
;
}
rc
=
cyttsp4_core_sleep_
(
cd
);
if
(
cyttsp4_release_exclusive
(
cd
,
cd
->
dev
)
<
0
)
dev_err
(
cd
->
dev
,
"%s: fail to release exclusive
\n
"
,
__func__
);
else
dev_vdbg
(
cd
->
dev
,
"%s: pass release exclusive
\n
"
,
__func__
);
return
rc
;
}
static
int
cyttsp4_core_wake_
(
struct
cyttsp4
*
cd
)
{
struct
device
*
dev
=
cd
->
dev
;
int
rc
;
u8
mode
;
int
t
;
/* Already woken? */
mutex_lock
(
&
cd
->
system_lock
);
if
(
cd
->
sleep_state
==
SS_SLEEP_OFF
)
{
mutex_unlock
(
&
cd
->
system_lock
);
return
0
;
}
cd
->
int_status
&=
~
CY_INT_IGNORE
;
cd
->
int_status
|=
CY_INT_AWAKE
;
cd
->
sleep_state
=
SS_WAKING
;
if
(
cd
->
cpdata
->
power
)
{
dev_dbg
(
dev
,
"%s: Power up HW
\n
"
,
__func__
);
rc
=
cd
->
cpdata
->
power
(
cd
->
cpdata
,
1
,
dev
,
&
cd
->
ignore_irq
);
}
else
{
dev_dbg
(
dev
,
"%s: No power function
\n
"
,
__func__
);
rc
=
-
ENOSYS
;
}
if
(
rc
<
0
)
{
dev_err
(
dev
,
"%s: HW Power up fails r=%d
\n
"
,
__func__
,
rc
);
/* Initiate a read transaction to wake up */
cyttsp4_adap_read
(
cd
,
CY_REG_BASE
,
sizeof
(
mode
),
&
mode
);
}
else
dev_vdbg
(
cd
->
dev
,
"%s: HW power up succeeds
\n
"
,
__func__
);
mutex_unlock
(
&
cd
->
system_lock
);
t
=
wait_event_timeout
(
cd
->
wait_q
,
(
cd
->
int_status
&
CY_INT_AWAKE
)
==
0
,
msecs_to_jiffies
(
CY_CORE_WAKEUP_TIMEOUT
));
if
(
IS_TMO
(
t
))
{
dev_err
(
dev
,
"%s: TMO waiting for wakeup
\n
"
,
__func__
);
mutex_lock
(
&
cd
->
system_lock
);
cd
->
int_status
&=
~
CY_INT_AWAKE
;
/* Try starting up */
cyttsp4_queue_startup_
(
cd
);
mutex_unlock
(
&
cd
->
system_lock
);
}
mutex_lock
(
&
cd
->
system_lock
);
cd
->
sleep_state
=
SS_SLEEP_OFF
;
mutex_unlock
(
&
cd
->
system_lock
);
cyttsp4_start_wd_timer
(
cd
);
return
0
;
}
static
int
cyttsp4_core_wake
(
struct
cyttsp4
*
cd
)
{
int
rc
;
rc
=
cyttsp4_request_exclusive
(
cd
,
cd
->
dev
,
CY_CORE_REQUEST_EXCLUSIVE_TIMEOUT
);
if
(
rc
<
0
)
{
dev_err
(
cd
->
dev
,
"%s: fail get exclusive ex=%p own=%p
\n
"
,
__func__
,
cd
->
exclusive_dev
,
cd
->
dev
);
return
0
;
}
rc
=
cyttsp4_core_wake_
(
cd
);
if
(
cyttsp4_release_exclusive
(
cd
,
cd
->
dev
)
<
0
)
dev_err
(
cd
->
dev
,
"%s: fail to release exclusive
\n
"
,
__func__
);
else
dev_vdbg
(
cd
->
dev
,
"%s: pass release exclusive
\n
"
,
__func__
);
return
rc
;
}
static
int
cyttsp4_core_suspend
(
struct
device
*
dev
)
{
struct
cyttsp4
*
cd
=
dev_get_drvdata
(
dev
);
...
...
drivers/input/touchscreen/eeti_ts.c
浏览文件 @
07176b98
...
...
@@ -264,7 +264,7 @@ static int eeti_ts_remove(struct i2c_client *client)
return
0
;
}
#ifdef CONFIG_PM
#ifdef CONFIG_PM
_SLEEP
static
int
eeti_ts_suspend
(
struct
device
*
dev
)
{
struct
i2c_client
*
client
=
to_i2c_client
(
dev
);
...
...
@@ -302,9 +302,9 @@ static int eeti_ts_resume(struct device *dev)
return
0
;
}
#endif
static
SIMPLE_DEV_PM_OPS
(
eeti_ts_pm
,
eeti_ts_suspend
,
eeti_ts_resume
);
#endif
static
const
struct
i2c_device_id
eeti_ts_id
[]
=
{
{
"eeti_ts"
,
0
},
...
...
@@ -315,9 +315,7 @@ MODULE_DEVICE_TABLE(i2c, eeti_ts_id);
static
struct
i2c_driver
eeti_ts_driver
=
{
.
driver
=
{
.
name
=
"eeti_ts"
,
#ifdef CONFIG_PM
.
pm
=
&
eeti_ts_pm
,
#endif
},
.
probe
=
eeti_ts_probe
,
.
remove
=
eeti_ts_remove
,
...
...
drivers/input/touchscreen/htcpen.c
浏览文件 @
07176b98
...
...
@@ -221,7 +221,7 @@ static struct isa_driver htcpen_isa_driver = {
}
};
static
struct
dmi_system_id
__initdata
htcshift_dmi_table
[]
=
{
static
struct
dmi_system_id
htcshift_dmi_table
[]
__initdata
=
{
{
.
ident
=
"Shift"
,
.
matches
=
{
...
...
drivers/input/touchscreen/max11801_ts.c
浏览文件 @
07176b98
...
...
@@ -181,12 +181,11 @@ static int max11801_ts_probe(struct i2c_client *client,
struct
input_dev
*
input_dev
;
int
error
;
data
=
kzalloc
(
sizeof
(
struct
max11801_
data
),
GFP_KERNEL
);
input_dev
=
input_allocate_device
(
);
data
=
devm_kzalloc
(
&
client
->
dev
,
sizeof
(
*
data
),
GFP_KERNEL
);
input_dev
=
devm_input_allocate_device
(
&
client
->
dev
);
if
(
!
data
||
!
input_dev
)
{
dev_err
(
&
client
->
dev
,
"Failed to allocate memory
\n
"
);
error
=
-
ENOMEM
;
goto
err_free_mem
;
return
-
ENOMEM
;
}
data
->
client
=
client
;
...
...
@@ -205,38 +204,21 @@ static int max11801_ts_probe(struct i2c_client *client,
max11801_ts_phy_init
(
data
);
error
=
request_threaded_irq
(
client
->
irq
,
NULL
,
max11801_ts_interrupt
,
IRQF_TRIGGER_LOW
|
IRQF_ONESHOT
,
"max11801_ts"
,
data
);
error
=
devm_request_threaded_irq
(
&
client
->
dev
,
client
->
irq
,
NULL
,
max11801_ts_interrupt
,
IRQF_TRIGGER_LOW
|
IRQF_ONESHOT
,
"max11801_ts"
,
data
);
if
(
error
)
{
dev_err
(
&
client
->
dev
,
"Failed to register interrupt
\n
"
);
goto
err_free_mem
;
return
error
;
}
error
=
input_register_device
(
data
->
input_dev
);
if
(
error
)
goto
err_free_irq
;
return
error
;
i2c_set_clientdata
(
client
,
data
);
return
0
;
err_free_irq:
free_irq
(
client
->
irq
,
data
);
err_free_mem:
input_free_device
(
input_dev
);
kfree
(
data
);
return
error
;
}
static
int
max11801_ts_remove
(
struct
i2c_client
*
client
)
{
struct
max11801_data
*
data
=
i2c_get_clientdata
(
client
);
free_irq
(
client
->
irq
,
data
);
input_unregister_device
(
data
->
input_dev
);
kfree
(
data
);
return
0
;
}
static
const
struct
i2c_device_id
max11801_ts_id
[]
=
{
...
...
@@ -252,7 +234,6 @@ static struct i2c_driver max11801_ts_driver = {
},
.
id_table
=
max11801_ts_id
,
.
probe
=
max11801_ts_probe
,
.
remove
=
max11801_ts_remove
,
};
module_i2c_driver
(
max11801_ts_driver
);
...
...
drivers/tty/sysrq.c
浏览文件 @
07176b98
...
...
@@ -45,6 +45,7 @@
#include <linux/moduleparam.h>
#include <linux/jiffies.h>
#include <linux/syscalls.h>
#include <linux/of.h>
#include <asm/ptrace.h>
#include <asm/irq_regs.h>
...
...
@@ -681,6 +682,40 @@ static void sysrq_detect_reset_sequence(struct sysrq_state *state,
}
}
#ifdef CONFIG_OF
static
void
sysrq_of_get_keyreset_config
(
void
)
{
u32
key
;
struct
device_node
*
np
;
struct
property
*
prop
;
const
__be32
*
p
;
np
=
of_find_node_by_path
(
"/chosen/linux,sysrq-reset-seq"
);
if
(
!
np
)
{
pr_debug
(
"No sysrq node found"
);
return
;
}
/* Reset in case a __weak definition was present */
sysrq_reset_seq_len
=
0
;
of_property_for_each_u32
(
np
,
"keyset"
,
prop
,
p
,
key
)
{
if
(
key
==
KEY_RESERVED
||
key
>
KEY_MAX
||
sysrq_reset_seq_len
==
SYSRQ_KEY_RESET_MAX
)
break
;
sysrq_reset_seq
[
sysrq_reset_seq_len
++
]
=
(
unsigned
short
)
key
;
}
/* Get reset timeout if any. */
of_property_read_u32
(
np
,
"timeout-ms"
,
&
sysrq_reset_downtime_ms
);
}
#else
static
void
sysrq_of_get_keyreset_config
(
void
)
{
}
#endif
static
void
sysrq_reinject_alt_sysrq
(
struct
work_struct
*
work
)
{
struct
sysrq_state
*
sysrq
=
...
...
@@ -914,6 +949,7 @@ static inline void sysrq_register_handler(void)
int
error
;
int
i
;
/* First check if a __weak interface was instantiated. */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
sysrq_reset_seq
);
i
++
)
{
key
=
platform_sysrq_reset_seq
[
i
];
if
(
key
==
KEY_RESERVED
||
key
>
KEY_MAX
)
...
...
@@ -922,6 +958,12 @@ static inline void sysrq_register_handler(void)
sysrq_reset_seq
[
sysrq_reset_seq_len
++
]
=
key
;
}
/*
* DT configuration takes precedence over anything that would
* have been defined via the __weak interface.
*/
sysrq_of_get_keyreset_config
();
error
=
input_register_handler
(
&
sysrq_handler
);
if
(
error
)
pr_err
(
"Failed to register input handler, error %d"
,
error
);
...
...
include/linux/i8042.h
浏览文件 @
07176b98
...
...
@@ -31,6 +31,30 @@
#define I8042_CMD_MUX_PFX 0x0090
#define I8042_CMD_MUX_SEND 0x1090
/*
* Status register bits.
*/
#define I8042_STR_PARITY 0x80
#define I8042_STR_TIMEOUT 0x40
#define I8042_STR_AUXDATA 0x20
#define I8042_STR_KEYLOCK 0x10
#define I8042_STR_CMDDAT 0x08
#define I8042_STR_MUXERR 0x04
#define I8042_STR_IBF 0x02
#define I8042_STR_OBF 0x01
/*
* Control register bits.
*/
#define I8042_CTR_KBDINT 0x01
#define I8042_CTR_AUXINT 0x02
#define I8042_CTR_IGNKEYLOCK 0x08
#define I8042_CTR_KBDDIS 0x10
#define I8042_CTR_AUXDIS 0x20
#define I8042_CTR_XLATE 0x40
struct
serio
;
#if defined(CONFIG_SERIO_I8042) || defined(CONFIG_SERIO_I8042_MODULE)
...
...
include/uapi/linux/input.h
浏览文件 @
07176b98
...
...
@@ -194,6 +194,8 @@ struct input_keymap_entry {
#define SYN_CONFIG 1
#define SYN_MT_REPORT 2
#define SYN_DROPPED 3
#define SYN_MAX 0xf
#define SYN_CNT (SYN_MAX+1)
/*
* Keys and buttons
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录