mirror of https://gitee.com/openkylin/linux.git
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
Pull input updates from Dmitry Torokhov: - several device tree bindings for input devices have been converted to yaml - dropped no longer used ixp4xx-beeper and CSR Prima2 PWRC drivers - analog joystick has been converted to use ktime API and no longer warn about low resolution timers - a few driver fixes * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: (24 commits) Input: analog - always use ktime functions Input: mms114 - support MMS134S Input: elan_i2c - reduce the resume time for controller in Whitebox Input: edt-ft5x06 - added case for EDT EP0110M09 Input: adc-keys - drop bogus __refdata annotation Input: Fix spelling mistake in Kconfig "useable" -> "usable" Input: Fix spelling mistake in Kconfig "Modul" -> "Module" Input: remove dead CSR Prima2 PWRC driver Input: adp5589-keys - use the right header Input: adp5588-keys - use the right header dt-bindings: input: tsc2005: Convert to YAML schema Input: ep93xx_keypad - prepare clock before using it dt-bindings: input: sun4i-lradc: Add wakeup-source dt-bindings: input: Convert Regulator Haptic binding to a schema dt-bindings: input: Convert Pixcir Touchscreen binding to a schema dt-bindings: input: Convert ChipOne ICN8318 binding to a schema Input: pm8941-pwrkey - fix comma vs semicolon issue dt-bindings: power: reset: qcom-pon: Convert qcom PON binding to yaml dt-bindings: input: pm8941-pwrkey: Convert pm8941 power key binding to yaml dt-bindings: power: reset: Change 'additionalProperties' to true ...
This commit is contained in:
commit
765092e4cd
|
@ -29,6 +29,8 @@ properties:
|
|||
description:
|
||||
Regulator for the LRADC reference voltage
|
||||
|
||||
wakeup-source: true
|
||||
|
||||
patternProperties:
|
||||
"^button-[0-9]+$":
|
||||
type: object
|
||||
|
|
|
@ -1,55 +0,0 @@
|
|||
Qualcomm PM8941 PMIC Power Key
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible:
|
||||
Usage: required
|
||||
Value type: <string>
|
||||
Definition: must be one of:
|
||||
"qcom,pm8941-pwrkey"
|
||||
"qcom,pm8941-resin"
|
||||
"qcom,pmk8350-pwrkey"
|
||||
"qcom,pmk8350-resin"
|
||||
|
||||
- reg:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: base address of registers for block
|
||||
|
||||
- interrupts:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: key change interrupt; The format of the specifier is
|
||||
defined by the binding document describing the node's
|
||||
interrupt parent.
|
||||
|
||||
- debounce:
|
||||
Usage: optional
|
||||
Value type: <u32>
|
||||
Definition: time in microseconds that key must be pressed or released
|
||||
for state change interrupt to trigger.
|
||||
|
||||
- bias-pull-up:
|
||||
Usage: optional
|
||||
Value type: <empty>
|
||||
Definition: presence of this property indicates that the KPDPWR_N pin
|
||||
should be configured for pull up.
|
||||
|
||||
- linux,code:
|
||||
Usage: optional
|
||||
Value type: <u32>
|
||||
Definition: The input key-code associated with the power key.
|
||||
Use the linux event codes defined in
|
||||
include/dt-bindings/input/linux-event-codes.h
|
||||
When property is omitted KEY_POWER is assumed.
|
||||
|
||||
EXAMPLE
|
||||
|
||||
pwrkey@800 {
|
||||
compatible = "qcom,pm8941-pwrkey";
|
||||
reg = <0x800>;
|
||||
interrupts = <0x0 0x8 0 IRQ_TYPE_EDGE_BOTH>;
|
||||
debounce = <15625>;
|
||||
bias-pull-up;
|
||||
linux,code = <KEY_POWER>;
|
||||
};
|
|
@ -0,0 +1,51 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/input/qcom,pm8941-pwrkey.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm PM8941 PMIC Power Key
|
||||
|
||||
maintainers:
|
||||
- Courtney Cavin <courtney.cavin@sonymobile.com>
|
||||
- Vinod Koul <vkoul@kernel.org>
|
||||
|
||||
allOf:
|
||||
- $ref: input.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,pm8941-pwrkey
|
||||
- qcom,pm8941-resin
|
||||
- qcom,pmk8350-pwrkey
|
||||
- qcom,pmk8350-resin
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
debounce:
|
||||
description: |
|
||||
Time in microseconds that key must be pressed or
|
||||
released for state change interrupt to trigger.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
||||
bias-pull-up:
|
||||
description: |
|
||||
Presence of this property indicates that the KPDPWR_N
|
||||
pin should be configured for pull up.
|
||||
$ref: /schemas/types.yaml#/definitions/flag
|
||||
|
||||
linux,code:
|
||||
description: |
|
||||
The input key-code associated with the power key.
|
||||
Use the linux event codes defined in
|
||||
include/dt-bindings/input/linux-event-codes.h
|
||||
When property is omitted KEY_POWER is assumed.
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- interrupts
|
||||
|
||||
unevaluatedProperties: false
|
||||
...
|
|
@ -1,21 +0,0 @@
|
|||
* Regulator Haptic Device Tree Bindings
|
||||
|
||||
Required Properties:
|
||||
- compatible : Should be "regulator-haptic"
|
||||
- haptic-supply : Power supply to the haptic motor.
|
||||
[*] refer Documentation/devicetree/bindings/regulator/regulator.txt
|
||||
|
||||
- max-microvolt : The maximum voltage value supplied to the haptic motor.
|
||||
[The unit of the voltage is a micro]
|
||||
|
||||
- min-microvolt : The minimum voltage value supplied to the haptic motor.
|
||||
[The unit of the voltage is a micro]
|
||||
|
||||
Example:
|
||||
|
||||
haptics {
|
||||
compatible = "regulator-haptic";
|
||||
haptic-supply = <&motor_regulator>;
|
||||
max-microvolt = <2700000>;
|
||||
min-microvolt = <1100000>;
|
||||
};
|
|
@ -0,0 +1,43 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: "http://devicetree.org/schemas/input/regulator-haptic.yaml#"
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
|
||||
title: Regulator Haptic Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Jaewon Kim <jaewon02.kim@samsung.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: regulator-haptic
|
||||
|
||||
haptic-supply:
|
||||
description: >
|
||||
Power supply to the haptic motor
|
||||
|
||||
max-microvolt:
|
||||
description: >
|
||||
The maximum voltage value supplied to the haptic motor
|
||||
|
||||
min-microvolt:
|
||||
description: >
|
||||
The minimum voltage value supplied to the haptic motor
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- haptic-supply
|
||||
- max-microvolt
|
||||
- min-microvolt
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
haptics {
|
||||
compatible = "regulator-haptic";
|
||||
haptic-supply = <&motor_regulator>;
|
||||
max-microvolt = <2700000>;
|
||||
min-microvolt = <1100000>;
|
||||
};
|
|
@ -0,0 +1,62 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/input/touchscreen/chipone,icn8318.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: ChipOne ICN8318 Touchscreen Controller Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Dmitry Torokhov <dmitry.torokhov@gmail.com>
|
||||
|
||||
allOf:
|
||||
- $ref: touchscreen.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: chipone,icn8318
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
wake-gpios:
|
||||
maxItems: 1
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- wake-gpios
|
||||
- touchscreen-size-x
|
||||
- touchscreen-size-y
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
touchscreen@40 {
|
||||
compatible = "chipone,icn8318";
|
||||
reg = <0x40>;
|
||||
interrupt-parent = <&pio>;
|
||||
interrupts = <9 IRQ_TYPE_EDGE_FALLING>; /* EINT9 (PG9) */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&ts_wake_pin_p66>;
|
||||
wake-gpios = <&pio 1 3 GPIO_ACTIVE_HIGH>; /* PB3 */
|
||||
touchscreen-size-x = <800>;
|
||||
touchscreen-size-y = <480>;
|
||||
touchscreen-inverted-x;
|
||||
touchscreen-swapped-x-y;
|
||||
};
|
||||
};
|
||||
|
||||
...
|
|
@ -1,44 +0,0 @@
|
|||
* ChipOne icn8318 I2C touchscreen controller
|
||||
|
||||
Required properties:
|
||||
- compatible : "chipone,icn8318"
|
||||
- reg : I2C slave address of the chip (0x40)
|
||||
- interrupts : interrupt specification for the icn8318 interrupt
|
||||
- wake-gpios : GPIO specification for the WAKE input
|
||||
- touchscreen-size-x : horizontal resolution of touchscreen (in pixels)
|
||||
- touchscreen-size-y : vertical resolution of touchscreen (in pixels)
|
||||
|
||||
Optional properties:
|
||||
- pinctrl-names : should be "default"
|
||||
- pinctrl-0: : a phandle pointing to the pin settings for the
|
||||
control gpios
|
||||
- touchscreen-fuzz-x : horizontal noise value of the absolute input
|
||||
device (in pixels)
|
||||
- touchscreen-fuzz-y : vertical noise value of the absolute input
|
||||
device (in pixels)
|
||||
- touchscreen-inverted-x : X axis is inverted (boolean)
|
||||
- touchscreen-inverted-y : Y axis is inverted (boolean)
|
||||
- touchscreen-swapped-x-y : X and Y axis are swapped (boolean)
|
||||
Swapping is done after inverting the axis
|
||||
|
||||
Example:
|
||||
|
||||
i2c@00000000 {
|
||||
/* ... */
|
||||
|
||||
chipone_icn8318@40 {
|
||||
compatible = "chipone,icn8318";
|
||||
reg = <0x40>;
|
||||
interrupt-parent = <&pio>;
|
||||
interrupts = <9 IRQ_TYPE_EDGE_FALLING>; /* EINT9 (PG9) */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&ts_wake_pin_p66>;
|
||||
wake-gpios = <&pio 1 3 GPIO_ACTIVE_HIGH>; /* PB3 */
|
||||
touchscreen-size-x = <800>;
|
||||
touchscreen-size-y = <480>;
|
||||
touchscreen-inverted-x;
|
||||
touchscreen-swapped-x-y;
|
||||
};
|
||||
|
||||
/* ... */
|
||||
};
|
|
@ -0,0 +1,68 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/input/touchscreen/pixcir,pixcir_ts.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Pixcir Touchscreen Controller Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Dmitry Torokhov <dmitry.torokhov@gmail.com>
|
||||
|
||||
allOf:
|
||||
- $ref: touchscreen.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- pixcir,pixcir_ts
|
||||
- pixcir,pixcir_tangoc
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
attb-gpio:
|
||||
maxItems: 1
|
||||
|
||||
reset-gpios:
|
||||
maxItems: 1
|
||||
|
||||
enable-gpios:
|
||||
maxItems: 1
|
||||
|
||||
wake-gpios:
|
||||
maxItems: 1
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- attb-gpio
|
||||
- touchscreen-size-x
|
||||
- touchscreen-size-y
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
touchscreen@5c {
|
||||
compatible = "pixcir,pixcir_ts";
|
||||
reg = <0x5c>;
|
||||
interrupts = <2 0>;
|
||||
attb-gpio = <&gpf 2 0 2>;
|
||||
touchscreen-size-x = <800>;
|
||||
touchscreen-size-y = <600>;
|
||||
};
|
||||
};
|
||||
|
||||
...
|
|
@ -1,31 +0,0 @@
|
|||
* Pixcir I2C touchscreen controllers
|
||||
|
||||
Required properties:
|
||||
- compatible: must be "pixcir,pixcir_ts" or "pixcir,pixcir_tangoc"
|
||||
- reg: I2C address of the chip
|
||||
- interrupts: interrupt to which the chip is connected
|
||||
- attb-gpio: GPIO connected to the ATTB line of the chip
|
||||
- touchscreen-size-x: horizontal resolution of touchscreen (in pixels)
|
||||
- touchscreen-size-y: vertical resolution of touchscreen (in pixels)
|
||||
|
||||
Optional properties:
|
||||
- reset-gpios: GPIO connected to the RESET line of the chip
|
||||
- enable-gpios: GPIO connected to the ENABLE line of the chip
|
||||
- wake-gpios: GPIO connected to the WAKE line of the chip
|
||||
|
||||
Example:
|
||||
|
||||
i2c@00000000 {
|
||||
/* ... */
|
||||
|
||||
pixcir_ts@5c {
|
||||
compatible = "pixcir,pixcir_ts";
|
||||
reg = <0x5c>;
|
||||
interrupts = <2 0>;
|
||||
attb-gpio = <&gpf 2 0 2>;
|
||||
touchscreen-size-x = <800>;
|
||||
touchscreen-size-y = <600>;
|
||||
};
|
||||
|
||||
/* ... */
|
||||
};
|
|
@ -0,0 +1,128 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/input/touchscreen/ti,tsc2005.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Texas Instruments TSC2004 and TSC2005 touchscreen controller bindings
|
||||
|
||||
maintainers:
|
||||
- Marek Vasut <marex@denx.de>
|
||||
- Michael Welling <mwelling@ieee.org>
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
pattern: "^touchscreen(@.*)?$"
|
||||
|
||||
compatible:
|
||||
enum:
|
||||
- ti,tsc2004
|
||||
- ti,tsc2005
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
description: |
|
||||
I2C address when used on the I2C bus, or the SPI chip select index
|
||||
when used on the SPI bus
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
reset-gpios:
|
||||
maxItems: 1
|
||||
description: GPIO specifier for the controller reset line
|
||||
|
||||
spi-max-frequency:
|
||||
description: TSC2005 SPI bus clock frequency.
|
||||
maximum: 25000000
|
||||
|
||||
ti,x-plate-ohms:
|
||||
description: resistance of the touchscreen's X plates in ohm (defaults to 280)
|
||||
|
||||
ti,esd-recovery-timeout-ms:
|
||||
description: |
|
||||
if the touchscreen does not respond after the configured time
|
||||
(in milli seconds), the driver will reset it. This is disabled
|
||||
by default.
|
||||
|
||||
vio-supply:
|
||||
description: Regulator specifier
|
||||
|
||||
touchscreen-fuzz-pressure: true
|
||||
touchscreen-fuzz-x: true
|
||||
touchscreen-fuzz-y: true
|
||||
touchscreen-max-pressure: true
|
||||
touchscreen-size-x: true
|
||||
touchscreen-size-y: true
|
||||
|
||||
allOf:
|
||||
- $ref: touchscreen.yaml#
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: ti,tsc2004
|
||||
then:
|
||||
properties:
|
||||
spi-max-frequency: false
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
touchscreen@48 {
|
||||
compatible = "ti,tsc2004";
|
||||
reg = <0x48>;
|
||||
vio-supply = <&vio>;
|
||||
|
||||
reset-gpios = <&gpio4 8 GPIO_ACTIVE_HIGH>;
|
||||
interrupts-extended = <&gpio1 27 IRQ_TYPE_EDGE_RISING>;
|
||||
|
||||
touchscreen-fuzz-x = <4>;
|
||||
touchscreen-fuzz-y = <7>;
|
||||
touchscreen-fuzz-pressure = <2>;
|
||||
touchscreen-size-x = <4096>;
|
||||
touchscreen-size-y = <4096>;
|
||||
touchscreen-max-pressure = <2048>;
|
||||
|
||||
ti,x-plate-ohms = <280>;
|
||||
ti,esd-recovery-timeout-ms = <8000>;
|
||||
};
|
||||
};
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
spi {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
touchscreen@0 {
|
||||
compatible = "ti,tsc2005";
|
||||
spi-max-frequency = <6000000>;
|
||||
reg = <0>;
|
||||
|
||||
vio-supply = <&vio>;
|
||||
|
||||
reset-gpios = <&gpio4 8 GPIO_ACTIVE_HIGH>; /* 104 */
|
||||
interrupts-extended = <&gpio4 4 IRQ_TYPE_EDGE_RISING>; /* 100 */
|
||||
|
||||
touchscreen-fuzz-x = <4>;
|
||||
touchscreen-fuzz-y = <7>;
|
||||
touchscreen-fuzz-pressure = <2>;
|
||||
touchscreen-size-x = <4096>;
|
||||
touchscreen-size-y = <4096>;
|
||||
touchscreen-max-pressure = <2048>;
|
||||
|
||||
ti,x-plate-ohms = <280>;
|
||||
ti,esd-recovery-timeout-ms = <8000>;
|
||||
};
|
||||
};
|
|
@ -1,64 +0,0 @@
|
|||
* Texas Instruments tsc2004 and tsc2005 touchscreen controllers
|
||||
|
||||
Required properties:
|
||||
- compatible : "ti,tsc2004" or "ti,tsc2005"
|
||||
- reg : Device address
|
||||
- interrupts : IRQ specifier
|
||||
- spi-max-frequency : Maximum SPI clocking speed of the device
|
||||
(for tsc2005)
|
||||
|
||||
Optional properties:
|
||||
- vio-supply : Regulator specifier
|
||||
- reset-gpios : GPIO specifier for the controller reset line
|
||||
- ti,x-plate-ohms : integer, resistance of the touchscreen's X plates
|
||||
in ohm (defaults to 280)
|
||||
- ti,esd-recovery-timeout-ms : integer, if the touchscreen does not respond after
|
||||
the configured time (in milli seconds), the driver
|
||||
will reset it. This is disabled by default.
|
||||
- properties defined in touchscreen.txt
|
||||
|
||||
Example:
|
||||
|
||||
&i2c3 {
|
||||
tsc2004@48 {
|
||||
compatible = "ti,tsc2004";
|
||||
reg = <0x48>;
|
||||
vio-supply = <&vio>;
|
||||
|
||||
reset-gpios = <&gpio4 8 GPIO_ACTIVE_HIGH>;
|
||||
interrupts-extended = <&gpio1 27 IRQ_TYPE_EDGE_RISING>;
|
||||
|
||||
touchscreen-fuzz-x = <4>;
|
||||
touchscreen-fuzz-y = <7>;
|
||||
touchscreen-fuzz-pressure = <2>;
|
||||
touchscreen-size-x = <4096>;
|
||||
touchscreen-size-y = <4096>;
|
||||
touchscreen-max-pressure = <2048>;
|
||||
|
||||
ti,x-plate-ohms = <280>;
|
||||
ti,esd-recovery-timeout-ms = <8000>;
|
||||
};
|
||||
}
|
||||
|
||||
&mcspi1 {
|
||||
tsc2005@0 {
|
||||
compatible = "ti,tsc2005";
|
||||
spi-max-frequency = <6000000>;
|
||||
reg = <0>;
|
||||
|
||||
vio-supply = <&vio>;
|
||||
|
||||
reset-gpios = <&gpio4 8 GPIO_ACTIVE_HIGH>; /* 104 */
|
||||
interrupts-extended = <&gpio4 4 IRQ_TYPE_EDGE_RISING>; /* 100 */
|
||||
|
||||
touchscreen-fuzz-x = <4>;
|
||||
touchscreen-fuzz-y = <7>;
|
||||
touchscreen-fuzz-pressure = <2>;
|
||||
touchscreen-size-x = <4096>;
|
||||
touchscreen-size-y = <4096>;
|
||||
touchscreen-max-pressure = <2048>;
|
||||
|
||||
ti,x-plate-ohms = <280>;
|
||||
ti,esd-recovery-timeout-ms = <8000>;
|
||||
};
|
||||
}
|
|
@ -1,49 +0,0 @@
|
|||
Qualcomm PON Device
|
||||
|
||||
The Power On device for Qualcomm PM8xxx is MFD supporting pwrkey
|
||||
and resin along with the Android reboot-mode.
|
||||
|
||||
This DT node has pwrkey and resin as sub nodes.
|
||||
|
||||
Required Properties:
|
||||
-compatible: Must be one of:
|
||||
"qcom,pm8916-pon"
|
||||
"qcom,pms405-pon"
|
||||
"qcom,pm8998-pon"
|
||||
|
||||
-reg: Specifies the physical address of the pon register
|
||||
|
||||
Optional subnode:
|
||||
-pwrkey: Specifies the subnode pwrkey and should follow the
|
||||
qcom,pm8941-pwrkey.txt description.
|
||||
-resin: Specifies the subnode resin and should follow the
|
||||
qcom,pm8xxx-pwrkey.txt description.
|
||||
|
||||
The rest of the properties should follow the generic reboot-mode description
|
||||
found in reboot-mode.txt
|
||||
|
||||
Example:
|
||||
|
||||
pon@800 {
|
||||
compatible = "qcom,pm8916-pon";
|
||||
|
||||
reg = <0x800>;
|
||||
mode-bootloader = <0x2>;
|
||||
mode-recovery = <0x1>;
|
||||
|
||||
pwrkey {
|
||||
compatible = "qcom,pm8941-pwrkey";
|
||||
interrupts = <0x0 0x8 0 IRQ_TYPE_EDGE_BOTH>;
|
||||
debounce = <15625>;
|
||||
bias-pull-up;
|
||||
linux,code = <KEY_POWER>;
|
||||
};
|
||||
|
||||
resin {
|
||||
compatible = "qcom,pm8941-resin";
|
||||
interrupts = <0x0 0x8 1 IRQ_TYPE_EDGE_BOTH>;
|
||||
debounce = <15625>;
|
||||
bias-pull-up;
|
||||
linux,code = <KEY_VOLUMEDOWN>;
|
||||
};
|
||||
};
|
|
@ -0,0 +1,80 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/power/reset/qcom,pon.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm PON Device
|
||||
|
||||
maintainers:
|
||||
- Vinod Koul <vkoul@kernel.org>
|
||||
|
||||
description: |
|
||||
The Power On device for Qualcomm PM8xxx is MFD supporting pwrkey
|
||||
and resin along with the Android reboot-mode.
|
||||
|
||||
This DT node has pwrkey and resin as sub nodes.
|
||||
|
||||
allOf:
|
||||
- $ref: reboot-mode.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,pm8916-pon
|
||||
- qcom,pms405-pon
|
||||
- qcom,pm8998-pon
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
pwrkey:
|
||||
type: object
|
||||
$ref: "../../input/qcom,pm8941-pwrkey.yaml#"
|
||||
|
||||
resin:
|
||||
type: object
|
||||
$ref: "../../input/qcom,pm8941-pwrkey.yaml#"
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/input/linux-event-codes.h>
|
||||
#include <dt-bindings/spmi/spmi.h>
|
||||
spmi_bus: spmi@c440000 {
|
||||
reg = <0x0c440000 0x1100>;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <0>;
|
||||
pmk8350: pmic@0 {
|
||||
reg = <0x0 SPMI_USID>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
pmk8350_pon: pon_hlos@1300 {
|
||||
reg = <0x1300>;
|
||||
compatible = "qcom,pm8998-pon";
|
||||
|
||||
pwrkey {
|
||||
compatible = "qcom,pm8941-pwrkey";
|
||||
interrupts = < 0x0 0x8 0 IRQ_TYPE_EDGE_BOTH >;
|
||||
debounce = <15625>;
|
||||
bias-pull-up;
|
||||
linux,code = <KEY_POWER>;
|
||||
};
|
||||
|
||||
resin {
|
||||
compatible = "qcom,pm8941-resin";
|
||||
interrupts = <0x0 0x8 1 IRQ_TYPE_EDGE_BOTH>;
|
||||
debounce = <15625>;
|
||||
bias-pull-up;
|
||||
linux,code = <KEY_VOLUMEDOWN>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
...
|
|
@ -36,7 +36,7 @@ patternProperties:
|
|||
"^mode-.*$":
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
||||
additionalProperties: false
|
||||
additionalProperties: true
|
||||
|
||||
examples:
|
||||
- |
|
||||
|
|
|
@ -28,10 +28,6 @@ MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
|
|||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static bool use_ktime = true;
|
||||
module_param(use_ktime, bool, 0400);
|
||||
MODULE_PARM_DESC(use_ktime, "Use ktime for measuring I/O speed");
|
||||
|
||||
/*
|
||||
* Option parsing.
|
||||
*/
|
||||
|
@ -110,7 +106,6 @@ struct analog_port {
|
|||
char cooked;
|
||||
int bads;
|
||||
int reads;
|
||||
int speed;
|
||||
int loop;
|
||||
int fuzz;
|
||||
int axes[4];
|
||||
|
@ -119,66 +114,6 @@ struct analog_port {
|
|||
int axtime;
|
||||
};
|
||||
|
||||
/*
|
||||
* Time macros.
|
||||
*/
|
||||
|
||||
#ifdef __i386__
|
||||
|
||||
#include <linux/i8253.h>
|
||||
|
||||
#define GET_TIME(x) do { if (boot_cpu_has(X86_FEATURE_TSC)) x = (unsigned int)rdtsc(); else x = get_time_pit(); } while (0)
|
||||
#define DELTA(x,y) (boot_cpu_has(X86_FEATURE_TSC) ? ((y) - (x)) : ((x) - (y) + ((x) < (y) ? PIT_TICK_RATE / HZ : 0)))
|
||||
#define TIME_NAME (boot_cpu_has(X86_FEATURE_TSC)?"TSC":"PIT")
|
||||
static unsigned int get_time_pit(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int count;
|
||||
|
||||
raw_spin_lock_irqsave(&i8253_lock, flags);
|
||||
outb_p(0x00, 0x43);
|
||||
count = inb_p(0x40);
|
||||
count |= inb_p(0x40) << 8;
|
||||
raw_spin_unlock_irqrestore(&i8253_lock, flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
#elif defined(__x86_64__)
|
||||
#define GET_TIME(x) do { x = (unsigned int)rdtsc(); } while (0)
|
||||
#define DELTA(x,y) ((y)-(x))
|
||||
#define TIME_NAME "TSC"
|
||||
#elif defined(__alpha__) || defined(CONFIG_ARM) || defined(CONFIG_ARM64) || defined(CONFIG_PPC) || defined(CONFIG_RISCV)
|
||||
#define GET_TIME(x) do { x = get_cycles(); } while (0)
|
||||
#define DELTA(x,y) ((y)-(x))
|
||||
#define TIME_NAME "get_cycles"
|
||||
#else
|
||||
#define FAKE_TIME
|
||||
static unsigned long analog_faketime = 0;
|
||||
#define GET_TIME(x) do { x = analog_faketime++; } while(0)
|
||||
#define DELTA(x,y) ((y)-(x))
|
||||
#define TIME_NAME "Unreliable"
|
||||
#warning Precise timer not defined for this architecture.
|
||||
#endif
|
||||
|
||||
static inline u64 get_time(void)
|
||||
{
|
||||
if (use_ktime) {
|
||||
return ktime_get_ns();
|
||||
} else {
|
||||
unsigned int x;
|
||||
GET_TIME(x);
|
||||
return x;
|
||||
}
|
||||
}
|
||||
|
||||
static inline unsigned int delta(u64 x, u64 y)
|
||||
{
|
||||
if (use_ktime)
|
||||
return y - x;
|
||||
else
|
||||
return DELTA((unsigned int)x, (unsigned int)y);
|
||||
}
|
||||
|
||||
/*
|
||||
* analog_decode() decodes analog joystick data and reports input events.
|
||||
*/
|
||||
|
@ -234,18 +169,18 @@ static void analog_decode(struct analog *analog, int *axes, int *initial, int bu
|
|||
static int analog_cooked_read(struct analog_port *port)
|
||||
{
|
||||
struct gameport *gameport = port->gameport;
|
||||
u64 time[4], start, loop, now;
|
||||
ktime_t time[4], start, loop, now;
|
||||
unsigned int loopout, timeout;
|
||||
unsigned char data[4], this, last;
|
||||
unsigned long flags;
|
||||
int i, j;
|
||||
|
||||
loopout = (ANALOG_LOOP_TIME * port->loop) / 1000;
|
||||
timeout = ANALOG_MAX_TIME * port->speed;
|
||||
timeout = ANALOG_MAX_TIME * NSEC_PER_MSEC;
|
||||
|
||||
local_irq_save(flags);
|
||||
gameport_trigger(gameport);
|
||||
now = get_time();
|
||||
now = ktime_get();
|
||||
local_irq_restore(flags);
|
||||
|
||||
start = now;
|
||||
|
@ -258,16 +193,16 @@ static int analog_cooked_read(struct analog_port *port)
|
|||
|
||||
local_irq_disable();
|
||||
this = gameport_read(gameport) & port->mask;
|
||||
now = get_time();
|
||||
now = ktime_get();
|
||||
local_irq_restore(flags);
|
||||
|
||||
if ((last ^ this) && (delta(loop, now) < loopout)) {
|
||||
if ((last ^ this) && (ktime_sub(now, loop) < loopout)) {
|
||||
data[i] = last ^ this;
|
||||
time[i] = now;
|
||||
i++;
|
||||
}
|
||||
|
||||
} while (this && (i < 4) && (delta(start, now) < timeout));
|
||||
} while (this && (i < 4) && (ktime_sub(now, start) < timeout));
|
||||
|
||||
this <<= 4;
|
||||
|
||||
|
@ -275,7 +210,7 @@ static int analog_cooked_read(struct analog_port *port)
|
|||
this |= data[i];
|
||||
for (j = 0; j < 4; j++)
|
||||
if (data[i] & (1 << j))
|
||||
port->axes[j] = (delta(start, time[i]) << ANALOG_FUZZ_BITS) / port->loop;
|
||||
port->axes[j] = ((u32)ktime_sub(time[i], start) << ANALOG_FUZZ_BITS) / port->loop;
|
||||
}
|
||||
|
||||
return -(this != port->mask);
|
||||
|
@ -375,38 +310,22 @@ static void analog_calibrate_timer(struct analog_port *port)
|
|||
{
|
||||
struct gameport *gameport = port->gameport;
|
||||
unsigned int i, t, tx;
|
||||
u64 t1, t2, t3;
|
||||
ktime_t t1, t2, t3;
|
||||
unsigned long flags;
|
||||
|
||||
if (use_ktime) {
|
||||
port->speed = 1000000;
|
||||
} else {
|
||||
local_irq_save(flags);
|
||||
t1 = get_time();
|
||||
#ifdef FAKE_TIME
|
||||
analog_faketime += 830;
|
||||
#endif
|
||||
mdelay(1);
|
||||
t2 = get_time();
|
||||
t3 = get_time();
|
||||
local_irq_restore(flags);
|
||||
|
||||
port->speed = delta(t1, t2) - delta(t2, t3);
|
||||
}
|
||||
|
||||
tx = ~0;
|
||||
|
||||
for (i = 0; i < 50; i++) {
|
||||
local_irq_save(flags);
|
||||
t1 = get_time();
|
||||
t1 = ktime_get();
|
||||
for (t = 0; t < 50; t++) {
|
||||
gameport_read(gameport);
|
||||
t2 = get_time();
|
||||
t2 = ktime_get();
|
||||
}
|
||||
t3 = get_time();
|
||||
t3 = ktime_get();
|
||||
local_irq_restore(flags);
|
||||
udelay(i);
|
||||
t = delta(t1, t2) - delta(t2, t3);
|
||||
t = ktime_sub(t2, t1) - ktime_sub(t3, t2);
|
||||
if (t < tx) tx = t;
|
||||
}
|
||||
|
||||
|
@ -611,7 +530,7 @@ static int analog_init_port(struct gameport *gameport, struct gameport_driver *d
|
|||
t = gameport_read(gameport);
|
||||
msleep(ANALOG_MAX_TIME);
|
||||
port->mask = (gameport_read(gameport) ^ t) & t & 0xf;
|
||||
port->fuzz = (port->speed * ANALOG_FUZZ_MAGIC) / port->loop / 1000 + ANALOG_FUZZ_BITS;
|
||||
port->fuzz = (NSEC_PER_MSEC * ANALOG_FUZZ_MAGIC) / port->loop / 1000 + ANALOG_FUZZ_BITS;
|
||||
|
||||
for (i = 0; i < ANALOG_INIT_RETRIES; i++) {
|
||||
if (!analog_cooked_read(port))
|
||||
|
|
|
@ -210,7 +210,7 @@ config KEYBOARD_LKKBD
|
|||
select SERIO
|
||||
help
|
||||
Say Y here if you want to use a LK201 or LK401 style serial
|
||||
keyboard. This keyboard is also useable on PCs if you attach
|
||||
keyboard. This keyboard is also usable on PCs if you attach
|
||||
it with the inputattach program. The connector pinout is
|
||||
described within lkkbd.c.
|
||||
|
||||
|
|
|
@ -193,7 +193,7 @@ static const struct of_device_id adc_keys_of_match[] = {
|
|||
MODULE_DEVICE_TABLE(of, adc_keys_of_match);
|
||||
#endif
|
||||
|
||||
static struct platform_driver __refdata adc_keys_driver = {
|
||||
static struct platform_driver adc_keys_driver = {
|
||||
.driver = {
|
||||
.name = "adc_keys",
|
||||
.of_match_table = of_match_ptr(adc_keys_of_match),
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/driver.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <linux/platform_data/adp5588.h>
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/driver.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <linux/input/adp5589.h>
|
||||
|
|
|
@ -157,7 +157,7 @@ static int ep93xx_keypad_open(struct input_dev *pdev)
|
|||
|
||||
if (!keypad->enabled) {
|
||||
ep93xx_keypad_config(keypad);
|
||||
clk_enable(keypad->clk);
|
||||
clk_prepare_enable(keypad->clk);
|
||||
keypad->enabled = true;
|
||||
}
|
||||
|
||||
|
@ -169,7 +169,7 @@ static void ep93xx_keypad_close(struct input_dev *pdev)
|
|||
struct ep93xx_keypad *keypad = input_get_drvdata(pdev);
|
||||
|
||||
if (keypad->enabled) {
|
||||
clk_disable(keypad->clk);
|
||||
clk_disable_unprepare(keypad->clk);
|
||||
keypad->enabled = false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -309,18 +309,6 @@ config INPUT_GPIO_VIBRA
|
|||
To compile this driver as a module, choose M here: the module will be
|
||||
called gpio-vibra.
|
||||
|
||||
config INPUT_IXP4XX_BEEPER
|
||||
tristate "IXP4XX Beeper support"
|
||||
depends on ARCH_IXP4XX
|
||||
help
|
||||
If you say yes here, you can connect a beeper to the
|
||||
ixp4xx gpio pins. This is used by the LinkSys NSLU2.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called ixp4xx-beeper.
|
||||
|
||||
config INPUT_COBALT_BTNS
|
||||
tristate "Cobalt button interface"
|
||||
depends on MIPS_COBALT
|
||||
|
@ -811,16 +799,6 @@ config INPUT_XEN_KBDDEV_FRONTEND
|
|||
To compile this driver as a module, choose M here: the
|
||||
module will be called xen-kbdfront.
|
||||
|
||||
config INPUT_SIRFSOC_ONKEY
|
||||
tristate "CSR SiRFSoC power on/off/suspend key support"
|
||||
depends on ARCH_SIRF && OF
|
||||
default y
|
||||
help
|
||||
Say Y here if you want to support for the SiRFSoC power on/off/suspend key
|
||||
in Linux, after you press the onkey, system will suspend.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config INPUT_IDEAPAD_SLIDEBAR
|
||||
tristate "IdeaPad Laptop Slidebar"
|
||||
depends on INPUT
|
||||
|
|
|
@ -44,7 +44,6 @@ obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o
|
|||
obj-$(CONFIG_INPUT_IMS_PCU) += ims-pcu.o
|
||||
obj-$(CONFIG_INPUT_IQS269A) += iqs269a.o
|
||||
obj-$(CONFIG_INPUT_IQS626A) += iqs626a.o
|
||||
obj-$(CONFIG_INPUT_IXP4XX_BEEPER) += ixp4xx-beeper.o
|
||||
obj-$(CONFIG_INPUT_KEYSPAN_REMOTE) += keyspan_remote.o
|
||||
obj-$(CONFIG_INPUT_KXTJ9) += kxtj9.o
|
||||
obj-$(CONFIG_INPUT_M68K_BEEP) += m68kspkr.o
|
||||
|
@ -74,7 +73,6 @@ obj-$(CONFIG_INPUT_GPIO_ROTARY_ENCODER) += rotary_encoder.o
|
|||
obj-$(CONFIG_INPUT_RK805_PWRKEY) += rk805-pwrkey.o
|
||||
obj-$(CONFIG_INPUT_SC27XX_VIBRA) += sc27xx-vibra.o
|
||||
obj-$(CONFIG_INPUT_SGI_BTNS) += sgi_btns.o
|
||||
obj-$(CONFIG_INPUT_SIRFSOC_ONKEY) += sirfsoc-onkey.o
|
||||
obj-$(CONFIG_INPUT_SOC_BUTTON_ARRAY) += soc_button_array.o
|
||||
obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o
|
||||
obj-$(CONFIG_INPUT_STPMIC1_ONKEY) += stpmic1_onkey.o
|
||||
|
|
|
@ -1,183 +0,0 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Generic IXP4xx beeper driver
|
||||
*
|
||||
* Copyright (C) 2005 Tower Technologies
|
||||
*
|
||||
* based on nslu2-io.c
|
||||
* Copyright (C) 2004 Karen Spearel
|
||||
*
|
||||
* Author: Alessandro Zummo <a.zummo@towertech.it>
|
||||
* Maintainers: http://www.nslu2-linux.org/
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <mach/hardware.h>
|
||||
|
||||
MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>");
|
||||
MODULE_DESCRIPTION("ixp4xx beeper driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:ixp4xx-beeper");
|
||||
|
||||
static DEFINE_SPINLOCK(beep_lock);
|
||||
|
||||
static int ixp4xx_timer2_irq;
|
||||
|
||||
static void ixp4xx_spkr_control(unsigned int pin, unsigned int count)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&beep_lock, flags);
|
||||
|
||||
if (count) {
|
||||
gpio_direction_output(pin, 0);
|
||||
*IXP4XX_OSRT2 = (count & ~IXP4XX_OST_RELOAD_MASK) | IXP4XX_OST_ENABLE;
|
||||
} else {
|
||||
gpio_direction_output(pin, 1);
|
||||
gpio_direction_input(pin);
|
||||
*IXP4XX_OSRT2 = 0;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&beep_lock, flags);
|
||||
}
|
||||
|
||||
static int ixp4xx_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
|
||||
{
|
||||
unsigned int pin = (unsigned int) input_get_drvdata(dev);
|
||||
unsigned int count = 0;
|
||||
|
||||
if (type != EV_SND)
|
||||
return -1;
|
||||
|
||||
switch (code) {
|
||||
case SND_BELL:
|
||||
if (value)
|
||||
value = 1000;
|
||||
case SND_TONE:
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (value > 20 && value < 32767)
|
||||
count = (ixp4xx_timer_freq / (value * 4)) - 1;
|
||||
|
||||
ixp4xx_spkr_control(pin, count);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static irqreturn_t ixp4xx_spkr_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
unsigned int pin = (unsigned int) dev_id;
|
||||
|
||||
/* clear interrupt */
|
||||
*IXP4XX_OSST = IXP4XX_OSST_TIMER_2_PEND;
|
||||
|
||||
/* flip the beeper output */
|
||||
gpio_set_value(pin, !gpio_get_value(pin));
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int ixp4xx_spkr_probe(struct platform_device *dev)
|
||||
{
|
||||
struct input_dev *input_dev;
|
||||
int irq;
|
||||
int err;
|
||||
|
||||
input_dev = input_allocate_device();
|
||||
if (!input_dev)
|
||||
return -ENOMEM;
|
||||
|
||||
input_set_drvdata(input_dev, (void *) dev->id);
|
||||
|
||||
input_dev->name = "ixp4xx beeper";
|
||||
input_dev->phys = "ixp4xx/gpio";
|
||||
input_dev->id.bustype = BUS_HOST;
|
||||
input_dev->id.vendor = 0x001f;
|
||||
input_dev->id.product = 0x0001;
|
||||
input_dev->id.version = 0x0100;
|
||||
input_dev->dev.parent = &dev->dev;
|
||||
|
||||
input_dev->evbit[0] = BIT_MASK(EV_SND);
|
||||
input_dev->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE);
|
||||
input_dev->event = ixp4xx_spkr_event;
|
||||
|
||||
irq = platform_get_irq(dev, 0);
|
||||
if (irq < 0) {
|
||||
err = irq;
|
||||
goto err_free_device;
|
||||
}
|
||||
|
||||
err = gpio_request(dev->id, "ixp4-beeper");
|
||||
if (err)
|
||||
goto err_free_device;
|
||||
|
||||
err = request_irq(irq, &ixp4xx_spkr_interrupt,
|
||||
IRQF_NO_SUSPEND, "ixp4xx-beeper",
|
||||
(void *) dev->id);
|
||||
if (err)
|
||||
goto err_free_gpio;
|
||||
ixp4xx_timer2_irq = irq;
|
||||
|
||||
err = input_register_device(input_dev);
|
||||
if (err)
|
||||
goto err_free_irq;
|
||||
|
||||
platform_set_drvdata(dev, input_dev);
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_irq:
|
||||
free_irq(irq, (void *)dev->id);
|
||||
err_free_gpio:
|
||||
gpio_free(dev->id);
|
||||
err_free_device:
|
||||
input_free_device(input_dev);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ixp4xx_spkr_remove(struct platform_device *dev)
|
||||
{
|
||||
struct input_dev *input_dev = platform_get_drvdata(dev);
|
||||
unsigned int pin = (unsigned int) input_get_drvdata(input_dev);
|
||||
|
||||
input_unregister_device(input_dev);
|
||||
|
||||
/* turn the speaker off */
|
||||
disable_irq(ixp4xx_timer2_irq);
|
||||
ixp4xx_spkr_control(pin, 0);
|
||||
|
||||
free_irq(ixp4xx_timer2_irq, (void *)dev->id);
|
||||
gpio_free(dev->id);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ixp4xx_spkr_shutdown(struct platform_device *dev)
|
||||
{
|
||||
struct input_dev *input_dev = platform_get_drvdata(dev);
|
||||
unsigned int pin = (unsigned int) input_get_drvdata(input_dev);
|
||||
|
||||
/* turn off the speaker */
|
||||
disable_irq(ixp4xx_timer2_irq);
|
||||
ixp4xx_spkr_control(pin, 0);
|
||||
}
|
||||
|
||||
static struct platform_driver ixp4xx_spkr_platform_driver = {
|
||||
.driver = {
|
||||
.name = "ixp4xx-beeper",
|
||||
},
|
||||
.probe = ixp4xx_spkr_probe,
|
||||
.remove = ixp4xx_spkr_remove,
|
||||
.shutdown = ixp4xx_spkr_shutdown,
|
||||
};
|
||||
module_platform_driver(ixp4xx_spkr_platform_driver);
|
||||
|
|
@ -284,7 +284,7 @@ static int pm8941_pwrkey_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
if (pwrkey->data->supports_ps_hold_poff_config) {
|
||||
pwrkey->reboot_notifier.notifier_call = pm8941_reboot_notify,
|
||||
pwrkey->reboot_notifier.notifier_call = pm8941_reboot_notify;
|
||||
error = register_reboot_notifier(&pwrkey->reboot_notifier);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev, "failed to register reboot notifier: %d\n",
|
||||
|
|
|
@ -1,207 +0,0 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* Power key driver for SiRF PrimaII
|
||||
*
|
||||
* Copyright (c) 2013 - 2014 Cambridge Silicon Radio Limited, a CSR plc group
|
||||
* company.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/rtc/sirfsoc_rtciobrg.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
struct sirfsoc_pwrc_drvdata {
|
||||
u32 pwrc_base;
|
||||
struct input_dev *input;
|
||||
struct delayed_work work;
|
||||
};
|
||||
|
||||
#define PWRC_ON_KEY_BIT (1 << 0)
|
||||
|
||||
#define PWRC_INT_STATUS 0xc
|
||||
#define PWRC_INT_MASK 0x10
|
||||
#define PWRC_PIN_STATUS 0x14
|
||||
#define PWRC_KEY_DETECT_UP_TIME 20 /* ms*/
|
||||
|
||||
static int sirfsoc_pwrc_is_on_key_down(struct sirfsoc_pwrc_drvdata *pwrcdrv)
|
||||
{
|
||||
u32 state = sirfsoc_rtc_iobrg_readl(pwrcdrv->pwrc_base +
|
||||
PWRC_PIN_STATUS);
|
||||
return !(state & PWRC_ON_KEY_BIT); /* ON_KEY is active low */
|
||||
}
|
||||
|
||||
static void sirfsoc_pwrc_report_event(struct work_struct *work)
|
||||
{
|
||||
struct sirfsoc_pwrc_drvdata *pwrcdrv =
|
||||
container_of(work, struct sirfsoc_pwrc_drvdata, work.work);
|
||||
|
||||
if (sirfsoc_pwrc_is_on_key_down(pwrcdrv)) {
|
||||
schedule_delayed_work(&pwrcdrv->work,
|
||||
msecs_to_jiffies(PWRC_KEY_DETECT_UP_TIME));
|
||||
} else {
|
||||
input_event(pwrcdrv->input, EV_KEY, KEY_POWER, 0);
|
||||
input_sync(pwrcdrv->input);
|
||||
}
|
||||
}
|
||||
|
||||
static irqreturn_t sirfsoc_pwrc_isr(int irq, void *dev_id)
|
||||
{
|
||||
struct sirfsoc_pwrc_drvdata *pwrcdrv = dev_id;
|
||||
u32 int_status;
|
||||
|
||||
int_status = sirfsoc_rtc_iobrg_readl(pwrcdrv->pwrc_base +
|
||||
PWRC_INT_STATUS);
|
||||
sirfsoc_rtc_iobrg_writel(int_status & ~PWRC_ON_KEY_BIT,
|
||||
pwrcdrv->pwrc_base + PWRC_INT_STATUS);
|
||||
|
||||
input_event(pwrcdrv->input, EV_KEY, KEY_POWER, 1);
|
||||
input_sync(pwrcdrv->input);
|
||||
schedule_delayed_work(&pwrcdrv->work,
|
||||
msecs_to_jiffies(PWRC_KEY_DETECT_UP_TIME));
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static void sirfsoc_pwrc_toggle_interrupts(struct sirfsoc_pwrc_drvdata *pwrcdrv,
|
||||
bool enable)
|
||||
{
|
||||
u32 int_mask;
|
||||
|
||||
int_mask = sirfsoc_rtc_iobrg_readl(pwrcdrv->pwrc_base + PWRC_INT_MASK);
|
||||
if (enable)
|
||||
int_mask |= PWRC_ON_KEY_BIT;
|
||||
else
|
||||
int_mask &= ~PWRC_ON_KEY_BIT;
|
||||
sirfsoc_rtc_iobrg_writel(int_mask, pwrcdrv->pwrc_base + PWRC_INT_MASK);
|
||||
}
|
||||
|
||||
static int sirfsoc_pwrc_open(struct input_dev *input)
|
||||
{
|
||||
struct sirfsoc_pwrc_drvdata *pwrcdrv = input_get_drvdata(input);
|
||||
|
||||
sirfsoc_pwrc_toggle_interrupts(pwrcdrv, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void sirfsoc_pwrc_close(struct input_dev *input)
|
||||
{
|
||||
struct sirfsoc_pwrc_drvdata *pwrcdrv = input_get_drvdata(input);
|
||||
|
||||
sirfsoc_pwrc_toggle_interrupts(pwrcdrv, false);
|
||||
cancel_delayed_work_sync(&pwrcdrv->work);
|
||||
}
|
||||
|
||||
static const struct of_device_id sirfsoc_pwrc_of_match[] = {
|
||||
{ .compatible = "sirf,prima2-pwrc" },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, sirfsoc_pwrc_of_match);
|
||||
|
||||
static int sirfsoc_pwrc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct sirfsoc_pwrc_drvdata *pwrcdrv;
|
||||
int irq;
|
||||
int error;
|
||||
|
||||
pwrcdrv = devm_kzalloc(&pdev->dev, sizeof(struct sirfsoc_pwrc_drvdata),
|
||||
GFP_KERNEL);
|
||||
if (!pwrcdrv) {
|
||||
dev_info(&pdev->dev, "Not enough memory for the device data\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/*
|
||||
* We can't use of_iomap because pwrc is not mapped in memory,
|
||||
* the so-called base address is only offset in rtciobrg
|
||||
*/
|
||||
error = of_property_read_u32(np, "reg", &pwrcdrv->pwrc_base);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev,
|
||||
"unable to find base address of pwrc node in dtb\n");
|
||||
return error;
|
||||
}
|
||||
|
||||
pwrcdrv->input = devm_input_allocate_device(&pdev->dev);
|
||||
if (!pwrcdrv->input)
|
||||
return -ENOMEM;
|
||||
|
||||
pwrcdrv->input->name = "sirfsoc pwrckey";
|
||||
pwrcdrv->input->phys = "pwrc/input0";
|
||||
pwrcdrv->input->evbit[0] = BIT_MASK(EV_KEY);
|
||||
input_set_capability(pwrcdrv->input, EV_KEY, KEY_POWER);
|
||||
|
||||
INIT_DELAYED_WORK(&pwrcdrv->work, sirfsoc_pwrc_report_event);
|
||||
|
||||
pwrcdrv->input->open = sirfsoc_pwrc_open;
|
||||
pwrcdrv->input->close = sirfsoc_pwrc_close;
|
||||
|
||||
input_set_drvdata(pwrcdrv->input, pwrcdrv);
|
||||
|
||||
/* Make sure the device is quiesced */
|
||||
sirfsoc_pwrc_toggle_interrupts(pwrcdrv, false);
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
error = devm_request_irq(&pdev->dev, irq,
|
||||
sirfsoc_pwrc_isr, 0,
|
||||
"sirfsoc_pwrc_int", pwrcdrv);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev, "unable to claim irq %d, error: %d\n",
|
||||
irq, error);
|
||||
return error;
|
||||
}
|
||||
|
||||
error = input_register_device(pwrcdrv->input);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev,
|
||||
"unable to register input device, error: %d\n",
|
||||
error);
|
||||
return error;
|
||||
}
|
||||
|
||||
dev_set_drvdata(&pdev->dev, pwrcdrv);
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __maybe_unused sirfsoc_pwrc_resume(struct device *dev)
|
||||
{
|
||||
struct sirfsoc_pwrc_drvdata *pwrcdrv = dev_get_drvdata(dev);
|
||||
struct input_dev *input = pwrcdrv->input;
|
||||
|
||||
/*
|
||||
* Do not mask pwrc interrupt as we want pwrc work as a wakeup source
|
||||
* if users touch X_ONKEY_B, see arch/arm/mach-prima2/pm.c
|
||||
*/
|
||||
mutex_lock(&input->mutex);
|
||||
if (input_device_enabled(input))
|
||||
sirfsoc_pwrc_toggle_interrupts(pwrcdrv, true);
|
||||
mutex_unlock(&input->mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(sirfsoc_pwrc_pm_ops, NULL, sirfsoc_pwrc_resume);
|
||||
|
||||
static struct platform_driver sirfsoc_pwrc_driver = {
|
||||
.probe = sirfsoc_pwrc_probe,
|
||||
.driver = {
|
||||
.name = "sirfsoc-pwrc",
|
||||
.pm = &sirfsoc_pwrc_pm_ops,
|
||||
.of_match_table = sirfsoc_pwrc_of_match,
|
||||
}
|
||||
};
|
||||
|
||||
module_platform_driver(sirfsoc_pwrc_driver);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("Binghua Duan <Binghua.Duan@csr.com>, Xianglong Du <Xianglong.Du@csr.com>");
|
||||
MODULE_DESCRIPTION("CSR Prima2 PWRC Driver");
|
||||
MODULE_ALIAS("platform:sirfsoc-pwrc");
|
|
@ -55,8 +55,9 @@
|
|||
#define ETP_FW_PAGE_SIZE_512 512
|
||||
#define ETP_FW_SIGNATURE_SIZE 6
|
||||
|
||||
#define ETP_PRODUCT_ID_DELBIN 0x00C2
|
||||
#define ETP_PRODUCT_ID_WHITEBOX 0x00B8
|
||||
#define ETP_PRODUCT_ID_VOXEL 0x00BF
|
||||
#define ETP_PRODUCT_ID_DELBIN 0x00C2
|
||||
#define ETP_PRODUCT_ID_MAGPIE 0x0120
|
||||
#define ETP_PRODUCT_ID_BOBBA 0x0121
|
||||
|
||||
|
|
|
@ -105,6 +105,7 @@ static u32 elan_i2c_lookup_quirks(u16 ic_type, u16 product_id)
|
|||
u32 quirks;
|
||||
} elan_i2c_quirks[] = {
|
||||
{ 0x0D, ETP_PRODUCT_ID_DELBIN, ETP_QUIRK_QUICK_WAKEUP },
|
||||
{ 0x0D, ETP_PRODUCT_ID_WHITEBOX, ETP_QUIRK_QUICK_WAKEUP },
|
||||
{ 0x10, ETP_PRODUCT_ID_VOXEL, ETP_QUIRK_QUICK_WAKEUP },
|
||||
{ 0x14, ETP_PRODUCT_ID_MAGPIE, ETP_QUIRK_QUICK_WAKEUP },
|
||||
{ 0x14, ETP_PRODUCT_ID_BOBBA, ETP_QUIRK_QUICK_WAKEUP },
|
||||
|
|
|
@ -220,16 +220,4 @@ static struct parport_driver parkbd_parport_driver = {
|
|||
.detach = parkbd_detach,
|
||||
.devmodel = true,
|
||||
};
|
||||
|
||||
static int __init parkbd_init(void)
|
||||
{
|
||||
return parport_register_driver(&parkbd_parport_driver);
|
||||
}
|
||||
|
||||
static void __exit parkbd_exit(void)
|
||||
{
|
||||
parport_unregister_driver(&parkbd_parport_driver);
|
||||
}
|
||||
|
||||
module_init(parkbd_init);
|
||||
module_exit(parkbd_exit);
|
||||
module_parport_driver(parkbd_parport_driver);
|
||||
|
|
|
@ -932,7 +932,7 @@ config TOUCHSCREEN_USB_COMPOSITE
|
|||
- JASTEC USB Touch Controller/DigiTech DTR-02U
|
||||
- Zytronic controllers
|
||||
- Elo TouchSystems 2700 IntelliTouch
|
||||
- EasyTouch USB Touch Controller from Data Modul
|
||||
- EasyTouch USB Touch Controller from Data Module
|
||||
- e2i (Mimo monitors)
|
||||
|
||||
Have a look at <http://linux.chapter7.ch/touchkit/> for
|
||||
|
|
|
@ -899,6 +899,7 @@ static int edt_ft5x06_ts_identify(struct i2c_client *client,
|
|||
* the identification registers.
|
||||
*/
|
||||
switch (rdbuf[0]) {
|
||||
case 0x11: /* EDT EP0110M09 */
|
||||
case 0x35: /* EDT EP0350M09 */
|
||||
case 0x43: /* EDT EP0430M09 */
|
||||
case 0x50: /* EDT EP0500M09 */
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
|
||||
enum mms_type {
|
||||
TYPE_MMS114 = 114,
|
||||
TYPE_MMS134S = 134,
|
||||
TYPE_MMS136 = 136,
|
||||
TYPE_MMS152 = 152,
|
||||
TYPE_MMS345L = 345,
|
||||
|
@ -212,7 +213,7 @@ static irqreturn_t mms114_interrupt(int irq, void *dev_id)
|
|||
goto out;
|
||||
|
||||
/* MMS136 has slightly different event size */
|
||||
if (data->type == TYPE_MMS136)
|
||||
if (data->type == TYPE_MMS134S || data->type == TYPE_MMS136)
|
||||
touch_size = packet_size / MMS136_EVENT_SIZE;
|
||||
else
|
||||
touch_size = packet_size / MMS114_EVENT_SIZE;
|
||||
|
@ -281,6 +282,7 @@ static int mms114_get_version(struct mms114_data *data)
|
|||
break;
|
||||
|
||||
case TYPE_MMS114:
|
||||
case TYPE_MMS134S:
|
||||
case TYPE_MMS136:
|
||||
error = __mms114_read_reg(data, MMS114_TSP_REV, 6, buf);
|
||||
if (error)
|
||||
|
@ -304,8 +306,9 @@ static int mms114_setup_regs(struct mms114_data *data)
|
|||
if (error < 0)
|
||||
return error;
|
||||
|
||||
/* Only MMS114 and MMS136 have configuration and power on registers */
|
||||
if (data->type != TYPE_MMS114 && data->type != TYPE_MMS136)
|
||||
/* MMS114, MMS134S and MMS136 have configuration and power on registers */
|
||||
if (data->type != TYPE_MMS114 && data->type != TYPE_MMS134S &&
|
||||
data->type != TYPE_MMS136)
|
||||
return 0;
|
||||
|
||||
error = mms114_set_active(data, true);
|
||||
|
@ -487,7 +490,8 @@ static int mms114_probe(struct i2c_client *client,
|
|||
0, data->props.max_y, 0, 0);
|
||||
}
|
||||
|
||||
if (data->type == TYPE_MMS114 || data->type == TYPE_MMS136) {
|
||||
if (data->type == TYPE_MMS114 || data->type == TYPE_MMS134S ||
|
||||
data->type == TYPE_MMS136) {
|
||||
/*
|
||||
* The firmware handles movement and pressure fuzz, so
|
||||
* don't duplicate that in software.
|
||||
|
@ -611,6 +615,9 @@ static const struct of_device_id mms114_dt_match[] = {
|
|||
{
|
||||
.compatible = "melfas,mms114",
|
||||
.data = (void *)TYPE_MMS114,
|
||||
}, {
|
||||
.compatible = "melfas,mms134s",
|
||||
.data = (void *)TYPE_MMS134S,
|
||||
}, {
|
||||
.compatible = "melfas,mms136",
|
||||
.data = (void *)TYPE_MMS136,
|
||||
|
|
Loading…
Reference in New Issue