* [PATCH 1/5] Input: atkbd: Convert function_row_physmap to u16 array
2022-02-04 20:20 [PATCH 0/5] Input/HID: Consolidate ChromeOS Vivaldi keyboard logic Stephen Boyd
@ 2022-02-04 20:20 ` Stephen Boyd
2022-02-04 20:20 ` [PATCH 2/5] Input: Extract ChromeOS vivaldi physmap show function Stephen Boyd
` (3 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Stephen Boyd @ 2022-02-04 20:20 UTC (permalink / raw)
To: benjamin.tissoires, Dmitry Torokhov, Jiri Kosina
Cc: linux-kernel, linux-input, Sean O'Brien, Douglas Anderson,
Zhengqiao Xia
This is a u32 array because the device property is an array of u32s.
Convert this to a u16 array to save a little space and to ease the
transition to a common physmap function in the next patch.
Cc: Jiri Kosina <jikos@kernel.org>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: "Sean O'Brien" <seobrien@chromium.org>
Cc: Douglas Anderson <dianders@chromium.org>
Cc: Zhengqiao Xia <xiazhengqiao@huaqin.corp-partner.google.com>
Signed-off-by: Stephen Boyd <swboyd@chromium.org>
---
Note this makes a large array on the stack (32 * 24 = 768 bytes). It
could be moved to the heap with a kmalloc or we could accept the extra
16 * 24 = 384 bytes for the vivaldi_data struct if it has a u32, or we
can be more precise and make that a u16 pointer in vivaldi_data and move
the array to the heap.
drivers/input/keyboard/atkbd.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
index fbdef95291e9..721cde982637 100644
--- a/drivers/input/keyboard/atkbd.c
+++ b/drivers/input/keyboard/atkbd.c
@@ -237,7 +237,7 @@ struct atkbd {
/* Serializes reconnect(), attr->set() and event work */
struct mutex mutex;
- u32 function_row_physmap[MAX_FUNCTION_ROW_KEYS];
+ u16 function_row_physmap[MAX_FUNCTION_ROW_KEYS];
int num_function_row_keys;
};
@@ -1202,14 +1202,17 @@ static void atkbd_parse_fwnode_data(struct serio *serio)
{
struct atkbd *atkbd = serio_get_drvdata(serio);
struct device *dev = &serio->dev;
- int n;
+ int i, n;
+ u32 physmap[MAX_FUNCTION_ROW_KEYS];
/* Parse "function-row-physmap" property */
n = device_property_count_u32(dev, "function-row-physmap");
if (n > 0 && n <= MAX_FUNCTION_ROW_KEYS &&
!device_property_read_u32_array(dev, "function-row-physmap",
- atkbd->function_row_physmap, n)) {
+ physmap, n)) {
atkbd->num_function_row_keys = n;
+ for (i = 0; i < n; i++)
+ atkbd->function_row_physmap[i] = physmap[i];
dev_dbg(dev, "FW reported %d function-row key locations\n", n);
}
}
--
https://chromeos.dev
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/5] Input: Extract ChromeOS vivaldi physmap show function
2022-02-04 20:20 [PATCH 0/5] Input/HID: Consolidate ChromeOS Vivaldi keyboard logic Stephen Boyd
2022-02-04 20:20 ` [PATCH 1/5] Input: atkbd: Convert function_row_physmap to u16 array Stephen Boyd
@ 2022-02-04 20:20 ` Stephen Boyd
2022-02-04 20:20 ` [PATCH 3/5] HID: Extract vivaldi hid feature mapping for use in hid-hammer Stephen Boyd
` (2 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Stephen Boyd @ 2022-02-04 20:20 UTC (permalink / raw)
To: benjamin.tissoires, Dmitry Torokhov, Jiri Kosina
Cc: linux-kernel, linux-input, Sean O'Brien, Douglas Anderson,
Zhengqiao Xia
Let's introduce a common library file for the physmap show function
duplicated between three different keyboard drivers. This largely copies
the code from cros_ec_keyb.c which has the most recent version of the
show function, while using the vivaldi_data struct from the hid-vivaldi
driver. This saves a small amount of space in an allmodconfig build.
$ ./scripts/bloat-o-meter vmlinux.before vmlinux.after
add/remove: 3/0 grow/shrink: 2/3 up/down: 412/-720 (-308)
Function old new delta
vivaldi_function_row_physmap_show - 292 +292
_sub_I_65535_1 1057564 1057616 +52
_sub_D_65535_0 1057564 1057616 +52
e843419@49f2_00062737_9b04 - 8 +8
e843419@20f6_0002a34d_35bc - 8 +8
atkbd_parse_fwnode_data 480 472 -8
atkbd_do_show_function_row_physmap 316 76 -240
function_row_physmap_show 620 148 -472
Total: Before=285581925, After=285581617, chg -0.00%
Cc: Jiri Kosina <jikos@kernel.org>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: "Sean O'Brien" <seobrien@chromium.org>
Cc: Douglas Anderson <dianders@chromium.org>
Cc: Zhengqiao Xia <xiazhengqiao@huaqin.corp-partner.google.com>
Signed-off-by: Stephen Boyd <swboyd@chromium.org>
---
drivers/hid/Kconfig | 1 +
drivers/hid/hid-vivaldi.c | 27 +++++--------------
drivers/input/Kconfig | 7 +++++
drivers/input/Makefile | 1 +
drivers/input/keyboard/Kconfig | 2 ++
drivers/input/keyboard/atkbd.c | 22 +++++----------
drivers/input/keyboard/cros_ec_keyb.c | 30 +++++++--------------
drivers/input/vivaldi-keymap.c | 39 +++++++++++++++++++++++++++
include/linux/input/vivaldi-keymap.h | 28 +++++++++++++++++++
9 files changed, 101 insertions(+), 56 deletions(-)
create mode 100644 drivers/input/vivaldi-keymap.c
create mode 100644 include/linux/input/vivaldi-keymap.h
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index f5544157576c..5569a2029dab 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -411,6 +411,7 @@ config HID_GOOGLE_HAMMER
config HID_VIVALDI
tristate "Vivaldi Keyboard"
+ select INPUT_VIVALDIFMAP
depends on HID
help
Say Y here if you want to enable support for Vivaldi keyboards.
diff --git a/drivers/hid/hid-vivaldi.c b/drivers/hid/hid-vivaldi.c
index efa6140915f4..78ae3725bc89 100644
--- a/drivers/hid/hid-vivaldi.c
+++ b/drivers/hid/hid-vivaldi.c
@@ -8,37 +8,22 @@
#include <linux/device.h>
#include <linux/hid.h>
+#include <linux/input/vivaldi-keymap.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sysfs.h>
-#define MIN_FN_ROW_KEY 1
-#define MAX_FN_ROW_KEY 24
#define HID_VD_FN_ROW_PHYSMAP 0x00000001
#define HID_USAGE_FN_ROW_PHYSMAP (HID_UP_GOOGLEVENDOR | HID_VD_FN_ROW_PHYSMAP)
-struct vivaldi_data {
- u32 function_row_physmap[MAX_FN_ROW_KEY - MIN_FN_ROW_KEY + 1];
- int max_function_row_key;
-};
-
static ssize_t function_row_physmap_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{
struct hid_device *hdev = to_hid_device(dev);
struct vivaldi_data *drvdata = hid_get_drvdata(hdev);
- ssize_t size = 0;
- int i;
-
- if (!drvdata->max_function_row_key)
- return 0;
- for (i = 0; i < drvdata->max_function_row_key; i++)
- size += sprintf(buf + size, "%02X ",
- drvdata->function_row_physmap[i]);
- size += sprintf(buf + size, "\n");
- return size;
+ return vivaldi_function_row_physmap_show(drvdata, buf);
}
static DEVICE_ATTR_RO(function_row_physmap);
@@ -86,10 +71,10 @@ static void vivaldi_feature_mapping(struct hid_device *hdev,
return;
fn_key = (usage->hid & HID_USAGE);
- if (fn_key < MIN_FN_ROW_KEY || fn_key > MAX_FN_ROW_KEY)
+ if (fn_key < VIVALDI_MIN_FN_ROW_KEY || fn_key > VIVALDI_MAX_FN_ROW_KEY)
return;
- if (fn_key > drvdata->max_function_row_key)
- drvdata->max_function_row_key = fn_key;
+ if (fn_key > drvdata->num_function_row_keys)
+ drvdata->num_function_row_keys = fn_key;
report_data = buf = hid_alloc_report_buf(report, GFP_KERNEL);
if (!report_data)
@@ -134,7 +119,7 @@ static void vivaldi_feature_mapping(struct hid_device *hdev,
goto out;
}
- drvdata->function_row_physmap[fn_key - MIN_FN_ROW_KEY] =
+ drvdata->function_row_physmap[fn_key - VIVALDI_MIN_FN_ROW_KEY] =
field->value[usage->usage_index];
out:
diff --git a/drivers/input/Kconfig b/drivers/input/Kconfig
index 5baebf62df33..e2752f7364bc 100644
--- a/drivers/input/Kconfig
+++ b/drivers/input/Kconfig
@@ -77,6 +77,13 @@ config INPUT_MATRIXKMAP
To compile this driver as a module, choose M here: the
module will be called matrix-keymap.
+config INPUT_VIVALDIFMAP
+ tristate
+ help
+ ChromeOS Vivaldi keymap support library. This is a hidden
+ option so that drivers can use common code to parse and
+ expose the vivaldi function row keymap.
+
comment "Userland interfaces"
config INPUT_MOUSEDEV
diff --git a/drivers/input/Makefile b/drivers/input/Makefile
index 037cc595106c..ba320cc99393 100644
--- a/drivers/input/Makefile
+++ b/drivers/input/Makefile
@@ -12,6 +12,7 @@ input-core-y += touchscreen.o
obj-$(CONFIG_INPUT_FF_MEMLESS) += ff-memless.o
obj-$(CONFIG_INPUT_SPARSEKMAP) += sparse-keymap.o
obj-$(CONFIG_INPUT_MATRIXKMAP) += matrix-keymap.o
+obj-$(CONFIG_INPUT_VIVALDIFMAP) += vivaldi-keymap.o
obj-$(CONFIG_INPUT_LEDS) += input-leds.o
obj-$(CONFIG_INPUT_MOUSEDEV) += mousedev.o
diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
index 0c607da9ee10..8b4477e54a01 100644
--- a/drivers/input/keyboard/Kconfig
+++ b/drivers/input/keyboard/Kconfig
@@ -103,6 +103,7 @@ config KEYBOARD_ATKBD
select SERIO_LIBPS2
select SERIO_I8042 if ARCH_MIGHT_HAVE_PC_SERIO
select SERIO_GSCPS2 if GSC
+ select INPUT_VIVALDIFMAP
help
Say Y here if you want to use a standard AT or PS/2 keyboard. Usually
you'll need this, unless you have a different type keyboard (USB, ADB
@@ -749,6 +750,7 @@ config KEYBOARD_XTKBD
config KEYBOARD_CROS_EC
tristate "ChromeOS EC keyboard"
select INPUT_MATRIXKMAP
+ select INPUT_VIVALDIFMAP
depends on CROS_EC
help
Say Y here to enable the matrix keyboard used by ChromeOS devices
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
index 721cde982637..aa539076c121 100644
--- a/drivers/input/keyboard/atkbd.c
+++ b/drivers/input/keyboard/atkbd.c
@@ -19,6 +19,7 @@
#include <linux/interrupt.h>
#include <linux/init.h>
#include <linux/input.h>
+#include <linux/input/vivaldi-keymap.h>
#include <linux/serio.h>
#include <linux/workqueue.h>
#include <linux/libps2.h>
@@ -237,8 +238,7 @@ struct atkbd {
/* Serializes reconnect(), attr->set() and event work */
struct mutex mutex;
- u16 function_row_physmap[MAX_FUNCTION_ROW_KEYS];
- int num_function_row_keys;
+ struct vivaldi_data vdata;
};
/*
@@ -308,17 +308,9 @@ static struct attribute *atkbd_attributes[] = {
static ssize_t atkbd_show_function_row_physmap(struct atkbd *atkbd, char *buf)
{
- ssize_t size = 0;
- int i;
-
- if (!atkbd->num_function_row_keys)
- return 0;
+ const struct vivaldi_data *data = &atkbd->vdata;
- for (i = 0; i < atkbd->num_function_row_keys; i++)
- size += scnprintf(buf + size, PAGE_SIZE - size, "%02X ",
- atkbd->function_row_physmap[i]);
- size += scnprintf(buf + size, PAGE_SIZE - size, "\n");
- return size;
+ return vivaldi_function_row_physmap_show(data, buf);
}
static umode_t atkbd_attr_is_visible(struct kobject *kobj,
@@ -329,7 +321,7 @@ static umode_t atkbd_attr_is_visible(struct kobject *kobj,
struct atkbd *atkbd = serio_get_drvdata(serio);
if (attr == &atkbd_attr_function_row_physmap.attr &&
- !atkbd->num_function_row_keys)
+ !atkbd->vdata.num_function_row_keys)
return 0;
return attr->mode;
@@ -1210,9 +1202,9 @@ static void atkbd_parse_fwnode_data(struct serio *serio)
if (n > 0 && n <= MAX_FUNCTION_ROW_KEYS &&
!device_property_read_u32_array(dev, "function-row-physmap",
physmap, n)) {
- atkbd->num_function_row_keys = n;
+ atkbd->vdata.num_function_row_keys = n;
for (i = 0; i < n; i++)
- atkbd->function_row_physmap[i] = physmap[i];
+ atkbd->vdata.function_row_physmap[i] = physmap[i];
dev_dbg(dev, "FW reported %d function-row key locations\n", n);
}
}
diff --git a/drivers/input/keyboard/cros_ec_keyb.c b/drivers/input/keyboard/cros_ec_keyb.c
index fc02c540636e..ef0f767353fb 100644
--- a/drivers/input/keyboard/cros_ec_keyb.c
+++ b/drivers/input/keyboard/cros_ec_keyb.c
@@ -15,6 +15,7 @@
#include <linux/bitops.h>
#include <linux/i2c.h>
#include <linux/input.h>
+#include <linux/input/vivaldi-keymap.h>
#include <linux/interrupt.h>
#include <linux/kernel.h>
#include <linux/notifier.h>
@@ -44,9 +45,7 @@
* @idev: The input device for the matrix keys.
* @bs_idev: The input device for non-matrix buttons and switches (or NULL).
* @notifier: interrupt event notifier for transport devices
- * @function_row_physmap: An array of the encoded rows/columns for the top
- * row function keys, in an order from left to right
- * @num_function_row_keys: The number of top row keys in a custom keyboard
+ * @vdata: vivaldi function row data
*/
struct cros_ec_keyb {
unsigned int rows;
@@ -64,8 +63,7 @@ struct cros_ec_keyb {
struct input_dev *bs_idev;
struct notifier_block notifier;
- u16 function_row_physmap[MAX_NUM_TOP_ROW_KEYS];
- size_t num_function_row_keys;
+ struct vivaldi_data vdata;
};
/**
@@ -591,10 +589,10 @@ static int cros_ec_keyb_register_matrix(struct cros_ec_keyb *ckdev)
ckdev->idev = idev;
cros_ec_keyb_compute_valid_keys(ckdev);
- physmap = ckdev->function_row_physmap;
+ physmap = ckdev->vdata.function_row_physmap;
of_property_for_each_u32(dev->of_node, "function-row-physmap",
prop, p, key_pos) {
- if (ckdev->num_function_row_keys == MAX_NUM_TOP_ROW_KEYS) {
+ if (ckdev->vdata.num_function_row_keys == MAX_NUM_TOP_ROW_KEYS) {
dev_warn(dev, "Only support up to %d top row keys\n",
MAX_NUM_TOP_ROW_KEYS);
break;
@@ -603,7 +601,7 @@ static int cros_ec_keyb_register_matrix(struct cros_ec_keyb *ckdev)
col = KEY_COL(key_pos);
*physmap = MATRIX_SCAN_CODE(row, col, ckdev->row_shift);
physmap++;
- ckdev->num_function_row_keys++;
+ ckdev->vdata.num_function_row_keys++;
}
err = input_register_device(ckdev->idev);
@@ -619,18 +617,10 @@ static ssize_t function_row_physmap_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{
- ssize_t size = 0;
- int i;
- struct cros_ec_keyb *ckdev = dev_get_drvdata(dev);
- u16 *physmap = ckdev->function_row_physmap;
-
- for (i = 0; i < ckdev->num_function_row_keys; i++)
- size += scnprintf(buf + size, PAGE_SIZE - size,
- "%s%02X", size ? " " : "", physmap[i]);
- if (size)
- size += scnprintf(buf + size, PAGE_SIZE - size, "\n");
+ const struct cros_ec_keyb *ckdev = dev_get_drvdata(dev);
+ const struct vivaldi_data *data = &ckdev->vdata;
- return size;
+ return vivaldi_function_row_physmap_show(data, buf);
}
static DEVICE_ATTR_RO(function_row_physmap);
@@ -648,7 +638,7 @@ static umode_t cros_ec_keyb_attr_is_visible(struct kobject *kobj,
struct cros_ec_keyb *ckdev = dev_get_drvdata(dev);
if (attr == &dev_attr_function_row_physmap.attr &&
- !ckdev->num_function_row_keys)
+ !ckdev->vdata.num_function_row_keys)
return 0;
return attr->mode;
diff --git a/drivers/input/vivaldi-keymap.c b/drivers/input/vivaldi-keymap.c
new file mode 100644
index 000000000000..da6dc4070216
--- /dev/null
+++ b/drivers/input/vivaldi-keymap.c
@@ -0,0 +1,39 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Helpers for ChromeOS Vivaldi keyboard function row mapping
+ *
+ * Copyright (C) 2022 Google, Inc
+ */
+
+#include <linux/export.h>
+#include <linux/input/vivaldi-keymap.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/types.h>
+
+/**
+ * vivaldi_function_row_physmap_show - Print vivaldi function row physmap attribute
+ * @data: The vivaldi function keymap
+ * @buf: Buffer to print the function row phsymap to
+ */
+ssize_t vivaldi_function_row_physmap_show(const struct vivaldi_data *data,
+ char *buf)
+{
+ ssize_t size = 0;
+ int i;
+ const u16 *physmap = data->function_row_physmap;
+
+ if (!data->num_function_row_keys)
+ return 0;
+
+ for (i = 0; i < data->num_function_row_keys; i++)
+ size += scnprintf(buf + size, PAGE_SIZE - size,
+ "%s%02X", size ? " " : "", physmap[i]);
+ if (size)
+ size += scnprintf(buf + size, PAGE_SIZE - size, "\n");
+
+ return size;
+}
+EXPORT_SYMBOL_GPL(vivaldi_function_row_physmap_show);
+
+MODULE_LICENSE("GPL");
diff --git a/include/linux/input/vivaldi-keymap.h b/include/linux/input/vivaldi-keymap.h
new file mode 100644
index 000000000000..4023b65e1649
--- /dev/null
+++ b/include/linux/input/vivaldi-keymap.h
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _VIVALDI_KEYMAP_H
+#define _VIVALDI_KEYMAP_H
+
+#include <linux/types.h>
+
+#define VIVALDI_MIN_FN_ROW_KEY 1
+#define VIVALDI_MAX_FN_ROW_KEY 24
+
+/**
+ * struct vivaldi_data - Function row keymap data for ChromeOS vivaldi keyboards
+ * @function_row_physmap: An array of the encoded rows/columns for the top
+ * row function keys, in an order from left to right
+ * @num_function_row_keys: The number of top row keys in a custom keyboard
+ *
+ * This structure is supposed to be used by ChromeOS keyboards using
+ * the vivaldi keyboard function row design.
+ */
+struct vivaldi_data {
+ u16 function_row_physmap[VIVALDI_MAX_FN_ROW_KEY - VIVALDI_MIN_FN_ROW_KEY + 1];
+ int num_function_row_keys;
+};
+
+
+ssize_t vivaldi_function_row_physmap_show(const struct vivaldi_data *data,
+ char *buf);
+
+#endif /* _VIVALDI_KEYMAP_H */
--
https://chromeos.dev
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/5] HID: Extract vivaldi hid feature mapping for use in hid-hammer
2022-02-04 20:20 [PATCH 0/5] Input/HID: Consolidate ChromeOS Vivaldi keyboard logic Stephen Boyd
2022-02-04 20:20 ` [PATCH 1/5] Input: atkbd: Convert function_row_physmap to u16 array Stephen Boyd
2022-02-04 20:20 ` [PATCH 2/5] Input: Extract ChromeOS vivaldi physmap show function Stephen Boyd
@ 2022-02-04 20:20 ` Stephen Boyd
2022-02-05 0:15 ` kernel test robot
2022-02-05 3:19 ` kernel test robot
2022-02-04 20:20 ` [PATCH 4/5] HID: google: Add support for vivaldi to hid-hammer Stephen Boyd
2022-02-04 20:20 ` [PATCH 5/5] HID: google: modify HID device groups of eel Stephen Boyd
4 siblings, 2 replies; 9+ messages in thread
From: Stephen Boyd @ 2022-02-04 20:20 UTC (permalink / raw)
To: benjamin.tissoires, Dmitry Torokhov, Jiri Kosina
Cc: linux-kernel, linux-input, Sean O'Brien, Douglas Anderson,
Zhengqiao Xia
We need to support parsing the HID device in both the vivaldi and the
hammer drivers so that we can properly expose the function row physmap
to userspace when a hammer device uses a vivaldi keyboard layout for the
function row keys. Extract the feature mapping logic from the vivaldi
driver into the vivaldi-keymap library so we can use it from both
HID drivers.
Cc: Jiri Kosina <jikos@kernel.org>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: "Sean O'Brien" <seobrien@chromium.org>
Cc: Douglas Anderson <dianders@chromium.org>
Cc: Zhengqiao Xia <xiazhengqiao@huaqin.corp-partner.google.com>
Signed-off-by: Stephen Boyd <swboyd@chromium.org>
---
drivers/hid/hid-vivaldi.c | 69 +---------------------
drivers/input/vivaldi-keymap.c | 86 ++++++++++++++++++++++++++++
include/linux/input/vivaldi-keymap.h | 9 +++
3 files changed, 97 insertions(+), 67 deletions(-)
diff --git a/drivers/hid/hid-vivaldi.c b/drivers/hid/hid-vivaldi.c
index 78ae3725bc89..361ba6200387 100644
--- a/drivers/hid/hid-vivaldi.c
+++ b/drivers/hid/hid-vivaldi.c
@@ -13,9 +13,6 @@
#include <linux/module.h>
#include <linux/sysfs.h>
-#define HID_VD_FN_ROW_PHYSMAP 0x00000001
-#define HID_USAGE_FN_ROW_PHYSMAP (HID_UP_GOOGLEVENDOR | HID_VD_FN_ROW_PHYSMAP)
-
static ssize_t function_row_physmap_show(struct device *dev,
struct device_attribute *attr,
char *buf)
@@ -60,70 +57,8 @@ static void vivaldi_feature_mapping(struct hid_device *hdev,
struct hid_usage *usage)
{
struct vivaldi_data *drvdata = hid_get_drvdata(hdev);
- struct hid_report *report = field->report;
- int fn_key;
- int ret;
- u32 report_len;
- u8 *report_data, *buf;
-
- if (field->logical != HID_USAGE_FN_ROW_PHYSMAP ||
- (usage->hid & HID_USAGE_PAGE) != HID_UP_ORDINAL)
- return;
-
- fn_key = (usage->hid & HID_USAGE);
- if (fn_key < VIVALDI_MIN_FN_ROW_KEY || fn_key > VIVALDI_MAX_FN_ROW_KEY)
- return;
- if (fn_key > drvdata->num_function_row_keys)
- drvdata->num_function_row_keys = fn_key;
-
- report_data = buf = hid_alloc_report_buf(report, GFP_KERNEL);
- if (!report_data)
- return;
-
- report_len = hid_report_len(report);
- if (!report->id) {
- /*
- * hid_hw_raw_request() will stuff report ID (which will be 0)
- * into the first byte of the buffer even for unnumbered
- * reports, so we need to account for this to avoid getting
- * -EOVERFLOW in return.
- * Note that hid_alloc_report_buf() adds 7 bytes to the size
- * so we can safely say that we have space for an extra byte.
- */
- report_len++;
- }
-
- ret = hid_hw_raw_request(hdev, report->id, report_data,
- report_len, HID_FEATURE_REPORT,
- HID_REQ_GET_REPORT);
- if (ret < 0) {
- dev_warn(&hdev->dev, "failed to fetch feature %d\n",
- field->report->id);
- goto out;
- }
-
- if (!report->id) {
- /*
- * Undo the damage from hid_hw_raw_request() for unnumbered
- * reports.
- */
- report_data++;
- report_len--;
- }
-
- ret = hid_report_raw_event(hdev, HID_FEATURE_REPORT, report_data,
- report_len, 0);
- if (ret) {
- dev_warn(&hdev->dev, "failed to report feature %d\n",
- field->report->id);
- goto out;
- }
-
- drvdata->function_row_physmap[fn_key - VIVALDI_MIN_FN_ROW_KEY] =
- field->value[usage->usage_index];
-
-out:
- kfree(buf);
+
+ vivaldi_hid_feature_mapping(drvdata, hdev, field, usage);
}
static int vivaldi_input_configured(struct hid_device *hdev,
diff --git a/drivers/input/vivaldi-keymap.c b/drivers/input/vivaldi-keymap.c
index da6dc4070216..7d472b8126b2 100644
--- a/drivers/input/vivaldi-keymap.c
+++ b/drivers/input/vivaldi-keymap.c
@@ -6,6 +6,7 @@
*/
#include <linux/export.h>
+#include <linux/hid.h>
#include <linux/input/vivaldi-keymap.h>
#include <linux/kernel.h>
#include <linux/module.h>
@@ -36,4 +37,89 @@ ssize_t vivaldi_function_row_physmap_show(const struct vivaldi_data *data,
}
EXPORT_SYMBOL_GPL(vivaldi_function_row_physmap_show);
+#if IS_ENABLED(CONFIG_HID)
+
+#define HID_VD_FN_ROW_PHYSMAP 0x00000001
+#define HID_USAGE_FN_ROW_PHYSMAP (HID_UP_GOOGLEVENDOR | HID_VD_FN_ROW_PHYSMAP)
+
+/**
+ * vivaldi_hid_feature_mapping - Fill out vivaldi keymap data exposed via HID
+ * @data: The vivaldi function keymap
+ * @hdev: HID device to parse
+ * @field: HID field to parse
+ * @usage: HID usage to parse
+ */
+void vivaldi_hid_feature_mapping(struct vivaldi_data *data,
+ struct hid_device *hdev,
+ struct hid_field *field,
+ struct hid_usage *usage)
+{
+ struct hid_report *report = field->report;
+ int fn_key;
+ int ret;
+ u32 report_len;
+ u8 *report_data, *buf;
+
+ if (field->logical != HID_USAGE_FN_ROW_PHYSMAP ||
+ (usage->hid & HID_USAGE_PAGE) != HID_UP_ORDINAL)
+ return;
+
+ fn_key = (usage->hid & HID_USAGE);
+ if (fn_key < VIVALDI_MIN_FN_ROW_KEY || fn_key > VIVALDI_MAX_FN_ROW_KEY)
+ return;
+ if (fn_key > data->num_function_row_keys)
+ data->num_function_row_keys = fn_key;
+
+ report_data = buf = hid_alloc_report_buf(report, GFP_KERNEL);
+ if (!report_data)
+ return;
+
+ report_len = hid_report_len(report);
+ if (!report->id) {
+ /*
+ * hid_hw_raw_request() will stuff report ID (which will be 0)
+ * into the first byte of the buffer even for unnumbered
+ * reports, so we need to account for this to avoid getting
+ * -EOVERFLOW in return.
+ * Note that hid_alloc_report_buf() adds 7 bytes to the size
+ * so we can safely say that we have space for an extra byte.
+ */
+ report_len++;
+ }
+
+ ret = hid_hw_raw_request(hdev, report->id, report_data,
+ report_len, HID_FEATURE_REPORT,
+ HID_REQ_GET_REPORT);
+ if (ret < 0) {
+ dev_warn(&hdev->dev, "failed to fetch feature %d\n",
+ field->report->id);
+ goto out;
+ }
+
+ if (!report->id) {
+ /*
+ * Undo the damage from hid_hw_raw_request() for unnumbered
+ * reports.
+ */
+ report_data++;
+ report_len--;
+ }
+
+ ret = hid_report_raw_event(hdev, HID_FEATURE_REPORT, report_data,
+ report_len, 0);
+ if (ret) {
+ dev_warn(&hdev->dev, "failed to report feature %d\n",
+ field->report->id);
+ goto out;
+ }
+
+ data->function_row_physmap[fn_key - VIVALDI_MIN_FN_ROW_KEY] =
+ field->value[usage->usage_index];
+
+out:
+ kfree(buf);
+}
+EXPORT_SYMBOL_GPL(vivaldi_hid_feature_mapping);
+#endif /* CONFIG_HID */
+
MODULE_LICENSE("GPL");
diff --git a/include/linux/input/vivaldi-keymap.h b/include/linux/input/vivaldi-keymap.h
index 4023b65e1649..7cf5bc650fed 100644
--- a/include/linux/input/vivaldi-keymap.h
+++ b/include/linux/input/vivaldi-keymap.h
@@ -4,6 +4,10 @@
#include <linux/types.h>
+struct hid_device;
+struct hid_field;
+struct hid_usage;
+
#define VIVALDI_MIN_FN_ROW_KEY 1
#define VIVALDI_MAX_FN_ROW_KEY 24
@@ -25,4 +29,9 @@ struct vivaldi_data {
ssize_t vivaldi_function_row_physmap_show(const struct vivaldi_data *data,
char *buf);
+void vivaldi_hid_feature_mapping(struct vivaldi_data *data,
+ struct hid_device *hdev,
+ struct hid_field *field,
+ struct hid_usage *usage);
+
#endif /* _VIVALDI_KEYMAP_H */
--
https://chromeos.dev
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 3/5] HID: Extract vivaldi hid feature mapping for use in hid-hammer
2022-02-04 20:20 ` [PATCH 3/5] HID: Extract vivaldi hid feature mapping for use in hid-hammer Stephen Boyd
@ 2022-02-05 0:15 ` kernel test robot
2022-02-05 2:19 ` Stephen Boyd
2022-02-05 3:19 ` kernel test robot
1 sibling, 1 reply; 9+ messages in thread
From: kernel test robot @ 2022-02-05 0:15 UTC (permalink / raw)
To: Stephen Boyd, benjamin.tissoires, Dmitry Torokhov, Jiri Kosina
Cc: kbuild-all, linux-kernel, linux-input, Sean O'Brien,
Douglas Anderson, Zhengqiao Xia
Hi Stephen,
I love your patch! Yet something to improve:
[auto build test ERROR on 26291c54e111ff6ba87a164d85d4a4e134b7315c]
url: https://github.com/0day-ci/linux/commits/Stephen-Boyd/Input-HID-Consolidate-ChromeOS-Vivaldi-keyboard-logic/20220205-042211
base: 26291c54e111ff6ba87a164d85d4a4e134b7315c
config: x86_64-randconfig-a004-20220131 (https://download.01.org/0day-ci/archive/20220205/202202050807.BvUyitVE-lkp@intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build):
# https://github.com/0day-ci/linux/commit/83759eb892fd16fd0bb7ff4bb0c4baa4e7a0283e
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Stephen-Boyd/Input-HID-Consolidate-ChromeOS-Vivaldi-keyboard-logic/20220205-042211
git checkout 83759eb892fd16fd0bb7ff4bb0c4baa4e7a0283e
# save the config file to linux build tree
mkdir build_dir
make W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
vmlinux.o: warning: objtool: mce_start()+0x4e: call to clear_bit() leaves .noinstr.text section
vmlinux.o: warning: objtool: mce_read_aux()+0x41: call to mca_msr_reg() leaves .noinstr.text section
vmlinux.o: warning: objtool: do_machine_check()+0x39d: call to test_bit() leaves .noinstr.text section
vmlinux.o: warning: objtool: enter_from_user_mode()+0x4e: call to on_thread_stack() leaves .noinstr.text section
vmlinux.o: warning: objtool: syscall_enter_from_user_mode()+0x53: call to on_thread_stack() leaves .noinstr.text section
vmlinux.o: warning: objtool: syscall_enter_from_user_mode_prepare()+0x4e: call to on_thread_stack() leaves .noinstr.text section
vmlinux.o: warning: objtool: irqentry_enter_from_user_mode()+0x4e: call to on_thread_stack() leaves .noinstr.text section
ld: drivers/input/vivaldi-keymap.o: in function `vivaldi_hid_feature_mapping':
>> drivers/input/vivaldi-keymap.c:73: undefined reference to `hid_alloc_report_buf'
>> ld: drivers/input/vivaldi-keymap.c:90: undefined reference to `hid_hw_raw_request'
>> ld: drivers/input/vivaldi-keymap.c:108: undefined reference to `hid_report_raw_event'
vim +73 drivers/input/vivaldi-keymap.c
44
45 /**
46 * vivaldi_hid_feature_mapping - Fill out vivaldi keymap data exposed via HID
47 * @data: The vivaldi function keymap
48 * @hdev: HID device to parse
49 * @field: HID field to parse
50 * @usage: HID usage to parse
51 */
52 void vivaldi_hid_feature_mapping(struct vivaldi_data *data,
53 struct hid_device *hdev,
54 struct hid_field *field,
55 struct hid_usage *usage)
56 {
57 struct hid_report *report = field->report;
58 int fn_key;
59 int ret;
60 u32 report_len;
61 u8 *report_data, *buf;
62
63 if (field->logical != HID_USAGE_FN_ROW_PHYSMAP ||
64 (usage->hid & HID_USAGE_PAGE) != HID_UP_ORDINAL)
65 return;
66
67 fn_key = (usage->hid & HID_USAGE);
68 if (fn_key < VIVALDI_MIN_FN_ROW_KEY || fn_key > VIVALDI_MAX_FN_ROW_KEY)
69 return;
70 if (fn_key > data->num_function_row_keys)
71 data->num_function_row_keys = fn_key;
72
> 73 report_data = buf = hid_alloc_report_buf(report, GFP_KERNEL);
74 if (!report_data)
75 return;
76
77 report_len = hid_report_len(report);
78 if (!report->id) {
79 /*
80 * hid_hw_raw_request() will stuff report ID (which will be 0)
81 * into the first byte of the buffer even for unnumbered
82 * reports, so we need to account for this to avoid getting
83 * -EOVERFLOW in return.
84 * Note that hid_alloc_report_buf() adds 7 bytes to the size
85 * so we can safely say that we have space for an extra byte.
86 */
87 report_len++;
88 }
89
> 90 ret = hid_hw_raw_request(hdev, report->id, report_data,
91 report_len, HID_FEATURE_REPORT,
92 HID_REQ_GET_REPORT);
93 if (ret < 0) {
94 dev_warn(&hdev->dev, "failed to fetch feature %d\n",
95 field->report->id);
96 goto out;
97 }
98
99 if (!report->id) {
100 /*
101 * Undo the damage from hid_hw_raw_request() for unnumbered
102 * reports.
103 */
104 report_data++;
105 report_len--;
106 }
107
> 108 ret = hid_report_raw_event(hdev, HID_FEATURE_REPORT, report_data,
109 report_len, 0);
110 if (ret) {
111 dev_warn(&hdev->dev, "failed to report feature %d\n",
112 field->report->id);
113 goto out;
114 }
115
116 data->function_row_physmap[fn_key - VIVALDI_MIN_FN_ROW_KEY] =
117 field->value[usage->usage_index];
118
119 out:
120 kfree(buf);
121 }
122 EXPORT_SYMBOL_GPL(vivaldi_hid_feature_mapping);
123 #endif /* CONFIG_HID */
124
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/5] HID: Extract vivaldi hid feature mapping for use in hid-hammer
2022-02-05 0:15 ` kernel test robot
@ 2022-02-05 2:19 ` Stephen Boyd
0 siblings, 0 replies; 9+ messages in thread
From: Stephen Boyd @ 2022-02-05 2:19 UTC (permalink / raw)
To: Dmitry Torokhov, Jiri Kosina, benjamin.tissoires,
kernel test robot
Cc: kbuild-all, linux-kernel, linux-input, Sean O'Brien,
Douglas Anderson, Zhengqiao Xia
Quoting kernel test robot (2022-02-04 16:15:59)
> Hi Stephen,
>
> I love your patch! Yet something to improve:
>
> [auto build test ERROR on 26291c54e111ff6ba87a164d85d4a4e134b7315c]
>
> url: https://github.com/0day-ci/linux/commits/Stephen-Boyd/Input-HID-Consolidate-ChromeOS-Vivaldi-keyboard-logic/20220205-042211
> base: 26291c54e111ff6ba87a164d85d4a4e134b7315c
> config: x86_64-randconfig-a004-20220131 (https://download.01.org/0day-ci/archive/20220205/202202050807.BvUyitVE-lkp@intel.com/config)
> compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
> reproduce (this is a W=1 build):
> # https://github.com/0day-ci/linux/commit/83759eb892fd16fd0bb7ff4bb0c4baa4e7a0283e
> git remote add linux-review https://github.com/0day-ci/linux
> git fetch --no-tags linux-review Stephen-Boyd/Input-HID-Consolidate-ChromeOS-Vivaldi-keyboard-logic/20220205-042211
> git checkout 83759eb892fd16fd0bb7ff4bb0c4baa4e7a0283e
> # save the config file to linux build tree
> mkdir build_dir
> make W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash
>
> If you fix the issue, kindly add following tag as appropriate
> Reported-by: kernel test robot <lkp@intel.com>
>
> All errors (new ones prefixed by >>):
>
> vmlinux.o: warning: objtool: mce_start()+0x4e: call to clear_bit() leaves .noinstr.text section
> vmlinux.o: warning: objtool: mce_read_aux()+0x41: call to mca_msr_reg() leaves .noinstr.text section
> vmlinux.o: warning: objtool: do_machine_check()+0x39d: call to test_bit() leaves .noinstr.text section
> vmlinux.o: warning: objtool: enter_from_user_mode()+0x4e: call to on_thread_stack() leaves .noinstr.text section
> vmlinux.o: warning: objtool: syscall_enter_from_user_mode()+0x53: call to on_thread_stack() leaves .noinstr.text section
> vmlinux.o: warning: objtool: syscall_enter_from_user_mode_prepare()+0x4e: call to on_thread_stack() leaves .noinstr.text section
> vmlinux.o: warning: objtool: irqentry_enter_from_user_mode()+0x4e: call to on_thread_stack() leaves .noinstr.text section
> ld: drivers/input/vivaldi-keymap.o: in function `vivaldi_hid_feature_mapping':
> >> drivers/input/vivaldi-keymap.c:73: undefined reference to `hid_alloc_report_buf'
> >> ld: drivers/input/vivaldi-keymap.c:90: undefined reference to `hid_hw_raw_request'
> >> ld: drivers/input/vivaldi-keymap.c:108: undefined reference to `hid_report_raw_event'
>
Ah I see. CONFIG_HID=m but CONFIG_VIVALDIFMAP=y so we need to make the
whole file into a module when CONFIG_HID is a module, but then that
means the atkbd driver would need to be a module too. Probably best to
move this hid part to yet another file in drivers/hid/ to keep things
tidy.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/5] HID: Extract vivaldi hid feature mapping for use in hid-hammer
2022-02-04 20:20 ` [PATCH 3/5] HID: Extract vivaldi hid feature mapping for use in hid-hammer Stephen Boyd
2022-02-05 0:15 ` kernel test robot
@ 2022-02-05 3:19 ` kernel test robot
1 sibling, 0 replies; 9+ messages in thread
From: kernel test robot @ 2022-02-05 3:19 UTC (permalink / raw)
To: Stephen Boyd, benjamin.tissoires, Dmitry Torokhov, Jiri Kosina
Cc: kbuild-all, linux-kernel, linux-input, Sean O'Brien,
Douglas Anderson, Zhengqiao Xia
Hi Stephen,
I love your patch! Yet something to improve:
[auto build test ERROR on 26291c54e111ff6ba87a164d85d4a4e134b7315c]
url: https://github.com/0day-ci/linux/commits/Stephen-Boyd/Input-HID-Consolidate-ChromeOS-Vivaldi-keyboard-logic/20220205-042211
base: 26291c54e111ff6ba87a164d85d4a4e134b7315c
config: s390-randconfig-r014-20220130 (https://download.01.org/0day-ci/archive/20220205/202202051134.yIxi48BD-lkp@intel.com/config)
compiler: s390-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/83759eb892fd16fd0bb7ff4bb0c4baa4e7a0283e
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Stephen-Boyd/Input-HID-Consolidate-ChromeOS-Vivaldi-keyboard-logic/20220205-042211
git checkout 83759eb892fd16fd0bb7ff4bb0c4baa4e7a0283e
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=s390 SHELL=/bin/bash
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
s390-linux-ld: drivers/dma/idma64.o: in function `idma64_platform_probe':
idma64.c:(.text+0x1336): undefined reference to `devm_ioremap_resource'
s390-linux-ld: drivers/input/vivaldi-keymap.o: in function `vivaldi_hid_feature_mapping':
>> (.text+0x13e): undefined reference to `hid_alloc_report_buf'
>> s390-linux-ld: (.text+0x18c): undefined reference to `hid_hw_raw_request'
>> s390-linux-ld: (.text+0x1e8): undefined reference to `hid_report_raw_event'
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 4/5] HID: google: Add support for vivaldi to hid-hammer
2022-02-04 20:20 [PATCH 0/5] Input/HID: Consolidate ChromeOS Vivaldi keyboard logic Stephen Boyd
` (2 preceding siblings ...)
2022-02-04 20:20 ` [PATCH 3/5] HID: Extract vivaldi hid feature mapping for use in hid-hammer Stephen Boyd
@ 2022-02-04 20:20 ` Stephen Boyd
2022-02-04 20:20 ` [PATCH 5/5] HID: google: modify HID device groups of eel Stephen Boyd
4 siblings, 0 replies; 9+ messages in thread
From: Stephen Boyd @ 2022-02-04 20:20 UTC (permalink / raw)
To: benjamin.tissoires, Dmitry Torokhov, Jiri Kosina
Cc: linux-kernel, linux-input, Sean O'Brien, Douglas Anderson,
Zhengqiao Xia
Add support to the hammer driver to parse vivaldi keyboard layouts and
expose them to userspace. This allows hammer devices to use vivaldi
function row keys while also supporting the other features this driver
supports, like the CBAS (chrome base attached switch) and a keyboard
backlight.
Cc: Jiri Kosina <jikos@kernel.org>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: "Sean O'Brien" <seobrien@chromium.org>
Cc: Douglas Anderson <dianders@chromium.org>
Cc: Zhengqiao Xia <xiazhengqiao@huaqin.corp-partner.google.com>
Signed-off-by: Stephen Boyd <swboyd@chromium.org>
---
drivers/hid/Kconfig | 1 +
drivers/hid/hid-google-hammer.c | 95 +++++++++++++++++++++++++--------
2 files changed, 75 insertions(+), 21 deletions(-)
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index 5569a2029dab..070c4c8128e8 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -405,6 +405,7 @@ config HOLTEK_FF
config HID_GOOGLE_HAMMER
tristate "Google Hammer Keyboard"
+ select INPUT_VIVALDIFMAP
depends on USB_HID && LEDS_CLASS && CROS_EC
help
Say Y here if you have a Google Hammer device.
diff --git a/drivers/hid/hid-google-hammer.c b/drivers/hid/hid-google-hammer.c
index 0403beb3104b..e3dd26ddbd43 100644
--- a/drivers/hid/hid-google-hammer.c
+++ b/drivers/hid/hid-google-hammer.c
@@ -15,6 +15,7 @@
#include <linux/acpi.h>
#include <linux/hid.h>
+#include <linux/input/vivaldi-keymap.h>
#include <linux/leds.h>
#include <linux/module.h>
#include <linux/of.h>
@@ -22,6 +23,7 @@
#include <linux/platform_data/cros_ec_proto.h>
#include <linux/platform_device.h>
#include <linux/pm_wakeup.h>
+#include <linux/sysfs.h>
#include <asm/unaligned.h>
#include "hid-ids.h"
@@ -300,6 +302,11 @@ struct hammer_kbd_leds {
u8 buf[2] ____cacheline_aligned;
};
+struct hammer_drvdata {
+ struct vivaldi_data vdata;
+ struct hammer_kbd_leds leds;
+};
+
static int hammer_kbd_brightness_set_blocking(struct led_classdev *cdev,
enum led_brightness br)
{
@@ -337,15 +344,11 @@ static int hammer_kbd_brightness_set_blocking(struct led_classdev *cdev,
return ret;
}
-static int hammer_register_leds(struct hid_device *hdev)
+static int hammer_register_leds(struct hammer_drvdata *hdata, struct hid_device *hdev)
{
struct hammer_kbd_leds *kbd_backlight;
- int error;
-
- kbd_backlight = kzalloc(sizeof(*kbd_backlight), GFP_KERNEL);
- if (!kbd_backlight)
- return -ENOMEM;
+ kbd_backlight = &hdata->leds;
kbd_backlight->hdev = hdev;
kbd_backlight->cdev.name = "hammer::kbd_backlight";
kbd_backlight->cdev.max_brightness = MAX_BRIGHTNESS;
@@ -356,26 +359,16 @@ static int hammer_register_leds(struct hid_device *hdev)
/* Set backlight to 0% initially. */
hammer_kbd_brightness_set_blocking(&kbd_backlight->cdev, 0);
- error = led_classdev_register(&hdev->dev, &kbd_backlight->cdev);
- if (error)
- goto err_free_mem;
-
- hid_set_drvdata(hdev, kbd_backlight);
- return 0;
-
-err_free_mem:
- kfree(kbd_backlight);
- return error;
+ return led_classdev_register(&hdev->dev, &kbd_backlight->cdev);
}
static void hammer_unregister_leds(struct hid_device *hdev)
{
- struct hammer_kbd_leds *kbd_backlight = hid_get_drvdata(hdev);
+ struct hammer_drvdata *hdata = hid_get_drvdata(hdev);
+ struct hammer_kbd_leds *kbd_backlight = &hdata->leds;
- if (kbd_backlight) {
+ if (kbd_backlight)
led_classdev_unregister(&kbd_backlight->cdev);
- kfree(kbd_backlight);
- }
}
#define HID_UP_GOOGLEVENDOR 0xffd10000
@@ -385,6 +378,58 @@ static void hammer_unregister_leds(struct hid_device *hdev)
/* HID usage for keyboard backlight (Alphanumeric display brightness) */
#define HID_AD_BRIGHTNESS 0x00140046
+static void hammer_feature_mapping(struct hid_device *hdev,
+ struct hid_field *field,
+ struct hid_usage *usage)
+{
+ struct hammer_drvdata *hdata = hid_get_drvdata(hdev);
+
+ vivaldi_hid_feature_mapping(&hdata->vdata, hdev, field, usage);
+}
+
+static ssize_t function_row_physmap_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ struct hid_device *hdev = to_hid_device(dev);
+ struct hammer_drvdata *hdata = hid_get_drvdata(hdev);
+ struct vivaldi_data *vdata = &hdata->vdata;
+
+ return vivaldi_function_row_physmap_show(vdata, buf);
+}
+
+static DEVICE_ATTR_RO(function_row_physmap);
+static struct attribute *hammer_sysfs_attrs[] = {
+ &dev_attr_function_row_physmap.attr,
+ NULL
+};
+
+static umode_t hammer_attr_is_visible(struct kobject *kobj,
+ struct attribute *attr, int n)
+{
+ struct device *dev = kobj_to_dev(kobj);
+ struct hid_device *hdev = to_hid_device(dev);
+ struct hammer_drvdata *hdata = hid_get_drvdata(hdev);
+ struct vivaldi_data *vdata = &hdata->vdata;
+
+ if (attr == &dev_attr_function_row_physmap.attr &&
+ !vdata->num_function_row_keys)
+ return 0;
+
+ return attr->mode;
+}
+
+static const struct attribute_group input_attribute_group = {
+ .is_visible = hammer_attr_is_visible,
+ .attrs = hammer_sysfs_attrs,
+};
+
+static int hammer_input_configured(struct hid_device *hdev,
+ struct hid_input *hidinput)
+{
+ return sysfs_create_group(&hdev->dev.kobj, &input_attribute_group);
+}
+
static int hammer_input_mapping(struct hid_device *hdev, struct hid_input *hi,
struct hid_field *field,
struct hid_usage *usage,
@@ -516,6 +561,12 @@ static int hammer_probe(struct hid_device *hdev,
const struct hid_device_id *id)
{
int error;
+ struct hammer_drvdata *hdata;
+
+ hdata = devm_kzalloc(&hdev->dev, sizeof(*hdata), GFP_KERNEL);
+ if (!hdata)
+ return -ENOMEM;
+ hid_set_drvdata(hdev, hdata);
error = hid_parse(hdev);
if (error)
@@ -541,7 +592,7 @@ static int hammer_probe(struct hid_device *hdev,
}
if (hammer_has_backlight_control(hdev)) {
- error = hammer_register_leds(hdev);
+ error = hammer_register_leds(hdata, hdev);
if (error)
hid_warn(hdev,
"Failed to register keyboard backlight: %d\n",
@@ -610,6 +661,8 @@ static struct hid_driver hammer_driver = {
.id_table = hammer_devices,
.probe = hammer_probe,
.remove = hammer_remove,
+ .feature_mapping = hammer_feature_mapping,
+ .input_configured = hammer_input_configured,
.input_mapping = hammer_input_mapping,
.event = hammer_event,
};
--
https://chromeos.dev
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 5/5] HID: google: modify HID device groups of eel
2022-02-04 20:20 [PATCH 0/5] Input/HID: Consolidate ChromeOS Vivaldi keyboard logic Stephen Boyd
` (3 preceding siblings ...)
2022-02-04 20:20 ` [PATCH 4/5] HID: google: Add support for vivaldi to hid-hammer Stephen Boyd
@ 2022-02-04 20:20 ` Stephen Boyd
4 siblings, 0 replies; 9+ messages in thread
From: Stephen Boyd @ 2022-02-04 20:20 UTC (permalink / raw)
To: benjamin.tissoires, Dmitry Torokhov, Jiri Kosina
Cc: Zhengqiao Xia, linux-kernel, linux-input, Sean O'Brien,
Douglas Anderson
From: Zhengqiao Xia <xiazhengqiao@huaqin.corp-partner.google.com>
If HID_GROUP of eel is set to HID_GROUP_GENERIC, Whiskers Tablet Mode
Switch of eel hammer will not be detected by system because the
hid-vivaldi driver probes the device. When it is set to
HID_GROUP_VIVALDI, system will detect Whiskers Tablet Mode Switch
successfully and also support the vivaldi keyboard layout.
Cc: Jiri Kosina <jikos@kernel.org>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: "Sean O'Brien" <seobrien@chromium.org>
Cc: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Zhengqiao Xia <xiazhengqiao@huaqin.corp-partner.google.com>
[swboyd@chromium.org: Expand on commit text]
Signed-off-by: Stephen Boyd <swboyd@chromium.org>
---
drivers/hid/hid-google-hammer.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/hid/hid-google-hammer.c b/drivers/hid/hid-google-hammer.c
index e3dd26ddbd43..8ed75bb0878f 100644
--- a/drivers/hid/hid-google-hammer.c
+++ b/drivers/hid/hid-google-hammer.c
@@ -636,7 +636,7 @@ static void hammer_remove(struct hid_device *hdev)
static const struct hid_device_id hammer_devices[] = {
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_DON) },
- { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
+ { HID_DEVICE(BUS_USB, HID_GROUP_VIVALDI,
USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_EEL) },
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_HAMMER) },
--
https://chromeos.dev
^ permalink raw reply related [flat|nested] 9+ messages in thread