From nobody Thu Apr 16 12:31:04 2026 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (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 7FE78348445 for ; Fri, 27 Feb 2026 18:23:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772216606; cv=none; b=g/Ubs1AbKUJxEJxVxlN7elJCxlaq4DUX2aF3zb7gEPQkj/2f61jj9TSTozPU9FtVQnWwzpyU3o1n5qBJH5a9fzHp5tZvIqufsqipxQUzfMzIhdsDtvHO/U/0qIw7/nzsOnbNL8MQ1SHDpFLJHbCiPcqP97E6rIR3ax+j/pgxZJk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772216606; c=relaxed/simple; bh=lxCoA2uvMLy2TxnZo+jKDxVDjVgoo7OUvqvrpC4Rcls=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=oY55vf93wiD0ufdDZJO8ZtUdEfYGElA1OlXsx6If+MAXZT25KT3ZPx8ivusPEEcIkRdIcCa+b4uVoxNwFuCejq7ZLmDK1NimJPViPI1KASLJ2CpNHlNLuxYXVC12EZI4G0xQuzuqDnQn1vMy3jN5JYsFeJ3WqHwUu7PR9LKpJfg= 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=EqlYLwD6; arc=none smtp.client-ip=209.85.214.173 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="EqlYLwD6" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2ae239bd19eso7540625ad.3 for ; Fri, 27 Feb 2026 10:23:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772216605; x=1772821405; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=KWo54tPqkdRAAogk0aSIsm6ksATm/ufoE9BN+ZmicHI=; b=EqlYLwD6FbKmM/e7G4TZyFIJlpTAOem7ceL0HRA8vDYByX0ZMVIDGRgdKiAh/F4IH7 zojf3rbxW/3zbr7+Wfbnb/mC5qD+ER8kq68Fg2AZgTeyRoRaoMQjRsd3yXAg2Whmw3BI /3pfXLoaQy4MtNkE5ggeJG3dM0byksRigRtdVXLoQZAJSjF/jRs8F7e+wCNEQzMfIU5K jvlYjKNJeg1EyS8fd/KopG8tF5abzuxpuPuuLsIBtgf0dN9AcwWSeh0CKG6E/TVh6Zbd 3EGRAazA6drU2zQ2kYlsMPSfXL6uob1KKdI32At9tb6nqRYtrZ98wMuI94uaXoHK2+kp Z35g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772216605; x=1772821405; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=KWo54tPqkdRAAogk0aSIsm6ksATm/ufoE9BN+ZmicHI=; b=w8otc+PYVSGxA5A6mpR9GHUfxDYUbsmrM+O/ZUm7IlZOXJV1zu35xOD6MK4kBTTEU0 DVdj5yg5yUfYRf3xXI8qvW9izbnCiGrYM/EEksU39q0G07xJNVzUD9UrlAk3cnd/sO5q fpsM9JAB+ATCeOlZLGN1Yvfxjvkb+uR0CdS5XbVaP4d2gkWUnftvTovi6Dg+mMsqCfsQ qSiVJq39OA+r4knZXQJ2Nd+CK8+OYvQgFh3JF1U8/L1j35OQD4ERGgny3tKqox8N+FwT iGyNtX5ULCV9TG7UEEJ6gUC112VAtMgyyHroHT2AwJaKRrgA22Y4MqInmLaAQEK6KYxs fDBQ== X-Forwarded-Encrypted: i=1; AJvYcCVHQCkQiLk+v8uwQmitnKI8fU4KqjlcxIEshH+D2yf/iaktBl8PtYY6Axmj6rZI37h+LSr/suQrcbdU09w=@vger.kernel.org X-Gm-Message-State: AOJu0YwNJZT9heCcd3kDMYB4VAs+yLuRr8hKLHS2fadvVwrJmvve+fNc EWhBGYOPCu4W5zm6lfDRJp7IH2BkrVKckfhHm/Ei91kGInA5xVwBJqi6xmhus4h0 X-Gm-Gg: ATEYQzwd2dEYyDc3sYzXBiWH3H+kOrKvGo7myzfMSIrv+46QVqpOWQwXAyVZ+8RQfE2 r3nRh2tULTZ87WWFX+IuzjA4KeWP3hISb6qPh5x3XsY+cmLBCRfHxANHcpqgkHy9OpuZZOWux5M 1xKBcgrV7/hfTHuQCuKSEBs7EIM3KPKSHgAec/XJ346XiF0OFh/2gK2tnZXEcKiUURbw0Ru2+7N jJNLobwOxAO4PvJdWExVHITSUtL7idiAXmZ63Q3KOZ2ZD08xMqbet0N+yTL8O7pSECRJJHWXwsW zRVLbLi7NpwH9Z9qXjHPRga0weWTs2eJ5eRID8bseG5t4d4HSivJYHa+n6MTZtIKx3RkqI1AwxX /rAgtnDUvkn5gtSN9W9xX1Ic0kjPg89r5iaw/ps9oMHbjXZZd/NnQAZynIH2r6SkoGPTWjX5CBH x5V9vqeeOstwXqE674WBrTLFryLr2/MjrsZjhFugGbb/LB6Oe0n5/o3OroiBFzHmG2wUuPK78= X-Received: by 2002:a17:903:4b07:b0:2ad:ad0f:bbbe with SMTP id d9443c01a7336-2ae2e4b0a5dmr42459345ad.29.1772216604753; Fri, 27 Feb 2026 10:23:24 -0800 (PST) Received: from HRD-WDG8GDY3.roa.hexagonmetrology.com ([49.43.203.209]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2adfb5b03ffsm81774985ad.1.2026.02.27.10.23.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 27 Feb 2026 10:23:23 -0800 (PST) From: Venkata Swamy Kassa X-Google-Original-From: Venkata Swamy Kassa To: heikki.krogerus@linux.intel.com, gregkh@linuxfoundation.org Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Venkata Swamy Kassa Subject: [PATCH] usb: typec: hd3ss3220: Add sysfs attribute for USB role state Date: Fri, 27 Feb 2026 18:23:16 +0000 Message-ID: <20260227182316.761518-1-venkata.swamy.kassa@hexagon.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The HD3SS3220 driver correctly detects USB Type-C cable attach/detach events and propagates the role to the USB controller. However, there is no way for userspace to query the current role state (device/host/none). This becomes problematic when using udev rules to trigger scripts on role changes. The driver generates kobject change events, but the event itself doesn't contain the role information. Userspace needs to read the current state to determine the appropriate action. Add a 'usb_role' sysfs attribute that exposes the current USB role as a string ("device", "host", or "none"). Also ensure sysfs_notify() and kobject_uevent() are called when the role changes, enabling userspace applications to poll() on the sysfs file or receive udev events. This is useful for systems that need to: - Start/stop USB gadget functions based on cable connection - Switch between host and device modes dynamically - Monitor USB Type-C port state from userspace Signed-off-by: Venkata Swamy Kassa --- drivers/usb/typec/hd3ss3220.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/drivers/usb/typec/hd3ss3220.c b/drivers/usb/typec/hd3ss3220.c index 14a25e4cb034..92c118609e20 100644 --- a/drivers/usb/typec/hd3ss3220.c +++ b/drivers/usb/typec/hd3ss3220.c @@ -56,6 +56,28 @@ struct hd3ss3220 { bool poll; }; =20 +/* + * Sysfs attribute to show current USB role (device/host/none) + */ +static ssize_t usb_role_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct hd3ss3220 *hd3ss3220 =3D dev_get_drvdata(dev); + const char *role_str =3D usb_role_string(hd3ss3220->role_state); + + return sysfs_emit(buf, "%s\n", role_str); +} +static DEVICE_ATTR_RO(usb_role); + +static struct attribute *hd3ss3220_attrs[] =3D { + &dev_attr_usb_role.attr, + NULL +}; + +static const struct attribute_group hd3ss3220_attr_group =3D { + .attrs =3D hd3ss3220_attrs, +}; + static int hd3ss3220_set_power_opmode(struct hd3ss3220 *hd3ss3220, enum ty= pec_pwr_opmode power_opmode) { int current_mode; @@ -172,6 +194,10 @@ static void hd3ss3220_set_role(struct hd3ss3220 *hd3ss= 3220) } =20 hd3ss3220->role_state =3D role_state; + + /* Notify userspace of usb_role change */ + sysfs_notify(&hd3ss3220->dev->kobj, NULL, "usb_role"); + kobject_uevent(&hd3ss3220->dev->kobj, KOBJ_CHANGE); } =20 static void output_poll_execute(struct work_struct *work) @@ -310,6 +336,12 @@ static int hd3ss3220_probe(struct i2c_client *client) if (ret < 0) goto err_unreg_port; =20 + ret =3D devm_device_add_group(&client->dev, &hd3ss3220_attr_group); + if (ret) { + dev_err(&client->dev, "Failed to create sysfs attributes: %d\n", ret); + goto err_unreg_port; + } + hd3ss3220_set_role(hd3ss3220); ret =3D regmap_read(hd3ss3220->regmap, HD3SS3220_REG_CN_STAT_CTRL, &data); if (ret < 0) --=20 2.34.1