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
Kirill Smelkov
linux
Commits
07176b98
Commit
07176b98
authored
Sep 06, 2013
by
Dmitry Torokhov
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'next' into for-linus
Merge first round of changes for 3.12 merge window.
parents
fa46c798
52764fed
Changes
33
Show whitespace changes
Inline
Side-by-side
Showing
33 changed files
with
770 additions
and
321 deletions
+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
No files found.
Documentation/devicetree/bindings/input/input-reset.txt
0 → 100644
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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,18 +113,28 @@ static void kbd_write_irqreg(struct omap4_keypad *keypad_data,
}
/* Interrupt handler */
static
irqreturn_t
omap4_keypad_i
nterrupt
(
int
irq
,
void
*
dev_id
)
/* Interrupt handler
s
*/
static
irqreturn_t
omap4_keypad_i
rq_handler
(
int
irq
,
void
*
dev_id
)
{
struct
omap4_keypad
*
keypad_data
=
dev_id
;
struct
input_dev
*
input_dev
=
keypad_data
->
input
;
unsigned
char
key_state
[
ARRAY_SIZE
(
keypad_data
->
key_state
)];
unsigned
int
col
,
row
,
code
,
changed
;
u32
*
new_state
=
(
u32
*
)
key_state
;
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
;
unsigned
char
key_state
[
ARRAY_SIZE
(
keypad_data
->
key_state
)];
unsigned
int
col
,
row
,
code
,
changed
;
u32
*
new_state
=
(
u32
*
)
key_state
;
*
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
,
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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,14 +283,7 @@ 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"
,
...
...
@@ -300,11 +292,8 @@ static int twl6040_vibra_probe(struct platform_device *pdev)
&
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,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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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,9 +1361,11 @@ 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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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,37 +204,20 @@ static int max11801_ts_probe(struct i2c_client *client,
max11801_ts_phy_init
(
data
);
error
=
request_threaded_irq
(
client
->
irq
,
NULL
,
max11801_ts_interrupt
,
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
;
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
);
i2c_set_clientdata
(
client
,
data
);
return
0
;
}
...
...
@@ -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
View file @
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
View file @
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
View file @
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
...
...
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