From patchwork Thu Nov 24 23:38:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Philipp Jungkamp X-Patchwork-Id: 13055442 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id F3023C4321E for ; Thu, 24 Nov 2022 23:39:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229628AbiKXXjY (ORCPT ); Thu, 24 Nov 2022 18:39:24 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41306 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229610AbiKXXjX (ORCPT ); Thu, 24 Nov 2022 18:39:23 -0500 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C066C114 for ; Thu, 24 Nov 2022 15:39:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=s31663417; t=1669333151; bh=0jrerNMb+e60kdB7M2+lqvJIkDKfWYsOH8tEzrP3zmE=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=irXDHmkUkrwMLYojK0KbXAaqQcnXs7R4Cl4oewjaX4TVBkSgI0H8UQxKYHLkH0uUI DOvU39yWbNlE/9t3+zIqKVz7KBuUz+DPO54lBATeyZ4mLanuIqaIM1BZTDgrpqvzrC sYcoRDihJpxhBpCWMb+dKBtzS1hpsnM0bKHkT5B+DjXHCvmSXNyUXFgKHK0+0smAYB kMNu1VIpaQMKMmofA2hfJrga7yrMJX6Zow4o5KGQssWP5y53Sw5wSEVubas6FfgeoG 9D2zlqwdY3kU8JLCVqW+v/55RRYwtU5+qZiigdp+FY9/J2MuuGR4I04+pmKgZ0+5Vl Ae6sKhuAVza0g== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.localdomain ([95.223.45.67]) by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1Mwwdf-1ooPYq0Zop-00yQsm; Fri, 25 Nov 2022 00:39:11 +0100 From: Philipp Jungkamp To: Jiri Kosina , Jonathan Cameron , Srinivas Pandruvada Cc: linux-iio@vger.kernel.org, Philipp Jungkamp Subject: [PATCH v4 1/4] HID: hid-sensor-custom: Allow more custom iio sensors Date: Fri, 25 Nov 2022 00:38:38 +0100 Message-Id: <20221124233841.3103-2-p.jungkamp@gmx.net> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221124233841.3103-1-p.jungkamp@gmx.net> References: <20221124233841.3103-1-p.jungkamp@gmx.net> MIME-Version: 1.0 X-Provags-ID: V03:K1:2vLAn9dx+ltvboXjwMBpxnZcHaoIP0ntkNx9HI4p1jOYtBbHyjk 9jex34BSEty/BDBWrSzAIFyXOIjtgYE9hbALHbfmveATjvuphsfnvoGfClpVI4Unfelj83C 3VqxVnpnnkP51v1kInsj7u/uWkcjbdGlnB2QWBgMP34d0mpKTQVJakmUheyC5ZQ/N2TBdBB NmP6tZ6+hn1KpRB0xDHmg== UI-OutboundReport: notjunk:1;M01:P0:zn6TvUUtObA=;XtwIw3EqbgTT5SQ6RJSO9LeNwTl pvnuA79eDt9DJNQrIaJaOgNA35DGZgh9dCtbiNbzHo/Ox3ubhyDMCTIO8d7lbAkP38Agaf8nm cgnNHSogSAGMJuHdxOWudLdk2hbZcienCoS1L9yXx3wugF2Bv7LG26o8nmyzPnBg5VMsOrXJP 4B4exyiEUr7m9DUQ3ybX/TjdM8MBHknCduZWAXCSh0ZRc7Bv+s9uaXPyTMUNLtLx/p9FA+FdE fCheTLAuoCSuP19eK6LI35GI0RYpV9vmtWT5Z3JRmiH+5xXBSH54xymdIBvI3IIvWr/BLWrKe 3V7q5dIpK149Hbj39lVCdC+mbU3O2muPPAttaX3/5/WXN+EmV6xKUYWJzN9CHroT+h/ealTRD +FftlKpbG7QgeH1Zl1gtR1UgX4+5kCqr/Wce+zP2lrwj+/IMWkBeUezW1iWu8+ZDsunZi0ytV a1nmU2pddglp90rXBWHrFiG4p05QXLM+MAFGZyqaoKwbnUweTKADFDG/7y2qmHkcPkjJOhUAc 2MTPy3ApJFETw6VDCrF/GJGU5H7PW9b8hfloQSGZSkc4fxHTPLQYuqpfECiboOpeVD3FM5D+C MxU5ApXdhV9+OqYYoNFu6YYjxOEojmgxBFjerN7H9t36kzaZFLq2gxo/iunqoQCD+jhxnmHnz yQ1x2KgqABjRRXUF6DXYFUrqej71D3kI9RHeAqfuwEXJ65ASiBB8HV3TBBSL+GVFVp0MnqEgt 07dRsFwj7A7ag740fvxhmK/1je3slg1xbUSvibDwtYie3hgf3hnCfUWXua6RFEI53BCcbw/oQ 7FWI0s9jKD1MBPLOR0ryOQ6xiNtErWerUBuo8K0Dp4R9gWXN6yWNaj5OGOdFH1wqvJ0s8Ik/F e8gJ7++nwjaLRv72RPHlJeWt5yy5oFLHyQgaiw344b8RAReUREu5lWGmYPl4lm18safbl0kKA P8hV5g== Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org The known LUID table for established/known custom HID sensors was limited to sensors with "INTEL" as manufacturer. But some vendors such as Lenovo also include fairly standard iio sensors (e.g. ambient light) in their custom sensors. Expand the known custom sensors table by a tag used for the platform device name and match sensors based on the LUID as well as optionally on model and manufacturer properties. Signed-off-by: Philipp Jungkamp Reviewed-by: Jonathan Cameron --- v2: - Remove unnecessary comments. - Change return type of functions to bool. (introduced an error, fixed in v4) - Swallows return value of a function. (fixed in v4) v3: - No change. v4: - Fix return value and error codes on property query. - Document and ignore return values for queries of optionally matched properties. - Don't modify *known in _get_known, return error when not matched. - Remove comment on newly added sensors from commit message. drivers/hid/hid-sensor-custom.c | 210 +++++++++++++++++++++----------- include/linux/hid-sensor-ids.h | 1 + 2 files changed, 139 insertions(+), 72 deletions(-) -- 2.38.1 diff --git a/drivers/hid/hid-sensor-custom.c b/drivers/hid/hid-sensor-custom.c index 32c2306e240d..734c6bde68fe 100644 --- a/drivers/hid/hid-sensor-custom.c +++ b/drivers/hid/hid-sensor-custom.c @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -750,114 +751,179 @@ static void hid_sensor_custom_dev_if_remove(struct hid_sensor_custom } -/* luid defined in FW (e.g. ISH). Maybe used to identify sensor. */ -static const char *const known_sensor_luid[] = { "020B000000000000" }; +/* + * Match a known custom sensor. + * tag and luid is mandatory. + */ +struct hid_sensor_custom_match { + const char *tag; + const char *luid; + const char *model; + const char *manufacturer; + bool check_dmi; + struct dmi_system_id dmi; +}; -static int get_luid_table_index(unsigned char *usage_str) -{ - int i; +/* + * Custom sensor properties used for matching. + */ +struct hid_sensor_custom_properties { + u16 serial_num[HID_CUSTOM_MAX_FEATURE_BYTES]; + u16 model[HID_CUSTOM_MAX_FEATURE_BYTES]; + u16 manufacturer[HID_CUSTOM_MAX_FEATURE_BYTES]; +}; - for (i = 0; i < ARRAY_SIZE(known_sensor_luid); i++) { - if (!strncmp(usage_str, known_sensor_luid[i], - strlen(known_sensor_luid[i]))) - return i; +static const struct hid_sensor_custom_match hid_sensor_custom_known_table[] = { + /* + * Intel Integrated Sensor Hub (ISH) + */ + { /* Intel ISH hinge */ + .tag = "INT", + .luid = "020B000000000000", + .manufacturer = "INTEL", + }, + {} +}; + +static bool hid_sensor_custom_prop_match_str(const u16 *prop, const char *match, + size_t count) +{ + while (count-- && *prop && *match) { + if (*prop != (u16) *match) + return false; + prop++; + match++; } - return -ENODEV; + return (count == -1) || *prop == (u16)*match; } -static int get_known_custom_sensor_index(struct hid_sensor_hub_device *hsdev) +static int hid_sensor_custom_get_prop(struct hid_sensor_hub_device *hsdev, + u32 prop_usage_id, size_t prop_size, + u16 *prop) { - struct hid_sensor_hub_attribute_info sensor_manufacturer = { 0 }; - struct hid_sensor_hub_attribute_info sensor_luid_info = { 0 }; - int report_size; + struct hid_sensor_hub_attribute_info prop_attr = { 0 }; int ret; - static u16 w_buf[HID_CUSTOM_MAX_FEATURE_BYTES]; - static char buf[HID_CUSTOM_MAX_FEATURE_BYTES]; - int i; - memset(w_buf, 0, sizeof(w_buf)); - memset(buf, 0, sizeof(buf)); + memset(prop, 0, prop_size); - /* get manufacturer info */ - ret = sensor_hub_input_get_attribute_info(hsdev, - HID_FEATURE_REPORT, hsdev->usage, - HID_USAGE_SENSOR_PROP_MANUFACTURER, &sensor_manufacturer); + ret = sensor_hub_input_get_attribute_info(hsdev, HID_FEATURE_REPORT, + hsdev->usage, prop_usage_id, + &prop_attr); if (ret < 0) return ret; - report_size = - sensor_hub_get_feature(hsdev, sensor_manufacturer.report_id, - sensor_manufacturer.index, sizeof(w_buf), - w_buf); - if (report_size <= 0) { - hid_err(hsdev->hdev, - "Failed to get sensor manufacturer info %d\n", - report_size); - return -ENODEV; + ret = sensor_hub_get_feature(hsdev, prop_attr.report_id, + prop_attr.index, prop_size, prop); + if (ret < 0) { + hid_err(hsdev->hdev, "Failed to get sensor property %08x %d\n", + prop_usage_id, ret); + return ret; } - /* convert from wide char to char */ - for (i = 0; i < ARRAY_SIZE(buf) - 1 && w_buf[i]; i++) - buf[i] = (char)w_buf[i]; + return 0; +} + +static bool +hid_sensor_custom_do_match(struct hid_sensor_hub_device *hsdev, + const struct hid_sensor_custom_match *match, + const struct hid_sensor_custom_properties *prop) +{ + struct dmi_system_id dmi[] = { match->dmi, { 0 } }; + + if (!hid_sensor_custom_prop_match_str(prop->serial_num, "LUID:", 5) || + !hid_sensor_custom_prop_match_str(prop->serial_num + 5, match->luid, + HID_CUSTOM_MAX_FEATURE_BYTES - 5)) + return false; + + if (match->model && + !hid_sensor_custom_prop_match_str(prop->model, match->model, + HID_CUSTOM_MAX_FEATURE_BYTES)) + return false; + + if (match->manufacturer && + !hid_sensor_custom_prop_match_str(prop->manufacturer, match->manufacturer, + HID_CUSTOM_MAX_FEATURE_BYTES)) + return false; - /* ensure it's ISH sensor */ - if (strncmp(buf, "INTEL", strlen("INTEL"))) - return -ENODEV; + if (match->check_dmi && !dmi_check_system(dmi)) + return false; - memset(w_buf, 0, sizeof(w_buf)); - memset(buf, 0, sizeof(buf)); + return true; +} - /* get real usage id */ - ret = sensor_hub_input_get_attribute_info(hsdev, - HID_FEATURE_REPORT, hsdev->usage, - HID_USAGE_SENSOR_PROP_SERIAL_NUM, &sensor_luid_info); +static int +hid_sensor_custom_properties_get(struct hid_sensor_hub_device *hsdev, + struct hid_sensor_custom_properties *prop) +{ + int ret; + + ret = hid_sensor_custom_get_prop(hsdev, + HID_USAGE_SENSOR_PROP_SERIAL_NUM, + HID_CUSTOM_MAX_FEATURE_BYTES, + prop->serial_num); if (ret < 0) return ret; - report_size = sensor_hub_get_feature(hsdev, sensor_luid_info.report_id, - sensor_luid_info.index, sizeof(w_buf), - w_buf); - if (report_size <= 0) { - hid_err(hsdev->hdev, "Failed to get real usage info %d\n", - report_size); - return -ENODEV; - } + /* + * Ignore errors on the following model and manufacturer properties. + * Because these are optional, it is not an error if they are missing. + */ + + hid_sensor_custom_get_prop(hsdev, HID_USAGE_SENSOR_PROP_MODEL, + HID_CUSTOM_MAX_FEATURE_BYTES, + prop->model); - /* convert from wide char to char */ - for (i = 0; i < ARRAY_SIZE(buf) - 1 && w_buf[i]; i++) - buf[i] = (char)w_buf[i]; + hid_sensor_custom_get_prop(hsdev, HID_USAGE_SENSOR_PROP_MANUFACTURER, + HID_CUSTOM_MAX_FEATURE_BYTES, + prop->manufacturer); - if (strlen(buf) != strlen(known_sensor_luid[0]) + 5) { - hid_err(hsdev->hdev, - "%s luid length not match %zu != (%zu + 5)\n", __func__, - strlen(buf), strlen(known_sensor_luid[0])); - return -ENODEV; + return 0; +} + +static int +hid_sensor_custom_get_known(struct hid_sensor_hub_device *hsdev, + const struct hid_sensor_custom_match **known) +{ + int ret; + const struct hid_sensor_custom_match *match = + hid_sensor_custom_known_table; + struct hid_sensor_custom_properties prop; + + ret = hid_sensor_custom_properties_get(hsdev, &prop); + if (ret < 0) + return ret; + + while (match->tag) { + if (hid_sensor_custom_do_match(hsdev, match, &prop)) { + *known = match; + return 0; + } + match++; } - /* get table index with luid (not matching 'LUID: ' in luid) */ - return get_luid_table_index(&buf[5]); + return -ENODATA; } static struct platform_device * hid_sensor_register_platform_device(struct platform_device *pdev, struct hid_sensor_hub_device *hsdev, - int index) + const struct hid_sensor_custom_match *match) { - char real_usage[HID_SENSOR_USAGE_LENGTH] = { 0 }; + char real_usage[HID_SENSOR_USAGE_LENGTH]; struct platform_device *custom_pdev; const char *dev_name; char *c; - /* copy real usage id */ - memcpy(real_usage, known_sensor_luid[index], 4); + memcpy(real_usage, match->luid, 4); /* usage id are all lowcase */ for (c = real_usage; *c != '\0'; c++) *c = tolower(*c); - /* HID-SENSOR-INT-REAL_USAGE_ID */ - dev_name = kasprintf(GFP_KERNEL, "HID-SENSOR-INT-%s", real_usage); + /* HID-SENSOR-TAG-REAL_USAGE_ID */ + dev_name = kasprintf(GFP_KERNEL, "HID-SENSOR-%s-%s", + match->tag, real_usage); if (!dev_name) return ERR_PTR(-ENOMEM); @@ -873,7 +939,7 @@ static int hid_sensor_custom_probe(struct platform_device *pdev) struct hid_sensor_custom *sensor_inst; struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data; int ret; - int index; + const struct hid_sensor_custom_match *match; sensor_inst = devm_kzalloc(&pdev->dev, sizeof(*sensor_inst), GFP_KERNEL); @@ -888,10 +954,10 @@ static int hid_sensor_custom_probe(struct platform_device *pdev) mutex_init(&sensor_inst->mutex); platform_set_drvdata(pdev, sensor_inst); - index = get_known_custom_sensor_index(hsdev); - if (index >= 0 && index < ARRAY_SIZE(known_sensor_luid)) { + ret = hid_sensor_custom_get_known(hsdev, &match); + if (!ret) { sensor_inst->custom_pdev = - hid_sensor_register_platform_device(pdev, hsdev, index); + hid_sensor_register_platform_device(pdev, hsdev, match); ret = PTR_ERR_OR_ZERO(sensor_inst->custom_pdev); if (ret) { diff --git a/include/linux/hid-sensor-ids.h b/include/linux/hid-sensor-ids.h index ac631159403a..13b1e65fbdcc 100644 --- a/include/linux/hid-sensor-ids.h +++ b/include/linux/hid-sensor-ids.h @@ -132,6 +132,7 @@ #define HID_USAGE_SENSOR_PROP_FRIENDLY_NAME 0x200301 #define HID_USAGE_SENSOR_PROP_SERIAL_NUM 0x200307 #define HID_USAGE_SENSOR_PROP_MANUFACTURER 0x200305 +#define HID_USAGE_SENSOR_PROP_MODEL 0x200306 #define HID_USAGE_SENSOR_PROP_REPORT_INTERVAL 0x20030E #define HID_USAGE_SENSOR_PROP_SENSITIVITY_ABS 0x20030F #define HID_USAGE_SENSOR_PROP_SENSITIVITY_RANGE_PCT 0x200310 From patchwork Thu Nov 24 23:38:39 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Philipp Jungkamp X-Patchwork-Id: 13055438 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E5A50C433FE for ; Thu, 24 Nov 2022 23:39:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229576AbiKXXjW (ORCPT ); Thu, 24 Nov 2022 18:39:22 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41282 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229502AbiKXXjV (ORCPT ); Thu, 24 Nov 2022 18:39:21 -0500 Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0F928114 for ; Thu, 24 Nov 2022 15:39:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=s31663417; t=1669333151; bh=+8OOqYEUTsfi8H6g215fSm9TUlssi2B+nqbTWLIQ4As=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=h+a+sshScMqdvnQJIjJLjHzclCdMPrusNIthVENPKDiMbmCVZLG93Qn0PMuTlzgF0 2O8pEP4Q7fKL3/pgbendoxEJG9qsB1hKC6CO3jd52mrsanB+ZrGd1SuURoV7QZO9QL 6bCGhyAp5MVioRmnFKViHezmCbnt4n8hDar+U4y4NsQeRz5XZy5q1ljtqZNTfOGvyL tWY2Me2x32ok1lgCLlR5m3eapRctnEP6DwZddbT2AVwTmu5PWLeFP299/ZuG+ycPpb QDqb7RBGxs0YM2HYV29shEASs1Cnqi7cEnDwx5KPVq0/hng6/I9FugWF/nY8GisxCc u8sJ45K07m8/Q== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.localdomain ([95.223.45.67]) by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MacOQ-1oS3C11pFa-00c6e5; Fri, 25 Nov 2022 00:39:11 +0100 From: Philipp Jungkamp To: Jiri Kosina , Jonathan Cameron , Srinivas Pandruvada Cc: linux-iio@vger.kernel.org, Philipp Jungkamp Subject: [PATCH v4 2/4] HID: hid-sensor-custom: Add LISS custom sensors Date: Fri, 25 Nov 2022 00:38:39 +0100 Message-Id: <20221124233841.3103-3-p.jungkamp@gmx.net> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221124233841.3103-1-p.jungkamp@gmx.net> References: <20221124233841.3103-1-p.jungkamp@gmx.net> MIME-Version: 1.0 X-Provags-ID: V03:K1:YZqrFCYAp0YlLltYKPVCXgace1TkEdx1kP6ZZw2DdmFQMyrGsb0 5gR2B1YCs28lenrFq/T7n8cEHi2GcoFvoNPl3dkS0fRKFrxQ9GQskv/lvX1tcVJv3xAoaHy 2tYLEhVwJdLHt4xGcSfj6vRGWVeiBELhxCTVcba3nnQUULmtJ1i84v67+H+ItrjSHl64QxT yId2h1hdNN9QJ1Abjn8lw== UI-OutboundReport: notjunk:1;M01:P0:bb9et17/9HM=;+Vov9dJBSznBgmMh/l+ePkFO+Me J+jRz/Z5JUuiHddSHiheS7WEdGd+RL7Vo4farfrYLidHB4PHwU6R/lxtzyLELBE4YYDdYkWdk UsCu2gjsYek/Q7XO0xhP1tICp/s5j7x6K/ZffsFTc0JSoA51piId8IyYgCRb4d3w2PgcCKZ9k XzJMaGV00Sy7WVFAcPZQr78Fb9tMg+XAFN2R2+bPOsE4DrQYqEY0P9+tMVxvW2gyNyTBurU11 MDHVFO7LpXwjWrpoQNrv41vFUqFNkKcPfiPsSEcmjaDSsNPML4yu3oGoEnyF6eUX7AYSyqr3e DZECzz1L3TXZIq0Pn7pACbTWDibr1LKELTI7MM/L+okH9B222NviYTSrDtSMd0AKb8+KPUIqb r4L1AaR2MZT6X/MiWYxNw/UDqCHSZ1BIItdsmdJzRlZo6ie2PBxnlomDOM5xDK5Gkn7YLerbV CmA9D72VCmo6Hr+4Kj3eFlwEVmkciFzdfWhGK2aZDVRDXUXp5NZVDQxiN0gIQDEW7AgW3++ap wUi+IvWgD5l2zhZyjxakfSHPeN8EmLDgl8syOM4SIdjqSTIP9x6SowjqYYMl4QnrUjIWrShY4 tsu96Usnxmse7T6e8RToQdyulKQPryOPykVUfLTFM9/HT9EKCg0gXodm/RX1i+nqfLzMfOIAc 1idrCFd0lx5DcHYGVjZDh2mnkhFmq4tHNKhnazT3KUy6VmEJvos0jufKTdUkpl0wR3k1tx0Tb oXD+qK0312RprmEFCFhI3r7O9/+RzXKGSzI3flbusVs0OW4PyB8Qr4SBeZ7J7YAeI/TlpfXYC zPs0mLhldZVEjCbHdusC8EtkZMqnsE6t8G/DOAIySX6+jYTM9ZI3ls3v8V+Su4zLZGSj3/rjS 3RZYvV0NtGqVDlS+P42bk6O7O4rXa1catUmDxvCiImz+noMjfjIxlCA1ocOu77DoMaUz9480P bcKz0FbpjUJtSy+bW79rJB2qBSw= Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org Add the Lenovo Intelligent Sensing Solution (LISS) custom sensors to the known custom sensors. Signed-off-by: Philipp Jungkamp Reviewed-by: Jonathan Cameron --- v2: - Create this 'noop' patch that just adds the LISS sensors to the custom sensor match table. v3: - Add missing 'Signed-Off-By' v4: - No change. drivers/hid/hid-sensor-custom.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) -- 2.38.1 diff --git a/drivers/hid/hid-sensor-custom.c b/drivers/hid/hid-sensor-custom.c index 734c6bde68fe..7c6e2e795753 100644 --- a/drivers/hid/hid-sensor-custom.c +++ b/drivers/hid/hid-sensor-custom.c @@ -782,6 +782,29 @@ static const struct hid_sensor_custom_match hid_sensor_custom_known_table[] = { .luid = "020B000000000000", .manufacturer = "INTEL", }, + /* + * Lenovo Intelligent Sensing Solution (LISS) + */ + { /* ambient light */ + .tag = "LISS", + .luid = "0041010200000082", + .model = "STK3X3X Sensor", + .manufacturer = "Vendor 258", + .check_dmi = true, + .dmi.matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + } + }, + { /* human presence */ + .tag = "LISS", + .luid = "0226000171AC0081", + .model = "VL53L1_HOD Sensor", + .manufacturer = "ST_MICRO", + .check_dmi = true, + .dmi.matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + } + }, {} }; From patchwork Thu Nov 24 23:38:40 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Philipp Jungkamp X-Patchwork-Id: 13055440 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 827DEC47088 for ; Thu, 24 Nov 2022 23:39:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229581AbiKXXjY (ORCPT ); Thu, 24 Nov 2022 18:39:24 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41304 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229518AbiKXXjW (ORCPT ); Thu, 24 Nov 2022 18:39:22 -0500 Received: from mout.gmx.net (mout.gmx.net [212.227.17.20]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 852A3C23 for ; Thu, 24 Nov 2022 15:39:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=s31663417; t=1669333151; bh=55itiq0RJA/gxMewSN5EVTJB0VSsjVh4MwDDftTJCHc=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=Ct7sODvzcc6lUcU+4J2DrSJg1hQ5HdScdcDC1n5WsGfBO4XvTpTyYCdKTT1rcyEa1 rVHLCnbriEPl0W4Kg4mYP+0LuaktlNDGf4nvWD3guBaJmpUSiaGYycQhFaEXHSktsS uGx1v8ABZJAy9mkXzLZCtf1KdUk2+5E/wAycXhrlNzs/SLC1iwH08QJLE7Ajoa7QvD nKksrTri5smRftO6zu0XbHIwRRyhiIY93yGUOaaovIX7sfC82n/Z0zAN3UJ9HjPbEv oEW0G02eLKASIh9v1XLdsAGytFNDpOxKPdwCOKKUbMe8oX61einYuIxcADcfZBuPP6 ExFsypNVlOIgA== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.localdomain ([95.223.45.67]) by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MfHEJ-1oWk9U36lv-00glTQ; Fri, 25 Nov 2022 00:39:11 +0100 From: Philipp Jungkamp To: Jiri Kosina , Jonathan Cameron , Srinivas Pandruvada Cc: linux-iio@vger.kernel.org, Philipp Jungkamp Subject: [PATCH v4 3/4] IIO: hid-sensor-als: Use generic usage Date: Fri, 25 Nov 2022 00:38:40 +0100 Message-Id: <20221124233841.3103-4-p.jungkamp@gmx.net> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221124233841.3103-1-p.jungkamp@gmx.net> References: <20221124233841.3103-1-p.jungkamp@gmx.net> MIME-Version: 1.0 X-Provags-ID: V03:K1:sBvQL6Dpxk25xDSZUudnIHMVTu/cwEuuJZZvFjvLhYmwXHQrSoj 7C0NjUWx7wrnF6birau46JiG8CLOjydYmYn4gQlvsbyT5Io83g03PTpVTsuHbdHnBq27DkL 3wWC741ZLgUH+aCBx7tyOQSR7OcDyvy7vjhcxGEXgAastLx2W3nGYhrRiRx0gkobQOHls29 tLxys+GWL7PcSaRUzZrYw== UI-OutboundReport: notjunk:1;M01:P0:LrRSrmRpVxk=;8dbPUAO0b5ZHbtWMQjdCnVidmmr rDk1VDPGiV/w9SXRDt4uCoYEUXf+ArCLpQk+IUmurKOMMQWcOzXHR8EVmM7HRfrhfHTky6gJP xJaOh5h713dBYNNiQKQkq8MsmHHP6ptyfBtOIKfw23rNzX2pjRG4qYZ7MMLPN1p7mydU0Gri6 Gq5+zGVhtMRbaf8LCu7uFTQIbmHbsrEd5+PYxOn/3WsIS0KJ1bakC5GV8HQHDCZlx07jo9/en FGztvh5vZzmjSK7bQwODBPKAmkikI/NlT2o0KsSV0u/C8JLRwP6v5tDM3AuU9ZKVgJC70b9nz 23QOiqxE/h3i41lIwu3im4eFHy3pDffjMzlOVtwCU7xkcuAl+g0SCApWo+PtLxUEJq4vbh/la ma8/fmcaYW9iiSFG26BU9Pga0Jq/6V6ZP8Twrvy3612OzvBJHNCUKx7s8EFVyFXRrbIxLE326 7klPDD3ydl5jlYoRBCiHhuBt/GcGiDr2zI01RH+zY9MoepRUWlXL+qVE9K4ywyv6A/DwyaMMG ri7lpqM3oLo+5S9f6MZqsbd8sWrFQCKtQEmviGkB30O8bYVsf+zMMXIaziVFEpOLHikayPbNl zo7IVHDGhy8wZBEBH4mtmuh/quICqN3klyx5GYscRdOIcBBj1wYOVWGxWtzkFpHUlmh/3f/TV Zq80pz0EYapOIuBXXP99Jo3Htdfz9VoW6rhYEG6dcZOVj4Xzxn517lJnp0WOAT+vlZvyOER4u FXTF6Top+IDOGB3MDJm3flZfjuOkIJXgkOtsrm9rIA9BjJZHYf/M6eCPc2/asBdBVHs0knnRM KRLUXMHEwraMXAmC2SQC+/5g1krF08Xy7n/wj+qcbN3wpWC9WIlSUz9shRzH8E/kdtdfnJHR8 N+KZh0DTfqivlu+V3cJEqXNv530T7vJuPKsr9tgxA9tEhM6wZLRhFsUIjTGT+g1RDfBk6Kvn6 MPUCRA== Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org Use a generic 'hsdev->usage' instead of the HID_USAGE_SENSOR_ALS to allow this driver to drive the Lenovo custom ambient light sensor, which is registered under a 'custom' usage and not HID_USAGE_SENSOR_ALS. Add the Lenovo Intelligent Sensing Solution (LISS) ambient light sensor to the platform device ids. Signed-off-by: Philipp Jungkamp Reviewed-by: Jonathan Cameron --- v2: - Remove some unnecessary newlines in function calls. v3: - No change. v4: - No change. drivers/iio/light/hid-sensor-als.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) -- 2.38.1 diff --git a/drivers/iio/light/hid-sensor-als.c b/drivers/iio/light/hid-sensor-als.c index 5a1a625d8d16..eb1aedad7edc 100644 --- a/drivers/iio/light/hid-sensor-als.c +++ b/drivers/iio/light/hid-sensor-als.c @@ -86,6 +86,7 @@ static int als_read_raw(struct iio_dev *indio_dev, long mask) { struct als_state *als_state = iio_priv(indio_dev); + struct hid_sensor_hub_device *hsdev = als_state->common_attributes.hsdev; int report_id = -1; u32 address; int ret_type; @@ -110,11 +111,8 @@ static int als_read_raw(struct iio_dev *indio_dev, hid_sensor_power_state(&als_state->common_attributes, true); *val = sensor_hub_input_attr_get_raw_value( - als_state->common_attributes.hsdev, - HID_USAGE_SENSOR_ALS, address, - report_id, - SENSOR_HUB_SYNC, - min < 0); + hsdev, hsdev->usage, address, report_id, + SENSOR_HUB_SYNC, min < 0); hid_sensor_power_state(&als_state->common_attributes, false); } else { @@ -259,9 +257,7 @@ static int als_parse_report(struct platform_device *pdev, dev_dbg(&pdev->dev, "als %x:%x\n", st->als_illum.index, st->als_illum.report_id); - st->scale_precision = hid_sensor_format_scale( - HID_USAGE_SENSOR_ALS, - &st->als_illum, + st->scale_precision = hid_sensor_format_scale(usage_id, &st->als_illum, &st->scale_pre_decml, &st->scale_post_decml); return ret; @@ -285,7 +281,8 @@ static int hid_als_probe(struct platform_device *pdev) als_state->common_attributes.hsdev = hsdev; als_state->common_attributes.pdev = pdev; - ret = hid_sensor_parse_common_attributes(hsdev, HID_USAGE_SENSOR_ALS, + ret = hid_sensor_parse_common_attributes(hsdev, + hsdev->usage, &als_state->common_attributes, als_sensitivity_addresses, ARRAY_SIZE(als_sensitivity_addresses)); @@ -303,7 +300,8 @@ static int hid_als_probe(struct platform_device *pdev) ret = als_parse_report(pdev, hsdev, (struct iio_chan_spec *)indio_dev->channels, - HID_USAGE_SENSOR_ALS, als_state); + hsdev->usage, + als_state); if (ret) { dev_err(&pdev->dev, "failed to setup attributes\n"); return ret; @@ -333,8 +331,7 @@ static int hid_als_probe(struct platform_device *pdev) als_state->callbacks.send_event = als_proc_event; als_state->callbacks.capture_sample = als_capture_sample; als_state->callbacks.pdev = pdev; - ret = sensor_hub_register_callback(hsdev, HID_USAGE_SENSOR_ALS, - &als_state->callbacks); + ret = sensor_hub_register_callback(hsdev, hsdev->usage, &als_state->callbacks); if (ret < 0) { dev_err(&pdev->dev, "callback reg failed\n"); goto error_iio_unreg; @@ -356,7 +353,7 @@ static int hid_als_remove(struct platform_device *pdev) struct iio_dev *indio_dev = platform_get_drvdata(pdev); struct als_state *als_state = iio_priv(indio_dev); - sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_ALS); + sensor_hub_remove_callback(hsdev, hsdev->usage); iio_device_unregister(indio_dev); hid_sensor_remove_trigger(indio_dev, &als_state->common_attributes); @@ -368,6 +365,10 @@ static const struct platform_device_id hid_als_ids[] = { /* Format: HID-SENSOR-usage_id_in_hex_lowercase */ .name = "HID-SENSOR-200041", }, + { + /* Format: HID-SENSOR-custom_sensor_tag-usage_id_in_hex_lowercase */ + .name = "HID-SENSOR-LISS-0041", + }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(platform, hid_als_ids); From patchwork Thu Nov 24 23:38:41 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Philipp Jungkamp X-Patchwork-Id: 13055441 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 300D5C4167D for ; Thu, 24 Nov 2022 23:39:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229624AbiKXXjX (ORCPT ); Thu, 24 Nov 2022 18:39:23 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41302 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229581AbiKXXjW (ORCPT ); Thu, 24 Nov 2022 18:39:22 -0500 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 851592F9 for ; Thu, 24 Nov 2022 15:39:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=s31663417; t=1669333152; bh=jYFyA1DmUfz2aXpmxHrhCM1pqCU+obmDBNXSh3HwCME=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=Stw2tDYWiN9WgYA7Bhuu7KXZ/L5Rb/gr2A7cWoxmdptrVTc3lLJWr5G7XYVl8dBko WPGaGYJ2kEkC6BA/mdE/hvMpPwlyd0zetknF7N2WfvZKXAYXTWmCaTe/AXoCJ006vS PBUkMlptHw2ttQDfSoRHwULCO9cUYmurizL+qA12GxBwT1LGgmltissvGe0bZBnfi0 xSzEvqugwIDKhO7McCLBiI+AeL2KlTn2dDh6nzLWRDI9UmlceJJjYqG2GqZ/BkrT2s xCD9IL3Ro0Gf2EVApRW6+U7nMFt9yPnsrFlABfPSo3FZJSkZlCtGE8tBlgRKDWvgr6 bD32NNxQ/HqKQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.localdomain ([95.223.45.67]) by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1N8XU1-1ouU744Bn7-014WlK; Fri, 25 Nov 2022 00:39:12 +0100 From: Philipp Jungkamp To: Jiri Kosina , Jonathan Cameron , Srinivas Pandruvada Cc: linux-iio@vger.kernel.org, Philipp Jungkamp Subject: [PATCH v4 4/4] IIO: hid-sensor-prox: Use generic usage Date: Fri, 25 Nov 2022 00:38:41 +0100 Message-Id: <20221124233841.3103-5-p.jungkamp@gmx.net> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221124233841.3103-1-p.jungkamp@gmx.net> References: <20221124233841.3103-1-p.jungkamp@gmx.net> MIME-Version: 1.0 X-Provags-ID: V03:K1:v+Q9krQIN+bt2RJ+P5lrH8OAzRUDHYWbUfSY3ncJiY96HaIssMR rLLwT7yPuNs6evL6peGTfWNtLNWGU4FrHwvUMVrTOuJHnXYFo0hjSstDYgv6+Seqc+0oQXg e8SnwzN29g829OOYwnGgPM7rxYtN97v8RAGC5s1DRuQyOSwKp30ru6Jb0cZ5eW/D6YtT0z2 pDMLq8JYisHkJXzQ83BXA== UI-OutboundReport: notjunk:1;M01:P0:lPEGU2h3B/o=;m4TPMssJtroqdwITYxg6Uec7TLJ bVo+1J40k262Qw+dclfdHYTV45Q5t/PVDUSGTI8hSr7yhhl7kmSDb3Ann2jqHdbX+g5tFX7+l raAOyGDBLcwX3NYWDLcGuSHZELoX91MoYbgk8VvKvjbkXN4VtY3k/OjYzNAuuzMufmJEAjxf7 pb2UKoGmLk3cueV+hizRfcRmn0cfYnM8yWCtkGFnpAcba113arg6NXkg7GtLsS3OQCWoRGEPO 1PAWy9Jgzsal+H3R/3zTxawsCtLdrs8/+F8pOa1qSDpnN22vmXU5MBe1/zH+qYjzgTZbQcnyG 5Ya+UFGtyhlCeW7Mdqy8UyJ/4+uPu92ADqqF5r1ZozwwEcKMpmnLmmmEgfrM3awNs3MELLiKa Erfu5KVU5X3D1tuwixyC8ji8llPRFbr4u8rP6NoXoid+nuDLLU1JAqrBLjXBMmQ1eVlms5Fe6 8S2P7zr5rIacWF86P0+7SBXDUbcMb/w//gGG/lkTt60QgSJ1Gk1WEPRptvkA+XVtWZFbanBxo gNQE86+6m1/VGvHZL6+Yzoyz9tbuyeGA6KVdvDiHEx3Kg6BKwmHSWtAfd8SWKGhEngmnIH+OB h0mmImQjHyswYG4nrTFzsx+w5AzTUFs1VwvbktNIBEVyqRgEEIfrdd61H96mrfmStHUlt0DaJ kE9KK3E8YgmURe9kl3tNnwQ57m2SMs4jPs2mORLDVrqbjcjgpMACpI7WBhWO30TocRpE7Ev4U 7gTz0PFoE5mF0zeqs5x5CNjMZJErcjpiTxkCD9ypgewODAjW9NxzYpMkxM0/Re75Ea8EocSnj RcOpmLUXJUsekuo+HBJ18ujkEQDBI02+//6JFEhKS/77RwFtpw5/2Wi6ijbGgaMaJwFYIzGOE byygXyc8Z5E5VyiJOe297fSU4BXfe7iYRybGdCL0fu3wzjcN35H0M67IM2bj8ZgF76uCoJvXt gRnGjA== Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org Use a generic 'hsdev->usage' instead of the HID_USAGE_SENSOR_PROX to allow this driver to drive the Lenvo custom proximity sensor, which is registered under a 'custom' usage and not HID_USAGE_SENSOR_PROX. Add the Lenovo Intelligent Sensing Solution (LISS) human presence sensor to the platform device ids. Signed-off-by: Philipp Jungkamp Reviewed-by: Jonathan Cameron --- v2: - Remove some unnecessary newlines in function calls. v3: - No change. v4: - Clean up switch statement. drivers/iio/light/hid-sensor-prox.c | 37 ++++++++++++++++++----------- 1 file changed, 23 insertions(+), 14 deletions(-) -- 2.38.1 diff --git a/drivers/iio/light/hid-sensor-prox.c b/drivers/iio/light/hid-sensor-prox.c index f10fa2abfe72..a47591e1bad9 100644 --- a/drivers/iio/light/hid-sensor-prox.c +++ b/drivers/iio/light/hid-sensor-prox.c @@ -61,6 +61,7 @@ static int prox_read_raw(struct iio_dev *indio_dev, long mask) { struct prox_state *prox_state = iio_priv(indio_dev); + struct hid_sensor_hub_device *hsdev; int report_id = -1; u32 address; int ret_type; @@ -75,6 +76,7 @@ static int prox_read_raw(struct iio_dev *indio_dev, report_id = prox_state->prox_attr.report_id; min = prox_state->prox_attr.logical_minimum; address = HID_USAGE_SENSOR_HUMAN_PRESENCE; + hsdev = prox_state->common_attributes.hsdev; break; default: report_id = -1; @@ -84,11 +86,8 @@ static int prox_read_raw(struct iio_dev *indio_dev, hid_sensor_power_state(&prox_state->common_attributes, true); *val = sensor_hub_input_attr_get_raw_value( - prox_state->common_attributes.hsdev, - HID_USAGE_SENSOR_PROX, address, - report_id, - SENSOR_HUB_SYNC, - min < 0); + hsdev, hsdev->usage, address, report_id, + SENSOR_HUB_SYNC, min < 0); hid_sensor_power_state(&prox_state->common_attributes, false); } else { @@ -191,10 +190,16 @@ static int prox_capture_sample(struct hid_sensor_hub_device *hsdev, switch (usage_id) { case HID_USAGE_SENSOR_HUMAN_PRESENCE: - prox_state->human_presence = *(u32 *)raw_data; - ret = 0; - break; - default: + switch (raw_len) { + case 1: + prox_state->human_presence = *(u8 *)raw_data; + return 0; + case 4: + prox_state->human_presence = *(u32 *)raw_data; + return 0; + default: + break; + } break; } @@ -244,7 +249,7 @@ static int hid_prox_probe(struct platform_device *pdev) prox_state->common_attributes.hsdev = hsdev; prox_state->common_attributes.pdev = pdev; - ret = hid_sensor_parse_common_attributes(hsdev, HID_USAGE_SENSOR_PROX, + ret = hid_sensor_parse_common_attributes(hsdev, hsdev->usage, &prox_state->common_attributes, prox_sensitivity_addresses, ARRAY_SIZE(prox_sensitivity_addresses)); @@ -262,7 +267,7 @@ static int hid_prox_probe(struct platform_device *pdev) ret = prox_parse_report(pdev, hsdev, (struct iio_chan_spec *)indio_dev->channels, - HID_USAGE_SENSOR_PROX, prox_state); + hsdev->usage, prox_state); if (ret) { dev_err(&pdev->dev, "failed to setup attributes\n"); return ret; @@ -291,8 +296,8 @@ static int hid_prox_probe(struct platform_device *pdev) prox_state->callbacks.send_event = prox_proc_event; prox_state->callbacks.capture_sample = prox_capture_sample; prox_state->callbacks.pdev = pdev; - ret = sensor_hub_register_callback(hsdev, HID_USAGE_SENSOR_PROX, - &prox_state->callbacks); + ret = sensor_hub_register_callback(hsdev, hsdev->usage, + &prox_state->callbacks); if (ret < 0) { dev_err(&pdev->dev, "callback reg failed\n"); goto error_iio_unreg; @@ -314,7 +319,7 @@ static int hid_prox_remove(struct platform_device *pdev) struct iio_dev *indio_dev = platform_get_drvdata(pdev); struct prox_state *prox_state = iio_priv(indio_dev); - sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_PROX); + sensor_hub_remove_callback(hsdev, hsdev->usage); iio_device_unregister(indio_dev); hid_sensor_remove_trigger(indio_dev, &prox_state->common_attributes); @@ -326,6 +331,10 @@ static const struct platform_device_id hid_prox_ids[] = { /* Format: HID-SENSOR-usage_id_in_hex_lowercase */ .name = "HID-SENSOR-200011", }, + { + /* Format: HID-SENSOR-tag-usage_id_in_hex_lowercase */ + .name = "HID-SENSOR-LISS-0226", + }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(platform, hid_prox_ids);