From nobody Thu Apr 16 12:28:05 2026 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.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 3B95B377546 for ; Fri, 27 Feb 2026 18:25:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772216704; cv=none; b=mmaTgIjIrcI4pg+wzDHe/Yf9WOF4tsdAg0kt8JmENh7tJafFUnyZfsLcxsKfSKli0Q6yopJhdqiKMOQHklrSX+VpIrvlGc8LZ2vEWC+BW0v6EXjGFzMiDJS9o2T7DjPfzOOzOSCq3jWtqD8U7NAofqgQJQWTOx8nHb/J4IpSRAY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772216704; c=relaxed/simple; bh=lxCoA2uvMLy2TxnZo+jKDxVDjVgoo7OUvqvrpC4Rcls=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=vEuaTfB2H76heVR08Z+HXeMSx20OCYHYoOJyzx/vLbetLYrm+f0dpvDLECsA6GKC0UcQoMRVqiaheAdlXBubEP95n6peY2L8hochbBWtqWL8sxmVLX3ZkgVR4g6g3r9ldH6XUVH8DTnk7dl5yqfha/dDY6k0sGptlArW1wu1JXk= 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=iycdcgnA; arc=none smtp.client-ip=209.85.214.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="iycdcgnA" Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-2aae4816912so15982325ad.2 for ; Fri, 27 Feb 2026 10:25:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772216702; x=1772821502; 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=iycdcgnAacKGMz1He3tf4L9FKZthxVnymZk/EgfIQeq1kNw0SzpMwzncsIWiVrW9Ld sNpy65P+9mIaZAju9iL/SJVWvnEyuBSTc7LmqFTiyX6sT0yzSkm0MkqGZJx09EXFxlk2 rpT8pY1ARsK94u2oZ+rBkUmeI4MK2K4461WWUpGnlaBL8Uda+bpsSk4rWLZ1Ky9D8rFy YKrQ8uqfKA4Zp+1bXFUTZeIMApHJNXvz5ZpFRHFGqKyRpx0tx+s+XUqFaG/zuXLQMJYF nlevDhEfFmpcUIXXWqdT5Jh4UjsCjtvYVlQTlk1eU9Jb6Gh0C4QTiMBf3lWVcybBg9vx IBcg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772216702; x=1772821502; 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=kvz4lwGWwyfG+YxHSM8ZoJsILuv1fAcF7WFjIHtzr+nQBt6ZZnBTbyA3Y7fscw9ZBq iKLAgNCQOUed9dP40dnniZvZ9i144i02d3yGugkDPvDiCMFltQjocN+raV8p6WALQuVO LPvYxvs7aaTir9+uYuVJGsZF8oPDSRFQrW6FhmbyDL03g7EdZivh87vzybl8swVgTXQy DkhQEb5lMsohsqrqdDRWD/xe/VxEKR/+zbQagCWb2JQlmJk65l5FXzYA05wIR1eVj8vm E3uFMswe97Zrt+vCTuYZd5eJS7eeCJH4A0BpXT0sSQDm7v/O1z6s1SgFSUintOoUjTwW EcSg== X-Forwarded-Encrypted: i=1; AJvYcCUfObmuyEAPxUJv7oqI63LQ3AOIzC/BOtBBWfYuBgTwDqLp4d0w+JrIk64LfxBrUg3KbBeKbkOLHbjSQf0=@vger.kernel.org X-Gm-Message-State: AOJu0YxEZT2qEYMeg/jnIkf6AQf7OZkzu/DqcAXO3ycytyWlDF1ALc6/ a33D/dnGcUSwfpmfF+EB3HKc5YudeqTr222lRVej6P6CUFLDCj3vWrOK X-Gm-Gg: ATEYQzxtzKgDwc2fk+FVXOm8rWoVmnBD0Aby6o29dymuyDeRInDj1R2HN7nlDJfCLxq W5ltnsJOsYaxP4hbIgmDBJ9ZvElmzgrlKCtuPcenOYYzbcn5jCC0SYoqtJxEsdHNsUh9JhgsXv2 8KLmHWh66d/SfTo3M7asIALYWFm6IzTj5SMy5N9DywUgfgTMC9+xHAWfgMqNAGoAq1oBecuCGV5 2DSjvg00+xKgNlz4JqcbrwJfSZL9TXBKBtnZD8eXa0Yg11d821LOuWkfEpNIG60GvAyuY1wtoQF +kXpKoe07/luiTHiAnfSxKMuUypwvuyBFR21BLfFELRjz/oTBRa1LqXN/7e8iqabcIkaxEo2mQH UNk9+eTzxo59PGpZCpmNwBMF6riGsEbn8rmsdbp9GFGn0P1p74gFPEQApR5LtUqOtCdusFYrHTT RKNknQRrM5qP6lhDjRc4Nq79aSA7IYuMcUPTjXHRCZCOhK+stpe4/sAtDUzs0LsTiF537hFSA0V acJTKJ1Pg== X-Received: by 2002:a17:903:196b:b0:2ae:38d3:a6f1 with SMTP id d9443c01a7336-2ae38d3a70emr5176005ad.45.1772216701513; Fri, 27 Feb 2026 10:25:01 -0800 (PST) Received: from HRD-WDG8GDY3.roa.hexagonmetrology.com ([49.43.203.209]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35912fe1040sm3541975a91.4.2026.02.27.10.24.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 27 Feb 2026 10:25:01 -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:24:54 +0000 Message-ID: <20260227182454.761925-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