mirror of
https://github.com/torvalds/linux.git
synced 2025-11-30 23:16:01 +07:00
Merge tag 'input-for-v6.18-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
Pull input fixes from Dmitry Torokhov: - INPUT_PROP_HAPTIC_TOUCHPAD definition added early in 6.18 cycle has been renamed to INPUT_PROP_PRESSUREPAD to better reflect the kind of devices it is supposed to be set for - a new ID for a touchscreen found in Ayaneo Flip DS in Goodix driver - Goodix driver no longer tries to set reset pin as "input" as it causes issues when there is no pull up resistor installed on the board - fixes for cros_ec_keyb, imx_sc_key, and pegasus-notetaker drivers to deal with potential out-of-bounds access and memory corruption issues * tag 'input-for-v6.18-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: Input: rename INPUT_PROP_HAPTIC_TOUCHPAD to INPUT_PROP_PRESSUREPAD Input: cros_ec_keyb - fix an invalid memory access Input: imx_sc_key - fix memory corruption on unload Input: pegasus-notetaker - fix potential out-of-bounds access Input: goodix - remove setting of RST pin to input Input: goodix - add support for ACPI ID GDIX1003
This commit is contained in:
@@ -400,19 +400,30 @@ can report through the rotational axes (absolute and/or relative rx, ry, rz).
|
|||||||
All other axes retain their meaning. A device must not mix
|
All other axes retain their meaning. A device must not mix
|
||||||
regular directional axes and accelerometer axes on the same event node.
|
regular directional axes and accelerometer axes on the same event node.
|
||||||
|
|
||||||
INPUT_PROP_HAPTIC_TOUCHPAD
|
INPUT_PROP_PRESSUREPAD
|
||||||
--------------------------
|
----------------------
|
||||||
|
|
||||||
|
The INPUT_PROP_PRESSUREPAD property indicates that the device provides
|
||||||
|
simulated haptic feedback (e.g. a vibrator motor situated below the surface)
|
||||||
|
instead of physical haptic feedback (e.g. a hinge). This property is only set
|
||||||
|
if the device:
|
||||||
|
|
||||||
The INPUT_PROP_HAPTIC_TOUCHPAD property indicates that device:
|
|
||||||
- supports simple haptic auto and manual triggering
|
|
||||||
- can differentiate between at least 5 fingers
|
- can differentiate between at least 5 fingers
|
||||||
- uses correct resolution for the X/Y (units and value)
|
- uses correct resolution for the X/Y (units and value)
|
||||||
- reports correct force per touch, and correct units for them (newtons or grams)
|
|
||||||
- follows the MT protocol type B
|
- follows the MT protocol type B
|
||||||
|
|
||||||
|
If the simulated haptic feedback is controllable by userspace the device must:
|
||||||
|
|
||||||
|
- support simple haptic auto and manual triggering, and
|
||||||
|
- report correct force per touch, and correct units for them (newtons or grams), and
|
||||||
|
- provide the EV_FF FF_HAPTIC force feedback effect.
|
||||||
|
|
||||||
Summing up, such devices follow the MS spec for input devices in
|
Summing up, such devices follow the MS spec for input devices in
|
||||||
Win8 and Win8.1, and in addition support the Simple haptic controller HID table,
|
Win8 and Win8.1, and in addition may support the Simple haptic controller HID
|
||||||
and report correct units for the pressure.
|
table, and report correct units for the pressure.
|
||||||
|
|
||||||
|
Where applicable, this property is set in addition to INPUT_PROP_BUTTONPAD, it
|
||||||
|
does not replace that property.
|
||||||
|
|
||||||
Guidelines
|
Guidelines
|
||||||
==========
|
==========
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ int hid_haptic_input_configured(struct hid_device *hdev,
|
|||||||
if (hi->application == HID_DG_TOUCHPAD) {
|
if (hi->application == HID_DG_TOUCHPAD) {
|
||||||
if (haptic->auto_trigger_report &&
|
if (haptic->auto_trigger_report &&
|
||||||
haptic->manual_trigger_report) {
|
haptic->manual_trigger_report) {
|
||||||
__set_bit(INPUT_PROP_HAPTIC_TOUCHPAD, hi->input->propbit);
|
__set_bit(INPUT_PROP_PRESSUREPAD, hi->input->propbit);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -261,6 +261,12 @@ static int cros_ec_keyb_work(struct notifier_block *nb,
|
|||||||
case EC_MKBP_EVENT_KEY_MATRIX:
|
case EC_MKBP_EVENT_KEY_MATRIX:
|
||||||
pm_wakeup_event(ckdev->dev, 0);
|
pm_wakeup_event(ckdev->dev, 0);
|
||||||
|
|
||||||
|
if (!ckdev->idev) {
|
||||||
|
dev_warn_once(ckdev->dev,
|
||||||
|
"Unexpected key matrix event\n");
|
||||||
|
return NOTIFY_OK;
|
||||||
|
}
|
||||||
|
|
||||||
if (ckdev->ec->event_size != ckdev->cols) {
|
if (ckdev->ec->event_size != ckdev->cols) {
|
||||||
dev_err(ckdev->dev,
|
dev_err(ckdev->dev,
|
||||||
"Discarded incomplete key matrix event.\n");
|
"Discarded incomplete key matrix event.\n");
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ static int imx_sc_key_probe(struct platform_device *pdev)
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
error = devm_add_action_or_reset(&pdev->dev, imx_sc_key_action, &priv);
|
error = devm_add_action_or_reset(&pdev->dev, imx_sc_key_action, priv);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
|||||||
@@ -63,6 +63,9 @@
|
|||||||
#define BUTTON_PRESSED 0xb5
|
#define BUTTON_PRESSED 0xb5
|
||||||
#define COMMAND_VERSION 0xa9
|
#define COMMAND_VERSION 0xa9
|
||||||
|
|
||||||
|
/* 1 Status + 1 Color + 2 X + 2 Y = 6 bytes */
|
||||||
|
#define NOTETAKER_PACKET_SIZE 6
|
||||||
|
|
||||||
/* in xy data packet */
|
/* in xy data packet */
|
||||||
#define BATTERY_NO_REPORT 0x40
|
#define BATTERY_NO_REPORT 0x40
|
||||||
#define BATTERY_LOW 0x41
|
#define BATTERY_LOW 0x41
|
||||||
@@ -311,6 +314,12 @@ static int pegasus_probe(struct usb_interface *intf,
|
|||||||
}
|
}
|
||||||
|
|
||||||
pegasus->data_len = usb_maxpacket(dev, pipe);
|
pegasus->data_len = usb_maxpacket(dev, pipe);
|
||||||
|
if (pegasus->data_len < NOTETAKER_PACKET_SIZE) {
|
||||||
|
dev_err(&intf->dev, "packet size is too small (%d)\n",
|
||||||
|
pegasus->data_len);
|
||||||
|
error = -EINVAL;
|
||||||
|
goto err_free_mem;
|
||||||
|
}
|
||||||
|
|
||||||
pegasus->data = usb_alloc_coherent(dev, pegasus->data_len, GFP_KERNEL,
|
pegasus->data = usb_alloc_coherent(dev, pegasus->data_len, GFP_KERNEL,
|
||||||
&pegasus->data_dma);
|
&pegasus->data_dma);
|
||||||
|
|||||||
@@ -796,17 +796,6 @@ int goodix_reset_no_int_sync(struct goodix_ts_data *ts)
|
|||||||
|
|
||||||
usleep_range(6000, 10000); /* T4: > 5ms */
|
usleep_range(6000, 10000); /* T4: > 5ms */
|
||||||
|
|
||||||
/*
|
|
||||||
* Put the reset pin back in to input / high-impedance mode to save
|
|
||||||
* power. Only do this in the non ACPI case since some ACPI boards
|
|
||||||
* don't have a pull-up, so there the reset pin must stay active-high.
|
|
||||||
*/
|
|
||||||
if (ts->irq_pin_access_method == IRQ_PIN_ACCESS_GPIO) {
|
|
||||||
error = gpiod_direction_input(ts->gpiod_rst);
|
|
||||||
if (error)
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
@@ -957,14 +946,6 @@ static int goodix_add_acpi_gpio_mappings(struct goodix_ts_data *ts)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Normally we put the reset pin in input / high-impedance mode to save
|
|
||||||
* power. But some x86/ACPI boards don't have a pull-up, so for the ACPI
|
|
||||||
* case, leave the pin as is. This results in the pin not being touched
|
|
||||||
* at all on x86/ACPI boards, except when needed for error-recover.
|
|
||||||
*/
|
|
||||||
ts->gpiod_rst_flags = GPIOD_ASIS;
|
|
||||||
|
|
||||||
return devm_acpi_dev_add_driver_gpios(dev, gpio_mapping);
|
return devm_acpi_dev_add_driver_gpios(dev, gpio_mapping);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@@ -989,12 +970,6 @@ static int goodix_get_gpio_config(struct goodix_ts_data *ts)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
dev = &ts->client->dev;
|
dev = &ts->client->dev;
|
||||||
|
|
||||||
/*
|
|
||||||
* By default we request the reset pin as input, leaving it in
|
|
||||||
* high-impedance when not resetting the controller to save power.
|
|
||||||
*/
|
|
||||||
ts->gpiod_rst_flags = GPIOD_IN;
|
|
||||||
|
|
||||||
ts->avdd28 = devm_regulator_get(dev, "AVDD28");
|
ts->avdd28 = devm_regulator_get(dev, "AVDD28");
|
||||||
if (IS_ERR(ts->avdd28))
|
if (IS_ERR(ts->avdd28))
|
||||||
return dev_err_probe(dev, PTR_ERR(ts->avdd28), "Failed to get AVDD28 regulator\n");
|
return dev_err_probe(dev, PTR_ERR(ts->avdd28), "Failed to get AVDD28 regulator\n");
|
||||||
@@ -1019,7 +994,7 @@ retry_get_irq_gpio:
|
|||||||
ts->gpiod_int = gpiod;
|
ts->gpiod_int = gpiod;
|
||||||
|
|
||||||
/* Get the reset line GPIO pin number */
|
/* Get the reset line GPIO pin number */
|
||||||
gpiod = devm_gpiod_get_optional(dev, GOODIX_GPIO_RST_NAME, ts->gpiod_rst_flags);
|
gpiod = devm_gpiod_get_optional(dev, GOODIX_GPIO_RST_NAME, GPIOD_ASIS);
|
||||||
if (IS_ERR(gpiod))
|
if (IS_ERR(gpiod))
|
||||||
return dev_err_probe(dev, PTR_ERR(gpiod), "Failed to get %s GPIO\n",
|
return dev_err_probe(dev, PTR_ERR(gpiod), "Failed to get %s GPIO\n",
|
||||||
GOODIX_GPIO_RST_NAME);
|
GOODIX_GPIO_RST_NAME);
|
||||||
@@ -1557,6 +1532,7 @@ MODULE_DEVICE_TABLE(i2c, goodix_ts_id);
|
|||||||
static const struct acpi_device_id goodix_acpi_match[] = {
|
static const struct acpi_device_id goodix_acpi_match[] = {
|
||||||
{ "GDIX1001", 0 },
|
{ "GDIX1001", 0 },
|
||||||
{ "GDIX1002", 0 },
|
{ "GDIX1002", 0 },
|
||||||
|
{ "GDIX1003", 0 },
|
||||||
{ "GDX9110", 0 },
|
{ "GDX9110", 0 },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -88,7 +88,6 @@ struct goodix_ts_data {
|
|||||||
struct gpio_desc *gpiod_rst;
|
struct gpio_desc *gpiod_rst;
|
||||||
int gpio_count;
|
int gpio_count;
|
||||||
int gpio_int_idx;
|
int gpio_int_idx;
|
||||||
enum gpiod_flags gpiod_rst_flags;
|
|
||||||
char id[GOODIX_ID_MAX_LEN + 1];
|
char id[GOODIX_ID_MAX_LEN + 1];
|
||||||
char cfg_name[64];
|
char cfg_name[64];
|
||||||
u16 version;
|
u16 version;
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
#define INPUT_PROP_TOPBUTTONPAD 0x04 /* softbuttons at top of pad */
|
#define INPUT_PROP_TOPBUTTONPAD 0x04 /* softbuttons at top of pad */
|
||||||
#define INPUT_PROP_POINTING_STICK 0x05 /* is a pointing stick */
|
#define INPUT_PROP_POINTING_STICK 0x05 /* is a pointing stick */
|
||||||
#define INPUT_PROP_ACCELEROMETER 0x06 /* has accelerometer */
|
#define INPUT_PROP_ACCELEROMETER 0x06 /* has accelerometer */
|
||||||
#define INPUT_PROP_HAPTIC_TOUCHPAD 0x07 /* is a haptic touchpad */
|
#define INPUT_PROP_PRESSUREPAD 0x07 /* pressure triggers clicks */
|
||||||
|
|
||||||
#define INPUT_PROP_MAX 0x1f
|
#define INPUT_PROP_MAX 0x1f
|
||||||
#define INPUT_PROP_CNT (INPUT_PROP_MAX + 1)
|
#define INPUT_PROP_CNT (INPUT_PROP_MAX + 1)
|
||||||
|
|||||||
Reference in New Issue
Block a user