From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) (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 D3CDE242D89 for ; Wed, 27 May 2026 22:21:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.179 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779920499; cv=none; b=E3wwpnV358lRMTYBamHZ+uAtuWsRKvnd61bLH8N8Nnb3r5IAuy8DNmtnPi6XPzExnUzHq3FDs2teLzC+WlCEvGm5Cexjl7JrEgWIGmdmr/B0FpBwiVK1WfSWQmfgr4W7B/NmEOePpkwRafTMXvaKOFb8agfB2iKlSa91jxaPbrw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779920499; c=relaxed/simple; bh=2fk6fhOD8x0q1aTeVxYSSNIwdBVsfgLnJrKq0BISk/o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=F+XCI+ZC7bq+QDtK7ZbBGh95OLP332m7ac+/OfTgQtZkM0UyLOUoyGVzQc5csQsiqh4i2EPLQtiNHf/4XB5kFCUOYcElUEM2S9f4TOyZDV8GK0CA1+Edbbt+owVpyEUivMrzsY9TPcLtuuqqs1Q/fphFgJ3gKdG4D9YsoK+P/3o= 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=kYqXbpm1; arc=none smtp.client-ip=209.85.214.179 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="kYqXbpm1" Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-2ba4a1a0325so82798215ad.0 for ; Wed, 27 May 2026 15:21:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779920497; x=1780525297; 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=siYXoV5iUWIO3iQmwXOwY7S//bY4ZAgbalu7pJCn+ww=; b=kYqXbpm10faSerYDpk4SstV7pAaWpDuECmny0R8ae3IOOXFG1dYGGYCUeUi9ETg8r3 QY2GjYoURfiR/FP30uGoiIpalSXS1DOlu2LPeG6YOVQ5Tu6hoclSzBcvTFKsIC5Oe8GA 0wynN3pc+iV0Y1BAeuPJbrRlhIktOhMeWmu41W0IYJs+5VjrMbbDOcmoRIWtWjiuEOwG iew0uQ8iK3H/Wkxpf5heOi1JJRTUy4GSypsLY8jAQKAK6CT3uJtJihnV3QsYW2xWJgIF r/gd5pAJs+dZyM3BwAfvWis7wVeTLS10x2l0q9WeHkBKRUihj+SIFbaWdchG/A5ItJMh d7wg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779920497; x=1780525297; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=siYXoV5iUWIO3iQmwXOwY7S//bY4ZAgbalu7pJCn+ww=; b=ketCxAeMGUOzl0degxZl+mjHal0QYWSK1O800eGPsD9xk/D3evaksvQUEsxlbDZdev 198yx2/nlKEUVCbPXn8xmm8TwVnQZkna/SUjsoBb4MHvCw7hOBO9u1xF8iLl0Gmf2q5A k0/K8bI7CdxrcfEUjvOAD4It6s9gO379t8QOUkLGzdJndikznpKjMsNyeYufBchXbqQT 5aKe0BrClELNLIxhdQTi41NB4hNwKeazmvfLcAFpehJ2YmVtH3dMV7IvbZ4kD+OlUSu4 4rUgVtxJGOnrX6KGnF3t3ExmTshHfbS6RqMYXk0eNlmz5O+tMJ98WTkGCOx1RAJaBe2b 4ZpQ== X-Forwarded-Encrypted: i=1; AFNElJ+Ov0Im8q33VD/7OuKOi6CwFYVzrSFWAIKQTFlPyS+IIslg9Og/hPy8CTJ3jr80ywReTmBh1SkBEB0z3IU=@vger.kernel.org X-Gm-Message-State: AOJu0Yy+BAuml+39lihjRUP5hXGX97mcj1xU9hkO6nn7U6VJqUApdz7s li9r9mrwgxuKKZ1rTHYj2+PWkY8VaqpXr0aZYFdDjKpEvo8YfNoO3mvW X-Gm-Gg: Acq92OHPXGKmqHMh7/KiTRU7W/vuOl43A14NLchMC/bAvRaEXJiOOLidwhwjCnNhjtN 0Hs7xY8IcS9dA3tgmREiDk28aMj7pwlsKl/fJZ4XVivVMG0zzipvKR/In2LsLnquV1bYK0HqOw2 LlghyYquQ70i5MFSS3u6roHfcgtE+3xgGxUydENsOfJsWpM9Q/MjgBG0/bygQ9pusijV3k+X1dX M2QqNbIErzJ3Uzug+ozHEcrdujyX63BnuwBY8Pc4mr48EmtWLLmJZbeZJhH7xKKMOrtTnmuelg2 T5k5eSU/XtfLq5Q0Wof4jC3EseWibUDx57g+0qbcN8osyqEAtf/Vnb4D+Es0gfzTusrpbaUXRQw C2amPaRFulO8jLUQACXXRGIoh5UysgDGL2kfRbFGJ1ETqlc0lIeopuPaWxyVH20wdLhGDYytiDg ef/Bvh/WAlTvi9Owo6aep+wbc3tQkUlAyjoVciZUMQjzOg0J70N9Lr8ro= X-Received: by 2002:a17:902:ebd2:b0:2bc:b141:8551 with SMTP id d9443c01a7336-2beb06f81f3mr277899805ad.19.1779920496943; Wed, 27 May 2026 15:21:36 -0700 (PDT) Received: from lappy ([203.105.74.20]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2beb58fd888sm167783445ad.73.2026.05.27.15.21.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 May 2026 15:21:36 -0700 (PDT) From: "Derek J. Clark" To: Jiri Kosina , Benjamin Tissoires Cc: "Pierre-Loup A . Griffais" , Denis Benato , Zhouwang Huang , "Derek J . Clark" , linux-input@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v10 4/4] HID: hid-msi: Add Rumble Intensity Attributes Date: Wed, 27 May 2026 22:21:22 +0000 Message-ID: <20260527222122.10620-5-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260527222122.10620-1-derekjohn.clark@gmail.com> References: <20260527222122.10620-1-derekjohn.clark@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Adds intensity adjustment for the left and right rumble motors. Claude was used during the reverse-engineering data gathering for this feature done by Zhouwang Huang. As the code had already been affected, I used Claude to create the initial framing for the feature, then did manual cleanup of the _show and _store functions afterwards to fix bugs and keep the coding style consistent. Claude was also used as an initial reviewer of this patch. Assisted-by: Claude:claude-sonnet-4-6 Co-developed-by: Zhouwang Huang Signed-off-by: Zhouwang Huang Signed-off-by: Derek J. Clark --- v7: - Match on write address for rumble reports to prevent late ACK from causing synchronization errors. - Use spinlock for read/write profile_pending. - Use smp_[store_release|load_acquire] pattern for checking gamepad_registered to avoid possible races during teardown. - Use struct for rumble reports. v6: - Make all timeouts 25ms to ensure at least 2 jiffies in a 100Hz config. - Add spinlock_irqsave for read/write access on rumble_intensity variables. - Gate all attribute show/store functions with gamepad_registered. v5: - Remove mkey related changes. v2: - Use pending_profile and sync to rom mutexes. --- drivers/hid/hid-msi.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/hid/hid-msi.c b/drivers/hid/hid-msi.c index 96710d80543d4..17b0707ecd46d 100644 --- a/drivers/hid/hid-msi.c +++ b/drivers/hid/hid-msi.c @@ -266,6 +266,11 @@ static const u16 button_mapping_addr_new[] = { static const u16 rgb_addr_old = 0x01fa; static const u16 rgb_addr_new = 0x024a; +static const u16 rumble_addr[] = { + 0x0022, /* left */ + 0x0023, /* right */ +}; + struct claw_command_report { u8 report_id; u8 padding[2]; @@ -308,6 +313,12 @@ struct claw_rgb_report { struct rgb_frame zone_data; } __packed; +struct claw_rumble_report { + struct claw_profile_report; + u8 padding; + u8 intensity; +} __packed; + struct claw_drvdata { /* MCU General Variables */ enum claw_profile_ack_pending profile_pending; @@ -332,8 +343,12 @@ struct claw_drvdata { enum claw_gamepad_mode_index gamepad_mode; u8 m1_codes[CLAW_KEYS_MAX]; u8 m2_codes[CLAW_KEYS_MAX]; - spinlock_t mode_lock; /* Lock for mode data read/write */ + u8 rumble_intensity_right; + u8 rumble_intensity_left; const u16 *bmap_addr; + spinlock_t rumble_lock; /* lock for rumble_intensity read/write */ + spinlock_t mode_lock; /* Lock for mode data read/write */ + bool rumble_support; bool gp_registered; bool bmap_support; -- 2.53.0