From nobody Sat Apr 4 03:33:13 2026 Received: from mail-dy1-f181.google.com (mail-dy1-f181.google.com [74.125.82.181]) (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 405F22741C9 for ; Sun, 22 Mar 2026 03:16:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774149384; cv=none; b=f8dYNDtGWTQyZJnX8km0EtYPCf6m2IyQV6qG9fWlbn06m+gCGgv/yD9powFdrDj9yk9fKy5OxoKvBvoMd7Gi/QNgLSSFDqcsDmUmauGxs7eNQlY2jUHJvR2G/yml6p2oL+6IGudAjsX/D6Q8iLrXCXNw+S2Zenc3VG8UNFxSRz4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774149384; c=relaxed/simple; bh=PAz+jORhNkt0zBVszAhrT9bv/0URLsybiRVH5ZrKrkk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cIaNWrfJJxXgwKfO5wx4oh+0EQFyQ3OD442GwLLRnmWQ7KRhKd+IyquD26rzMxPFN/98TOnu9dWMkFmNoWeXXXesFH6EBzUCG/NrQcuCZ56CrwSkt/xj6nD8kCG2U+NOEFuSYN3HUZqykCDoB39qxIKhOpjpszRVq+5sd7YCgME= 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=IvNt8u9C; arc=none smtp.client-ip=74.125.82.181 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="IvNt8u9C" Received: by mail-dy1-f181.google.com with SMTP id 5a478bee46e88-2c0ecaae7dfso5344172eec.1 for ; Sat, 21 Mar 2026 20:16:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1774149380; x=1774754180; 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=2b6kol1RuqZ0ewRBN2du10oKoyZWNZPlgpHx1CYYLuk=; b=IvNt8u9CPp4zI3Ha09F5n4PcyPJzYe0SyHs0Mi4+uBrkwO9RdX9YDDlEtVA3m5jFiy ZXRrLYhQg2U6uGn8EqIcMPL3rOvEikWftuOsGcjzdrltJS7zdPoDyirJq4LPtr0ldjKM bVA7G63jOdEBqTU/81Pq5ASKk2ECuX2tKapQZ9mBapYvzt66SmIuG1FB8o26LrhUBz1S qRlDzR4iUxkycRFA+Wk4FJRDowU9tjXCBZrAjG0ImEVr5V70kowWnlPk6vNYPr14qH41 z7Ba4TAAIARqULXX2S+bo1iAdyMofC8PN+CKWNYj8ARhI2fZga8AI+aJSnJNCfOwrgsL ur0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774149380; x=1774754180; 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=2b6kol1RuqZ0ewRBN2du10oKoyZWNZPlgpHx1CYYLuk=; b=SebpO1ubHwBNIpP01HBBE3r5v+y41+w3vohF8HplF40DIPRf3rTApoYHzVRaBuqAtU MSQw+SMtU9aspuAXIsVQ533Jt9n9nB6QKbG9od6YHElfuiHMcZ/k3my5UJi01aDg0OSO k4qq4eceqA9C4+E1hfLh2xriMkYpG5RQI3zBiqhGlDCuJUdGC3aronX5/n0m+2lDA1vB u/LLpuNlNhlZhsPF0ZhgRO8JJVmLR9iMCm73J9ozlf3TQXzJkrT2Ha5f+DIXRjwFjmoc HCWOVrqbECVeM6Zw7HUMR+0K7cVczsRn0+ZjGNYAbxCeTC/CbI7ZDiijVmNluCB3vSrn vrBQ== X-Forwarded-Encrypted: i=1; AJvYcCWqWRwd+/0DwyqnDkCRpskcy0YJ91sB+Yt1Y3JSm4hSL5NKAoREl8TcVz7OoPu7PsDyuMxNscYiwCrMtfo=@vger.kernel.org X-Gm-Message-State: AOJu0YyBSm5WssTkmfPCLEoMND0MHUyZZIdGG0rZxF/iTfdTZEKWFHBZ PuYwtNYj6yUz1ehWHVP60erfL5CKAxBhs4wkIU+KNhyMPMa11OvycOe9 X-Gm-Gg: ATEYQzxUa24E4gSVevmYXYN3NhIz41jFT/p76Hsjqvw3OhO+zv0Qh+VQPTbOT222a2O GEFPFLcSBDYZV/dfG4xaKMFodohfTg/UwSMpbMlFfbBS7XgrNx+A6ggQQJNHvpAxjkg/2ZaYxHw cSOBvv5YvlIR8xEgtwb+SJiubGipGIHWrqpnyFLmUXmLOBXOZeD73PwTnzPsmQBtTHK9KIdM5G5 Sqx0atib39eX3D4ptmZrrnYe+hLCrHWjGoOXeCyo9EH4QihmulVWqDIBO76uGRQlUNmknRj/dRJ kav7u9KMYn0XyEHj6pNeH43JRXHR8yKZ84puGCZ6EADR3ZI+hOgyS8ZuL2+lV0b0RybGuuhyCqJ u83JjkxdBsR4PWLTAPEBJv9CMXwzXQ04So7QbPUX37lWOXY7vhMPl+tZPS5TD6Iuya7nofNPv1l lY4YTvj4ud675yzTOHKsl8+jPL5GRSYwF2izOM86FS4jGJJjvP3oWiqq5ALeQWzAvPDpzbuERTP MOY X-Received: by 2002:a05:7301:2f86:b0:2c0:ae1b:4568 with SMTP id 5a478bee46e88-2c1095684fdmr3703901eec.7.1774149380263; Sat, 21 Mar 2026 20:16:20 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2c10b31bef1sm11220460eec.26.2026.03.21.20.16.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 21 Mar 2026 20:16:20 -0700 (PDT) From: "Derek J. Clark" To: Jiri Kosina , Benjamin Tissoires Cc: "Pierre-Loup A . Griffais" , Lambert Fan , "Derek J . Clark" , linux-input@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/4] HID: hid-oxp: Add Second Generation Takeover Mode Date: Sun, 22 Mar 2026 03:16:14 +0000 Message-ID: <20260322031615.1524307-4-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260322031615.1524307-1-derekjohn.clark@gmail.com> References: <20260322031615.1524307-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: quoted-printable Content-Type: text/plain; charset="utf-8" Adds "takeover_enabled" attribute to second generation OneXPlayer configuration HID devices. This attribute initiates a mode shift in the device MCU that puts it into a state where all events are routed to an hidraw interface instead of the xpad evdev interface. This allows for debugging the hardware input mapping, and allows some userspace tools to consume the interface to add support for features that are unable to be exposed through the evdev, such as treating the M1 and M2 accessory buttons as unique inputs. Signed-off-by: Derek J. Clark --- drivers/hid/hid-oxp.c | 81 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/drivers/hid/hid-oxp.c b/drivers/hid/hid-oxp.c index 587e0d57c85f..5fed2799a2ad 100644 --- a/drivers/hid/hid-oxp.c +++ b/drivers/hid/hid-oxp.c @@ -32,6 +32,7 @@ enum oxp_function_index { OXP_FID_GEN1_RGB_SET =3D 0x07, OXP_FID_GEN1_RGB_REPLY =3D 0x0f, + OXP_FID_GEN2_TOGGLE_MODE =3D 0xb2, OXP_FID_GEN2_RGB_EVENT =3D 0xb8, }; =20 @@ -39,12 +40,15 @@ static struct oxp_hid_cfg { struct led_classdev_mc *led_mc; struct hid_device *hdev; struct mutex cfg_mutex; /*ensure single synchronous output report*/ + u8 takeover_enabled; u8 rgb_brightness; u8 rgb_effect; u8 rgb_speed; u8 rgb_en; } drvdata; =20 +#define OXP_TAKEOVER_ENABLED_TRUE 0x03 + enum oxp_feature_en_index { OXP_FEAT_DISABLED, OXP_FEAT_ENABLED, @@ -289,6 +293,74 @@ static int oxp_gen_2_property_out(enum oxp_function_in= dex fid, u8 *data, footer_size); } =20 +static ssize_t button_takeover_store(struct device *dev, + struct device_attribute *attr, const char *buf, + size_t count) +{ + u16 up =3D get_usage_page(drvdata.hdev); + u8 data[3] =3D { 0x00, 0x01, 0x02 }; + u8 val =3D 0; + int ret; + + if (up !=3D GEN2_USAGE_PAGE) + return -EINVAL; + + ret =3D sysfs_match_string(oxp_feature_en_text, buf); + if (ret < 0) + return ret; + val =3D ret; + + switch (val) { + case OXP_FEAT_DISABLED: + break; + case OXP_FEAT_ENABLED: + data[0] =3D OXP_TAKEOVER_ENABLED_TRUE; + break; + default: + return -EINVAL; + } + + ret =3D oxp_gen_2_property_out(OXP_FID_GEN2_TOGGLE_MODE, data, 3); + if (ret) + return ret; + + return count; +} + +static ssize_t button_takeover_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return sysfs_emit(buf, "%s\n", oxp_feature_en_text[drvdata.takeover_enabl= ed]); +} +static DEVICE_ATTR_RW(button_takeover); + +static ssize_t button_takeover_index_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + ssize_t count =3D 0; + unsigned int i; + + for (i =3D 0; i < ARRAY_SIZE(oxp_feature_en_text); i++) + count +=3D sysfs_emit_at(buf, count, "%s ", oxp_feature_en_text[i]); + + if (count) + buf[count - 1] =3D '\n'; + + return count; +} +static DEVICE_ATTR_RO(button_takeover_index); + +static struct attribute *oxp_cfg_attrs[] =3D { + &dev_attr_button_takeover.attr, + &dev_attr_button_takeover_index.attr, + NULL, +}; + +static const struct attribute_group oxp_cfg_attrs_group =3D { + .attrs =3D oxp_cfg_attrs, +}; + static int oxp_rgb_status_store(u8 enabled, u8 speed, u8 brightness) { u16 up =3D get_usage_page(drvdata.hdev); @@ -680,6 +752,15 @@ static int oxp_cfg_probe(struct hid_device *hdev, u16 = up) dev_warn(drvdata.led_mc->led_cdev.dev, "Failed to query RGB initial state: %i\n", ret); =20 + /* Below features are only implemented in gen 2 */ + if (up !=3D GEN2_USAGE_PAGE) + return 0; + + ret =3D devm_device_add_group(&hdev->dev, &oxp_cfg_attrs_group); + if (ret) + return dev_err_probe(&hdev->dev, ret, + "Failed to attach configuration attributes\n"); + return 0; } =20 --=20 2.53.0