mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
Pull input updates from Dmitry Torokhov: - updates to Ilitech driver to support ILI2117 - face lift of st1232 driver to support MT-B protocol - a new driver for i.MX system controller keys - mpr121 driver now supports polling mode - various input drivers have been switched away from input_polled_dev to use polled mode of regular input devices - other assorted cleanups and fixes * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: (70 commits) Input: synaptics-rmi4 - fix various V4L2 compliance problems in F54 Input: synaptics - switch another X1 Carbon 6 to RMI/SMbus Input: fix Kconfig indentation Input: imx_sc_key - correct SCU message structure to avoid stack corruption Input: ili210x - optionally show calibrate sysfs attribute Input: ili210x - add resolution to chip operations structure Input: ili210x - do not retrieve/print chip firmware version Input: mms114 - use device_get_match_data Input: ili210x - remove unneeded suspend and resume handlers Input: ili210x - do not unconditionally mark touchscreen as wakeup source Input: ili210x - define and use chip operations structure Input: ili210x - do not set parent device explicitly Input: ili210x - handle errors from input_mt_init_slots() Input: ili210x - switch to using threaded IRQ Input: ili210x - add ILI2117 support dt-bindings: input: touchscreen: ad7879: generic node names in example Input: ar1021 - fix typo in preprocessor macro name Input: synaptics-rmi4 - simplify data read in rmi_f54_work Input: kxtj9 - switch to using polled mode of input devices Input: kxtj9 - switch to using managed resources ...
This commit is contained in:
commit
72c0870e3a
56 files changed
+1650
-1895
No files matched your search
@@ -157,6 +157,15 @@ Required properties:
|
||||
Optional properties:
|
||||
- timeout-sec: contains the watchdog timeout in seconds.
|
||||
|
||||
SCU key bindings based on SCU Message Protocol
|
||||
------------------------------------------------------------
|
||||
|
||||
Required properties:
|
||||
- compatible: should be:
|
||||
"fsl,imx8qxp-sc-key"
|
||||
followed by "fsl,imx-sc-key";
|
||||
- linux,keycodes: See Documentation/devicetree/bindings/input/keys.txt
|
||||
|
||||
Example (imx8qxp):
|
||||
-------------
|
||||
aliases {
|
||||
@@ -220,6 +229,11 @@ firmware {
|
||||
compatible = "fsl,imx8qxp-sc-rtc";
|
||||
};
|
||||
|
||||
scu_key: scu-key {
|
||||
compatible = "fsl,imx8qxp-sc-key", "fsl,imx-sc-key";
|
||||
linux,keycodes = <KEY_POWER>;
|
||||
};
|
||||
|
||||
watchdog {
|
||||
compatible = "fsl,imx8qxp-sc-wdt", "fsl,imx-sc-wdt";
|
||||
timeout-sec = <60>;
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/input/fsl,mpr121-touchkey.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Freescale MPR121 capacitive touch sensor controller
|
||||
|
||||
maintainers:
|
||||
- Dmitry Torokhov <dmitry.torokhov@gmail.com>
|
||||
|
||||
description: |
|
||||
The MPR121 supports up to 12 completely independent electrodes/capacitance
|
||||
sensing inputs in which 8 are multifunctional for LED driving and GPIO.
|
||||
https://www.nxp.com/docs/en/data-sheet/MPR121.pdf
|
||||
|
||||
allOf:
|
||||
- $ref: input.yaml#
|
||||
|
||||
anyOf:
|
||||
- required: [ interrupts ]
|
||||
- required: [ poll-interval ]
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: fsl,mpr121-touchkey
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
vdd-supply:
|
||||
maxItems: 1
|
||||
|
||||
linux,keycodes:
|
||||
minItems: 1
|
||||
maxItems: 12
|
||||
|
||||
wakeup-source:
|
||||
description: Use any event on keypad as wakeup event.
|
||||
type: boolean
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- vdd-supply
|
||||
- linux,keycodes
|
||||
|
||||
examples:
|
||||
- |
|
||||
// Example with interrupts
|
||||
#include "dt-bindings/input/input.h"
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
mpr121@5a {
|
||||
compatible = "fsl,mpr121-touchkey";
|
||||
reg = <0x5a>;
|
||||
interrupt-parent = <&gpio1>;
|
||||
interrupts = <28 2>;
|
||||
autorepeat;
|
||||
vdd-supply = <&ldo4_reg>;
|
||||
linux,keycodes = <KEY_0>, <KEY_1>, <KEY_2>, <KEY_3>,
|
||||
<KEY_4>, <KEY_5>, <KEY_6>, <KEY_7>,
|
||||
<KEY_8>, <KEY_9>, <KEY_A>, <KEY_B>;
|
||||
};
|
||||
};
|
||||
|
||||
- |
|
||||
// Example with polling
|
||||
#include "dt-bindings/input/input.h"
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
mpr121@5a {
|
||||
compatible = "fsl,mpr121-touchkey";
|
||||
reg = <0x5a>;
|
||||
poll-interval = <20>;
|
||||
autorepeat;
|
||||
vdd-supply = <&ldo4_reg>;
|
||||
linux,keycodes = <KEY_0>, <KEY_1>, <KEY_2>, <KEY_3>,
|
||||
<KEY_4>, <KEY_5>, <KEY_6>, <KEY_7>,
|
||||
<KEY_8>, <KEY_9>, <KEY_A>, <KEY_B>;
|
||||
};
|
||||
};
|
||||
@@ -1,8 +1,9 @@
|
||||
Ilitek ILI210x/ILI251x touchscreen controller
|
||||
Ilitek ILI210x/ILI2117/ILI251x touchscreen controller
|
||||
|
||||
Required properties:
|
||||
- compatible:
|
||||
ilitek,ili210x for ILI210x
|
||||
ilitek,ili2117 for ILI2117
|
||||
ilitek,ili251x for ILI251x
|
||||
|
||||
- reg: The I2C address of the device
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/input/input.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Common input schema binding
|
||||
|
||||
maintainers:
|
||||
- Dmitry Torokhov <dmitry.torokhov@gmail.com>
|
||||
|
||||
properties:
|
||||
autorepeat:
|
||||
description: Enable autorepeat when key is pressed and held down.
|
||||
type: boolean
|
||||
|
||||
linux,keycodes:
|
||||
description:
|
||||
Specifies an array of numeric keycode values to be used for reporting
|
||||
button presses.
|
||||
allOf:
|
||||
- $ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
- items:
|
||||
minimum: 0
|
||||
maximum: 0xff
|
||||
|
||||
poll-interval:
|
||||
description: Poll interval time in milliseconds.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
||||
power-off-time-sec:
|
||||
description:
|
||||
Duration in seconds which the key should be kept pressed for device to
|
||||
power off automatically. Device with key pressed shutdown feature can
|
||||
specify this property.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
@@ -1,8 +0,0 @@
|
||||
General Keys Properties:
|
||||
|
||||
Optional properties for Keys:
|
||||
- power-off-time-sec: Duration in seconds which the key should be kept
|
||||
pressed for device to power off automatically. Device with key pressed
|
||||
shutdown feature can specify this property.
|
||||
- linux,keycodes: Specifies the numeric keycode values to be used for
|
||||
reporting key presses.
|
||||
@@ -1,30 +0,0 @@
|
||||
* Freescale MPR121 Controllor
|
||||
|
||||
Required Properties:
|
||||
- compatible: Should be "fsl,mpr121-touchkey"
|
||||
- reg: The I2C slave address of the device.
|
||||
- interrupts: The interrupt number to the cpu.
|
||||
- vdd-supply: Phandle to the Vdd power supply.
|
||||
- linux,keycodes: Specifies an array of numeric keycode values to
|
||||
be used for reporting button presses. The array can
|
||||
contain up to 12 entries.
|
||||
|
||||
Optional Properties:
|
||||
- wakeup-source: Use any event on keypad as wakeup event.
|
||||
- autorepeat: Enable autorepeat feature.
|
||||
|
||||
Example:
|
||||
|
||||
#include "dt-bindings/input/input.h"
|
||||
|
||||
touchkey: mpr121@5a {
|
||||
compatible = "fsl,mpr121-touchkey";
|
||||
reg = <0x5a>;
|
||||
interrupt-parent = <&gpio1>;
|
||||
interrupts = <28 2>;
|
||||
autorepeat;
|
||||
vdd-supply = <&ldo4_reg>;
|
||||
linux,keycodes = <KEY_0>, <KEY_1>, <KEY_2>, <KEY_3>,
|
||||
<KEY_4> <KEY_5>, <KEY_6>, <KEY_7>,
|
||||
<KEY_8>, <KEY_9>, <KEY_A>, <KEY_B>;
|
||||
};
|
||||
@@ -10,13 +10,13 @@ Documentation/devicetree/bindings/mfd/mt6397.txt
|
||||
|
||||
Required properties:
|
||||
- compatible: "mediatek,mt6397-keys" or "mediatek,mt6323-keys"
|
||||
- linux,keycodes: See Documentation/devicetree/bindings/input/keys.txt
|
||||
- linux,keycodes: See Documentation/devicetree/bindings/input/input.yaml
|
||||
|
||||
Optional Properties:
|
||||
- wakeup-source: See Documentation/devicetree/bindings/power/wakeup-source.txt
|
||||
- mediatek,long-press-mode: Long press key shutdown setting, 1 for
|
||||
pwrkey only, 2 for pwrkey/homekey together, others for disabled.
|
||||
- power-off-time-sec: See Documentation/devicetree/bindings/input/keys.txt
|
||||
- power-off-time-sec: See Documentation/devicetree/bindings/input/input.yaml
|
||||
|
||||
Example:
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ Optional properties:
|
||||
- st,onkey-pu-inactive: onkey pull up is not active
|
||||
- power-off-time-sec: Duration in seconds which the key should be kept
|
||||
pressed for device to power off automatically (from 1 to 16 seconds).
|
||||
see See Documentation/devicetree/bindings/input/keys.txt
|
||||
see See Documentation/devicetree/bindings/input/input.yaml
|
||||
|
||||
Example:
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ Optional properties:
|
||||
|
||||
Example:
|
||||
|
||||
ad7879@2c {
|
||||
touchscreen0@2c {
|
||||
compatible = "adi,ad7879-1";
|
||||
reg = <0x2c>;
|
||||
interrupt-parent = <&gpio1>;
|
||||
@@ -52,7 +52,7 @@ Example:
|
||||
adi,conversion-interval = /bits/ 8 <255>;
|
||||
};
|
||||
|
||||
ad7879@1 {
|
||||
touchscreen1@1 {
|
||||
compatible = "adi,ad7879";
|
||||
spi-max-frequency = <5000000>;
|
||||
reg = <1>;
|
||||
|
||||
@@ -30,6 +30,7 @@ Required properties:
|
||||
Optional properties:
|
||||
- reset-gpios: GPIO specification for the RESET input
|
||||
- wake-gpios: GPIO specification for the WAKE input
|
||||
- vcc-supply: Regulator that supplies the touchscreen
|
||||
|
||||
- pinctrl-names: should be "default"
|
||||
- pinctrl-0: a phandle pointing to the pin settings for the
|
||||
|
||||
@@ -123,6 +123,15 @@ void input_set_max_poll_interval(struct input_dev *dev, unsigned int interval)
|
||||
}
|
||||
EXPORT_SYMBOL(input_set_max_poll_interval);
|
||||
|
||||
int input_get_poll_interval(struct input_dev *dev)
|
||||
{
|
||||
if (!dev->poller)
|
||||
return -EINVAL;
|
||||
|
||||
return dev->poller->poll_interval;
|
||||
}
|
||||
EXPORT_SYMBOL(input_get_poll_interval);
|
||||
|
||||
/* SYSFS interface */
|
||||
|
||||
static ssize_t input_dev_get_poll_interval(struct device *dev,
|
||||
|
||||
@@ -334,7 +334,6 @@ config JOYSTICK_MAPLE
|
||||
config JOYSTICK_PSXPAD_SPI
|
||||
tristate "PlayStation 1/2 joypads via SPI interface"
|
||||
depends on SPI
|
||||
select INPUT_POLLDEV
|
||||
help
|
||||
Say Y here if you wish to connect PlayStation 1/2 joypads
|
||||
via SPI interface.
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/input-polldev.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/types.h>
|
||||
@@ -60,7 +59,7 @@ static const u8 PSX_CMD_ENABLE_MOTOR[] = {
|
||||
|
||||
struct psxpad {
|
||||
struct spi_device *spi;
|
||||
struct input_polled_dev *pdev;
|
||||
struct input_dev *idev;
|
||||
char phys[0x20];
|
||||
bool motor1enable;
|
||||
bool motor2enable;
|
||||
@@ -140,8 +139,7 @@ static void psxpad_set_motor_level(struct psxpad *pad,
|
||||
static int psxpad_spi_play_effect(struct input_dev *idev,
|
||||
void *data, struct ff_effect *effect)
|
||||
{
|
||||
struct input_polled_dev *pdev = input_get_drvdata(idev);
|
||||
struct psxpad *pad = pdev->private;
|
||||
struct psxpad *pad = input_get_drvdata(idev);
|
||||
|
||||
switch (effect->type) {
|
||||
case FF_RUMBLE:
|
||||
@@ -158,10 +156,9 @@ static int psxpad_spi_init_ff(struct psxpad *pad)
|
||||
{
|
||||
int err;
|
||||
|
||||
input_set_capability(pad->pdev->input, EV_FF, FF_RUMBLE);
|
||||
input_set_capability(pad->idev, EV_FF, FF_RUMBLE);
|
||||
|
||||
err = input_ff_create_memless(pad->pdev->input, NULL,
|
||||
psxpad_spi_play_effect);
|
||||
err = input_ff_create_memless(pad->idev, NULL, psxpad_spi_play_effect);
|
||||
if (err) {
|
||||
dev_err(&pad->spi->dev,
|
||||
"input_ff_create_memless() failed: %d\n", err);
|
||||
@@ -189,24 +186,25 @@ static inline int psxpad_spi_init_ff(struct psxpad *pad)
|
||||
}
|
||||
#endif /* CONFIG_JOYSTICK_PSXPAD_SPI_FF */
|
||||
|
||||
static void psxpad_spi_poll_open(struct input_polled_dev *pdev)
|
||||
static int psxpad_spi_poll_open(struct input_dev *input)
|
||||
{
|
||||
struct psxpad *pad = pdev->private;
|
||||
struct psxpad *pad = input_get_drvdata(input);
|
||||
|
||||
pm_runtime_get_sync(&pad->spi->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void psxpad_spi_poll_close(struct input_polled_dev *pdev)
|
||||
static void psxpad_spi_poll_close(struct input_dev *input)
|
||||
{
|
||||
struct psxpad *pad = pdev->private;
|
||||
struct psxpad *pad = input_get_drvdata(input);
|
||||
|
||||
pm_runtime_put_sync(&pad->spi->dev);
|
||||
}
|
||||
|
||||
static void psxpad_spi_poll(struct input_polled_dev *pdev)
|
||||
static void psxpad_spi_poll(struct input_dev *input)
|
||||
{
|
||||
struct psxpad *pad = pdev->private;
|
||||
struct input_dev *input = pdev->input;
|
||||
struct psxpad *pad = input_get_drvdata(input);
|
||||
u8 b_rsp3, b_rsp4;
|
||||
int err;
|
||||
|
||||
@@ -284,7 +282,6 @@ static void psxpad_spi_poll(struct input_polled_dev *pdev)
|
||||
static int psxpad_spi_probe(struct spi_device *spi)
|
||||
{
|
||||
struct psxpad *pad;
|
||||
struct input_polled_dev *pdev;
|
||||
struct input_dev *idev;
|
||||
int err;
|
||||
|
||||
@@ -292,31 +289,26 @@ static int psxpad_spi_probe(struct spi_device *spi)
|
||||
if (!pad)
|
||||
return -ENOMEM;
|
||||
|
||||
pdev = input_allocate_polled_device();
|
||||
if (!pdev) {
|
||||
idev = devm_input_allocate_device(&spi->dev);
|
||||
if (!idev) {
|
||||
dev_err(&spi->dev, "failed to allocate input device\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* input poll device settings */
|
||||
pad->pdev = pdev;
|
||||
pad->idev = idev;
|
||||
pad->spi = spi;
|
||||
|
||||
pdev->private = pad;
|
||||
pdev->open = psxpad_spi_poll_open;
|
||||
pdev->close = psxpad_spi_poll_close;
|
||||
pdev->poll = psxpad_spi_poll;
|
||||
/* poll interval is about 60fps */
|
||||
pdev->poll_interval = 16;
|
||||
pdev->poll_interval_min = 8;
|
||||
pdev->poll_interval_max = 32;
|
||||
|
||||
/* input device settings */
|
||||
idev = pdev->input;
|
||||
input_set_drvdata(idev, pad);
|
||||
|
||||
idev->name = "PlayStation 1/2 joypad";
|
||||
snprintf(pad->phys, sizeof(pad->phys), "%s/input", dev_name(&spi->dev));
|
||||
idev->id.bustype = BUS_SPI;
|
||||
|
||||
idev->open = psxpad_spi_poll_open;
|
||||
idev->close = psxpad_spi_poll_close;
|
||||
|
||||
/* key/value map settings */
|
||||
input_set_abs_params(idev, ABS_X, 0, 255, 0, 0);
|
||||
input_set_abs_params(idev, ABS_Y, 0, 255, 0, 0);
|
||||
@@ -354,11 +346,23 @@ static int psxpad_spi_probe(struct spi_device *spi)
|
||||
/* pad settings */
|
||||
psxpad_set_motor_level(pad, 0, 0);
|
||||
|
||||
|
||||
err = input_setup_polling(idev, psxpad_spi_poll);
|
||||
if (err) {
|
||||
dev_err(&spi->dev, "failed to set up polling: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
/* poll interval is about 60fps */
|
||||
input_set_poll_interval(idev, 16);
|
||||
input_set_min_poll_interval(idev, 8);
|
||||
input_set_max_poll_interval(idev, 32);
|
||||
|
||||
/* register input poll device */
|
||||
err = input_register_polled_device(pdev);
|
||||
err = input_register_device(idev);
|
||||
if (err) {
|
||||
dev_err(&spi->dev,
|
||||
"failed to register input poll device: %d\n", err);
|
||||
"failed to register input device: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,6 @@ if INPUT_KEYBOARD
|
||||
config KEYBOARD_ADC
|
||||
tristate "ADC Ladder Buttons"
|
||||
depends on IIO
|
||||
select INPUT_POLLDEV
|
||||
help
|
||||
This driver implements support for buttons connected
|
||||
to an ADC using a resistor ladder.
|
||||
@@ -168,14 +167,14 @@ config KEYBOARD_QT1050
|
||||
the module will be called qt1050
|
||||
|
||||
config KEYBOARD_QT1070
|
||||
tristate "Atmel AT42QT1070 Touch Sensor Chip"
|
||||
depends on I2C
|
||||
help
|
||||
Say Y here if you want to use Atmel AT42QT1070 QTouch
|
||||
Sensor chip as input device.
|
||||
tristate "Atmel AT42QT1070 Touch Sensor Chip"
|
||||
depends on I2C
|
||||
help
|
||||
Say Y here if you want to use Atmel AT42QT1070 QTouch
|
||||
Sensor chip as input device.
|
||||
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called qt1070
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called qt1070
|
||||
|
||||
config KEYBOARD_QT2160
|
||||
tristate "Atmel AT42QT2160 Touch Sensor Chip"
|
||||
@@ -191,7 +190,6 @@ config KEYBOARD_CLPS711X
|
||||
tristate "CLPS711X Keypad support"
|
||||
depends on OF_GPIO && (ARCH_CLPS711X || COMPILE_TEST)
|
||||
select INPUT_MATRIXKMAP
|
||||
select INPUT_POLLDEV
|
||||
help
|
||||
Say Y here to enable the matrix keypad on the Cirrus Logic
|
||||
CLPS711X CPUs.
|
||||
@@ -250,7 +248,6 @@ config KEYBOARD_GPIO
|
||||
config KEYBOARD_GPIO_POLLED
|
||||
tristate "Polled GPIO buttons"
|
||||
depends on GPIOLIB
|
||||
select INPUT_POLLDEV
|
||||
help
|
||||
This driver implements support for buttons connected
|
||||
to GPIO pins that are not capable of generating interrupts.
|
||||
@@ -342,7 +339,6 @@ config KEYBOARD_HIL
|
||||
config KEYBOARD_HP6XX
|
||||
tristate "HP Jornada 6xx keyboard"
|
||||
depends on SH_HP6XX
|
||||
select INPUT_POLLDEV
|
||||
help
|
||||
Say Y here if you have a HP Jornada 620/660/680/690 and want to
|
||||
support the built-in keyboard.
|
||||
@@ -469,6 +465,16 @@ config KEYBOARD_IMX
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called imx_keypad.
|
||||
|
||||
config KEYBOARD_IMX_SC_KEY
|
||||
tristate "IMX SCU Key Driver"
|
||||
depends on IMX_SCU
|
||||
help
|
||||
This is the system controller key driver for NXP i.MX SoCs with
|
||||
system controller inside.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called imx_sc_key.
|
||||
|
||||
config KEYBOARD_NEWTON
|
||||
tristate "Newton keyboard"
|
||||
select SERIO
|
||||
|
||||
@@ -29,6 +29,7 @@ obj-$(CONFIG_KEYBOARD_HIL) += hil_kbd.o
|
||||
obj-$(CONFIG_KEYBOARD_HIL_OLD) += hilkbd.o
|
||||
obj-$(CONFIG_KEYBOARD_IPAQ_MICRO) += ipaq-micro-keys.o
|
||||
obj-$(CONFIG_KEYBOARD_IMX) += imx_keypad.o
|
||||
obj-$(CONFIG_KEYBOARD_IMX_SC_KEY) += imx_sc_key.o
|
||||
obj-$(CONFIG_KEYBOARD_HP6XX) += jornada680_kbd.o
|
||||
obj-$(CONFIG_KEYBOARD_HP7XX) += jornada720_kbd.o
|
||||
obj-$(CONFIG_KEYBOARD_LKKBD) += lkkbd.o
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
#include <linux/iio/consumer.h>
|
||||
#include <linux/iio/types.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/input-polldev.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
@@ -30,9 +29,9 @@ struct adc_keys_state {
|
||||
const struct adc_keys_button *map;
|
||||
};
|
||||
|
||||
static void adc_keys_poll(struct input_polled_dev *dev)
|
||||
static void adc_keys_poll(struct input_dev *input)
|
||||
{
|
||||
struct adc_keys_state *st = dev->private;
|
||||
struct adc_keys_state *st = input_get_drvdata(input);
|
||||
int i, value, ret;
|
||||
u32 diff, closest = 0xffffffff;
|
||||
int keycode = 0;
|
||||
@@ -55,12 +54,12 @@ static void adc_keys_poll(struct input_polled_dev *dev)
|
||||
keycode = 0;
|
||||
|
||||
if (st->last_key && st->last_key != keycode)
|
||||
input_report_key(dev->input, st->last_key, 0);
|
||||
input_report_key(input, st->last_key, 0);
|
||||
|
||||
if (keycode)
|
||||
input_report_key(dev->input, keycode, 1);
|
||||
input_report_key(input, keycode, 1);
|
||||
|
||||
input_sync(dev->input);
|
||||
input_sync(input);
|
||||
st->last_key = keycode;
|
||||
}
|
||||
|
||||
@@ -108,7 +107,6 @@ static int adc_keys_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct adc_keys_state *st;
|
||||
struct input_polled_dev *poll_dev;
|
||||
struct input_dev *input;
|
||||
enum iio_chan_type type;
|
||||
int i, value;
|
||||
@@ -145,19 +143,13 @@ static int adc_keys_probe(struct platform_device *pdev)
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
poll_dev = devm_input_allocate_polled_device(dev);
|
||||
if (!poll_dev) {
|
||||
input = devm_input_allocate_device(dev);
|
||||
if (!input) {
|
||||
dev_err(dev, "failed to allocate input device\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (!device_property_read_u32(dev, "poll-interval", &value))
|
||||
poll_dev->poll_interval = value;
|
||||
|
||||
poll_dev->poll = adc_keys_poll;
|
||||
poll_dev->private = st;
|
||||
|
||||
input = poll_dev->input;
|
||||
input_set_drvdata(input, st);
|
||||
|
||||
input->name = pdev->name;
|
||||
input->phys = "adc-keys/input0";
|
||||
@@ -174,7 +166,17 @@ static int adc_keys_probe(struct platform_device *pdev)
|
||||
if (device_property_read_bool(dev, "autorepeat"))
|
||||
__set_bit(EV_REP, input->evbit);
|
||||
|
||||
error = input_register_polled_device(poll_dev);
|
||||
|
||||
error = input_setup_polling(input, adc_keys_poll);
|
||||
if (error) {
|
||||
dev_err(dev, "Unable to set up polling: %d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
if (!device_property_read_u32(dev, "poll-interval", &value))
|
||||
input_set_poll_interval(input, value);
|
||||
|
||||
error = input_register_device(input);
|
||||
if (error) {
|
||||
dev_err(dev, "Unable to register input device: %d\n", error);
|
||||
return error;
|
||||
|
||||
@@ -857,70 +857,35 @@ static void adp5589_report_switch_state(struct adp5589_kpad *kpad)
|
||||
input_sync(kpad->input);
|
||||
}
|
||||
|
||||
static int adp5589_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
static int adp5589_keypad_add(struct adp5589_kpad *kpad, unsigned int revid)
|
||||
{
|
||||
struct adp5589_kpad *kpad;
|
||||
struct i2c_client *client = kpad->client;
|
||||
const struct adp5589_kpad_platform_data *pdata =
|
||||
dev_get_platdata(&client->dev);
|
||||
struct input_dev *input;
|
||||
unsigned int revid;
|
||||
int ret, i;
|
||||
unsigned int i;
|
||||
int error;
|
||||
|
||||
if (!i2c_check_functionality(client->adapter,
|
||||
I2C_FUNC_SMBUS_BYTE_DATA)) {
|
||||
dev_err(&client->dev, "SMBUS Byte Data not Supported\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (!pdata) {
|
||||
dev_err(&client->dev, "no platform data?\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
kpad = kzalloc(sizeof(*kpad), GFP_KERNEL);
|
||||
if (!kpad)
|
||||
return -ENOMEM;
|
||||
|
||||
switch (id->driver_data) {
|
||||
case ADP5585_02:
|
||||
kpad->support_row5 = true;
|
||||
/* fall through */
|
||||
case ADP5585_01:
|
||||
kpad->is_adp5585 = true;
|
||||
kpad->var = &const_adp5585;
|
||||
break;
|
||||
case ADP5589:
|
||||
kpad->support_row5 = true;
|
||||
kpad->var = &const_adp5589;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!((pdata->keypad_en_mask & kpad->var->row_mask) &&
|
||||
(pdata->keypad_en_mask >> kpad->var->col_shift)) ||
|
||||
!pdata->keymap) {
|
||||
dev_err(&client->dev, "no rows, cols or keymap from pdata\n");
|
||||
error = -EINVAL;
|
||||
goto err_free_mem;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (pdata->keymapsize != kpad->var->keymapsize) {
|
||||
dev_err(&client->dev, "invalid keymapsize\n");
|
||||
error = -EINVAL;
|
||||
goto err_free_mem;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!pdata->gpimap && pdata->gpimapsize) {
|
||||
dev_err(&client->dev, "invalid gpimap from pdata\n");
|
||||
error = -EINVAL;
|
||||
goto err_free_mem;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (pdata->gpimapsize > kpad->var->gpimapsize_max) {
|
||||
dev_err(&client->dev, "invalid gpimapsize\n");
|
||||
error = -EINVAL;
|
||||
goto err_free_mem;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (i = 0; i < pdata->gpimapsize; i++) {
|
||||
@@ -929,41 +894,27 @@ static int adp5589_probe(struct i2c_client *client,
|
||||
if (pin < kpad->var->gpi_pin_base ||
|
||||
pin > kpad->var->gpi_pin_end) {
|
||||
dev_err(&client->dev, "invalid gpi pin data\n");
|
||||
error = -EINVAL;
|
||||
goto err_free_mem;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((1 << (pin - kpad->var->gpi_pin_row_base)) &
|
||||
pdata->keypad_en_mask) {
|
||||
dev_err(&client->dev, "invalid gpi row/col data\n");
|
||||
error = -EINVAL;
|
||||
goto err_free_mem;
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (!client->irq) {
|
||||
dev_err(&client->dev, "no IRQ?\n");
|
||||
error = -EINVAL;
|
||||
goto err_free_mem;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
input = input_allocate_device();
|
||||
if (!input) {
|
||||
error = -ENOMEM;
|
||||
goto err_free_mem;
|
||||
}
|
||||
if (!input)
|
||||
return -ENOMEM;
|
||||
|
||||
kpad->client = client;
|
||||
kpad->input = input;
|
||||
|
||||
ret = adp5589_read(client, ADP5589_5_ID);
|
||||
if (ret < 0) {
|
||||
error = ret;
|
||||
goto err_free_input;
|
||||
}
|
||||
|
||||
revid = (u8) ret & ADP5589_5_DEVICE_ID_MASK;
|
||||
|
||||
input->name = client->name;
|
||||
input->phys = "adp5589-keys/input0";
|
||||
input->dev.parent = &client->dev;
|
||||
@@ -1015,30 +966,99 @@ static int adp5589_probe(struct i2c_client *client,
|
||||
goto err_unreg_dev;
|
||||
}
|
||||
|
||||
device_init_wakeup(&client->dev, 1);
|
||||
|
||||
return 0;
|
||||
|
||||
err_unreg_dev:
|
||||
input_unregister_device(input);
|
||||
input = NULL;
|
||||
err_free_input:
|
||||
input_free_device(input);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static void adp5589_keypad_remove(struct adp5589_kpad *kpad)
|
||||
{
|
||||
if (kpad->input) {
|
||||
free_irq(kpad->client->irq, kpad);
|
||||
input_unregister_device(kpad->input);
|
||||
}
|
||||
}
|
||||
|
||||
static int adp5589_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct adp5589_kpad *kpad;
|
||||
const struct adp5589_kpad_platform_data *pdata =
|
||||
dev_get_platdata(&client->dev);
|
||||
unsigned int revid;
|
||||
int error, ret;
|
||||
|
||||
if (!i2c_check_functionality(client->adapter,
|
||||
I2C_FUNC_SMBUS_BYTE_DATA)) {
|
||||
dev_err(&client->dev, "SMBUS Byte Data not Supported\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (!pdata) {
|
||||
dev_err(&client->dev, "no platform data?\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
kpad = kzalloc(sizeof(*kpad), GFP_KERNEL);
|
||||
if (!kpad)
|
||||
return -ENOMEM;
|
||||
|
||||
kpad->client = client;
|
||||
|
||||
switch (id->driver_data) {
|
||||
case ADP5585_02:
|
||||
kpad->support_row5 = true;
|
||||
/* fall through */
|
||||
case ADP5585_01:
|
||||
kpad->is_adp5585 = true;
|
||||
kpad->var = &const_adp5585;
|
||||
break;
|
||||
case ADP5589:
|
||||
kpad->support_row5 = true;
|
||||
kpad->var = &const_adp5589;
|
||||
break;
|
||||
}
|
||||
|
||||
ret = adp5589_read(client, ADP5589_5_ID);
|
||||
if (ret < 0) {
|
||||
error = ret;
|
||||
goto err_free_mem;
|
||||
}
|
||||
|
||||
revid = (u8) ret & ADP5589_5_DEVICE_ID_MASK;
|
||||
|
||||
if (pdata->keymapsize) {
|
||||
error = adp5589_keypad_add(kpad, revid);
|
||||
if (error)
|
||||
goto err_free_mem;
|
||||
}
|
||||
|
||||
error = adp5589_setup(kpad);
|
||||
if (error)
|
||||
goto err_free_irq;
|
||||
goto err_keypad_remove;
|
||||
|
||||
if (kpad->gpimapsize)
|
||||
adp5589_report_switch_state(kpad);
|
||||
|
||||
error = adp5589_gpio_add(kpad);
|
||||
if (error)
|
||||
goto err_free_irq;
|
||||
goto err_keypad_remove;
|
||||
|
||||
device_init_wakeup(&client->dev, 1);
|
||||
i2c_set_clientdata(client, kpad);
|
||||
|
||||
dev_info(&client->dev, "Rev.%d keypad, irq %d\n", revid, client->irq);
|
||||
return 0;
|
||||
|
||||
err_free_irq:
|
||||
free_irq(client->irq, kpad);
|
||||
err_unreg_dev:
|
||||
input_unregister_device(input);
|
||||
input = NULL;
|
||||
err_free_input:
|
||||
input_free_device(input);
|
||||
err_keypad_remove:
|
||||
adp5589_keypad_remove(kpad);
|
||||
err_free_mem:
|
||||
kfree(kpad);
|
||||
|
||||
@@ -1050,8 +1070,7 @@ static int adp5589_remove(struct i2c_client *client)
|
||||
struct adp5589_kpad *kpad = i2c_get_clientdata(client);
|
||||
|
||||
adp5589_write(client, kpad->var->reg(ADP5589_GENERAL_CFG), 0);
|
||||
free_irq(client->irq, kpad);
|
||||
input_unregister_device(kpad->input);
|
||||
adp5589_keypad_remove(kpad);
|
||||
adp5589_gpio_remove(kpad);
|
||||
kfree(kpad);
|
||||
|
||||
@@ -1064,6 +1083,9 @@ static int adp5589_suspend(struct device *dev)
|
||||
struct adp5589_kpad *kpad = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = kpad->client;
|
||||
|
||||
if (!kpad->input)
|
||||
return 0;
|
||||
|
||||
disable_irq(client->irq);
|
||||
|
||||
if (device_may_wakeup(&client->dev))
|
||||
@@ -1077,6 +1099,9 @@ static int adp5589_resume(struct device *dev)
|
||||
struct adp5589_kpad *kpad = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = kpad->client;
|
||||
|
||||
if (!kpad->input)
|
||||
return 0;
|
||||
|
||||
if (device_may_wakeup(&client->dev))
|
||||
disable_irq_wake(client->irq);
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/input.h>
|
||||
#include <linux/input-polldev.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/platform_device.h>
|
||||
@@ -30,10 +29,10 @@ struct clps711x_keypad_data {
|
||||
struct clps711x_gpio_data *gpio_data;
|
||||
};
|
||||
|
||||
static void clps711x_keypad_poll(struct input_polled_dev *dev)
|
||||
static void clps711x_keypad_poll(struct input_dev *input)
|
||||
{
|
||||
const unsigned short *keycodes = dev->input->keycode;
|
||||
struct clps711x_keypad_data *priv = dev->private;
|
||||
const unsigned short *keycodes = input->keycode;
|
||||
struct clps711x_keypad_data *priv = input_get_drvdata(input);
|
||||
bool sync = false;
|
||||
int col, row;
|
||||
|
||||
@@ -61,14 +60,14 @@ static void clps711x_keypad_poll(struct input_polled_dev *dev)
|
||||
|
||||
if (state) {
|
||||
set_bit(col, data->last_state);
|
||||
input_event(dev->input, EV_MSC,
|
||||
MSC_SCAN, code);
|
||||
input_event(input,
|
||||
EV_MSC, MSC_SCAN, code);
|
||||
} else {
|
||||
clear_bit(col, data->last_state);
|
||||
}
|
||||
|
||||
if (keycodes[code])
|
||||
input_report_key(dev->input,
|
||||
input_report_key(input,
|
||||
keycodes[code], state);
|
||||
sync = true;
|
||||
}
|
||||
@@ -80,7 +79,7 @@ static void clps711x_keypad_poll(struct input_polled_dev *dev)
|
||||
}
|
||||
|
||||
if (sync)
|
||||
input_sync(dev->input);
|
||||
input_sync(input);
|
||||
}
|
||||
|
||||
static int clps711x_keypad_probe(struct platform_device *pdev)
|
||||
@@ -88,7 +87,7 @@ static int clps711x_keypad_probe(struct platform_device *pdev)
|
||||
struct clps711x_keypad_data *priv;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *np = dev->of_node;
|
||||
struct input_polled_dev *poll_dev;
|
||||
struct input_dev *input;
|
||||
u32 poll_interval;
|
||||
int i, err;
|
||||
|
||||
@@ -125,53 +124,43 @@ static int clps711x_keypad_probe(struct platform_device *pdev)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
poll_dev = input_allocate_polled_device();
|
||||
if (!poll_dev)
|
||||
input = devm_input_allocate_device(dev);
|
||||
if (!input)
|
||||
return -ENOMEM;
|
||||
|
||||
poll_dev->private = priv;
|
||||
poll_dev->poll = clps711x_keypad_poll;
|
||||
poll_dev->poll_interval = poll_interval;
|
||||
poll_dev->input->name = pdev->name;
|
||||
poll_dev->input->dev.parent = dev;
|
||||
poll_dev->input->id.bustype = BUS_HOST;
|
||||
poll_dev->input->id.vendor = 0x0001;
|
||||
poll_dev->input->id.product = 0x0001;
|
||||
poll_dev->input->id.version = 0x0100;
|
||||
input_set_drvdata(input, priv);
|
||||
|
||||
input->name = pdev->name;
|
||||
input->dev.parent = dev;
|
||||
input->id.bustype = BUS_HOST;
|
||||
input->id.vendor = 0x0001;
|
||||
input->id.product = 0x0001;
|
||||
input->id.version = 0x0100;
|
||||
|
||||
err = matrix_keypad_build_keymap(NULL, NULL, priv->row_count,
|
||||
CLPS711X_KEYPAD_COL_COUNT,
|
||||
NULL, poll_dev->input);
|
||||
NULL, input);
|
||||
if (err)
|
||||
goto out_err;
|
||||
return err;
|
||||
|
||||
input_set_capability(poll_dev->input, EV_MSC, MSC_SCAN);
|
||||
input_set_capability(input, EV_MSC, MSC_SCAN);
|
||||
if (of_property_read_bool(np, "autorepeat"))
|
||||
__set_bit(EV_REP, poll_dev->input->evbit);
|
||||
|
||||
platform_set_drvdata(pdev, poll_dev);
|
||||
__set_bit(EV_REP, input->evbit);
|
||||
|
||||
/* Set all columns to low */
|
||||
regmap_update_bits(priv->syscon, SYSCON_OFFSET, SYSCON1_KBDSCAN_MASK,
|
||||
SYSCON1_KBDSCAN(1));
|
||||
|
||||
err = input_register_polled_device(poll_dev);
|
||||
|
||||
err = input_setup_polling(input, clps711x_keypad_poll);
|
||||
if (err)
|
||||
goto out_err;
|
||||
return err;
|
||||
|
||||
return 0;
|
||||
input_set_poll_interval(input, poll_interval);
|
||||
|
||||
out_err:
|
||||
input_free_polled_device(poll_dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int clps711x_keypad_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct input_polled_dev *poll_dev = platform_get_drvdata(pdev);
|
||||
|
||||
input_unregister_polled_device(poll_dev);
|
||||
input_free_polled_device(poll_dev);
|
||||
err = input_register_device(input);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -188,7 +177,6 @@ static struct platform_driver clps711x_keypad_driver = {
|
||||
.of_match_table = clps711x_keypad_of_match,
|
||||
},
|
||||
.probe = clps711x_keypad_probe,
|
||||
.remove = clps711x_keypad_remove,
|
||||
};
|
||||
module_platform_driver(clps711x_keypad_driver);
|
||||
|
||||
|
||||
@@ -494,10 +494,8 @@ static int gpio_keys_setup_key(struct platform_device *pdev,
|
||||
spin_lock_init(&bdata->lock);
|
||||
|
||||
if (child) {
|
||||
bdata->gpiod = devm_fwnode_get_gpiod_from_child(dev, NULL,
|
||||
child,
|
||||
GPIOD_IN,
|
||||
desc);
|
||||
bdata->gpiod = devm_fwnode_gpiod_get(dev, child,
|
||||
NULL, GPIOD_IN, desc);
|
||||
if (IS_ERR(bdata->gpiod)) {
|
||||
error = PTR_ERR(bdata->gpiod);
|
||||
if (error == -ENOENT) {
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/input-polldev.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/gpio.h>
|
||||
@@ -34,7 +33,7 @@ struct gpio_keys_button_data {
|
||||
};
|
||||
|
||||
struct gpio_keys_polled_dev {
|
||||
struct input_polled_dev *poll_dev;
|
||||
struct input_dev *input;
|
||||
struct device *dev;
|
||||
const struct gpio_keys_platform_data *pdata;
|
||||
unsigned long rel_axis_seen[BITS_TO_LONGS(REL_CNT)];
|
||||
@@ -42,12 +41,11 @@ struct gpio_keys_polled_dev {
|
||||
struct gpio_keys_button_data data[0];
|
||||
};
|
||||
|
||||
static void gpio_keys_button_event(struct input_polled_dev *dev,
|
||||
static void gpio_keys_button_event(struct input_dev *input,
|
||||
const struct gpio_keys_button *button,
|
||||
int state)
|
||||
{
|
||||
struct gpio_keys_polled_dev *bdev = dev->private;
|
||||
struct input_dev *input = dev->input;
|
||||
struct gpio_keys_polled_dev *bdev = input_get_drvdata(input);
|
||||
unsigned int type = button->type ?: EV_KEY;
|
||||
|
||||
if (type == EV_REL) {
|
||||
@@ -66,7 +64,7 @@ static void gpio_keys_button_event(struct input_polled_dev *dev,
|
||||
}
|
||||
}
|
||||
|
||||
static void gpio_keys_polled_check_state(struct input_polled_dev *dev,
|
||||
static void gpio_keys_polled_check_state(struct input_dev *input,
|
||||
const struct gpio_keys_button *button,
|
||||
struct gpio_keys_button_data *bdata)
|
||||
{
|
||||
@@ -74,10 +72,10 @@ static void gpio_keys_polled_check_state(struct input_polled_dev *dev,
|
||||
|
||||
state = gpiod_get_value_cansleep(bdata->gpiod);
|
||||
if (state < 0) {
|
||||
dev_err(dev->input->dev.parent,
|
||||
dev_err(input->dev.parent,
|
||||
"failed to get gpio state: %d\n", state);
|
||||
} else {
|
||||
gpio_keys_button_event(dev, button, state);
|
||||
gpio_keys_button_event(input, button, state);
|
||||
|
||||
if (state != bdata->last_state) {
|
||||
bdata->count = 0;
|
||||
@@ -86,11 +84,10 @@ static void gpio_keys_polled_check_state(struct input_polled_dev *dev,
|
||||
}
|
||||
}
|
||||
|
||||
static void gpio_keys_polled_poll(struct input_polled_dev *dev)
|
||||
static void gpio_keys_polled_poll(struct input_dev *input)
|
||||
{
|
||||
struct gpio_keys_polled_dev *bdev = dev->private;
|
||||
struct gpio_keys_polled_dev *bdev = input_get_drvdata(input);
|
||||
const struct gpio_keys_platform_data *pdata = bdev->pdata;
|
||||
struct input_dev *input = dev->input;
|
||||
int i;
|
||||
|
||||
memset(bdev->rel_axis_seen, 0, sizeof(bdev->rel_axis_seen));
|
||||
@@ -101,10 +98,10 @@ static void gpio_keys_polled_poll(struct input_polled_dev *dev)
|
||||
|
||||
if (bdata->count < bdata->threshold) {
|
||||
bdata->count++;
|
||||
gpio_keys_button_event(dev, &pdata->buttons[i],
|
||||
gpio_keys_button_event(input, &pdata->buttons[i],
|
||||
bdata->last_state);
|
||||
} else {
|
||||
gpio_keys_polled_check_state(dev, &pdata->buttons[i],
|
||||
gpio_keys_polled_check_state(input, &pdata->buttons[i],
|
||||
bdata);
|
||||
}
|
||||
}
|
||||
@@ -122,18 +119,20 @@ static void gpio_keys_polled_poll(struct input_polled_dev *dev)
|
||||
input_sync(input);
|
||||
}
|
||||
|
||||
static void gpio_keys_polled_open(struct input_polled_dev *dev)
|
||||
static int gpio_keys_polled_open(struct input_dev *input)
|
||||
{
|
||||
struct gpio_keys_polled_dev *bdev = dev->private;
|
||||
struct gpio_keys_polled_dev *bdev = input_get_drvdata(input);
|
||||
const struct gpio_keys_platform_data *pdata = bdev->pdata;
|
||||
|
||||
if (pdata->enable)
|
||||
pdata->enable(bdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void gpio_keys_polled_close(struct input_polled_dev *dev)
|
||||
static void gpio_keys_polled_close(struct input_dev *input)
|
||||
{
|
||||
struct gpio_keys_polled_dev *bdev = dev->private;
|
||||
struct gpio_keys_polled_dev *bdev = input_get_drvdata(input);
|
||||
const struct gpio_keys_platform_data *pdata = bdev->pdata;
|
||||
|
||||
if (pdata->disable)
|
||||
@@ -232,7 +231,6 @@ static int gpio_keys_polled_probe(struct platform_device *pdev)
|
||||
struct fwnode_handle *child = NULL;
|
||||
const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev);
|
||||
struct gpio_keys_polled_dev *bdev;
|
||||
struct input_polled_dev *poll_dev;
|
||||
struct input_dev *input;
|
||||
int error;
|
||||
int i;
|
||||
@@ -255,19 +253,13 @@ static int gpio_keys_polled_probe(struct platform_device *pdev)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
poll_dev = devm_input_allocate_polled_device(dev);
|
||||
if (!poll_dev) {
|
||||
dev_err(dev, "no memory for polled device\n");
|
||||
input = devm_input_allocate_device(dev);
|
||||
if (!input) {
|
||||
dev_err(dev, "no memory for input device\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
poll_dev->private = bdev;
|
||||
poll_dev->poll = gpio_keys_polled_poll;
|
||||
poll_dev->poll_interval = pdata->poll_interval;
|
||||
poll_dev->open = gpio_keys_polled_open;
|
||||
poll_dev->close = gpio_keys_polled_close;
|
||||
|
||||
input = poll_dev->input;
|
||||
input_set_drvdata(input, bdev);
|
||||
|
||||
input->name = pdata->name ?: pdev->name;
|
||||
input->phys = DRV_NAME"/input0";
|
||||
@@ -277,6 +269,9 @@ static int gpio_keys_polled_probe(struct platform_device *pdev)
|
||||
input->id.product = 0x0001;
|
||||
input->id.version = 0x0100;
|
||||
|
||||
input->open = gpio_keys_polled_open;
|
||||
input->close = gpio_keys_polled_close;
|
||||
|
||||
__set_bit(EV_KEY, input->evbit);
|
||||
if (pdata->rep)
|
||||
__set_bit(EV_REP, input->evbit);
|
||||
@@ -300,10 +295,9 @@ static int gpio_keys_polled_probe(struct platform_device *pdev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
bdata->gpiod = devm_fwnode_get_gpiod_from_child(dev,
|
||||
NULL, child,
|
||||
GPIOD_IN,
|
||||
button->desc);
|
||||
bdata->gpiod = devm_fwnode_gpiod_get(dev, child,
|
||||
NULL, GPIOD_IN,
|
||||
button->desc);
|
||||
if (IS_ERR(bdata->gpiod)) {
|
||||
error = PTR_ERR(bdata->gpiod);
|
||||
if (error != -EPROBE_DEFER)
|
||||
@@ -353,11 +347,19 @@ static int gpio_keys_polled_probe(struct platform_device *pdev)
|
||||
|
||||
fwnode_handle_put(child);
|
||||
|
||||
bdev->poll_dev = poll_dev;
|
||||
bdev->input = input;
|
||||
bdev->dev = dev;
|
||||
bdev->pdata = pdata;
|
||||
|
||||
error = input_register_polled_device(poll_dev);
|
||||
error = input_setup_polling(input, gpio_keys_polled_poll);
|
||||
if (error) {
|
||||
dev_err(dev, "unable to set up polling, err=%d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
input_set_poll_interval(input, pdata->poll_interval);
|
||||
|
||||
error = input_register_device(input);
|
||||
if (error) {
|
||||
dev_err(dev, "unable to register polled device, err=%d\n",
|
||||
error);
|
||||
@@ -366,7 +368,7 @@ static int gpio_keys_polled_probe(struct platform_device *pdev)
|
||||
|
||||
/* report initial state of the buttons */
|
||||
for (i = 0; i < pdata->nbuttons; i++)
|
||||
gpio_keys_polled_check_state(poll_dev, &pdata->buttons[i],
|
||||
gpio_keys_polled_check_state(input, &pdata->buttons[i],
|
||||
&bdev->data[i]);
|
||||
|
||||
input_sync(input);
|
||||
|
||||
Loaded 20 of 56 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user