From patchwork Sat Feb 1 11:38:45 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956203 Received: from mail-ed1-f52.google.com (mail-ed1-f52.google.com [209.85.208.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 310DA148FE4; Sat, 1 Feb 2025 11:39:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409953; cv=none; b=iUJ07P4d9ZryQel05trxG8Soa2YGnFuZcAESp4pxbczQ244vo5W7i72qeUmQLnzp6l84CP2mXj2znTM3B/s4keIKxVUbcaw1+gvc9I3+91/yXRCxac7erKjPxShDPFVZg/MkHoEW9zxXbmhK13WS/IXBuETQJL44WGTMQhV1Igo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409953; c=relaxed/simple; bh=+GwR/e4rJsHH30l+t0noxqlxePCU6YqnpSq/kDR4h4A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=c91q0EIrLOHXJy4nLw2H9RId5FlHvNW8Yxz2PrZHZ97K3CEHiMW78eZ+EgusUXgsS2vEI5Jo5iqHMqIkgLl8Xe6Xh/sm1Zyex/CnL4HhKfBKnlU+c5y4Dx/fxDlFnUTUM5KSFfcub4dBe9BfF6vlhUz83CcDVyq0wDj9txYcCh8= 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=AO4BcHsc; arc=none smtp.client-ip=209.85.208.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="AO4BcHsc" Received: by mail-ed1-f52.google.com with SMTP id 4fb4d7f45d1cf-5dbf7d45853so525557a12.1; Sat, 01 Feb 2025 03:39:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409949; x=1739014749; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=IU1ijhHw0/QLTZKfCX+dlRClDFtMUmf3s7IoL+8HfDo=; b=AO4BcHscKheCTiLNk5utSHwidiODq1QrGP1BkuvZ4QQKH4olZpH9FBCCV5ZnNTs6YW IAy1GmvptCY7uhYaUECdyoNfov3jMHtWzh4OE4jIpXmrGQciusvI0/hbpNa8R4su1Yas 3NJj4+DRdnlplFNArgQjfC0tZtPb0y6gfEeWejivsQTHT3Lwu5lPdjbdDCOZTroGVDrX URT2TDnwTGQF6xQlQpd+O8Ol6Go00xGDI0rLDixvEVe+e9qfLYMHciUhIo5LHPKixS1j PW8+ExZnfxCs6Xxk4KxNREQW0+eXMMmuN9pLuEwqIxJzrKIzEQhsehKSHseVK/ccs6pz woIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409949; x=1739014749; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=IU1ijhHw0/QLTZKfCX+dlRClDFtMUmf3s7IoL+8HfDo=; b=jNxA3OfTKuB3q+LFA/VC2oS+IUROPCPyqa5GT8Ga1rAx/wUd5SCXsUSgpXHtkELH0M RQgE8FQrxhIsRFn+IPPBYUwnZkE7S6MQHtwO5SLm46pJj2SkCpjUS0siAjCvNCXmFXq7 Hu6bvksAa/dqwfgpd52lzYEPpuD9527mP022FWIvld/bCOPBhNfeJu607yNHjJYkW9jr C3He+Rbx4CiVgtTqSod1NUNneelK7imBMRUd8oaenRWl02JEUd7cDGvRvEOFFfjkr/L0 pkBsNRcJRwqKXTFB+nIgUVKF/TkKEXtbZHPIiePMCBZhdNv25IvVWCQv1Se9h/yOd7K8 lqQA== X-Forwarded-Encrypted: i=1; AJvYcCUeWi9sD/lvzJhd4SEIfnkFar94+kbN+45eZp+7wEToxSI4kj7htbxCaKthlKkpVC2DHx75p8/dLzWJ@vger.kernel.org, AJvYcCWOIj3EIWWov2UlPbRkiOYOEe9oMrzfnWQDIJTNHJddI/R17CNEnhL1s12uQXfMzcs9CMZkZMHC4o1t+Q==@vger.kernel.org X-Gm-Message-State: AOJu0Yx2aQ986I71os9blXS6eoBCo4qpnAxXQTOYEU7rKI+Uw3bDZZOZ u5aWrcCWXajtMneExLQs302UQmJCLpsVcS3/kEMejzRw0Q0F6u9qCSjy3Q== X-Gm-Gg: ASbGnct2VxlYsaktp2Qva3hMQHbq8BT3qFvNMZ4FcoUpPg4JJaIXP4jyVaygajCWKNz wTYornnizlbLkFhs4AIrwdAlWlpqtl9jAn/pFXRR8e6VpNBuiEWFt+lBKzqj/AjusLOzzi0J16g esqI50BivhOpBidFKE808ya+j1LmXZjh743fgdherqRabddk/ydR2TvYgwi79V24z+0VQf/GeP+ WfSswbCfp7UXzIgZD5wk9KjmFipZV9VeUDx5D5bfhBzVBZYzRF494vmnVghTJPMybECWv9tT6kd aI8EQWSHWEZifiaDlhWq0Wa+oBjuWz6Mr6inoVGgflGWwdjvn1DzIyQ4Ahn21g== X-Google-Smtp-Source: AGHT+IE9FtbzUkgkCBo4Q/idAcPQk2VF8DrsffuGa1117aUQctj+gbBqICVO+/sdpbZOrHSXe38nJg== X-Received: by 2002:a05:6402:2816:b0:5dc:6c1:8165 with SMTP id 4fb4d7f45d1cf-5dc5e6b10ebmr6433562a12.0.1738409949339; Sat, 01 Feb 2025 03:39:09 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:09 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 01/22] HID: pidff: Convert infinite length from Linux API to PID standard Date: Sat, 1 Feb 2025 12:38:45 +0100 Message-ID: <20250201113906.769162-2-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Software uses 0 as de-facto infinite lenght on Linux FF apis (SDL), Linux doesn't actually define anythi as of now, while USB PID defines NULL (0xffff). Most PID devices do not expect a 0-length effect and can't interpret it as infinite. This change fixes Force Feedback for most PID compliant devices. As most games depend on updating the values of already playing infinite effects, this is crucial to ensure they will actually work. Previously, users had to rely on third-party software to do this conversion and make their PID devices usable. Co-developed-by: Makarenko Oleg Signed-off-by: Makarenko Oleg Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Paul Dino Jones Tested-by: Cristóferson Bueno Tested-by: Pablo Cisneros --- drivers/hid/usbhid/hid-pidff.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index 3b4ee21cd811..5fe4422bb5ba 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -21,6 +21,7 @@ #include "usbhid.h" #define PID_EFFECTS_MAX 64 +#define PID_INFINITE 0xffff /* Report usage table used to put reports into an array */ @@ -301,7 +302,12 @@ static void pidff_set_effect_report(struct pidff_device *pidff, pidff->block_load[PID_EFFECT_BLOCK_INDEX].value[0]; pidff->set_effect_type->value[0] = pidff->create_new_effect_type->value[0]; - pidff->set_effect[PID_DURATION].value[0] = effect->replay.length; + + /* Convert infinite length from Linux API (0) + to PID standard (NULL) if needed */ + pidff->set_effect[PID_DURATION].value[0] = + effect->replay.length == 0 ? PID_INFINITE : effect->replay.length; + pidff->set_effect[PID_TRIGGER_BUTTON].value[0] = effect->trigger.button; pidff->set_effect[PID_TRIGGER_REPEAT_INT].value[0] = effect->trigger.interval; From patchwork Sat Feb 1 11:38:46 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956204 Received: from mail-ed1-f41.google.com (mail-ed1-f41.google.com [209.85.208.41]) (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 4376214AD38; Sat, 1 Feb 2025 11:39:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409954; cv=none; b=Z6NNFFVfqAIUpHiWoOUnqyoXRDokVpPtemkHhaohVT4t6JEqsQRT+esgPvP/BDZZOMh37hUGEF5uHBW7eWQ8f7HmF68BRWelNaif0a2V6Anc1GuqNRKdhpKuJ9tjhypdBGPLAGxqSJWOTnYj3Q2gCXqyUzjZoyHyfi7p8NPR0XA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409954; c=relaxed/simple; bh=fJ56SEb8U2EuKJrEZPfGGz1sNq3AQ4BPmyEKP8+5Ay0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=br1d51u6TgaZxoXTpwt6QUOUASUi0sFeK5bhO3VMR+lsArHko0TYhzcUNzTVnBDU8F3etv2L1SyPDU4VDkqyhUPBOJLsUSvKZ2BpmtzRDSeZJK5oBGSG3XaR0f8ynmiqEBpqCRH+cfuWHDnG4ZdPD7R3Suk5t2M0a7c5OpPN/R8= 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=GSwKOtOn; arc=none smtp.client-ip=209.85.208.41 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="GSwKOtOn" Received: by mail-ed1-f41.google.com with SMTP id 4fb4d7f45d1cf-5d3ea2a5a9fso578439a12.2; Sat, 01 Feb 2025 03:39:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409951; x=1739014751; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Ja4x2NihYxQPdmpH9wq3YOQjjZ6z1qmt0MOVDhJRWIQ=; b=GSwKOtOnGK1T6UZe+6EThtse6O92KHdmP087KFIb6NUuchnmuON7Flxyixnx9w+fps wRMdeVjix8Fo4QG2L/cwMAkRxEQGbgBU+uOXRDsB8wpXWOdqmz5OY4CFC2ebe0y4Oxmx SjbpJRo8LwOnw52HEDmWRaTdrCe7Yx8NkEtc5aGsic/O/MzwzaNfhCx7jcmNPopWXhPI 1Fm9EdMXPhf+YyhT9VAffYuZLEjqXiLDLKUYhASji5QLYDHLWYHEqGIEW6LxVXj7XhYg gzzZ3SjztJUMFRhv8K1B58LLXb4MGgr+1EEqtZgna/BII38HeQXBJcsxrz5k9hhzWjSO mMzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409951; x=1739014751; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Ja4x2NihYxQPdmpH9wq3YOQjjZ6z1qmt0MOVDhJRWIQ=; b=d/KjFVp9UmOvTK8MHXFuHavTcPWiixYAj+sxZ+g96x1HCwrLQrYQwq29UcpHkWg4xt fppy59P1YNNsSwM6u3fVM8PSnQwD/k4WyYqDaIoMObqyVAKxhJyEyuNbfHQ/n8wd4yfS UMJtPcineafFWx95BG1DAoBL5UyhSPilEYlnF3RsXIv8gKWqQz1rGOlGTID501c2nHqQ dqVdCbJP+vFX7aBLsR0QKQ8h76YL1DydRI9abVPVysHzfh6Xrih2E3E8KJu4cwFPB6yK v06FbaA6GWQY1RIFle2ff79FwwB39KF8XB6lFRNCpUDH2n+FrwcKNv6sBmp5ysqp0eJG Hhdw== X-Forwarded-Encrypted: i=1; AJvYcCUGD1pzO8Vpe62hircdyq8K/+niM6uk5Hs9VR3OpMwBiJGO9Ypett33A6bMbZSL0cCBLzCQweZaMw80uw==@vger.kernel.org, AJvYcCUO7Sm5ptPQDqPtQmrUqUWsV7QQHBiUoGZDSMUZFXfwxUDPtm+JYqWN6jHOwW8w9xtNxMh5pLzkjYHp@vger.kernel.org X-Gm-Message-State: AOJu0YzOoXXAZzwyvwBqGr8LWqUAq+/13LG2ugW1dYFrzcQk+9wfajq9 dp21gjlwcofRPbvyA2hL7BJaOCkk/hxKtK58cIQhKNtEI96dJiczoRjcfw== X-Gm-Gg: ASbGncttn90q4NWT4REGEgA8KFEN6pkOzx6i+Erjx9g7Z0zmWL9ZMg3ZHRbTROElCyO lVtXxsFYLfcr//UIkziSaQWEVZ687gUXIXmyV5NMGH8Ne6FzFpTFRVYgSNN4KqjlDAiUgU9NNYa IotKcPTNr9gorgwPE7i4p3Q3dCWkkTH628JPMARgmGpksfPVRBhRtEi4IhnDpXswySwfkDdFqRu o/7CZqmfdOvWW+qXEG7q8L0JY0RZqzlhjKGczr3vk03WuuBCEJBUK/IgdDNBXTkSqjb+spkZvU0 bnXOq8KtFK4qdRJdTGeis6YIGbvT2NScRac8vp0oEdzkL93z0HL8sYH7tygZQQ== X-Google-Smtp-Source: AGHT+IFV9A6cZYguclHg3mn7kpqunmjVWGrcCPYP1zu/6mQHH4EgLeuNoaOpMuMM3xHMLlUJ2Nhe3Q== X-Received: by 2002:a05:6402:5025:b0:5dc:8ee8:6b15 with SMTP id 4fb4d7f45d1cf-5dc8ee87639mr1560635a12.5.1738409950501; Sat, 01 Feb 2025 03:39:10 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:10 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 02/22] HID: pidff: Do not send effect envelope if it's empty Date: Sat, 1 Feb 2025 12:38:46 +0100 Message-ID: <20250201113906.769162-3-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Envelope struct is always initialized, but the envelope itself is optional as described in USB PID Device class definition 1.0. 5.1.1.1 Type Specific Block Offsets ... 4) Effects that do not use Condition Blocks use 1 Parameter Block and an *optional* Envelope Block. Sending out "empty" envelope breaks force feedback on some devices with games that use SINE effect + offset to emulate constant force effect, as well as generally breaking Constant/Periodic effects. One of the affected brands is Moza Racing. This change prevents the envelope from being sent if it contains all 0 values while keeping the old behavior of only sending it, if it differs from the old one. Changes in v6: - Simplify the checks to make them clearer - Fix possible null pointer dereference while calling pidff_needs_set_envelope Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Paul Dino Jones Tested-by: Cristóferson Bueno Tested-by: Pablo Cisneros --- drivers/hid/usbhid/hid-pidff.c | 42 +++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index 5fe4422bb5ba..a01c1b2ab2f4 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -262,10 +262,22 @@ static void pidff_set_envelope_report(struct pidff_device *pidff, static int pidff_needs_set_envelope(struct ff_envelope *envelope, struct ff_envelope *old) { - return envelope->attack_level != old->attack_level || - envelope->fade_level != old->fade_level || + bool needs_new_envelope; + needs_new_envelope = envelope->attack_level != 0 || + envelope->fade_level != 0 || + envelope->attack_length != 0 || + envelope->fade_length != 0; + + if (!needs_new_envelope) + return false; + + if (!old) + return needs_new_envelope; + + return envelope->attack_level != old->attack_level || + envelope->fade_level != old->fade_level || envelope->attack_length != old->attack_length || - envelope->fade_length != old->fade_length; + envelope->fade_length != old->fade_length; } /* @@ -580,11 +592,9 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect, pidff_set_effect_report(pidff, effect); if (!old || pidff_needs_set_constant(effect, old)) pidff_set_constant_force_report(pidff, effect); - if (!old || - pidff_needs_set_envelope(&effect->u.constant.envelope, - &old->u.constant.envelope)) - pidff_set_envelope_report(pidff, - &effect->u.constant.envelope); + if (pidff_needs_set_envelope(&effect->u.constant.envelope, + old ? &old->u.constant.envelope : NULL)) + pidff_set_envelope_report(pidff, &effect->u.constant.envelope); break; case FF_PERIODIC: @@ -619,11 +629,9 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect, pidff_set_effect_report(pidff, effect); if (!old || pidff_needs_set_periodic(effect, old)) pidff_set_periodic_report(pidff, effect); - if (!old || - pidff_needs_set_envelope(&effect->u.periodic.envelope, - &old->u.periodic.envelope)) - pidff_set_envelope_report(pidff, - &effect->u.periodic.envelope); + if (pidff_needs_set_envelope(&effect->u.periodic.envelope, + old ? &old->u.periodic.envelope : NULL)) + pidff_set_envelope_report(pidff, &effect->u.periodic.envelope); break; case FF_RAMP: @@ -637,11 +645,9 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect, pidff_set_effect_report(pidff, effect); if (!old || pidff_needs_set_ramp(effect, old)) pidff_set_ramp_force_report(pidff, effect); - if (!old || - pidff_needs_set_envelope(&effect->u.ramp.envelope, - &old->u.ramp.envelope)) - pidff_set_envelope_report(pidff, - &effect->u.ramp.envelope); + if (pidff_needs_set_envelope(&effect->u.ramp.envelope, + old ? &old->u.ramp.envelope : NULL)) + pidff_set_envelope_report(pidff, &effect->u.ramp.envelope); break; case FF_SPRING: From patchwork Sat Feb 1 11:38:47 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956205 Received: from mail-ed1-f45.google.com (mail-ed1-f45.google.com [209.85.208.45]) (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 CB1A016F858; Sat, 1 Feb 2025 11:39:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409955; cv=none; b=f0uFdDL02UtlBuD18wNenOFzWpy8WYtrtBU2rdXAahHdPjJ3ECC13cwXApXKq1JddcHoP4JNghvqom5pBLP72T+pKZw18oTmllYeM7B2u/jn33oTkjIg2wRHwMz59DfPQsQmDAgqgyLb4CB2t9FW6QdE0sbH41b4PgYz1Huls8U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409955; c=relaxed/simple; bh=vT0NxbdrI6fSbYoeYU2IxQVUUt17vurL1Wne66n5fmg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=XVFC4cftTNrbPt2MbWZCgMhShx8GqubRbO6vzgpTeVQHhcP5H8e0jonsFVktz2uB7YpkDXXHiJijzyybVb+hXXfpu6fsLxaqhYvbjnuAUUbj0bp6Jl2PsD1xok3hRtnOkzRq1BUPD1MXnZOjwErTvFvvuFxlxpruf/mCx62eDbs= 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=NQkZ9Bz0; arc=none smtp.client-ip=209.85.208.45 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="NQkZ9Bz0" Received: by mail-ed1-f45.google.com with SMTP id 4fb4d7f45d1cf-5d3ea2a5a9fso578444a12.2; Sat, 01 Feb 2025 03:39:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409952; x=1739014752; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=I38Qk1RTm5p9rwY7xvBkTCqFaYfLmI8D5AidGoGrF4o=; b=NQkZ9Bz0YA2Uttfa1C2UjYEFC22hKnJFMLLrpGoRmyHcaTpInPKGPfOHhbpKiGiDS6 NPp48XcjPKFgmAvu/o9tVNjlA96Cn4KnV7ZdR5wvEJ1jETC5gTJAul9FRcSMNwIC4Sv7 DrZYZofXMmpBxMbaECprN2MgiEzLKnO3nWKbvr73K0HXKSJu6xtuo8C/43UtIEkGg57T zDYsgeBOS4nEDOASPunQrsbcqE8JuOtFZI2IgU46rZOkoE/rr4xSRcoTbaIvHuwaMxZn QVrn27e0hles6N+4iFb5HuRboUbOQqyowHJVYNc6MGRYXKlPMYmbyE31zwx23IUbUOhz 2v+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409952; x=1739014752; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=I38Qk1RTm5p9rwY7xvBkTCqFaYfLmI8D5AidGoGrF4o=; b=OpF+VKdTprqu7cNWmyf0gYNAVAToANDL9ELCLyDhzR5fOox435/yaAARPP1jiFci3q Gr5k+XFi2Rq/eDS+GS4+qgmED2h67i+z+ZgZR2bq2i9eSf4bzB1Z6c+vZDmlYKG3NkQr 9IlTsspSD7B0MKrw1l4u0P+DQrE2ToheZLLGQgpqdxcLTSkC5qXQiqWkkiNKcwawmSAF lcNqxdP7HkyRvVeOtV8tWJshc5biCVI/3hJBhOgRYyoUMG6/g9+OjeY7IdZJ28BX9CA0 vmTr59jnh8Hm7aF3A6aR8D3QEwBVSCsnVFqa4NuhS9DOsh43qkNs6pZ8weRuaUmMes5s P5tw== X-Forwarded-Encrypted: i=1; AJvYcCWF9TnC9Hz4nRx7ret6NoJUi26EAAf4A9kaIzXV+1sGEauGC9FQ5u9xrvfBPjwFvdhjS/7rX4HQ97+i@vger.kernel.org, AJvYcCWXvi5gFlWtiRccZktsCoD4zHPaGflCJVTSERM58vfOutdLsWCC4K4mtjO3qIhk1ldto2dfTmmn/rN+MQ==@vger.kernel.org X-Gm-Message-State: AOJu0YxH7Borc4ICHhRxU5lAtTcuIk7kHSRdYqpYQAR2D6TQJ18cYM/u IzbKwdPK+TUFJGCFd130jRqkG+K7mXiGA5m2OIZsYE6sp6HdUicc X-Gm-Gg: ASbGncvvulXS+WU6SVpSnfmdRetN4YZXSUsqZ1K8OZSi41FVEBYPvwvhO9ptMGxah9P FhUgvyAJi+cK1h5IDxwL/wHkwg5lF6nbQGAv+KrTPONJ4hxm9uf3Pn3Ymx4dSnc+XmRj86fOkCv eN5WogI3ne5+X8XvrofH4jppeBkUISmyVHuQy4dKEIfBVTIZoocBnRje86dWxnuyDAJBVzsWzOH pfKgrQTVzYx+i1Z3b8hfe4gePr6T0tbJ8LkQwPbshJsQ4gPkDkNbl4TBsC1Pegn71P6NxAXRdNz B50RI9u7viYCLBc4ZY7We3/3MoHe3qglXFmc3Xq2I5wg3FeHzu23eXftmIJfsw== X-Google-Smtp-Source: AGHT+IFCjAGP1p3Wq4QJ5aS60JfotjkIa0f7D4cCvDXHVmUyXllLzsQ7bK2n+UwtZm1GHO+ZKJguwQ== X-Received: by 2002:a05:6402:51ce:b0:5d2:7262:9492 with SMTP id 4fb4d7f45d1cf-5dc6e6e53eamr4360160a12.2.1738409951890; Sat, 01 Feb 2025 03:39:11 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:11 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 03/22] HID: pidff: Clamp PERIODIC effect period to device's logical range Date: Sat, 1 Feb 2025 12:38:47 +0100 Message-ID: <20250201113906.769162-4-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 This ensures the effect can actually be played on the connected force feedback device. Adds clamping functions used instead of rescaling, as we don't want to change the characteristics of the periodic effects. Fixes edge cases found on Moza Racing and some other hardware where the effects would not play if the period is outside the defined logical range. Changes in v6: - Use in-kernel clamp macro instead of a custom solution Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Paul Dino Jones Tested-by: Cristóferson Bueno Tested-by: Pablo Cisneros --- drivers/hid/usbhid/hid-pidff.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index a01c1b2ab2f4..488e6a6a14a6 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -15,10 +15,9 @@ #include #include #include - #include +#include -#include "usbhid.h" #define PID_EFFECTS_MAX 64 #define PID_INFINITE 0xffff @@ -187,6 +186,16 @@ struct pidff_device { int pid_id[PID_EFFECTS_MAX]; }; +/* + * Clamp value for a given field + */ +static s32 pidff_clamp(s32 i, struct hid_field *field) +{ + s32 clamped = clamp(i, field->logical_minimum, field->logical_maximum); + pr_debug("clamped from %d to %d", i, clamped); + return clamped; +} + /* * Scale an unsigned value with range 0..max for the given field */ @@ -361,7 +370,11 @@ static void pidff_set_periodic_report(struct pidff_device *pidff, pidff_set_signed(&pidff->set_periodic[PID_OFFSET], effect->u.periodic.offset); pidff_set(&pidff->set_periodic[PID_PHASE], effect->u.periodic.phase); - pidff->set_periodic[PID_PERIOD].value[0] = effect->u.periodic.period; + + /* Clamp period to ensure the device can play the effect */ + pidff->set_periodic[PID_PERIOD].value[0] = + pidff_clamp(effect->u.periodic.period, + pidff->set_periodic[PID_PERIOD].field); hid_hw_request(pidff->hid, pidff->reports[PID_SET_PERIODIC], HID_REQ_SET_REPORT); From patchwork Sat Feb 1 11:38:48 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956206 Received: from mail-ed1-f49.google.com (mail-ed1-f49.google.com [209.85.208.49]) (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 18BD218870C; Sat, 1 Feb 2025 11:39:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409957; cv=none; b=hFjRMVGh8pqekMbLiGLd/f7utSa33F0kPb2wuEkK2zyfffmiiW4AFqTHr01Hnt3D1dWS6EvLh8hpfsTYgn0mNCdMUS+BEzDTj4HL2rT2Jgtuc6mXas3tbNq3N4RzONwjWPi3WTQ6LZEkzww+YMai7xDsi28JGpKSF0eGIf0REzM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409957; c=relaxed/simple; bh=LoyKfdbmLD5YVIyqX4neirnxrenqNH8z23PNKKhKNQ0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=iH4d+Kv3MPV9eNH/xGkcpA2wQdJZ5lGPTNPT82yYuBLtpj2Iz257k/7RJhOBDwCNg+iNicG5j7TwD5zXlN+WRfkIBPtW5qg6hf45uJ+AhcDX/07SW2JtI1lRSrRZ3iaTBckPvQ4f1RarT9yo4Lqky6P6W7LOMlrNLl5bgA4xssc= 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=U1j6cYmm; arc=none smtp.client-ip=209.85.208.49 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="U1j6cYmm" Received: by mail-ed1-f49.google.com with SMTP id 4fb4d7f45d1cf-5d3ce64e7e5so540547a12.0; Sat, 01 Feb 2025 03:39:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409953; x=1739014753; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zGU+KH8qALy60yOsWjLoA1nEcSW/ZuFe45ziT+4m0gc=; b=U1j6cYmmm4yAUsZ9FslZLoeWHsoPuIR6Z7/9tPmedeuH4CvYT9r1sSVfEpDQcV2QFW eMjK8jR/cjyINKvU/3nILsACMIHcffakOWGlC25yBqrKxkZOmkFH4txObqHl0G18IH2r k/YYIQ9k+WU4TPDqNTnigEtyr9HWGFphy7HIojfeiT5yqpOO5nnQe16E57cKJDLXdKBs 1yLFTCaPdKMxDptVLYkbmEjFpoMhCBPURhflqH3nBYYVUAvNrl9PHR8y2sGQ17abC204 ew+fk5YfUaRUQQ3CfhljtBopr9Z6HJqtgJqYk2YYQjaB6ZPUIEtAf2s1bsY2Y/bpj0N7 TSbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409953; x=1739014753; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=zGU+KH8qALy60yOsWjLoA1nEcSW/ZuFe45ziT+4m0gc=; b=gCBeaGQdxc2hnQdnkT1KIWorywVbeiY6kD49pQf2CS5+gZAveJ5zf+43l4923dfKg5 qOFd6YHu3XkCErz68xQAEycbjYwlAv4mTfY5c1V2aN4Je0dZjhfTXDNto2DfKxctCQtu vU77nW4euWipPmAZaDnOeEeJUlAP2NjlYVScqnnwq8by1hIKIZHkYY6IqUBzWPInQ1cv vZVjTTBJNWDTt0SBbG+7Ju/6ERyQMYdvdALD/xLzMAri5ndSwOc/7s1isduwoJuHctxc /dIjgcaXRZA4F3Dia8W0FrqlgRGU88dYqypuoUN8AurVUIhpDSprfWbuk90QNdFuTX/R 798A== X-Forwarded-Encrypted: i=1; AJvYcCXK4/wwPin/9sf/o7N3grM2+iTAzSJYnb2mIQShGZvLU1GGVtQV46T06DoOBr2tUAVfiMg3063Vqt8p@vger.kernel.org, AJvYcCXfDTq0ueJNnAyW0Hzx1YBRVFSk7NCJeeah/boYng5LwSgtoWarq9wTvGwg1aLczJHcrAkYpT+sO6aBNA==@vger.kernel.org X-Gm-Message-State: AOJu0YwHSE0xFH2KsdTm1UwFUVPaKosocc2IhfOjYQSmpS/Y1BMNV9hJ pOA3klNSWZ0TnfIffA7cmB5yRsehSiCjnK4a1vzs7vR03DTM96ek X-Gm-Gg: ASbGncs0/DhUBwEvygvYIY7lTjbv1kKjCkHT021d8KruvufqYNSXUVjcPL+69YtIuIh tNm3blOofViFe+XH8LRcQYponpbaNsQbwc8PivVDypV8bizj9SLcgqW2svRY17n6UoFAgkJyqIp gw8r9OMKgu4yhOzalwRJZydfWEvuF0O+6yZv4olPQsf7OU9wlAplTpZFX3y03JZX015YH7UBXkD QksmByMeWZ/OJ0Fybj7sehUtq/S9VbqW4KMCedA/r7+V8Ym7A/13KdtFShiVgemCicsNXYbEhCP 24Js5DYA3IOi7HRPM+uPpgCds3oXbypyQo1hfxdFV+ERq/RfqYvmcgvzZWyGNg== X-Google-Smtp-Source: AGHT+IE9keXN+lqbVLjG8oTS5YJcK9LtKC6IpdmHQ5Re8MIlbkB/Fzl8r/i6bNBSEZ6h48XvCXsssg== X-Received: by 2002:aa7:cb86:0:b0:5dc:742c:c8cb with SMTP id 4fb4d7f45d1cf-5dc742cccfdmr3077017a12.7.1738409952975; Sat, 01 Feb 2025 03:39:12 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:12 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 04/22] HID: pidff: Add MISSING_DELAY quirk and its detection Date: Sat, 1 Feb 2025 12:38:48 +0100 Message-ID: <20250201113906.769162-5-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 A lot of devices do not include this field, and it's seldom used in force feedback implementations. I tested about three dozen applications and none of them make use of the delay. This fixes initialization of a lot of PID wheels like Cammus, VRS, FFBeast This change has no effect on fully compliant devices Co-developed-by: Makarenko Oleg Signed-off-by: Makarenko Oleg Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Paul Dino Jones Tested-by: Cristóferson Bueno Tested-by: Pablo Cisneros --- drivers/hid/usbhid/hid-pidff.c | 33 ++++++++++++++++++++++++++++----- include/linux/hid.h | 3 +++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index 488e6a6a14a6..e2e431dec936 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -184,6 +184,8 @@ struct pidff_device { int operation_id[sizeof(pidff_effect_operation_status)]; int pid_id[PID_EFFECTS_MAX]; + + u32 quirks; }; /* @@ -338,7 +340,10 @@ static void pidff_set_effect_report(struct pidff_device *pidff, pidff->effect_direction->value[0] = pidff_rescale(effect->direction, 0xffff, pidff->effect_direction); - pidff->set_effect[PID_START_DELAY].value[0] = effect->replay.delay; + + /* Omit setting delay field if it's missing */ + if (!(pidff->quirks & HID_PIDFF_QUIRK_MISSING_DELAY)) + pidff->set_effect[PID_START_DELAY].value[0] = effect->replay.delay; hid_hw_request(pidff->hid, pidff->reports[PID_SET_EFFECT], HID_REQ_SET_REPORT); @@ -761,7 +766,10 @@ static void pidff_autocenter(struct pidff_device *pidff, u16 magnitude) pidff->set_effect[PID_TRIGGER_REPEAT_INT].value[0] = 0; pidff_set(&pidff->set_effect[PID_GAIN], magnitude); pidff->set_effect[PID_DIRECTION_ENABLE].value[0] = 1; - pidff->set_effect[PID_START_DELAY].value[0] = 0; + + /* Omit setting delay field if it's missing */ + if (!(pidff->quirks & HID_PIDFF_QUIRK_MISSING_DELAY)) + pidff->set_effect[PID_START_DELAY].value[0] = 0; hid_hw_request(pidff->hid, pidff->reports[PID_SET_EFFECT], HID_REQ_SET_REPORT); @@ -784,6 +792,7 @@ static int pidff_find_fields(struct pidff_usage *usage, const u8 *table, struct hid_report *report, int count, int strict) { int i, j, k, found; + int return_value = 0; for (k = 0; k < count; k++) { found = 0; @@ -808,12 +817,17 @@ static int pidff_find_fields(struct pidff_usage *usage, const u8 *table, if (found) break; } - if (!found && strict) { + if (!found && table[k] == pidff_set_effect[PID_START_DELAY]) { + pr_debug("Delay field not found, but that's OK\n"); + pr_debug("Setting MISSING_DELAY quirk\n"); + return_value |= HID_PIDFF_QUIRK_MISSING_DELAY; + } + else if (!found && strict) { pr_debug("failed to locate %d\n", k); return -1; } } - return 0; + return return_value; } /* @@ -1088,11 +1102,19 @@ static int pidff_find_effects(struct pidff_device *pidff, static int pidff_init_fields(struct pidff_device *pidff, struct input_dev *dev) { int envelope_ok = 0; + int status = 0; - if (PIDFF_FIND_FIELDS(set_effect, PID_SET_EFFECT, 1)) { + /* Save info about the device not having the DELAY ffb field. */ + status = PIDFF_FIND_FIELDS(set_effect, PID_SET_EFFECT, 1); + if (status == -1) { hid_err(pidff->hid, "unknown set_effect report layout\n"); return -ENODEV; } + pidff->quirks |= status; + + if (status & HID_PIDFF_QUIRK_MISSING_DELAY) + hid_dbg(pidff->hid, "Adding MISSING_DELAY quirk\n"); + PIDFF_FIND_FIELDS(block_load, PID_BLOCK_LOAD, 0); if (!pidff->block_load[PID_EFFECT_BLOCK_INDEX].value) { @@ -1336,6 +1358,7 @@ int hid_pidff_init(struct hid_device *hid) ff->playback = pidff_playback; hid_info(dev, "Force feedback for USB HID PID devices by Anssi Hannula \n"); + hid_dbg(dev, "Active quirks mask: 0x%x\n", pidff->quirks); hid_device_io_stop(hid); diff --git a/include/linux/hid.h b/include/linux/hid.h index d11e9c9a5f15..94ad5a510639 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -1227,6 +1227,9 @@ int hid_pidff_init(struct hid_device *hid); #define hid_pidff_init NULL #endif +/* HID PIDFF quirks */ +#define HID_PIDFF_QUIRK_MISSING_DELAY BIT(0) + #define dbg_hid(fmt, ...) pr_debug("%s: " fmt, __FILE__, ##__VA_ARGS__) #define hid_err(hid, fmt, ...) \ From patchwork Sat Feb 1 11:38:49 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956207 Received: from mail-ed1-f51.google.com (mail-ed1-f51.google.com [209.85.208.51]) (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 4AD33189906; Sat, 1 Feb 2025 11:39:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409958; cv=none; b=Fnw2XzvkHZD9PU+OiMqX0zVfoYKVzPYSI21sQwkH4QQuqW6MaNusaSojpjK+g65r3mLOR7OI+0SNAUD3tAZCN7WkGpTgaGkLT+ITUE+a4reBQZgYVSUPywm0MjswjDZZCz9vZq5Vi+B1haXCHVGX/5W8wqgMnMuX6oLNNvgkrDU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409958; c=relaxed/simple; bh=GQ3JpWD6lxEIaQRVWAAtfVtE94/PmGLpvqY0nJ/sBdA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=uvLRRnqzLWn9wuetEnn2dvIk6nouRWmXN41DN+fGBMSA5W2Vygh/biUF8sU0joERmgtEGXSpda4a0bQochiKLMpigt8k//89w9+3Ibkqw0FDcJXYMsZ14so/GlNJt6DEazb49OtlVlIaRw9q8hoYq5AhDZHBA90NnPL3QUoj1uQ= 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=M5Nzb5qX; arc=none smtp.client-ip=209.85.208.51 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="M5Nzb5qX" Received: by mail-ed1-f51.google.com with SMTP id 4fb4d7f45d1cf-5d3cd8e59fdso495317a12.3; Sat, 01 Feb 2025 03:39:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409954; x=1739014754; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=SskOiPZbWJ15hO5k1Oe8mGYcXU3EStCinQJvQ3udzKM=; b=M5Nzb5qXvk45mxzSovhSTM7tAfngGMYjVC6/12k9++RlUqLX3HipQc4hkKMyOlo971 3olbD9S6USwrXQjXwZ6fB9solEA2i5+IlxhhIcnz4fnf+Dkwv/x++YNsHqE0xLOAPx8o Xzg82FocpB4DZECbr7aNsu+LeICcCdYSmoGrthbKDTb71+IADgirpIzQSY7rEL53a2lv hKtfiU4SDuGnFm1/W/5QdtsAzaqj22+R8FQFBaayjIZgsXE5SPJz7SYOKk3krcPhLAjh DIunWGBkoqWmdvmhnFlFHbTY1Urv0Vxj+MbhXgUwUpSh7b0GaDDH0PeraEXrx9UE9llX FjJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409954; x=1739014754; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=SskOiPZbWJ15hO5k1Oe8mGYcXU3EStCinQJvQ3udzKM=; b=Kd1qcm3hvbyxT45fEwwHBEyUFIYg7gWLNYvpiZwv8RhYgCLFWuJPeF4Om7HnB0/3WT 5drtlDiuU7vcSGJK+PTrod5Uza4UKHBufLszj7XITpHJHsQ/1iIkgRndHkX/W4X1Ql17 cdVavX3VfZiS71xgBho4YBrHqmLA2bZSv0STqNY6WpM79t92jkelEMZ8kTwb5mww1G+0 7IVtKqNDc/z1/Y8v0XAR5nVu55dKRZiENK2agUmaJwP7SuZY3biG1N5S1CBVykilape2 +QZqmFZVsgSldsUSrDR9uTlPstNhY5x8l8IjknvgtotkOwOXW+QFx3pjK8UZBE8ePYk/ Qn2w== X-Forwarded-Encrypted: i=1; AJvYcCUX/sJHE1PXeaOaTMxKQaV+ZF8AAliknSa2/UXmrbs4h8wdXnVitY7FleEfkRvOsSFTgSPokz68kwR3@vger.kernel.org, AJvYcCVz9tJVwOhcZBWUFiIZBPDURtU9fNls4U3wgRbqkHxjUbUNZrlsKrmHoh3q+dBmESOtlpiUL6h3puh8AQ==@vger.kernel.org X-Gm-Message-State: AOJu0YyMCAvNYJbjKLNdcrz/FpYWPTnSe+fv1kzyE79yjbDvx7B+wFY+ NU4jha4i4lH6Dm33BqDsMMf/PQBdAj2vcMnWWffplW6TbSRtTcK8 X-Gm-Gg: ASbGnctC9K7XbouRbFQ9EbrNATOVohT/vntxtAybmpTDPUuj1MDpcBRz1pNpcYHSfUR SKzBVSvPK6YDLwahcqsr/Na1o0QmbU8TzRrYKBSEY7Yuve/OFUoc3qhKkfPbciGErc6N2YxUdLq JifCe7yfQZyUvCkJ98Zwa0SFzrJYIaiw7wsCShtQUEGKNK62Qpdq6n6XDO6pZITgpt/4n/9j9w5 PqEX+ujB+R65G9IQdUBfeG/xyItaJ0c6lrwYLACIfnzsj+qh1r12OZrBtBsyMIuDK99pb+S9Lwt quHnGsKhBC4gaBg1VDM2P1g+Wd+ioybPaUJBH6GBgKJB8qAMSd7selCZNHmdDg== X-Google-Smtp-Source: AGHT+IHAfpCrjARwVk+sIeSKHzXRNBRtKaZbfLFmHfKNIYOb0vIYJSMiXSinq1RuzI+HXPJfIhIJVg== X-Received: by 2002:a05:6402:6ce:b0:5dc:7374:2613 with SMTP id 4fb4d7f45d1cf-5dc737426b2mr3100183a12.1.1738409954186; Sat, 01 Feb 2025 03:39:14 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:13 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 05/22] HID: pidff: Add MISSING_PBO quirk and its detection Date: Sat, 1 Feb 2025 12:38:49 +0100 Message-ID: <20250201113906.769162-6-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Some devices with only one axis are missing PARAMETER_BLOCK_OFFSET field for conditional effects. They can only have one axis, so we're limiting the max_axis when setting the report for those effects. Automatic detection ensures compatibility even if such device won't be explicitly defined in the kernel. Fixes initialization of VRS DirectForce PRO and possibly other devices. Changes in v6: - Fixed NULL pointer dereference. When PBO is missing, make sure not to set it anyway Co-developed-by: Makarenko Oleg Signed-off-by: Makarenko Oleg Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Paul Dino Jones Tested-by: Cristóferson Bueno Tested-by: Pablo Cisneros --- drivers/hid/usbhid/hid-pidff.c | 47 +++++++++++++++++++++------------- include/linux/hid.h | 1 + 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index e2e431dec936..89a1b6a55c1b 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -404,13 +404,19 @@ static int pidff_needs_set_periodic(struct ff_effect *effect, static void pidff_set_condition_report(struct pidff_device *pidff, struct ff_effect *effect) { - int i; + int i, max_axis; + + /* Devices missing Parameter Block Offset can only have one axis */ + max_axis = pidff->quirks & HID_PIDFF_QUIRK_MISSING_PBO ? 1 : 2; pidff->set_condition[PID_EFFECT_BLOCK_INDEX].value[0] = pidff->block_load[PID_EFFECT_BLOCK_INDEX].value[0]; - for (i = 0; i < 2; i++) { - pidff->set_condition[PID_PARAM_BLOCK_OFFSET].value[0] = i; + for (i = 0; i < max_axis; i++) { + /* Omit Parameter Block Offset if missing */ + if (!(pidff->quirks & HID_PIDFF_QUIRK_MISSING_PBO)) + pidff->set_condition[PID_PARAM_BLOCK_OFFSET].value[0] = i; + pidff_set_signed(&pidff->set_condition[PID_CP_OFFSET], effect->u.condition[i].center); pidff_set_signed(&pidff->set_condition[PID_POS_COEFFICIENT], @@ -822,6 +828,11 @@ static int pidff_find_fields(struct pidff_usage *usage, const u8 *table, pr_debug("Setting MISSING_DELAY quirk\n"); return_value |= HID_PIDFF_QUIRK_MISSING_DELAY; } + else if (!found && table[k] == pidff_set_condition[PID_PARAM_BLOCK_OFFSET]) { + pr_debug("PBO field not found, but that's OK\n"); + pr_debug("Setting MISSING_PBO quirk\n"); + return_value |= HID_PIDFF_QUIRK_MISSING_PBO; + } else if (!found && strict) { pr_debug("failed to locate %d\n", k); return -1; @@ -1101,7 +1112,6 @@ static int pidff_find_effects(struct pidff_device *pidff, */ static int pidff_init_fields(struct pidff_device *pidff, struct input_dev *dev) { - int envelope_ok = 0; int status = 0; /* Save info about the device not having the DELAY ffb field. */ @@ -1132,13 +1142,10 @@ static int pidff_init_fields(struct pidff_device *pidff, struct input_dev *dev) return -ENODEV; } - if (!PIDFF_FIND_FIELDS(set_envelope, PID_SET_ENVELOPE, 1)) - envelope_ok = 1; - if (pidff_find_special_fields(pidff) || pidff_find_effects(pidff, dev)) return -ENODEV; - if (!envelope_ok) { + if (PIDFF_FIND_FIELDS(set_envelope, PID_SET_ENVELOPE, 1)) { if (test_and_clear_bit(FF_CONSTANT, dev->ffbit)) hid_warn(pidff->hid, "has constant effect but no envelope\n"); @@ -1163,16 +1170,20 @@ static int pidff_init_fields(struct pidff_device *pidff, struct input_dev *dev) clear_bit(FF_RAMP, dev->ffbit); } - if ((test_bit(FF_SPRING, dev->ffbit) || - test_bit(FF_DAMPER, dev->ffbit) || - test_bit(FF_FRICTION, dev->ffbit) || - test_bit(FF_INERTIA, dev->ffbit)) && - PIDFF_FIND_FIELDS(set_condition, PID_SET_CONDITION, 1)) { - hid_warn(pidff->hid, "unknown condition effect layout\n"); - clear_bit(FF_SPRING, dev->ffbit); - clear_bit(FF_DAMPER, dev->ffbit); - clear_bit(FF_FRICTION, dev->ffbit); - clear_bit(FF_INERTIA, dev->ffbit); + if (test_bit(FF_SPRING, dev->ffbit) || + test_bit(FF_DAMPER, dev->ffbit) || + test_bit(FF_FRICTION, dev->ffbit) || + test_bit(FF_INERTIA, dev->ffbit)) { + status = PIDFF_FIND_FIELDS(set_condition, PID_SET_CONDITION, 1); + + if (status < 0) { + hid_warn(pidff->hid, "unknown condition effect layout\n"); + clear_bit(FF_SPRING, dev->ffbit); + clear_bit(FF_DAMPER, dev->ffbit); + clear_bit(FF_FRICTION, dev->ffbit); + clear_bit(FF_INERTIA, dev->ffbit); + } + pidff->quirks |= status; } if (test_bit(FF_PERIODIC, dev->ffbit) && diff --git a/include/linux/hid.h b/include/linux/hid.h index 94ad5a510639..29f0a91f505f 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -1229,6 +1229,7 @@ int hid_pidff_init(struct hid_device *hid); /* HID PIDFF quirks */ #define HID_PIDFF_QUIRK_MISSING_DELAY BIT(0) +#define HID_PIDFF_QUIRK_MISSING_PBO BIT(1) #define dbg_hid(fmt, ...) pr_debug("%s: " fmt, __FILE__, ##__VA_ARGS__) From patchwork Sat Feb 1 11:38:50 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956208 Received: from mail-ed1-f50.google.com (mail-ed1-f50.google.com [209.85.208.50]) (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 5893F17CA12; Sat, 1 Feb 2025 11:39:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409960; cv=none; b=iYDwy+n7h99uFMiT6TkfbSlhIjpVxbXAI7/zz+yR7irYSVTq5q4fdMFO/PoUkt5IW2V31dOZ9cFnHU+VFXLhGC+PFsXXuwnFhbZ5iQL700V2c86+QV6Wdjcoy1Q6LfCfH9Fic2HUa/izh1HsWzKe9edzBrtc6xu/kEvWfLuR09M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409960; c=relaxed/simple; bh=b5AWzeHI8d8dMQr8TmNVU+eM332U5LBwkIMgI341bWw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=n7XIEojpEnQeYVNYPLPOXX2VqA/kCfgMR0gipcntDuQm9IQf+yorUJBstluzeEMc+VHV8yAY4MhYp3yewzr6IRYKYySBzB0dFqMBAIJO8BaJlDmV9HEyFU/uYN5R7Idd1LHeB4QVT2HNj0dY7YqQN64GgEwuIwclSAyM1mziynU= 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=ZMDDR9AL; arc=none smtp.client-ip=209.85.208.50 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="ZMDDR9AL" Received: by mail-ed1-f50.google.com with SMTP id 4fb4d7f45d1cf-5d3ea2a5a9fso578452a12.2; Sat, 01 Feb 2025 03:39:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409955; x=1739014755; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=P6PwbBbS6M7koMjDVRjKrgiU6XmFc9klIKPaT4H2PlU=; b=ZMDDR9ALRzdi/zWTlZZhQSuyq9XypnbrneKf+DSWjIDo3IJ0D7APNc3qNibAW5e9Tf 8EPH/hXPTIv9fmc17sQJmWAREV4Fu5tdi9KzvEBklRK1Kek1XivBpz+yVt794NEt0n8j LwwvjsR/RAlryw4sSbCHcQ7dvTPm0TwGih0PRDrnn0MOMLiXGseLX1s4qMVa2CjShjGW VDdMm9mH5wkpRn7t3wZcqGfQkGWxt/NtJ+syHxcR7+O/LejhDODMkq9+Jrdxy8gXa/ZO WfSk96BWrd/kpnd8kZX3QqezNbuccVtjHgV5QgRhqEPMzPyH8YEcoax70f0KJKkLb2X4 PcnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409955; x=1739014755; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=P6PwbBbS6M7koMjDVRjKrgiU6XmFc9klIKPaT4H2PlU=; b=oT5TJuwSv/YKlF2HPGzyAZaffJ9Bb+rnCigkMO6MzWHUhOdVUU+KGzFOqo8ZAgfjmZ ZntAE6tsSMHRy3/7OYjDacE+IIb9QHstnnKhUvimglwE4SqC7BsmsGdtanLEy5fpwKsj 7b3cVCWs4g6IfGZtMyUIyoqu7AMa+j413afIKk/8jgixkf7qxm4RIJiAQrPKCHsmHeK5 H2at1lJ41qe7t+BuJJeQQ/fQqXLyGXFBWAuj+2Wd919WHDnbfU0VYHmlD01RsgqTiYti szubAT3UMxIFVYTPBiusIs+rcEamu2UtThvuH0t6hoJCjC++WkSSwIKp49n8bMdbK0I8 4kfQ== X-Forwarded-Encrypted: i=1; AJvYcCU++PYwlzQlyPo10jgN91uVktNAWnfCESDnRWBERBgqyMf5/N/MkydXHvT6QQuhq2YCdGnbpx0LjYfp8Q==@vger.kernel.org, AJvYcCUrYGMdp8CkqX7iiqcx6frvyZaJLkTy9EDOe/gN4o9xezsQZZDl47aHBaHZVCLwj35X/xiL7Ey2lGB1@vger.kernel.org X-Gm-Message-State: AOJu0YykHl62PC1JokLc5YOcsE8mPAlVezzuboIfjU87E4NSEt3ZzFM2 g9txDccTUpaWjRGc+b35vbbAELN+Vi3PtxoXz8UmDLMMJlQfZFUJmMhPng== X-Gm-Gg: ASbGncvsuL1hnbsQYZGmTGIrKLwTN4Je3zM2Z+FUG8UT61YL7UpLb6+fLRPZtkoaLe0 hJ6olfyDWQc1OFtmdWo9ier9wntEx4cZSdMeht5sNpQgttiU9m7PkdNWD9OGypJp9GSacOrHXLD th7+hvJ6PEVZQDtI8P1dOqJecM1pqsaM0NRKuPKFwzmeC4oF4NMNIv8JZssjL1Pwp86dg8u7NpA psbOLThLs5OApvIa1TtKFqBZQiKaYTlNppjSX3G4Vva6FiPpm+uMiIZ0W6vEKgO9CmUonASfCEY 9AF3LrnH/XB6x4blBYN98wtZoJCoyIseoI6W7g04cadSp6pWLjAEe1tYceSCYA== X-Google-Smtp-Source: AGHT+IGr8u9CiFp/7aiY/xbsEdbAYiBHBKO0F3vKcruy6eCjtx822JS4OQ6RY4LjclX8zqWUVl0H3A== X-Received: by 2002:a05:6402:321f:b0:5d9:cde9:2bc6 with SMTP id 4fb4d7f45d1cf-5dc6e944677mr4756183a12.6.1738409955356; Sat, 01 Feb 2025 03:39:15 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:14 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 06/22] HID: pidff: Add PERMISSIVE_CONTROL quirk Date: Sat, 1 Feb 2025 12:38:50 +0100 Message-ID: <20250201113906.769162-7-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 With this quirk, a PID device isn't required to have a strict logical_minimum of 1 for the the PID_DEVICE_CONTROL usage page. Some devices come with weird values in their device descriptors and this quirk enables their initialization even if the logical minimum of the DEVICE_CONTROL page is not 1. Fixes initialization of VRS Direct Force Pro Changes in v6: - Change quirk name to better reflect it's intention Co-developed-by: Makarenko Oleg Signed-off-by: Makarenko Oleg Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Paul Dino Jones Tested-by: Cristóferson Bueno Tested-by: Pablo Cisneros --- drivers/hid/usbhid/hid-pidff.c | 3 ++- include/linux/hid.h | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index 89a1b6a55c1b..3f429936d537 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -982,7 +982,8 @@ static int pidff_find_special_fields(struct pidff_device *pidff) 0x57, 0); pidff->device_control = pidff_find_special_field(pidff->reports[PID_DEVICE_CONTROL], - 0x96, 1); + 0x96, !(pidff->quirks & HID_PIDFF_QUIRK_PERMISSIVE_CONTROL)); + pidff->block_load_status = pidff_find_special_field(pidff->reports[PID_BLOCK_LOAD], 0x8b, 1); diff --git a/include/linux/hid.h b/include/linux/hid.h index 29f0a91f505f..92a484f65a87 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -1228,8 +1228,9 @@ int hid_pidff_init(struct hid_device *hid); #endif /* HID PIDFF quirks */ -#define HID_PIDFF_QUIRK_MISSING_DELAY BIT(0) -#define HID_PIDFF_QUIRK_MISSING_PBO BIT(1) +#define HID_PIDFF_QUIRK_MISSING_DELAY BIT(0) +#define HID_PIDFF_QUIRK_MISSING_PBO BIT(1) +#define HID_PIDFF_QUIRK_PERMISSIVE_CONTROL BIT(2) #define dbg_hid(fmt, ...) pr_debug("%s: " fmt, __FILE__, ##__VA_ARGS__) From patchwork Sat Feb 1 11:38:51 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956209 Received: from mail-ed1-f41.google.com (mail-ed1-f41.google.com [209.85.208.41]) (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 7E99619149F; Sat, 1 Feb 2025 11:39:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409961; cv=none; b=YkskZvmyXF6G4mA25BzX98Ibyv4S3IieONvV749qMBYbP3Pd2uiOd3Ect2nhA0hCswReU9lAtzk9jngqShf5I2Fv3JCziG47RoSsqIHXkEF+0E+JQPJRvdU39y1KaY8NbnseMt0woBJmWmclYhB8z97fP39DHW3mCTlhMr7VPHM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409961; c=relaxed/simple; bh=RC8tE5dn6tSLsRcorf8rLKjbfnJbGGPXFMYYip00yv0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=uQP+/B11MASdQPeG3V3/lwnWYB8+al1Ttf7ElqEDJFIt7vRrASpryJHi4IhiOh03R1ahIBp5qqX9lG+4L/5iLfQC9XLTOFESAcX4Gbt26VjVxJyQhtsRfAqKBpcV1jkTRbU13H3uPlpRm5BP9Z1RyEb/RI48Fup2rs18Q5nTr54= 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=KNuW1V9F; arc=none smtp.client-ip=209.85.208.41 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="KNuW1V9F" Received: by mail-ed1-f41.google.com with SMTP id 4fb4d7f45d1cf-5dbf65c0c4fso569553a12.0; Sat, 01 Feb 2025 03:39:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409957; x=1739014757; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hFsKbSQabaQ/wTDtrR8MGa2rRCEDwW7N4h99Qb+cx+o=; b=KNuW1V9Ft1GFF2aEzdwp6BeEQNuf9Z2dQ53PinoQ++hc7NhMI8SzFQTCJhUrIFOzjZ ygFBXuoFIWLB688lTS1VzyNqtle4fm3fIQkytTH0p/mKUpNvSBHDFsFXuhFhUmILw8jU BQD8SXFSYmMAuLbd5cGwBndyyCe+DxV5/TyIS283vstlG4IcAY4TqsB59P6d2aHZ8W0t PoCTISEU+2EMbj3nkVIKP01LxghVKH9UlK8oZ5ibm1VxXp5Oi559diosoNgV/ZIrbbmg OKg6+cCqW49EUfTxsaTwK4W3ol4ttJz9HIpR9JC+xBhD40mmGjVNrrekTRgm8Lc2bGab xY3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409957; x=1739014757; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hFsKbSQabaQ/wTDtrR8MGa2rRCEDwW7N4h99Qb+cx+o=; b=Dkm4g2agScyN+ttcQhmj2DkbzUsLZO73V4SqcKmdo/UfteO4xWhZIKzBZC9d8l6eL2 teo67+sivlWykT8IRVyAlS2ZmbYa8STlL+6+lt5DkztZneHCpp7xJIMnxSxMEi1XBAry 0nW5usCur7BkrsMdz4Y0mjRpHznxA64eUdt8VVfKiwffre5Xppmjdovrkk9u4tIRl833 FmEtMCa3G7PlMjNpUJZmZBHDlbBB5vLA4l7DD3WeKz+RrX+02ULLxpco2ucLaLWi66yP ECZz4XEgtQjEK/lP2OeFzgTr5qyDhjIVZj8QT5+p2gJ0rTYYYI9InP4lUq3coqTgYOI2 THVg== X-Forwarded-Encrypted: i=1; AJvYcCUHkbI1SgXwfx/MKx+hbCCoUkBlTkSv9WD1JsNdBcCZFJeELNuri+hJ4mzodJ/c+LKXZ3BoqrF+CkOIXQ==@vger.kernel.org, AJvYcCUoO5hhUf4+7bdWl+iMW/d2wPKOpIuuaMBGlM140NexLK8oGhhoAjV71lqocMJBKvlnZ/reVsOqbAOB@vger.kernel.org X-Gm-Message-State: AOJu0YysNMnWONUi2M5OphAk2BT5/YmrJc4dPTT0oG/f0N2rItkdLES2 RAOlfVjNVPuOE+Gh4xVBVX+ZE/Mj8i1LFLEjH9XN6PBNfq4woFr4 X-Gm-Gg: ASbGncvzZcyV1jO6qxAznORwIkcWUuBcm7Of4QDWJhrRXZ72yp8S6bUM018a0Z5U7Uc RoqzBVywSiYNpvkuDT4bZGpBoLLhga0CIYC5YENtSj8dvFP0GVsbncBvv38wEnQ6a4VWAyua/hr 1JKlYlJnE35QIHkZg0h68myKUhjZ2mJ2EvEHeT5s4Z6+M5vbNtE1Di/JD5NkadM7z0qywQrbk9z 7oYgdhwHaJlzI20Aakre/4bVdtLESMMwByzWdwiEAB3BWeCOZgh8yHl8YrlRaxi1cDy+JJj78VZ w27rcBONJL9/zaLdSHrKONpMKOtYTtErjreZMhvSenz0jJzlR+QLqfFLHpRn0w== X-Google-Smtp-Source: AGHT+IFXDpZoghBwLpdga6qtBZjEsdW9YJRAcPl6/QRw01ZkdCZC2K9kO42HZe80YtnfT8Qj0HSyZw== X-Received: by 2002:a05:6402:2b93:b0:5dc:87ff:e17f with SMTP id 4fb4d7f45d1cf-5dc87ffe2dbmr1826308a12.8.1738409956562; Sat, 01 Feb 2025 03:39:16 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:16 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 07/22] HID: pidff: Add hid_pidff_init_with_quirks and export as GPL symbol Date: Sat, 1 Feb 2025 12:38:51 +0100 Message-ID: <20250201113906.769162-8-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 This lays out a way to provide an initial set of quirks to enable before device initialization takes place. GPL symbol export needed for the possibility of building HID drivers which use this function as modules. Adding a wrapper function to ensure compatibility with the old behavior of hid_pidff_init. Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Paul Dino Jones Tested-by: Cristóferson Bueno Tested-by: Pablo Cisneros --- drivers/hid/usbhid/hid-pidff.c | 15 ++++++++++++++- include/linux/hid.h | 2 ++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index 3f429936d537..298a971c63fd 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -1281,8 +1281,9 @@ static int pidff_check_autocenter(struct pidff_device *pidff, /* * Check if the device is PID and initialize it + * Set initial quirks */ -int hid_pidff_init(struct hid_device *hid) +int hid_pidff_init_with_quirks(struct hid_device *hid, __u32 initial_quirks) { struct pidff_device *pidff; struct hid_input *hidinput = list_entry(hid->inputs.next, @@ -1304,6 +1305,7 @@ int hid_pidff_init(struct hid_device *hid) return -ENOMEM; pidff->hid = hid; + pidff->quirks = initial_quirks; hid_device_io_start(hid); @@ -1382,3 +1384,14 @@ int hid_pidff_init(struct hid_device *hid) kfree(pidff); return error; } +EXPORT_SYMBOL_GPL(hid_pidff_init_with_quirks); + +/* + * Check if the device is PID and initialize it + * Wrapper made to keep the compatibility with old + * init function + */ +int hid_pidff_init(struct hid_device *hid) +{ + return hid_pidff_init_with_quirks(hid, 0); +} diff --git a/include/linux/hid.h b/include/linux/hid.h index 92a484f65a87..e6e9081d7dac 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -1223,8 +1223,10 @@ void hid_quirks_exit(__u16 bus); #ifdef CONFIG_HID_PID int hid_pidff_init(struct hid_device *hid); +int hid_pidff_init_with_quirks(struct hid_device *hid, __u32 initial_quirks); #else #define hid_pidff_init NULL +#define hid_pidff_init_with_quirks NULL #endif /* HID PIDFF quirks */ From patchwork Sat Feb 1 11:38:52 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956210 Received: from mail-ed1-f44.google.com (mail-ed1-f44.google.com [209.85.208.44]) (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 D99C415C15C; Sat, 1 Feb 2025 11:39:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409961; cv=none; b=aQTITqSira7bX6TV4+t2jafetfMEgHIyV0WkS2FJrRy8nQO1hvtdILaPbOq5oSJcsExR7VZ0mSKWN5gEKjIddRAzUWa9pjuB9+wi3/OwK9qPJDoo23IdBx8d5sjOGcC0oZP0C7aeg/Sygrdk9HvLJFgw8ai/jHUKbojXwTYywQ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409961; c=relaxed/simple; bh=cKMQxhufQL8VekFejXcHHOhtc1h4AiSN3OXkML6No20=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=D90Lz/2G3yoLlo4MoRO95NVFNjXxjWF8/IIse0qPktIPcE7hQLwsgwy5DEWNSh9dXb5TSCM4jb82BNE94Byl+s6b6TvXDt5UR4mh0px17x0GQvLqBVX5K6Ff17of4XDamVNwiZ985EXv/qypt7xhM2MX+dTTjwqhE6AJWt01bVs= 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=RBqYLXgW; arc=none smtp.client-ip=209.85.208.44 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="RBqYLXgW" Received: by mail-ed1-f44.google.com with SMTP id 4fb4d7f45d1cf-5d3cd8e59fdso495328a12.3; Sat, 01 Feb 2025 03:39:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409958; x=1739014758; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hiVUhAAIDv4+MyBAU0QWqGizN9/DirOuQTI3jo6M3F0=; b=RBqYLXgW6fZRAfIrQPL6nZ4gpsvWd9BX3RN/yZRIiK7NYBkxAyOaPJfTvTeJcAlPhk lTuCwDFyKP0muwfohSTgdqDhq4/0lQWquW9TayECPDkKRUCWiItFmnTGwD4Dbg2eNNDT HxpBNG8iBqxz9gFl58KH35XyhGYA+c/Nt90paG9hAX0xSyU4szUiXr5jNv8LnSJuCH/G ydOQc6IC45AJ7Dx19RhxppEHVJO67CZo7T9kU7wosh4/dMKTK/RwudKZRx1DC4MQucJI G7Xu3gW2tBOrtXNj5u6n4w7ZSqfT19Zgvcb6u+5QYqF3z7uNTrXPzC+0fmX3oFljqRfQ zQTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409958; x=1739014758; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hiVUhAAIDv4+MyBAU0QWqGizN9/DirOuQTI3jo6M3F0=; b=Kzl9Ed4gF6UixMjDNFvZvmFy4WHi3DOzt5H6E334r2rvb+NNatzZdhKq262KzhdjBd gYNvsYZfyVJor+SQUOOCF8nV5cOyyHP85agp4jDlIfs2fGzr7CkLElPTFD08v/APGXOA tnGGNRSC1ico13VK8Y7krx1oCZ7B+Of6sYShjcNDABaSZXOoU9/3vmA9DPVG6+LaTGjS lM4H59kgHwS8J2wsg/zq7JFr4WOReBRnsUALReqyMYJnzfMHgQO0lVYIfvUiIBKZju6j y/pYg5UFiwM9vOI3EY8Pnt/8tXA808Id/aWf3zoT5s+rsCixO2VPX40vvwySuzz/ydfj PXVw== X-Forwarded-Encrypted: i=1; AJvYcCUQutWiwRYD8efqu1EPFJPMq4+5cHbi981SdfEiHhebOI3KjTSRygHZVdrFDWPubQiS/URZ7ixJ4HzZ0g==@vger.kernel.org, AJvYcCUua77faPwukOcFzCo9+S+0WnCxetFEMCjGDR1tIdeNFfx+foVFZTmUbIXNzALQ9ETy/yH87QSGoYcV@vger.kernel.org X-Gm-Message-State: AOJu0YwN2xA6o51rm2EhFODueFV5gAvDW5+Z3R+YrobIKd1cwy1PHWpH UrFmiyNNcj7pfTvoHfbuzRo/7ZexWobH4Ox7zCdiYVuQKWN4b/8y X-Gm-Gg: ASbGncs2glbD6bRwNhWjWIzTZ+JlIxuJhXyPnmUjyi4c+5TB0iueLFD8OnUA5kRLIqH 1KNhneecydg4y5zOkYvlcUuNamIZkprKN39rvGtxncIIWLvnkSQlzBWsBtyiU+pILo3du0h0Bpa ZAxdnDyINiTklv6ueKOTAglZlUT9qs8tbW4eBjgsr8t9VJOAhwdMbGu2fOfEOMwDHl6nLa74lNy zvfKBgFA1HJPBTp0vs5PMeY1qKuIjVGBWfXjxMsrgfxAbCL4KHPSn261HqGZU0gEeRMDqAFutt5 m3TzZuVIGxASbly2Jv11WRkZz/X/B4KugiE6xPAz4Dc97I5iSMJvVTXXXIBU8Q== X-Google-Smtp-Source: AGHT+IEYnT5yXak9RUjju1duaZ8gPTnPzROagQBvUg1bIyARNQs/48kKa7QFxToU8Voi2LQlTtuI4Q== X-Received: by 2002:a05:6402:5019:b0:5dc:7fbe:72f1 with SMTP id 4fb4d7f45d1cf-5dc7fcdb68amr3217789a12.2.1738409957991; Sat, 01 Feb 2025 03:39:17 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:17 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 08/22] HID: pidff: Add FIX_WHEEL_DIRECTION quirk Date: Sat, 1 Feb 2025 12:38:52 +0100 Message-ID: <20250201113906.769162-9-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Most steering wheels simply ignore DIRECTION field, but some try to be compliant with the PID standard and use it in force calculations. Games often ignore setting this field properly and/or there can be issues with dinput8 -> wine -> SDL -> Linux API translation, and this value can be incorrect. This can lead to partial/complete loss of Force Feedback or even unexpected force reversal. Sadly, this quirk can't be detected automatically without sending out effects that would move an axis. This fixes FFB on Moza Racing devices and others where effect direction is not simply ignored. Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones --- drivers/hid/usbhid/hid-pidff.c | 12 +++++++++--- include/linux/hid.h | 1 + 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index 298a971c63fd..9e03dfb2b1e7 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -136,6 +136,9 @@ static const u8 pidff_block_load_status[] = { 0x8c, 0x8d }; #define PID_EFFECT_STOP 1 static const u8 pidff_effect_operation_status[] = { 0x79, 0x7b }; +/* Polar direction 90 degrees (North) */ +#define PIDFF_FIXED_WHEEL_DIRECTION 0x4000 + struct pidff_usage { struct hid_field *field; s32 *value; @@ -337,9 +340,12 @@ static void pidff_set_effect_report(struct pidff_device *pidff, pidff->set_effect[PID_GAIN].value[0] = pidff->set_effect[PID_GAIN].field->logical_maximum; pidff->set_effect[PID_DIRECTION_ENABLE].value[0] = 1; - pidff->effect_direction->value[0] = - pidff_rescale(effect->direction, 0xffff, - pidff->effect_direction); + + /* Use fixed direction if needed */ + pidff->effect_direction->value[0] = pidff_rescale( + pidff->quirks & HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION ? + PIDFF_FIXED_WHEEL_DIRECTION : effect->direction, + 0xffff, pidff->effect_direction); /* Omit setting delay field if it's missing */ if (!(pidff->quirks & HID_PIDFF_QUIRK_MISSING_DELAY)) diff --git a/include/linux/hid.h b/include/linux/hid.h index e6e9081d7dac..856bed149246 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -1233,6 +1233,7 @@ int hid_pidff_init_with_quirks(struct hid_device *hid, __u32 initial_quirks); #define HID_PIDFF_QUIRK_MISSING_DELAY BIT(0) #define HID_PIDFF_QUIRK_MISSING_PBO BIT(1) #define HID_PIDFF_QUIRK_PERMISSIVE_CONTROL BIT(2) +#define HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION BIT(3) #define dbg_hid(fmt, ...) pr_debug("%s: " fmt, __FILE__, ##__VA_ARGS__) From patchwork Sat Feb 1 11:38:53 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956211 Received: from mail-ed1-f53.google.com (mail-ed1-f53.google.com [209.85.208.53]) (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 459B615ECDF; Sat, 1 Feb 2025 11:39:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409963; cv=none; b=OwEdKdXKMWVQ97PA4HmsgK9p1hKLrvTNr7Cve6bLBWMMTkS9m0/r4av4xmdq9ySQk8ke4uZtduiVhRo8H5rmV9/D3iWGvseYIgReL4NxXISwXAlWrSxrAqiVrvDHTNzYJ5xIDG5BHirW7id+KoeEYshdBYlhU/jUs1Uf0VdY518= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409963; c=relaxed/simple; bh=zTwIXpyg0mHNtD7uCHb5GL5R3gE+O9SOPeN8sdeiguw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=hk4GykpMryxwk6FEbm/ae16CwFaNOnY2x+ylwBAOdwgCxDupLqh/1zv0X93pLn+FmXAvKB8oKhz60RFgiPT4jHrkFpxJAnrUijO2WelKF3iO6klJhYodhx3HmGnbatihj6oZUdN7dnfRFXXr/UjpZdIeJZMQJbA0bQQe3LsM8eg= 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=kKz5DgrF; arc=none smtp.client-ip=209.85.208.53 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="kKz5DgrF" Received: by mail-ed1-f53.google.com with SMTP id 4fb4d7f45d1cf-5d3cd821c60so548673a12.3; Sat, 01 Feb 2025 03:39:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409959; x=1739014759; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=OC4iGOt2xuq/oJPQvyauKugGtl8Y3SOpW/Za369SnpQ=; b=kKz5DgrFh0yFVrntO4b9qoBJU4fPmZ2RPPYfr+oXScL6a5YvMGBI602spmQx16D0JW TUPXhwO8+SwTtYIlW7RPDS/9phfIe5W+ZAHZHu6WHkmR2kowBrp7lZ/hLXJq5ipD11IH wExCNyEgYRROFtPQMUtO4ojlGkv3tnBgsT1K+cUr8KSylbJDTWp+9qqgAe40FQ4KwWXE IRZ0iBE5Qt9BIk2Pn4EGx2iY0Wz5AZ5ijICQxp7vw4ovmjPf40SEFtsF0lXjvdQ4cVGG JLTJfCNEIWQFPfbQNp0O4M94V/07KqRhaJQBORL4C+GZEWm7F14vu4ZguNcnTU/OV93H eoSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409959; x=1739014759; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=OC4iGOt2xuq/oJPQvyauKugGtl8Y3SOpW/Za369SnpQ=; b=Vz12dt28RJBWhCTIHh9xV98rGYWiza08rXP1+VFbviKh2svnx2CnuHAaaVXP72FOJH RtKNEZIR0JbIQXTHzWtJ2WEf3BJ7EhjgZXL7vVgFvz1UAFBraDTmU0Jbco9/5bENOvMw lEfimYXDycRh1tKHUIrP5i/BhdFqc5+rQzQt3Yy+BUxxy2S/iDF6PZi40D26PrwPntMN begC9pqySnj0V8nIJbu4ZeJ9w3O5lt58t4oUnNm6Zbf98RJMkxZv7idvHguEYtbbFo0M 04/PczS4e5vH0KDNdBTspenqm89/dAbpObQhuL9HwUHdPbivlVTtT8L3FrVaPInmh1xo fJcA== X-Forwarded-Encrypted: i=1; AJvYcCWDyY1xf0OO4bP5KKXxc3C1fsCxCYYuBrGfqgRdouM74oKMro/IRmdIsxfNwZZZG33nDa16ow3EerdSaQ==@vger.kernel.org, AJvYcCXRYzo/ZFeualrFuORCmiV814o1kdJdnpqUM+bsCTLMzleCsaVBlZzGNkiTbz+/KtNVgI5b2CYmkUua@vger.kernel.org X-Gm-Message-State: AOJu0Ywkcx3pu67Lzn4cRzV9jLtGTc/JZSLCBWWvxhXa2xIRIyfcPYCD dfl2aIUSQzToisCmp5pVia0AyJTktqjVUNjp6XOsQ4BST7UeRzlO X-Gm-Gg: ASbGncu4gAZ3T4blCxmR5utBkhuOfIFIR4/X4jio0+pTEiV0TUZBB3Ia75Dl2S6XMN8 UmosYc5MlAYswQCHbQx8L1a0u+MPL4d6CNdCPiwSkUlD3Wq3yEVaoQjjuCB5o7Oh5acxYXDgu3j GmWZv6yRfBOzj4d8EUOE0NXfzkdoVyTe1YW4TzxOHcQQv79WnFSF0aXuliq4OpesMBk7VLdsGek yWYcSeKLcBrWfAwvKr/p0r8cGSDbRVpUWXBAL08i1FgSN531SWgE3FQqNBW6uuDtMviUiLVAaqx fox9hk347siZkD1X7fVZEjFJvhkAfRImO+Fum4x9giJuSC6KtO2uv4/zCIRbMg== X-Google-Smtp-Source: AGHT+IHbgsjMc9CVesWDKqWbpiiEunAM453qdYij5/G9IptCofFVo1JyAUlIHoXJAk6w0hFRV/Kddw== X-Received: by 2002:a05:6402:4029:b0:5dc:882f:74b4 with SMTP id 4fb4d7f45d1cf-5dc882f7581mr2068302a12.4.1738409959309; Sat, 01 Feb 2025 03:39:19 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:18 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 09/22] HID: pidff: Stop all effects before enabling actuators Date: Sat, 1 Feb 2025 12:38:53 +0100 Message-ID: <20250201113906.769162-10-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Some PID compliant devices automatically play effects after boot (i.e. autocenter spring) that prevent the rendering of other effects since it is done outside the kernel driver. This makes sure all the effects currently played are stopped after resetting the device. It brings compatibility to the Brunner CLS-P joystick and others Reported-by: Jules Noirant Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Paul Dino Jones Tested-by: Cristóferson Bueno Tested-by: Pablo Cisneros --- drivers/hid/usbhid/hid-pidff.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index 9e03dfb2b1e7..c125f029b6d6 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -109,8 +109,9 @@ static const u8 pidff_pool[] = { 0x80, 0x83, 0xa9 }; /* Special field key tables used to put special field keys into arrays */ #define PID_ENABLE_ACTUATORS 0 -#define PID_RESET 1 -static const u8 pidff_device_control[] = { 0x97, 0x9a }; +#define PID_STOP_ALL_EFFECTS 1 +#define PID_RESET 2 +static const u8 pidff_device_control[] = { 0x97, 0x99, 0x9a }; #define PID_CONSTANT 0 #define PID_RAMP 1 @@ -1222,6 +1223,10 @@ static void pidff_reset(struct pidff_device *pidff) hid_hw_request(hid, pidff->reports[PID_DEVICE_CONTROL], HID_REQ_SET_REPORT); hid_hw_wait(hid); + pidff->device_control->value[0] = pidff->control_id[PID_STOP_ALL_EFFECTS]; + hid_hw_request(hid, pidff->reports[PID_DEVICE_CONTROL], HID_REQ_SET_REPORT); + hid_hw_wait(hid); + pidff->device_control->value[0] = pidff->control_id[PID_ENABLE_ACTUATORS]; hid_hw_request(hid, pidff->reports[PID_DEVICE_CONTROL], HID_REQ_SET_REPORT); From patchwork Sat Feb 1 11:38:54 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956212 Received: from mail-ed1-f46.google.com (mail-ed1-f46.google.com [209.85.208.46]) (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 5971F19D06E; Sat, 1 Feb 2025 11:39:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409964; cv=none; b=U2AiL5RwG7OHkr4x3GoTFlEztwikAipe0ax14B6sCSNtWd19re4qJ0bcMbeN85eV76tjttFF/+maKSRn3/x6wgt0nuBELwQcYVDH5RjnwXkxGmylbX9v+OTvm1zm+JQEldVF37cbXeiYeNFqF4INfru3mnvrwY2/Ixg0PDCjHbw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409964; c=relaxed/simple; bh=d8Jm5LKjSPtCAO4H/2mfwRYJqELnzRTa2S088FOWS80=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=G+8lotRPVHKkZbvzRQqE8AIYiDthfm0bXBhA4RooX17USxfTbsN0nIp7ZMXMS3Kfu5k9h6Yt/f4vCBIlT3MdiRDpUcmAhGxv4DpSOGPTURep9NUmnFHz+3CCFuApuPAbt1AXpDDZSp9300AJIOcYIfEDthUviFxRrePuQq5ZIus= 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=PK7z5BWT; arc=none smtp.client-ip=209.85.208.46 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="PK7z5BWT" Received: by mail-ed1-f46.google.com with SMTP id 4fb4d7f45d1cf-5dbf5fb2c39so468909a12.2; Sat, 01 Feb 2025 03:39:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409961; x=1739014761; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Z6NDM2osPcDiGS1j+VQDbNhlZJoiJ9pCbSczytHzw4c=; b=PK7z5BWTPXqpdGDAlpAlmKIQklYlS9pcZai1RR8+jZ058pP0zdd2KJEkjJSEdfW5YD Ke0ydkLDwf61HC5QLMR3t2UIEJcu1J6O6tqxMIvnktwZl5NQqA9CE1wPmmHxgQW4EIUb tnNpw7k14uYYcAdlZNa8BhMNu0Um+8gRnxBIjXbTMhAkB1uoD0TB2Xo6i81D/dOLKAG2 KoZ/fKaSD/IKwXjv1sj/c3w7n0jtbWuz4FZjPLzZHxULgjxYTVTUB2wpv3/jBiQQYIg5 ut8dhgcmURhNu4ms18oeprJlWHEGaQdsy93J5B6OSqd/3i6QfzP86yNuN/5yWkEgjmsj mTFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409961; x=1739014761; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Z6NDM2osPcDiGS1j+VQDbNhlZJoiJ9pCbSczytHzw4c=; b=E/B3lBLCe00JzxlGH5QpVcbp/mUJOdVifA08/y4F8bdCpgHP3za8XpkHpMd4niJg6A Vv/e0TmaNal7T9XSuTMfgwp2DaVyrK0ENzZloWub5iuZxIPExBmBMTs01JJNdvNf1YaL rlqVO6c9AJAdevPwFNinbps/8i3AWxtvo1+UGiUDDINvom19p4hrCBKTaIqCM+QXG/nl HO61upfcNsm9ZA2dU9twfiYvuXOGjSxrzJNcD5dKClE6zomcMgHvCitCnK8Df23xJmij y/3w7vt7BsebVL01hvV+qDgXVX0sfhmBuWpuLXAK4Cd2p9pElLBApTDXXyBNyxUh8knv eAjA== X-Forwarded-Encrypted: i=1; AJvYcCUX/8aW4XH6E9i3ftQzaBNgnL086vsKoAKSE3f/Hsspr1mww1u66Bygd4fV5Ott5kR9a2lHyAYwjf3LGQ==@vger.kernel.org, AJvYcCWvMXgouhPsNGWOJv0pEisZxl0/uBsYnuHPF77ZIb/W63X1TfXYVZLUlrjRB8Wq1o2OJaHUcFWX0lOz@vger.kernel.org X-Gm-Message-State: AOJu0Yzw5gbayGUDxwyuBQtECz8EPXbS+1Gj8OG7f7rpRZZ4/KAkTk99 BvO3K9kekDuMn7evLjpRN5IAzqH47CmzZFzHCXbK9WriGBT0R4ll X-Gm-Gg: ASbGnct8mtNV3VFFJoPvYyDO8KAFV2FJ4cZu+as3d2RDnZUxLkFuCwtr0iptPLucLtU 0ZfTCccDx08KcP3vXkI4OgwQ6x8NpYNYxp43OHs2mJ7W/nzuKW6X+3D0r0CfXYyRYtYFURMXFIL oGlp6ltUv9M4jj+VizCUIwb7LWi6u1EZs0qbsPcKNIV2oUdWdAnAwoxkyAgvPzNr+X+emMgSR2E X5C6m/esiuUBGnf5o74nSsANXFM0Frg2fuSMxzsQuVuqL1Si7BQta4aqhTWoNYKCYv/tDBOotQ3 w+z4wygNcFaKJxUPwU//0nyk1zhXx96wt6Au3fsKHSnxUm3oheY5Yh1rKVNu6A== X-Google-Smtp-Source: AGHT+IGSiYWdBg6vuBh9rSoclXJvNm0exBAZuf+qF9/MeSG+iM7kUSrqCilqb8eOb/bVWQykJPLBwg== X-Received: by 2002:a05:6402:28ca:b0:5dc:882f:74b1 with SMTP id 4fb4d7f45d1cf-5dc882f754cmr2092925a12.3.1738409960468; Sat, 01 Feb 2025 03:39:20 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:20 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 10/22] HID: Add hid-universal-pidff driver and supported device ids Date: Sat, 1 Feb 2025 12:38:54 +0100 Message-ID: <20250201113906.769162-11-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Extend pidff compatibility, usable button range, manage pidff quirks and set improved fuzz/flat default for high precision devices. Possibility of fixing device descriptors in the future if such needs arises. As many of PID devices are quite similar and not dependent on custom drivers, this one can handle all of PID devices which need special care. Numerous sim racing/sim flight bases report a lot of buttons in excess of 100. Moza Racing exposes 128 of them and thus the need to extend the available range. All the included devices were tested and confirmed working with the help of the sim racing community. Changes in v6: - Support "split" devices with a separate "input device" for buttons - Fixed comment styling Co-developed-by: Makarenko Oleg Signed-off-by: Makarenko Oleg Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Cristóferson Bueno Tested-by: Pablo Cisneros --- drivers/hid/Kconfig | 14 +++ drivers/hid/Makefile | 1 + drivers/hid/hid-ids.h | 31 +++++ drivers/hid/hid-universal-pidff.c | 192 ++++++++++++++++++++++++++++++ 4 files changed, 238 insertions(+) create mode 100644 drivers/hid/hid-universal-pidff.c diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 4d2a89d65b65..59d8da16f5b4 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig @@ -1217,6 +1217,20 @@ config HID_U2FZERO allow setting the brightness to anything but 1, which will trigger a single blink and immediately reset back to 0. +config HID_UNIVERSAL_PIDFF + tristate "universal-pidff: extended USB PID driver compatibility and usage" + depends on USB_HID + depends on HID_PID + help + Extended PID support for selected devices. + + Contains report fixups, extended usable button range and + pidff quirk management to extend compatibility with slightly + non-compliant USB PID devices and better fuzz/flat values for + high precision direct drive devices. + + Supports Moza Racing, Cammus, VRS, FFBeast and more. + config HID_WACOM tristate "Wacom Intuos/Graphire tablet support (USB)" depends on USB_HID diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile index 24de45f3677d..919d6a146077 100644 --- a/drivers/hid/Makefile +++ b/drivers/hid/Makefile @@ -140,6 +140,7 @@ hid-uclogic-objs := hid-uclogic-core.o \ hid-uclogic-params.o obj-$(CONFIG_HID_UCLOGIC) += hid-uclogic.o obj-$(CONFIG_HID_UDRAW_PS3) += hid-udraw-ps3.o +obj-$(CONFIG_HID_UNIVERSAL_PIDFF) += hid-universal-pidff.o obj-$(CONFIG_HID_LED) += hid-led.o obj-$(CONFIG_HID_XIAOMI) += hid-xiaomi.o obj-$(CONFIG_HID_XINMO) += hid-xinmo.o diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 1f47fda809b9..4870811aa2c8 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -261,6 +261,10 @@ #define USB_DEVICE_ID_BTC_EMPREX_REMOTE 0x5578 #define USB_DEVICE_ID_BTC_EMPREX_REMOTE_2 0x5577 +#define USB_VENDOR_ID_CAMMUS 0x3416 +#define USB_DEVICE_ID_CAMMUS_C5 0x0301 +#define USB_DEVICE_ID_CAMMUS_C12 0x0302 + #define USB_VENDOR_ID_CANDO 0x2087 #define USB_DEVICE_ID_CANDO_PIXCIR_MULTI_TOUCH 0x0703 #define USB_DEVICE_ID_CANDO_MULTI_TOUCH 0x0a01 @@ -452,6 +456,11 @@ #define USB_VENDOR_ID_EVISION 0x320f #define USB_DEVICE_ID_EVISION_ICL01 0x5041 +#define USB_VENDOR_ID_FFBEAST 0x045b +#define USB_DEVICE_ID_FFBEAST_JOYSTICK 0x58f9 +#define USB_DEVICE_ID_FFBEAST_RUDDER 0x5968 +#define USB_DEVICE_ID_FFBEAST_WHEEL 0x59d7 + #define USB_VENDOR_ID_FLATFROG 0x25b5 #define USB_DEVICE_ID_MULTITOUCH_3200 0x0002 @@ -817,6 +826,13 @@ #define I2C_DEVICE_ID_LG_8001 0x8001 #define I2C_DEVICE_ID_LG_7010 0x7010 +#define USB_VENDOR_ID_LITE_STAR 0x11ff +#define USB_DEVICE_ID_PXN_V10 0x3245 +#define USB_DEVICE_ID_PXN_V12 0x1212 +#define USB_DEVICE_ID_PXN_V12_LITE 0x1112 +#define USB_DEVICE_ID_PXN_V12_LITE_2 0x1211 +#define USB_DEVICE_LITE_STAR_GT987_FF 0x2141 + #define USB_VENDOR_ID_LOGITECH 0x046d #define USB_DEVICE_ID_LOGITECH_Z_10_SPK 0x0a07 #define USB_DEVICE_ID_LOGITECH_AUDIOHUB 0x0a0e @@ -964,6 +980,18 @@ #define USB_VENDOR_ID_MONTEREY 0x0566 #define USB_DEVICE_ID_GENIUS_KB29E 0x3004 +#define USB_VENDOR_ID_MOZA 0x346e +#define USB_DEVICE_ID_MOZA_R3 0x0005 +#define USB_DEVICE_ID_MOZA_R3_2 0x0015 +#define USB_DEVICE_ID_MOZA_R5 0x0004 +#define USB_DEVICE_ID_MOZA_R5_2 0x0014 +#define USB_DEVICE_ID_MOZA_R9 0x0002 +#define USB_DEVICE_ID_MOZA_R9_2 0x0012 +#define USB_DEVICE_ID_MOZA_R12 0x0006 +#define USB_DEVICE_ID_MOZA_R12_2 0x0016 +#define USB_DEVICE_ID_MOZA_R16_R21 0x0000 +#define USB_DEVICE_ID_MOZA_R16_R21_2 0x0010 + #define USB_VENDOR_ID_MSI 0x1770 #define USB_DEVICE_ID_MSI_GT683R_LED_PANEL 0xff00 @@ -1373,6 +1401,9 @@ #define USB_DEVICE_ID_VELLEMAN_K8061_FIRST 0x8061 #define USB_DEVICE_ID_VELLEMAN_K8061_LAST 0x8068 +#define USB_VENDOR_ID_VRS 0x0483 +#define USB_DEVICE_ID_VRS_DFP 0xa355 + #define USB_VENDOR_ID_VTL 0x0306 #define USB_DEVICE_ID_VTL_MULTITOUCH_FF3F 0xff3f diff --git a/drivers/hid/hid-universal-pidff.c b/drivers/hid/hid-universal-pidff.c new file mode 100644 index 000000000000..55aad2e4ac1b --- /dev/null +++ b/drivers/hid/hid-universal-pidff.c @@ -0,0 +1,192 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * HID UNIVERSAL PIDFF + * hid-pidff wrapper for PID-enabled devices + * Handles device reports, quirks and extends usable button range + * + * Copyright (c) 2024, 2025 Makarenko Oleg + * Copyright (c) 2024, 2025 Tomasz Pakuła + */ + +#include +#include +#include +#include +#include "hid-ids.h" + +#define JOY_RANGE (BTN_DEAD - BTN_JOYSTICK + 1) + +/* + * Map buttons manually to extend the default joystick button limit + */ +static int universal_pidff_input_mapping(struct hid_device *hdev, + struct hid_input *hi, struct hid_field *field, struct hid_usage *usage, + unsigned long **bit, int *max) +{ + if ((usage->hid & HID_USAGE_PAGE) != HID_UP_BUTTON) + return 0; + + if (field->application != HID_GD_JOYSTICK) + return 0; + + int button = ((usage->hid - 1) & HID_USAGE); + int code = button + BTN_JOYSTICK; + + /* Detect the end of JOYSTICK buttons range */ + if (code > BTN_DEAD) + code = button + KEY_NEXT_FAVORITE - JOY_RANGE; + + /* + * Map overflowing buttons to KEY_RESERVED to not ignore + * them and let them still trigger MSC_SCAN + */ + if (code > KEY_MAX) + code = KEY_RESERVED; + + hid_map_usage(hi, usage, bit, max, EV_KEY, code); + hid_dbg(hdev, "Button %d: usage %d", button, code); + return 1; +} + +/* + * Check if the device is PID and initialize it + * Add quirks after initialisation + */ +static int universal_pidff_probe(struct hid_device *hdev, + const struct hid_device_id *id) +{ + int i, error; + error = hid_parse(hdev); + if (error) { + hid_err(hdev, "HID parse failed\n"); + goto err; + } + + error = hid_hw_start(hdev, HID_CONNECT_DEFAULT & ~HID_CONNECT_FF); + if (error) { + hid_err(hdev, "HID hw start failed\n"); + goto err; + } + + /* Check if device contains PID usage page */ + error = 1; + for (i = 0; i < hdev->collection_size; i++) + if ((hdev->collection[i].usage & HID_USAGE_PAGE) == HID_UP_PID) { + error = 0; + hid_dbg(hdev, "PID usage page found\n"); + break; + } + + /* + * Do not fail as this might be the second "device" + * just for additional buttons/axes. Exit cleanly if force + * feedback usage page wasn't found (included devices were + * tested and confirmed to be USB PID after all). + */ + if (error) { + hid_dbg(hdev, "PID usage page not found in the descriptor\n"); + return 0; + } + + /* Check if HID_PID support is enabled */ + int (*init_function)(struct hid_device *, __u32); + init_function = hid_pidff_init_with_quirks; + + if (!init_function) { + hid_warn(hdev, "HID_PID support not enabled!\n"); + return 0; + } + + error = init_function(hdev, id->driver_data); + if (error) { + hid_warn(hdev, "Error initialising force feedback\n"); + goto err; + } + + hid_info(hdev, "Universal pidff driver loaded sucesfully!"); + + return 0; +err: + return error; +} + +static int universal_pidff_input_configured(struct hid_device *hdev, + struct hid_input *hidinput) +{ + int axis; + struct input_dev *input = hidinput->input; + + if (!input->absinfo) + return 0; + + /* Decrease fuzz and deadzone on available axes */ + for (axis = ABS_X; axis <= ABS_BRAKE; axis++) { + if (!test_bit(axis, input->absbit)) + continue; + + input_set_abs_params(input, axis, + input->absinfo[axis].minimum, + input->absinfo[axis].maximum, + axis == ABS_X ? 0 : 8, 0); + } + + /* Remove fuzz and deadzone from the second joystick axis */ + if (hdev->vendor == USB_VENDOR_ID_FFBEAST && + hdev->product == USB_DEVICE_ID_FFBEAST_JOYSTICK) + input_set_abs_params(input, ABS_Y, + input->absinfo[ABS_Y].minimum, + input->absinfo[ABS_Y].maximum, 0, 0); + + return 0; +} + +static const struct hid_device_id universal_pidff_devices[] = { + { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R3), + .driver_data = HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R3_2), + .driver_data = HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R5), + .driver_data = HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R5_2), + .driver_data = HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R9), + .driver_data = HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R9_2), + .driver_data = HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R12), + .driver_data = HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R12_2), + .driver_data = HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R16_R21), + .driver_data = HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R16_R21_2), + .driver_data = HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, + { HID_USB_DEVICE(USB_VENDOR_ID_CAMMUS, USB_DEVICE_ID_CAMMUS_C5) }, + { HID_USB_DEVICE(USB_VENDOR_ID_CAMMUS, USB_DEVICE_ID_CAMMUS_C12) }, + { HID_USB_DEVICE(USB_VENDOR_ID_VRS, USB_DEVICE_ID_VRS_DFP), + .driver_data = HID_PIDFF_QUIRK_PERMISSIVE_CONTROL }, + { HID_USB_DEVICE(USB_VENDOR_ID_FFBEAST, USB_DEVICE_ID_FFBEAST_JOYSTICK), }, + { HID_USB_DEVICE(USB_VENDOR_ID_FFBEAST, USB_DEVICE_ID_FFBEAST_RUDDER), }, + { HID_USB_DEVICE(USB_VENDOR_ID_FFBEAST, USB_DEVICE_ID_FFBEAST_WHEEL) }, + { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V10) }, + { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12) }, + { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12_LITE) }, + { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12_LITE_2) }, + { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_LITE_STAR_GT987_FF) }, + { } +}; +MODULE_DEVICE_TABLE(hid, universal_pidff_devices); + +static struct hid_driver universal_pidff = { + .name = "hid-universal-pidff", + .id_table = universal_pidff_devices, + .input_mapping = universal_pidff_input_mapping, + .probe = universal_pidff_probe, + .input_configured = universal_pidff_input_configured +}; +module_hid_driver(universal_pidff); + +MODULE_DESCRIPTION("Universal driver for USB PID Force Feedback devices"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Makarenko Oleg "); +MODULE_AUTHOR("Tomasz Pakuła "); From patchwork Sat Feb 1 11:38:55 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956213 Received: from mail-ed1-f41.google.com (mail-ed1-f41.google.com [209.85.208.41]) (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 7EDAB1A0BD7; Sat, 1 Feb 2025 11:39:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409965; cv=none; b=MWwB6b6pocdb5SXabV5iCn2uVXWcgTLX/DUwE+HxGrZbItCr3a2c/FgwpiSzdi1bCnIxcf/XBEkhSOwc2DhV/cLMZLB/GI082LYhTdge+KQxuS0q9/g7INRb6kA66HXcCVUDD69vr/1IrYpBVXQRIcLJiYDbB5WgO3jhDsI0emU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409965; c=relaxed/simple; bh=0pFjaeAZ+9vhycLHZ3O1MuBBHr1mZNnurKvZ0d++5Ro=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=pdzUZZAxxckget9VdwK84nBfMl+sApH3NTacRlImAgRLH2TM3CndJRJzYDwF1oCOY3u2bitnh5ugj2oWM0eGsJB3qlUB+nOpx1tvIta7HjwewCBUld2Bo+dIt98gyTUC7kQzjrN2CjwCTZxNQ+hQ/pQRabQMdjVxdkdxvIh6p4E= 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=mNeRjYmk; arc=none smtp.client-ip=209.85.208.41 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="mNeRjYmk" Received: by mail-ed1-f41.google.com with SMTP id 4fb4d7f45d1cf-5d3ce64e7e5so540576a12.0; Sat, 01 Feb 2025 03:39:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409962; x=1739014762; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ps9IN3g7n3XWdbEnMnsQ2U0Qa8MzxOpT9XGRt4r9KNs=; b=mNeRjYmkzIXZuqUB3xCx/rc1UUXwwO1BL8CRMakKwYWw3Wjz2xgST5sZYrLdhirDRY 2v4HtBCCHNlv3ET5dTC8tTjdCDlropunpny/DeUN8MTINCjoTxTiIdHjkVZkBHsmla+Z JYmYgvI+FaDmuhyHIv3HDr0EKLIF/mDY1Pewx7/hYdtGu4LkARsoNMewX9RhiJLCYand xuaqxFUIWTx24+ODlDwnb3w4touYPM5ch/8yaygiocmS/mms+AxTpupVwvG+mKTz9TvD z2Fib2rfupixK3Qzh+OZxsc0ucKOh2lYVts8HTl8F3RcKEpS7aocadkKGWkeunMZF7r0 GHmA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409962; x=1739014762; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ps9IN3g7n3XWdbEnMnsQ2U0Qa8MzxOpT9XGRt4r9KNs=; b=Sf4sQ3ifPC4TZf2gFDvG0DUNVmkxKsqcsPSyNwOtTAzhU//F1wyP6APnuHcrJtHtr0 +2MYt+/c695Vot4q6fJYubNNmkE6ZwaSBkpn/rtpFtfdsVIFtURO78ZXScGQ4DF6MGCx pRCY8bYIyG+AJhsDt84BkGuUeIIRm1RkLF9Ngd3H+kw+tT256nLfl4Yf1pqQ+17e0SYn c63ngBTzAGH/uZZ4BEGU3keQkF0MBoLekgApSMr/tWzbQrDNk9Q+QqutwXm58EVzfi3d onOXNYyhY+zpU8pjKmYyt+jmMwn9Dt1QHkGiaWVJnniaB0eBMwnyTgB263xwW+Fqb70L 3s0g== X-Forwarded-Encrypted: i=1; AJvYcCWFC90l1N4PBcw3YVKcfqtaMGHFrwjESm8GRrJ8siXdY7FsGSS05qD4b0pfXuSRh6WQMnH/zQYh3zO7Ig==@vger.kernel.org, AJvYcCXHAT+YhC/RJvHRauJOs6i//vQcWSc5Ddo8M/rwmOyNtxEVQYI5R9huOAaAWTo0X0e8fF9Q4gD5fbul@vger.kernel.org X-Gm-Message-State: AOJu0YyDVO7Ex5I4Rrf68vO6/DyiDLHONTMVz8EsS1SJphuaSszroqqQ NAzwPHTU0G0OUQu1gINyRBpR5/kYk8wOM0mhYLKeDNuoZqgvCSgf X-Gm-Gg: ASbGncuccJQoXpmKYh+DjpTBTtbRdszfgJL9eO2mAQjReyVdnsyYfKZ75y7bNFnCKJ1 bzVOpCAgsTCZBuzK/SEy7Sgs0stLFG6661Bff0u1DJLyJ15aaXEgBdGebxvdpMgo0KFUXHC9S+e q3OQ+5/hqIfAQdF9lK8RjFJNWpmxBHzDNxpPuQPnG5FEniPvVAUP6wI4c4S43ywVESopCmVl68R rMTUm+ModQRjD7GcwQHDte7PWoVdn1gqtnfoDSfa4KgI/eCEZwaA4+IQtvb9q1C98gfcRhswqam OOsbF4VAH/HqxIlSud3Q1JEUxfg/aCYsPAEqV13yXI6HtyZbMyytl0xT4TRxfg== X-Google-Smtp-Source: AGHT+IFg0T+SrTAOVc780nPTDwTM5gABwllpdbNV+dT9KnwVcpawg08bQoWt2eE2rhGITPyvqOkXRg== X-Received: by 2002:a05:6402:2420:b0:5dc:1294:2dda with SMTP id 4fb4d7f45d1cf-5dc6e450206mr4396219a12.0.1738409961560; Sat, 01 Feb 2025 03:39:21 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:21 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 11/22] MAINTAINERS: Add entry for hid-universal-pidff driver Date: Sat, 1 Feb 2025 12:38:55 +0100 Message-ID: <20250201113906.769162-12-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add the MAINTAINERS entries for the driver Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones --- MAINTAINERS | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 0fa7c5728f1e..810046532e0d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -10209,6 +10209,13 @@ F: drivers/hid/hid-sensor-* F: drivers/iio/*/hid-* F: include/linux/hid-sensor-* +HID UNIVERSAL PIDFF DRIVER +M: Tomasz Pakuła +L: linux-input@vger.kernel.org +S: Maintained +B: https://github.com/Lawstorant/hid-universal-pidff/issues +F: drivers/hid/hid-universal-pidff.c + HID VRC-2 CAR CONTROLLER DRIVER M: Marcus Folkesson L: linux-input@vger.kernel.org From patchwork Sat Feb 1 11:38:56 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956214 Received: from mail-ed1-f48.google.com (mail-ed1-f48.google.com [209.85.208.48]) (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 C19131A4F0A; Sat, 1 Feb 2025 11:39:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409966; cv=none; b=qaYrGxHeYcXTVW1RpwC9arUf4zHtwxCwhDml3OFKEqUHN3CwDA6xLQU2m3oiRXrsPmoOynQAuRFiD/25KeGALvl70hbWVuq7IVK5kRhptFntnZMw7PPaF6UuIQCOLWTs+QCbGv/RXF96esUlaMVx6agKnRuTN1r32qfR7IekIJY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409966; c=relaxed/simple; bh=8n2ijgu0lJdc/S8UqYY3kQNAGwdA7IE2ECei8RRfJnc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=CFwwtL1nZg5axbxwkOWuuGSy/IEq8/n162reAEm3qd0XkCc24lpO1Q8Y52It5O2oPR97/I8y8xjijtLCWUlVz4PgVS033yQG3c+cTJr4F7/L5eCgH0y5VQeUd35PfqX6UHZw7FpWnKar+O9AEaKfN3a8u+v9EWkETgwgw5iG9Kg= 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=IYevY0jg; arc=none smtp.client-ip=209.85.208.48 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="IYevY0jg" Received: by mail-ed1-f48.google.com with SMTP id 4fb4d7f45d1cf-5d3cfa1da14so435382a12.1; Sat, 01 Feb 2025 03:39:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409963; x=1739014763; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=t2Z67RRzMMPveRgarwir0G5V0TGDQoDLTBNY2xeRHsI=; b=IYevY0jgs7d1e8Kp1aZcc/o+aLSvDBEZ5ws3TGzv28rSxCNbUczb//D/VxDeIoI18m k86u9awOp4FS6YsMeNHCEeAXvx6q1622k8QbwIzP42wx2+T+D9lXVmxlYwXTQN6RikeO VXAeb7meFVj/mjy8HeV5a6w4AMQXvB7GXE1iX2RQsAH2CAlQz5/eaYGwiWkTfgx8T7zW PbBsGSWMjwvGeRovCic0m1+AhEWORoYArAHjsZFNAmbvp7udS6SrH6RrjNXLQnqbXgSf I5/7bcbQsbuX2TlNejAonglGraDx2KRCSQZUvRMr7h/VmSSvMk3sU5vC6bYk8eMtTU65 fwaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409963; x=1739014763; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=t2Z67RRzMMPveRgarwir0G5V0TGDQoDLTBNY2xeRHsI=; b=llOeGWs84ETHWhFNm+UGnZeWJUzqf2mQJebd2gARd4fpAvo5upMaZDmo1i7SQUGroV BXTnlLIjSH+K372pM6NYX/fAXeM0xHe2wihN6FIlCJcxyMTpfsutzg/WrEZvddNdaz3s T+wl+VzaNYUx7iu5lm8zVoRHR5+iRLOMb+eyI1e/Y+kWc3DW2OXTdA79lc6cemktYpw5 0ui20Xaa1fu30XBAoTm3NL/9gNbtnkzwNrAhLV2LNSJvmvyk8lRfJYOXNJnvrB0mcEKR 7503FGhDJr+o6VlHRCej+m7xNsdj4Wx4VMRRcIbDvepVbXLH9xaTwiFpdUtmZQqMYUIq 5awA== X-Forwarded-Encrypted: i=1; AJvYcCUfSd/+z666URI2gbtz5Slk9lhwsBuMwMG1mjIvzWTaszhdKOkI2v7Qq7R8xQnkK2JCIjjV/T0N4AuH@vger.kernel.org, AJvYcCVl33grZhmufp26EXGiwUsZ8j8F38HBQ5yS1bVd+flQz1IHN+s2sbKQPnOn5gBhcBv5RFhLLJdrfgUrew==@vger.kernel.org X-Gm-Message-State: AOJu0YxmFSvgLLhUL4Y8MVlvHdpqbQqvt7zqKt+w3f2UpYPcawpnpyxx zYInSXNrIFlwYrMdf0ObvINtaEnX8XXhCS+hcoj4gVAN7+G4kiWc X-Gm-Gg: ASbGncs+zn6rYCw/MVoThnIem0CTj6aDVu1bVgbP/BoSjMOdVnYAXDq3sYrANTtsl1k BTCyoL6KOyGPFrg3+CbBnx5oxSjt/ctJjNyYJFa4wBAZgb6uZ6E9ZBEVSv0/I8fCok8Ejhhk2Zw hk9IxQl5vYOGzQ9/XOhPWGJdKcA9keVUMPVYQCRIAKCVO/F61C5Uu7TlOIUVMIp2gDQQrLm+CnH Q3OIlA4DtAQzG/hQB6BSk4mTth6ODHPksFs0avPPTOaulvH83khTIVvUTTyxcdvz7upitWsQgsk 5tZrGFKsB7OCdhDPyW/oM2xFmaoG9tHEaUARMhocLueWjs2CC+Hpk7Wl27ptBA== X-Google-Smtp-Source: AGHT+IFzhk1FGyzImJNfG2S9R2Hvf/i+naqIB5r7QstTKKHnbvq+xu3kQiezsurQa+g00sBRg0Y0mQ== X-Received: by 2002:a05:6402:234b:b0:5d3:d4cf:feba with SMTP id 4fb4d7f45d1cf-5dc5effcc18mr5547431a12.7.1738409962914; Sat, 01 Feb 2025 03:39:22 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:22 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 12/22] HID: pidff: Add PERIODIC_SINE_ONLY quirk Date: Sat, 1 Feb 2025 12:38:56 +0100 Message-ID: <20250201113906.769162-13-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Some devices only support SINE periodic effect although they advertise support for all PERIODIC effect in their HID descriptor. Some just do nothing when trying to play such an effect (upload goes fine), some express undefined behavior like turning to one side. This quirk forces all the periodic effects to be uploaded as SINE. This is acceptable as all these effects are similar in nature and are mostly used as rumble. SINE is the most popular with others seldom used (especially SAW_UP and SAW_DOWN). Fixes periodic effects for PXN and LITE STAR wheels Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Cristóferson Bueno --- drivers/hid/hid-universal-pidff.c | 15 ++++++++++----- drivers/hid/usbhid/hid-pidff.c | 3 +++ include/linux/hid.h | 1 + 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/drivers/hid/hid-universal-pidff.c b/drivers/hid/hid-universal-pidff.c index 55aad2e4ac1b..7ef5ab9146b1 100644 --- a/drivers/hid/hid-universal-pidff.c +++ b/drivers/hid/hid-universal-pidff.c @@ -168,11 +168,16 @@ static const struct hid_device_id universal_pidff_devices[] = { { HID_USB_DEVICE(USB_VENDOR_ID_FFBEAST, USB_DEVICE_ID_FFBEAST_JOYSTICK), }, { HID_USB_DEVICE(USB_VENDOR_ID_FFBEAST, USB_DEVICE_ID_FFBEAST_RUDDER), }, { HID_USB_DEVICE(USB_VENDOR_ID_FFBEAST, USB_DEVICE_ID_FFBEAST_WHEEL) }, - { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V10) }, - { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12) }, - { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12_LITE) }, - { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12_LITE_2) }, - { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_LITE_STAR_GT987_FF) }, + { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V10), + .driver_data = HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY }, + { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12), + .driver_data = HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY }, + { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12_LITE), + .driver_data = HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY }, + { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_ID_PXN_V12_LITE_2), + .driver_data = HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY }, + { HID_USB_DEVICE(USB_VENDOR_ID_LITE_STAR, USB_DEVICE_LITE_STAR_GT987_FF), + .driver_data = HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY }, { } }; MODULE_DEVICE_TABLE(hid, universal_pidff_devices); diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index c125f029b6d6..e6224e797dc6 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -651,6 +651,9 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect, return -EINVAL; } + if (pidff->quirks & HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY) + type_id = PID_SINE; + error = pidff_request_effect_upload(pidff, pidff->type_id[type_id]); if (error) diff --git a/include/linux/hid.h b/include/linux/hid.h index 856bed149246..c6beb01ab00c 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -1234,6 +1234,7 @@ int hid_pidff_init_with_quirks(struct hid_device *hid, __u32 initial_quirks); #define HID_PIDFF_QUIRK_MISSING_PBO BIT(1) #define HID_PIDFF_QUIRK_PERMISSIVE_CONTROL BIT(2) #define HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION BIT(3) +#define HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY BIT(4) #define dbg_hid(fmt, ...) pr_debug("%s: " fmt, __FILE__, ##__VA_ARGS__) From patchwork Sat Feb 1 11:38:57 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956215 Received: from mail-ed1-f49.google.com (mail-ed1-f49.google.com [209.85.208.49]) (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 E069F1ADC61; Sat, 1 Feb 2025 11:39:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409967; cv=none; b=Awrw8n3NDiaS3VQ3I5hXDCRvpdleS9sJ457bNDHrSsVUlO6oED2g0Hj4iYpwJkb1LL3hrUN79dH/egKH173yUPXCxb+1R7Fu5ML/PTrlPjdoxlB3QdJ4M9i/WZwdhry7MMBbaPb5T2kboXsdGfpM/eq1gsN2yBVe2O8iZa0CgwQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409967; c=relaxed/simple; bh=8LFuFtIC1/vLQVJjA69tBl8fDDkaiVeYj9ro2JZL3lQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=orF84QTZtLSiXVqU69q3h3+igtOqYc0Qg5FXMb5Cbs/vNuuqm9RP/Gdf3Ukp2uUanMHOz1cKx/bpfveoirZRzVthH5402lV268UI16fAICy49ZuTQ3U+sw6rIvfJusKMeBq31zVsxYqLk2SupEeZg7jhKoGk+H+BXTFV1mP4ok8= 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=cMzyK+fm; arc=none smtp.client-ip=209.85.208.49 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="cMzyK+fm" Received: by mail-ed1-f49.google.com with SMTP id 4fb4d7f45d1cf-5d3cfa1da14so435383a12.1; Sat, 01 Feb 2025 03:39:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409964; x=1739014764; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Y7HG0bNZuTLljq+7ywXHveK2FMv+kcD7yErDOYAErzU=; b=cMzyK+fmWElUg9DVq1zGn803QvI5K7AA0UXir5peDxw+V1FNsgqtE4Q+3PMqB/l0An 03lfIFjaQGujNHZiQnR/TgPan8DuMpHNbqRpt5tgqxgikkdpPHjv0bF+n6ctdsm/1bz4 P3PgBuVABvb4U8xwciSSL2tGC6Kc91P8qspoY1sNnV1a96kWZHRE4eOprtwuCh82T9qL AHP/fs8BfhshVkVw3U9kpczsbGRKjzFjNyWrmXukyu2pxknk84tdJrlPu3argiZ1JHue azekge+Rfu4GXWk9CpgIqPBZeRZJZ6erKzcTwsXv0qP8irDenHhI8kLsOQiLp7VZzzvW SnXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409964; x=1739014764; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Y7HG0bNZuTLljq+7ywXHveK2FMv+kcD7yErDOYAErzU=; b=izpwJlojYoEpgiBq01URyAYAYLoaokL2sIdniuYBGupfQz/YTazKJuRsbGhSloxcRx Flj7sSpEfsTEepzol7yAz4Q4hzQbesMpgnqBbHMnEe/e7NgNKHlXBU/1MDH557IVyGLA TXTVxUHgkeXYsuI3O5gHoTLu1mNPSCGYmLh3xWdQMqJyla5rqJJC/oGXilTt23dFhlGw A0Beggry+eidfjHDfEiYzYske5k5e6qvwJ+no+KJPHdSPIeMu4LL+ZbIafGjiyf2tT9n x/vSVu/Qpo6FXAiUZliUaT2iIjJM8QimuR5t+sG3y3lUzAELWO5NjfZhqsZUy4+JhAlz mPzw== X-Forwarded-Encrypted: i=1; AJvYcCVAqC01jId2qNQYKuNjBWFoswXoC38xSdm8Tf64eddsJoE1YNyXdNOVKlKF1+4LvHNLTWepvAffPx92@vger.kernel.org, AJvYcCWACHoEo+lJwBVy335EvhCV24Dv6twtiNlxTHnmpV0tah90wA2Ffx6/6HdfGfciICFo3riJoNbB7zcM+g==@vger.kernel.org X-Gm-Message-State: AOJu0YySbLIkBwwBr6gdDdMe7KpBX3Y6PQQX6SjeJUEtrSZhUTQs5aD5 PvClHofz7fDYsL05sNTkNSdqrcn+0TUPjMzW5tiS+9SUAL0CblNCz29TDQ== X-Gm-Gg: ASbGnctmZTscUSSc3YzVQXogKOzfhg4Dg4elyYjoXV2oRB3FClXxw/kf+5NHwAOxWhG LBzF8IGc8RntuGYAIE6ZwvIgdQofi49/n/z9EpFW8T3xoCfH83CI32l31nULE3NEpOKrSAdCoiS ZnvQf/PL+Vz++U6oa17V/bept335nH9ch5u3e7knUL/OAHQjd0H91Fhk0lL+ukKBoSBWAti1IKl p1llTAmwDB+TBH9XJSjsy7BJTXgwZ9SRWv2ZrtGaUsCHFN1h+Qj8JBFcOx2ATXX+/UO9fiiCuoP Jf9nO9NQM7JvpG1bTOpqd4HYL/RsTaAZ00rKHMZpEdfuYRzNORyc17yAZeIQ4w== X-Google-Smtp-Source: AGHT+IHvi7XIGqpdsAWUGSGuuM4HHXLCWLfOlCuVBzFo+7FHjgKJVs7PyYFvmriuM8vL2C/9d+lcPw== X-Received: by 2002:a05:6402:4287:b0:5d0:bf79:e925 with SMTP id 4fb4d7f45d1cf-5dc5efec149mr6290271a12.6.1738409964066; Sat, 01 Feb 2025 03:39:24 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:23 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 13/22] HID: pidff: Completely rework and fix pidff_reset function Date: Sat, 1 Feb 2025 12:38:57 +0100 Message-ID: <20250201113906.769162-14-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Previously, it was assumed that DEVICE_CONTROL usage is always an array but a lot of devices implements it as a bitmask variable. This led to the pidff_reset function not working and causing errors in such cases. Selectors can come in three types. One selection of a set, N selections and Any selection in form of bitmask as from USB Hid Usage Tables v1.5, subsection 3.4.2.1 Added pidff_send_device_control which handles usage flag check which decides whether DEVICE_CONTROL should be handled as "One selection of a set" or "Any selection of a set". Reset was triggered once, on device initialization. Now, it's triggered every time when uploading an effect to an empty device (no currently stored effects), tracked by pidff->effect_count variable. Co-developed-by: Makarenko Oleg Signed-off-by: Makarenko Oleg Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Paul Dino Jones Tested-by: Cristóferson Bueno Tested-by: Pablo Cisneros --- drivers/hid/usbhid/hid-pidff.c | 138 +++++++++++++++++++++------------ 1 file changed, 89 insertions(+), 49 deletions(-) diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index e6224e797dc6..7db63d686c62 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -109,9 +109,10 @@ static const u8 pidff_pool[] = { 0x80, 0x83, 0xa9 }; /* Special field key tables used to put special field keys into arrays */ #define PID_ENABLE_ACTUATORS 0 -#define PID_STOP_ALL_EFFECTS 1 -#define PID_RESET 2 -static const u8 pidff_device_control[] = { 0x97, 0x99, 0x9a }; +#define PID_DISABLE_ACTUATORS 1 +#define PID_STOP_ALL_EFFECTS 2 +#define PID_RESET 3 +static const u8 pidff_device_control[] = { 0x97, 0x98, 0x99, 0x9a }; #define PID_CONSTANT 0 #define PID_RAMP 1 @@ -190,6 +191,7 @@ struct pidff_device { int pid_id[PID_EFFECTS_MAX]; u32 quirks; + u8 effect_count; }; /* @@ -490,9 +492,83 @@ static int pidff_needs_set_ramp(struct ff_effect *effect, struct ff_effect *old) effect->u.ramp.end_level != old->u.ramp.end_level; } +/* + * Clear device control report + */ +static void pidff_send_device_control(struct pidff_device *pidff, int field) +{ + int i, tmp; + int field_index = pidff->control_id[field]; + + /* Detect if the field is a bitmask variable or an array */ + if (pidff->device_control->flags & HID_MAIN_ITEM_VARIABLE) { + hid_dbg(pidff->hid, "DEVICE_CONTROL is a bitmask\n"); + /* Clear current bitmask */ + for(i = 0; i < sizeof(pidff_device_control); i++) { + tmp = pidff->control_id[i]; + pidff->device_control->value[tmp] = 0; + } + pidff->device_control->value[field_index - 1] = 1; + } else { + hid_dbg(pidff->hid, "DEVICE_CONTROL is an array\n"); + pidff->device_control->value[0] = field_index; + } + + hid_hw_request(pidff->hid, pidff->reports[PID_DEVICE_CONTROL], HID_REQ_SET_REPORT); + hid_hw_wait(pidff->hid); +} + +/* + * Modify actuators state + */ +static void pidff_modify_actuators_state(struct pidff_device *pidff, bool enable) +{ + hid_dbg(pidff->hid, "%s actuators\n", enable ? "Enable" : "Disable"); + pidff_send_device_control(pidff, + enable ? PID_ENABLE_ACTUATORS : PID_DISABLE_ACTUATORS); +} + +/* + * Reset the device, stop all effects, enable actuators + * Refetch pool report + */ +static void pidff_reset(struct pidff_device *pidff) +{ + int i = 0; + + /* We reset twice as sometimes hid_wait_io isn't waiting long enough */ + pidff_send_device_control(pidff, PID_RESET); + pidff_send_device_control(pidff, PID_RESET); + pidff->effect_count = 0; + + pidff_send_device_control(pidff, PID_STOP_ALL_EFFECTS); + pidff_modify_actuators_state(pidff, 1); + + /* pool report is sometimes messed up, refetch it */ + hid_hw_request(pidff->hid, pidff->reports[PID_POOL], HID_REQ_GET_REPORT); + hid_hw_wait(pidff->hid); + + if (pidff->pool[PID_SIMULTANEOUS_MAX].value) { + while (pidff->pool[PID_SIMULTANEOUS_MAX].value[0] < 2) { + if (i++ > 20) { + hid_warn(pidff->hid, + "device reports %d simultaneous effects\n", + pidff->pool[PID_SIMULTANEOUS_MAX].value[0]); + break; + } + hid_dbg(pidff->hid, "pid_pool requested again\n"); + hid_hw_request(pidff->hid, pidff->reports[PID_POOL], + HID_REQ_GET_REPORT); + hid_hw_wait(pidff->hid); + } + } +} + /* * Send a request for effect upload to the device * + * Reset and enable actuators if no effects were present on the device + * * Returns 0 if device reported success, -ENOSPC if the device reported memory * is full. Upon unknown response the function will retry for 60 times, if * still unsuccessful -EIO is returned. @@ -501,6 +577,9 @@ static int pidff_request_effect_upload(struct pidff_device *pidff, int efnum) { int j; + if (!pidff->effect_count) + pidff_reset(pidff); + pidff->create_new_effect_type->value[0] = efnum; hid_hw_request(pidff->hid, pidff->reports[PID_CREATE_NEW_EFFECT], HID_REQ_SET_REPORT); @@ -520,6 +599,8 @@ static int pidff_request_effect_upload(struct pidff_device *pidff, int efnum) hid_dbg(pidff->hid, "device reported free memory: %d bytes\n", pidff->block_load[PID_RAM_POOL_AVAILABLE].value ? pidff->block_load[PID_RAM_POOL_AVAILABLE].value[0] : -1); + + pidff->effect_count++; return 0; } if (pidff->block_load_status->value[0] == @@ -568,12 +649,16 @@ static int pidff_playback(struct input_dev *dev, int effect_id, int value) /* * Erase effect with PID id + * Decrease the device effect counter */ static void pidff_erase_pid(struct pidff_device *pidff, int pid_id) { pidff->block_free[PID_EFFECT_BLOCK_INDEX].value[0] = pid_id; hid_hw_request(pidff->hid, pidff->reports[PID_BLOCK_FREE], HID_REQ_SET_REPORT); + + if (pidff->effect_count > 0) + pidff->effect_count--; } /* @@ -1211,50 +1296,6 @@ static int pidff_init_fields(struct pidff_device *pidff, struct input_dev *dev) return 0; } -/* - * Reset the device - */ -static void pidff_reset(struct pidff_device *pidff) -{ - struct hid_device *hid = pidff->hid; - int i = 0; - - pidff->device_control->value[0] = pidff->control_id[PID_RESET]; - /* We reset twice as sometimes hid_wait_io isn't waiting long enough */ - hid_hw_request(hid, pidff->reports[PID_DEVICE_CONTROL], HID_REQ_SET_REPORT); - hid_hw_wait(hid); - hid_hw_request(hid, pidff->reports[PID_DEVICE_CONTROL], HID_REQ_SET_REPORT); - hid_hw_wait(hid); - - pidff->device_control->value[0] = pidff->control_id[PID_STOP_ALL_EFFECTS]; - hid_hw_request(hid, pidff->reports[PID_DEVICE_CONTROL], HID_REQ_SET_REPORT); - hid_hw_wait(hid); - - pidff->device_control->value[0] = - pidff->control_id[PID_ENABLE_ACTUATORS]; - hid_hw_request(hid, pidff->reports[PID_DEVICE_CONTROL], HID_REQ_SET_REPORT); - hid_hw_wait(hid); - - /* pool report is sometimes messed up, refetch it */ - hid_hw_request(hid, pidff->reports[PID_POOL], HID_REQ_GET_REPORT); - hid_hw_wait(hid); - - if (pidff->pool[PID_SIMULTANEOUS_MAX].value) { - while (pidff->pool[PID_SIMULTANEOUS_MAX].value[0] < 2) { - if (i++ > 20) { - hid_warn(pidff->hid, - "device reports %d simultaneous effects\n", - pidff->pool[PID_SIMULTANEOUS_MAX].value[0]); - break; - } - hid_dbg(pidff->hid, "pid_pool requested again\n"); - hid_hw_request(hid, pidff->reports[PID_POOL], - HID_REQ_GET_REPORT); - hid_hw_wait(hid); - } - } -} - /* * Test if autocenter modification is using the supported method */ @@ -1320,6 +1361,7 @@ int hid_pidff_init_with_quirks(struct hid_device *hid, __u32 initial_quirks) pidff->hid = hid; pidff->quirks = initial_quirks; + pidff->effect_count = 0; hid_device_io_start(hid); @@ -1336,8 +1378,6 @@ int hid_pidff_init_with_quirks(struct hid_device *hid, __u32 initial_quirks) if (error) goto fail; - pidff_reset(pidff); - if (test_bit(FF_GAIN, dev->ffbit)) { pidff_set(&pidff->device_gain[PID_DEVICE_GAIN_FIELD], 0xffff); hid_hw_request(hid, pidff->reports[PID_DEVICE_GAIN], From patchwork Sat Feb 1 11:38:58 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956216 Received: from mail-ed1-f43.google.com (mail-ed1-f43.google.com [209.85.208.43]) (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 3BECE1ADC69; Sat, 1 Feb 2025 11:39:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409968; cv=none; b=in8ECkDf9H1V3L952vGWz/bSF0rSZNU8GYh4owYQmkWXYrERg34lnnm9CuOFH4o30EHVtmZne6n0Q3eaoZG7scareFRAp5tnM93U3hBGOSfuf0eObF0YyB23gECSmVnBf0c+1Iq/V3RNLEDovWUTz7k/0u2arOKU6E2gbtheBkk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409968; c=relaxed/simple; bh=ODEEFs6QcblolBpyAYvB4QdxvL/26BD6ANbK4ifHq1k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=bQb0fSo+HboF+MeUg091GFaGS44xO3qdEAdRk8uTuQr5SPHzulYlEIMraNuslPPsVqn4ndjZBs97uhaZfUih6KJGcSOwjs1k9mpVtAiUJK6D5VMb3cXLLGxrU5XzkSKaSGTTh0R/5HQygbBWDPSvsMxox8GPIn6sEfHOWmCHDFs= 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=KhCJxLAC; arc=none smtp.client-ip=209.85.208.43 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="KhCJxLAC" Received: by mail-ed1-f43.google.com with SMTP id 4fb4d7f45d1cf-5dc191ca8baso598141a12.1; Sat, 01 Feb 2025 03:39:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409965; x=1739014765; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=f+eEwI9YsauWYQP4PW4nUrzcrCNyCVVDJRogBqM4pcY=; b=KhCJxLACAtM9/9iZjdRxBR/mYx8/Y9awhjnl6URkA0488HYhKEIxPBr+DCYyuot32N Sk66o7rjfsfqrCP7L5LpfgGqzGv5mL8Fadb1xjU6NreBMFT/f9ks+SXO9NZxr0T5Asm5 6ggmUQM49B1W5z0BD7d7efgVao1UZRfly8A+2fE1MqH3j+nsV2lUspLJs1CClUS7xdrl pwyz32vcF2k2woHk7bMXQHOeWFMxcRZpmR3k03JnmOteEctRZStNcrUZNsyUJNi+jEcV M6xoUIBiC94/8VtB6lLoYCPZxB5oO59K3g1VpCR+PYqHVzPxbQXH9lm7vN9zffK4DgI0 BZng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409965; x=1739014765; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=f+eEwI9YsauWYQP4PW4nUrzcrCNyCVVDJRogBqM4pcY=; b=QvJIdqm2BrhdCsZnxr/E+jaSpW2OLrelT6KGBRku52HMvTFuuviPtfqQnVNAb1i4Dr x6XdWqGnCTGS9+Ngm4IcIcMMWxErWpdmMUu1b/0cw9YoJD1MfRf58tlW1U88s1ZKtmcx DVxrLH59z8aUm7Ox0Fvd76odqBIRsX4q5r7lvjiQ63Xd6GjrXz05Znc7uOb6iJvJrgvb pE+pDpU+jHbrX+qd2WUhFTRvk4cqZSecMqwQXz4EduvqWJF/P1L9K6/Gr1fjkn/Zrqux OfcQlVa24mQUB77z8MSReurbrZ4ygVaWFs+294QD/6vY8KJqRqa8GHJC1r8S8QLF3X4C 4VXQ== X-Forwarded-Encrypted: i=1; AJvYcCW2INdPbg+6G8gDGi6bkUHWwaf6DzL4fBLWI68vdJ4kZxjUtxgtcV+nwRV5KUmd6Cd0wjleEUefJiawXg==@vger.kernel.org, AJvYcCWdP+od3ixJmyBB9Qc8OMGXMwUWI+cP9479374+z4HeJ+JRXg1b8l+ePqvtuSlDQtb/T8l3zJReg7CG@vger.kernel.org X-Gm-Message-State: AOJu0YyoPMog3KYrrBPDPoulEYtVqPUR7kASyC2nCaO6AzmbRR8Nn/Ue BfjM1E8aC2U2bGJNpBCOKRkIE2FZMc4NFGIV4H6jbd4IRkI0SrDAladWzg== X-Gm-Gg: ASbGncuBoX3rmqb9SsyZxM8RodTxLTk/tE3l4PGmwd/qxucx8XeXRnI3m0SNqk48g9g ARcv3OPU6wUpXAMVLn6XgzZo1QiahKkmrnw+nyWGEeU1xCo4wRtV7lGTg+vFledatvqmW2Ke3Hv INqhYJ3Q+dah2a9keKlcTVKrzZG9lM9GYpBLf6KfhY3b05Wk5Enxm5UAfoiHFA/XtK3BsUstT3v cQV8YSisQuemZ8WKDO2BwYlqdQRprsuuYMC8t/wNj76yawBPd3NrXCMfDXGZT/m++4fphyJSPi+ 6kq78jnWDjBx2s9MJMVfimHTUAqGCk4kA6QK6dN7IV/2dWFZTFNLbrv9ZWaycA== X-Google-Smtp-Source: AGHT+IHz9vReuNWDDYQiCnNbFs95U/V0fby6C73cqoq6QfCy9qZDm5NMKKSXvDo/OPt8oAxSbULuXw== X-Received: by 2002:a05:6402:524c:b0:5d0:214b:96b4 with SMTP id 4fb4d7f45d1cf-5dc6e6e5440mr4636815a12.1.1738409965271; Sat, 01 Feb 2025 03:39:25 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:24 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 14/22] HID: pidff: Simplify pidff_upload_effect function Date: Sat, 1 Feb 2025 12:38:58 +0100 Message-ID: <20250201113906.769162-15-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Merge a bit of code that reqeusts conditional effects upload. Makes it clear, that effect handling should be identical for SPRING, DAMPER, INERTIA and FRICTION. Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Paul Dino Jones Tested-by: Cristóferson Bueno Tested-by: Pablo Cisneros --- drivers/hid/usbhid/hid-pidff.c | 54 ++++++++++------------------------ 1 file changed, 16 insertions(+), 38 deletions(-) diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index 7db63d686c62..a8698593e432 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -770,48 +770,26 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect, break; case FF_SPRING: - if (!old) { - error = pidff_request_effect_upload(pidff, - pidff->type_id[PID_SPRING]); - if (error) - return error; - } - if (!old || pidff_needs_set_effect(effect, old)) - pidff_set_effect_report(pidff, effect); - if (!old || pidff_needs_set_condition(effect, old)) - pidff_set_condition_report(pidff, effect); - break; - - case FF_FRICTION: - if (!old) { - error = pidff_request_effect_upload(pidff, - pidff->type_id[PID_FRICTION]); - if (error) - return error; - } - if (!old || pidff_needs_set_effect(effect, old)) - pidff_set_effect_report(pidff, effect); - if (!old || pidff_needs_set_condition(effect, old)) - pidff_set_condition_report(pidff, effect); - break; - case FF_DAMPER: - if (!old) { - error = pidff_request_effect_upload(pidff, - pidff->type_id[PID_DAMPER]); - if (error) - return error; - } - if (!old || pidff_needs_set_effect(effect, old)) - pidff_set_effect_report(pidff, effect); - if (!old || pidff_needs_set_condition(effect, old)) - pidff_set_condition_report(pidff, effect); - break; - case FF_INERTIA: + case FF_FRICTION: if (!old) { + switch(effect->type) { + case FF_SPRING: + type_id = PID_SPRING; + break; + case FF_DAMPER: + type_id = PID_DAMPER; + break; + case FF_INERTIA: + type_id = PID_INERTIA; + break; + case FF_FRICTION: + type_id = PID_FRICTION; + break; + } error = pidff_request_effect_upload(pidff, - pidff->type_id[PID_INERTIA]); + pidff->type_id[type_id]); if (error) return error; } From patchwork Sat Feb 1 11:38:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956217 Received: from mail-ed1-f44.google.com (mail-ed1-f44.google.com [209.85.208.44]) (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 9BB16176ADE; Sat, 1 Feb 2025 11:39:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409970; cv=none; b=iOauovqwwG4Ouoo7miRsp8AmvxoKrqnxUWehB4/PMV73zDfvT9MwDij4GyisElZVIpSCxY+qdLzcE0Ed+2rdXy0AWjjcglMnL5k4PgWKj+kcprb/+vU1DKmR9hQl0EZUjecK4980dYnYr19R7Y8bPXlpkQVNCXPUWf5SM7OoLeE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409970; c=relaxed/simple; bh=H5hN8m4iqAFF9cK8A41mVb8fzEsTKQBZvT+ZETsdgFU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=N5balo7Q8C/YJFz9nsFTyrRcK/hpIJz8/V1jWMAzsuS0QmWoeSY404JvRaM9VAJ6cR7OYjdeDW1otnEz6hF3GUjO4sVesm8hYjubSW5lczCMJ1dsdpisIgWZKaEHiREq7nQ3B8AX1OfHucN7bsfNFLPx7Wz4x4sEO0aA5Bf+BB0= 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=WoMnWaBc; arc=none smtp.client-ip=209.85.208.44 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="WoMnWaBc" Received: by mail-ed1-f44.google.com with SMTP id 4fb4d7f45d1cf-5dc191ca8baso598143a12.1; Sat, 01 Feb 2025 03:39:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409967; x=1739014767; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=CTkWfRbnjEBgqmpDmlfEH8FjEcYgquPflvejRjpdc3w=; b=WoMnWaBcDxoML0OsRjBAe/6uzA5kyJSXongy7VluVAL83Fs04U/QDaMCDcMHlJvOKS 9ENGB+FjcfIuXeLI3xpz2c3asQfcujgMM3n5KzOZo98YDV5rlPhsVIqaANV0ZH6fBgxi s65yaFcfzQVDLPWI8Jxt8wkVdWy1IzVupfb4ud4vQe+5jlBl7wZWRtR2cVXRXKZwQy1S +cVuWB5P9xl1wbwskwdx9GItsWzF3CQmgz79EO6M9u+1F0K7sPLvBFQ/lrSXxbgHhZpk yZ5ldGGPHsDM49mez/THvTKVEALKGLf2deJAumFHX3UAjpE/ShfvsP3/b661QqG1FVaT HS6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409967; x=1739014767; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CTkWfRbnjEBgqmpDmlfEH8FjEcYgquPflvejRjpdc3w=; b=UehrV4M9Wp2iQiOVdWYybdTe3fu4WDIoWHZFveGOTGM8D21bY7jfpS+dNJIVI+NG4e kIC7wWxuR9bkATyMysAXkmTpjAb+OcHGKi/BjRX6N5nQQWgEyIJLP/0EPjYxvWBxpW7/ yAM++jtpc572dzHvc0wqE2wvMH1sBRBZJQPEHiWdrenBMru7epEhsNyE7vm6v82NJAlF iGRMoBLh4sEqlctKKDlGzS7fy5BNxBviJ7At31QEhQWeKmFexO3GhU+sAR4lDvrSj1UC naHGv9Cf4b4++uDpyF/lakyNWKLzHQfhfGVuyUcHQeIh1cHpMpmVQvs/RuIfZIk1bxQM jrnw== X-Forwarded-Encrypted: i=1; AJvYcCWdVzVD9FMFml0t/6o+YNtVlgthc48lWy5J9nRQXMdLU087pzNsbUhbFlHpzO3JC5CPIoAQ+lKLy2TsZQ==@vger.kernel.org, AJvYcCWo7RgcIOZvsBp58JWqZ/SpfABqTSEOdEmnUFcuXz9TJ1wUNdVNIKu8pkgSS4boQb+o4sntr/h5nsIR@vger.kernel.org X-Gm-Message-State: AOJu0Yw0OMyc2yBnK/BIZaRnREUgshcbUagYuKVv3D3PJDA4tF3VVZPP NQKKwCfuDy9k2byBZ+mDvdiof4kdBn3W1fIC3rrG+UnQ20bcpBiV X-Gm-Gg: ASbGncsiPew0oXzHrwY6DaLPAvg/Ub5r6gu2gsdjwUufPrh/MTZ6dzxKoeu9Oko0yhR ik39lPVLXfU2b8XtSXrnKpNDRXKVs6BUiu3vSKUwSScX9FyPg9twt5nXRKm0BoabeEP07AKfqHN ZL5MiPo+VFKFl4QDb99edOoDeL7BqFYYpGs/RdCOTnnbH0LRGQiDUlRjiLhRmtofGf/ytJ669zf jVGQKnRO+io1jDFC0znxIA0au+kd9oV3a0hL1ojTaT1u8uOYpO4hLU7VvwKQMtfvyl5vyb0cG1u UQCqIX4IcQirGN+1IeUwm4mx1G+FwNcU/EBw6olQMo8orOSp1gu5I4VoSodtvA== X-Google-Smtp-Source: AGHT+IFKz/Kc395vV+Qt1RAorCrCj67VsnHr/L0yUa2rFlspkZGvCPhykwa/XxGRMxy/YxrsxomKXQ== X-Received: by 2002:a05:6402:1ed4:b0:5d9:a5d:b203 with SMTP id 4fb4d7f45d1cf-5dc6e95e21fmr4692255a12.8.1738409966796; Sat, 01 Feb 2025 03:39:26 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:26 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 15/22] HID: pidff: Define values used in pidff_find_special_fields Date: Sat, 1 Feb 2025 12:38:59 +0100 Message-ID: <20250201113906.769162-16-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Makes it clear where did these values came from Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Paul Dino Jones Tested-by: Cristóferson Bueno Tested-by: Pablo Cisneros --- drivers/hid/usbhid/hid-pidff.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index a8698593e432..fbb79179e02b 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -48,6 +48,14 @@ static const u8 pidff_reports[] = { /* device_control is really 0x95, but 0x96 specified as it is the usage of the only field in that report */ +/* PID special fields */ + +#define PID_EFFECT_TYPE 0x25 +#define PID_DIRECTION 0x57 +#define PID_EFFECT_OPERATION_ARRAY 0x78 +#define PID_BLOCK_LOAD_STATUS 0x8b +#define PID_DEVICE_CONTROL_ARRAY 0x96 + /* Value usage tables used to put fields and values into arrays */ #define PID_EFFECT_BLOCK_INDEX 0 @@ -1046,23 +1054,24 @@ static int pidff_find_special_fields(struct pidff_device *pidff) pidff->create_new_effect_type = pidff_find_special_field(pidff->reports[PID_CREATE_NEW_EFFECT], - 0x25, 1); + PID_EFFECT_TYPE, 1); pidff->set_effect_type = pidff_find_special_field(pidff->reports[PID_SET_EFFECT], - 0x25, 1); + PID_EFFECT_TYPE, 1); pidff->effect_direction = pidff_find_special_field(pidff->reports[PID_SET_EFFECT], - 0x57, 0); + PID_DIRECTION, 0); pidff->device_control = pidff_find_special_field(pidff->reports[PID_DEVICE_CONTROL], - 0x96, !(pidff->quirks & HID_PIDFF_QUIRK_PERMISSIVE_CONTROL)); + PID_DEVICE_CONTROL_ARRAY, + !(pidff->quirks & HID_PIDFF_QUIRK_PERMISSIVE_CONTROL)); pidff->block_load_status = pidff_find_special_field(pidff->reports[PID_BLOCK_LOAD], - 0x8b, 1); + PID_BLOCK_LOAD_STATUS, 1); pidff->effect_operation_status = pidff_find_special_field(pidff->reports[PID_EFFECT_OPERATION], - 0x78, 1); + PID_EFFECT_OPERATION_ARRAY, 1); hid_dbg(pidff->hid, "search done\n"); From patchwork Sat Feb 1 11:39:00 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956218 Received: from mail-ed1-f47.google.com (mail-ed1-f47.google.com [209.85.208.47]) (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 EC5C017BB21; Sat, 1 Feb 2025 11:39:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409971; cv=none; b=BFOiyPMKosFLinVqYXPoJ0kBJTi+GxZU3MECWoEESzK6RJMR5ZpYtQub67FZx6fK9T7ZNShXTOTGa21nDOT7tOTNLw/LmEJrL/8Ll2OeXY3IH0teAB1QL7X/qMZxANuS4F4EcnjY5VgWsKKV5r3ks93xpGUF2/2CxnQ+zo+ER6Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409971; c=relaxed/simple; bh=0JMbTx8MAqSGVKeP9iqMMmXIma+2uK0+3JYnnBu33uQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=JAoNHBnJ9ZPSU4jF0NL++ndvlhUXydkOaLAsBkYjnL/asZ6cwgG1Zr3VCDQledHWxJEUvLl3gvr0mqVRcGKad+Ek80F8KPDTnj3+LAoP9RrLvcLWdWpgvMMcx1VUMbYJZOSYClyLvA9dPYpGo/RbxbTUkKFdwdyUMxWq6ajy4ys= 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=VcKjIkze; arc=none smtp.client-ip=209.85.208.47 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="VcKjIkze" Received: by mail-ed1-f47.google.com with SMTP id 4fb4d7f45d1cf-5da0c79ff85so500465a12.1; Sat, 01 Feb 2025 03:39:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409968; x=1739014768; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=aYTYlboOCdijF7WUXPOBpFB7tWhjMZyCMYi3dE6csS8=; b=VcKjIkze08lwDL3qqsnV7xLsOm9f6Oa227Q2UO0HBvp15/gcfPNnQcsgAG1XjnDfuM rP3rv06/F5vsX+B7nEby1O/AitD3Np4RmP5Ai4Z3yA14SBq+QYaCsgpOh/uH9ypEn0g4 InB/BRqvMUoNWtzVdqHyXOPx5g0cAHwVWJOwrcoX+TWq8OF8fs/lA/wN0qUAPexbW7dR GL8CvYjeoZyXyAN+HC1Esc76u9kzFH4UoWmZv81w2mCaGXHitDS1/p4bIb0GRDcfQoSc iXGWprG4XA1kVcVRvuUjgSDjuXsAdoPNiK2oJmxapaUM9RZKMI6pIxS2QK82DIrvrVoo m3Pg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409968; x=1739014768; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=aYTYlboOCdijF7WUXPOBpFB7tWhjMZyCMYi3dE6csS8=; b=fYz8xoytVMQEOJisX6V7YIzwIPueme/uTc6SDamgJohaDMQ8SofNC2ku8aHNqXz5WC VUbe45E1gNDbT7qIKomuPC8/YpLbpiYh3ta7uJnMcaV4J35i4LU06qDDm6Ntkpi94u85 NI6DoIkbkQj6Roafd+DSDf1mAeI+VN2kmq4DmMQ3pSedkBK8ig4qJSI300ZMRaWKTxdd CscdMdPeZX+T4k+IgzoYXcjWrm3K8ub2me9ds1fgwsXbzjihT8Q1DmZnOdkMJZcHYEnI W0Og4GOTfzqVa6wRBk90qY6OzijD0/RPNXYM49QXerJBYbSoaPkrESNVrPdm+or++GIv K36A== X-Forwarded-Encrypted: i=1; AJvYcCUbLjJjJsrmMZKQJi7SzWWimWGiZH9roiA+zXrxW/hE/ZyPaKAnV0n87dqXTjsW1mtgwpAQKWbJHzwz@vger.kernel.org, AJvYcCWAXsvQfdcn+5Kr4ETr7XEuM7C3vh/RtqxH4WFbMQsxDU64xosZbrUVcNmPC2P6knZ87JpYlhOm79Y1Ag==@vger.kernel.org X-Gm-Message-State: AOJu0YzKhbl3bKRCSyy+qx7t/WQO+uwk13YGlbUmle7oyrL44fH0F7nk hoxhLftsGTIlU9XpkkwBj+Y6T+L7B7Dj7zCstWvlynMOMGdJnXOg X-Gm-Gg: ASbGnctaBx4NC9tW8CYm5jLdBGjeKaVyw0zVfKTSRIED1fuBYnMS7iukKxYPIAQyPVG iLrmp5R59pwgK5favI6zDfz8bivYARKLv+NgrxksXVEi/DV8smqlq2t0jvuQAl3zC4TNZcw4bSO ZGRA/uc7kMUsE7OEXRs8FBedYlryiZnJJKLlBPJm3YDKp/u8aAop1/6uC5qKY5U5jcS2EMRuNUc nQ4fmDl5GtXV+rxY6YUpnbCQRqI4ClYbn9DBR2FX1z0pyc3+arIQGFlAlibKKzOik9TE9s/B9Pw bTbiC/VMR+qiEnXDngj7zPBGbvnE0cjWPeASsY/IzqBz5HpipSCWrDilo6UbYA== X-Google-Smtp-Source: AGHT+IEuoOURL9oB44181r4d55F3SNYmGC2Q7Hw06xGWB66yfNu11ItCvu37ZZ6PbucEn9lZ12jvFw== X-Received: by 2002:a05:6402:51c8:b0:5dc:8845:6a00 with SMTP id 4fb4d7f45d1cf-5dc88456b7dmr1998321a12.8.1738409967882; Sat, 01 Feb 2025 03:39:27 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:27 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 16/22] HID: pidff: Rescale time values to match field units Date: Sat, 1 Feb 2025 12:39:00 +0100 Message-ID: <20250201113906.769162-17-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 PID devices can use different exponents for time fields, while Linux Force Feedback API only supports miliseconds. Read the exponent of a given time field and scale its value accordingly. Changes in v7: - Rescale all time fields, not only period changes in v9: - Properly assign fade_lenght, not attack_length to PID_FADE_TIME Co-developed-by: Makarenko Oleg Signed-off-by: Makarenko Oleg Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Paul Dino Jones Tested-by: Cristóferson Bueno Tested-by: Pablo Cisneros --- drivers/hid/usbhid/hid-pidff.c | 69 ++++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 15 deletions(-) diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index fbb79179e02b..8a2a4bed2632 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -22,6 +22,9 @@ #define PID_EFFECTS_MAX 64 #define PID_INFINITE 0xffff +/* Linux Force Feedback API uses miliseconds as time unit */ +#define FF_TIME_EXPONENT -3 + /* Report usage table used to put reports into an array */ #define PID_SET_EFFECT 0 @@ -231,6 +234,24 @@ static int pidff_rescale_signed(int i, struct hid_field *field) field->logical_minimum / -0x8000; } +/* + * Scale time value from Linux default (ms) to field units + */ +static u32 pidff_rescale_time(u16 time, struct hid_field *field) +{ + u32 scaled_time = time; + int exponent = field->unit_exponent; + pr_debug("time field exponent: %d\n", exponent); + + for (;exponent < FF_TIME_EXPONENT; exponent++) + scaled_time *= 10; + for (;exponent > FF_TIME_EXPONENT; exponent--) + scaled_time /= 10; + + pr_debug("time calculated from %d to %d\n", time, scaled_time); + return scaled_time; +} + static void pidff_set(struct pidff_usage *usage, u16 value) { usage->value[0] = pidff_rescale(value, 0xffff, usage->field); @@ -252,6 +273,27 @@ static void pidff_set_signed(struct pidff_usage *usage, s16 value) pr_debug("calculated from %d to %d\n", value, usage->value[0]); } +static void pidff_set_time(struct pidff_usage *usage, u16 time) +{ + u32 modified_time = pidff_rescale_time(time, usage->field); + usage->value[0] = pidff_clamp(modified_time, usage->field); +} + +static void pidff_set_duration(struct pidff_usage *usage, u16 duration) +{ + /* Convert infinite length from Linux API (0) + to PID standard (NULL) if needed */ + if (duration == 0) + duration = PID_INFINITE; + + if (duration == PID_INFINITE) { + usage->value[0] = PID_INFINITE; + return; + } + + pidff_set_time(usage, duration); +} + /* * Send envelope report to the device */ @@ -270,8 +312,10 @@ static void pidff_set_envelope_report(struct pidff_device *pidff, 0x7fff ? 0x7fff : envelope->fade_level, 0x7fff, pidff->set_envelope[PID_FADE_LEVEL].field); - pidff->set_envelope[PID_ATTACK_TIME].value[0] = envelope->attack_length; - pidff->set_envelope[PID_FADE_TIME].value[0] = envelope->fade_length; + pidff_set_time(&pidff->set_envelope[PID_ATTACK_TIME], + envelope->attack_length); + pidff_set_time(&pidff->set_envelope[PID_FADE_TIME], + envelope->fade_length); hid_dbg(pidff->hid, "attack %u => %d\n", envelope->attack_level, @@ -340,14 +384,12 @@ static void pidff_set_effect_report(struct pidff_device *pidff, pidff->set_effect_type->value[0] = pidff->create_new_effect_type->value[0]; - /* Convert infinite length from Linux API (0) - to PID standard (NULL) if needed */ - pidff->set_effect[PID_DURATION].value[0] = - effect->replay.length == 0 ? PID_INFINITE : effect->replay.length; + pidff_set_duration(&pidff->set_effect[PID_DURATION], + effect->replay.length); pidff->set_effect[PID_TRIGGER_BUTTON].value[0] = effect->trigger.button; - pidff->set_effect[PID_TRIGGER_REPEAT_INT].value[0] = - effect->trigger.interval; + pidff_set_time(&pidff->set_effect[PID_TRIGGER_REPEAT_INT], + effect->trigger.interval); pidff->set_effect[PID_GAIN].value[0] = pidff->set_effect[PID_GAIN].field->logical_maximum; pidff->set_effect[PID_DIRECTION_ENABLE].value[0] = 1; @@ -360,7 +402,8 @@ static void pidff_set_effect_report(struct pidff_device *pidff, /* Omit setting delay field if it's missing */ if (!(pidff->quirks & HID_PIDFF_QUIRK_MISSING_DELAY)) - pidff->set_effect[PID_START_DELAY].value[0] = effect->replay.delay; + pidff_set_time(&pidff->set_effect[PID_START_DELAY], + effect->replay.delay); hid_hw_request(pidff->hid, pidff->reports[PID_SET_EFFECT], HID_REQ_SET_REPORT); @@ -392,15 +435,11 @@ static void pidff_set_periodic_report(struct pidff_device *pidff, pidff_set_signed(&pidff->set_periodic[PID_OFFSET], effect->u.periodic.offset); pidff_set(&pidff->set_periodic[PID_PHASE], effect->u.periodic.phase); - - /* Clamp period to ensure the device can play the effect */ - pidff->set_periodic[PID_PERIOD].value[0] = - pidff_clamp(effect->u.periodic.period, - pidff->set_periodic[PID_PERIOD].field); + pidff_set_time(&pidff->set_periodic[PID_PERIOD], + effect->u.periodic.period); hid_hw_request(pidff->hid, pidff->reports[PID_SET_PERIODIC], HID_REQ_SET_REPORT); - } /* From patchwork Sat Feb 1 11:39:01 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956219 Received: from mail-ed1-f48.google.com (mail-ed1-f48.google.com [209.85.208.48]) (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 1F2781ADC92; Sat, 1 Feb 2025 11:39:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409973; cv=none; b=sw97ubeYc7DY1uRXre6zo7cW66u2ED2rsZEbCF/wnpBOLAahProESee9z3lE15JH2hXd8z/N4AKThJ/fZSzDpIdYfkF5q8ep6vHrdEHbrkCjO5coTxKU46O3+Uqjz8KA9GHa/ZWCbeWThkMNsTw1Wf+cbvk70yMdGqP8mcCV+AY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409973; c=relaxed/simple; bh=jfrMUxoZZP++/18h4GPIFMVQvhWUN0Y/s+8JSUEz7IY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=DP1kbITF1QXqmt1imdzZ6uo0lwUtUuP4WEq1LrigvTKAxjbCH/LdTQ2VUfQ69ZyUjI47Kaa3B8ZDJy2H9Zg8LDnuUKGvKkPmcK9ZnOmI5UDXrio8Hckg7T9U5jsKFBCsPxVVdlUI1N/lKqFJgfLj43PNQkebyKoKpcqb7hWkOWs= 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=ZmbZ6T2D; arc=none smtp.client-ip=209.85.208.48 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="ZmbZ6T2D" Received: by mail-ed1-f48.google.com with SMTP id 4fb4d7f45d1cf-5dc050e6a9dso479154a12.2; Sat, 01 Feb 2025 03:39:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409969; x=1739014769; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ubzWnXZ1u1+fgPUqTz7rDMh/vzeIBjFqX+hxw7Dimc4=; b=ZmbZ6T2Ds/tBKGN67ttu7d5V6RdruRK2MXbGwM1+aM1qFcI5C2JGwkf0lUE4GoQYYE +JxCEHDsmj3a2pg1Wql7HL9s1KgXKQf9EOOkBY14aRh9taK9nCQezwb3qSLY5bBnNotR 2DY13RSQuaEHcLyJL8SI3q0Sdgh47vfu8JRXnA2IJmYCJf6zXh/29Q/kbrP1lLDuZa85 IGGiecE5J++jeWLCxTh5R7nersgWgDiRzpsm93zTC0dvJ46ZS0ndkprnTcAQdYVAX5pP pVVsMuPsZ7kBGFTPwcZOwbuFk+T6SPw/RoixcGefb802E6y5k3wybuCEjvJJuY61Md/K LUiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409969; x=1739014769; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ubzWnXZ1u1+fgPUqTz7rDMh/vzeIBjFqX+hxw7Dimc4=; b=ONUd3brYVOKhXvJFhU2hWLXi03uuucjh1RCFVJieS30ot6Gkap+UR7FRuvVJ5Un8F6 lBF9ywNCyxgF7GMiy6lLZ2qd7zloH27hLW14ZOIscHLCkxUh3666ER7N/aij4KSci2Dr R9Qe3Os9obpj1uwt6GQI9yWWaxuH9R3NuHuTdD2V1XGBGPeh/3r05NGA72plONfdah4M 31SY0eWEnxmCGbxN4QQ36FcVDoSJ/y+kA9AZE6lC3DRfBbyTmPtIdTnUSTlMbbhqhxtD LT/H0Adztn9+c2GyqNkbx5s1Whn++GKhusOWsWGACnF1L1sUrG2kh6KqBVz9mhZAwmeN +41Q== X-Forwarded-Encrypted: i=1; AJvYcCVJzHvTB2Rm0xZ0VzXFluskyzAbIsi765rSXItt8lvTwTTu+UEshF3Q6sOp0JllkUowOaz3LXMO+sG/ug==@vger.kernel.org, AJvYcCVjwQdtgx5J0334sbu92jle95F2PbyXPsUkRtabz65mrjn5bgwNchKs4KNksmeZU9ym+/Eagkdf7s1y@vger.kernel.org X-Gm-Message-State: AOJu0YzxdYdGExeHlyb/2cIOF+3hk4m1iJIUukpEQpiEG4YLu6pdOB3n YNa3CewGSL1FamY/fgUVtfw9R6z37rcnoVLi4TQndU6yjLxurrl1 X-Gm-Gg: ASbGnctWYBn1GDjswZ0tNLoAoyYpoxpsAhhLuwknfM3fdhYZ0mhPXg6nyl2pqp6vJR4 TAamh/gkvvHeyAGmHP06Ve2m8L+C5t7F9nBoTteRtDw2imRJ+Daz9HnsK+2jQOBJVuJdcgU9T3V JoaDgMyUgfiJVM+G1WRSGINlYHa5Kob8ENvbvwUWrOgAokCo2UZekF2P91ujcMfjgbqI0I4c6rU k7r0HdB01Q+mFnoriV8v4C3Sc/obC08bSGrbR/ZWU0xQb+Q2rRqeeGwxycVuHskiMhscTiF9Km2 NoBKYAc7juUShcJpyZU8x1noi80kKvpOsK7doFpP16n0CQgIfnxpiQqM2krJPg== X-Google-Smtp-Source: AGHT+IEa3vCydLEA5VgjxRewSsiuefBMq6yQ49dVS92HGZlzSKhtePUJwwxaQP1O83rm4v+w+4bJHg== X-Received: by 2002:a05:6402:34c7:b0:5d0:d786:b87b with SMTP id 4fb4d7f45d1cf-5dc5f0308e5mr6231174a12.9.1738409969257; Sat, 01 Feb 2025 03:39:29 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:28 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 17/22] HID: pidff: Factor out code for setting gain Date: Sat, 1 Feb 2025 12:39:01 +0100 Message-ID: <20250201113906.769162-18-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Makes it possible to easily set gain from inside hid-pidff.c Changes in v7: - Check if device gain field exists before setting device gain Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Paul Dino Jones Tested-by: Cristóferson Bueno Tested-by: Pablo Cisneros --- drivers/hid/usbhid/hid-pidff.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index 8a2a4bed2632..a7d9f9b19668 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -539,6 +539,19 @@ static int pidff_needs_set_ramp(struct ff_effect *effect, struct ff_effect *old) effect->u.ramp.end_level != old->u.ramp.end_level; } +/* + * Set device gain + */ +static void pidff_set_gain_report(struct pidff_device *pidff, u16 gain) +{ + if (!pidff->device_gain[PID_DEVICE_GAIN_FIELD].field) + return; + + pidff_set(&pidff->device_gain[PID_DEVICE_GAIN_FIELD], gain); + hid_hw_request(pidff->hid, pidff->reports[PID_DEVICE_GAIN], + HID_REQ_SET_REPORT); +} + /* * Clear device control report */ @@ -865,11 +878,7 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect, */ static void pidff_set_gain(struct input_dev *dev, u16 gain) { - struct pidff_device *pidff = dev->ff->private; - - pidff_set(&pidff->device_gain[PID_DEVICE_GAIN_FIELD], gain); - hid_hw_request(pidff->hid, pidff->reports[PID_DEVICE_GAIN], - HID_REQ_SET_REPORT); + pidff_set_gain_report(dev->ff->private, gain); } static void pidff_autocenter(struct pidff_device *pidff, u16 magnitude) @@ -1404,12 +1413,7 @@ int hid_pidff_init_with_quirks(struct hid_device *hid, __u32 initial_quirks) if (error) goto fail; - if (test_bit(FF_GAIN, dev->ffbit)) { - pidff_set(&pidff->device_gain[PID_DEVICE_GAIN_FIELD], 0xffff); - hid_hw_request(hid, pidff->reports[PID_DEVICE_GAIN], - HID_REQ_SET_REPORT); - } - + pidff_set_gain_report(pidff, 0xffff); error = pidff_check_autocenter(pidff, dev); if (error) goto fail; From patchwork Sat Feb 1 11:39:02 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956220 Received: from mail-ed1-f51.google.com (mail-ed1-f51.google.com [209.85.208.51]) (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 20FF61ADC93; Sat, 1 Feb 2025 11:39:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409973; cv=none; b=V1wfFQvqJDnRCeOEH4Wb/wf4n0owZcNy5zb0t2S93roBP8cfYDEMfBSh3Y1/l+VxAF1QLKS5FG1lK4tswq+vdtjAWz10NOaPHAJT7qC+OSf0Cz4MUZ6GVDEOhiogSWx4bNk9JjbQDdtHGbqDzkqTNyBZZVvqxWUAoauRmbRaITI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409973; c=relaxed/simple; bh=0K18IsQZlxgG3h8AjOD4Jxyc/4PKRj2qM0adwClrFU8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=DqL+7VVLA/awSes2Mz0G508UNGVF2GCNDe5yLbJogtu/ReOkn86avdVW9rl5SMDMqtz2DXl07kUgdJ/qcg9f2YRAths6jiicNAASZUoO6Yi0anF4e5ZfxL5TXv06pzs4W0rbAe2Rx4o3Qn6fse5tcLlCk+xTNV3aO9v5AwgZlZE= 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=mYBFVlfE; arc=none smtp.client-ip=209.85.208.51 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="mYBFVlfE" Received: by mail-ed1-f51.google.com with SMTP id 4fb4d7f45d1cf-5d3cd821c60so548691a12.3; Sat, 01 Feb 2025 03:39:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409970; x=1739014770; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=PaeJPegiVccH3PHrKGcqdcUbiveMoSSJlrgBbQku98Q=; b=mYBFVlfELWpO0X35UYElM31IeZws+7tB8I0xJZKwBNFN30TXSW8HZU8XiU3J0+NJmz Writ6pBxVeN1px5EErlaZwma1G18QV6Qyb9FF01D1ruf7d8Wzm60S7h5Vl/mhj1L43Gn acVK/fSza6dWnnMhYu6FtSKGnhdv3hI2LzcO8V3PjtGBCnqC1G+Y/unLn70Xav33K5wD 38QEdukHGDW8JzSAC/KaJNz5a5IWi+5vWnM0e/WB8CYtUYxNKeLg/YeUnS1zvS+0Es73 1Z8J8ePFFQ1k++RUmrz3isbiqf0dnbzqrKRyVjn5VWEEGkz4VPGxz8oYKZ/kD0fX1HQU 61lw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409970; x=1739014770; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PaeJPegiVccH3PHrKGcqdcUbiveMoSSJlrgBbQku98Q=; b=dleKSDMtJqfCH+ZPvVQFp7UXOEPH5fwV6ZIdaQQqaghU/WFdMggMigWLHxYVijyhXT WxTiWtyH/ZhghT7MrhS/bH/qRpyatI4Xxj7r9QC1pu+80FsTe6Le8vJ62crvZaqxin0l v1NtJI+rfsqqrw/4VorEg1covWKv3vmGcVqx0oCSTt8nneJHudJ4cOhubgrw1fpSQM15 TSnKSWaeTyoLhf8RuWHlfUjXD3xR1EtTLYrRjsBQDNAa13FN9CbMubq88nRr9l7CMuGB 5KyXEZA7rKYts8ee/4QK/goo+zIneZUQ7pvxvkRnmn+zIgfucFgtOy8CqnPthHRVfF8c rEag== X-Forwarded-Encrypted: i=1; AJvYcCVf0yFRfSqQAMRyatrXzFRzpOIVDG1z9NrOj84DIqKzWdiG8+rBAlHMD3JiuhH5LaudjFo/uVgPlZke2Q==@vger.kernel.org, AJvYcCVp4dC8ZaoiG320VUKGIAAG+8mWUGr6BZNpndKQfb3FVBOOsNx+HlVnRHMCLBP0pXZf5fklLNCuax+H@vger.kernel.org X-Gm-Message-State: AOJu0Yy0PJm/VJ1HHrqAnj56xycwedndWqnjglpJhV6QbiBFMrv3xAFa 7MJj3CO+6iFxMRUQ1XzrjE4cjQsG1IxFNRmybAfWWkMWfLlaA7iA X-Gm-Gg: ASbGnctN9x4Djk0SWuoJfmbByl49ujvqvb0E51FOI2I1/FYd+rSLeEcVX+ue0yt0av1 FQ0M6qrK5qlXqcXVmr990aVlVi0ik83XyhnvVUcf/F865nDxu5NpeQnR7L7Wr579Av/A29BpKt8 UHmU6QBJOiu/MNQzNMqyhC/VgIa6+smHEAEnQiezl/ZkKjaRWJiiXXcoCJDgfAA8dxlXj2mX5Eb nwFzvAFoiSyZ6+4sRsxpjQmAvS8FiMSOe39eaT4yg8QMTmZgW9Ja378yp1P1ZgPxYYMHqb7soeS 7M+3EtD5wN8I2s7DsKcMxh+oWv/T0EdAIYddnnbu8hul5dWuPE55u0US+m9q1Q== X-Google-Smtp-Source: AGHT+IEin5PlZvEQFdTqrAfr4J9DGDlPxxUeLtLpImKQgRWR3sjJAggYMKoqCcAffXbw6enBPC3X2g== X-Received: by 2002:a05:6402:42ca:b0:5dc:5a51:cc04 with SMTP id 4fb4d7f45d1cf-5dc5f03140dmr6227061a12.10.1738409970313; Sat, 01 Feb 2025 03:39:30 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:30 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 18/22] HID: pidff: Fix null pointer dereference in pidff_find_fields Date: Sat, 1 Feb 2025 12:39:02 +0100 Message-ID: <20250201113906.769162-19-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Tomasz Pakuła This function triggered a null pointer dereference if used to search for a report that isn't implemented on the device. This happened both for optional and required reports alike. The same logic was applied to pidff_find_special_field and although pidff_init_fields should return an error earlier if one of the required reports is missing, future modifications could change this logic and resurface this possible null pointer dereference again. LKML bug report: https://lore.kernel.org/all/CAL-gK7f5=R0nrrQdPtaZZr1fd-cdAMbDMuZ_NLA8vM0SX+nGSw@mail.gmail.com Reported-by: Nolan Nicholson Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Paul Dino Jones Tested-by: Cristóferson Bueno Tested-by: Pablo Cisneros --- drivers/hid/usbhid/hid-pidff.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index a7d9f9b19668..ac6f940abd90 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -926,6 +926,11 @@ static void pidff_set_autocenter(struct input_dev *dev, u16 magnitude) static int pidff_find_fields(struct pidff_usage *usage, const u8 *table, struct hid_report *report, int count, int strict) { + if (!report) { + pr_debug("pidff_find_fields, null report\n"); + return -1; + } + int i, j, k, found; int return_value = 0; @@ -1050,6 +1055,11 @@ static int pidff_reports_ok(struct pidff_device *pidff) static struct hid_field *pidff_find_special_field(struct hid_report *report, int usage, int enforce_min) { + if (!report) { + pr_debug("pidff_find_special_field, null report\n"); + return NULL; + } + int i; for (i = 0; i < report->maxfield; i++) { From patchwork Sat Feb 1 11:39:03 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956221 Received: from mail-ed1-f50.google.com (mail-ed1-f50.google.com [209.85.208.50]) (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 9158617BB21; Sat, 1 Feb 2025 11:39:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409975; cv=none; b=m1a3qp5qmcDbnR2sCoa0oYBT5SQE7CxZpy5ucQ6O3wr0rfqffJ5FS4V0AI4TAob8LonAc4gY7oOO82jgLWBWDaSs5p+qOZb+KHwu7enDGZe49BZ25r1hGF0uUQeDxUGAO7L3HyxLeZ4vxQdUH09qbjFl7LUuFqDr/KoIQ/kyPVE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409975; c=relaxed/simple; bh=KUbe290IwuT/cmVxsMAZQOm2xA71iE/9jpIUXmu++tE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=qtn68xGWuMKITh5QwsfuOzIoZbrAyCKvOG1CLOzfD+OM9PacKxFH3aHLKMA/RgoinnpFy5LMwniKpXnSdxGOopKk+NXEFDVCeH+ZqPBaPyiSEniyNHBn6nabJYO4u9vDoQemzWVM4MwWbqvFgCFlQjisZaGkT6KlalMLqs/jmlo= 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=AwNj82wH; arc=none smtp.client-ip=209.85.208.50 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="AwNj82wH" Received: by mail-ed1-f50.google.com with SMTP id 4fb4d7f45d1cf-5dbf5fb2c39so468935a12.2; Sat, 01 Feb 2025 03:39:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409972; x=1739014772; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=/aO7Jt0OWFF3kuqbR27PymoniiVFsHtxWxUnhNXR6Kk=; b=AwNj82wHovValArDwz+By6NM2SVMiFuWu1QRDIwhyLf5uHtxMQz3OBLBRViWWyiXjO ziTScyvR6CgmgAPpzhvCaNOWthwHBgmVr1Dp+S7GOK6sf/LLQCWlAZKPu+QFcQuOTE5d MUB3nG5FVETo5tCMcma7d5Ay7SOlxOnPCjVwX9NptbgPh4KCzKQRyFzThq54jH3+MXZ2 wC5GcxRUJ0FtPKiUkX2PwelxpwNxoIuCz3KEyIe+txoK5rpRKnYEdLV9TUnuviVshkNy 3NLKQlR1g0jY3olEUjxjY2TJar6wuU+n/Q+UoBypuIQyBfTPAEscQvp22bhe37P4U8Na ULGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409972; x=1739014772; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/aO7Jt0OWFF3kuqbR27PymoniiVFsHtxWxUnhNXR6Kk=; b=cjgBLX7+PmJhapfRXgwO0S9S13bqCFVMAPoP7AjwCpGZQNTEphPIMXzxm1V/E9QU6t nFPJW565i5EOWSg+/fkyyEjPwM6qkkKgUKCqfxmKRij4iydN/rw7Mhk9U17lddNdIWsy UvFnmkwZkHKQ4/sPNsOZrZKg5w/RJL6kI3FEM8QJCBsoF803Og+O61yoJGnLPDAVt9FY EA5Px+tH1Y/gyzpoRbQfaSY6cOpWuFkTqE1lMMy9E1IDmralCQn0+iD8KxuoFXCUhQon BjQnXTX/4dzMnWyNZLaWfRHvHjzucxWwlQrZAhbvumFyHxRPArT5ZJTnkYD6KWW3nZFK pVUA== X-Forwarded-Encrypted: i=1; AJvYcCV3WnzpHreoRYS2/6WmV8VTVGtuhRefdqGnhSBfa9JW4QGoPnVwWckF5PzZvLeCg9THF4MDLAKeKoOL@vger.kernel.org, AJvYcCW7NHqbLEu6JUn54S1pV6lpsMBIDesT/j1ICqLF5GUFMmEAqn04RlMubKCd+dQV6va3tmJSN2kRWmblWA==@vger.kernel.org X-Gm-Message-State: AOJu0YybyLo+7N1MzHHiGnUpNjKE+uUbldAg0+WCZSU/LTiOHlssN9yr nStSpv3JwCO0OWIz9cqQWdG4K1wahCSrNPj93W/+ip99i1dLWPUa X-Gm-Gg: ASbGncvaCFCG1vtPfFkTtecH7oJAn6r7dW+WVMG2Ieu3N9w3X5jwaEYi2IZpUfpTCaK veg2owIVibC1/x+rK7lWUymsG39LILhGh8c5W5vc8HKDzRPiPXKuiHQvJF9zNz90WBgPPd4D01z 5n/XSaJnSOT6IcBuXtQY9LckpTeikk9Ler+YA9TIr6GZsD1wZE8bSYyCM7xivpN0utay3MbnxXc SeqpEwr0j4jraVeJICdSmxn06b1h7sh3wgfUtJlkZnQoj+vuZWljx/9EbBFNilxlNGAzrbjp0iS +f7PDPt8BVKKvDbtjxQO/sapR4U/E/3Z8b6rL+PxkHjePIxQyMgqj3CMaOjkTw== X-Google-Smtp-Source: AGHT+IEYtEhKMXeAB82OEVbxoPoYBXLhLLv0aziuelI8CflDd8lXKZSKxoVvEu5CfdWhI/ysSLo6Eg== X-Received: by 2002:a05:6402:51c8:b0:5dc:8845:6a00 with SMTP id 4fb4d7f45d1cf-5dc88456b7dmr1998379a12.8.1738409971717; Sat, 01 Feb 2025 03:39:31 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:31 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 19/22] HID: pidff: Move all hid-pidff definitions to a dedicated header Date: Sat, 1 Feb 2025 12:39:03 +0100 Message-ID: <20250201113906.769162-20-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Do not clutter hid includes with stuff not needed outside of the kernel. Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Paul Dino Jones Tested-by: Cristóferson Bueno Tested-by: Pablo Cisneros --- drivers/hid/hid-universal-pidff.c | 3 ++- drivers/hid/usbhid/hid-core.c | 1 + drivers/hid/usbhid/hid-pidff.c | 3 ++- drivers/hid/usbhid/hid-pidff.h | 33 +++++++++++++++++++++++++++++++ include/linux/hid.h | 15 -------------- 5 files changed, 38 insertions(+), 17 deletions(-) create mode 100644 drivers/hid/usbhid/hid-pidff.h diff --git a/drivers/hid/hid-universal-pidff.c b/drivers/hid/hid-universal-pidff.c index 7ef5ab9146b1..1b713b741d19 100644 --- a/drivers/hid/hid-universal-pidff.c +++ b/drivers/hid/hid-universal-pidff.c @@ -13,6 +13,7 @@ #include #include #include "hid-ids.h" +#include "usbhid/hid-pidff.h" #define JOY_RANGE (BTN_DEAD - BTN_JOYSTICK + 1) @@ -89,7 +90,7 @@ static int universal_pidff_probe(struct hid_device *hdev, } /* Check if HID_PID support is enabled */ - int (*init_function)(struct hid_device *, __u32); + int (*init_function)(struct hid_device *, u32); init_function = hid_pidff_init_with_quirks; if (!init_function) { diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index a6eb6fe6130d..44c2351b870f 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c @@ -35,6 +35,7 @@ #include #include #include "usbhid.h" +#include "hid-pidff.h" /* * Version Information diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index ac6f940abd90..a8eaa77e80be 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -12,6 +12,7 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +#include "hid-pidff.h" #include #include #include @@ -1383,7 +1384,7 @@ static int pidff_check_autocenter(struct pidff_device *pidff, * Check if the device is PID and initialize it * Set initial quirks */ -int hid_pidff_init_with_quirks(struct hid_device *hid, __u32 initial_quirks) +int hid_pidff_init_with_quirks(struct hid_device *hid, u32 initial_quirks) { struct pidff_device *pidff; struct hid_input *hidinput = list_entry(hid->inputs.next, diff --git a/drivers/hid/usbhid/hid-pidff.h b/drivers/hid/usbhid/hid-pidff.h new file mode 100644 index 000000000000..dda571e0a5bd --- /dev/null +++ b/drivers/hid/usbhid/hid-pidff.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef __HID_PIDFF_H +#define __HID_PIDFF_H + +#include + +/* HID PIDFF quirks */ + +/* Delay field (0xA7) missing. Skip it during set effect report upload */ +#define HID_PIDFF_QUIRK_MISSING_DELAY BIT(0) + +/* Missing Paramter block offset (0x23). Skip it during SET_CONDITION + report upload */ +#define HID_PIDFF_QUIRK_MISSING_PBO BIT(1) + +/* Initialise device control field even if logical_minimum != 1 */ +#define HID_PIDFF_QUIRK_PERMISSIVE_CONTROL BIT(2) + +/* Use fixed 0x4000 direction during SET_EFFECT report upload */ +#define HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION BIT(3) + +/* Force all periodic effects to be uploaded as SINE */ +#define HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY BIT(4) + +#ifdef CONFIG_HID_PID +int hid_pidff_init(struct hid_device *hid); +int hid_pidff_init_with_quirks(struct hid_device *hid, u32 initial_quirks); +#else +#define hid_pidff_init NULL +#define hid_pidff_init_with_quirks NULL +#endif + +#endif diff --git a/include/linux/hid.h b/include/linux/hid.h index c6beb01ab00c..6d09b1763652 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -1221,21 +1221,6 @@ unsigned long hid_lookup_quirk(const struct hid_device *hdev); int hid_quirks_init(char **quirks_param, __u16 bus, int count); void hid_quirks_exit(__u16 bus); -#ifdef CONFIG_HID_PID -int hid_pidff_init(struct hid_device *hid); -int hid_pidff_init_with_quirks(struct hid_device *hid, __u32 initial_quirks); -#else -#define hid_pidff_init NULL -#define hid_pidff_init_with_quirks NULL -#endif - -/* HID PIDFF quirks */ -#define HID_PIDFF_QUIRK_MISSING_DELAY BIT(0) -#define HID_PIDFF_QUIRK_MISSING_PBO BIT(1) -#define HID_PIDFF_QUIRK_PERMISSIVE_CONTROL BIT(2) -#define HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION BIT(3) -#define HID_PIDFF_QUIRK_PERIODIC_SINE_ONLY BIT(4) - #define dbg_hid(fmt, ...) pr_debug("%s: " fmt, __FILE__, ##__VA_ARGS__) #define hid_err(hid, fmt, ...) \ From patchwork Sat Feb 1 11:39:04 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956222 Received: from mail-ed1-f41.google.com (mail-ed1-f41.google.com [209.85.208.41]) (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 A91EA1ADC99; Sat, 1 Feb 2025 11:39:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409976; cv=none; b=lDjJI8FE8a2LmnhbsgN/kb+dtc2Wu2CBDq8GLNAmsEEfo2IHdU+6buwpptGl3tAWNzc5XZyjygQVnzRWbtZ1+iJ1Bju6wXG0qRUWLig0SQlFc51QEVr+E0oQUwCujlAd9HUQ/CngNzl2SK84BLwfyJyFkRA5+XovBDEH7BB9tP4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409976; c=relaxed/simple; bh=cabapa6JgVvaN8IijEkAXa15PpEFajlynULvWLHF/ug=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=MakaGjhxApF7FCh7rrgTL0QtpmvP2E5pCdQLtEWT30wCfC7CwWH8b6/34q9tJdY8faN3XK/E3/cfv494pX5L6O70bf8sotZBxQwrsAx6cPTd0xz+7TeYg9+wmji14t1F96JFD8Gn8LBtYFCk4D9LE96F4/QvrYiI1q9pHGaDKRA= 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=aCttXFfj; arc=none smtp.client-ip=209.85.208.41 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="aCttXFfj" Received: by mail-ed1-f41.google.com with SMTP id 4fb4d7f45d1cf-5d3cd821c60so548696a12.3; Sat, 01 Feb 2025 03:39:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409973; x=1739014773; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Or6wYFw+AUau12EbI8cBz5y0ES3OZ+1JZ7ySMJU6T0Y=; b=aCttXFfjs9LMmwiCOHMi38AXqJFdtlkUrBHFT/u/mbHKBXFFlhepGyNIgyq44UUXjH bGY1j8Hdv7Rrgk8Oqj+w4O5Q6QDbOkNy9le2JBUoI7wDzl0mR8/qSDG1mY9Ncv7mmRL3 wbnyJ7UWw6y4JRwxbMkkPu+OJbd6NXb2E4n1ywV7LLadWlit8Ty4cXdbf0VEK7NbiNRq MLdzTSwD1+Tsr0ZEQT1LeJ/RA17Fsrub3xCy2jdpcIgXBcJ0Fdbg60+veOuiwgOKWqU9 yaTiEfN+mdY0h9dyEmR6xxO9WGW+eDjLQQBDo4pHX+iZDiUYHE55GSFaL2Bz2e85BvLi b2RA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409973; x=1739014773; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Or6wYFw+AUau12EbI8cBz5y0ES3OZ+1JZ7ySMJU6T0Y=; b=eWxThcL/JhmqoVnWAL97KviN7qTlzwj0kZ2NGTQc62dIQC835rT0VktIHnV+Tsfg8B sIjr/ahToUx9HAjrgHICEmG1Hp3x0AtJOhIhY7cY/H52a+1Azct8Lo0KK7NzffMALNWb LZwozHMi2GIqb12Z3kUFtWDL96VmAlhMsyk8jv8m24Gv29q+F/WIWsfEb97mg1gqHATu MxYx0T1PlsJ47Gtxp+I07lxQsh0rTbSMXMJpEse3SelFIOzUxxc2WTuoCM64R/J3Re9+ 5R8lgVazL46R57q8LY+g+7BAOVhElobwLgfvEyZrFiXrmBplnha6tPtVZslucZL7aWMM DIrQ== X-Forwarded-Encrypted: i=1; AJvYcCWQavn2yqPP8mu7dYsBQuh/yKR+AtvETYnlgD9uCioXo0sc+Yiwc/sypWjiomPtLCCuJOUVgxYAme8RqQ==@vger.kernel.org, AJvYcCXWKhVxUy633jfdLNeyarTGvpTI3uh9Bu6wzyQOVqKqkbsepnjtMU/ewTy3va6XvdckdEf9+rcf2oP7@vger.kernel.org X-Gm-Message-State: AOJu0YwEJ7B9ejhMfKu357elpbDcAZadmFZ70n222UF5mkYPEZUr8jRy uYffFnXqj7TuUIFdG0bgeZOzMVb/U6IFeXRSA3peRcyMXS4mX17o X-Gm-Gg: ASbGncu9Vpjmf6tl3QDeoPqhAyy+PMpaKsrU+Y3u24C6PvBAQNNr9dO8bwXuxDjr99I qpY61YyCKNDlMr87SMiKnyagSSSDSFTlPusLY0FGhFsNfWSLVF3d2cuYFMUmcqU2/ESRGACkSqr +lvqTo/lXNgur5uJVl0sgjqQMl21bMMVCmR8EQateF5UBnXMPgJNRZ2HnanGL4DxJjnp34pQDvm ZyvsPECYF1x24HyPt5DsMoCJ6FGp3GtOGpVCA2C5O3qXnF2oqj2+U9Ew2pD5kflllQppO0Go4Iw uOrGKla+TcLG1HGKEO9qqjo2Kg3jK/WnSVDAyYXcE84VCi4BEjZeiwr8bP6J7Q== X-Google-Smtp-Source: AGHT+IFBezlDEcA08k+ZX/Q4uOeA9szw0scXaFOulx8FgliKrwgvQOeNwZ675kxu/AidvLfTywdlyg== X-Received: by 2002:a05:6402:4287:b0:5d0:bf79:e925 with SMTP id 4fb4d7f45d1cf-5dc5efec149mr6290444a12.6.1738409972809; Sat, 01 Feb 2025 03:39:32 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:32 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 20/22] HID: pidff: Simplify pidff_rescale_signed Date: Sat, 1 Feb 2025 12:39:04 +0100 Message-ID: <20250201113906.769162-21-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 This function overrelies on ternary operators and makes it hard to parse it mentally. New version makes it very easy to understand. Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Paul Dino Jones Tested-by: Cristóferson Bueno Tested-by: Pablo Cisneros --- drivers/hid/usbhid/hid-pidff.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index a8eaa77e80be..8083eb7684e5 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -230,9 +230,9 @@ static int pidff_rescale(int i, int max, struct hid_field *field) */ static int pidff_rescale_signed(int i, struct hid_field *field) { - return i == 0 ? 0 : i > - 0 ? i * field->logical_maximum / 0x7fff : i * - field->logical_minimum / -0x8000; + if (i > 0) return i * field->logical_maximum / 0x7fff; + if (i < 0) return i * field->logical_minimum / -0x8000; + return 0; } /* From patchwork Sat Feb 1 11:39:05 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956223 Received: from mail-ed1-f43.google.com (mail-ed1-f43.google.com [209.85.208.43]) (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 2B8711B5EB5; Sat, 1 Feb 2025 11:39:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409977; cv=none; b=ExJ+Zepfc6pyGDntGSV6vPMtIq4R3s1vxjVMjqR0hcaysFtwIgw+E5I/yVJG60oVXtiM+JEPVdG6K5PJdEylte9sa/wj6ZKpQeDB8WpxNs6SavJYvMnGjgd9wWJprtJEHIulKSpLkBe2hxy9qbAgXSLb4vOoZE9TNPXFM0fvXLA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409977; c=relaxed/simple; bh=jxI7+sL1z0nRc81bF8M/k+iyuwuBbkHvE5ruUynGjPg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Bbqe+tzaS9UDLqgB+JahBhnnKZvk8mZ52Tp/T4l4oxF9xx1lt/XTHATfINYPhkXmdKv3qzuTeyZ4F8e8VhQeED1Lmn1qxfgfuUgiTaEpGBwNyw+HMHem849PiY86R6kxzLg8mfFfqC1wQUpRd2FCAv5ZpxzZN2WKLItdWMvDtQY= 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=W/0gXXGb; arc=none smtp.client-ip=209.85.208.43 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="W/0gXXGb" Received: by mail-ed1-f43.google.com with SMTP id 4fb4d7f45d1cf-5dbf5fb2c39so468943a12.2; Sat, 01 Feb 2025 03:39:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409974; x=1739014774; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=qkyGAw6tUtCsf39r3rsE7AYFmi/exsjVFsy6CepgpTo=; b=W/0gXXGbM23jxRspuoB23LL6lx6b1boTmvrveqD8FiiJI9hlkI2A6SnsVbqp1OqCPs j0TbPfXMp1OVmnN4MQO8ohVdkVo0ibRtaAq/Y7BiUi5iVGhVITVEF2JN5DgKeC0pKPCj odus1ciIf5+O/idoSGYhYA6UCFInp1fVrFtp/y8pWIJ1tVCtTCm75yUrAgT7q5u+2yaF 25x+B/Ee37iHvne7FbiGh5MwcJ/4RNcfvO3GM406JgBFjMSbma+YjDWesoi7DsBBcn1K ejHGKuXXaBAekH85gspnYYT5R9uPcTHpo65Urujzfmefvq+TCJcCYF+4RFtZH22xXm/A xgBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409974; x=1739014774; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qkyGAw6tUtCsf39r3rsE7AYFmi/exsjVFsy6CepgpTo=; b=na+jVXAGB7wNTai6LnCoScUsPHlxVFjfswKOR9lvrmBF73toRbTUl/aA8aFxfXETZ0 tA4ReE0uulTKpzD+bfFtuKbUbvY90RFfeOHI/KXjVS5BsCo6/zMyt9AXbwEk5okY4d+T GpVYXn5cgkzP+5QFfUGCdARMuWc+uF0WdfnNM0bWL78FEzzJ+nlP+6KUNzwHVj1iIS2a Nvp8mpIPcFy2LqFCEb5UvaE8uswsmN5tv4PZ9mBivq66YBFhneUQ8sNge7w7uZpdnRtZ 54aXnrvJkEaiVe//RbFjv1P0WjagP7sEqUwJnlqnLwj/1ceLRTtyrw6XUuP6i+N96t01 J09g== X-Forwarded-Encrypted: i=1; AJvYcCV2ktDXogy01/1PYk2vD2GfUkuxYn3B0as6OvW8a5VP7E8XKYXptKj0k1UTGU4k2gVCzg89JbXlnADz@vger.kernel.org, AJvYcCWXNVd3jEpMtX/hRcPljs++Bb+MGqxyYnt1i0/uiQ6iObvZRKusmhFVnnA7+D2bHwrs5+F/L7X960ImWA==@vger.kernel.org X-Gm-Message-State: AOJu0Yzc8sywep7z2xoRosR02XpdM06MyHzNZEAAoPwPiG9wE3/iDpGG 8VBYrzmelx2NSlMHnfeBb2QPXW+fXbjcOVlOto1aO+x7bZc6YJAb X-Gm-Gg: ASbGncu5EJq/DVJyE0oTyD41HruP4TyD3Z4Ry6LTLs9VnyI6Vb/w4n1XajFHN5gswOj QIexkGekVj/AQEXF981e6FXx/jcVFQdDwZpOAHaG/IPt99XV8tNP9KCg07l29XxVukun1lEV52d MzsUnODa0QxPubyVJ55AkhANoas1Owi+GPhwXJOxe8vZfadHwRSYW+E96E2m3LJlKl7TyFyeKSv +XE+ADmqssJpzOIthDyHZxAbeUzrWx6JeGSqezHtzV3wWANZtkyufCFruhR3jW9kh6ou3FqM1YW 0WzpeI+KgxSGk8f0qY6hIQNNXkU6s5GQNWcg60HGSZMZP7lUZR+cT8YcpJhmOA== X-Google-Smtp-Source: AGHT+IGC7NZdQ5FCwhhoiLce541Jh+GqOLp4NZVx47LeKCmnkAVKWnTtlu+ciCYcRGlPtVYpsyHr5A== X-Received: by 2002:a05:6402:42d6:b0:5d0:8e70:cf86 with SMTP id 4fb4d7f45d1cf-5dc5f01a03dmr6074722a12.7.1738409974310; Sat, 01 Feb 2025 03:39:34 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:33 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 21/22] HID: pidff: Use macros instead of hardcoded min/max values for shorts Date: Sat, 1 Feb 2025 12:39:05 +0100 Message-ID: <20250201113906.769162-22-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Makes it obvious these magic values ARE in fact derived from min and max values for s16 and u16 Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Paul Dino Jones Tested-by: Cristóferson Bueno Tested-by: Pablo Cisneros --- drivers/hid/usbhid/hid-pidff.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index 8083eb7684e5..b21e844f5f3a 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -21,7 +21,7 @@ #define PID_EFFECTS_MAX 64 -#define PID_INFINITE 0xffff +#define PID_INFINITE U16_MAX /* Linux Force Feedback API uses miliseconds as time unit */ #define FF_TIME_EXPONENT -3 @@ -226,12 +226,12 @@ static int pidff_rescale(int i, int max, struct hid_field *field) } /* - * Scale a signed value in range -0x8000..0x7fff for the given field + * Scale a signed value in range S16_MIN..S16_MAX for the given field */ static int pidff_rescale_signed(int i, struct hid_field *field) { - if (i > 0) return i * field->logical_maximum / 0x7fff; - if (i < 0) return i * field->logical_minimum / -0x8000; + if (i > 0) return i * field->logical_maximum / S16_MAX; + if (i < 0) return i * field->logical_minimum / S16_MIN; return 0; } @@ -255,7 +255,7 @@ static u32 pidff_rescale_time(u16 time, struct hid_field *field) static void pidff_set(struct pidff_usage *usage, u16 value) { - usage->value[0] = pidff_rescale(value, 0xffff, usage->field); + usage->value[0] = pidff_rescale(value, U16_MAX, usage->field); pr_debug("calculated from %d to %d\n", value, usage->value[0]); } @@ -266,10 +266,10 @@ static void pidff_set_signed(struct pidff_usage *usage, s16 value) else { if (value < 0) usage->value[0] = - pidff_rescale(-value, 0x8000, usage->field); + pidff_rescale(-value, -S16_MIN, usage->field); else usage->value[0] = - pidff_rescale(value, 0x7fff, usage->field); + pidff_rescale(value, S16_MAX, usage->field); } pr_debug("calculated from %d to %d\n", value, usage->value[0]); } @@ -306,11 +306,11 @@ static void pidff_set_envelope_report(struct pidff_device *pidff, pidff->set_envelope[PID_ATTACK_LEVEL].value[0] = pidff_rescale(envelope->attack_level > - 0x7fff ? 0x7fff : envelope->attack_level, 0x7fff, + S16_MAX ? S16_MAX : envelope->attack_level, S16_MAX, pidff->set_envelope[PID_ATTACK_LEVEL].field); pidff->set_envelope[PID_FADE_LEVEL].value[0] = pidff_rescale(envelope->fade_level > - 0x7fff ? 0x7fff : envelope->fade_level, 0x7fff, + S16_MAX ? S16_MAX : envelope->fade_level, S16_MAX, pidff->set_envelope[PID_FADE_LEVEL].field); pidff_set_time(&pidff->set_envelope[PID_ATTACK_TIME], @@ -399,7 +399,7 @@ static void pidff_set_effect_report(struct pidff_device *pidff, pidff->effect_direction->value[0] = pidff_rescale( pidff->quirks & HID_PIDFF_QUIRK_FIX_WHEEL_DIRECTION ? PIDFF_FIXED_WHEEL_DIRECTION : effect->direction, - 0xffff, pidff->effect_direction); + U16_MAX, pidff->effect_direction); /* Omit setting delay field if it's missing */ if (!(pidff->quirks & HID_PIDFF_QUIRK_MISSING_DELAY)) @@ -1366,7 +1366,7 @@ static int pidff_check_autocenter(struct pidff_device *pidff, if (pidff->block_load[PID_EFFECT_BLOCK_INDEX].value[0] == pidff->block_load[PID_EFFECT_BLOCK_INDEX].field->logical_minimum + 1) { - pidff_autocenter(pidff, 0xffff); + pidff_autocenter(pidff, U16_MAX); set_bit(FF_AUTOCENTER, dev->ffbit); } else { hid_notice(pidff->hid, @@ -1424,7 +1424,7 @@ int hid_pidff_init_with_quirks(struct hid_device *hid, u32 initial_quirks) if (error) goto fail; - pidff_set_gain_report(pidff, 0xffff); + pidff_set_gain_report(pidff, U16_MAX); error = pidff_check_autocenter(pidff, dev); if (error) goto fail; From patchwork Sat Feb 1 11:39:06 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Tomasz_Paku=C5=82a?= X-Patchwork-Id: 13956224 Received: from mail-ed1-f47.google.com (mail-ed1-f47.google.com [209.85.208.47]) (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 846FC13A87C; Sat, 1 Feb 2025 11:39:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409979; cv=none; b=SjFNUU4fAxL5uiuSRS00w9GMrBjDbdY0fI/9YjLjWLTDiIJpuM9EkTYviTzIGGbuM+/vscMMT5wEsxITyjMcazJV7+1ILBuClMQ1XH31xCE07kdkRuw1Y5cmQrKqymG6QSILCcOuGGHiHOGJNwpwLnYQS3YUbdXTaUzobgDY+F8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738409979; c=relaxed/simple; bh=td+0A+DcVY8QOuKUAZNmzTEWuEvPeNx4/j1/UsdcYlE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=AcwUqju3Xag9DQfnklklND58ovC43wKC6BjchtAxXtA7d83R12nhnX4x95oAPpljFDxzqRlaN8he26BRGEm85+EcbugYD2jooRyonYl3x+D6y6u02lnVc2YI9dWfeYLGzbUYVYZxLIQIGyMER76ofnzgtbEYa0c3p5+uwWUyxwY= 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=Vz0jhgay; arc=none smtp.client-ip=209.85.208.47 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="Vz0jhgay" Received: by mail-ed1-f47.google.com with SMTP id 4fb4d7f45d1cf-5dc5a32c313so515211a12.3; Sat, 01 Feb 2025 03:39:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738409976; x=1739014776; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=XdkJPeGy8cB+I0O1JiaewcgKSq34WPStqqYd7P6r+NY=; b=Vz0jhgayFFKNjdFZ0aiSnditGdrgLzhWAaQnZLYQznFudHTX3Lf5K1TvO4fpNzqOLd YgOfUNw1P1GK4DwxFT5puD8Zvtp0CXL+OVfaQDryP8kpo6tv5gP/BNNqyjhtMtX1B2mf gNKd6oF7IFQUAXLYV/iQwvlbzOA/s2OxtQmPKcJMjBLsHvR+rfO+2TJ+irCT7rgnewlN bcmUfcO9esrbBxspEupgv/FeS4dXo805w2Q2fpxShVthY5nw0MGnDBAcAufkcAuair6U I/IuJCtztl0mTfUbrpxEiqdkywiJ8TYT5IRvh3aykEYy5brj5Wu3EA9FbhsyS1W/Ah7G ZwaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738409976; x=1739014776; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=XdkJPeGy8cB+I0O1JiaewcgKSq34WPStqqYd7P6r+NY=; b=YfYSaVjTGANLeVgOSRTHYqZXVeUIJay19mlZ6CWmUZ0X/hVBHZMkQ4DekeOUwMHE1r HlbgOXhNfwOM4TEyAm9A5CvLUX+iYxafHVOcl3f7Blu24nYKuVvDqooIab+NIATQ3X9S OBe4XPoFnQocrr8d0TqisRlX2p7YXRAAbWm36NlR0kWnt62OznSO+H4/5j9wP4hFt6fD PKpTQpEoqAP26pHFQg9p5/dP8fs84/VrDTA9gyjpKgEwz2Dxsywz+m7rQk4FcMlTRKmr weBu1ZW89CMyMy6ipP3hbiJgF1mBX1B3XPmhGaZG9Cw/sLUwb0Gc5/XHrvw0kAi9xVQk JFNw== X-Forwarded-Encrypted: i=1; AJvYcCWMpqjsZRECCY7MHZwAiFWyaV+MYmmvmsREQMrzonj+g0/yyWY/zGTe9NdXcjdZZkb00ulyNRrexDi8@vger.kernel.org, AJvYcCXVfFuv+kWwpctoua0YuCGKfGiIxSRaJe2rI3JVK/+sP7pR1lQjuCNmPlte29M6cPFPJ/dpDQdBmn/10g==@vger.kernel.org X-Gm-Message-State: AOJu0YxSdjntZ3WiFIg+14z42J55TgDZgQtLeiUjWLnOGMZ3a63KIy7l xUVTxaMXNxIaRfn48yiG+ruohlL5jsp9VnV3ePLM2orZqXm9ECqY X-Gm-Gg: ASbGncsAq9cpCVIZBUSS2vRckJvPo2KEHXB6B3rl+e4P8hNrwxon+J+NlH3/ekXN3rG ZBdfA3PC0KV3SiY+UeLvBd2OR1vsdE+nes/mgZwitIZ/E7Xzu+/zUyL8f7/exUV9BsB6vIAUQ6C 4Ed62qG1HwmSLLvIgOfZCgu1KVrYV4NzWr4JFA5tmU9YH1WtM9JHX9Bd4f+qrDDnQatVpn1B9We 9+gwXGKHmHyx+hJdv7PjxxGuBNj7vmfhAaGZXKGYBLs3PXrzXGU+QrDDs8mcjTP2NIwTsPPTdXz u+lJboFBu78GEQIhCIPVtdyOXFZiMuqLuVs/3nY3JL6lOU6S5vhOVjlatNQBoA== X-Google-Smtp-Source: AGHT+IEPzH/ttXX37QHtUNtg+JoBfcaE1cRc6V2PVMRuE7p08TedRj6MLRtN1jZ4HH/mrSEwFXzDkg== X-Received: by 2002:a05:6402:2420:b0:5dc:1294:2dda with SMTP id 4fb4d7f45d1cf-5dc6e450206mr4396439a12.0.1738409975665; Sat, 01 Feb 2025 03:39:35 -0800 (PST) Received: from laptok.lan (89-64-31-140.dynamic.chello.pl. [89.64.31.140]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723e9fa7sm4304577a12.20.2025.02.01.03.39.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 01 Feb 2025 03:39:35 -0800 (PST) From: =?utf-8?q?Tomasz_Paku=C5=82a?= To: jikos@kernel.org, bentiss@kernel.org Cc: anssi.hannula@gmail.com, oleg@makarenk.ooo, linux-input@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 22/22] HID: pidff: Factor out pool report fetch and remove excess declaration Date: Sat, 1 Feb 2025 12:39:06 +0100 Message-ID: <20250201113906.769162-23-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> References: <20250201113906.769162-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 We only want to refetch the pool report during device init. Reset function is now called when uploading effects to an empty device so extract pool fetch to separate function and call it from init before autocenter check (autocenter check triggered reset during init). Remove a superfluous pointer declaration and assigment as well. Signed-off-by: Tomasz Pakuła Reviewed-by: Michał Kopeć Reviewed-by: Paul Dino Jones Tested-by: Paul Dino Jones Tested-by: Cristóferson Bueno Tested-by: Pablo Cisneros --- drivers/hid/usbhid/hid-pidff.c | 45 ++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c index b21e844f5f3a..f23381b6e344 100644 --- a/drivers/hid/usbhid/hid-pidff.c +++ b/drivers/hid/usbhid/hid-pidff.c @@ -591,12 +591,9 @@ static void pidff_modify_actuators_state(struct pidff_device *pidff, bool enable /* * Reset the device, stop all effects, enable actuators - * Refetch pool report */ static void pidff_reset(struct pidff_device *pidff) { - int i = 0; - /* We reset twice as sometimes hid_wait_io isn't waiting long enough */ pidff_send_device_control(pidff, PID_RESET); pidff_send_device_control(pidff, PID_RESET); @@ -604,23 +601,29 @@ static void pidff_reset(struct pidff_device *pidff) pidff_send_device_control(pidff, PID_STOP_ALL_EFFECTS); pidff_modify_actuators_state(pidff, 1); +} - /* pool report is sometimes messed up, refetch it */ - hid_hw_request(pidff->hid, pidff->reports[PID_POOL], HID_REQ_GET_REPORT); - hid_hw_wait(pidff->hid); +/* + * Refetch pool report + */ +static void pidff_fetch_pool(struct pidff_device *pidff) +{ + if (!pidff->pool[PID_SIMULTANEOUS_MAX].value) + return; - if (pidff->pool[PID_SIMULTANEOUS_MAX].value) { - while (pidff->pool[PID_SIMULTANEOUS_MAX].value[0] < 2) { - if (i++ > 20) { - hid_warn(pidff->hid, - "device reports %d simultaneous effects\n", - pidff->pool[PID_SIMULTANEOUS_MAX].value[0]); - break; - } - hid_dbg(pidff->hid, "pid_pool requested again\n"); - hid_hw_request(pidff->hid, pidff->reports[PID_POOL], - HID_REQ_GET_REPORT); - hid_hw_wait(pidff->hid); + int i = 0; + while (pidff->pool[PID_SIMULTANEOUS_MAX].value[0] < 2) { + hid_dbg(pidff->hid, "pid_pool requested again\n"); + hid_hw_request(pidff->hid, pidff->reports[PID_POOL], + HID_REQ_GET_REPORT); + hid_hw_wait(pidff->hid); + + /* break after 20 tries with SIMULTANEOUS_MAX < 2 */ + if (i++ > 20) { + hid_warn(pidff->hid, + "device reports %d simultaneous effects\n", + pidff->pool[PID_SIMULTANEOUS_MAX].value[0]); + break; } } } @@ -916,9 +919,7 @@ static void pidff_autocenter(struct pidff_device *pidff, u16 magnitude) */ static void pidff_set_autocenter(struct input_dev *dev, u16 magnitude) { - struct pidff_device *pidff = dev->ff->private; - - pidff_autocenter(pidff, magnitude); + pidff_autocenter(dev->ff->private, magnitude); } /* @@ -1424,6 +1425,8 @@ int hid_pidff_init_with_quirks(struct hid_device *hid, u32 initial_quirks) if (error) goto fail; + /* pool report is sometimes messed up, refetch it */ + pidff_fetch_pool(pidff); pidff_set_gain_report(pidff, U16_MAX); error = pidff_check_autocenter(pidff, dev); if (error)