From nobody Sat Feb 7 15:22:29 2026 Received: from mail-pj1-f52.google.com (mail-pj1-f52.google.com [209.85.216.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1516926F289 for ; Thu, 25 Dec 2025 19:08:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766689726; cv=none; b=ZFii6d9dJ4TjqYd1KaOT/zs7CptjVeH+8TZOZWfYiFTB/AwSnuzSWXux6wECjmW4DDbgZqOJKdpk/esQVEc3o/+k8N+1IVV0seDOm2yQ3rXtXAoDiov7+rqqkxNL8hy+mGP2h9PVcj+ZnNcVaLmO3yQVJ0xmk+9vBRBCROAqyMI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766689726; c=relaxed/simple; bh=O7OV29LqOFkYYxef7WbBIg0MkhpiAae+ITkzeUz+7OU=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=Us9LDCnjaIK2Y1w65G8oyLRm4vqv/GgFRWRJdkZdl71/xMKTd/RCnLlHLaN5iYHaLBpK+NCgcjJCuIv7gK8gA/YBPFSgoODisRIdZTrEkdFwTcWHKJBGrdYIjeQq5TLLaAqqPr0+1/auyveuwttqjpEEx+ph2Lc/gS+xxUY5joI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=SaM+g8M9; arc=none smtp.client-ip=209.85.216.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="SaM+g8M9" Received: by mail-pj1-f52.google.com with SMTP id 98e67ed59e1d1-34c2f335681so5191407a91.1 for ; Thu, 25 Dec 2025 11:08:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1766689723; x=1767294523; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=X3ORFj2N4UWrYCvvX94DX724F6eVqFBGFwWbgNVtV/g=; b=SaM+g8M9Bx80scYGA9JE5avyFO4oxnKrjLK1eP20fZ25ysXv6ehh9D5x0gx4Lg7eea 0PmxPtzDZ5419wdU3TvTH8Nw5yruBICosBGohS0BcHMF1NIGCHS0Ay5rJqP+BINZY5GF csqzgo2IQDPuNV+3uvRCcs/2n1tGxjFgUNXFadpzGt9IADvkWennTDKawrVeKm/v0GXO TyihyWegI1MqTUV24Uf2MWkSvhJCUvWjja4kBTWqovG5+m2QUCRrx8G3tuvvYUlGDcYX 2upKKcnBMUM7E5u4fuOjfyvg226vG5vy5kzjoBedj3/pZnouexaXFrPt4/6lRSGCIxFA 9zbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766689723; x=1767294523; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=X3ORFj2N4UWrYCvvX94DX724F6eVqFBGFwWbgNVtV/g=; b=s6vSZfegMgOQVXJSvKkEYuHCQwOyeT8NKIzUWZvreqqDxVlRlNg9CEJOR2Ifhy+r8j iwGoN2iPMeU83TMcVfwFGplslZ3bvV3s7u0n+LPxnEyTn/9Q/37F3f3FbqL706ddgU9g GvgFLYx5mBjw4qdPQNXhVXYtGb2REBf6zkrtNe7D1o4HZAi2o3o/v+ZtztmoN8WxnPYm Xvhv5lTzTGufJWh2PZh4ogWE13SSHaYbqdKIvnHUQ7ZG2i0L80zgl/4lzbJeH4cpAeRB f+H99gx8cnANxqTiAdBjJq/PG2cvIYpXGl/dzS8x2y29w2/XZlDFdeyHUkilXnKznLyV 0OlA== X-Forwarded-Encrypted: i=1; AJvYcCUBAA33O0Yt+cWDRbySXrjuATzZyaSOG6fmygf3URWBFtmI6J00qgcG52+xZ+aLaIXCbxr6Z6VPMF5OUZU=@vger.kernel.org X-Gm-Message-State: AOJu0YyIsE6cPeMqkEw71Z+HImKQskYfAPGofQ3VAjUICS/MCRF2S4vK +VJOpfbvfffgwsAMlXcHiNCSTGOpviizET0igIF1GURGqDzB8i/B5Gll X-Gm-Gg: AY/fxX78zKCEHHL0Xg/8jzaaAihYGH1EUAnIB5f8ZYT6RroLKJwZyoB+cM/5mHfmpeX NMFyqso8pmueu6MxrFmiJyCJaO0BVWR+8rhp1rbwnc4y/sHap5msGD/GXsDF6XcHkGI7MJe9HCb aMO3l5oWA/1ycTBnzPY0QwZMF4nYXOWbb7X+NBXRG5BzgwkdzJUyJlSmaj4oeNIDUxSH7O8uMNM AW6wreTVz/goll7gydXCllyuY9dogB2dp+OpZ6MFltozD7all/af9+4hmYlI+VG1BhqI6qeoy5/ 88i7hvdMRIXP6S8iIN9nI/+NMuErR0orlsdYg5IwaSUNP8gwmSOf4mbo91WP1iru7mWb7QWYSdn fb4hU6Mhbihw92HnzUpRuFRXYQkpQksTvot7IO7FNYsJ8ZLqT68qC0A38urOP2ohPw2onq7RPQE dVqj6fnrjogy95Kg9pL1HzDD11Lszs+Ug3qmML4RrPWDnxIYUs77Wca64mN4ZFg/chOTCPDNy90 IaqWogVAvJ6BwNTFFAxHa3ulQj9H43H9QLDc6E0dhgXiLhERAlvPN9oaZSC X-Google-Smtp-Source: AGHT+IFxIHTSSEEeM3o1DmcOPfS9sy+kJJEduNpLEoFxfiFhjcZJLxcdrmKAIZh0Lkkr5YCaralzWA== X-Received: by 2002:a17:90b:2584:b0:32e:7c34:70cf with SMTP id 98e67ed59e1d1-34e9220204dmr16657680a91.36.1766689723176; Thu, 25 Dec 2025 11:08:43 -0800 (PST) Received: from anonymous ([113.252.77.195]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-34ed530475bsm4013132a91.8.2025.12.25.11.08.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Dec 2025 11:08:42 -0800 (PST) From: Kwok Kin Ming To: jikos@kernel.org, bentiss@kernel.org Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, Kwok Kin Ming Subject: [PATCH] HID: i2c-hid: override HID descriptors for some Haptick 5288 touchpads Date: Fri, 26 Dec 2025 03:08:22 +0800 Message-ID: <20251225190822.150872-1-kenkinming2002@gmail.com> X-Mailer: git-send-email 2.52.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" On some Samsung laptops (750XFG) with Haptick 5288 touchpads over designware i2c bus, the supplied HID descriptors and report descriptors can become partially corrupted under some circumstances. In particular, this can happen if the touchpad attempts to generate input reports while we try to retrieve the HID descriptors or the Report descriptor. This can be reproduced by repeatedly reloading the relevant kernel modules (i2c_hid_acpi and i2c_hid) and attempting to use the touchpad at the same time. The usage of a script is suggested for the reproduction of the issue. Since it is a race condition, one of the symptom of the issue is that it will eventually resolve itself after repeated rebooting. There is currently no way of handling malformed HID descriptors and report descriptors and per the I2C HID spec, it is not necessary for the HOST to re-retrieve a report descriptor under such circumstances. Instead of having a system to deal with malformed HID descriptors and report descriptors, we simply hard-code them. A related issues on another samsung laptop (750XED) have been reported on the archlinux forum. Links: https://bbs.archlinux.org/viewtopic.php?id=3D289627 Signed-off-by: Kwok Kin Ming --- Other fixes were attempted at the issue but none of them work. In summary, they included: 1: Remove I2C_HID_QUIRK_NO_IRQ_AFTER_RESET quirk. 2: Do not send power on command to the device before reset. 3: Detect if any interrupts have fired when we are reading HID descriptors and report descriptors in a racy manner. Other suggestions are welcomed. The patch triggers style check warnings due to long line but it should sitll be readable. The comments could be removed if necessary. Other samsung laptops affected by the issue could also be added if it can be confirmed. drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c | 262 +++++++++++++++++++++++ 1 file changed, 262 insertions(+) diff --git a/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c b/drivers/hid/i2c-hid= /i2c-hid-dmi-quirks.c index 210f17c3a0be..befec7a0c2fd 100644 --- a/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c +++ b/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c @@ -290,6 +290,260 @@ static const struct i2c_hid_desc_override sipodev_des= c =3D { .i2c_name =3D "SYNA3602:00" }; +static const struct i2c_hid_desc_override hantick5288_desc =3D { + .i2c_hid_desc_buffer =3D (uint8_t []) + {0x1e, 0x00, /* Length of descriptor */ + 0x00, 0x01, /* Version of descriptor */ + 0xe2, 0x01, /* Length of report descriptor */ + 0x21, 0x00, /* Location of report descriptor */ + 0x24, 0x00, /* Location of input report */ + 0x1f, 0x00, /* Max input report length */ + 0x25, 0x00, /* Location of output report */ + 0x11, 0x00, /* Max output report length */ + 0x22, 0x00, /* Location of command register */ + 0x23, 0x00, /* Location of data register */ + 0x11, 0x09, /* Vendor ID */ + 0x88, 0x52, /* Product ID */ + 0x06, 0x00, /* Version ID */ + 0x00, 0x00, 0x00, 0x00, /* Reserved */ + }, + .hid_report_desc =3D (uint8_t []) + {0x05, 0x01, /* Usage Page (Generic Desktop Ctrls) = */ + 0x09, 0x02, /* Usage (Mouse) = */ + 0xA1, 0x01, /* Collection (Application) = */ + 0x85, 0x01, /* Report ID (1) = */ + 0x09, 0x01, /* Usage (Pointer) = */ + 0xA1, 0x00, /* Collection (Physical) = */ + 0x05, 0x09, /* Usage Page (Button) = */ + 0x19, 0x01, /* Usage Minimum (0x01) = */ + 0x29, 0x02, /* Usage Maximum (0x02) = */ + 0x25, 0x01, /* Logical Maximum (1) = */ + 0x75, 0x01, /* Report Size (1) = */ + 0x95, 0x02, /* Report Count (2) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0x95, 0x06, /* Report Count (6) = */ + 0x81, 0x01, /* Input (Const,Array,Abs,No Wrap,Line= ar,Preferred State,No Null Position) */ + 0x05, 0x01, /* Usage Page (Generic Desktop Ctrls) = */ + 0x09, 0x30, /* Usage (X) = */ + 0x09, 0x31, /* Usage (Y) = */ + 0x15, 0x81, /* Logical Minimum (-127) = */ + 0x25, 0x7F, /* Logical Maximum (127) = */ + 0x75, 0x08, /* Report Size (8) = */ + 0x95, 0x02, /* Report Count (2) = */ + 0x81, 0x06, /* Input (Data,Var,Rel,No Wrap,Linear,= Preferred State,No Null Position) */ + 0xC0, /* End Collection = */ + 0xC0, /* End Collection = */ + 0x05, 0x0D, /* Usage Page (Digitizer) = */ + 0x09, 0x05, /* Usage (Touch Pad) = */ + 0xA1, 0x01, /* Collection (Application) = */ + 0x95, 0x01, /* Report Count (1) = */ + 0x55, 0x0E, /* Unit Exponent (-2) = */ + 0x65, 0x11, /* Unit (System: SI Linear, Length: Cent= imeter) */ + 0x15, 0x00, /* Logical Minimum (0) = */ + 0x85, 0x04, /* Report ID (4) = */ + 0x05, 0x0D, /* Usage Page (Digitizer) = */ + 0x09, 0x22, /* Usage (Finger) = */ + 0xA1, 0x02, /* Collection (Logical) = */ + 0x25, 0x01, /* Logical Maximum (1) = */ + 0x75, 0x01, /* Report Size (1) = */ + 0x09, 0x47, /* Usage (0x47) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0x09, 0x42, /* Usage (Tip Switch) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0x75, 0x06, /* Report Size (6) = */ + 0x25, 0x05, /* Logical Maximum (5) = */ + 0x09, 0x51, /* Usage (0x51) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0x05, 0x01, /* Usage Page (Generic Desktop Ctrls) = */ + 0x75, 0x10, /* Report Size (16) = */ + 0x26, 0x44, 0x0A, /* Logical Maximum (2628) = */ + 0x46, 0xB0, 0x04, /* Physical Maximum (1200) = */ + 0x09, 0x30, /* Usage (X) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0x26, 0x34, 0x05, /* Logical Maximum (1332) = */ + 0x46, 0x38, 0x03, /* Physical Maximum (824) = */ + 0x09, 0x31, /* Usage (Y) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0xC0, /* End Collection = */ + 0x05, 0x0D, /* Usage Page (Digitizer) = */ + 0x09, 0x22, /* Usage (Finger) = */ + 0xA1, 0x02, /* Collection (Logical) = */ + 0x25, 0x01, /* Logical Maximum (1) = */ + 0x75, 0x01, /* Report Size (1) = */ + 0x09, 0x47, /* Usage (0x47) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0x09, 0x42, /* Usage (Tip Switch) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0x75, 0x06, /* Report Size (6) = */ + 0x25, 0x05, /* Logical Maximum (5) = */ + 0x09, 0x51, /* Usage (0x51) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0x05, 0x01, /* Usage Page (Generic Desktop Ctrls) = */ + 0x75, 0x10, /* Report Size (16) = */ + 0x26, 0x44, 0x0A, /* Logical Maximum (2628) = */ + 0x46, 0xB0, 0x04, /* Physical Maximum (1200) = */ + 0x09, 0x30, /* Usage (X) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0x26, 0x34, 0x05, /* Logical Maximum (1332) = */ + 0x46, 0x38, 0x03, /* Physical Maximum (824) = */ + 0x09, 0x31, /* Usage (Y) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0xC0, /* End Collection = */ + 0x05, 0x0D, /* Usage Page (Digitizer) = */ + 0x09, 0x22, /* Usage (Finger) = */ + 0xA1, 0x02, /* Collection (Logical) = */ + 0x25, 0x01, /* Logical Maximum (1) = */ + 0x75, 0x01, /* Report Size (1) = */ + 0x09, 0x47, /* Usage (0x47) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0x09, 0x42, /* Usage (Tip Switch) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0x75, 0x06, /* Report Size (6) = */ + 0x25, 0x05, /* Logical Maximum (5) = */ + 0x09, 0x51, /* Usage (0x51) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0x05, 0x01, /* Usage Page (Generic Desktop Ctrls) = */ + 0x75, 0x10, /* Report Size (16) = */ + 0x26, 0x44, 0x0A, /* Logical Maximum (2628) = */ + 0x46, 0xB0, 0x04, /* Physical Maximum (1200) = */ + 0x09, 0x30, /* Usage (X) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0x26, 0x34, 0x05, /* Logical Maximum (1332) = */ + 0x46, 0x38, 0x03, /* Physical Maximum (824) = */ + 0x09, 0x31, /* Usage (Y) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0xC0, /* End Collection = */ + 0x05, 0x0D, /* Usage Page (Digitizer) = */ + 0x09, 0x22, /* Usage (Finger) = */ + 0xA1, 0x02, /* Collection (Logical) = */ + 0x25, 0x01, /* Logical Maximum (1) = */ + 0x75, 0x01, /* Report Size (1) = */ + 0x09, 0x47, /* Usage (0x47) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0x09, 0x42, /* Usage (Tip Switch) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0x75, 0x06, /* Report Size (6) = */ + 0x25, 0x05, /* Logical Maximum (5) = */ + 0x09, 0x51, /* Usage (0x51) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0x05, 0x01, /* Usage Page (Generic Desktop Ctrls) = */ + 0x75, 0x10, /* Report Size (16) = */ + 0x26, 0x44, 0x0A, /* Logical Maximum (2628) = */ + 0x46, 0xB0, 0x04, /* Physical Maximum (1200) = */ + 0x09, 0x30, /* Usage (X) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0x26, 0x34, 0x05, /* Logical Maximum (1332) = */ + 0x46, 0x38, 0x03, /* Physical Maximum (824) = */ + 0x09, 0x31, /* Usage (Y) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position) */ + 0xC0, /* End Collection = */ + 0x05, 0x0D, /* Usage Page (Digitizer) = */ + 0x55, 0x0C, /* Unit Exponent (-4) = */ + 0x66, 0x01, 0x10, /* Unit (System: SI Linear, Time: Second= s) */ + 0x47, 0xFF, 0xFF, 0x00, 0x00, /* Physical Maximum (65534) = */ + 0x27, 0xFF, 0xFF, 0x00, 0x00, /* Logical Maximum (65534) = */ + 0x09, 0x56, /* Usage (0x56) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,Pr= eferred State,No Null Position) */ + 0x25, 0x05, /* Logical Maximum (5) = */ + 0x09, 0x54, /* Usage (0x54) = */ + 0x75, 0x04, /* Report Size (4) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,Pr= eferred State,No Null Position) */ + 0x05, 0x09, /* Usage Page (Button) = */ + 0x09, 0x01, /* Usage (0x01) = */ + 0x25, 0x01, /* Logical Maximum (1) = */ + 0x25, 0x01, /* Logical Maximum (1) = */ + 0x75, 0x01, /* Report Size (1) = */ + 0x95, 0x01, /* Report Count (1) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,Pr= eferred State,No Null Position) */ + 0x06, 0x01, 0xFF, /* Usage Page (Vendor Defined 0xFF01) = */ + 0x95, 0x01, /* Report Count (1) = */ + 0x75, 0x03, /* Report Size (3) = */ + 0x09, 0x41, /* Usage (0x41) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,Pr= eferred State,No Null Position) */ + 0x09, 0x42, /* Usage (0x42) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,Pr= eferred State,No Null Position) */ + 0x75, 0x01, /* Report Size (1) = */ + 0x09, 0x40, /* Usage (0x40) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,Pr= eferred State,No Null Position) */ + 0x75, 0x24, /* Report Size (36) = */ + 0x81, 0x03, /* Input (Const,Var,Abs,No Wrap,Linear,P= referred State,No Null Position) */ + 0x05, 0x0D, /* Usage Page (Digitizer) = */ + 0x85, 0x02, /* Report ID (2) = */ + 0x25, 0x0F, /* Logical Maximum (15) = */ + 0x75, 0x04, /* Report Size (4) = */ + 0x09, 0x55, /* Usage (0x55) = */ + 0xB1, 0x02, /* Feature (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position,Non-volatile) */ + 0x09, 0x59, /* Usage (0x59) = */ + 0xB1, 0x02, /* Feature (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position,Non-volatile) */ + 0x85, 0x06, /* Report ID (6) = */ + 0x06, 0x00, 0xFF, /* Usage Page (Vendor Defined 0xFF00) = */ + 0x09, 0xC5, /* Usage (0xC5) = */ + 0x26, 0xFF, 0x00, /* Logical Maximum (255) = */ + 0x75, 0x08, /* Report Size (8) = */ + 0x96, 0x00, 0x01, /* Report Count (256) = */ + 0xB1, 0x02, /* Feature (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position,Non-volatile) */ + 0xC0, /* End Collection = */ + 0x05, 0x0D, /* Usage Page (Digitizer) = */ + 0x09, 0x0E, /* Usage (0x0E) = */ + 0xA1, 0x01, /* Collection (Application) = */ + 0x85, 0x03, /* Report ID (3) = */ + 0x09, 0x22, /* Usage (Finger) = */ + 0xA1, 0x02, /* Collection (Logical) = */ + 0x09, 0x52, /* Usage (0x52) = */ + 0x25, 0x0A, /* Logical Maximum (10) = */ + 0x95, 0x01, /* Report Count (1) = */ + 0xB1, 0x02, /* Feature (Data,Var,Abs,No Wrap,Linea= r,Preferred State,No Null Position,Non-volatile) */ + 0xC0, /* End Collection = */ + 0x09, 0x22, /* Usage (Finger) = */ + 0xA1, 0x00, /* Collection (Physical) = */ + 0x85, 0x05, /* Report ID (5) = */ + 0x25, 0x01, /* Logical Maximum (1) = */ + 0x75, 0x01, /* Report Size (1) = */ + 0x09, 0x57, /* Usage (0x57) = */ + 0xB1, 0x02, /* Feature (Data,Var,Abs,No Wrap,Linea= r,Preferred State,No Null Position,Non-volatile) */ + 0x09, 0x58, /* Usage (0x58) = */ + 0xB1, 0x02, /* Feature (Data,Var,Abs,No Wrap,Linea= r,Preferred State,No Null Position,Non-volatile) */ + 0x75, 0x06, /* Report Size (6) = */ + 0xB1, 0x03, /* Feature (Const,Var,Abs,No Wrap,Line= ar,Preferred State,No Null Position,Non-volatile) */ + 0xC0, /* End Collection = */ + 0xC0, /* End Collection = */ + 0x06, 0x01, 0xFF, /* Usage Page (Vendor Defined 0xFF01) = */ + 0x09, 0x02, /* Usage (0x02) = */ + 0xA1, 0x01, /* Collection (Application) = */ + 0x75, 0x08, /* Report Size (8) = */ + 0x85, 0x0D, /* Report ID (13) = */ + 0x09, 0xD5, /* Usage (0xD5) = */ + 0x95, 0x18, /* Report Count (24) = */ + 0xB1, 0x02, /* Feature (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position,Non-volatile) */ + 0x85, 0x0C, /* Report ID (12) = */ + 0x09, 0xD6, /* Usage (0xD6) = */ + 0x96, 0x91, 0x00, /* Report Count (145) = */ + 0xB1, 0x02, /* Feature (Data,Var,Abs,No Wrap,Linear,= Preferred State,No Null Position,Non-volatile) */ + 0x09, 0x30, /* Usage (0x30) = */ + 0x85, 0x07, /* Report ID (7) = */ + 0x95, 0x07, /* Report Count (7) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,Pr= eferred State,No Null Position) */ + 0x09, 0x70, /* Usage (0x70) = */ + 0x85, 0x0E, /* Report ID (14) = */ + 0x95, 0xC9, /* Report Count (-55) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,Pr= eferred State,No Null Position) */ + 0x09, 0x71, /* Usage (0x71) = */ + 0x85, 0x08, /* Report ID (8) = */ + 0x95, 0x97, /* Report Count (-105) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,Pr= eferred State,No Null Position) */ + 0x09, 0x72, /* Usage (0x72) = */ + 0x85, 0x09, /* Report ID (9) = */ + 0x95, 0xFD, /* Report Count (-3) = */ + 0x81, 0x02, /* Input (Data,Var,Abs,No Wrap,Linear,Pr= eferred State,No Null Position) */ + 0x09, 0x73, /* Usage (0x73) = */ + 0x85, 0x0A, /* Report ID (10) = */ + 0x95, 0x20, /* Report Count (32) = */ + 0x91, 0x02, /* Output (Data,Var,Abs,No Wrap,Linear,P= referred State,No Null Position,Non-volatile) */ + 0xC0, /* End Collection = */ + }, + .hid_report_desc_size =3D 482, + .i2c_name =3D "SPPT2600:00" +}; static const struct dmi_system_id i2c_hid_dmi_desc_override_table[] =3D { { @@ -415,6 +669,14 @@ static const struct dmi_system_id i2c_hid_dmi_desc_ove= rride_table[] =3D { }, .driver_data =3D (void *)&sipodev_desc }, + { + .ident =3D "Samsung 750XFG", + .matches =3D { + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "750XFG"), + }, + .driver_data =3D (void *)&hantick5288_desc + }, { } /* Terminate list */ }; -- 2.52.0