* [PATCH 3/3] Input: matrix_keypad - switch to using managed resources
From: Dmitry Torokhov @ 2024-01-21 5:32 UTC (permalink / raw)
To: linux-input, Dan Carpenter, Bartosz Golaszewski; +Cc: linux-kernel
In-Reply-To: <20240121053232.276968-1-dmitry.torokhov@gmail.com>
Switch the drivers to use managed resources (devm) to simplify error
handling and remove the need to have remove() implementation.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/input/keyboard/matrix_keypad.c | 89 +++++++-------------------
1 file changed, 24 insertions(+), 65 deletions(-)
diff --git a/drivers/input/keyboard/matrix_keypad.c b/drivers/input/keyboard/matrix_keypad.c
index 44ef600b8f19..695c03e075b5 100644
--- a/drivers/input/keyboard/matrix_keypad.c
+++ b/drivers/input/keyboard/matrix_keypad.c
@@ -278,38 +278,41 @@ static int matrix_keypad_init_gpio(struct platform_device *pdev,
/* initialized strobe lines as outputs, activated */
for (i = 0; i < pdata->num_col_gpios; i++) {
- err = gpio_request(pdata->col_gpios[i], "matrix_kbd_col");
+ err = devm_gpio_request(&pdev->dev,
+ pdata->col_gpios[i], "matrix_kbd_col");
if (err) {
dev_err(&pdev->dev,
"failed to request GPIO%d for COL%d\n",
pdata->col_gpios[i], i);
- goto err_free_cols;
+ return err;
}
gpio_direction_output(pdata->col_gpios[i], !pdata->active_low);
}
for (i = 0; i < pdata->num_row_gpios; i++) {
- err = gpio_request(pdata->row_gpios[i], "matrix_kbd_row");
+ err = devm_gpio_request(&pdev->dev,
+ pdata->row_gpios[i], "matrix_kbd_row");
if (err) {
dev_err(&pdev->dev,
"failed to request GPIO%d for ROW%d\n",
pdata->row_gpios[i], i);
- goto err_free_rows;
+ return err;
}
gpio_direction_input(pdata->row_gpios[i]);
}
if (pdata->clustered_irq > 0) {
- err = request_any_context_irq(pdata->clustered_irq,
+ err = devm_request_any_context_irq(&pdev->dev,
+ pdata->clustered_irq,
matrix_keypad_interrupt,
pdata->clustered_irq_flags,
"matrix-keypad", keypad);
if (err < 0) {
dev_err(&pdev->dev,
"Unable to acquire clustered interrupt\n");
- goto err_free_rows;
+ return err;
}
keypad->row_irqs[0] = pdata->clustered_irq;
@@ -322,10 +325,11 @@ static int matrix_keypad_init_gpio(struct platform_device *pdev,
dev_err(&pdev->dev,
"Unable to convert GPIO line %i to irq: %d\n",
pdata->row_gpios[i], err);
- goto err_free_irqs;
+ return err;
}
- err = request_any_context_irq(irq,
+ err = devm_request_any_context_irq(&pdev->dev,
+ irq,
matrix_keypad_interrupt,
IRQF_TRIGGER_RISING |
IRQF_TRIGGER_FALLING,
@@ -334,7 +338,7 @@ static int matrix_keypad_init_gpio(struct platform_device *pdev,
dev_err(&pdev->dev,
"Unable to acquire interrupt for GPIO line %i\n",
pdata->row_gpios[i]);
- goto err_free_irqs;
+ return err;
}
keypad->row_irqs[i] = irq;
@@ -345,36 +349,8 @@ static int matrix_keypad_init_gpio(struct platform_device *pdev,
/* initialized as disabled - enabled by input->open */
disable_row_irqs(keypad);
- return 0;
-
-err_free_irqs:
- while (--i >= 0)
- free_irq(keypad->row_irqs[i], keypad);
- i = pdata->num_row_gpios;
-err_free_rows:
- while (--i >= 0)
- gpio_free(pdata->row_gpios[i]);
- i = pdata->num_col_gpios;
-err_free_cols:
- while (--i >= 0)
- gpio_free(pdata->col_gpios[i]);
-
- return err;
-}
-
-static void matrix_keypad_free_gpio(struct matrix_keypad *keypad)
-{
- const struct matrix_keypad_platform_data *pdata = keypad->pdata;
- int i;
-
- for (i = 0; i < keypad->num_row_irqs; i++)
- free_irq(keypad->row_irqs[i], keypad);
-
- for (i = 0; i < pdata->num_row_gpios; i++)
- gpio_free(pdata->row_gpios[i]);
- for (i = 0; i < pdata->num_col_gpios; i++)
- gpio_free(pdata->col_gpios[i]);
+ return 0;
}
#ifdef CONFIG_OF
@@ -473,12 +449,13 @@ static int matrix_keypad_probe(struct platform_device *pdev)
return -EINVAL;
}
- keypad = kzalloc(sizeof(struct matrix_keypad), GFP_KERNEL);
- input_dev = input_allocate_device();
- if (!keypad || !input_dev) {
- err = -ENOMEM;
- goto err_free_mem;
- }
+ keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad), GFP_KERNEL);
+ if (!keypad)
+ return -ENOMEM;
+
+ input_dev = devm_input_allocate_device(&pdev->dev);
+ if (!input_dev)
+ return -ENOMEM;
keypad->input_dev = input_dev;
keypad->pdata = pdata;
@@ -489,7 +466,6 @@ static int matrix_keypad_probe(struct platform_device *pdev)
input_dev->name = pdev->name;
input_dev->id.bustype = BUS_HOST;
- input_dev->dev.parent = &pdev->dev;
input_dev->open = matrix_keypad_start;
input_dev->close = matrix_keypad_stop;
@@ -499,7 +475,7 @@ static int matrix_keypad_probe(struct platform_device *pdev)
NULL, input_dev);
if (err) {
dev_err(&pdev->dev, "failed to build keymap\n");
- goto err_free_mem;
+ return -ENOMEM;
}
if (!pdata->no_autorepeat)
@@ -509,32 +485,16 @@ static int matrix_keypad_probe(struct platform_device *pdev)
err = matrix_keypad_init_gpio(pdev, keypad);
if (err)
- goto err_free_mem;
+ return err;
err = input_register_device(keypad->input_dev);
if (err)
- goto err_free_gpio;
+ return err;
device_init_wakeup(&pdev->dev, pdata->wakeup);
platform_set_drvdata(pdev, keypad);
return 0;
-
-err_free_gpio:
- matrix_keypad_free_gpio(keypad);
-err_free_mem:
- input_free_device(input_dev);
- kfree(keypad);
- return err;
-}
-
-static void matrix_keypad_remove(struct platform_device *pdev)
-{
- struct matrix_keypad *keypad = platform_get_drvdata(pdev);
-
- matrix_keypad_free_gpio(keypad);
- input_unregister_device(keypad->input_dev);
- kfree(keypad);
}
#ifdef CONFIG_OF
@@ -547,7 +507,6 @@ MODULE_DEVICE_TABLE(of, matrix_keypad_dt_match);
static struct platform_driver matrix_keypad_driver = {
.probe = matrix_keypad_probe,
- .remove_new = matrix_keypad_remove,
.driver = {
.name = "matrix-keypad",
.pm = pm_sleep_ptr(&matrix_keypad_pm_ops),
--
2.43.0.429.g432eaa2c6b-goog
^ permalink raw reply related
* [PATCH 2/3] Input: matrix_keypad - consolidate handling of clustered interrupt
From: Dmitry Torokhov @ 2024-01-21 5:32 UTC (permalink / raw)
To: linux-input, Dan Carpenter, Bartosz Golaszewski; +Cc: linux-kernel
In-Reply-To: <20240121053232.276968-1-dmitry.torokhov@gmail.com>
Now that the driver stores interrupt numbers corresponding to individual
GPIOs in non-clustered mode, it is possible to unify handling of both
modes by storing clustered interrupt at position 0 and setting the
number of interrupts in this case to 1.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/input/keyboard/matrix_keypad.c | 63 ++++++++------------------
1 file changed, 20 insertions(+), 43 deletions(-)
diff --git a/drivers/input/keyboard/matrix_keypad.c b/drivers/input/keyboard/matrix_keypad.c
index 1cd1ffb80401..44ef600b8f19 100644
--- a/drivers/input/keyboard/matrix_keypad.c
+++ b/drivers/input/keyboard/matrix_keypad.c
@@ -27,9 +27,10 @@ struct matrix_keypad {
const struct matrix_keypad_platform_data *pdata;
struct input_dev *input_dev;
unsigned int row_shift;
- unsigned int row_irqs[MATRIX_MAX_ROWS];
- DECLARE_BITMAP(disabled_gpios, MATRIX_MAX_ROWS);
+ unsigned int row_irqs[MATRIX_MAX_ROWS];
+ unsigned int num_row_irqs;
+ DECLARE_BITMAP(wakeup_enabled_irqs, MATRIX_MAX_ROWS);
uint32_t last_key_state[MATRIX_MAX_COLS];
struct delayed_work work;
@@ -86,28 +87,18 @@ static bool row_asserted(const struct matrix_keypad_platform_data *pdata,
static void enable_row_irqs(struct matrix_keypad *keypad)
{
- const struct matrix_keypad_platform_data *pdata = keypad->pdata;
int i;
- if (pdata->clustered_irq > 0)
- enable_irq(pdata->clustered_irq);
- else {
- for (i = 0; i < pdata->num_row_gpios; i++)
- enable_irq(keypad->row_irqs[i]);
- }
+ for (i = 0; i < keypad->num_row_irqs; i++)
+ enable_irq(keypad->row_irqs[i]);
}
static void disable_row_irqs(struct matrix_keypad *keypad)
{
- const struct matrix_keypad_platform_data *pdata = keypad->pdata;
int i;
- if (pdata->clustered_irq > 0)
- disable_irq_nosync(pdata->clustered_irq);
- else {
- for (i = 0; i < pdata->num_row_gpios; i++)
- disable_irq_nosync(keypad->row_irqs[i]);
- }
+ for (i = 0; i < keypad->num_row_irqs; i++)
+ disable_irq_nosync(keypad->row_irqs[i]);
}
/*
@@ -233,35 +224,20 @@ static void matrix_keypad_stop(struct input_dev *dev)
static void matrix_keypad_enable_wakeup(struct matrix_keypad *keypad)
{
- const struct matrix_keypad_platform_data *pdata = keypad->pdata;
int i;
- if (pdata->clustered_irq > 0) {
- if (enable_irq_wake(pdata->clustered_irq) == 0)
- keypad->gpio_all_disabled = true;
- } else {
-
- for (i = 0; i < pdata->num_row_gpios; i++)
- if (!test_bit(i, keypad->disabled_gpios))
- if (enable_irq_wake(keypad->row_irqs[i]) == 0)
- __set_bit(i, keypad->disabled_gpios);
- }
+ for_each_clear_bit(i, keypad->wakeup_enabled_irqs, keypad->num_row_irqs)
+ if (enable_irq_wake(keypad->row_irqs[i]) == 0)
+ __set_bit(i, keypad->wakeup_enabled_irqs);
}
static void matrix_keypad_disable_wakeup(struct matrix_keypad *keypad)
{
- const struct matrix_keypad_platform_data *pdata = keypad->pdata;
int i;
- if (pdata->clustered_irq > 0) {
- if (keypad->gpio_all_disabled) {
- disable_irq_wake(pdata->clustered_irq);
- keypad->gpio_all_disabled = false;
- }
- } else {
- for (i = 0; i < pdata->num_row_gpios; i++)
- if (test_and_clear_bit(i, keypad->disabled_gpios))
- disable_irq_wake(keypad->row_irqs[i]);
+ for_each_set_bit(i, keypad->wakeup_enabled_irqs, keypad->num_row_irqs) {
+ disable_irq_wake(keypad->row_irqs[i]);
+ __clear_bit(i, keypad->wakeup_enabled_irqs);
}
}
@@ -335,6 +311,9 @@ static int matrix_keypad_init_gpio(struct platform_device *pdev,
"Unable to acquire clustered interrupt\n");
goto err_free_rows;
}
+
+ keypad->row_irqs[0] = pdata->clustered_irq;
+ keypad->num_row_irqs = 1;
} else {
for (i = 0; i < pdata->num_row_gpios; i++) {
irq = gpio_to_irq(pdata->row_gpios[i]);
@@ -360,6 +339,8 @@ static int matrix_keypad_init_gpio(struct platform_device *pdev,
keypad->row_irqs[i] = irq;
}
+
+ keypad->num_row_irqs = pdata->num_row_gpios;
}
/* initialized as disabled - enabled by input->open */
@@ -386,12 +367,8 @@ static void matrix_keypad_free_gpio(struct matrix_keypad *keypad)
const struct matrix_keypad_platform_data *pdata = keypad->pdata;
int i;
- if (pdata->clustered_irq > 0) {
- free_irq(pdata->clustered_irq, keypad);
- } else {
- for (i = 0; i < pdata->num_row_gpios; i++)
- free_irq(keypad->row_irqs[i], keypad);
- }
+ for (i = 0; i < keypad->num_row_irqs; i++)
+ free_irq(keypad->row_irqs[i], keypad);
for (i = 0; i < pdata->num_row_gpios; i++)
gpio_free(pdata->row_gpios[i]);
--
2.43.0.429.g432eaa2c6b-goog
^ permalink raw reply related
* [PATCH 1/3] Input: matrix_keypad - avoid repeatedly converting GPIO to IRQ
From: Dmitry Torokhov @ 2024-01-21 5:32 UTC (permalink / raw)
To: linux-input, Dan Carpenter, Bartosz Golaszewski; +Cc: linux-kernel
gpio_to_irq() is getting more expensive and may require sleeping.
Convert row GPIOs to interrupt numbers once in probe() and use
this information when the driver needs to enable or disable given
interrupt line.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/input/keyboard/matrix_keypad.c | 48 ++++++++++++++------------
1 file changed, 25 insertions(+), 23 deletions(-)
diff --git a/drivers/input/keyboard/matrix_keypad.c b/drivers/input/keyboard/matrix_keypad.c
index 50fa764c82d2..1cd1ffb80401 100644
--- a/drivers/input/keyboard/matrix_keypad.c
+++ b/drivers/input/keyboard/matrix_keypad.c
@@ -27,6 +27,7 @@ struct matrix_keypad {
const struct matrix_keypad_platform_data *pdata;
struct input_dev *input_dev;
unsigned int row_shift;
+ unsigned int row_irqs[MATRIX_MAX_ROWS];
DECLARE_BITMAP(disabled_gpios, MATRIX_MAX_ROWS);
@@ -92,7 +93,7 @@ static void enable_row_irqs(struct matrix_keypad *keypad)
enable_irq(pdata->clustered_irq);
else {
for (i = 0; i < pdata->num_row_gpios; i++)
- enable_irq(gpio_to_irq(pdata->row_gpios[i]));
+ enable_irq(keypad->row_irqs[i]);
}
}
@@ -105,7 +106,7 @@ static void disable_row_irqs(struct matrix_keypad *keypad)
disable_irq_nosync(pdata->clustered_irq);
else {
for (i = 0; i < pdata->num_row_gpios; i++)
- disable_irq_nosync(gpio_to_irq(pdata->row_gpios[i]));
+ disable_irq_nosync(keypad->row_irqs[i]);
}
}
@@ -233,7 +234,6 @@ static void matrix_keypad_stop(struct input_dev *dev)
static void matrix_keypad_enable_wakeup(struct matrix_keypad *keypad)
{
const struct matrix_keypad_platform_data *pdata = keypad->pdata;
- unsigned int gpio;
int i;
if (pdata->clustered_irq > 0) {
@@ -241,21 +241,16 @@ static void matrix_keypad_enable_wakeup(struct matrix_keypad *keypad)
keypad->gpio_all_disabled = true;
} else {
- for (i = 0; i < pdata->num_row_gpios; i++) {
- if (!test_bit(i, keypad->disabled_gpios)) {
- gpio = pdata->row_gpios[i];
-
- if (enable_irq_wake(gpio_to_irq(gpio)) == 0)
+ for (i = 0; i < pdata->num_row_gpios; i++)
+ if (!test_bit(i, keypad->disabled_gpios))
+ if (enable_irq_wake(keypad->row_irqs[i]) == 0)
__set_bit(i, keypad->disabled_gpios);
- }
- }
}
}
static void matrix_keypad_disable_wakeup(struct matrix_keypad *keypad)
{
const struct matrix_keypad_platform_data *pdata = keypad->pdata;
- unsigned int gpio;
int i;
if (pdata->clustered_irq > 0) {
@@ -264,12 +259,9 @@ static void matrix_keypad_disable_wakeup(struct matrix_keypad *keypad)
keypad->gpio_all_disabled = false;
}
} else {
- for (i = 0; i < pdata->num_row_gpios; i++) {
- if (test_and_clear_bit(i, keypad->disabled_gpios)) {
- gpio = pdata->row_gpios[i];
- disable_irq_wake(gpio_to_irq(gpio));
- }
- }
+ for (i = 0; i < pdata->num_row_gpios; i++)
+ if (test_and_clear_bit(i, keypad->disabled_gpios))
+ disable_irq_wake(keypad->row_irqs[i]);
}
}
@@ -306,7 +298,7 @@ static int matrix_keypad_init_gpio(struct platform_device *pdev,
struct matrix_keypad *keypad)
{
const struct matrix_keypad_platform_data *pdata = keypad->pdata;
- int i, err;
+ int i, irq, err;
/* initialized strobe lines as outputs, activated */
for (i = 0; i < pdata->num_col_gpios; i++) {
@@ -345,11 +337,19 @@ static int matrix_keypad_init_gpio(struct platform_device *pdev,
}
} else {
for (i = 0; i < pdata->num_row_gpios; i++) {
- err = request_any_context_irq(
- gpio_to_irq(pdata->row_gpios[i]),
+ irq = gpio_to_irq(pdata->row_gpios[i]);
+ if (irq < 0) {
+ err = irq;
+ dev_err(&pdev->dev,
+ "Unable to convert GPIO line %i to irq: %d\n",
+ pdata->row_gpios[i], err);
+ goto err_free_irqs;
+ }
+
+ err = request_any_context_irq(irq,
matrix_keypad_interrupt,
IRQF_TRIGGER_RISING |
- IRQF_TRIGGER_FALLING,
+ IRQF_TRIGGER_FALLING,
"matrix-keypad", keypad);
if (err < 0) {
dev_err(&pdev->dev,
@@ -357,6 +357,8 @@ static int matrix_keypad_init_gpio(struct platform_device *pdev,
pdata->row_gpios[i]);
goto err_free_irqs;
}
+
+ keypad->row_irqs[i] = irq;
}
}
@@ -366,7 +368,7 @@ static int matrix_keypad_init_gpio(struct platform_device *pdev,
err_free_irqs:
while (--i >= 0)
- free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad);
+ free_irq(keypad->row_irqs[i], keypad);
i = pdata->num_row_gpios;
err_free_rows:
while (--i >= 0)
@@ -388,7 +390,7 @@ static void matrix_keypad_free_gpio(struct matrix_keypad *keypad)
free_irq(pdata->clustered_irq, keypad);
} else {
for (i = 0; i < pdata->num_row_gpios; i++)
- free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad);
+ free_irq(keypad->row_irqs[i], keypad);
}
for (i = 0; i < pdata->num_row_gpios; i++)
--
2.43.0.429.g432eaa2c6b-goog
^ permalink raw reply related
* Re: [PATCH RESEND v2] dt-bindings: input: touchscreen: goodix: clarify irq-gpios misleading text
From: Dmitry Torokhov @ 2024-01-21 5:04 UTC (permalink / raw)
To: Luca Ceresoli
Cc: devicetree, Rob Herring, Jeff LaBundy, Krzysztof Kozlowski,
Conor Dooley, linux-input, linux-kernel, Thomas Petazzoni,
Rob Herring
In-Reply-To: <20240102081934.11293-1-luca.ceresoli@bootlin.com>
On Tue, Jan 02, 2024 at 09:19:34AM +0100, Luca Ceresoli wrote:
> The irq-gpios description misleading, apparently saying that driving the
> IRQ GPIO resets the device, which is even more puzzling as there is a reset
> GPIO as well.
>
> In reality the IRQ pin can be driven during the reset sequence to configure
> the client address, as it becomes clear after checking both the datasheet
> and the driver code. Improve the text to clarify that.
>
> Also rephrase to remove reference to the driver, which is not appropriate
> in the bindings.
>
> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
> Acked-by: Rob Herring <robh@kernel.org>
> Reviewed-by: Jeff LaBundy <jeff@labundy.com>
Applied, thank you.
--
Dmitry
^ permalink raw reply
* [PATCH v2] Input: hid-winwing module
From: Ivan Gorinov @ 2024-01-21 2:27 UTC (permalink / raw)
To: jikos; +Cc: linux-input, linux-kernel
Support for WinWing Orion2 throttle.
On the Orion 2 throttle, buttons 0 .. 63 are reserved for throttle grip;
the throttle base buttons have numbers 64 .. 110.
Linux kernel HID subsystem only supports up to 80 buttons.
This kernel module remaps throttle base buttons to numbers 32 .. 78,
reserving only numbers 0 .. 31 for buttons on the throttle grip.
Changes since v1:
- Fixed formatting of descriptor byte array;
- Using product codes of Winwing grips in config.
Signed-off-by: Ivan Gorinov <linux-kernel@altimeter.info>
---
drivers/hid/Kconfig | 16 +++
drivers/hid/Makefile | 1 +
drivers/hid/hid-winwing.c | 227 ++++++++++++++++++++++++++++++++++++++
3 files changed, 244 insertions(+)
create mode 100644 drivers/hid/hid-winwing.c
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index 4c682c650704..9c8fea72b05d 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -1236,6 +1236,22 @@ config HID_WIIMOTE
To compile this driver as a module, choose M here: the
module will be called hid-wiimote.
+config HID_WINWING
+ tristate "WinWing Orion2 throttle support"
+ depends on USB_HID
+ depends on NEW_LEDS
+ depends on LEDS_CLASS
+ help
+ Support for WinWing Orion2 throttle base with the following grips:
+
+ * TGRIP-16EX
+ * TGRIP-18
+
+ This driver enables all buttons and switches on the throttle base.
+
+ To compile this driver as a module, choose M here: the
+ module will be called hid-winwing.
+
config HID_XINMO
tristate "Xin-Mo non-fully compliant devices"
help
diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
index 082a728eac60..ce71b53ea6c5 100644
--- a/drivers/hid/Makefile
+++ b/drivers/hid/Makefile
@@ -150,6 +150,7 @@ wacom-objs := wacom_wac.o wacom_sys.o
obj-$(CONFIG_HID_WACOM) += wacom.o
obj-$(CONFIG_HID_WALTOP) += hid-waltop.o
obj-$(CONFIG_HID_WIIMOTE) += hid-wiimote.o
+obj-$(CONFIG_HID_WINWING) += hid-winwing.o
obj-$(CONFIG_HID_SENSOR_HUB) += hid-sensor-hub.o
obj-$(CONFIG_HID_SENSOR_CUSTOM_SENSOR) += hid-sensor-custom.o
diff --git a/drivers/hid/hid-winwing.c b/drivers/hid/hid-winwing.c
new file mode 100644
index 000000000000..f2badd78c194
--- /dev/null
+++ b/drivers/hid/hid-winwing.c
@@ -0,0 +1,227 @@
+// SPDX-License-Identifier: GPL-2.0
+
+/*
+ * HID driver for WinWing Orion 2 throttle
+ *
+ * Copyright (c) 2023 Ivan Gorinov
+ */
+
+#include <linux/device.h>
+#include <linux/hid.h>
+#include <linux/hidraw.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
+
+#define MAX_REPORT 16
+
+struct winwing_led {
+ struct led_classdev cdev;
+ struct hid_device *hdev;
+ int number;
+};
+
+struct winwing_led_info {
+ int number;
+ int max_brightness;
+ const char *led_name;
+};
+
+static struct winwing_led_info led_info[3] = {
+ { 0, 255, "backlight" },
+ { 1, 1, "a-a" },
+ { 2, 1, "a-g" },
+};
+
+struct winwing_drv_data {
+ struct hid_device *hdev;
+ __u8 *report_buf;
+ struct mutex lock;
+ unsigned int num_leds;
+ struct winwing_led leds[];
+};
+
+static int winwing_led_write(struct led_classdev *cdev, enum
led_brightness br)
+{
+ struct winwing_led *led = (struct winwing_led *) cdev;
+ struct winwing_drv_data *data = hid_get_drvdata(led->hdev);
+ __u8 *buf = data->report_buf;
+ int ret;
+
+ mutex_lock(&data->lock);
+
+ buf[0] = 0x02;
+ buf[1] = 0x60;
+ buf[2] = 0xbe;
+ buf[3] = 0x00;
+ buf[4] = 0x00;
+ buf[5] = 0x03;
+ buf[6] = 0x49;
+ buf[7] = led->number;
+ buf[8] = br;
+ buf[9] = 0x00;
+ buf[10] = 0;
+ buf[11] = 0;
+ buf[12] = 0;
+ buf[13] = 0;
+
+ ret = hid_hw_output_report(led->hdev, buf, 14);
+
+ mutex_unlock(&data->lock);
+
+ return ret;
+}
+
+static int winwing_init_led(struct hid_device *hdev, struct input_dev
*input)
+{
+ struct winwing_drv_data *data;
+ struct winwing_led *led;
+ int ret;
+ int i;
+
+ size_t data_size = struct_size(data, leds, 3);
+
+ data = devm_kzalloc(&hdev->dev, data_size, GFP_KERNEL);
+
+ if (!data)
+ return -ENOMEM;
+
+ data->report_buf = devm_kmalloc(&hdev->dev, MAX_REPORT, GFP_KERNEL);
+
+ if (!data->report_buf)
+ return -ENOMEM;
+
+ for (i = 0; i < 3; i += 1) {
+ struct winwing_led_info *info = &led_info[i];
+
+ led = &data->leds[i];
+ led->hdev = hdev;
+ led->number = info->number;
+ led->cdev.max_brightness = info->max_brightness;
+ led->cdev.brightness_set_blocking = winwing_led_write;
+ led->cdev.flags = LED_HW_PLUGGABLE;
+ led->cdev.name = devm_kasprintf(&hdev->dev, GFP_KERNEL,
+ "%s::%s",
+ dev_name(&input->dev),
+ info->led_name);
+
+ ret = devm_led_classdev_register(&hdev->dev, &led->cdev);
+ if (ret)
+ return ret;
+ }
+
+ hid_set_drvdata(hdev, data);
+
+ return ret;
+}
+
+static int winwing_probe(struct hid_device *hdev,
+ const struct hid_device_id *id)
+{
+ unsigned int minor;
+ int ret;
+
+ ret = hid_parse(hdev);
+ if (ret) {
+ hid_err(hdev, "parse failed\n");
+ return ret;
+ }
+
+ ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
+ if (ret) {
+ hid_err(hdev, "hw start failed\n");
+ return ret;
+ }
+
+ minor = ((struct hidraw *) hdev->hidraw)->minor;
+
+ return 0;
+}
+
+static int winwing_input_configured(struct hid_device *hdev,
+ struct hid_input *hidinput)
+{
+ int ret;
+
+ ret = winwing_init_led(hdev, hidinput->input);
+
+ if (ret)
+ hid_err(hdev, "led init failed\n");
+
+ return ret;
+}
+
+static __u8 original_rdesc_buttons[] = {
+ 0x05, 0x09, 0x19, 0x01, 0x29, 0x6F,
+ 0x15, 0x00, 0x25, 0x01, 0x35, 0x00,
+ 0x45, 0x01, 0x75, 0x01, 0x95, 0x6F,
+ 0x81, 0x02, 0x75, 0x01, 0x95, 0x01,
+ 0x81, 0x01
+};
+
+/*
+ * HID report descriptor shows 111 buttons, which exceeds maximum
+ * number of buttons (80) supported by Linux kernel HID subsystem.
+ *
+ * This module skips numbers 32-63, unused on some throttle grips.
+ */
+
+static __u8 *winwing_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+ unsigned int *rsize)
+{
+ int sig_length = sizeof(original_rdesc_buttons);
+ int unused_button_numbers = 32;
+
+ if (*rsize < 34)
+ return rdesc;
+
+ if (memcmp(rdesc + 8, original_rdesc_buttons, sig_length) == 0) {
+
+ /* Usage Maximum */
+ rdesc[13] -= unused_button_numbers;
+
+ /* Report Count for buttons */
+ rdesc[25] -= unused_button_numbers;
+
+ /* Report Count for padding [HID1_11, 6.2.2.9] */
+ rdesc[31] += unused_button_numbers;
+
+ hid_info(hdev, "winwing descriptor fixed\n");
+ }
+
+ return rdesc;
+}
+
+static int winwing_raw_event(struct hid_device *hdev,
+ struct hid_report *report, u8 *raw_data, int size)
+{
+ if (size >= 15) {
+ /* Skip buttons 32 .. 63 */
+ memmove(raw_data + 5, raw_data + 9, 6);
+
+ /* Clear the padding */
+ memset(raw_data + 11, 0, 4);
+ }
+
+ return 0;
+}
+
+static const struct hid_device_id winwing_devices[] = {
+ { HID_USB_DEVICE(0x4098, 0xbe62) }, /* TGRIP-18 */
+ { HID_USB_DEVICE(0x4098, 0xbe68) }, /* TGRIP-16EX */
+ {}
+};
+
+MODULE_DEVICE_TABLE(hid, winwing_devices);
+
+static struct hid_driver winwing_driver = {
+ .name = "winwing",
+ .id_table = winwing_devices,
+ .probe = winwing_probe,
+ .input_configured = winwing_input_configured,
+ .report_fixup = winwing_report_fixup,
+ .raw_event = winwing_raw_event,
+};
+module_hid_driver(winwing_driver);
+
+MODULE_LICENSE("GPL");
--
2.25.1
^ permalink raw reply related
* [PATCH v2 1/3] input: touchscreen: imagis: use FIELD_GET where applicable
From: Duje Mihanović @ 2024-01-20 21:16 UTC (permalink / raw)
To: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
Cc: Karel Balej, ~postmarketos/upstreaming, phone-devel, devicetree,
linux-input, linux-kernel, Duje Mihanović
In-Reply-To: <20240120-b4-imagis-keys-v2-0-d7fc16f2e106@skole.hr>
Instead of manually extracting certain bits from registers with binary
ANDs and shifts, the FIELD_GET macro can be used. With this in mind, the
*_SHIFT macros can be dropped.
Signed-off-by: Duje Mihanović <duje.mihanovic@skole.hr>
---
drivers/input/touchscreen/imagis.c | 17 ++++++-----------
1 file changed, 6 insertions(+), 11 deletions(-)
diff --git a/drivers/input/touchscreen/imagis.c b/drivers/input/touchscreen/imagis.c
index e1fafa561ee3..4eae98771bd2 100644
--- a/drivers/input/touchscreen/imagis.c
+++ b/drivers/input/touchscreen/imagis.c
@@ -1,5 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
+#include <linux/bitfield.h>
#include <linux/bits.h>
#include <linux/delay.h>
#include <linux/i2c.h>
@@ -29,12 +30,9 @@
#define IST3038C_I2C_RETRY_COUNT 3
#define IST3038C_MAX_FINGER_NUM 10
#define IST3038C_X_MASK GENMASK(23, 12)
-#define IST3038C_X_SHIFT 12
#define IST3038C_Y_MASK GENMASK(11, 0)
#define IST3038C_AREA_MASK GENMASK(27, 24)
-#define IST3038C_AREA_SHIFT 24
#define IST3038C_FINGER_COUNT_MASK GENMASK(15, 12)
-#define IST3038C_FINGER_COUNT_SHIFT 12
#define IST3038C_FINGER_STATUS_MASK GENMASK(9, 0)
struct imagis_properties {
@@ -106,8 +104,7 @@ static irqreturn_t imagis_interrupt(int irq, void *dev_id)
goto out;
}
- finger_count = (intr_message & IST3038C_FINGER_COUNT_MASK) >>
- IST3038C_FINGER_COUNT_SHIFT;
+ finger_count = FIELD_GET(IST3038C_FINGER_COUNT_MASK, intr_message);
if (finger_count > IST3038C_MAX_FINGER_NUM) {
dev_err(&ts->client->dev,
"finger count %d is more than maximum supported\n",
@@ -115,7 +112,7 @@ static irqreturn_t imagis_interrupt(int irq, void *dev_id)
goto out;
}
- finger_pressed = intr_message & IST3038C_FINGER_STATUS_MASK;
+ finger_pressed = FIELD_GET(IST3038C_FINGER_STATUS_MASK, intr_message);
for (i = 0; i < finger_count; i++) {
if (ts->tdata->protocol_b)
@@ -136,12 +133,10 @@ static irqreturn_t imagis_interrupt(int irq, void *dev_id)
input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER,
finger_pressed & BIT(i));
touchscreen_report_pos(ts->input_dev, &ts->prop,
- (finger_status & IST3038C_X_MASK) >>
- IST3038C_X_SHIFT,
- finger_status & IST3038C_Y_MASK, 1);
+ FIELD_GET(IST3038C_X_MASK, finger_status),
+ FIELD_GET(IST3038C_Y_MASK, finger_status), 1);
input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR,
- (finger_status & IST3038C_AREA_MASK) >>
- IST3038C_AREA_SHIFT);
+ FIELD_GET(IST3038C_AREA_MASK, finger_status));
}
input_mt_sync_frame(ts->input_dev);
--
2.43.0
^ permalink raw reply related
* [PATCH v2 3/3] input: touchscreen: imagis: Add touch key support
From: Duje Mihanović @ 2024-01-20 21:16 UTC (permalink / raw)
To: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
Cc: Karel Balej, ~postmarketos/upstreaming, phone-devel, devicetree,
linux-input, linux-kernel, Duje Mihanović
In-Reply-To: <20240120-b4-imagis-keys-v2-0-d7fc16f2e106@skole.hr>
IST3032C (and possibly some other models) has touch keys. Add support
for them to the imagis driver.
Signed-off-by: Duje Mihanović <duje.mihanovic@skole.hr>
---
drivers/input/touchscreen/imagis.c | 25 ++++++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/drivers/input/touchscreen/imagis.c b/drivers/input/touchscreen/imagis.c
index 4eae98771bd2..6dcb82313c32 100644
--- a/drivers/input/touchscreen/imagis.c
+++ b/drivers/input/touchscreen/imagis.c
@@ -34,6 +34,7 @@
#define IST3038C_AREA_MASK GENMASK(27, 24)
#define IST3038C_FINGER_COUNT_MASK GENMASK(15, 12)
#define IST3038C_FINGER_STATUS_MASK GENMASK(9, 0)
+#define IST3032C_KEY_STATUS_MASK GENMASK(20, 16)
struct imagis_properties {
unsigned int interrupt_msg_cmd;
@@ -41,6 +42,7 @@ struct imagis_properties {
unsigned int whoami_cmd;
unsigned int whoami_val;
bool protocol_b;
+ bool touch_keys_supported;
};
struct imagis_ts {
@@ -49,6 +51,8 @@ struct imagis_ts {
struct input_dev *input_dev;
struct touchscreen_properties prop;
struct regulator_bulk_data supplies[2];
+ u32 keycodes[2];
+ int num_keycodes;
};
static int imagis_i2c_read_reg(struct imagis_ts *ts,
@@ -93,7 +97,7 @@ static irqreturn_t imagis_interrupt(int irq, void *dev_id)
{
struct imagis_ts *ts = dev_id;
u32 intr_message, finger_status;
- unsigned int finger_count, finger_pressed;
+ unsigned int finger_count, finger_pressed, key_pressed;
int i;
int error;
@@ -139,6 +143,11 @@ static irqreturn_t imagis_interrupt(int irq, void *dev_id)
FIELD_GET(IST3038C_AREA_MASK, finger_status));
}
+ key_pressed = FIELD_GET(IST3032C_KEY_STATUS_MASK, intr_message);
+
+ for (int i = 0; i < ts->num_keycodes; i++)
+ input_report_key(ts->input_dev, ts->keycodes[i], (key_pressed & BIT(i)));
+
input_mt_sync_frame(ts->input_dev);
input_sync(ts->input_dev);
@@ -224,6 +233,19 @@ static int imagis_init_input_dev(struct imagis_ts *ts)
input_set_capability(input_dev, EV_ABS, ABS_MT_POSITION_X);
input_set_capability(input_dev, EV_ABS, ABS_MT_POSITION_Y);
input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 16, 0, 0);
+ if (ts->tdata->touch_keys_supported) {
+ ts->num_keycodes = of_property_read_variable_u32_array(
+ ts->client->dev.of_node, "linux,keycodes",
+ ts->keycodes, 0, ARRAY_SIZE(ts->keycodes));
+ if (ts->num_keycodes <= 0) {
+ ts->keycodes[0] = KEY_APPSELECT;
+ ts->keycodes[1] = KEY_BACK;
+ ts->num_keycodes = 2;
+ }
+ }
+
+ for (int i = 0; i < ts->num_keycodes; i++)
+ input_set_capability(input_dev, EV_KEY, ts->keycodes[i]);
touchscreen_parse_properties(input_dev, true, &ts->prop);
if (!ts->prop.max_x || !ts->prop.max_y) {
@@ -365,6 +387,7 @@ static const struct imagis_properties imagis_3032c_data = {
.touch_coord_cmd = IST3038C_REG_TOUCH_COORD,
.whoami_cmd = IST3038C_REG_CHIPID,
.whoami_val = IST3032C_WHOAMI,
+ .touch_keys_supported = true,
};
static const struct imagis_properties imagis_3038b_data = {
--
2.43.0
^ permalink raw reply related
* [PATCH v2 0/3] Imagis touch keys and FIELD_GET cleanup
From: Duje Mihanović @ 2024-01-20 21:16 UTC (permalink / raw)
To: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
Cc: Karel Balej, ~postmarketos/upstreaming, phone-devel, devicetree,
linux-input, linux-kernel, Duje Mihanović
Tiny series to clean up the field extraction and add touch key support.
Depends on the IST3032C series (at least the touch key patches, the
other one could be split up):
https://lore.kernel.org/20240120191940.3631-1-karelb@gimli.ms.mff.cuni.cz
Signed-off-by: Duje Mihanović <duje.mihanovic@skole.hr>
---
Changes in v2:
- Fix compile error
- Add FIELD_GET patch
- Allow specifying custom keycodes
- Link to v1: https://lore.kernel.org/20231112194124.24916-1-duje.mihanovic@skole.hr
---
Duje Mihanović (3):
input: touchscreen: imagis: use FIELD_GET where applicable
dt-bindings: input: imagis: Document touch keys
input: touchscreen: imagis: Add touch key support
.../input/touchscreen/imagis,ist3038c.yaml | 11 ++++++
drivers/input/touchscreen/imagis.c | 42 +++++++++++++++-------
2 files changed, 41 insertions(+), 12 deletions(-)
---
base-commit: 553f2a83ae97246be401ca9b313063f5fa879f12
change-id: 20240120-b4-imagis-keys-a0a9f2b31740
Best regards,
--
Duje Mihanović <duje.mihanovic@skole.hr>
^ permalink raw reply
* [PATCH v2 2/3] dt-bindings: input: imagis: Document touch keys
From: Duje Mihanović @ 2024-01-20 21:16 UTC (permalink / raw)
To: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
Cc: Karel Balej, ~postmarketos/upstreaming, phone-devel, devicetree,
linux-input, linux-kernel, Duje Mihanović
In-Reply-To: <20240120-b4-imagis-keys-v2-0-d7fc16f2e106@skole.hr>
IST3032C (and possibly some other models) has touch keys. Document this.
Signed-off-by: Duje Mihanović <duje.mihanovic@skole.hr>
---
.../bindings/input/touchscreen/imagis,ist3038c.yaml | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml b/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
index 2af71cbcc97d..960e5436642f 100644
--- a/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
+++ b/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
@@ -42,6 +42,17 @@ properties:
touchscreen-inverted-y: true
touchscreen-swapped-x-y: true
+if:
+ properties:
+ compatible:
+ contains:
+ const: imagis,ist3032c
+then:
+ properties:
+ linux,keycodes:
+ description: Keycodes for the touch keys
+ maxItems: 2
+
additionalProperties: false
required:
--
2.43.0
^ permalink raw reply related
* Re: [bug report] gpiolib: use a mutex to protect the list of GPIO devices
From: Dmitry Torokhov @ 2024-01-20 21:06 UTC (permalink / raw)
To: Dan Carpenter; +Cc: bartosz.golaszewski, linux-wireless, linux-input
In-Reply-To: <f7b5ff1e-8f34-4d98-a7be-b826cb897dc8@moroto.mountain>
On Mon, Jan 15, 2024 at 11:50:52AM +0300, Dan Carpenter wrote:
> Hello Bartosz Golaszewski,
>
> The patch 65a828bab158: "gpiolib: use a mutex to protect the list of
> GPIO devices" from Dec 15, 2023 (linux-next), leads to the following
> Smatch static checker warning:
>
> drivers/net/wireless/ath/ath9k/hw.c:2836 ath9k_hw_gpio_get()
> warn: sleeping in atomic context
>
> drivers/net/wireless/ath/ath9k/hw.c
> 2826 val = MS_REG_READ(AR9285, gpio);
> 2827 else if (AR_SREV_9280(ah))
> 2828 val = MS_REG_READ(AR928X, gpio);
> 2829 else if (AR_DEVID_7010(ah))
> 2830 val = REG_READ(ah, AR7010_GPIO_IN) & BIT(gpio);
> 2831 else if (AR_SREV_9300_20_OR_LATER(ah))
> 2832 val = REG_READ(ah, AR_GPIO_IN(ah)) & BIT(gpio);
> 2833 else
> 2834 val = MS_REG_READ(AR, gpio);
> 2835 } else if (BIT(gpio) & ah->caps.gpio_requested) {
> --> 2836 val = gpio_get_value(gpio) & BIT(gpio);
> ^^^^^^^^^^^^^^
>
> 2837 } else {
> 2838 WARN_ON(1);
> 2839 }
> 2840
> 2841 return !!val;
> 2842 }
>
> Before gpio_get_value() took a spinlock but now it takes a mutex
> (actually a rw semaphor now). The call tree where we are in atomic
> context is:
>
> ath_btcoex_period_timer() <- disables preempt
> -> ath_detect_bt_priority()
> -> ath9k_hw_gpio_get()
>
> Another warning this change causes is:
>
> drivers/input/keyboard/matrix_keypad.c:95 enable_row_irqs() warn: sleeping in atomic context
> matrix_keypad_scan() <- disables preempt
> -> enable_row_irqs()
>
> drivers/input/keyboard/matrix_keypad.c:108 disable_row_irqs() warn: sleeping in atomic context
> matrix_keypad_interrupt() <- disables preempt
> -> disable_row_irqs()
Now that that operation becomes heavier we should convert row GPIOs into
interrupt numbers in probe() and then this issue will go away.
Thanks.
--
Dmitry
^ permalink raw reply
* Re: PS/2 keyboard of laptop Dell XPS 13 9360 goes missing after S3
From: Hans de Goede @ 2024-01-20 20:26 UTC (permalink / raw)
To: Paul Menzel, LKML; +Cc: linux-input, linux-pm, Dell.Client.Kernel, regressions
In-Reply-To: <0aa4a61f-c939-46fe-a572-08022e8931c7@molgen.mpg.de>
Hi Paul,
On 1/18/24 13:57, Paul Menzel wrote:
> #regzbot introduced v6.6.11..v6.7
>
> Dear Linux folks,
>
>
> There seems to be a regression in Linux 6.7 on the Dell XPS 13 9360 (Intel i7-7500U).
>
> [ 0.000000] DMI: Dell Inc. XPS 13 9360/0596KF, BIOS 2.21.0 06/02/2022
>
> The PS/2 keyboard goes missing after S3 resume¹. The problem does not happen with Linux 6.6.11.
Thank you for reporting this.
Can you try adding "i8042.dumbkbd=1" to your kernel commandline?
This should at least lead to the device not disappearing from
"sudo libinput list-devices"
The next question is if the keyboard will still actually
work after suspend/resume with "i8042.dumbkbd=1". If it
stays in the list, but no longer works then there is
a problem with the i8042 controller; or interrupt
delivery to the i8042 controller.
If "i8042.dumbkbd=1" somehow fully fixes things, then I guess
my atkbd driver fix for other laptop keyboards is somehow
causing issues for yours.
If "i8042.dumbkbd=1" fully fixes things, can you try building
your own 6.7.0 kernel with commit 936e4d49ecbc:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=936e4d49ecbc8c404790504386e1422b599dec39
reverted?
Regards,
Hans
>
> [ 1.435071] i8042: PNP: PS/2 Controller [PNP0303:PS2K,PNP0f13:PS2M] at 0x60,0x64 irq 1,12
> [ 1.435409] i8042: Warning: Keylock active
> [ 1.437624] serio: i8042 KBD port at 0x60,0x64 irq 1
> [ 1.437631] serio: i8042 AUX port at 0x60,0x64 irq 12
> […]
> [ 1.439743] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input0
>
> $ sudo libinput list-devices
> […]
> Device: AT Translated Set 2 keyboard
> Kernel: /dev/input/event0
> Group: 15
> Seat: seat0, default
> Capabilities: keyboard
> Tap-to-click: n/a
> Tap-and-drag: n/a
> Tap drag lock: n/a
> Left-handed: n/a
> Nat.scrolling: n/a
> Middle emulation: n/a
> Calibration: n/a
> Scroll methods: none
> Click methods: none
> Disable-w-typing: n/a
> Disable-w-trackpointing: n/a
> Accel profiles: n/a
> Rotation: 0.0
>
> `libinput list-devices` does not list the device after resuming from S3. Some of the function keys, like brightness and airplane mode keys, still work, as the events are probably transmitted over the embedded controller or some other mechanism. An external USB keyboard also still works.
>
> I haven’t had time to further analyze this, but wanted to report it. No idea
>
>
> Kind regards,
>
> Paul
>
>
> ¹ s2idle is not working correctly on the device, in the sense, that energy usage is very high in that state, and the full battery is at 20 % after leaving it for eight hours.
^ permalink raw reply
* [PATCH v4 5/5] input/touchscreen: imagis: add support for IST3032C
From: Karel Balej @ 2024-01-20 19:11 UTC (permalink / raw)
To: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Henrik Rydberg, linux-input, devicetree,
linux-kernel
Cc: Duje Mihanović, ~postmarketos/upstreaming, phone-devel
In-Reply-To: <20240120191940.3631-1-karelb@gimli.ms.mff.cuni.cz>
From: Karel Balej <balejk@matfyz.cz>
IST3032C is a touchscreen chip used for instance in the
samsung,coreprimevelte smartphone, with which this was tested. Add the
chip specific information to the driver.
Reviewed-by: Markuss Broks <markuss.broks@gmail.com>
Signed-off-by: Karel Balej <balejk@matfyz.cz>
---
Notes:
v4:
* Change the WHOAMI definition position to preserve alphanumerical order
of the definitions.
* Add Markuss' Reviewed-by trailer.
drivers/input/touchscreen/imagis.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/input/touchscreen/imagis.c b/drivers/input/touchscreen/imagis.c
index 9af8a6332ae6..e1fafa561ee3 100644
--- a/drivers/input/touchscreen/imagis.c
+++ b/drivers/input/touchscreen/imagis.c
@@ -11,6 +11,8 @@
#include <linux/property.h>
#include <linux/regulator/consumer.h>
+#define IST3032C_WHOAMI 0x32c
+
#define IST3038B_REG_STATUS 0x20
#define IST3038B_REG_CHIPID 0x30
#define IST3038B_WHOAMI 0x30380b
@@ -363,6 +365,13 @@ static int imagis_resume(struct device *dev)
static DEFINE_SIMPLE_DEV_PM_OPS(imagis_pm_ops, imagis_suspend, imagis_resume);
+static const struct imagis_properties imagis_3032c_data = {
+ .interrupt_msg_cmd = IST3038C_REG_INTR_MESSAGE,
+ .touch_coord_cmd = IST3038C_REG_TOUCH_COORD,
+ .whoami_cmd = IST3038C_REG_CHIPID,
+ .whoami_val = IST3032C_WHOAMI,
+};
+
static const struct imagis_properties imagis_3038b_data = {
.interrupt_msg_cmd = IST3038B_REG_STATUS,
.touch_coord_cmd = IST3038B_REG_STATUS,
@@ -380,6 +389,7 @@ static const struct imagis_properties imagis_3038c_data = {
#ifdef CONFIG_OF
static const struct of_device_id imagis_of_match[] = {
+ { .compatible = "imagis,ist3032c", .data = &imagis_3032c_data },
{ .compatible = "imagis,ist3038b", .data = &imagis_3038b_data },
{ .compatible = "imagis,ist3038c", .data = &imagis_3038c_data },
{ },
--
2.43.0
^ permalink raw reply related
* [PATCH v4 4/5] dt-bindings: input/touchscreen: imagis: add compatible for IST3032C
From: Karel Balej @ 2024-01-20 19:11 UTC (permalink / raw)
To: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Henrik Rydberg, linux-input, devicetree,
linux-kernel
Cc: Duje Mihanović, ~postmarketos/upstreaming, phone-devel
In-Reply-To: <20240120191940.3631-1-karelb@gimli.ms.mff.cuni.cz>
From: Karel Balej <balejk@matfyz.cz>
IST3032C is a touchscreen IC which seems mostly compatible with IST3038C
except that it reports a different chip ID value.
Signed-off-by: Karel Balej <balejk@matfyz.cz>
---
Notes:
v4:
* Reword commit description to mention how this IC differs from the
already supported.
.../devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml b/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
index b5372c4eae56..2af71cbcc97d 100644
--- a/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
+++ b/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
@@ -18,6 +18,7 @@ properties:
compatible:
enum:
+ - imagis,ist3032c
- imagis,ist3038b
- imagis,ist3038c
--
2.43.0
^ permalink raw reply related
* [PATCH v4 3/5] input/touchscreen: imagis: Add support for Imagis IST3038B
From: Karel Balej @ 2024-01-20 19:11 UTC (permalink / raw)
To: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Henrik Rydberg, linux-input, devicetree,
linux-kernel
Cc: Duje Mihanović, ~postmarketos/upstreaming, phone-devel
In-Reply-To: <20240120191940.3631-1-karelb@gimli.ms.mff.cuni.cz>
From: Markuss Broks <markuss.broks@gmail.com>
Imagis IST3038B is another variant of Imagis IST3038 IC, which has
a different register interface from IST3038C (possibly firmware defined).
This should also work for IST3044B (though untested), however other
variants using this interface/protocol(IST3026, IST3032, IST3026B,
IST3032B) have a different format for coordinates, and they'd need
additional effort to be supported by this driver.
Signed-off-by: Markuss Broks <markuss.broks@gmail.com>
Signed-off-by: Karel Balej <balejk@matfyz.cz>
---
Notes:
v4:
* Sort the definitions in alphanumerical order.
drivers/input/touchscreen/imagis.c | 58 ++++++++++++++++++++++++------
1 file changed, 47 insertions(+), 11 deletions(-)
diff --git a/drivers/input/touchscreen/imagis.c b/drivers/input/touchscreen/imagis.c
index e67fd3011027..9af8a6332ae6 100644
--- a/drivers/input/touchscreen/imagis.c
+++ b/drivers/input/touchscreen/imagis.c
@@ -11,9 +11,13 @@
#include <linux/property.h>
#include <linux/regulator/consumer.h>
+#define IST3038B_REG_STATUS 0x20
+#define IST3038B_REG_CHIPID 0x30
+#define IST3038B_WHOAMI 0x30380b
+
#define IST3038C_HIB_ACCESS (0x800B << 16)
#define IST3038C_DIRECT_ACCESS BIT(31)
-#define IST3038C_REG_CHIPID 0x40001000
+#define IST3038C_REG_CHIPID (0x40001000 | IST3038C_DIRECT_ACCESS)
#define IST3038C_REG_HIB_BASE 0x30000100
#define IST3038C_REG_TOUCH_STATUS (IST3038C_REG_HIB_BASE | IST3038C_HIB_ACCESS)
#define IST3038C_REG_TOUCH_COORD (IST3038C_REG_HIB_BASE | IST3038C_HIB_ACCESS | 0x8)
@@ -31,8 +35,17 @@
#define IST3038C_FINGER_COUNT_SHIFT 12
#define IST3038C_FINGER_STATUS_MASK GENMASK(9, 0)
+struct imagis_properties {
+ unsigned int interrupt_msg_cmd;
+ unsigned int touch_coord_cmd;
+ unsigned int whoami_cmd;
+ unsigned int whoami_val;
+ bool protocol_b;
+};
+
struct imagis_ts {
struct i2c_client *client;
+ const struct imagis_properties *tdata;
struct input_dev *input_dev;
struct touchscreen_properties prop;
struct regulator_bulk_data supplies[2];
@@ -84,8 +97,7 @@ static irqreturn_t imagis_interrupt(int irq, void *dev_id)
int i;
int error;
- error = imagis_i2c_read_reg(ts, IST3038C_REG_INTR_MESSAGE,
- &intr_message);
+ error = imagis_i2c_read_reg(ts, ts->tdata->interrupt_msg_cmd, &intr_message);
if (error) {
dev_err(&ts->client->dev,
"failed to read the interrupt message: %d\n", error);
@@ -104,9 +116,13 @@ static irqreturn_t imagis_interrupt(int irq, void *dev_id)
finger_pressed = intr_message & IST3038C_FINGER_STATUS_MASK;
for (i = 0; i < finger_count; i++) {
- error = imagis_i2c_read_reg(ts,
- IST3038C_REG_TOUCH_COORD + (i * 4),
- &finger_status);
+ if (ts->tdata->protocol_b)
+ error = imagis_i2c_read_reg(ts,
+ ts->tdata->touch_coord_cmd, &finger_status);
+ else
+ error = imagis_i2c_read_reg(ts,
+ ts->tdata->touch_coord_cmd + (i * 4),
+ &finger_status);
if (error) {
dev_err(&ts->client->dev,
"failed to read coordinates for finger %d: %d\n",
@@ -261,6 +277,12 @@ static int imagis_probe(struct i2c_client *i2c)
ts->client = i2c;
+ ts->tdata = device_get_match_data(dev);
+ if (!ts->tdata) {
+ dev_err(dev, "missing chip data\n");
+ return -EINVAL;
+ }
+
error = imagis_init_regulators(ts);
if (error) {
dev_err(dev, "regulator init error: %d\n", error);
@@ -279,15 +301,13 @@ static int imagis_probe(struct i2c_client *i2c)
return error;
}
- error = imagis_i2c_read_reg(ts,
- IST3038C_REG_CHIPID | IST3038C_DIRECT_ACCESS,
- &chip_id);
+ error = imagis_i2c_read_reg(ts, ts->tdata->whoami_cmd, &chip_id);
if (error) {
dev_err(dev, "chip ID read failure: %d\n", error);
return error;
}
- if (chip_id != IST3038C_WHOAMI) {
+ if (chip_id != ts->tdata->whoami_val) {
dev_err(dev, "unknown chip ID: 0x%x\n", chip_id);
return -EINVAL;
}
@@ -343,9 +363,25 @@ static int imagis_resume(struct device *dev)
static DEFINE_SIMPLE_DEV_PM_OPS(imagis_pm_ops, imagis_suspend, imagis_resume);
+static const struct imagis_properties imagis_3038b_data = {
+ .interrupt_msg_cmd = IST3038B_REG_STATUS,
+ .touch_coord_cmd = IST3038B_REG_STATUS,
+ .whoami_cmd = IST3038B_REG_CHIPID,
+ .whoami_val = IST3038B_WHOAMI,
+ .protocol_b = true,
+};
+
+static const struct imagis_properties imagis_3038c_data = {
+ .interrupt_msg_cmd = IST3038C_REG_INTR_MESSAGE,
+ .touch_coord_cmd = IST3038C_REG_TOUCH_COORD,
+ .whoami_cmd = IST3038C_REG_CHIPID,
+ .whoami_val = IST3038C_WHOAMI,
+};
+
#ifdef CONFIG_OF
static const struct of_device_id imagis_of_match[] = {
- { .compatible = "imagis,ist3038c", },
+ { .compatible = "imagis,ist3038b", .data = &imagis_3038b_data },
+ { .compatible = "imagis,ist3038c", .data = &imagis_3038c_data },
{ },
};
MODULE_DEVICE_TABLE(of, imagis_of_match);
--
2.43.0
^ permalink raw reply related
* [PATCH v4 2/5] dt-bindings: input/touchscreen: Add compatible for IST3038B
From: Karel Balej @ 2024-01-20 19:11 UTC (permalink / raw)
To: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Henrik Rydberg, linux-input, devicetree,
linux-kernel
Cc: Duje Mihanović, ~postmarketos/upstreaming, phone-devel
In-Reply-To: <20240120191940.3631-1-karelb@gimli.ms.mff.cuni.cz>
From: Markuss Broks <markuss.broks@gmail.com>
Imagis IST3038B is a variant (firmware?) of Imagis IST3038 IC
differing from IST3038C in its register interface. Add the
compatible for it to the IST3038C bindings.
Signed-off-by: Markuss Broks <markuss.broks@gmail.com>
Acked-by: Conor Dooley <conor.dooley@microchip.com>
[balejk@matfyz.cz: elaborate chip differences in the commit message]
Signed-off-by: Karel Balej <balejk@matfyz.cz>
---
Notes:
v4:
* Mention how the chip is different in terms of the programming model in
the commit message.
* Add Conor's trailer.
.../devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml b/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
index 0d6b033fd5fb..b5372c4eae56 100644
--- a/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
+++ b/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
@@ -18,6 +18,7 @@ properties:
compatible:
enum:
+ - imagis,ist3038b
- imagis,ist3038c
reg:
--
2.43.0
^ permalink raw reply related
* [PATCH v4 1/5] input/touchscreen: imagis: Correct the maximum touch area value
From: Karel Balej @ 2024-01-20 19:11 UTC (permalink / raw)
To: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Henrik Rydberg, linux-input, devicetree,
linux-kernel
Cc: Duje Mihanović, ~postmarketos/upstreaming, phone-devel
In-Reply-To: <20240120191940.3631-1-karelb@gimli.ms.mff.cuni.cz>
From: Markuss Broks <markuss.broks@gmail.com>
As specified in downstream IST3038B driver and proved by testing,
the correct maximum reported value of touch area is 16.
Signed-off-by: Markuss Broks <markuss.broks@gmail.com>
Signed-off-by: Karel Balej <balejk@matfyz.cz>
---
drivers/input/touchscreen/imagis.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/input/touchscreen/imagis.c b/drivers/input/touchscreen/imagis.c
index 07111ca24455..e67fd3011027 100644
--- a/drivers/input/touchscreen/imagis.c
+++ b/drivers/input/touchscreen/imagis.c
@@ -210,7 +210,7 @@ static int imagis_init_input_dev(struct imagis_ts *ts)
input_set_capability(input_dev, EV_ABS, ABS_MT_POSITION_X);
input_set_capability(input_dev, EV_ABS, ABS_MT_POSITION_Y);
- input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
+ input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 16, 0, 0);
touchscreen_parse_properties(input_dev, true, &ts->prop);
if (!ts->prop.max_x || !ts->prop.max_y) {
--
2.43.0
^ permalink raw reply related
* [PATCH v4 0/5] input/touchscreen: imagis: add support for IST3032C
From: Karel Balej @ 2024-01-20 19:11 UTC (permalink / raw)
To: Markuss Broks, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Henrik Rydberg, linux-input, devicetree,
linux-kernel
Cc: Duje Mihanović, ~postmarketos/upstreaming, phone-devel
From: Karel Balej <balejk@matfyz.cz>
Hello,
this patch series generalizes the Imagis touchscreen driver to support
other Imagis chips, namely IST3038B and IST3032C, which use a slightly
different protocol.
It also adds necessary information to the driver so that the IST3032C
touchscreen can be used with it. The motivation for this is the
samsung,coreprimevelte smartphone with which this series has been
tested. However, the support for this device is not yet in-tree, the
effort is happening at [1]. Preliminary version of the regulator driver
needed to use the touchscreen on this phone can be found here [2].
Note that this is a prerequisite for this patch [3] which implements
support for touch keys for Imagis touchscreens that have it.
[1] https://lore.kernel.org/all/20240110-pxa1908-lkml-v8-0-fea768a59474@skole.hr/
[2] https://lore.kernel.org/all/20231228100208.2932-1-karelb@gimli.ms.mff.cuni.cz/
[3] https://lore.kernel.org/all/20231112194124.24916-1-duje.mihanovic@skole.hr/
---
v4:
- Rebase to v6.7.
- v3: https://lore.kernel.org/all/20231202125948.10345-1-karelb@gimli.ms.mff.cuni.cz/
- Address feedback and add trailers.
v3:
- Rebase to v6.7-rc3.
- v2: https://lore.kernel.org/all/20231003133440.4696-1-karelb@gimli.ms.mff.cuni.cz/
v2:
- Do not rename the driver.
- Do not hardcode voltage required by the IST3032C.
- Use Markuss' series which generalizes the driver. Link to the original
series: https://lore.kernel.org/all/20220504152406.8730-1-markuss.broks@gmail.com/
- Separate bindings into separate patch.
- v1: https://lore.kernel.org/all/20230926173531.18715-1-balejk@matfyz.cz/
Karel Balej (2):
dt-bindings: input/touchscreen: imagis: add compatible for IST3032C
input/touchscreen: imagis: add support for IST3032C
Markuss Broks (3):
input/touchscreen: imagis: Correct the maximum touch area value
dt-bindings: input/touchscreen: Add compatible for IST3038B
input/touchscreen: imagis: Add support for Imagis IST3038B
.../input/touchscreen/imagis,ist3038c.yaml | 2 +
drivers/input/touchscreen/imagis.c | 70 +++++++++++++++----
2 files changed, 60 insertions(+), 12 deletions(-)
--
2.43.0
^ permalink raw reply
* [dtor-input:for-linus] BUILD SUCCESS 180a8f12c21f41740fee09ca7f7aa98ff5bb99f8
From: kernel test robot @ 2024-01-20 11:48 UTC (permalink / raw)
To: Dmitry Torokhov; +Cc: linux-input
tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git for-linus
branch HEAD: 180a8f12c21f41740fee09ca7f7aa98ff5bb99f8 Input: goodix - accept ACPI resources with gpio_count == 3 && gpio_int_idx == 0
elapsed time: 1580m
configs tested: 85
configs skipped: 0
The following configs have been built successfully.
More configs may be tested in the coming days.
tested configs:
arc randconfig-001-20240120 gcc
arc randconfig-002-20240120 gcc
arm randconfig-001-20240120 clang
arm randconfig-002-20240120 clang
arm randconfig-003-20240120 clang
arm randconfig-004-20240120 clang
arm64 randconfig-001-20240120 clang
arm64 randconfig-002-20240120 clang
arm64 randconfig-003-20240120 clang
arm64 randconfig-004-20240120 clang
csky randconfig-001-20240120 gcc
csky randconfig-002-20240120 gcc
hexagon randconfig-001-20240120 clang
hexagon randconfig-002-20240120 clang
i386 buildonly-randconfig-001-20240119 gcc
i386 buildonly-randconfig-002-20240119 gcc
i386 buildonly-randconfig-003-20240119 gcc
i386 buildonly-randconfig-004-20240119 gcc
i386 buildonly-randconfig-005-20240119 gcc
i386 buildonly-randconfig-006-20240119 gcc
i386 randconfig-001-20240119 gcc
i386 randconfig-002-20240119 gcc
i386 randconfig-003-20240119 gcc
i386 randconfig-004-20240119 gcc
i386 randconfig-005-20240119 gcc
i386 randconfig-006-20240119 gcc
i386 randconfig-011-20240119 clang
i386 randconfig-012-20240119 clang
i386 randconfig-013-20240119 clang
i386 randconfig-014-20240119 clang
i386 randconfig-015-20240119 clang
i386 randconfig-016-20240119 clang
loongarch allmodconfig gcc
loongarch randconfig-001-20240120 gcc
loongarch randconfig-002-20240120 gcc
m68k allmodconfig gcc
m68k allyesconfig gcc
microblaze allmodconfig gcc
microblaze allyesconfig gcc
mips allyesconfig gcc
nios2 allmodconfig gcc
nios2 allyesconfig gcc
nios2 randconfig-001-20240120 gcc
nios2 randconfig-002-20240120 gcc
openrisc allyesconfig gcc
parisc allmodconfig gcc
parisc allyesconfig gcc
parisc randconfig-001-20240120 gcc
parisc randconfig-002-20240120 gcc
powerpc allmodconfig clang
powerpc randconfig-001-20240120 clang
powerpc randconfig-002-20240120 clang
powerpc randconfig-003-20240120 clang
powerpc64 randconfig-001-20240120 clang
powerpc64 randconfig-002-20240120 clang
powerpc64 randconfig-003-20240120 clang
riscv randconfig-001-20240120 clang
riscv randconfig-002-20240120 clang
s390 randconfig-001-20240120 gcc
s390 randconfig-002-20240120 gcc
sh randconfig-001-20240120 gcc
x86_64 buildonly-randconfig-001-20240120 clang
x86_64 buildonly-randconfig-002-20240120 clang
x86_64 buildonly-randconfig-003-20240120 clang
x86_64 buildonly-randconfig-004-20240120 clang
x86_64 buildonly-randconfig-005-20240120 clang
x86_64 buildonly-randconfig-006-20240120 clang
x86_64 randconfig-001-20240120 gcc
x86_64 randconfig-002-20240120 gcc
x86_64 randconfig-003-20240120 gcc
x86_64 randconfig-004-20240120 gcc
x86_64 randconfig-005-20240120 gcc
x86_64 randconfig-006-20240120 gcc
x86_64 randconfig-011-20240120 clang
x86_64 randconfig-012-20240120 clang
x86_64 randconfig-013-20240120 clang
x86_64 randconfig-014-20240120 clang
x86_64 randconfig-015-20240120 clang
x86_64 randconfig-016-20240120 clang
x86_64 randconfig-071-20240120 clang
x86_64 randconfig-072-20240120 clang
x86_64 randconfig-073-20240120 clang
x86_64 randconfig-074-20240120 clang
x86_64 randconfig-075-20240120 clang
x86_64 randconfig-076-20240120 clang
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply
* [dtor-input:next] BUILD REGRESSION 3af6e24a456437d323d1080bd254053f7af05234
From: kernel test robot @ 2024-01-20 9:39 UTC (permalink / raw)
To: Dmitry Torokhov; +Cc: linux-input
tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next
branch HEAD: 3af6e24a456437d323d1080bd254053f7af05234 dt-bindings: input: silead,gsl1680: do not override firmware-name $ref
Error/Warning reports:
https://lore.kernel.org/oe-kbuild-all/202401200525.sV9c5cWM-lkp@intel.com
https://lore.kernel.org/oe-kbuild-all/202401200614.B4PnBzhk-lkp@intel.com
Error/Warning: (recently discovered and may have been fixed)
drivers/input/joystick/adc-joystick.c:194:10: error: call to undeclared function 'min_array'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
drivers/input/joystick/adc-joystick.c:194:10: error: implicit declaration of function 'min_array' [-Werror=implicit-function-declaration]
drivers/input/joystick/adc-joystick.c:195:10: error: call to undeclared function 'max_array'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
drivers/input/joystick/adc-joystick.c:195:10: error: implicit declaration of function 'max_array'; did you mean 'kmalloc_array'? [-Werror=implicit-function-declaration]
Error/Warning ids grouped by kconfigs:
gcc_recent_errors
`-- i386-randconfig-011-20240120
|-- drivers-input-joystick-adc-joystick.c:error:implicit-declaration-of-function-max_array
`-- drivers-input-joystick-adc-joystick.c:error:implicit-declaration-of-function-min_array
clang_recent_errors
|-- i386-randconfig-001-20240120
| |-- drivers-input-joystick-adc-joystick.c:error:call-to-undeclared-function-max_array-ISO-C99-and-later-do-not-support-implicit-function-declarations
| `-- drivers-input-joystick-adc-joystick.c:error:call-to-undeclared-function-min_array-ISO-C99-and-later-do-not-support-implicit-function-declarations
|-- x86_64-buildonly-randconfig-002-20240120
| |-- drivers-input-joystick-adc-joystick.c:error:call-to-undeclared-function-max_array-ISO-C99-and-later-do-not-support-implicit-function-declarations
| `-- drivers-input-joystick-adc-joystick.c:error:call-to-undeclared-function-min_array-ISO-C99-and-later-do-not-support-implicit-function-declarations
`-- x86_64-randconfig-012-20240120
|-- drivers-input-joystick-adc-joystick.c:error:call-to-undeclared-function-max_array-ISO-C99-and-later-do-not-support-implicit-function-declarations
`-- drivers-input-joystick-adc-joystick.c:error:call-to-undeclared-function-min_array-ISO-C99-and-later-do-not-support-implicit-function-declarations
elapsed time: 1450m
configs tested: 74
configs skipped: 0
tested configs:
arc randconfig-001-20240120 gcc
arc randconfig-002-20240120 gcc
arm randconfig-001-20240120 clang
arm randconfig-002-20240120 clang
arm randconfig-003-20240120 clang
arm randconfig-004-20240120 clang
arm64 randconfig-001-20240120 clang
arm64 randconfig-002-20240120 clang
arm64 randconfig-003-20240120 clang
arm64 randconfig-004-20240120 clang
csky randconfig-001-20240120 gcc
csky randconfig-002-20240120 gcc
hexagon randconfig-001-20240120 clang
hexagon randconfig-002-20240120 clang
i386 buildonly-randconfig-001-20240120 clang
i386 buildonly-randconfig-002-20240120 clang
i386 buildonly-randconfig-003-20240120 clang
i386 buildonly-randconfig-004-20240120 clang
i386 buildonly-randconfig-005-20240120 clang
i386 buildonly-randconfig-006-20240120 clang
i386 randconfig-001-20240120 clang
i386 randconfig-002-20240120 clang
i386 randconfig-003-20240120 clang
i386 randconfig-004-20240120 clang
i386 randconfig-005-20240120 clang
i386 randconfig-006-20240120 clang
i386 randconfig-011-20240120 gcc
i386 randconfig-012-20240120 gcc
i386 randconfig-013-20240120 gcc
i386 randconfig-014-20240120 gcc
i386 randconfig-015-20240120 gcc
i386 randconfig-016-20240120 gcc
loongarch randconfig-001-20240120 gcc
loongarch randconfig-002-20240120 gcc
nios2 randconfig-001-20240120 gcc
nios2 randconfig-002-20240120 gcc
parisc randconfig-001-20240120 gcc
parisc randconfig-002-20240120 gcc
powerpc randconfig-001-20240120 clang
powerpc randconfig-002-20240120 clang
powerpc randconfig-003-20240120 clang
powerpc64 randconfig-001-20240120 clang
powerpc64 randconfig-002-20240120 clang
powerpc64 randconfig-003-20240120 clang
riscv randconfig-001-20240120 clang
riscv randconfig-002-20240120 clang
s390 randconfig-001-20240120 gcc
s390 randconfig-002-20240120 gcc
sh randconfig-001-20240120 gcc
sh randconfig-002-20240120 gcc
x86_64 buildonly-randconfig-001-20240120 clang
x86_64 buildonly-randconfig-002-20240120 clang
x86_64 buildonly-randconfig-003-20240120 clang
x86_64 buildonly-randconfig-004-20240120 clang
x86_64 buildonly-randconfig-005-20240120 clang
x86_64 buildonly-randconfig-006-20240120 clang
x86_64 randconfig-001-20240120 gcc
x86_64 randconfig-002-20240120 gcc
x86_64 randconfig-003-20240120 gcc
x86_64 randconfig-004-20240120 gcc
x86_64 randconfig-005-20240120 gcc
x86_64 randconfig-006-20240120 gcc
x86_64 randconfig-011-20240120 clang
x86_64 randconfig-012-20240120 clang
x86_64 randconfig-013-20240120 clang
x86_64 randconfig-014-20240120 clang
x86_64 randconfig-015-20240120 clang
x86_64 randconfig-016-20240120 clang
x86_64 randconfig-071-20240120 clang
x86_64 randconfig-072-20240120 clang
x86_64 randconfig-073-20240120 clang
x86_64 randconfig-074-20240120 clang
x86_64 randconfig-075-20240120 clang
x86_64 randconfig-076-20240120 clang
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply
* Re: [PATCH v3] Input: adc-joystick: Handle inverted axes
From: Dmitry Torokhov @ 2024-01-20 9:10 UTC (permalink / raw)
To: Chris Morgan
Cc: linux-input, contact, hdegoede, paul, peter.hutterer, svv,
biswarupp, Chris Morgan
In-Reply-To: <ZaozAsSblybdoeEK@google.com>
On Fri, Jan 19, 2024 at 12:29:54AM -0800, Dmitry Torokhov wrote:
> Hi Chris,
>
> On Mon, Jan 15, 2024 at 01:27:52PM -0600, Chris Morgan wrote:
> >
> > +static int adc_joystick_invert(struct input_dev *dev,
> > + unsigned int axis, int val)
> > +{
> > + int min = dev->absinfo[axis].minimum;
> > + int max = dev->absinfo[axis].maximum;
>
> I changed this to input_abs_get_[min|max](dev, axis) to avoid peeking
> into absinfo and applied.
Apparently min_array() and max_array() are a bit too new. Also I am not
sure if they are actually needed. Can we do it like this:
diff --git a/drivers/input/joystick/adc-joystick.c b/drivers/input/joystick/adc-joystick.c
index 10ee13465cfe..916e78e4dc9f 100644
--- a/drivers/input/joystick/adc-joystick.c
+++ b/drivers/input/joystick/adc-joystick.c
@@ -185,14 +185,14 @@ static int adc_joystick_set_axes(struct device *dev, struct adc_joystick *joy)
if (axes[i].range[0] > axes[i].range[1]) {
dev_dbg(dev, "abs-axis %d inverted\n", i);
axes[i].inverted = true;
+ swap(axes[i].range[0], axes[i].range[1]);
}
fwnode_property_read_u32(child, "abs-fuzz", &axes[i].fuzz);
fwnode_property_read_u32(child, "abs-flat", &axes[i].flat);
input_set_abs_params(joy->input, axes[i].code,
- min_array(axes[i].range, 2),
- max_array(axes[i].range, 2),
+ axes[i].range[0], axes[i].range[1],
axes[i].fuzz, axes[i].flat);
input_set_capability(joy->input, EV_ABS, axes[i].code);
}
Thanks.
--
Dmitry
^ permalink raw reply related
* [PATCH] Input: hid-winwing module
From: Ivan Gorinov @ 2024-01-20 1:50 UTC (permalink / raw)
To: jikos; +Cc: linux-input, linux-kernel
Support for WinWing Orion2 throttle.
Signed-off-by: Ivan Gorinov <linux-kernel@altimeter.info>
---
drivers/hid/Kconfig | 12 ++
drivers/hid/Makefile | 1 +
drivers/hid/hid-winwing.c | 231 ++++++++++++++++++++++++++++++++++++++
3 files changed, 244 insertions(+)
create mode 100644 drivers/hid/hid-winwing.c
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index 4c682c650704..cb41613cebbd 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -1236,6 +1236,18 @@ config HID_WIIMOTE
To compile this driver as a module, choose M here: the
module will be called hid-wiimote.
+config HID_WINWING
+ tristate "WinWing Orion2 throttle with F/A-18 grip support (USB)"
+ depends on USB_HID
+ depends on NEW_LEDS
+ depends on LEDS_CLASS
+ help
+ Support for WinWing Orion2 throttle.
+ Enables all buttons and switches on the base.
+
+ To compile this driver as a module, choose M here: the
+ module will be called hid-winwing.
+
config HID_XINMO
tristate "Xin-Mo non-fully compliant devices"
help
diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
index 082a728eac60..ce71b53ea6c5 100644
--- a/drivers/hid/Makefile
+++ b/drivers/hid/Makefile
@@ -150,6 +150,7 @@ wacom-objs := wacom_wac.o wacom_sys.o
obj-$(CONFIG_HID_WACOM) += wacom.o
obj-$(CONFIG_HID_WALTOP) += hid-waltop.o
obj-$(CONFIG_HID_WIIMOTE) += hid-wiimote.o
+obj-$(CONFIG_HID_WINWING) += hid-winwing.o
obj-$(CONFIG_HID_SENSOR_HUB) += hid-sensor-hub.o
obj-$(CONFIG_HID_SENSOR_CUSTOM_SENSOR) += hid-sensor-custom.o
diff --git a/drivers/hid/hid-winwing.c b/drivers/hid/hid-winwing.c
new file mode 100644
index 000000000000..a08f97458aef
--- /dev/null
+++ b/drivers/hid/hid-winwing.c
@@ -0,0 +1,231 @@
+// SPDX-License-Identifier: GPL-2.0
+
+/*
+ * HID driver for WinWing Orion 2 throttle
+ *
+ * Copyright (c) 2023 Ivan Gorinov
+ */
+
+#include <linux/device.h>
+#include <linux/hid.h>
+#include <linux/hidraw.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
+
+#define MAX_REPORT 16
+
+struct winwing_led {
+ struct led_classdev cdev;
+ struct hid_device *hdev;
+ int number;
+};
+
+struct winwing_led_info {
+ int number;
+ int max_brightness;
+ const char *led_name;
+};
+
+static struct winwing_led_info led_info[3] = {
+ { 0, 255, "backlight" },
+ { 1, 1, "a-a" },
+ { 2, 1, "a-g" },
+};
+
+struct winwing_drv_data {
+ struct hid_device *hdev;
+ __u8 *report_buf;
+ struct mutex lock;
+ unsigned int num_leds;
+ struct winwing_led leds[];
+};
+
+static int winwing_led_write(struct led_classdev *cdev, enum
led_brightness br)
+{
+ struct winwing_led *led = (struct winwing_led *) cdev;
+ struct winwing_drv_data *data = hid_get_drvdata(led->hdev);
+ __u8 *buf = data->report_buf;
+ int ret;
+
+ mutex_lock(&data->lock);
+
+ buf[0] = 0x02;
+ buf[1] = 0x60;
+ buf[2] = 0xbe;
+ buf[3] = 0x00;
+ buf[4] = 0x00;
+ buf[5] = 0x03;
+ buf[6] = 0x49;
+ buf[7] = led->number;
+ buf[8] = br;
+ buf[9] = 0x00;
+ buf[10] = 0;
+ buf[11] = 0;
+ buf[12] = 0;
+ buf[13] = 0;
+
+ ret = hid_hw_output_report(led->hdev, buf, 14);
+
+ mutex_unlock(&data->lock);
+
+ return ret;
+}
+
+static int winwing_init_led(struct hid_device *hdev, struct input_dev
*input)
+{
+ struct winwing_drv_data *data;
+ struct winwing_led *led;
+ int ret;
+ int i;
+
+ size_t data_size = struct_size(data, leds, 3);
+
+ data = devm_kzalloc(&hdev->dev, data_size, GFP_KERNEL);
+
+ if (!data)
+ return -ENOMEM;
+
+ data->report_buf = devm_kmalloc(&hdev->dev, MAX_REPORT, GFP_KERNEL);
+
+ if (!data->report_buf)
+ return -ENOMEM;
+
+ for (i = 0; i < 3; i += 1) {
+ struct winwing_led_info *info = &led_info[i];
+
+ led = &data->leds[i];
+ led->hdev = hdev;
+ led->number = info->number;
+ led->cdev.max_brightness = info->max_brightness;
+ led->cdev.brightness_set_blocking = winwing_led_write;
+ led->cdev.flags = LED_HW_PLUGGABLE;
+ led->cdev.name = devm_kasprintf(&hdev->dev, GFP_KERNEL,
+ "%s::%s",
+ dev_name(&input->dev),
+ info->led_name);
+
+ ret = devm_led_classdev_register(&hdev->dev, &led->cdev);
+ if (ret)
+ return ret;
+ }
+
+ hid_set_drvdata(hdev, data);
+
+ return ret;
+}
+
+static int winwing_probe(struct hid_device *hdev,
+ const struct hid_device_id *id)
+{
+ unsigned int minor;
+ int ret;
+
+ ret = hid_parse(hdev);
+ if (ret) {
+ hid_err(hdev, "parse failed\n");
+ return ret;
+ }
+
+ ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
+ if (ret) {
+ hid_err(hdev, "hw start failed\n");
+ return ret;
+ }
+
+ minor = ((struct hidraw *) hdev->hidraw)->minor;
+
+ return 0;
+}
+
+static int winwing_input_configured(struct hid_device *hdev,
+ struct hid_input *hidinput)
+{
+ int ret;
+
+ ret = winwing_init_led(hdev, hidinput->input);
+
+ if (ret)
+ hid_err(hdev, "led init failed\n");
+
+ return ret;
+}
+
+static __u8 original_rdesc_buttons[] = {
+ 0x05, 0x09, 0x19, 0x01, 0x29, 0x6F,
+ 0x15, 0x00, 0x25, 0x01, 0x35, 0x00,
+ 0x45, 0x01, 0x75, 0x01, 0x95, 0x6F,
+ 0x81, 0x02, 0x75, 0x01, 0x95, 0x01,
+ 0x81, 0x01
+};
+
+/*
+ * HID report descriptor shows 111 buttons, which exceeds maximum
+ * number of buttons (80) supported by Linux kernel HID subsystem.
+ *
+ * This module skips numbers 32-63, unused on some throttle grips.
+ */
+
+static __u8 *winwing_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+ unsigned int *rsize)
+{
+ int sig_length = sizeof(original_rdesc_buttons);
+ int unused_button_numbers = 32;
+
+ if (*rsize < 34)
+ return rdesc;
+
+ if (memcmp(rdesc + 8, original_rdesc_buttons, sig_length) == 0) {
+
+ /* Usage Maximum */
+ rdesc[13] -= unused_button_numbers;
+
+ /* Report Count for buttons */
+ rdesc[25] -= unused_button_numbers;
+
+ /* Report Count for padding [HID1_11, 6.2.2.9] */
+ rdesc[31] += unused_button_numbers;
+
+ hid_info(hdev, "winwing descriptor fixed\n");
+ }
+
+ return rdesc;
+}
+
+static int winwing_raw_event(struct hid_device *hdev,
+ struct hid_report *report, u8 *raw_data, int size)
+{
+ if (size >= 15) {
+ /* Skip buttons 32 .. 63 */
+ memmove(raw_data + 5, raw_data + 9, 6);
+
+ /* Clear the padding */
+ memset(raw_data + 11, 0, 4);
+ }
+
+ return 0;
+}
+
+static const struct hid_device_id winwing_devices[] = {
+ /* Orion2 base with F/A-18 Hornet grip */
+ { HID_USB_DEVICE(0x4098, 0xbe62) },
+
+ /* Orion2 base with F-16 Hornet grip */
+ { HID_USB_DEVICE(0x4098, 0xbe68) },
+
+ {}
+};
+
+MODULE_DEVICE_TABLE(hid, winwing_devices);
+
+static struct hid_driver winwing_driver = {
+ .name = "winwing",
+ .id_table = winwing_devices,
+ .probe = winwing_probe,
+ .input_configured = winwing_input_configured,
+ .report_fixup = winwing_report_fixup,
+ .raw_event = winwing_raw_event,
+};
+module_hid_driver(winwing_driver);
+
+MODULE_LICENSE("GPL");
--
2.25.1
^ permalink raw reply related
* [dtor-input:next 134/135] drivers/input/joystick/adc-joystick.c:194:10: error: implicit declaration of function 'min_array'
From: kernel test robot @ 2024-01-19 22:55 UTC (permalink / raw)
To: Chris Morgan; +Cc: oe-kbuild-all, linux-input, Dmitry Torokhov
tree: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next
head: 3af6e24a456437d323d1080bd254053f7af05234
commit: 6380a59c534ecab1462608a1f76490289a45a377 [134/135] Input: adc-joystick - handle inverted axes
config: i386-randconfig-011-20240120 (https://download.01.org/0day-ci/archive/20240120/202401200614.B4PnBzhk-lkp@intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240120/202401200614.B4PnBzhk-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202401200614.B4PnBzhk-lkp@intel.com/
All errors (new ones prefixed by >>):
drivers/input/joystick/adc-joystick.c: In function 'adc_joystick_set_axes':
>> drivers/input/joystick/adc-joystick.c:194:10: error: implicit declaration of function 'min_array' [-Werror=implicit-function-declaration]
194 | min_array(axes[i].range, 2),
| ^~~~~~~~~
>> drivers/input/joystick/adc-joystick.c:195:10: error: implicit declaration of function 'max_array'; did you mean 'kmalloc_array'? [-Werror=implicit-function-declaration]
195 | max_array(axes[i].range, 2),
| ^~~~~~~~~
| kmalloc_array
cc1: some warnings being treated as errors
vim +/min_array +194 drivers/input/joystick/adc-joystick.c
135
136 static int adc_joystick_set_axes(struct device *dev, struct adc_joystick *joy)
137 {
138 struct adc_joystick_axis *axes;
139 struct fwnode_handle *child;
140 int num_axes, error, i;
141
142 num_axes = device_get_child_node_count(dev);
143 if (!num_axes) {
144 dev_err(dev, "Unable to find child nodes\n");
145 return -EINVAL;
146 }
147
148 if (num_axes != joy->num_chans) {
149 dev_err(dev, "Got %d child nodes for %d channels\n",
150 num_axes, joy->num_chans);
151 return -EINVAL;
152 }
153
154 axes = devm_kmalloc_array(dev, num_axes, sizeof(*axes), GFP_KERNEL);
155 if (!axes)
156 return -ENOMEM;
157
158 device_for_each_child_node(dev, child) {
159 error = fwnode_property_read_u32(child, "reg", &i);
160 if (error) {
161 dev_err(dev, "reg invalid or missing\n");
162 goto err_fwnode_put;
163 }
164
165 if (i >= num_axes) {
166 error = -EINVAL;
167 dev_err(dev, "No matching axis for reg %d\n", i);
168 goto err_fwnode_put;
169 }
170
171 error = fwnode_property_read_u32(child, "linux,code",
172 &axes[i].code);
173 if (error) {
174 dev_err(dev, "linux,code invalid or missing\n");
175 goto err_fwnode_put;
176 }
177
178 error = fwnode_property_read_u32_array(child, "abs-range",
179 axes[i].range, 2);
180 if (error) {
181 dev_err(dev, "abs-range invalid or missing\n");
182 goto err_fwnode_put;
183 }
184
185 if (axes[i].range[0] > axes[i].range[1]) {
186 dev_dbg(dev, "abs-axis %d inverted\n", i);
187 axes[i].inverted = true;
188 }
189
190 fwnode_property_read_u32(child, "abs-fuzz", &axes[i].fuzz);
191 fwnode_property_read_u32(child, "abs-flat", &axes[i].flat);
192
193 input_set_abs_params(joy->input, axes[i].code,
> 194 min_array(axes[i].range, 2),
> 195 max_array(axes[i].range, 2),
196 axes[i].fuzz, axes[i].flat);
197 input_set_capability(joy->input, EV_ABS, axes[i].code);
198 }
199
200 joy->axes = axes;
201
202 return 0;
203
204 err_fwnode_put:
205 fwnode_handle_put(child);
206 return error;
207 }
208
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply
* Re: Implement per-key keyboard backlight as auxdisplay?
From: Pavel Machek @ 2024-01-19 22:14 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: Jani Nikula, Hans de Goede, Werner Sembach, jikos,
Jelle van der Waa, Miguel Ojeda, Lee Jones, linux-kernel,
dri-devel@lists.freedesktop.org, linux-input, ojeda, linux-leds,
Benjamin Tissoires
In-Reply-To: <ZarAfg2_5ocfKAWo@google.com>
[-- Attachment #1: Type: text/plain, Size: 1505 bytes --]
Hi!
> > And while I would personally hate it, you can imagine a use case where
> > you'd like a keypress to have a visual effect around the key you
> > pressed. A kind of force feedback, if you will. I don't actually know,
> > and correct me if I'm wrong, but feels like implementing that outside of
> > the input subsystem would be non-trivial.
>
> Actually I think it does not belong to the input subsystem as it is,
> where the goal is to deliver keystrokes and gestures to userspace. The
> "force feedback" kind of fits, but not really practical, again because
> of lack of geometry info. It is also not really essential to be fully
> and automatically handled by the kernel. So I think the best way is
> > to
So that's actually big question.
If the common usage is "run bad apple demo on keyboard" than pretty
clearly it should be display.
If the common usage is "computer is asking yes/no question, so
highlight yes and no buttons", then there are good arguments why input
should handle that (as it does capslock led, for example).
Actually I could imagine "real" use when shift / control /alt
backlight would indicate sticky-shift keys for handicapped.
It seems they are making mice with backlit buttons. If the main use is
highlight this key whereever it is, then it should be input.
But I suspect may use is just fancy colors and it should be display.
Best regards,
Pavel
--
People of Russia, stop Putin before his war on Ukraine escalates.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
^ permalink raw reply
* [dtor-input:next 134/135] drivers/input/joystick/adc-joystick.c:194:10: error: call to undeclared function 'min_array'; ISO C99 and later do not support implicit function declarations
From: kernel test robot @ 2024-01-19 22:01 UTC (permalink / raw)
To: Chris Morgan; +Cc: llvm, oe-kbuild-all, linux-input, Dmitry Torokhov
tree: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next
head: 3af6e24a456437d323d1080bd254053f7af05234
commit: 6380a59c534ecab1462608a1f76490289a45a377 [134/135] Input: adc-joystick - handle inverted axes
config: i386-randconfig-001-20240120 (https://download.01.org/0day-ci/archive/20240120/202401200525.sV9c5cWM-lkp@intel.com/config)
compiler: ClangBuiltLinux clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240120/202401200525.sV9c5cWM-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202401200525.sV9c5cWM-lkp@intel.com/
All errors (new ones prefixed by >>):
>> drivers/input/joystick/adc-joystick.c:194:10: error: call to undeclared function 'min_array'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
194 | min_array(axes[i].range, 2),
| ^
>> drivers/input/joystick/adc-joystick.c:195:10: error: call to undeclared function 'max_array'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
195 | max_array(axes[i].range, 2),
| ^
2 errors generated.
vim +/min_array +194 drivers/input/joystick/adc-joystick.c
135
136 static int adc_joystick_set_axes(struct device *dev, struct adc_joystick *joy)
137 {
138 struct adc_joystick_axis *axes;
139 struct fwnode_handle *child;
140 int num_axes, error, i;
141
142 num_axes = device_get_child_node_count(dev);
143 if (!num_axes) {
144 dev_err(dev, "Unable to find child nodes\n");
145 return -EINVAL;
146 }
147
148 if (num_axes != joy->num_chans) {
149 dev_err(dev, "Got %d child nodes for %d channels\n",
150 num_axes, joy->num_chans);
151 return -EINVAL;
152 }
153
154 axes = devm_kmalloc_array(dev, num_axes, sizeof(*axes), GFP_KERNEL);
155 if (!axes)
156 return -ENOMEM;
157
158 device_for_each_child_node(dev, child) {
159 error = fwnode_property_read_u32(child, "reg", &i);
160 if (error) {
161 dev_err(dev, "reg invalid or missing\n");
162 goto err_fwnode_put;
163 }
164
165 if (i >= num_axes) {
166 error = -EINVAL;
167 dev_err(dev, "No matching axis for reg %d\n", i);
168 goto err_fwnode_put;
169 }
170
171 error = fwnode_property_read_u32(child, "linux,code",
172 &axes[i].code);
173 if (error) {
174 dev_err(dev, "linux,code invalid or missing\n");
175 goto err_fwnode_put;
176 }
177
178 error = fwnode_property_read_u32_array(child, "abs-range",
179 axes[i].range, 2);
180 if (error) {
181 dev_err(dev, "abs-range invalid or missing\n");
182 goto err_fwnode_put;
183 }
184
185 if (axes[i].range[0] > axes[i].range[1]) {
186 dev_dbg(dev, "abs-axis %d inverted\n", i);
187 axes[i].inverted = true;
188 }
189
190 fwnode_property_read_u32(child, "abs-fuzz", &axes[i].fuzz);
191 fwnode_property_read_u32(child, "abs-flat", &axes[i].flat);
192
193 input_set_abs_params(joy->input, axes[i].code,
> 194 min_array(axes[i].range, 2),
> 195 max_array(axes[i].range, 2),
196 axes[i].fuzz, axes[i].flat);
197 input_set_capability(joy->input, EV_ABS, axes[i].code);
198 }
199
200 joy->axes = axes;
201
202 return 0;
203
204 err_fwnode_put:
205 fwnode_handle_put(child);
206 return error;
207 }
208
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply
* Re: Implement per-key keyboard backlight as auxdisplay?
From: Pavel Machek @ 2024-01-19 20:32 UTC (permalink / raw)
To: Werner Sembach
Cc: Hans de Goede, Jani Nikula, jikos, Jelle van der Waa,
Miguel Ojeda, Lee Jones, linux-kernel,
dri-devel@lists.freedesktop.org, linux-input, ojeda, linux-leds
In-Reply-To: <36973f9d-bf67-417d-998c-ce24c38322c3@tuxedocomputers.com>
[-- Attachment #1: Type: text/plain, Size: 1670 bytes --]
Hi!
> > > And then storing RGB in separate bytes, so userspace will then
> > > always send a buffer of 192 bytes per line (64x3) x 14 rows
> > > = 3072 bytes. With the kernel driver ignoring parts of
> > > the buffer where there are no actual keys.
> > That's really really weird interface. If you are doing RGB888 64x14,
> > lets make it a ... display? :-).
> >
> > ioctl always sending 3072 bytes is really a hack.
> >
> > Small displays exist and are quite common, surely we'd handle this as
> > a display:
> > https://pajenicko.cz/displeje/graficky-oled-displej-0-66-64x48-i2c-bily-wemos-d1-mini
> > It is 64x48.
> >
> > And then there's this:
> > https://pajenicko.cz/displeje/maticovy-8x8-led-displej-s-radicem-max7219
> > and this:
> > https://pajenicko.cz/displeje/maticovy-8x32-led-displej-s-radicem-max7219
> >
> > One of them is 8x8.
> >
> > Surely those should be displays, too?
>
> But what about a light bar with, lets say, 3 zones. Is that a 3x1 display?
>
> And what about a mouse having lit mousebuttons and a single led light bar at
> the wrist: a 2x2 display, but one is thin but long and one is not used?
So indeed LEDs can arranged into various shapes. Like a ring, or this:
* *
* * *
* *
https://pajenicko.cz/led-moduly?page=2
Dunno. Sounds like a display is still a best match for them. Some of
modules are RGB, some are single-color only, I'm sure there will be
various bit depths.
I guess we can do 3x1 and 2x2 displays. Or we could try to solve
keyboards and ignore those for now.
Best regards,
Pavel
--
People of Russia, stop Putin before his war on Ukraine escalates.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox