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
bbc86087
Commit
bbc86087
authored
Sep 15, 2017
by
Dmitry Torokhov
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'next' into for-linus
Prepare second round of input updates for 4.14 merge window.
parents
a6cbfa1e
697c5d8a
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
380 additions
and
11 deletions
+380
-11
Documentation/devicetree/bindings/input/pwm-vibrator.txt
Documentation/devicetree/bindings/input/pwm-vibrator.txt
+66
-0
drivers/input/joystick/adi.c
drivers/input/joystick/adi.c
+1
-1
drivers/input/joystick/xpad.c
drivers/input/joystick/xpad.c
+6
-4
drivers/input/misc/Kconfig
drivers/input/misc/Kconfig
+12
-0
drivers/input/misc/Makefile
drivers/input/misc/Makefile
+1
-0
drivers/input/misc/pwm-vibra.c
drivers/input/misc/pwm-vibra.c
+267
-0
drivers/input/mouse/elantech.c
drivers/input/mouse/elantech.c
+6
-2
drivers/input/serio/i8042-x86ia64io.h
drivers/input/serio/i8042-x86ia64io.h
+7
-0
drivers/input/touchscreen/edt-ft5x06.c
drivers/input/touchscreen/edt-ft5x06.c
+2
-1
drivers/input/touchscreen/goodix.c
drivers/input/touchscreen/goodix.c
+9
-0
drivers/input/touchscreen/surface3_spi.c
drivers/input/touchscreen/surface3_spi.c
+1
-1
drivers/input/touchscreen/ucb1400_ts.c
drivers/input/touchscreen/ucb1400_ts.c
+2
-2
No files found.
Documentation/devicetree/bindings/input/pwm-vibrator.txt
0 → 100644
View file @
bbc86087
* PWM vibrator device tree bindings
Registers a PWM device as vibrator. It is expected, that the vibrator's
strength increases based on the duty cycle of the enable PWM channel
(100% duty cycle meaning strongest vibration, 0% meaning no vibration).
The binding supports an optional direction PWM channel, that can be
driven at fixed duty cycle. If available this is can be used to increase
the vibration effect of some devices.
Required properties:
- compatible: should contain "pwm-vibrator"
- pwm-names: Should contain "enable" and optionally "direction"
- pwms: Should contain a PWM handle for each entry in pwm-names
Optional properties:
- vcc-supply: Phandle for the regulator supplying power
- direction-duty-cycle-ns: Duty cycle of the direction PWM channel in
nanoseconds, defaults to 50% of the channel's
period.
Example from Motorola Droid 4:
&omap4_pmx_core {
vibrator_direction_pin: pinmux_vibrator_direction_pin {
pinctrl-single,pins = <
OMAP4_IOPAD(0x1ce, PIN_OUTPUT | MUX_MODE1) /* dmtimer8_pwm_evt (gpio_27) */
>;
};
vibrator_enable_pin: pinmux_vibrator_enable_pin {
pinctrl-single,pins = <
OMAP4_IOPAD(0X1d0, PIN_OUTPUT | MUX_MODE1) /* dmtimer9_pwm_evt (gpio_28) */
>;
};
};
/ {
pwm8: dmtimer-pwm {
pinctrl-names = "default";
pinctrl-0 = <&vibrator_direction_pin>;
compatible = "ti,omap-dmtimer-pwm";
#pwm-cells = <3>;
ti,timers = <&timer8>;
ti,clock-source = <0x01>;
};
pwm9: dmtimer-pwm {
pinctrl-names = "default";
pinctrl-0 = <&vibrator_enable_pin>;
compatible = "ti,omap-dmtimer-pwm";
#pwm-cells = <3>;
ti,timers = <&timer9>;
ti,clock-source = <0x01>;
};
vibrator {
compatible = "pwm-vibrator";
pwms = <&pwm8 0 1000000000 0>,
<&pwm9 0 1000000000 0>;
pwm-names = "enable", "direction";
direction-duty-cycle-ns = <1000000000>;
};
};
drivers/input/joystick/adi.c
View file @
bbc86087
...
...
@@ -313,7 +313,7 @@ static void adi_close(struct input_dev *dev)
static
void
adi_init_digital
(
struct
gameport
*
gameport
)
{
int
seq
[]
=
{
4
,
-
2
,
-
3
,
10
,
-
6
,
-
11
,
-
7
,
-
9
,
11
,
0
};
static
const
int
seq
[]
=
{
4
,
-
2
,
-
3
,
10
,
-
6
,
-
11
,
-
7
,
-
9
,
11
,
0
};
int
i
;
for
(
i
=
0
;
seq
[
i
];
i
++
)
{
...
...
drivers/input/joystick/xpad.c
View file @
bbc86087
...
...
@@ -1764,10 +1764,12 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id
struct
usb_endpoint_descriptor
*
ep
=
&
intf
->
cur_altsetting
->
endpoint
[
i
].
desc
;
if
(
usb_endpoint_dir_in
(
ep
))
ep_irq_in
=
ep
;
else
ep_irq_out
=
ep
;
if
(
usb_endpoint_xfer_int
(
ep
))
{
if
(
usb_endpoint_dir_in
(
ep
))
ep_irq_in
=
ep
;
else
ep_irq_out
=
ep
;
}
}
if
(
!
ep_irq_in
||
!
ep_irq_out
)
{
...
...
drivers/input/misc/Kconfig
View file @
bbc86087
...
...
@@ -581,6 +581,18 @@ config INPUT_PWM_BEEPER
To compile this driver as a module, choose M here: the module will be
called pwm-beeper.
config INPUT_PWM_VIBRA
tristate "PWM vibrator support"
depends on PWM
select INPUT_FF_MEMLESS
help
Say Y here to get support for PWM based vibrator devices.
If unsure, say N.
To compile this driver as a module, choose M here: the module will be
called pwm-vibra.
config INPUT_RK805_PWRKEY
tristate "Rockchip RK805 PMIC power key support"
depends on MFD_RK808
...
...
drivers/input/misc/Makefile
View file @
bbc86087
...
...
@@ -59,6 +59,7 @@ obj-$(CONFIG_INPUT_PM8XXX_VIBRATOR) += pm8xxx-vibrator.o
obj-$(CONFIG_INPUT_PMIC8XXX_PWRKEY)
+=
pmic8xxx-pwrkey.o
obj-$(CONFIG_INPUT_POWERMATE)
+=
powermate.o
obj-$(CONFIG_INPUT_PWM_BEEPER)
+=
pwm-beeper.o
obj-$(CONFIG_INPUT_PWM_VIBRA)
+=
pwm-vibra.o
obj-$(CONFIG_INPUT_RB532_BUTTON)
+=
rb532_button.o
obj-$(CONFIG_INPUT_REGULATOR_HAPTIC)
+=
regulator-haptic.o
obj-$(CONFIG_INPUT_RETU_PWRBUTTON)
+=
retu-pwrbutton.o
...
...
drivers/input/misc/pwm-vibra.c
0 → 100644
View file @
bbc86087
/*
* PWM vibrator driver
*
* Copyright (C) 2017 Collabora Ltd.
*
* Based on previous work from:
* Copyright (C) 2012 Dmitry Torokhov <dmitry.torokhov@gmail.com>
*
* Based on PWM beeper driver:
* Copyright (C) 2010, Lars-Peter Clausen <lars@metafoo.de>
*
* 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.
*/
#include <linux/input.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/property.h>
#include <linux/pwm.h>
#include <linux/regulator/consumer.h>
#include <linux/slab.h>
struct
pwm_vibrator
{
struct
input_dev
*
input
;
struct
pwm_device
*
pwm
;
struct
pwm_device
*
pwm_dir
;
struct
regulator
*
vcc
;
struct
work_struct
play_work
;
u16
level
;
u32
direction_duty_cycle
;
};
static
int
pwm_vibrator_start
(
struct
pwm_vibrator
*
vibrator
)
{
struct
device
*
pdev
=
vibrator
->
input
->
dev
.
parent
;
struct
pwm_state
state
;
int
err
;
err
=
regulator_enable
(
vibrator
->
vcc
);
if
(
err
)
{
dev_err
(
pdev
,
"failed to enable regulator: %d"
,
err
);
return
err
;
}
pwm_get_state
(
vibrator
->
pwm
,
&
state
);
pwm_set_relative_duty_cycle
(
&
state
,
vibrator
->
level
,
0xffff
);
state
.
enabled
=
true
;
err
=
pwm_apply_state
(
vibrator
->
pwm
,
&
state
);
if
(
err
)
{
dev_err
(
pdev
,
"failed to apply pwm state: %d"
,
err
);
return
err
;
}
if
(
vibrator
->
pwm_dir
)
{
pwm_get_state
(
vibrator
->
pwm_dir
,
&
state
);
state
.
duty_cycle
=
vibrator
->
direction_duty_cycle
;
state
.
enabled
=
true
;
err
=
pwm_apply_state
(
vibrator
->
pwm_dir
,
&
state
);
if
(
err
)
{
dev_err
(
pdev
,
"failed to apply dir-pwm state: %d"
,
err
);
pwm_disable
(
vibrator
->
pwm
);
return
err
;
}
}
return
0
;
}
static
void
pwm_vibrator_stop
(
struct
pwm_vibrator
*
vibrator
)
{
regulator_disable
(
vibrator
->
vcc
);
if
(
vibrator
->
pwm_dir
)
pwm_disable
(
vibrator
->
pwm_dir
);
pwm_disable
(
vibrator
->
pwm
);
}
static
void
pwm_vibrator_play_work
(
struct
work_struct
*
work
)
{
struct
pwm_vibrator
*
vibrator
=
container_of
(
work
,
struct
pwm_vibrator
,
play_work
);
if
(
vibrator
->
level
)
pwm_vibrator_start
(
vibrator
);
else
pwm_vibrator_stop
(
vibrator
);
}
static
int
pwm_vibrator_play_effect
(
struct
input_dev
*
dev
,
void
*
data
,
struct
ff_effect
*
effect
)
{
struct
pwm_vibrator
*
vibrator
=
input_get_drvdata
(
dev
);
vibrator
->
level
=
effect
->
u
.
rumble
.
strong_magnitude
;
if
(
!
vibrator
->
level
)
vibrator
->
level
=
effect
->
u
.
rumble
.
weak_magnitude
;
schedule_work
(
&
vibrator
->
play_work
);
return
0
;
}
static
void
pwm_vibrator_close
(
struct
input_dev
*
input
)
{
struct
pwm_vibrator
*
vibrator
=
input_get_drvdata
(
input
);
cancel_work_sync
(
&
vibrator
->
play_work
);
pwm_vibrator_stop
(
vibrator
);
}
static
int
pwm_vibrator_probe
(
struct
platform_device
*
pdev
)
{
struct
pwm_vibrator
*
vibrator
;
struct
pwm_state
state
;
int
err
;
vibrator
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
*
vibrator
),
GFP_KERNEL
);
if
(
!
vibrator
)
return
-
ENOMEM
;
vibrator
->
input
=
devm_input_allocate_device
(
&
pdev
->
dev
);
if
(
!
vibrator
->
input
)
return
-
ENOMEM
;
vibrator
->
vcc
=
devm_regulator_get
(
&
pdev
->
dev
,
"vcc"
);
err
=
PTR_ERR_OR_ZERO
(
vibrator
->
vcc
);
if
(
err
)
{
if
(
err
!=
-
EPROBE_DEFER
)
dev_err
(
&
pdev
->
dev
,
"Failed to request regulator: %d"
,
err
);
return
err
;
}
vibrator
->
pwm
=
devm_pwm_get
(
&
pdev
->
dev
,
"enable"
);
err
=
PTR_ERR_OR_ZERO
(
vibrator
->
pwm
);
if
(
err
)
{
if
(
err
!=
-
EPROBE_DEFER
)
dev_err
(
&
pdev
->
dev
,
"Failed to request main pwm: %d"
,
err
);
return
err
;
}
INIT_WORK
(
&
vibrator
->
play_work
,
pwm_vibrator_play_work
);
/* Sync up PWM state and ensure it is off. */
pwm_init_state
(
vibrator
->
pwm
,
&
state
);
state
.
enabled
=
false
;
err
=
pwm_apply_state
(
vibrator
->
pwm
,
&
state
);
if
(
err
)
{
dev_err
(
&
pdev
->
dev
,
"failed to apply initial PWM state: %d"
,
err
);
return
err
;
}
vibrator
->
pwm_dir
=
devm_pwm_get
(
&
pdev
->
dev
,
"direction"
);
err
=
PTR_ERR_OR_ZERO
(
vibrator
->
pwm_dir
);
switch
(
err
)
{
case
0
:
/* Sync up PWM state and ensure it is off. */
pwm_init_state
(
vibrator
->
pwm_dir
,
&
state
);
state
.
enabled
=
false
;
err
=
pwm_apply_state
(
vibrator
->
pwm_dir
,
&
state
);
if
(
err
)
{
dev_err
(
&
pdev
->
dev
,
"failed to apply initial PWM state: %d"
,
err
);
return
err
;
}
vibrator
->
direction_duty_cycle
=
pwm_get_period
(
vibrator
->
pwm_dir
)
/
2
;
device_property_read_u32
(
&
pdev
->
dev
,
"direction-duty-cycle-ns"
,
&
vibrator
->
direction_duty_cycle
);
break
;
case
-
ENODATA
:
/* Direction PWM is optional */
vibrator
->
pwm_dir
=
NULL
;
break
;
default:
dev_err
(
&
pdev
->
dev
,
"Failed to request direction pwm: %d"
,
err
);
/* Fall through */
case
-
EPROBE_DEFER
:
return
err
;
}
vibrator
->
input
->
name
=
"pwm-vibrator"
;
vibrator
->
input
->
id
.
bustype
=
BUS_HOST
;
vibrator
->
input
->
dev
.
parent
=
&
pdev
->
dev
;
vibrator
->
input
->
close
=
pwm_vibrator_close
;
input_set_drvdata
(
vibrator
->
input
,
vibrator
);
input_set_capability
(
vibrator
->
input
,
EV_FF
,
FF_RUMBLE
);
err
=
input_ff_create_memless
(
vibrator
->
input
,
NULL
,
pwm_vibrator_play_effect
);
if
(
err
)
{
dev_err
(
&
pdev
->
dev
,
"Couldn't create FF dev: %d"
,
err
);
return
err
;
}
err
=
input_register_device
(
vibrator
->
input
);
if
(
err
)
{
dev_err
(
&
pdev
->
dev
,
"Couldn't register input dev: %d"
,
err
);
return
err
;
}
platform_set_drvdata
(
pdev
,
vibrator
);
return
0
;
}
static
int
__maybe_unused
pwm_vibrator_suspend
(
struct
device
*
dev
)
{
struct
pwm_vibrator
*
vibrator
=
dev_get_drvdata
(
dev
);
cancel_work_sync
(
&
vibrator
->
play_work
);
if
(
vibrator
->
level
)
pwm_vibrator_stop
(
vibrator
);
return
0
;
}
static
int
__maybe_unused
pwm_vibrator_resume
(
struct
device
*
dev
)
{
struct
pwm_vibrator
*
vibrator
=
dev_get_drvdata
(
dev
);
if
(
vibrator
->
level
)
pwm_vibrator_start
(
vibrator
);
return
0
;
}
static
SIMPLE_DEV_PM_OPS
(
pwm_vibrator_pm_ops
,
pwm_vibrator_suspend
,
pwm_vibrator_resume
);
#ifdef CONFIG_OF
static
const
struct
of_device_id
pwm_vibra_dt_match_table
[]
=
{
{
.
compatible
=
"pwm-vibrator"
},
{},
};
MODULE_DEVICE_TABLE
(
of
,
pwm_vibra_dt_match_table
);
#endif
static
struct
platform_driver
pwm_vibrator_driver
=
{
.
probe
=
pwm_vibrator_probe
,
.
driver
=
{
.
name
=
"pwm-vibrator"
,
.
pm
=
&
pwm_vibrator_pm_ops
,
.
of_match_table
=
of_match_ptr
(
pwm_vibra_dt_match_table
),
},
};
module_platform_driver
(
pwm_vibrator_driver
);
MODULE_AUTHOR
(
"Sebastian Reichel <sre@kernel.org>"
);
MODULE_DESCRIPTION
(
"PWM vibrator driver"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_ALIAS
(
"platform:pwm-vibrator"
);
drivers/input/mouse/elantech.c
View file @
bbc86087
...
...
@@ -700,7 +700,9 @@ static int elantech_debounce_check_v2(struct psmouse *psmouse)
* When we encounter packet that matches this exactly, it means the
* hardware is in debounce status. Just ignore the whole packet.
*/
const
u8
debounce_packet
[]
=
{
0x84
,
0xff
,
0xff
,
0x02
,
0xff
,
0xff
};
static
const
u8
debounce_packet
[]
=
{
0x84
,
0xff
,
0xff
,
0x02
,
0xff
,
0xff
};
unsigned
char
*
packet
=
psmouse
->
packet
;
return
!
memcmp
(
packet
,
debounce_packet
,
sizeof
(
debounce_packet
));
...
...
@@ -741,7 +743,9 @@ static int elantech_packet_check_v2(struct psmouse *psmouse)
static
int
elantech_packet_check_v3
(
struct
psmouse
*
psmouse
)
{
struct
elantech_data
*
etd
=
psmouse
->
private
;
const
u8
debounce_packet
[]
=
{
0xc4
,
0xff
,
0xff
,
0x02
,
0xff
,
0xff
};
static
const
u8
debounce_packet
[]
=
{
0xc4
,
0xff
,
0xff
,
0x02
,
0xff
,
0xff
};
unsigned
char
*
packet
=
psmouse
->
packet
;
/*
...
...
drivers/input/serio/i8042-x86ia64io.h
View file @
bbc86087
...
...
@@ -839,6 +839,13 @@ static const struct dmi_system_id __initconst i8042_dmi_kbdreset_table[] = {
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"P34"
),
},
},
{
/* Gigabyte P57 - Elantech touchpad */
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"GIGABYTE"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"P57"
),
},
},
{
/* Schenker XMG C504 - Elantech touchpad */
.
matches
=
{
...
...
drivers/input/touchscreen/edt-ft5x06.c
View file @
bbc86087
...
...
@@ -593,7 +593,7 @@ static int edt_ft5x06_work_mode(struct edt_ft5x06_ts_data *tsdata)
tsdata
->
gain
);
edt_ft5x06_register_write
(
tsdata
,
reg_addr
->
reg_offset
,
tsdata
->
offset
);
if
(
reg_addr
->
reg_report_rate
)
if
(
reg_addr
->
reg_report_rate
!=
NO_REGISTER
)
edt_ft5x06_register_write
(
tsdata
,
reg_addr
->
reg_report_rate
,
tsdata
->
report_rate
);
...
...
@@ -874,6 +874,7 @@ edt_ft5x06_ts_set_regs(struct edt_ft5x06_ts_data *tsdata)
case
M09
:
reg_addr
->
reg_threshold
=
M09_REGISTER_THRESHOLD
;
reg_addr
->
reg_report_rate
=
NO_REGISTER
;
reg_addr
->
reg_gain
=
M09_REGISTER_GAIN
;
reg_addr
->
reg_offset
=
M09_REGISTER_OFFSET
;
reg_addr
->
reg_num_x
=
M09_REGISTER_NUM_X
;
...
...
drivers/input/touchscreen/goodix.c
View file @
bbc86087
...
...
@@ -267,6 +267,12 @@ static void goodix_process_events(struct goodix_ts_data *ts)
if
(
touch_num
<
0
)
return
;
/*
* Bit 4 of the first byte reports the status of the capacitive
* Windows/Home button.
*/
input_report_key
(
ts
->
input_dev
,
KEY_LEFTMETA
,
point_data
[
0
]
&
BIT
(
4
));
for
(
i
=
0
;
i
<
touch_num
;
i
++
)
goodix_ts_report_touch
(
ts
,
&
point_data
[
1
+
GOODIX_CONTACT_SIZE
*
i
]);
...
...
@@ -612,6 +618,9 @@ static int goodix_request_input_dev(struct goodix_ts_data *ts)
ts
->
input_dev
->
id
.
product
=
ts
->
id
;
ts
->
input_dev
->
id
.
version
=
ts
->
version
;
/* Capacitive Windows/Home button on some devices */
input_set_capability
(
ts
->
input_dev
,
EV_KEY
,
KEY_LEFTMETA
);
error
=
input_register_device
(
ts
->
input_dev
);
if
(
error
)
{
dev_err
(
&
ts
->
client
->
dev
,
...
...
drivers/input/touchscreen/surface3_spi.c
View file @
bbc86087
...
...
@@ -173,7 +173,7 @@ static void surface3_spi_process_pen(struct surface3_ts_data *ts_data, u8 *data)
static
void
surface3_spi_process
(
struct
surface3_ts_data
*
ts_data
)
{
const
char
header
[]
=
{
static
const
char
header
[]
=
{
0xff
,
0xff
,
0xff
,
0xff
,
0xa5
,
0x5a
,
0xe7
,
0x7e
,
0x01
};
u8
*
data
=
ts_data
->
rd_buf
;
...
...
drivers/input/touchscreen/ucb1400_ts.c
View file @
bbc86087
...
...
@@ -414,7 +414,7 @@ static int __maybe_unused ucb1400_ts_suspend(struct device *dev)
mutex_lock
(
&
idev
->
mutex
);
if
(
idev
->
users
)
ucb1400_ts_st
art
(
ucb
);
ucb1400_ts_st
op
(
ucb
);
mutex_unlock
(
&
idev
->
mutex
);
return
0
;
...
...
@@ -428,7 +428,7 @@ static int __maybe_unused ucb1400_ts_resume(struct device *dev)
mutex_lock
(
&
idev
->
mutex
);
if
(
idev
->
users
)
ucb1400_ts_st
op
(
ucb
);
ucb1400_ts_st
art
(
ucb
);
mutex_unlock
(
&
idev
->
mutex
);
return
0
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment