From nobody Fri Jul 24 21:53:11 2026 Received: from mail-pj1-f54.google.com (mail-pj1-f54.google.com [209.85.216.54]) (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 E973D3D7D70 for ; Fri, 24 Jul 2026 08:44:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882650; cv=none; b=Xszg6UvzStgHKqOBvXS3d+RQnYfd2ouDXKBYSrkxCXNxn/1e+zDYj/yvMQZi8XrtXrgxpEpkpCogiolV4F9FSCjYgz370J1EHe7zNAf/YjnG3a4u4dFVWDb7TmKUr3U99pqP2D9cBk11leuGGseBFAYOhbjL3MaxvJIzA4oAxEc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882650; c=relaxed/simple; bh=rN8bGYfPxlquy6cQeK5GYz3ym6oKo/FOx8yU0FBCzV8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HxtESSO/fzVVOeAAhOlz5DwDuDLiQ8Qpmy5apD/Iy7dxwNf11g0tlXHEIMA7hYRuQRGqvLEuZUIY5+JCoRzIjuSv79w5jebCJjCmJh0RS96EgZq2BR/Coa76LkuX88Dhxs8oV783fSZ171N+z5W+hxErQHbytT7GTdFhJ76XZZE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=hXHF/C1i; arc=none smtp.client-ip=209.85.216.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="hXHF/C1i" Received: by mail-pj1-f54.google.com with SMTP id 98e67ed59e1d1-385ea3ce80dso152612a91.2 for ; Fri, 24 Jul 2026 01:44:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784882648; x=1785487448; 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:content-type; bh=yZPli2S6cZzTtPxNu5kCcB+M+KQUeHMnkMABY4ADLcw=; b=hXHF/C1iFP+DzsSdCDcke6XtH45FLhGqmJxDPybdM0yRDfbEOsigMesemAKruvD4Y8 NbDh11LPukF6dWMm7h1fXmBA0NG/a1omudCKRimwAt1eEDIbJOsSpEpmA3rT6daaP64i UjNN8IydQz2sdOKPDz7dzSTe9VAUG76EmTXk0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784882648; x=1785487448; 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:content-type; bh=yZPli2S6cZzTtPxNu5kCcB+M+KQUeHMnkMABY4ADLcw=; b=skZPskNSBv1vzzDYVKAZbx5I9Li2xuHY3HG8RyUbjWAmc+jM1DrA9FdQHkfnJueo6D B/p37NeGuXhgLQ/1vzq7JwdPUt4IiKPG9Y1dp/X3Gh9SKlBQbuGbqPl5kRoKST1OnlXv 29ZDMZPTyl+AKqryGi0k0WYK8/Zs/9yIZgC0qYvB0ZZ3kBhJe3cS1xIVblTOEqI9beDb g403ZM1iZZnIu6k0zHk6mepUKFJuf7q/U8NHXvc8usdbkUiazh8GO0pEkwmTyH8Fz1Du Ry04yjvC8I0Q8cwHIuLAbVQSvCpyINqQxTfdIV2P9hxpb5IZoAG0tuTpfH4zA6msVTGv ZzEg== X-Forwarded-Encrypted: i=1; AHgh+Ro94FlwYOG5jB4Z3VGKU7hMHOJetXVtIv9EIlIyCL0gAC1ZjxP/fMO9k7oHlrZybKh48+GYToaYHy4EABA=@vger.kernel.org X-Gm-Message-State: AOJu0YwFVfkJCJMYP7ifzk8YsdPdHtXH6LsxopMSv5t9R5gYvNcsDsUn rlF7rwTmdYGWDeXJhJzEQ5amHBWbbXm5UflvIV00AY40XLRSUF/CsqwtO9wIedke2w== X-Gm-Gg: AR+sD10yZ5A5PTcMEJFgXIHteelKe67dnqUZIhcsipOl9dK03E2OZXC6JXXuuPkkbN8 y+UoBhJtDiImc4wFWHufvse3cAujtN4PjRXqnuJmfYMEksB6vPRIenAXsU8A+Fq9Bnwq6bfS4Pe G0qiUVjX4zhMUyvBKXw38K1MRI6kSUeUtCCYKnfVu4eboc7ZZT/f4L4Rsi+dPO/lY9HMjAoFg5g 9KW9G6MvHb7A9hcEmxXz3Dk0qIFykrBawpEncsyZnbggzHOG/pFaW5j9rmqw3WEb+0H/x1p1vcF xBPEMZVrjUiJzzEvh/lz5hjoDMgs5jlYTkVyLakmriES6pwHxzksTKF+CWjWUSBJXYhb75VH0qV hGE0tGT1m2K1StF8c8fLQfHLHVVDXih81bTAn797FbIvhbYF8WnWLo54Z/PTAElXF1rdYwGeEQW KaneFd/c/PSjYEUNxKBKeY1bu60Mk4UMTaR83P4kWSxY0nbjgNuTSxN6dnmMY= X-Received: by 2002:a17:90b:2750:b0:381:5ab5:b667 with SMTP id 98e67ed59e1d1-38ec6637d1amr6238598a91.31.1784882648264; Fri, 24 Jul 2026 01:44:08 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:f131:86cc:5858:7325]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38f089ac6d8sm434546a91.2.2026.07.24.01.44.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 01:44:07 -0700 (PDT) From: Chen-Yu Tsai To: Bartosz Golaszewski , Greg Kroah-Hartman , Andy Shevchenko , Daniel Scally , Heikki Krogerus , Sakari Ailus , "Rafael J. Wysocki" , Danilo Krummrich , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno Cc: Wei Deng , Chen-Yu Tsai , linux-acpi@vger.kernel.org, driver-core@lists.linux.dev, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam , Alan Stern , Bartosz Golaszewski Subject: [PATCH v7 01/16] device property: Add fwnode_graph_get_port_by_id() Date: Fri, 24 Jul 2026 16:43:10 +0800 Message-ID: <20260724084328.3943997-2-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog In-Reply-To: <20260724084328.3943997-1-wenst@chromium.org> References: <20260724084328.3943997-1-wenst@chromium.org> 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" In some cases the driver needs a reference to the port firmware node. Once such case is the upcoming USB power sequencing integration. The USB hub port is tied to the corresponding port firmware node if it exists. Provide a helper for this. Reviewed-by: Bartosz Golaszewski Reviewed-by: Andy Shevchenko Signed-off-by: Chen-Yu Tsai --- Changes since v5: - Dropped left-over declaration in header (Sashiko) Changes since v4: - Added flags parameter so users can specify whether incomplete ports are returned or not (Sashiko) Changes since v2: - Moved "Return:" kernel-doc section to the end. (Andy) Changes since v1: - New patch --- drivers/base/property.c | 29 +++++++++++++++++++++++++++++ include/linux/property.h | 2 ++ 2 files changed, 31 insertions(+) diff --git a/drivers/base/property.c b/drivers/base/property.c index 9387bb83eb54..950defc0c55a 100644 --- a/drivers/base/property.c +++ b/drivers/base/property.c @@ -1346,6 +1346,35 @@ int fwnode_graph_parse_endpoint(const struct fwnode_= handle *fwnode, } EXPORT_SYMBOL(fwnode_graph_parse_endpoint); =20 +/** + * fwnode_graph_get_port_by_id - get the port matching a given id + * @fwnode: parent fwnode_handle containing the graph + * @id: id of the port + * @flags: fwnode lookup flags + * + * The caller is responsible for calling fwnode_handle_put() on the return= ed + * fwnode pointer. + * + * Does not return ports that belong to disabled devices or endpoints that + * are unconnected, unless FWNODE_GRAPH_DEVICE_DISABLED is passed in @flag= s. + * + * Return: A 'port' firmware node pointer with refcount incremented. + */ +struct fwnode_handle *fwnode_graph_get_port_by_id(struct fwnode_handle *fw= node, + u32 id, + unsigned long flags) +{ + struct fwnode_handle *ep; + + ep =3D fwnode_graph_get_endpoint_by_id(fwnode, id, 0, + flags | FWNODE_GRAPH_ENDPOINT_NEXT); + if (!ep) + return NULL; + + return fwnode_get_next_parent(ep); +} +EXPORT_SYMBOL_GPL(fwnode_graph_get_port_by_id); + const void *device_get_match_data(const struct device *dev) { return fwnode_call_ptr_op(dev_fwnode(dev), device_get_match_data, dev); diff --git a/include/linux/property.h b/include/linux/property.h index 14c304db4664..01ea010cb2f9 100644 --- a/include/linux/property.h +++ b/include/linux/property.h @@ -505,6 +505,8 @@ int fwnode_get_phy_mode(const struct fwnode_handle *fwn= ode); =20 void __iomem *fwnode_iomap(struct fwnode_handle *fwnode, int index); =20 +struct fwnode_handle *fwnode_graph_get_port_by_id(struct fwnode_handle *fw= node, u32 id, + unsigned long flags); struct fwnode_handle *fwnode_graph_get_next_endpoint( const struct fwnode_handle *fwnode, struct fwnode_handle *prev); struct fwnode_handle * --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:53:11 2026 Received: from mail-pj1-f52.google.com (mail-pj1-f52.google.com [209.85.216.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 4DCF73DAAAC for ; Fri, 24 Jul 2026 08:44:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882656; cv=none; b=aJnXhspF/n0vr3dOzLNz/l9guSofO12HhsSu3S3jLAnwnKGK5qC49uje03S+IisQknB3d/xg2n83G++yX6X3+kQaimrrdWApvlaqx+XrRfKEbXUXz10sa40AG4ZnfyuDxH3ofynNpgT9PPCnEG1Sy9DGl3PCR/apBAY7Pv+4WnA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882656; c=relaxed/simple; bh=K/CXr8sGOQIlsbuegDLGNruY8OXemH3+DJMD2gXrC6w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Mkn9NtPT4BBL83rRAbIbUau8yLBQCwYjrPFCjo1N0MzduTeZAE22PW7UsJoNYv7IzTfASep2AUxMZigLk7oSK3I7+KQWNNosztSgPLNJJvJexlbV9GQ6YvZFZAu2XC4aarAKn8beodQhbFnJ1dcXsq+/QjBC8Ng7XS4/M4wEoXQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=Xic4eBlT; arc=none smtp.client-ip=209.85.216.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="Xic4eBlT" Received: by mail-pj1-f52.google.com with SMTP id 98e67ed59e1d1-385ea3ce80dso152661a91.2 for ; Fri, 24 Jul 2026 01:44:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784882653; x=1785487453; 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:content-type; bh=15QCCMJqDJvxC4OlYXPloXq3cJq1LSRVcuMMIDjVYjA=; b=Xic4eBlT78W9I04d2CEONJApzA+CYXES3lepeP+ZemSqti47+9bORS/wJVBIutncD9 shFhpqdmTpSxbycJeuzPOoeZGONL2/yQ1OSDHusiQ4vE8CqOCrVEShWTbECN9PVs/tjW yYkQAWsDBEhEKHP5B9XEqRlxQddDxY3yI8iuA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784882653; x=1785487453; 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:content-type; bh=15QCCMJqDJvxC4OlYXPloXq3cJq1LSRVcuMMIDjVYjA=; b=mEPdjAlaL76ISmpg+eprhShpvSk8KME+MX0jc0gYbKoMMiPh/AENTYytxq5kNaDBpT nD9mVd0+/Hk36eK7EiCMfOBSS0kLiM1b3ZbTS0Afo70uloXeanHPoT5lmklIG/d72eDp oiBdIyejNKyGt9rBvDdxTqByY9rEZnS4bEV0EWFVcOptvuHxmwc+Ux3V7sXA8NLW0MFU KFBAwGrxX3tsunhoWea2OPOzBUzkd4K424mSeq3N+6aYL1cpXlo79lLb3K9NfO2E67o+ U+MkDLLaDsgtvfS/1bywa2K+aEyPcNkMUw6wYFZSWGcdPXSi+q+9CNGdx5g1dgu7TaAD RkOg== X-Forwarded-Encrypted: i=1; AHgh+RraGFLioXSPL3OFsc3NB15odlnxQJmT5TSaRUglfrHYDM/0dGUB5JGrVfxYfiU2D7oiQvUT1DE9BvpXWww=@vger.kernel.org X-Gm-Message-State: AOJu0YysiLCT6oBB7f0i3ECBsCbAUF7EDQ6EKJUMT5KzpXtY6Gd9Snkm o6YoX8z9srGqI709ws4fxpShlX+pF7uj9Xpiw7YgJ2s9xmmeswRO+XHjomSdviCUKw== X-Gm-Gg: AR+sD113q93lVSdZCIoWob/WpLv60/lqoEq5DwQveT68r1BfBWT5Rx5387WptA77yzw xY6MpPeltCCIPVCL2PaB/JZm3NpRiLFBVX+ZhHfcQH3YGuv4P6P6Clb7/pMaIWUmzrDjDPTzqNV ROsE/DC3ocE2a6/We+LFCI5PDwelz62Dgzx9cBn/uSB9ZYOAZ4vVzovmdu59qNAZWsSMeVcBvK7 eKGl0c1i6uHah+FKEW6KEsvWhS7Q+qC/vVtYnigCQiH0uVgJtbdUfMygkL5zHJwIo+sZTHuNcG0 SyWJ9LWv7ke+KBxnR/V7+fbV5uKitbDGjI/cplqDCsJ2DXwEjQVzVmiXTSaH0BtZMB7xXFL9HqG GgVBlDbZIiHe/1XEQ8JBFe7X56vpisJCV8RCn3x0l+OphOwc6PQp7SgGP8lZRLCZNRDjY9A2Pgz EL39bWzpIgH1Tx4Dmpne95LQBZs6yvwA1NeVD773UhL+fiWny0uUqVCg6HsrI= X-Received: by 2002:a17:90b:56cf:b0:369:a359:b181 with SMTP id 98e67ed59e1d1-38ec6610d34mr6642066a91.23.1784882653597; Fri, 24 Jul 2026 01:44:13 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:f131:86cc:5858:7325]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38f089ac6d8sm434546a91.2.2026.07.24.01.44.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 01:44:12 -0700 (PDT) From: Chen-Yu Tsai To: Bartosz Golaszewski , Greg Kroah-Hartman , Andy Shevchenko , Daniel Scally , Heikki Krogerus , Sakari Ailus , "Rafael J. Wysocki" , Danilo Krummrich , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno Cc: Wei Deng , Chen-Yu Tsai , linux-acpi@vger.kernel.org, driver-core@lists.linux.dev, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam , Alan Stern , Bartosz Golaszewski Subject: [PATCH v7 02/16] device property: Add fwnode_graph_get_next_port_endpoint() Date: Fri, 24 Jul 2026 16:43:11 +0800 Message-ID: <20260724084328.3943997-3-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog In-Reply-To: <20260724084328.3943997-1-wenst@chromium.org> References: <20260724084328.3943997-1-wenst@chromium.org> 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" Due to design constraints of the power sequencing API, the consumer must first be sure that the other side is actually a provider, or it will continually get -EPROBE_DEFER when requesting the power sequencing descriptor. In the upcoming USB power sequencing integration, the USB hub driver first needs to check whether a graph connection exists, and whether the other side of the connection is a supported connector type. The USB port is tied to a "port" firmware node, and this new helper will be used to get the endpoint under the known "port" firmware node. Sashiko points out that the |prev| reference put is not done if |port| is NULL. However it seems that the fwnode_*() and of_*() API design implicitly makes the functions no-ops if the passed in node is NULL. So this new addition follows the same pattern. Cc: Sakari Ailus Reviewed-by: Andy Shevchenko Reviewed-by: Bartosz Golaszewski Signed-off-by: Chen-Yu Tsai --- Changes since v2: - Dropped unused |ep| variable - Rewrote as do {} while() - Dropped WARN() use --- drivers/base/property.c | 25 +++++++++++++++++++++++++ include/linux/property.h | 2 ++ 2 files changed, 27 insertions(+) diff --git a/drivers/base/property.c b/drivers/base/property.c index 950defc0c55a..5d3993bd8fc4 100644 --- a/drivers/base/property.c +++ b/drivers/base/property.c @@ -1099,6 +1099,31 @@ int fwnode_irq_get_byname(const struct fwnode_handle= *fwnode, const char *name) } EXPORT_SYMBOL(fwnode_irq_get_byname); =20 +/** + * fwnode_graph_get_next_port_endpoint - Get next endpoint firmware node i= n port + * @port: Pointer to the target port firmware node + * @prev: Previous endpoint node or %NULL to get the first + * + * The caller is responsible for calling fwnode_handle_put() on the return= ed + * fwnode pointer. Note that this function also puts a reference to @prev + * unconditionally. + * + * Return: an endpoint firmware node pointer or %NULL if no more endpoints + * are available. + */ +struct fwnode_handle *fwnode_graph_get_next_port_endpoint(const struct fwn= ode_handle *port, + struct fwnode_handle *prev) +{ + do { + prev =3D fwnode_get_next_child_node(port, prev); + if (fwnode_name_eq(prev, "endpoint")) + break; + } while (prev); + + return prev; +} +EXPORT_SYMBOL_GPL(fwnode_graph_get_next_port_endpoint); + /** * fwnode_graph_get_next_endpoint - Get next endpoint firmware node * @fwnode: Pointer to the parent firmware node diff --git a/include/linux/property.h b/include/linux/property.h index 01ea010cb2f9..9a784a856773 100644 --- a/include/linux/property.h +++ b/include/linux/property.h @@ -507,6 +507,8 @@ void __iomem *fwnode_iomap(struct fwnode_handle *fwnode= , int index); =20 struct fwnode_handle *fwnode_graph_get_port_by_id(struct fwnode_handle *fw= node, u32 id, unsigned long flags); +struct fwnode_handle *fwnode_graph_get_next_port_endpoint( + const struct fwnode_handle *port, struct fwnode_handle *prev); struct fwnode_handle *fwnode_graph_get_next_endpoint( const struct fwnode_handle *fwnode, struct fwnode_handle *prev); struct fwnode_handle * --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:53:11 2026 Received: from mail-pj1-f47.google.com (mail-pj1-f47.google.com [209.85.216.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 A69503DAAAC for ; Fri, 24 Jul 2026 08:44:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882661; cv=none; b=WnM7JXehFZtdsWFCjncuBINJjI8/3t3dpIfiTkcD9NwdEmdpx+NxWVxh66nMsJfmmv8r6ftZJ2zuE45JjfeVNpGfbmB79Zdnws2aa58Yvbj5ExVm0sMo3CxmZnTRDOoIEkXDYJsBMem90DtrlOyeC/9noK82ADKYlLQf2AaKYno= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882661; c=relaxed/simple; bh=GfR2p9/Kj/F0C3wXj1i4wv7w/Gl8fUFvNscov5zqDHY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RXWJuG41u3V5DFy3b6lpzM0UXVIgWje4cEQyIRPmOBAqvJ+XU4wRaiwbLHn0RMZdvzrN1skZzPEbXPPP6r2mk8c1QQoxVgeVqhTY3qdWtS/v8XRFQuXQm6vv2F5j4vqs8bb+Be91/hKdu7sZPnURWDryCizP/jFu59ukJKREDuk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=fMKUjVI7; arc=none smtp.client-ip=209.85.216.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="fMKUjVI7" Received: by mail-pj1-f47.google.com with SMTP id 98e67ed59e1d1-382ef647e20so170716a91.1 for ; Fri, 24 Jul 2026 01:44:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784882659; x=1785487459; 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:content-type; bh=8J9f0ysj5iLgXAfZrr4tNewoNqni8L/Xnuw2lNVMgtk=; b=fMKUjVI7GAYqn9Hu6WFkqtdYMARneNf6Jo37kWGxlX7KOaRFbP+ayHIwwgCSbyCyXI eF0rPAEJcwrzBQgoNHttV8gXnefRInwHBdo+DYw/d2feX1PRBPuVTI6578LyjhxZl1dX wFV0FIqiCy6E7vX1gVm3RwRJjDRgFx+K5/0gs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784882659; x=1785487459; 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:content-type; bh=8J9f0ysj5iLgXAfZrr4tNewoNqni8L/Xnuw2lNVMgtk=; b=O/j5oqYLKgFYG3eBtApZ5hJz1bYwXNkJQ2YzJwJoCj2ofcyImwy9Yl2t1UA0velpD1 8FN8mFaSaRxE7yplrDNvr5KPYGDAjCJ619tPN6LAZtN+UFzVswqTfNqUpDRX7KBESYHZ B1/DmeJ4kGYK+Hzyep0QvEazJydwQvtcbeaaUGZLw3gGbO5ljpJ4J+IrMuS2t9nXKp1a 9RoOt834kXh9afNb72q/ktr9+qTEObRgkj0dhDngMRdAK6Oa1yxY4Hg4M2FQlHo09rw7 9v5Cm2VL2xeVhuGJpYQkohaP/ePU1S7fX9WfwLN/hSjAav5SxpZ9nYfrfObLz03s9MsZ CbxA== X-Forwarded-Encrypted: i=1; AHgh+RpOLotPvqLlqtB7ue9fskoXbh3qtCqTLwvrT2fPNGyfKGfsfWXpdw4zl3MKZxXIBlcIss9sdK737N+/I4Y=@vger.kernel.org X-Gm-Message-State: AOJu0Yx+3kfeSbQuqaZjGr80Pqor072nfLBgky3ZZm7pZE4O8Zy+6LCb rwlscDd0YmY91IRKnihPt06wnEsMREvHd+wASmlzmQnf1UKxEKr9KHvhGZ/xvBazew== X-Gm-Gg: AR+sD10i7Y7dNK19rbV42lYC+xNMZXZJguSGYgN35RhbqDGaPH91W99GP3T57zfxOIS JM6HzXyd7dJbLi2R8HRNvQ7avsDqyif7b4s/EAgmImOwTpJZ0+PkeIFPZBiiMtiug0fAesy0TOw epgSjInGqGUdzDAbgPpAhGhItxADS9PvBVbyZyWMH77eqawL5KH20Cwk4YEsitZvtxsVQdZnq3/ F0sCMZguhbtBlClAtQ2f85YYit2TvDzJ8cFmgnDnRGWbFgYnUP6SC7tfOp4+b2624/JIQGefqli n2ClRvzRVbyVooYPV80ulwTC8WR9ucvmN0yUoCCq/+x5vPqXzGh+YJTET0jaT1hXGPLN6LrjRNg sRwroa6OxUCImmtAovLcUAz3XlQfxSwB5zf8xdf3R4jCoKRzOzBhQO+U5y5Fz3xAuh0tFXGPx84 OllebkbgAzlWowr+gSniSD0HEBVRVwuQmVuwsNUhgpwIN2jaS4oClehGP7wiM= X-Received: by 2002:a17:90b:1d48:b0:387:e0db:3d8e with SMTP id 98e67ed59e1d1-38ec665050cmr7371473a91.41.1784882658880; Fri, 24 Jul 2026 01:44:18 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:f131:86cc:5858:7325]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38f089ac6d8sm434546a91.2.2026.07.24.01.44.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 01:44:18 -0700 (PDT) From: Chen-Yu Tsai To: Bartosz Golaszewski , Greg Kroah-Hartman , Andy Shevchenko , Daniel Scally , Heikki Krogerus , Sakari Ailus , "Rafael J. Wysocki" , Danilo Krummrich , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno Cc: Wei Deng , Chen-Yu Tsai , linux-acpi@vger.kernel.org, driver-core@lists.linux.dev, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam , Alan Stern , Bartosz Golaszewski Subject: [PATCH v7 03/16] power: sequencing: Add pwrseq_get_state() Date: Fri, 24 Jul 2026 16:43:12 +0800 Message-ID: <20260724084328.3943997-4-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog In-Reply-To: <20260724084328.3943997-1-wenst@chromium.org> References: <20260724084328.3943997-1-wenst@chromium.org> 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 power sequencing consumer API already does power on state tracking internally. Expose the state to consumers through pwrseq_get_state() so that they don't have to reimplement it locally. Instead of just on/off and error codes, the function can also return "unknown" state. This is in anticipation for "uncontrollable" power sequencers (such as GPIOs left unconnected). Acked-by: Bartosz Golaszewski Signed-off-by: Chen-Yu Tsai --- Changes since v6: - Changed to pwrseq_get_state() with enum return value Changes since v5: - Reverted back to returning -EINVAL if descriptor is NULL Changes since v4: - Make pwrseq_power_is_on() return 1 if descriptor is NULL, i.e. if the descriptor is optional, matching the other pwrseq consumer APIs Changes since v3: - Added missing stub function for !POWER_SEQUENCING Changes since v2: - New patch Needs to go in with "usb: hub: Power on connected M.2 E-key connectors" as it is a build time dependency. Bartosz wants the change on an immutable branch to pull into the pwrseq tree. --- drivers/power/sequencing/core.c | 19 +++++++++++++++++++ include/linux/pwrseq/consumer.h | 12 ++++++++++++ 2 files changed, 31 insertions(+) diff --git a/drivers/power/sequencing/core.c b/drivers/power/sequencing/cor= e.c index 02f42da91598..701728e60a26 100644 --- a/drivers/power/sequencing/core.c +++ b/drivers/power/sequencing/core.c @@ -968,6 +968,25 @@ int pwrseq_power_off(struct pwrseq_desc *desc) } EXPORT_SYMBOL_GPL(pwrseq_power_off); =20 +/** + * pwrseq_get_state() - Queries the last requested state of the power sequ= encer. + * @desc: Descriptor referencing the power sequencer. + * + * This returns the last requested state of the power sequencer. + * + * Returns: + * On success, PWRSEQ_STATE_ON for on and PWRSEQ_STATE_OFF for off; + * negative error number on failure. + */ +int pwrseq_get_state(struct pwrseq_desc *desc) +{ + if (!desc) + return -EINVAL; + + return desc->powered_on ? PWRSEQ_STATE_ON : PWRSEQ_STATE_OFF; +} +EXPORT_SYMBOL_GPL(pwrseq_get_state); + /** * pwrseq_to_device() - Get the pwrseq device pointer from a descriptor. * @desc: Descriptor referencing the power sequencer. diff --git a/include/linux/pwrseq/consumer.h b/include/linux/pwrseq/consume= r.h index 3c907c9e1885..af949e756bbd 100644 --- a/include/linux/pwrseq/consumer.h +++ b/include/linux/pwrseq/consumer.h @@ -11,6 +11,12 @@ struct device; struct pwrseq_desc; =20 +enum { + PWRSEQ_STATE_UNKNOWN, + PWRSEQ_STATE_ON, + PWRSEQ_STATE_OFF, +}; + #if IS_ENABLED(CONFIG_POWER_SEQUENCING) =20 struct pwrseq_desc * __must_check @@ -22,6 +28,7 @@ devm_pwrseq_get(struct device *dev, const char *target); =20 int pwrseq_power_on(struct pwrseq_desc *desc); int pwrseq_power_off(struct pwrseq_desc *desc); +int pwrseq_get_state(struct pwrseq_desc *desc); =20 struct device *pwrseq_to_device(struct pwrseq_desc *desc); =20 @@ -53,6 +60,11 @@ static inline int pwrseq_power_off(struct pwrseq_desc *d= esc) return -ENOSYS; } =20 +static inline int pwrseq_get_state(struct pwrseq_desc *desc) +{ + return -ENOSYS; +} + static inline struct device *pwrseq_to_device(struct pwrseq_desc *desc) { return NULL; --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:53:11 2026 Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.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 881993DAAD8 for ; Fri, 24 Jul 2026 08:44:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882666; cv=none; b=Ml5W2WvVH1gZASZyevTIXr8onVrBDkmKgx4JTJynOEUdBnFS68Z7bjf46Nr1oVGB9YR2CSAb7z1enxIQAJmQw+JTLQmNIs6LqO6UmSBxC1ClI02aJ0ocPF660vmDOzvvrtKEfjBWBhKpKW2eHLJlgH8mpm3doGrNh73DbHQhNe4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882666; c=relaxed/simple; bh=nDUhaI/csnrSHq2VN8yN7twClkIbPM+mTJRxHI6rupU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mkSv1qt+hca5M/W1uzFL/0LrUdrnkeqUKa3b6g0QTH8VI/bcoydvkmFxhRLa7w6ECtsN+hOwoIkGaYUUZzl9fQbr5p2LQbrpZUwGrCHMJCHkmHfudZrY0xXzvP+vIMUrhiv6/m2J2PQn+donubxYeewfHdijmxTbydX2la1EVs8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=CmKpXFIY; arc=none smtp.client-ip=209.85.216.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="CmKpXFIY" Received: by mail-pj1-f46.google.com with SMTP id 98e67ed59e1d1-38e071ed6aeso139475a91.0 for ; Fri, 24 Jul 2026 01:44:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784882664; x=1785487464; 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:content-type; bh=H3ipik7auGStkEDr/T9A/4r5EQKWd/pec5jMaPqfTe4=; b=CmKpXFIY2fz0FEh1sBN5K1MITqW6gA3deUByIwLLyRKlpL8Y/MaJytDIqBrNa0/Tt5 ljLVkmAIQRnPQNpfB1hDuG2LnAC1j9Wk0fUFM/xkU2F9OIbB7PGkSYRFhJtLRzc2cNrR NGBFe4Ii44lPSM+VRSDegxZtWTEppi/5ci6vA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784882664; x=1785487464; 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:content-type; bh=H3ipik7auGStkEDr/T9A/4r5EQKWd/pec5jMaPqfTe4=; b=JpvyZYweOiKNL7H7fhQ7QkIKzMeXPLoFA0lF4pB2ElyCJg0StH3rF4q5RzcycdFYsg kcQNzlo+J66YgzimWT5pGBTIGZNarn9gPD8F/ICU+hMErHF6GqBFGe5VEbwC+t4KePkU pPXkSpzFLukwBs6e6Cg6Ej/6lBVmsLPZSqiZpCsQZjFNFhUilgNMQDMcAu5x5RcCvuza JiAxQ+GgcUY+4TrxAs2xKjJby8oE5S1dsbbe4W5K7+ma+dH6b7WZqWzt6C7Y+YrgtoCq vio62UhjXmWVSIzGvNDEv2mtrrTsw4X0ZfkmFHDDaKUTaGhHVoJJAcdOydnYVCyRQ19v waNQ== X-Forwarded-Encrypted: i=1; AHgh+RrwQ5fyUwFpy5kpUl0yO07UMb9np1Kl9s7UgoDh+7XdcsUvjMshd772MrGbqXNiVjK9nnrNtpK/mZ+sC4U=@vger.kernel.org X-Gm-Message-State: AOJu0Yz6uonmE8zkVIKjxwSepq8s9YyBtxx2SGGKJaiLysqHI2UmKtPM VVNAZ974jgJB1vuiWs7WyFeWlYNDRmP3WRCqU7BrMDiOhQGhQyTdh2wqeQz7/jnBow== X-Gm-Gg: AR+sD13SMhPwRB4XWyS+YpQhgiubHer6TBKTMsCZwITUJ9QHqivK4Qvrf0we28FTSg7 uDcck42EtsxTEGDwcz9Sl7mTdITOBL+l2KQgFqaX8fEB1zDjP/+IAlhWW054PALX6Soc56fuqTI uPesXrdzHwoErQEWG8lHyRzVHkfjRdCUquaM9LDNcolmlraybTLUCyFzKAAubjlqpTJTl4xWLY3 QnBRJ7Kr6ni17ulzP73m7hy/pzqy4AuZnNxodqtj9pRpgAnY7mkCHSUf5SVXhKoh9I1VZ4Ahcge yFMICT9sM/vBKV9Nq1swLo7NcXAQe5V3QyxP0gZtC+En91SRbpzYtnM2o8nDnCmHANgtONOvKaM uc51G7zArLnd6j20h8/9UIHI79SkOD0wlsWE+IZ/vPxgWduKJ4krVuvPoJ8vhAq4Xt04sZvhsgx 1orxOIGavCywAXKgeb6Vo0qwwfv/zhFfGuaP0Yr7r9cmhiWvvslibrceyEiJrZjj8sOsVsFQ== X-Received: by 2002:a17:90b:314a:b0:381:23d5:693f with SMTP id 98e67ed59e1d1-38ec65f9916mr6632501a91.28.1784882663919; Fri, 24 Jul 2026 01:44:23 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:f131:86cc:5858:7325]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38f089ac6d8sm434546a91.2.2026.07.24.01.44.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 01:44:23 -0700 (PDT) From: Chen-Yu Tsai To: Bartosz Golaszewski , Greg Kroah-Hartman , Andy Shevchenko , Daniel Scally , Heikki Krogerus , Sakari Ailus , "Rafael J. Wysocki" , Danilo Krummrich , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno Cc: Wei Deng , Chen-Yu Tsai , linux-acpi@vger.kernel.org, driver-core@lists.linux.dev, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam , Alan Stern , Bartosz Golaszewski Subject: [PATCH v7 04/16] usb: hub: Use assign_bit() in usb_hub_set_port_power() Date: Fri, 24 Jul 2026 16:43:13 +0800 Message-ID: <20260724084328.3943997-5-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog In-Reply-To: <20260724084328.3943997-1-wenst@chromium.org> References: <20260724084328.3943997-1-wenst@chromium.org> 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" usb_hub_set_port_power() open-codes assign_bit(). Just use the assign_bit() macro instead. This makes subsequent additions to usb_hub_set_port_power() easier to read. This change does not introduce any functional changes. Suggested-by: Andy Shevchenko Reviewed-by: Andy Shevchenko Reviewed-by: Bartosz Golaszewski Signed-off-by: Chen-Yu Tsai --- Attributing suggestion to Andy, since the change was originally requested as part of a review. Changes since v4: - New patch (split out from "usb: hub: Power on connected M.2 E-key connectors with power sequencing API") (Andy) --- drivers/usb/core/hub.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 2cfe09a141d8..715f26f05a31 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -10,6 +10,7 @@ * Released under the GPLv2 only. */ =20 +#include #include #include #include @@ -899,10 +900,7 @@ int usb_hub_set_port_power(struct usb_device *hdev, st= ruct usb_hub *hub, if (ret) return ret; =20 - if (set) - set_bit(port1, hub->power_bits); - else - clear_bit(port1, hub->power_bits); + assign_bit(port1, hub->power_bits, set); return 0; } =20 --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:53:11 2026 Received: from mail-pj1-f47.google.com (mail-pj1-f47.google.com [209.85.216.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 B6DD83E49ED for ; Fri, 24 Jul 2026 08:44:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882671; cv=none; b=SP0TMySzQDP59K/8f01EMU6h2CFmIKDEMZAhY7k3hrRwo/z/TYydm8xaOWNNOopw5UFAdD1gS+LA1JHcUcKWE9Ev6Z1HY47Rj4aVpjiwfjWhSROnHDohue0o202ql2SlceVzKeagl6JZnGl30I71jeUZaib51p1DZGEBRgdWwp0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882671; c=relaxed/simple; bh=a0af6mRfXl6o/3aQ3C/YjqVxExTXT9xiwTDCu1uF7Ko=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qeT9jdEq/9lSlO3QW62qLQtw0XJN0bAb5qW0rWZH+7LUupU9EMsF+HZ4a3zByOqjeDY45EG615fOmlpKzdwJPscrhfZNWprSJQPPtM8Lo7i8sX/6Ml4zGLHE1s69xKZCiRIHgABcjX7YqRo8FBvssRzBOSZvnaefhPY09cq7HyQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=fTOr5JG5; arc=none smtp.client-ip=209.85.216.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="fTOr5JG5" Received: by mail-pj1-f47.google.com with SMTP id 98e67ed59e1d1-38ea87caafeso114359a91.3 for ; Fri, 24 Jul 2026 01:44:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784882669; x=1785487469; 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:content-type; bh=qjG3+Srh1l1zMMK/k1OHJ2IZC5GaA1LItCzYqUBfaa0=; b=fTOr5JG5MIirJf39aUCrW8evnhhd07B9xb4kaUT+iDmksZKkPaCIEP/4MVOvrqyJmd 8U2tALDlNUYd5j6i8aRsyaNQdyPPDIjsxbuIxMF5m9VSrIc6havZye2eM5XDS0flqt+K Hix/kclbTreR+HXWmW8haNTiIxW5gssdg5BjM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784882669; x=1785487469; 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:content-type; bh=qjG3+Srh1l1zMMK/k1OHJ2IZC5GaA1LItCzYqUBfaa0=; b=Q3Oe6WD/mdIqn66zt5BLoZPVxyXcmNn2yyxMI7BgiU9M/mwqw/cjLe+2jcSzO4aBY1 N5C+suUYJVkj5p5wXF/9O2LF80rYEfoHyTWdTWkjSiqJrWTuM7dpw6PH208TyAnt9jbS h35JJHKr2a9JRSirjCudwSxE87GWyOgWZEAGSVQoy1Frpf0Nq6Ow0E2yJzmnbkLLUCNC yefVjYi1bmQKf+h40IBuNdwwcu80Bi+kjdrOveB6WPqEoovPBY7JW0XEmJpdljTdW1lm 8TwYhyr+Ptsc1CPcbH/gvIItYIAKHZF91w2yLgPq72JxlVsgd3GrbHZssxea7UMJeUnv ugew== X-Forwarded-Encrypted: i=1; AHgh+RpLOGNS1r47qg0eFR79tKxCNtswJAtlPuwu1zfMyYHex8Hsvv0jVZDMPcUZWoIfkJtkSaeVBmNkLDk+kXc=@vger.kernel.org X-Gm-Message-State: AOJu0Yw3fVG4K1HG1p0Vd4ANL4xAnXpx/11GUnvcfK+R36xxVFEvdcT1 RRUYasNZffwvza7jeiurY6IxnYZtkrhEh7P9GHHbb4oXPWdeJLMVUcRVk60szBvnow== X-Gm-Gg: AR+sD12T77lLu+/bggIkm9GbwB/Pzlh5BmUe2tJUnbefq39omLjtN6fjqf+DJRCy8nE ZPIOkakDBssljDW7kiD3NfAdR9D6RN8Fj3Cb/69nnPn6pBzQ1R5NiJVJoDuowO46xkN6Zm8x15p CMCP101+z7ECZtLFtDbvqnINNQpoxgo2HldVEaHI+25MwmMbZVf1swF/uOn3szZWJpvCsLMXISF 6mvLo90J2j6APy5qEV7+Er3TdKZAQHMLkswManL5Yhz3CcgYL4dYYkQ47srqtAsEzL6vWj6kUEM O+ZrPvtfJskKY5wXGqRA2htXuAUTGbMbw6GA94LfOqCU4XxLN6X+JDq8gP/+0Qrb7wXBvtyi5ga 3TjBrrAyOZgcxgoBqLYAKQBD+bAI+EsLV5LvG7OQigetSwkX95pWWSYJplPpPpQ6d0u14Ykkd+c HBGn6au++griaZIkdBKFSpAztAnIMS62UFTP2aq+axBmDz+q6GfcnieF8GGig= X-Received: by 2002:a17:90b:2e03:b0:38f:1f8:1fa with SMTP id 98e67ed59e1d1-38f01f802b5mr3474310a91.15.1784882669036; Fri, 24 Jul 2026 01:44:29 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:f131:86cc:5858:7325]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38f089ac6d8sm434546a91.2.2026.07.24.01.44.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 01:44:28 -0700 (PDT) From: Chen-Yu Tsai To: Bartosz Golaszewski , Greg Kroah-Hartman , Andy Shevchenko , Daniel Scally , Heikki Krogerus , Sakari Ailus , "Rafael J. Wysocki" , Danilo Krummrich , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno Cc: Wei Deng , Chen-Yu Tsai , linux-acpi@vger.kernel.org, driver-core@lists.linux.dev, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam , Alan Stern , Bartosz Golaszewski Subject: [PATCH v7 05/16] usb: hub: Return actual error from hub_configure() in hub_probe() Date: Fri, 24 Jul 2026 16:43:14 +0800 Message-ID: <20260724084328.3943997-6-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog In-Reply-To: <20260724084328.3943997-1-wenst@chromium.org> References: <20260724084328.3943997-1-wenst@chromium.org> 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 addition of power sequencing descriptor handling in the USB hub code requires dealing with deferred probing from pwrseq_get(). The power sequencing provider may not yet be available when the USB hub probes. Return the actual error code from hub_configure() when it fails, so that the driver core can notice the deferred probe request. Also rewrite this section into the standard error handling pattern: if (error) { # handle error return error; } # do more work return 0; Reviewed-by: Bartosz Golaszewski Reviewed-by: Andy Shevchenko Signed-off-by: Chen-Yu Tsai --- Changes since v2: - Rewrite into standard error handling pattern Changes since v1: - Moved "int ret" declaration in hub_configure() over here from the next patch --- drivers/usb/core/hub.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 715f26f05a31..8f8624a0d36a 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -1875,6 +1875,7 @@ static int hub_probe(struct usb_interface *intf, cons= t struct usb_device_id *id) struct usb_host_interface *desc; struct usb_device *hdev; struct usb_hub *hub; + int ret; =20 desc =3D intf->cur_altsetting; hdev =3D interface_to_usbdev(intf); @@ -2006,14 +2007,15 @@ static int hub_probe(struct usb_interface *intf, co= nst struct usb_device_id *id) usb_set_interface(hdev, 0, 0); } =20 - if (hub_configure(hub, &desc->endpoint[0].desc) >=3D 0) { - onboard_dev_create_pdevs(hdev, &hub->onboard_devs); - - return 0; + ret =3D hub_configure(hub, &desc->endpoint[0].desc); + if (ret < 0) { + hub_disconnect(intf); + return ret; } =20 - hub_disconnect(intf); - return -ENODEV; + onboard_dev_create_pdevs(hdev, &hub->onboard_devs); + + return 0; } =20 static int --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:53:11 2026 Received: from mail-pj1-f53.google.com (mail-pj1-f53.google.com [209.85.216.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 479DE3DD500 for ; Fri, 24 Jul 2026 08:44:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882676; cv=none; b=kCZkvn76D2XHK5na6+DHoYKYTeUMfNzr5IRbuPWxE2F4oMdmw9pGCVJ4NwfyKyxPQTPi8bS0uZukKlPWSE7xZW7f0XdJgkM/9h0ZWeTwglrDHYqTxlZX6Dr2iYdcyeF+dK4cbepJbpZL3KaBzuUxGrY6LbK8DaF/whQ6xWtTIuU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882676; c=relaxed/simple; bh=rDxhkqymr7zNZNO5s5LLG26mVpihgtL4jhXYrXXJ+wY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CBTVovZdvloylblaHKhy7COwUAFO1P8emcmwHzRmYy71F85KeHg059GtTu8AWBRr+MCZuFQ4+6zfeSxi8eWTamrRN3rtHzPxZ8lzrtDsQtatEF3/BaljIBrV/Y4JRT87ub7TD2+Ruegn6EsgCP4QGvxHOZuDAhMBX9lDDo3b0qw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=PnEiqRJr; arc=none smtp.client-ip=209.85.216.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="PnEiqRJr" Received: by mail-pj1-f53.google.com with SMTP id 98e67ed59e1d1-38a0c7e841fso176790a91.2 for ; Fri, 24 Jul 2026 01:44:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784882674; x=1785487474; 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:content-type; bh=fHUpdIaIyIIyz0xHiffTwBnjBb2ySQuUos1Tr0diNj4=; b=PnEiqRJrRe5wFFiJ1HBYbmRp8FtlCtmUVL8RHxvEoNBOMl1UdTWWHxBdyASchsDvBZ 9uWdAQQLJxK1sYBPojAdAqCs4VzfkwC8xhIrjy3CGqG1jpsz4OF7qlz2/u6xWMU/nbJI iSACTGs47Ur3bpX5WAsLMjXhdKLfSGdXqWlSg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784882674; x=1785487474; 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:content-type; bh=fHUpdIaIyIIyz0xHiffTwBnjBb2ySQuUos1Tr0diNj4=; b=pXKJIFka7KwoT+GGNd6Zwh52Vq+hcMuAYKgQmaYG5Elv+Dt4A2qd6F044de3UDdcxY ss8yVHuYhO6kbZxBfnTNJqD6RMhlTtTD0kqASnNiG9nSFGRQtKppuKtVvlEhuSpdzdBV mbt/lYA3JIUbmSDRBhfWyGE5BD5FDwaRGJyWLe4sx9LuBqcHotlvGIfjacr5lnnlIfAy /sYfnvTipyAs8BKwYtbcVF/Kqx782/qJzyL7JjfOovZhmPM890yVR5s0yTKlp43W3kX7 PPVDZdeeotUh0Fr0ktIX3LMDOjy3gIMacID2QtxGfRPjCSRmFqaP5N7IRxbxf2Y9BcpZ m4IQ== X-Forwarded-Encrypted: i=1; AHgh+Rr1LXtZYrWN7dRemGAhueuV4nVQv9b3dkfknNx9oe9Wc0+KEz9xEv8BhBYHE3iTBe4jWC3FWX7M0TnxlNg=@vger.kernel.org X-Gm-Message-State: AOJu0YwmzMJkJ6jaBZiwQl6wS5U3glpFinnMDAdDlp6zfgj3xWq1dto9 9puafXflrDL53N1yZaE3w2c7HuBQegeMr5D5UR/Icpq44UNa3HZ2NAx3nFxa9AKLXQ== X-Gm-Gg: AR+sD11KN7zm5W9fb7eFLwXrdHCnF/jclz2Yz8SMK6A/keG3U5ubOSZuxgzHOJip9AN Yxr5bJ3YxEdVNQGlX7AHjexsm2MG2BlsQb4utjsS9PKvtDRJOVAxBW2Uo+hJn18i9Ch1lV+lx1y 9VLYgI6Cjzce2BdFVc4z9aS6XoErYFqVXpJTTTZ9oWabvDniKuY+foag3i6PP7JtqCspm+Fn4Wf ps7Q4hKb+0mT9YXnaagVSBRjW4rkaWKma9+XaT3Vp9W+GYnpC/f7I+jAtbt0MFMixROcrciNDcl HU+ZQZzkYyuFkr0i48pigR+NnrZ+Zu6geR33ZQReGqYJHcMz4zBxMzPauczLVH1JonOOibv4BK0 JeBmdoBQ1dp9F/Wxl8nwXFCPW9rYpr7hH6EsGVqzyZqFmN54eL6vGlWkkPrAo+YKgh3hInVQTRb o2C0ymO+NHcdQLoTm7PS07UdfokeFFiD+yWai8bjiCwSX+zjWO7PvXMb/NJow= X-Received: by 2002:a17:90b:5407:b0:38e:64b0:8bce with SMTP id 98e67ed59e1d1-38ec6650435mr6482024a91.20.1784882674612; Fri, 24 Jul 2026 01:44:34 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:f131:86cc:5858:7325]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38f089ac6d8sm434546a91.2.2026.07.24.01.44.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 01:44:33 -0700 (PDT) From: Chen-Yu Tsai To: Bartosz Golaszewski , Greg Kroah-Hartman , Andy Shevchenko , Daniel Scally , Heikki Krogerus , Sakari Ailus , "Rafael J. Wysocki" , Danilo Krummrich , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno Cc: Wei Deng , Chen-Yu Tsai , linux-acpi@vger.kernel.org, driver-core@lists.linux.dev, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam , Alan Stern , Bartosz Golaszewski Subject: [PATCH v7 06/16] usb: hub: Associate port@ fwnode with USB port device Date: Fri, 24 Jul 2026 16:43:15 +0800 Message-ID: <20260724084328.3943997-7-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog In-Reply-To: <20260724084328.3943997-1-wenst@chromium.org> References: <20260724084328.3943997-1-wenst@chromium.org> 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" When a USB hub port is connected to a connector in a firmware node graph, the port itself has a node in the graph. Associate the port's firmware node with the USB port's device, usb_port::dev. This is used in later changes for the M.2 slot power sequencing provider to match against the requesting port. To avoid potential conflicts with ACPI firmware nodes and then causing power management issues, only assign the firmware node if the hub's firmware node is not an ACPI firmware node. Reviewed-by: Andy Shevchenko Reviewed-by: Bartosz Golaszewski Signed-off-by: Chen-Yu Tsai --- Changes since v5: - Added extra |struct fwnode_handle *| local variables to shorten lines (Andy) - Added comment about passing fwnode_graph_get_port_by_id() return value directly to device_set_node() (Andy) Changes since v4: - Dropped unused |hdev| variable - Added flags for fwnode_graph_get_port_by_id() with FWNODE_GRAPH_DEVICE_DISABLED so that even incomplete ports can be connected Changes since v3: - Added missing fwnode_handle_put() Changes since v2: - Skip assignment if hub firmware node is ACPI node --- drivers/usb/core/port.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c index b4452b665f59..c0a51d9b06a6 100644 --- a/drivers/usb/core/port.c +++ b/drivers/usb/core/port.c @@ -7,6 +7,7 @@ * Author: Lan Tianyu */ =20 +#include #include #include #include @@ -358,6 +359,11 @@ static void usb_port_device_release(struct device *dev) { struct usb_port *port_dev =3D to_usb_port(dev); =20 + /* + * At this point ACPI nodes and swnodes have been removed by + * device_platform_notify_remove() in device_del(). + */ + fwnode_handle_put(dev_fwnode(dev)); kfree(port_dev->req); kfree(port_dev); } @@ -754,6 +760,7 @@ int usb_hub_create_port_device(struct usb_hub *hub, int= port1) { struct usb_port *port_dev; struct usb_device *hdev =3D hub->hdev; + struct fwnode_handle *fwnode =3D dev_fwnode(&hdev->dev); int retval; =20 port_dev =3D kzalloc_obj(*port_dev); @@ -782,6 +789,24 @@ int usb_hub_create_port_device(struct usb_hub *hub, in= t port1) port_dev->dev.driver =3D &usb_port_driver; dev_set_name(&port_dev->dev, "%s-port%d", dev_name(&hub->hdev->dev), port1); + + /* + * ACPI FW nodes are associated later when device_register() happens. + * Skip assigning one here to avoid potential conflicts. + */ + if (!is_acpi_node(fwnode)) { + struct fwnode_handle *port; + + /* + * fwnode_graph_get_port_by_id() returns either a valid fwnode handle + * or NULL. Passing NULL to device_set_node() clears any associated + * fwnode. It is effectively a no-op here, since no fwnode has been + * assigned to the newly created device yet. + */ + port =3D fwnode_graph_get_port_by_id(fwnode, port1, FWNODE_GRAPH_DEVICE_= DISABLED); + device_set_node(&port_dev->dev, port); + } + mutex_init(&port_dev->status_lock); retval =3D device_register(&port_dev->dev); if (retval) { --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:53:11 2026 Received: from mail-pj1-f45.google.com (mail-pj1-f45.google.com [209.85.216.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 95A3E3DDB0A for ; Fri, 24 Jul 2026 08:44:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882682; cv=none; b=JV7bZVDk+Z4mDHsQaOck650f9hXgBucSnbizf6QSlHuSG3JbsPcnGMc10qI+o74kui0H6zSXJ0GxcIRDqv5SlVnDQo0sd2RyQkpy19uD5RMUdKXddlUGz/YV8TckyfD+yN4hCs5hoUVNNLDSCmHaz3q5sNEE7/L48NWjBmX9fzM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882682; c=relaxed/simple; bh=IlZ/0IeKP4mmnn6s8JCPzwMroH/vaSwiA2UpQ8RQglw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MFKz5asK/zWy7xQyLBcop+MdZacZ9gRiSS/7iHatJsz+FntFcx7j5w1L8MZuLQoX5QHBgJ26QrKEK/A6iPcoad18u0NxdOvO4stdAnfwXDpXS1zFOR3KotExDSz+oJY0T66oX8Txk//rzriMSt6tk7MDxYkvdtKLQ8XBumOFv/E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=iVXAiIFW; arc=none smtp.client-ip=209.85.216.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="iVXAiIFW" Received: by mail-pj1-f45.google.com with SMTP id 98e67ed59e1d1-38d489b6b71so151563a91.0 for ; Fri, 24 Jul 2026 01:44:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784882680; x=1785487480; 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:content-type; bh=sAcFKcy+EqEALwPe3iCzQnqqeeFK6XarTVIxswfGgCg=; b=iVXAiIFWX+qzAZ1cXoNL5i4admlcwJhDFOkhvshywPM8HadpbrCSmDOekFaEXuWQiy Ff5Lj9FLArYPbtyIiTUjC0VI5LK5diry9KWCXIAHuhmgmf/DXC2s8g7k2HwIL/9RiUMY Ch5eIqHz0TBrGS/7thFkbv41YnH6VYVXU+RiQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784882680; x=1785487480; 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:content-type; bh=sAcFKcy+EqEALwPe3iCzQnqqeeFK6XarTVIxswfGgCg=; b=kcnWZWlArTLJBAXm/nSSl7XKp2Um6PObJ0u7uy3/Yz+lXXR2cYn0n+rrNwChw8065F 3f5he/9QuTiNqaMAPC0En3bCsV2D0k4Q/WxQSs5QCXTw8Nhw9kbbEQg9o4LFQr/9NFsW D7vQPop/jSO952FclU86abDRaS50nNLe6VDzRcT9KoOsnZ0pQ54/5Yy/DPV9I2R39A8H +mWu/X3s1o7H7kZhNq5S4QTRq/wzoVRryGbi0Z31OY11IPbThrXwlAT1+OfYeHSdqlTW 83mUsgph7Xv87HjmOJIVsLgVL0R/QRWwua+w6kP42R+kUjZRM2W1J5uINW3LzilKXbB0 MaUg== X-Forwarded-Encrypted: i=1; AHgh+RqStUd5zyTgOLzmC8nGxN0RmB7V3nrCqt5H0jp+IboNaFjxWmz/zwG7BYNjiaU3VSZeA/PZEcp2S1aGyaQ=@vger.kernel.org X-Gm-Message-State: AOJu0YxGzkXtif5gTQDNeddZM7jAS/j6+6YA4djGkX7V/6ykZ+oTbpT2 g/QOzwHVt/BxOjtSehWqzag5ZBzhy8qXYVHJCIlNMvxmkhjwtGCd5bHlx5MyeNrdoQ== X-Gm-Gg: AR+sD117jrv0fG/NW+kpURQJy4LPi3dhZDZFXXb4ViQ6Rqj7wEW4+vJRSZaVDeRqwEQ 834pvRCJy5PC5KnKw+W2ojFQCfvjXFSU2gqqv/SV7eFnkIUXVGxNlhTveI9Zc8nKZAJy3b8FzQX EX4cxNNLvSXqSeydQR9aS+T29ucz4HZJEoQbVJIWLDdWF1AkFMJn1Y9kXIgR/QDtj5KaiB27j07 HwCbiWdwGtlviL8sCW+PKuZL7BDNFKFo38M+UiWyF6Hs+A+TmoTH5Cyfc2wA1Qz4yCAvnVJ9wEh eJPr9T1cK1JDDZsVfSQBjBvJv30wpjLWAX61Y/JVhTx8XG7AstR7EJNh2YuHhlCX60e4slzD0h6 zS0JsEdY02c1e7kynwePTWJDipvOs3POxoxRxURe8lPfhjQmrTJmKxOs1wwG02durJYJL1XO8Sl 8Bm/tfpWJISvJsUnCOPw/p9BIpCNxNeIWCx8Js99O8PZRpW7ml5RRBCosIcLc= X-Received: by 2002:a17:90b:4a83:b0:38d:ec31:4840 with SMTP id 98e67ed59e1d1-38ec651c5bcmr6955220a91.13.1784882679804; Fri, 24 Jul 2026 01:44:39 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:f131:86cc:5858:7325]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38f089ac6d8sm434546a91.2.2026.07.24.01.44.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 01:44:39 -0700 (PDT) From: Chen-Yu Tsai To: Bartosz Golaszewski , Greg Kroah-Hartman , Andy Shevchenko , Daniel Scally , Heikki Krogerus , Sakari Ailus , "Rafael J. Wysocki" , Danilo Krummrich , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno Cc: Wei Deng , Chen-Yu Tsai , linux-acpi@vger.kernel.org, driver-core@lists.linux.dev, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam , Alan Stern , Bartosz Golaszewski Subject: [PATCH v7 07/16] usb: core: Move struct usb_port and related APIs to port.h Date: Fri, 24 Jul 2026 16:43:16 +0800 Message-ID: <20260724084328.3943997-8-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog In-Reply-To: <20260724084328.3943997-1-wenst@chromium.org> References: <20260724084328.3943997-1-wenst@chromium.org> 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" |struct usb_port| and its matching container_of() macro should live in its own port.h, matching the split we have for .c files. Move them as described. Also move usb_port_is_power_on(), since in the next change its |struct usb_hub *| parameter will be changed to |struct usb_port *|, and becomes a non-static function that only references |struct usb_port|. port.h is only included from hub.h, as a subsequent patch will directly use fields from |struct usb_port| in a static inline helper in hub.h. The USB internal headers don't have header guards to help with this. Also drop 'extern' from the header declaration of usb_port_is_power_on(). This is not needed in modern C. Suggested-by: Andy Shevchenko Reviewed-by: Bartosz Golaszewski Reviewed-by: Andy Shevchenko Signed-off-by: Chen-Yu Tsai --- Changes since v4: - Dropped 'extern' (Andy) Changes since v3: - New patch (Andy) --- drivers/usb/core/hub.c | 16 ---------- drivers/usb/core/hub.h | 48 ++--------------------------- drivers/usb/core/port.c | 16 ++++++++++ drivers/usb/core/port.h | 68 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 86 insertions(+), 62 deletions(-) create mode 100644 drivers/usb/core/port.h diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 8f8624a0d36a..a6c4e4c0368a 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -3240,22 +3240,6 @@ static bool hub_port_stop_enumerate(struct usb_hub *= hub, int port1, int retries) return port_dev->ignore_event; } =20 -/* Check if a port is power on */ -int usb_port_is_power_on(struct usb_hub *hub, unsigned int portstatus) -{ - int ret =3D 0; - - if (hub_is_superspeed(hub->hdev)) { - if (portstatus & USB_SS_PORT_STAT_POWER) - ret =3D 1; - } else { - if (portstatus & USB_PORT_STAT_POWER) - ret =3D 1; - } - - return ret; -} - static void usb_lock_port(struct usb_port *port_dev) __acquires(&port_dev->status_lock) { diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h index 9ebc5ef54a32..de524c6da9fc 100644 --- a/drivers/usb/core/hub.h +++ b/drivers/usb/core/hub.h @@ -15,7 +15,9 @@ #include #include #include + #include "usb.h" +#include "port.h" =20 struct usb_hub { struct device *intfdev; /* the "interface" device */ @@ -78,51 +80,6 @@ struct usb_hub { struct list_head onboard_devs; }; =20 -/** - * struct usb port - kernel's representation of a usb port - * @child: usb device attached to the port - * @dev: generic device interface - * @port_owner: port's owner - * @peer: related usb2 and usb3 ports (share the same connector) - * @connector: USB Type-C connector - * @req: default pm qos request for hubs without port power control - * @connect_type: port's connect type - * @state: device state of the usb device attached to the port - * @state_kn: kernfs_node of the sysfs attribute that accesses @state - * @location: opaque representation of platform connector location - * @status_lock: synchronize port_event() vs usb_port_{suspend|resume} - * @portnum: port index num based one - * @is_superspeed cache super-speed status - * @usb3_lpm_u1_permit: whether USB3 U1 LPM is permitted. - * @usb3_lpm_u2_permit: whether USB3 U2 LPM is permitted. - * @early_stop: whether port initialization will be stopped earlier. - * @ignore_event: whether events of the port are ignored. - */ -struct usb_port { - struct usb_device *child; - struct device dev; - struct usb_dev_state *port_owner; - struct usb_port *peer; - struct typec_connector *connector; - struct dev_pm_qos_request *req; - enum usb_port_connect_type connect_type; - enum usb_device_state state; - struct kernfs_node *state_kn; - usb_port_location_t location; - struct mutex status_lock; - u32 over_current_count; - u8 portnum; - u32 quirks; - unsigned int early_stop:1; - unsigned int ignore_event:1; - unsigned int is_superspeed:1; - unsigned int usb3_lpm_u1_permit:1; - unsigned int usb3_lpm_u2_permit:1; -}; - -#define to_usb_port(_dev) \ - container_of(_dev, struct usb_port, dev) - extern int usb_hub_create_port_device(struct usb_hub *hub, int port1); extern void usb_hub_remove_port_device(struct usb_hub *hub, @@ -138,7 +95,6 @@ extern int usb_clear_port_feature(struct usb_device *hde= v, int port1, int feature); extern int usb_hub_port_status(struct usb_hub *hub, int port1, u16 *status, u16 *change); -extern int usb_port_is_power_on(struct usb_hub *hub, unsigned int portstat= us); =20 static inline bool hub_is_port_power_switchable(struct usb_hub *hub) { diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c index c0a51d9b06a6..b2e953f137f8 100644 --- a/drivers/usb/core/port.c +++ b/drivers/usb/core/port.c @@ -22,6 +22,22 @@ static int usb_port_block_power_off; =20 static const struct attribute_group *port_dev_group[]; =20 +/* Check if a port is power on */ +int usb_port_is_power_on(struct usb_hub *hub, unsigned int portstatus) +{ + int ret =3D 0; + + if (hub_is_superspeed(hub->hdev)) { + if (portstatus & USB_SS_PORT_STAT_POWER) + ret =3D 1; + } else { + if (portstatus & USB_PORT_STAT_POWER) + ret =3D 1; + } + + return ret; +} + static bool usb_port_allow_power_off(struct usb_device *hdev, struct usb_hub *hub, struct usb_port *port_dev) diff --git a/drivers/usb/core/port.h b/drivers/usb/core/port.h new file mode 100644 index 000000000000..00f7500af336 --- /dev/null +++ b/drivers/usb/core/port.h @@ -0,0 +1,68 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * usb hub driver head file + * + * Copyright (C) 1999 Linus Torvalds + * Copyright (C) 1999 Johannes Erdfelt + * Copyright (C) 1999 Gregory P. Smith + * Copyright (C) 2001 Brad Hards (bhards@bigpond.net.au) + * Copyright (C) 2012 Intel Corp (tianyu.lan@intel.com) + * + * move struct usb_port to this file. + */ + +#include +#include +#include +#include + +#include + +/** + * struct usb port - kernel's representation of a usb port + * @child: usb device attached to the port + * @dev: generic device interface + * @port_owner: port's owner + * @peer: related usb2 and usb3 ports (share the same connector) + * @connector: USB Type-C connector + * @req: default pm qos request for hubs without port power control + * @connect_type: port's connect type + * @state: device state of the usb device attached to the port + * @state_kn: kernfs_node of the sysfs attribute that accesses @state + * @location: opaque representation of platform connector location + * @status_lock: synchronize port_event() vs usb_port_{suspend|resume} + * @portnum: port index num based one + * @is_superspeed cache super-speed status + * @usb3_lpm_u1_permit: whether USB3 U1 LPM is permitted. + * @usb3_lpm_u2_permit: whether USB3 U2 LPM is permitted. + * @early_stop: whether port initialization will be stopped earlier. + * @ignore_event: whether events of the port are ignored. + */ +struct usb_port { + struct usb_device *child; + struct device dev; + struct usb_dev_state *port_owner; + struct usb_port *peer; + struct typec_connector *connector; + struct dev_pm_qos_request *req; + enum usb_port_connect_type connect_type; + enum usb_device_state state; + struct kernfs_node *state_kn; + usb_port_location_t location; + struct mutex status_lock; + u32 over_current_count; + u8 portnum; + u32 quirks; + unsigned int early_stop:1; + unsigned int ignore_event:1; + unsigned int is_superspeed:1; + unsigned int usb3_lpm_u1_permit:1; + unsigned int usb3_lpm_u2_permit:1; +}; + +#define to_usb_port(_dev) \ + container_of(_dev, struct usb_port, dev) + +struct usb_hub; + +int usb_port_is_power_on(struct usb_hub *hub, unsigned int portstatus); --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:53:11 2026 Received: from mail-pj1-f45.google.com (mail-pj1-f45.google.com [209.85.216.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 A64953EE1E5 for ; Fri, 24 Jul 2026 08:44:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882688; cv=none; b=HdPw9biKMEzkS0LTRyG6fZD6e32DNsGcCRBMFV4xOep5lsqvjRXcsBtXcEDBIkW5hRaklabj6I7mpC7E4dc2igC92TInqLIztnMlIqVbfzO0GspRh+x+kqtx100615J9PxK2asKZ7MwbF7Q/QIfWcva+Up/WhJ5es7O8Q6WXILE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882688; c=relaxed/simple; bh=uMqpD/0Y+buNT85mCET4vOpwigIs8u3oS1rlx2XlGCc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cKgB3TV+ryWNxWCE3WrzBJeiseLByq4qIJnuvz4TggGfjn9gGcVHoQZktK0dTW995LB2zWkBL2oQwtUMep4nyNivnQ8aCzJOczN2zoweE4c3C4uNGWXVKf93t/E/N7ZedsUXAlUzZrjdE9ADMP13PkyMSQpZpZoH6UxtE9lTD6M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=MUjExbfS; arc=none smtp.client-ip=209.85.216.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="MUjExbfS" Received: by mail-pj1-f45.google.com with SMTP id 98e67ed59e1d1-38ea87caafeso114508a91.3 for ; Fri, 24 Jul 2026 01:44:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784882685; x=1785487485; 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:content-type; bh=rURTZ+6KnrNnBGX3zC7u+30dtH0N63AaHeGxXuU8P7M=; b=MUjExbfSO7SZodhAHF9gY3skiCAFof7vEKleYWiDCa5SSvQFp20A7zQSIXBxnFUIGb //zA8t+Pkm98z45tC10CocXtFwrx7VSlUfCAO0jnia6h65j4AZb3eBCSCxgN5ji0kgoU IkblWSiFyqjy6+eq+4a/TmmKtiRB/K7bdN9m8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784882685; x=1785487485; 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:content-type; bh=rURTZ+6KnrNnBGX3zC7u+30dtH0N63AaHeGxXuU8P7M=; b=JVs48uMetM6n5RK43pvoxqOglO8LoJZ/era4vPCEk8EvUfmWzYSaxzi/0Mnw8uQZU5 b5MucPvPDwoJlDXv8CcoU5YhyrcWkXWuSOfhJzxMpLfdgKNhXGz9O4IIdptOpzOesX1+ lIX+7FQNo2Gg7xPIBKEvP7WQ7Y8nXzF9xYeloAh+b3sWRhneBoFXeiEiY9G5YuNo/oFs ovr4uR+pVUYs2qTnsUTaM9DITcGfpDM67mt9mu/GxK8N1NlXirSlgEIzPIkRvymfxmH/ pGCcw300idXmfozdgDV5HmowhoFRylfpJaCOYQlNd6HPZLhs8Nsl+SehhZiyRyjjzmdi 1SCQ== X-Forwarded-Encrypted: i=1; AHgh+RqHWoYCPDYEYK5Fapdpw6hU6nV6KYywlXl3/uexg7IP2+7CE3PrtK7loq/3r/Xh1AYJasu+ERovoo7Lolk=@vger.kernel.org X-Gm-Message-State: AOJu0YwaSGZRza1f8zrLBb6eJoeBBRhL4hTLg2W2qcXFxrfVp1SGtc1e FFVipDWJzwjTVywd+bE/w6ZNiIkfLNmwdphu/NnH4lHdtuWJbLLptzBEWBlaw/d6UQ== X-Gm-Gg: AR+sD10WFviCGSk1+6lquYyNt7GGsWi8KhGQxONzRN1ZUsP32SoPBPEHyqNSz4t9mam sd9DLQ3cYb4pTcAGmjxtgNqPmAahIRW9xJ882BqTn8yl4flPPTqxkzR5GvCUz17jmQ6K6Bmyyat lXTTfz5IX9zYs3Yg8WBbvhFCtK9/44TIsysVxRjCWoqBVNypBd16K3lsQwNb9nUQ3DMNMKab70u E2R7BB3hRPqQGxMYykOJYjgvpAZlUO1i8gZ6ACKQ4jGf24n2oTv1puPoYpmq7gIa1ZAVkIrHRJl U5Qv1y3qWZf7RHpKFvkS1zeVqLGMmXtMrVhQZbyxwD6tBmOns8MLfantz6iFtfquwvdaZ5vmRCO l4C9PvhOu70x/BednFwXJVCpt1v6UP4axylMhwiJSJFSEZRkxRmbraZXyHVclDppGddNVnUvx9H X5ZlS91OS6kLYV+ifStqeV7dJpXfDTXPDM0/JY5eCsJG6GCM6Blxat8fpSRQM= X-Received: by 2002:a17:90b:1c01:b0:38e:6ba9:5203 with SMTP id 98e67ed59e1d1-38ec658e6bcmr6608480a91.22.1784882685067; Fri, 24 Jul 2026 01:44:45 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:f131:86cc:5858:7325]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38f089ac6d8sm434546a91.2.2026.07.24.01.44.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 01:44:44 -0700 (PDT) From: Chen-Yu Tsai To: Bartosz Golaszewski , Greg Kroah-Hartman , Andy Shevchenko , Daniel Scally , Heikki Krogerus , Sakari Ailus , "Rafael J. Wysocki" , Danilo Krummrich , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno Cc: Wei Deng , Chen-Yu Tsai , linux-acpi@vger.kernel.org, driver-core@lists.linux.dev, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam , Alan Stern , Bartosz Golaszewski Subject: [PATCH v7 08/16] usb: hub: Pass |struct usb_port*| to usb_port_is_power_on() Date: Fri, 24 Jul 2026 16:43:17 +0800 Message-ID: <20260724084328.3943997-9-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog In-Reply-To: <20260724084328.3943997-1-wenst@chromium.org> References: <20260724084328.3943997-1-wenst@chromium.org> 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" usb_port_is_power_on() currently takes |struct usb_hub*|, but only needs it to tell if the hub/port is SuperSpeed or not. In a subsequent change, usb_port_is_power_on() needs access to a pwrseq state tracking field in |struct usb_port|. Either structure can be used to identify whether a port/hub is SuperSpeed or not, as the field in |struct usb_port| is inherited from the hub: port->is_superspeed =3D hub_is_superspeed(hub) Replace usb_port_is_power_on()'s |struct usb_hub*| parameter with |struct usb_port*| so a subsequent change can use it. Reviewed-by: Bartosz Golaszewski Reviewed-by: Andy Shevchenko Signed-off-by: Chen-Yu Tsai --- Changes since v3: - Adapted to move of usb_port_is_power_on() to port.c and port.h --- drivers/usb/core/hub.c | 7 ++++--- drivers/usb/core/port.c | 6 +++--- drivers/usb/core/port.h | 4 +--- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index a6c4e4c0368a..6671b5e45191 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -3291,7 +3291,7 @@ static int check_port_resume_type(struct usb_device *= udev, } /* Is the device still present? */ else if (status || port_is_suspended(hub, portstatus) || - !usb_port_is_power_on(hub, portstatus)) { + !usb_port_is_power_on(port_dev, portstatus)) { if (status >=3D 0) status =3D -ENODEV; } else if (!(portstatus & USB_PORT_STAT_CONNECTION)) { @@ -3733,12 +3733,13 @@ static int wait_for_connected(struct usb_device *ud= ev, struct usb_hub *hub, int port1, u16 *portchange, u16 *portstatus) { + struct usb_port *port_dev =3D hub->ports[port1 - 1]; int status =3D 0, delay_ms =3D 0; =20 while (delay_ms < 2000) { if (status || *portstatus & USB_PORT_STAT_CONNECTION) break; - if (!usb_port_is_power_on(hub, *portstatus)) { + if (!usb_port_is_power_on(port_dev, *portstatus)) { status =3D -ENODEV; break; } @@ -5434,7 +5435,7 @@ static void hub_port_connect(struct usb_hub *hub, int= port1, u16 portstatus, * but only if the port isn't owned by someone else. */ if (hub_is_port_power_switchable(hub) - && !usb_port_is_power_on(hub, portstatus) + && !usb_port_is_power_on(port_dev, portstatus) && !port_dev->port_owner) set_port_feature(hdev, port1, USB_PORT_FEAT_POWER); =20 diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c index b2e953f137f8..8d686d43e996 100644 --- a/drivers/usb/core/port.c +++ b/drivers/usb/core/port.c @@ -23,11 +23,11 @@ static int usb_port_block_power_off; static const struct attribute_group *port_dev_group[]; =20 /* Check if a port is power on */ -int usb_port_is_power_on(struct usb_hub *hub, unsigned int portstatus) +int usb_port_is_power_on(struct usb_port *port, unsigned int portstatus) { int ret =3D 0; =20 - if (hub_is_superspeed(hub->hdev)) { + if (port->is_superspeed) { if (portstatus & USB_SS_PORT_STAT_POWER) ret =3D 1; } else { @@ -114,7 +114,7 @@ static ssize_t disable_show(struct device *dev, } =20 usb_hub_port_status(hub, port1, &portstatus, &unused); - disabled =3D !usb_port_is_power_on(hub, portstatus); + disabled =3D !usb_port_is_power_on(port_dev, portstatus); =20 out_hdev_lock: usb_unlock_device(hdev); diff --git a/drivers/usb/core/port.h b/drivers/usb/core/port.h index 00f7500af336..2f4349b3ce6b 100644 --- a/drivers/usb/core/port.h +++ b/drivers/usb/core/port.h @@ -63,6 +63,4 @@ struct usb_port { #define to_usb_port(_dev) \ container_of(_dev, struct usb_port, dev) =20 -struct usb_hub; - -int usb_port_is_power_on(struct usb_hub *hub, unsigned int portstatus); +int usb_port_is_power_on(struct usb_port *port, unsigned int portstatus); --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:53:11 2026 Received: from mail-pj1-f51.google.com (mail-pj1-f51.google.com [209.85.216.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 280A63E075F for ; Fri, 24 Jul 2026 08:44:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882692; cv=none; b=SIe8GC+BLIHv60n2e8XaOqXtd4xLAr7SO+PZHG/ko0+AFoHFTTxMWwX8JUm/QsWjG9TRsRt3PD0w7MPaaFkT4kVs4dzb8CKB+bqhvVvfFAYTQ6VVa6suFbpl9yKPXlVG1spj8Bh+MX7TauT8igGfLCWTcOgjjgQW9P0AjuE2p6w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882692; c=relaxed/simple; bh=DyEec2Z7+FSSh+lvskH9h+/zSvQpOnJC1n/aL86DbdU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SA57aJHkwQpefzc8Ae2twsu7oeNbSOVqKRe2OVxqA0sTEDClUH0OMTqBtp1KNZrQKfSj+pNZLO5JFhwwVhDwQK75ul4V9nIP9G58RbYEPsc8KgCjR+QHyJi+W1JZ2LL69Br0p3NtIHneBGB0xKiVk0x1GNTh76rMZaGn9S8YYKY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=Ncvlba2Y; arc=none smtp.client-ip=209.85.216.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="Ncvlba2Y" Received: by mail-pj1-f51.google.com with SMTP id 98e67ed59e1d1-38dcbade417so169860a91.1 for ; Fri, 24 Jul 2026 01:44:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784882690; x=1785487490; 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:content-type; bh=f0rgL0VJ5kE0g1GPB7mxKos5pVHLgytmLF2hovXGdFw=; b=Ncvlba2YNu3OM1Xj6EntAJVtCNguGJud41Y1ZLDetGb0xnij4xGqWytxDzmF5/rv93 xfM42s+nITAVn0EHuFPgGj2FR3VEUqYFEgQDSJsNampMxHOCGH+yifOzBNIgAgxj5wWE U7bo7o1FdFjTOaBBOKbKpAgutiIKVw2LoPI54= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784882690; x=1785487490; 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:content-type; bh=f0rgL0VJ5kE0g1GPB7mxKos5pVHLgytmLF2hovXGdFw=; b=k2Mq8NDaTxFbK2TaDY5Wi8blWqbcuxxQjyMhslCm3pnBsEnV7YxAfPWwxIA1Z0WLOe b7051KclwOlF4DeYvErWHZ+UkiGcQZyA1ePjt11gHHXWfPBr2Kbk4LB5BzFLRQhIj3gO 2EzAcORyybA3OPv3ZS0gVKXLnfJGYZG5PSmuRHv+S+96G3KWX1BULKjAF6UL5gbDD0J3 wUuzuPdBNQZe8WdjoMU/xGDH5ctTCVhFSZLfP4L4argvMgIXHUSjdFGJzQApJIjgQXS3 ByuoMzRQ211VT8FKobvZ7IMhNUn7lsjGa56W5bW1Zk1rQgHtHV154EobAuxIYbhnc0cs +x+w== X-Forwarded-Encrypted: i=1; AHgh+Rp598GemdZeE09N7YxKMWI0rDMBi4B2RpYMR6zFG/Vn154TZFY6WWktjpruTk2Xyg0oaGyy2LNvTxGWR08=@vger.kernel.org X-Gm-Message-State: AOJu0Yx904POMigseKP3BcTQ10AJCyTDPDEH1OFbxYfP9ujxCvqnsnlG MtJzjIj/ntpYiuwqjL9Vo4qTIdV3c4Se6MU9oC7m/uwy8JGSrBOc7YUJ8NGUCMmvRQ== X-Gm-Gg: AR+sD11uDW/oGN8FCIWIusoJEptrOWQUzTWN7RmpjNmV/HoPBEEIvr0khYsMZ2WIjxX QNZhO+Mr0elVi+Fd6svciOhYFg4lkGUZM5p+tRVD36ajxwGAujJbDIes4TZumtmgyFrdkimiedM fK5ChVDvnXip0ejIY1GQ86HIEkKzeG37qFZ+c2nIxExkDgxkM/db2y+3Ss6t0r9FJ7W/cxNJJiM KAKYZiytI2ytlmoUcCU0kjzQuZ589/6LWy2Tadf/AN5/mrZ8D5lC3fNWU3LeO1NwOJydvXUJztb BV0vgznLZUeCfqS+pylUHO6aetm55y0zv3IrXYtd2ok29SNPy6s3Yl2uqYrUZBjxC6itPHNGufy yw2/30O58jPELLgZuPO1HFNJCtbmPoFRiM92CPSM0UpjZiMPvft+i9azzAGFbv9CBLEpEXofdTn ZwoCaIPUwC5sClINeDgagUC7dINJRkaahZTy0ipYbCXVeHNWhGqLpEREO8CDg= X-Received: by 2002:a17:90b:2750:b0:381:5ab5:b667 with SMTP id 98e67ed59e1d1-38ec6637d1amr6239942a91.31.1784882690591; Fri, 24 Jul 2026 01:44:50 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:f131:86cc:5858:7325]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38f089ac6d8sm434546a91.2.2026.07.24.01.44.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 01:44:49 -0700 (PDT) From: Chen-Yu Tsai To: Bartosz Golaszewski , Greg Kroah-Hartman , Andy Shevchenko , Daniel Scally , Heikki Krogerus , Sakari Ailus , "Rafael J. Wysocki" , Danilo Krummrich , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno Cc: Wei Deng , Chen-Yu Tsai , linux-acpi@vger.kernel.org, driver-core@lists.linux.dev, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam , Alan Stern , Bartosz Golaszewski Subject: [PATCH v7 09/16] usb: hub: Use usb_hub_set_port_power() to control port power everywhere Date: Fri, 24 Jul 2026 16:43:18 +0800 Message-ID: <20260724084328.3943997-10-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog In-Reply-To: <20260724084328.3943997-1-wenst@chromium.org> References: <20260724084328.3943997-1-wenst@chromium.org> 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" There are still some instances in the USB hub driver where port power is directly controlled by toggling the USB_PORT_FEAT_POWER feature flag. Switch these instances over to usb_hub_set_port_power() so that only one unified function to do this exists. This makes adding external power control with the power sequencing API easier and consistently applied. Reviewed-by: Bartosz Golaszewski Reviewed-by: Andy Shevchenko Signed-off-by: Chen-Yu Tsai --- Changes since v2: - New patch --- drivers/usb/core/hub.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 6671b5e45191..a5c5038e1604 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -976,11 +976,8 @@ static void hub_power_on(struct usb_hub *hub, bool do_= delay) dev_dbg(hub->intfdev, "trying to enable port power on " "non-switchable hub\n"); for (port1 =3D 1; port1 <=3D hub->hdev->maxchild; port1++) - if (test_bit(port1, hub->power_bits)) - set_port_feature(hub->hdev, port1, USB_PORT_FEAT_POWER); - else - usb_clear_port_feature(hub->hdev, port1, - USB_PORT_FEAT_POWER); + usb_hub_set_port_power(hub->hdev, hub, port1, + test_bit(port1, hub->power_bits)); if (do_delay) msleep(hub_power_on_good_delay(hub)); } @@ -5437,7 +5434,7 @@ static void hub_port_connect(struct usb_hub *hub, int= port1, u16 portstatus, if (hub_is_port_power_switchable(hub) && !usb_port_is_power_on(port_dev, portstatus) && !port_dev->port_owner) - set_port_feature(hdev, port1, USB_PORT_FEAT_POWER); + usb_hub_set_port_power(hdev, hub, port1, true); =20 if (portstatus & USB_PORT_STAT_ENABLE) goto done; --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:53:11 2026 Received: from mail-pj1-f42.google.com (mail-pj1-f42.google.com [209.85.216.42]) (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 5C94A3F58C8 for ; Fri, 24 Jul 2026 08:44:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882698; cv=none; b=TKDEFG5bK6uUYeRJQYrda/PhwQrT/ipRHy/u7dutRrQ2+MRtcDsduFRimF5sZdrAhrVAefepBKsZePTZ24XmJigqJygBKvQzVFgW4oz08lnnogLflrZkvko3bOLkjKI5rFYd0jpOvziyu+Vue6HM34Bmgm5j23Didf6HJQ0FZ6U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882698; c=relaxed/simple; bh=aUuLw/JjVlaF1Pm0+Z78/EMDS79ZJPDhP3FnA/d9XXE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pkj6EDDjFQccCOaY/ipTZ6ZOL6VG9elDlwy0q1+pYTKWvpZ0U6ZQloKyXFr09lCQYmYFBOSWouAqmGQURl8gefiX8keUwGuwG1lyKmvJhStNUE1LTijEAapwzK6bedBPFsKbmZhDGY0RRke4x/go2VuXz73AjXyue1HXSYrqMr8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=emDBzlh4; arc=none smtp.client-ip=209.85.216.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="emDBzlh4" Received: by mail-pj1-f42.google.com with SMTP id 98e67ed59e1d1-38e347638adso164369a91.0 for ; Fri, 24 Jul 2026 01:44:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784882696; x=1785487496; 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:content-type; bh=LyqISKB2QeL5cKlofFjBcNpbz2mlqW6leJkk5PbKN7k=; b=emDBzlh4K5PxCj5aWdf65F/X4UICQ00pKQwJw4wcoDsSQnKyKhMxIrcRenwENiLJhR S5KzicyHZYqiEMfVR8tUhaqXklORpHCo3pu6MfLKErL3otnQcmpgecPBAhidLqDl9Ozg p4HsE0W86mS0AJ7owxDZ4RqdHTT/hIu0X+5vQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784882696; x=1785487496; 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:content-type; bh=LyqISKB2QeL5cKlofFjBcNpbz2mlqW6leJkk5PbKN7k=; b=jhG54kDMGnSZs5IxRRfn+SqyQpTrmogXAb1vWlI+9Rqh10u/6H+rhGdH5Ff+nuPm9G xpChoCrTtCXdQpeqa1rQLPdbLMjKol7RrZBrpBz4bnmLk74hqQkruow0dISu/EUK7hTY dgZlyqWt/GiICUyZYyrNuyfmAcmBymu5OtiVKD3N7rxqOHgvomntKxIZCbIKK6Ye6XJl AOnREE03Uhxk6L7SDy+IB/HsRtiVNLbMa5BdpMszcVh2xsIlX2izMqpaCVLinbauKn73 t28KBWVr6hfMRWDd85AnP8CqSrZZslXpihW0staSI62mbR8q6SA8JyLPgYxaNjUKCXX4 bVaA== X-Forwarded-Encrypted: i=1; AHgh+RpK5WKCDPGw55ydixGQnz3JrcY0iXTxYzogQ7+IRJ0xWr5Vc/UZFHn8NgXlYY7ccCDmiXkQNKh3oVv7mc0=@vger.kernel.org X-Gm-Message-State: AOJu0Yxb433utgJ6fRKk20qRHPFlcbo/0r+D+cu4ldTYCexYggvujaVt k/JUwgTcEoW5/PTaYrwhGI1ZneKFPK870Vy5sIOQTn5KwiaGXxSUzCiCwtDghR0MFQ== X-Gm-Gg: AR+sD11oRUZat0iTFz3NTeGSaO5WVN6gjm9JfJ87jUS3LuUmGu1fy2wu00h9Qnz33r+ z53GOabw2ZOcZSrAXpJTCmqLS3MZ8GGsoDy7DuplxVB8DIbgqn3Q2/Eqk9U2h03e984MhLGr0Ix x62xQujBv8GXtJ/+D6OkFBTzVGKK0XaX5NZlnNYcbzVrEIqZGv2S82hhMUGc8SKiDx7VEQl0ll8 M6LO3/U1lud7GCKiX6IQFARDop5VU0XkeDj/+bVuJQO+L5ePFxxaJNcOYGizqSRaDBbrY3UYIkC pu6EEBe+7YzZ4cxAyXrJ40FkMkpjmqOCKhASkkf9YlFoE1QeDhV8ylYTOVLzl0xyOOrtjVUiAKU tPPUJr/ARVAl/jARQND5BZRLE1XTBR+SxfrcR17CQVPc2cOL/WaCU8xqitkabl2Cg9/GJ3MWHPF Z+ni+/5Gqw2X6T4EVrqYckcc6lNllLs/7SsTKVVHC5JKmlLW0w+Kvu4PDs+L4= X-Received: by 2002:a17:90b:384e:b0:38f:1dc:672f with SMTP id 98e67ed59e1d1-38f01dc69e2mr3335979a91.18.1784882695611; Fri, 24 Jul 2026 01:44:55 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:f131:86cc:5858:7325]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38f089ac6d8sm434546a91.2.2026.07.24.01.44.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 01:44:55 -0700 (PDT) From: Chen-Yu Tsai To: Bartosz Golaszewski , Greg Kroah-Hartman , Andy Shevchenko , Daniel Scally , Heikki Krogerus , Sakari Ailus , "Rafael J. Wysocki" , Danilo Krummrich , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno Cc: Wei Deng , Chen-Yu Tsai , linux-acpi@vger.kernel.org, driver-core@lists.linux.dev, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam , Alan Stern , Bartosz Golaszewski Subject: [PATCH v7 10/16] usb: hub: Power on connected M.2 E-key connectors with power sequencing API Date: Fri, 24 Jul 2026 16:43:19 +0800 Message-ID: <20260724084328.3943997-11-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog In-Reply-To: <20260724084328.3943997-1-wenst@chromium.org> References: <20260724084328.3943997-1-wenst@chromium.org> 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 new M.2 E-key connector can have a USB connection. For the USB device on this connector to work, its power must be enabled and the W_DISABLE2# signal deasserted. The connector driver handles this and provides a toggle over the power sequencing API. This feature currently only supports a directly connected (no mux in between) M.2 E-key connector. Existing USB connector types are not covered. The USB A connector was recently added to the onboard devices driver. USB B connectors have historically been managed by the USB gadget or dual-role device controller drivers. USB C connectors are handled by TCPM drivers. The power sequencing API does not know whether a power sequence provider is not needed or not available yet, so we only request it for connectors that we know need it, which at this time is just the E-key connector. On the USB side, the port firmware node (if present) is tied to the usb_port device. This device is used to acquire the power sequencing descriptor. This allows the provider to tell the different ports on one hub apart. This feature is not implemented in the onboard USB devices driver. The power sequencing API expects the consumer device to make the request, but there is no device node to instantiate a platform device to tie the driver to. The connector is not a child node of the USB host or hub, and the graph connection is from a USB port to the connector. And the connector itself already has a driver. Power sequencing is not directly enabled in the connector driver as that would completely decouple the timing of it from the USB subsystem. It would not be possible for the USB subsystem to toggle the power for a power cycle or to disable the port. Sashiko mentions possible use-after-free of hub->ports from the sysfs callbacks. This is actually not possible, since the sysfs callbacks acquire the hub device and its lock, and then check if it is in the process of disconnect / removal. If it is, then the callbacks just error out. Reviewed-by: Bartosz Golaszewski Signed-off-by: Chen-Yu Tsai --- Changes since v6: - Added braces ("{}") to for loop in hub_is_port_power_switchable() (Andy) - Adapted usb_port_is_power_on() to new pwrseq_get_state() function return values (Bartosz) Changes since v5: - Only assign port_dev->pwrseq if successfully retrieved pwrseq descriptor (Andy) - Dropped the pwrseq error pointer check in the release function (Andy) - Added check for port->pwrseq !=3D NULL before calling pwrseq_is_power_on() (API change in patch 3) Changes since v4: - Rewrote usb_port_is_power_on() to better express intent and restrictions of pwrseq API (Andy) - Switched to dev_fwnode() in port_pwrseq_is_supported() (Andy) - Added blank line separating normal variable declarations and __free() type declarations (Andy) - Split out assign_bit() rewrite (Andy) - Moved pwrseq_put() to release function to avoid UAF (Sashiko) - Added back pwrseq_power_off() call in usb_hub_remove_port_device(); otherwise power off could be delayed to object release - Don't clear hub->ports[port1 - 1] in main error path; by that time the port device is registered and sysfs attributes are available to userspace (Sashiko) Changes since v3: - Adapted to move of usb_port_is_power_on() to port.c and port.h - Simplified usb_hub_set_port_pwrseq() (Andy) - Renamed usb_hub_set_port_pwrseq()'s "set" parameter to "on" - Dropped usb_hub_restore_port_pwrseq() (use usb_hub_set_port_pwrseq() with inverted argument) - Fixed off-by-one access in hub_is_port_power_switchable() (Sashiko) - Assign retval from dev_err_probe() instead of the other way around (Andy) - Clear hub->ports[port1 - 1] in USB port error and remove paths to avoid other threads from accidental UAF while the USB hub device is being unwound (Sashiko) - Short-circuit out of helpers if !IS_ENABLED(CONFIG_POWER_SEQUENCING) to avoid errors from stub functions (Sashiko) Changes since v2: - Expanded subject to mention power sequencing API - Dropped commit message bit about power sequencing Kconfig symbol change to bool - Added optional dependency on POWER_SEQUENCING to USB - Split out pwrseq_power_*() calls into separate helpers - Rewrote set_bit() and clear_bit() branches with assign_bit() - Dropped the pwrseq_power_off() before pwrseq_put(): pwrseq_put() does it automatically. - Removed pwrseq_power_on() from usb_hub_create_port_device(); it will get called through usb_hub_set_port_power() in hub_activate(). - Added checks for port->pwrseq in hub_is_port_power_switchable() - Use separate pwrseq descriptors for HighSpeed and SuperSpeed ports. This makes things simpler. On the other hand to power cycle a port userspace needs to toggle it on both the HS and SS ports together. - Dropped pwrseq state tracking again The power sequencing consumer API already tracks the state internally; doing it again in |struct usb_port| is not necessary especially now that the descriptors aren't shared. It's unclear to me how actual hubs reconcile USB_PORT_FEAT_POWER settings from the HS side and SS side. One hub chip vendor said that VBUS_EN for a port is on if the flag is set on either side; however actually testing on one of their hubs showed that VBUS was cut as soon as the flag is cleared on the HS port. Maybe it could be different if a SS device was connected? That scenario was not tested. Testing on another retail bought hub seemed to work exactly as described though: USB_PORT_FEAT_POWER needed to be clear on both HS and SS ports to turn off VBUS. Under this scheme, I'm not sure how the power cycle in hub_port_connect() would work correctly. - Link to v2: https://lore.kernel.org/all/20260610084053.2059858-1-wenst@chromium.org/ Changes since v1: - Switch to fwnode instead of OF - Tie port@ fwnode to usb_port device - Move remote node compatible checking to separate helper - Use usb_port device to request power sequencing descriptor - Drop "index" parameter from pwrseq_get() - Do not get pwrseq descriptor for SuperSpeed port; share one for one physical port - Add pwrseq state tracking - Link to v1: https://lore.kernel.org/all/20260515090149.3169406-1-wenst@chromium.org/ --- drivers/usb/Kconfig | 1 + drivers/usb/core/hub.c | 20 ++++++++++++- drivers/usb/core/hub.h | 10 ++++++- drivers/usb/core/port.c | 62 ++++++++++++++++++++++++++++++++++++++++- drivers/usb/core/port.h | 2 ++ 5 files changed, 92 insertions(+), 3 deletions(-) diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig index abf8c6cdea9e..ef1959363fb1 100644 --- a/drivers/usb/Kconfig +++ b/drivers/usb/Kconfig @@ -44,6 +44,7 @@ config USB_ARCH_HAS_HCD config USB tristate "Support for Host-side USB" depends on USB_ARCH_HAS_HCD + depends on POWER_SEQUENCING if POWER_SEQUENCING select GENERIC_ALLOCATOR select USB_COMMON select NLS # for UTF-8 strings diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index a5c5038e1604..35e035cfeb4d 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -33,6 +33,7 @@ #include #include #include +#include #include =20 #include @@ -875,6 +876,16 @@ static void hub_tt_work(struct work_struct *work) spin_unlock_irqrestore(&hub->tt.lock, flags); } =20 +static int usb_hub_set_port_pwrseq(struct usb_port *port, bool on) +{ + if (!IS_ENABLED(CONFIG_POWER_SEQUENCING)) + return 0; + + if (on) + return pwrseq_power_on(port->pwrseq); + return pwrseq_power_off(port->pwrseq); +} + /** * usb_hub_set_port_power - control hub port's power state * @hdev: USB device belonging to the usb hub @@ -890,15 +901,22 @@ static void hub_tt_work(struct work_struct *work) int usb_hub_set_port_power(struct usb_device *hdev, struct usb_hub *hub, int port1, bool set) { + struct usb_port *pwrseq_port =3D hub->ports[port1 - 1]; int ret; =20 + ret =3D usb_hub_set_port_pwrseq(pwrseq_port, set); + if (ret) + return ret; + if (set) ret =3D set_port_feature(hdev, port1, USB_PORT_FEAT_POWER); else ret =3D usb_clear_port_feature(hdev, port1, USB_PORT_FEAT_POWER); =20 - if (ret) + if (ret) { + usb_hub_set_port_pwrseq(pwrseq_port, !set); return ret; + } =20 assign_bit(port1, hub->power_bits, set); return 0; diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h index de524c6da9fc..3f403a56e5f7 100644 --- a/drivers/usb/core/hub.h +++ b/drivers/usb/core/hub.h @@ -103,7 +103,15 @@ static inline bool hub_is_port_power_switchable(struct= usb_hub *hub) if (!hub) return false; hcs =3D hub->descriptor->wHubCharacteristics; - return (le16_to_cpu(hcs) & HUB_CHAR_LPSM) < HUB_CHAR_NO_LPSM; + if ((le16_to_cpu(hcs) & HUB_CHAR_LPSM) < HUB_CHAR_NO_LPSM) + return true; + /* check for controllable external power sequencers */ + for (unsigned int i =3D 0; i < hub->hdev->maxchild; i++) { + if (hub->ports[i] && hub->ports[i]->pwrseq) + return true; + } + + return false; } =20 static inline int hub_is_superspeed(struct usb_device *hdev) diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c index 8d686d43e996..c0490f616c23 100644 --- a/drivers/usb/core/port.c +++ b/drivers/usb/core/port.c @@ -8,11 +8,14 @@ */ =20 #include +#include #include #include #include #include #include +#include +#include #include #include =20 @@ -26,6 +29,7 @@ static const struct attribute_group *port_dev_group[]; int usb_port_is_power_on(struct usb_port *port, unsigned int portstatus) { int ret =3D 0; + int pwrseq_state; =20 if (port->is_superspeed) { if (portstatus & USB_SS_PORT_STAT_POWER) @@ -35,7 +39,13 @@ int usb_port_is_power_on(struct usb_port *port, unsigned= int portstatus) ret =3D 1; } =20 - return ret; + /* stub function returns error */ + pwrseq_state =3D pwrseq_get_state(port->pwrseq); + /* fall back to port status if pwrseq is in unknown state */ + if (pwrseq_state < 0 || pwrseq_state =3D=3D PWRSEQ_STATE_UNKNOWN) + return ret; + + return ret && pwrseq_state =3D=3D PWRSEQ_STATE_ON; } =20 static bool usb_port_allow_power_off(struct usb_device *hdev, @@ -45,6 +55,9 @@ static bool usb_port_allow_power_off(struct usb_device *h= dev, if (hub_is_port_power_switchable(hub)) return true; =20 + if (port_dev->pwrseq) + return true; + if (!IS_ENABLED(CONFIG_ACPI)) return false; =20 @@ -380,6 +393,8 @@ static void usb_port_device_release(struct device *dev) * device_platform_notify_remove() in device_del(). */ fwnode_handle_put(dev_fwnode(dev)); + /* usb_hub_create_port_device() could leave an error value */ + pwrseq_put(port_dev->pwrseq); kfree(port_dev->req); kfree(port_dev); } @@ -772,11 +787,46 @@ static const struct component_ops connector_ops =3D { .unbind =3D connector_unbind, }; =20 +static bool port_pwrseq_is_supported(struct usb_port *port_dev) +{ + struct device *dev =3D &port_dev->dev; + struct fwnode_handle *port =3D dev_fwnode(dev); + + struct fwnode_handle *ep __free(fwnode_handle) =3D + fwnode_graph_get_next_port_endpoint(port, NULL); + if (!ep) + return false; + + struct fwnode_handle *remote __free(fwnode_handle) =3D + fwnode_graph_get_remote_port_parent(ep); + if (!remote) + return false; + + if (!fwnode_device_is_compatible(remote, "pcie-m2-e-connector")) { + dev_dbg(dev, "remote endpoint %pfw is not a supported connector", remote= ); + return false; + } + + return true; +} + +static struct pwrseq_desc *usb_hub_port_pwrseq_get(struct usb_port *port_d= ev) +{ + if (!IS_ENABLED(CONFIG_POWER_SEQUENCING)) + return NULL; + + if (!port_pwrseq_is_supported(port_dev)) + return NULL; + + return pwrseq_get(&port_dev->dev, "usb"); +} + int usb_hub_create_port_device(struct usb_hub *hub, int port1) { struct usb_port *port_dev; struct usb_device *hdev =3D hub->hdev; struct fwnode_handle *fwnode =3D dev_fwnode(&hdev->dev); + struct pwrseq_desc *pwrseq; int retval; =20 port_dev =3D kzalloc_obj(*port_dev); @@ -827,6 +877,7 @@ int usb_hub_create_port_device(struct usb_hub *hub, int= port1) retval =3D device_register(&port_dev->dev); if (retval) { put_device(&port_dev->dev); + hub->ports[port1 - 1] =3D NULL; return retval; } =20 @@ -844,6 +895,14 @@ int usb_hub_create_port_device(struct usb_hub *hub, in= t port1) goto err_put_kn; } =20 + pwrseq =3D usb_hub_port_pwrseq_get(port_dev); + if (IS_ERR(pwrseq)) { + retval =3D dev_err_probe(&port_dev->dev, PTR_ERR(pwrseq), + "failed to get power sequencing descriptor\n"); + goto err_put_kn; + } + port_dev->pwrseq =3D pwrseq; + retval =3D component_add(&port_dev->dev, &connector_ops); if (retval) { dev_warn(&port_dev->dev, "failed to add component\n"); @@ -901,6 +960,7 @@ void usb_hub_remove_port_device(struct usb_hub *hub, in= t port1) peer =3D port_dev->peer; if (peer) unlink_peers(port_dev, peer); + pwrseq_power_off(port_dev->pwrseq); component_del(&port_dev->dev, &connector_ops); sysfs_put(port_dev->state_kn); device_unregister(&port_dev->dev); diff --git a/drivers/usb/core/port.h b/drivers/usb/core/port.h index 2f4349b3ce6b..088a182332d4 100644 --- a/drivers/usb/core/port.h +++ b/drivers/usb/core/port.h @@ -25,6 +25,7 @@ * @port_owner: port's owner * @peer: related usb2 and usb3 ports (share the same connector) * @connector: USB Type-C connector + * @pwrseq: power sequencing descriptor for the port * @req: default pm qos request for hubs without port power control * @connect_type: port's connect type * @state: device state of the usb device attached to the port @@ -44,6 +45,7 @@ struct usb_port { struct usb_dev_state *port_owner; struct usb_port *peer; struct typec_connector *connector; + struct pwrseq_desc *pwrseq; struct dev_pm_qos_request *req; enum usb_port_connect_type connect_type; enum usb_device_state state; --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:53:11 2026 Received: from mail-pj1-f45.google.com (mail-pj1-f45.google.com [209.85.216.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 41BE03E3163 for ; Fri, 24 Jul 2026 08:45:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882703; cv=none; b=DIQa0Q8GaTOufACLJF2eKpABoSGMOVVoyLAOfulkaG7cIcD3ZOSPPgT5GVn/HloxzHyrLALZPtaoc7XQuiFk7xh1uWU/9LZ9DOgGNMH+phEkMMcdpwXQRG7RQ0RPfUu3iYtc0ScvJ0g2Bw20zXkcuCYwateb+HJpmDvgmUjue6s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882703; c=relaxed/simple; bh=Weo+Ui8E43MHQNrKTqB+K8VGg2TvPBPQ6D1g4YfmF4g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hi2nST6xsdXzSnDwXQFlM+6gqgn08UZw0W7sLhMg9c8vr95iNeoJxXZ6bkauPqc3vnnAIYrl734NgZq6Qbe22x4fvuUDDsZr/hrl0EbQEOvy0v6X2cnWUQtNuCXnsGc9RmAcItzn66BrgUatrUDYD2Xv84k6LhtGIXEEIerrZss= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=eEH8NjHx; arc=none smtp.client-ip=209.85.216.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="eEH8NjHx" Received: by mail-pj1-f45.google.com with SMTP id 98e67ed59e1d1-38e3efab7e0so137572a91.0 for ; Fri, 24 Jul 2026 01:45:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784882701; x=1785487501; 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:content-type; bh=HbHZBlGJIBZH9w4CnNEDqTFXqQ2V4R1HGaboHmDjj7s=; b=eEH8NjHxdbQ4AzHsBEZRYGZUyiY8pMiQTx3ef7+ZNkeVWAJMFIpp55gIpBVDIyDTTm 7x37H6Q80oqvnFsqIuhMdkihsXSqLb31/ML/PxJuDa6h67Z5SK2+efCvC30Qz0W73IKF ASLrFJziTRsKXt0YJFXXcXXlFA7kRGE/jGvk0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784882701; x=1785487501; 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:content-type; bh=HbHZBlGJIBZH9w4CnNEDqTFXqQ2V4R1HGaboHmDjj7s=; b=bEBrxJg/PPC3uhRxR006JF+FmHmOGHoBIAdNKkFJLdS0X/cdIaQ8bL5LzteFoStTHY R4+BiwlciFHkJgcoUFkKwj5d2b65b9lISxXrYzKaF+2xP+TuTOBl3VVL9M41hQwI6at9 2msby5Bs2+BNRdM/aMBvrbZNHidGTJx1KKzkVB46f2BP8skGDBgzX6AlEGm38yHaLhL8 Ujrg4go04gIBHuauvyvM7YTCnyhfbea6sfWtYuY0+HWqafiPP3srmJUxnPVRnowthFbb xi1bgT26LgB5vfxmSt3/Pt7T2u0a4RclBdtRDQojGGX10BbmzEZnUH3St3AMnbAjaqDk pw5g== X-Forwarded-Encrypted: i=1; AHgh+Rp8dDTyAknv4bYdEncXp2O3KwI2HBCSnilnM6AsUdIvnlKke4RNg+YzCMKVpdp3P0cnpqxySTvQvn2JA00=@vger.kernel.org X-Gm-Message-State: AOJu0YzqjiQZIposJx9woXrpwYtBDkA7hQfFh1WqX/LRpV1qwqB0sYyI doLIz2GOMDMA9DEPp3D4e0wyyVjVBHTyAxfQiv6dbvCEV4Y6FzXXihEBdi2Qk6CkPA== X-Gm-Gg: AR+sD11j8v7dlACF78Zt8VuR1gtrzlrIpPUDzqzum7jD8zoFFujFjpfaIjvR+cjPFAG 5NB1pOi15zljwCw3Rda/kxOFkHxtJK6z7gUc8rDX0d7bhP/6IPDLkYbQWZgDPqEAuOhzvRmq3j5 Gm5RkeqDEUsP0XMFCcwdnKo89ImdmhHnRSc5WKVjUD/H2VUXUJxK4IRb+yK07GYIVbEaoUIYtit ng7B1p+t8l9NcOcVSQy9LYBr5NkILDholgQ/JxEF4IC7xS6HH/KOtQdRvrTJcTXG95wgMIj1OfF Sj88WkMy3mvv6Gcyhho609vZ6lqKd6eFZznBFqmlZ0xa5aJTLDbBMkNV13pkNXKrlBWMGuuhbKM uXWv/I+zZdW6qPk9NnnuAA02hWpOEKDwlzt253aPlMf2e/r5P8of5uaI7TdsUK0vfObp7vjb7r2 AfmJX5NLtY3wZR/ZQ+VFvqLdcMZQt58cFPOf7wPKuY7eSME9iWNYoCxVCL0Jo= X-Received: by 2002:a17:90b:4d08:b0:38d:eaed:4adb with SMTP id 98e67ed59e1d1-38ec85cb1b9mr5733586a91.20.1784882700981; Fri, 24 Jul 2026 01:45:00 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:f131:86cc:5858:7325]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38f089ac6d8sm434546a91.2.2026.07.24.01.44.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 01:45:00 -0700 (PDT) From: Chen-Yu Tsai To: Bartosz Golaszewski , Greg Kroah-Hartman , Andy Shevchenko , Daniel Scally , Heikki Krogerus , Sakari Ailus , "Rafael J. Wysocki" , Danilo Krummrich , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno Cc: Wei Deng , Chen-Yu Tsai , linux-acpi@vger.kernel.org, driver-core@lists.linux.dev, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam , Alan Stern , Krzysztof Kozlowski , Bartosz Golaszewski Subject: [PATCH v7 11/16] dt-bindings: usb: mediatek,mtk-xhci: Switch to ports for USB connections Date: Fri, 24 Jul 2026 16:43:20 +0800 Message-ID: <20260724084328.3943997-12-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog In-Reply-To: <20260724084328.3943997-1-wenst@chromium.org> References: <20260724084328.3943997-1-wenst@chromium.org> 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" This reverts commit 454a1e3cd36c113341d7b71e8e691c6e47ab4a8a. MediaTek's XHCI implementation supports both USB 2.0 High Speed (HS) and USB 3.x Super Speed (SS). The block can also be synthesized with either HS-only capability or HS+SS capability. The SSUSB controller handles the device or gadget mode. Saying that SSUSB handles the HS portion is wrong. For example, on the MT8195, the first two instances support both HS and SS, while the latter two instances support only HS. Switch to a "ports" sub-node for describing USB connections. Port 1 is Super Speed if the controller is SS-capable, otherwise it is High Speed. Port 2 is High Speed if SS-capable. This port mapping scheme directly matches what the hardware returns in its capability registers. Fixes: 454a1e3cd36c ("dt-bindings: usb: mediatek,mtk-xhci: Add port for Sup= erSpeed EP") Cc: AngeloGioacchino Del Regno Reviewed-by: Krzysztof Kozlowski Reviewed-by: Bartosz Golaszewski Signed-off-by: Chen-Yu Tsai --- Changes since v1: - Squashed DT binding revert and addition together - Dropped reviewed-by from Bartosz --- .../bindings/usb/mediatek,mtk-xhci.yaml | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/Documentation/devicetree/bindings/usb/mediatek,mtk-xhci.yaml b= /Documentation/devicetree/bindings/usb/mediatek,mtk-xhci.yaml index 231e6f35a986..d6c75bd20b78 100644 --- a/Documentation/devicetree/bindings/usb/mediatek,mtk-xhci.yaml +++ b/Documentation/devicetree/bindings/usb/mediatek,mtk-xhci.yaml @@ -107,10 +107,6 @@ properties: - description: USB3/SS(P) PHY - description: USB2/HS PHY =20 - port: - $ref: /schemas/graph.yaml#/properties/port - description: Super Speed (SS) Output endpoint to a Type-C connector - vusb33-supply: description: Regulator of USB AVDD3.3v =20 @@ -188,6 +184,19 @@ properties: "#size-cells": const: 0 =20 + ports: + $ref: /schemas/graph.yaml#/properties/ports + + properties: + port@1: + $ref: /schemas/graph.yaml#/properties/port + description: Super Speed (SS) data bus if SS-capable; + otherwise High Speed (HS) data bus. + + port@2: + $ref: /schemas/graph.yaml#/properties/port + description: High Speed (HS) data bus if controller is SS-capable. + patternProperties: "@[0-9a-f]{1}$": type: object --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:53:11 2026 Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.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 D5175400962 for ; Fri, 24 Jul 2026 08:45:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882708; cv=none; b=AmmDQh6ge5gLH5ol/OZOUgYQFH3W2ep4wVPrVnzCkKz1/4AVMCF+06bW+FY1/EaGd8lf6ja2V3D8ujSBF5Y7PRqehVOySCDVtMwtlcOMl+NQEk6EYKE3Pa+Uz/7WOEqfo9Erz+kKblQufkuVYRBHzRA2OXGkwlqXF5UBlaaNm9U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882708; c=relaxed/simple; bh=TPxqymmswATTFY0Ts3z5ZJsgeicU9hkYXr5TZUF7F/U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bk3kXrsI1ZlJY9XmL/xe1B/4jhzBnbWk6rG/gFXF6Q4mLwGo2YJeAhaD45Du307Cn9LbiU6BOfkJvA9unI+8K0q7H/gqEU9e+NWCh7a708W12CLQXYqGh1zD5wVSknAlOAutDdPwOz6T18XAUrWpGwfzxOLzd/xkQr7rSynYWKw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=OTRGJfbX; arc=none smtp.client-ip=209.85.216.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="OTRGJfbX" Received: by mail-pj1-f46.google.com with SMTP id 98e67ed59e1d1-38e58034d05so163953a91.2 for ; Fri, 24 Jul 2026 01:45:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784882706; x=1785487506; 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:content-type; bh=52TzlozFyu8oOUFzVHVO43WIZLgCMoBqx/sMPHBx7bQ=; b=OTRGJfbXn6jlSMk0TKof54mYgUxVw6F9PMX9UQsE2cl0RhwkwKlxL3ZFkxugqKrOT/ szNNkxjpyjIQF3zJT5LWWbYpCA8UZnpIK9NWvPwRWBExJd50d/LP0+zReVinM81Te2cq O5sJ5bxGjX7PDid0h/La5V1oIObWhcH0CY5VY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784882706; x=1785487506; 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:content-type; bh=52TzlozFyu8oOUFzVHVO43WIZLgCMoBqx/sMPHBx7bQ=; b=JMS37QKJI2rC01HvzU5WzZJGZ6ZVMhrknO0rUVRmsashciJ/4XZdaEe9TWoVXV4pei 2hmhsPbZR0piDFB7SbD3BbT2Sk0NDY4Oc4BO1MPuTFGQ/wmYidbIz7FiZgZvak0A23wE JI8Op/X3SW/XmcrrZ4MHh3Wjmxd+ZetpyRrsHEi2226FmyZ9KJbqz5uP/VtkeRw7zzO0 N1ct9LJOrv77ZpgQG4PN9RdGVHSP2wq+JjoNfaGZKc0H7wl0Rcjim8VIJdFFtrj0nHAT N3loW6uxVjeqX/hhwQSkHb93VRwa+M1O1UiLfoddP3iyiPB4o5QPhFx+LwoYzTD/223a sF+g== X-Forwarded-Encrypted: i=1; AHgh+RrlYp7fqr95ZegNhx3jGIjWOFq1PK9scz2VxExWcdyHF+/8KchiC69NqtkWwGQQQNjI4e7eETQG2KmP1wE=@vger.kernel.org X-Gm-Message-State: AOJu0YzjfdVPhpiYB4pyMH2MZd6PmIKR+SEUHH8vCHHUObLGQtS3EaAZ WlJsfSemvTTNmjG2xtnBV7KLyVZQrpd6x1AsdQRhfYqG9YTebvwBIoZrRjy4gWtJTA== X-Gm-Gg: AR+sD13NmvOA68ZOJVbY5Ro829nFbP+MTKK8L85InyTcHXU+O/cZxkgvW3GlwPv0FV/ 1y3z0QdfmB0UJRh2hxEHb6tVn04HRQ+sExEV4RdSGYai/I714uazkYrKMdaxeblSwFTLi/E1RcG eqdRV8IlV1ccLJJtWkn9n8rK6NrXS4v2elKlM7Zz4ffu+RTSaK66aVxprzMSpD7Zwk12semIdlu 49oIsKB8LJUWZmtalu2sYShOCDHyAK7rp5MKFsfUyoBqenMTqHnZmQa+fs8Dod4OXRw3PcS08k/ yHZdLieFpHOOG+Oolf+M4xerEPR93qukM9j9l0OLrwp4Puduf+9vKY0h/GFCB6+Pu4cWK6yys2l lytbMg8Lr4qLOuo6ORxJj8t/LAGJvGXU84l9VjfAJJPlsAH5VsUMkSj4TDjhh/GBWjh7+aBqVAo xWeJZIGrWU9QpywH2t+MV/tV5Ul88vcns+7dz6jZEvcqxqqSRqIeHJSjfKpI8= X-Received: by 2002:a17:90b:5687:b0:387:e0bb:57f8 with SMTP id 98e67ed59e1d1-38ec6a9d77bmr7085311a91.41.1784882706348; Fri, 24 Jul 2026 01:45:06 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:f131:86cc:5858:7325]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38f089ac6d8sm434546a91.2.2026.07.24.01.45.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 01:45:05 -0700 (PDT) From: Chen-Yu Tsai To: Bartosz Golaszewski , Greg Kroah-Hartman , Andy Shevchenko , Daniel Scally , Heikki Krogerus , Sakari Ailus , "Rafael J. Wysocki" , Danilo Krummrich , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno Cc: Wei Deng , Chen-Yu Tsai , linux-acpi@vger.kernel.org, driver-core@lists.linux.dev, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam , Alan Stern Subject: [PATCH v7 12/16] power: sequencing: pcie-m2: support matching on remote "port" node Date: Fri, 24 Jul 2026 16:43:21 +0800 Message-ID: <20260724084328.3943997-13-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog In-Reply-To: <20260724084328.3943997-1-wenst@chromium.org> References: <20260724084328.3943997-1-wenst@chromium.org> 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" A USB hub can have multiple ports, and this driver needs to differentiate which port is being matched to. The USB hub driver now associates the "port" node with the usb_port device, so here we can use the remote "port" node to check for a match. Then fall back to the remote device node for the other connection types. Also rewrite the existing "remote =3D=3D dev_of_node(dev)" with device_match_of_node() for consistency. Signed-off-by: Chen-Yu Tsai --- Changes since v4: - Dropped blank line between __free() variable declaration and subsequent use of the variable in conditional Changes since v3: - Drop redundant device node validity check; device_match_of_node() does it internally Changes since v2: - Use device_match_of_node() --- drivers/power/sequencing/pwrseq-pcie-m2.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/power/sequencing/pwrseq-pcie-m2.c b/drivers/power/sequ= encing/pwrseq-pcie-m2.c index 83fe6a1396bc..691cad0a6dd0 100644 --- a/drivers/power/sequencing/pwrseq-pcie-m2.c +++ b/drivers/power/sequencing/pwrseq-pcie-m2.c @@ -175,9 +175,16 @@ static int pwrseq_pcie_m2_match(struct pwrseq_device *= pwrseq, * parent matches the OF node of 'dev'. */ for_each_endpoint_of_node(ctx->of_node, endpoint) { + /* USB port devices are tied to the port nodes. */ + struct device_node *remote_port __free(device_node) =3D + of_graph_get_remote_port(endpoint); + if (device_match_of_node(dev, remote_port)) + return PWRSEQ_MATCH_OK; + + /* Try the remote port parent for other types. */ struct device_node *remote __free(device_node) =3D of_graph_get_remote_port_parent(endpoint); - if (remote && (remote =3D=3D dev_of_node(dev))) + if (device_match_of_node(dev, remote)) return PWRSEQ_MATCH_OK; } =20 --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:53:11 2026 Received: from mail-pj1-f45.google.com (mail-pj1-f45.google.com [209.85.216.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 58C4B3515F9 for ; Fri, 24 Jul 2026 08:45:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882714; cv=none; b=QZTF76H5W9/iUHCkz0NUoHUl8libOJZKOcnYiSLNO+S31ia9Mpal+IuwETedTiqUkPDEfADf24suYz1i9cVs/ftE2LgZ/RVMCVPMJdVpZwsflc8xBAJ5c61mCtXmMPyBEdSNDrlfAW1TB2qWDVBLWfwH//cVknT8N6tsWRYZiLo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882714; c=relaxed/simple; bh=v0+Tz2myQW41rIDpdJevWmH+Rji/Co2WNAU+Key/38U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=L0FKTvhb+d/c0IHImSTX/QRmkmIKwYEDG0fWDi1lw3tWCV/to9ZjyD4HlujJtm+5svE4qBDSJnUa6taZqEQqw8PaPZgV8vj0jQ7caUEKS/vMofB/timPg9Wxmll6Rhmy/KFdaxY0GFATtwXWHvxxX3Q4huvRsySYeHzmnqE6H3M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=CADUrsKG; arc=none smtp.client-ip=209.85.216.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="CADUrsKG" Received: by mail-pj1-f45.google.com with SMTP id 98e67ed59e1d1-38e69bdb0fcso102264a91.1 for ; Fri, 24 Jul 2026 01:45:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784882711; x=1785487511; 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:content-type; bh=8fMs6AV1DB1/anefBW7A0r/4RRc6OeCs0ioieSwLEU0=; b=CADUrsKGCgO71Q8af5kBQHO4Yk9G2cyaHPwuBz1/Zk/Muj3CKG/cN11ecqmp8j/PAW gsKBw7DIRvpYazIBIOhY+qNrDLG4BpvMnR1miel3bkrWgbmIkqixioOdKaehtH7jEMVy dEORI/AYZCxkcUoE7FSGZgAQ21AMdzIt9iMBE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784882711; x=1785487511; 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:content-type; bh=8fMs6AV1DB1/anefBW7A0r/4RRc6OeCs0ioieSwLEU0=; b=bvQlRSVa/M3qJreW51IPiV+M7mUOkBEMR/WxP6CTAl7WOfXXSpH0pN93t+YAq7SH7e exoLL6BdOQ0blyCHzHx1lDeQLfriAw0yuKfQid5djoFQ3BJg+lWocIyGG9IPoi4aFPUo cW4umOTnS7zeLWCEP5bld6Mv24sGV8JK87shcR8CNZs6psFmE2eduIDXbJg/tDh4DDhW l5Ed9RlnnMGd0oCBUU1xr958vbG/PXo7LufNkD8vRsex3GnPQ/LvhZEtnzFUD2xvkNHV meuMY4Gdf3RwrYwVNnLeX8n9fmRbDapekfvEQXOXJbMv2JpqzyNfv9IcaXZJ4nZIy2PY rPWg== X-Forwarded-Encrypted: i=1; AHgh+Rpeii+fISEsC406shydgvWQbc85tODAGqo971imcCSZnZSrjBm5eUa0s7JxRjCZl6Wz5orXNzjQi5r6z1E=@vger.kernel.org X-Gm-Message-State: AOJu0Yya/nwaEpCXgQhr7ilzL26jRPm4gjqy66bNcVKU1i/tJnzjjdyQ n7LUkj9/S/5DpelYvMD8YYF5K2VDb6AObeAEgcRakRWNA0NYK1eisYdmSG0PVAbe7Q== X-Gm-Gg: AR+sD1355H5OYYf379i89c9xyX1xzqeg4iIER7eid4svzNZurKl5fsCBMoEXGjWS27V lmkE3COnhyiEFFgel+lh2UdhLo2ha/FzXPlqAxqg61ECjlt9xhfatYys0s/e2gPyccvsmAWs2x8 Psmf2kih2K+cjVIAqnBJbkXqX4SrhsKWvcABNBO4af/I7ZmqZbLBMZtnUs7nSTMBEyvbCEywwDZ KN6QjZ2HacST2+hv5MAu+oggQUMLqSWmA/75y75kQWR760/k/XdQOYJAtzUiaAXU1Zba1iBf9fY OepgVp7RCi4V2+Qv2Uy1yknmQ+kMj25NYqQ+7T/+Me2pJABjTGwNxasEQsqnk5tj3D/p59LjM3q wHQQqNFiDbNZZwlZv6WH/TK4mXSfLImSyKx+1dChN6nxn5SGPPQRsqxs4uL0wdTnpOwnKXYgRUf R6ugpy5Xk5AfpvVqJ6iAk4QvNTt14ksYEHQS/H/WWd2mb5o7kLpuPcbhsLDZc= X-Received: by 2002:a17:90b:5205:b0:38e:e9b:ffa7 with SMTP id 98e67ed59e1d1-38ec6a51c9dmr7051099a91.28.1784882711529; Fri, 24 Jul 2026 01:45:11 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:f131:86cc:5858:7325]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38f089ac6d8sm434546a91.2.2026.07.24.01.45.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 01:45:10 -0700 (PDT) From: Chen-Yu Tsai To: Bartosz Golaszewski , Greg Kroah-Hartman , Andy Shevchenko , Daniel Scally , Heikki Krogerus , Sakari Ailus , "Rafael J. Wysocki" , Danilo Krummrich , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno Cc: Wei Deng , Chen-Yu Tsai , linux-acpi@vger.kernel.org, driver-core@lists.linux.dev, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam , Alan Stern Subject: [PATCH v7 13/16] power: sequencing: pcie-m2: Add usb and sdio targets for E-key connector Date: Fri, 24 Jul 2026 16:43:22 +0800 Message-ID: <20260724084328.3943997-14-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog In-Reply-To: <20260724084328.3943997-1-wenst@chromium.org> References: <20260724084328.3943997-1-wenst@chromium.org> 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 M.2 E-key connector allows either PCIe or SDIO for WiFi and USB or UART for BT. Currently the driver only supports PCIe and UART. Add power sequencing targets for SDIO and USB. To avoid adding a complicated dependency tree, rename the existing power sequencing units "pcie" and "uart" to "wifi" and "bt". The existing target names are left untouched. The new "sdio" and "usb" targets just point to the renamed "wifi" and "bt" units. The "unit" names are internal to the power sequencing framework, and should be confined to a single provider. The names are only informational. Dependencies are tracked with pointers to other units. The "target" names are the strings that the consumer uses to acquire a descriptor with. As these remain the same, existing users will continue to work. Signed-off-by: Chen-Yu Tsai --- Changes since v2: - Expand commit message --- drivers/power/sequencing/pwrseq-pcie-m2.c | 41 +++++++++++++++-------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/drivers/power/sequencing/pwrseq-pcie-m2.c b/drivers/power/sequ= encing/pwrseq-pcie-m2.c index 691cad0a6dd0..693b0d33f8cf 100644 --- a/drivers/power/sequencing/pwrseq-pcie-m2.c +++ b/drivers/power/sequencing/pwrseq-pcie-m2.c @@ -69,46 +69,46 @@ static const struct pwrseq_unit_data *pwrseq_pcie_m2_un= it_deps[] =3D { NULL }; =20 -static int pwrseq_pci_m2_e_uart_enable(struct pwrseq_device *pwrseq) +static int pwrseq_pci_m2_e_bt_enable(struct pwrseq_device *pwrseq) { struct pwrseq_pcie_m2_ctx *ctx =3D pwrseq_device_get_drvdata(pwrseq); =20 return gpiod_set_value_cansleep(ctx->w_disable2_gpio, 0); } =20 -static int pwrseq_pci_m2_e_uart_disable(struct pwrseq_device *pwrseq) +static int pwrseq_pci_m2_e_bt_disable(struct pwrseq_device *pwrseq) { struct pwrseq_pcie_m2_ctx *ctx =3D pwrseq_device_get_drvdata(pwrseq); =20 return gpiod_set_value_cansleep(ctx->w_disable2_gpio, 1); } =20 -static const struct pwrseq_unit_data pwrseq_pcie_m2_e_uart_unit_data =3D { - .name =3D "uart-enable", +static const struct pwrseq_unit_data pwrseq_pcie_m2_e_bt_unit_data =3D { + .name =3D "bt-enable", .deps =3D pwrseq_pcie_m2_unit_deps, - .enable =3D pwrseq_pci_m2_e_uart_enable, - .disable =3D pwrseq_pci_m2_e_uart_disable, + .enable =3D pwrseq_pci_m2_e_bt_enable, + .disable =3D pwrseq_pci_m2_e_bt_disable, }; =20 -static int pwrseq_pci_m2_e_pcie_enable(struct pwrseq_device *pwrseq) +static int pwrseq_pci_m2_e_wifi_enable(struct pwrseq_device *pwrseq) { struct pwrseq_pcie_m2_ctx *ctx =3D pwrseq_device_get_drvdata(pwrseq); =20 return gpiod_set_value_cansleep(ctx->w_disable1_gpio, 0); } =20 -static int pwrseq_pci_m2_e_pcie_disable(struct pwrseq_device *pwrseq) +static int pwrseq_pci_m2_e_wifi_disable(struct pwrseq_device *pwrseq) { struct pwrseq_pcie_m2_ctx *ctx =3D pwrseq_device_get_drvdata(pwrseq); =20 return gpiod_set_value_cansleep(ctx->w_disable1_gpio, 1); } =20 -static const struct pwrseq_unit_data pwrseq_pcie_m2_e_pcie_unit_data =3D { - .name =3D "pcie-enable", +static const struct pwrseq_unit_data pwrseq_pcie_m2_e_wifi_unit_data =3D { + .name =3D "wifi-enable", .deps =3D pwrseq_pcie_m2_unit_deps, - .enable =3D pwrseq_pci_m2_e_pcie_enable, - .disable =3D pwrseq_pci_m2_e_pcie_disable, + .enable =3D pwrseq_pci_m2_e_wifi_enable, + .disable =3D pwrseq_pci_m2_e_wifi_disable, }; =20 static const struct pwrseq_unit_data pwrseq_pcie_m2_m_pcie_unit_data =3D { @@ -130,13 +130,24 @@ static int pwrseq_pcie_m2_e_pwup_delay(struct pwrseq_= device *pwrseq) =20 static const struct pwrseq_target_data pwrseq_pcie_m2_e_uart_target_data = =3D { .name =3D "uart", - .unit =3D &pwrseq_pcie_m2_e_uart_unit_data, + .unit =3D &pwrseq_pcie_m2_e_bt_unit_data, .post_enable =3D pwrseq_pcie_m2_e_pwup_delay, }; =20 +static const struct pwrseq_target_data pwrseq_pcie_m2_e_usb_target_data = =3D { + .name =3D "usb", + .unit =3D &pwrseq_pcie_m2_e_bt_unit_data, +}; + static const struct pwrseq_target_data pwrseq_pcie_m2_e_pcie_target_data = =3D { .name =3D "pcie", - .unit =3D &pwrseq_pcie_m2_e_pcie_unit_data, + .unit =3D &pwrseq_pcie_m2_e_wifi_unit_data, + .post_enable =3D pwrseq_pcie_m2_e_pwup_delay, +}; + +static const struct pwrseq_target_data pwrseq_pcie_m2_e_sdio_target_data = =3D { + .name =3D "sdio", + .unit =3D &pwrseq_pcie_m2_e_wifi_unit_data, .post_enable =3D pwrseq_pcie_m2_e_pwup_delay, }; =20 @@ -147,7 +158,9 @@ static const struct pwrseq_target_data pwrseq_pcie_m2_m= _pcie_target_data =3D { =20 static const struct pwrseq_target_data *pwrseq_pcie_m2_e_targets[] =3D { &pwrseq_pcie_m2_e_pcie_target_data, + &pwrseq_pcie_m2_e_sdio_target_data, &pwrseq_pcie_m2_e_uart_target_data, + &pwrseq_pcie_m2_e_usb_target_data, NULL }; =20 --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:53:11 2026 Received: from mail-pj1-f48.google.com (mail-pj1-f48.google.com [209.85.216.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 B55F240EBB6 for ; Fri, 24 Jul 2026 08:45:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882719; cv=none; b=hys6MgVM1XWctoYXYMJ6u8L6KEebq4kr0QKoqbeqWV8X7hVNqiSTlo9ncGloOOEAZC2dGZzqQX1NhIJaHejx/JllQ9tlxb95ok19gKBGb5gz8dJCQyQ5/u9x3aSmMUzHpSchLVZp/NTipBzf2yYvwlGSc70x1Zai6FL1JyD42ig= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882719; c=relaxed/simple; bh=2bdpJglUXNu6BBTggJFiuCLLgE+aHPv4Z4H92NilTHY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RrRb8CPDxWJxUGwHGj0T/piQxJZ0qN413CwbjtDeHrheAP2ZN7BIAU9uObrgMs4xwwSIzH6nVSUltsEQjlYrgyW/9yPhkYiSm8au1f2Ng3b0KIXCWRVmlMqnZlKBgVaQe8DJwnwC0u2UogkMr3TEjCXsAM8lq6cdVfggxP0rYSQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=fBcHxtBD; arc=none smtp.client-ip=209.85.216.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="fBcHxtBD" Received: by mail-pj1-f48.google.com with SMTP id 98e67ed59e1d1-3810c5d691bso138381a91.1 for ; Fri, 24 Jul 2026 01:45:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784882717; x=1785487517; 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:content-type; bh=FPhOqCEBzv3eJgxR2FHq6mhzbCgxaYl9KnF0Ou483ms=; b=fBcHxtBDYDTinFEZmdfv8EXfL/aqfTCX7skCt+kf1t7650ZuFcp3pbAa5jdtaDy56M HPsMQ5C0nwrwRD3c+GPOJ66XhMmxlQrMik+UrHqboVfMNcLiUB9go7f7BqMYPrIAX8w6 5E2NLpEf/b3fGwjkQ4e9I7qV0JAxn4W1Qn/nI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784882717; x=1785487517; 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:content-type; bh=FPhOqCEBzv3eJgxR2FHq6mhzbCgxaYl9KnF0Ou483ms=; b=KgcEdE3SaMyYopyC3zr2LFvDPNvjBoRu1EiEX1k0d1PSLqeTfQ46Mnb0rQsYAu/kih 8MiAQelb2eRGxdP7C26vos6ZPozAUWaJNNH7AsQWlE3MW6g4kfZdr/FSxFCcGRqCW9tW mZk9Qt14GZz4ybRlBUadKqwPmPZ/EcTLlzXo5dSTsE7kW92iS5FMYsqSDlFAfKWwJY6U bdz9EC0hbPgJ9nS6n78xSdBp8Z3QHxC62qoeCuopFxgJYWSzsPGsUHkEvsHQgp0eqyZ0 V3HrWKcz/5IJvFPzmMYnPSQ+iRPyRt2DIPohj59k3N0XRhMg1gGrHpfnOx47u+04b61B Tk/w== X-Forwarded-Encrypted: i=1; AHgh+Ro8tfhyUm4I1SvPEhG/qrgf1IxDExijQPDet2etDWNPcWj01jLG4ArXZ63dkpbS6Bll8vkbq2EhVd1EY/Y=@vger.kernel.org X-Gm-Message-State: AOJu0YzxYe27mEDuTaid0gfJVUNqcwDfeKDQoXPbFZKtWDdMGqoCUrTk GZFjp6c1jJPVChxketyMlNTjMDyS6dDd3qKe2qYF/a7hCnum6cvayeOf5nS9T+aCxw== X-Gm-Gg: AR+sD12O6YFUO0ucT21KqXZXKyZB9WidHB7BdBrI/5KHdkI7INWN4nO7ul+wPiBGGf2 /MSXiYXQh9qoEWm9bW3h1x1/r++RNhLowEHvXKXSZniWHe5cVUPPPLtQZCnT1llABkkp8Fc+BnW hpfb3er+YfQ+iSxVuaZXyeOvq3J61t6JqUbzg9YHwwvsHPVhXN7Fie79i8baPK5KeL+hPwwv7CJ hfG09FIV0sxXzaSc4n019tcMyaNCqGtj+JotmNvXGx0XruKdhD7iBsif4Wa4CWYW/+bJj6S+WVE Gc7+wdHDlYhVKmz3KqOilRH2/XQBdBpTq6S0H8u5Z/WZe5b1gMp+joaemYOIFvvnwomaNiSCL+o 2irwrFkq7fSagU8WhZQoSDnyJ6v4vHHZNGUgtciPwhufis2izp7Du5moWKDRopqDVngCupdL/wV 3MkI5quynLZVBGQHlqj6JeEJJajd9aesEwmh20Gy11rKU6hQV2hv+jexkiAmQ= X-Received: by 2002:a17:90a:d64c:b0:381:bc4c:da5b with SMTP id 98e67ed59e1d1-38ec6985236mr6392312a91.18.1784882717037; Fri, 24 Jul 2026 01:45:17 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:f131:86cc:5858:7325]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38f089ac6d8sm434546a91.2.2026.07.24.01.45.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 01:45:15 -0700 (PDT) From: Chen-Yu Tsai To: Bartosz Golaszewski , Greg Kroah-Hartman , Andy Shevchenko , Daniel Scally , Heikki Krogerus , Sakari Ailus , "Rafael J. Wysocki" , Danilo Krummrich , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno Cc: Wei Deng , Chen-Yu Tsai , linux-acpi@vger.kernel.org, driver-core@lists.linux.dev, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam , Alan Stern Subject: [PATCH v7 14/16] power: sequencing: pcie-m2: Split Bluetooth unit based on interface Date: Fri, 24 Jul 2026 16:43:23 +0800 Message-ID: <20260724084328.3943997-15-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog In-Reply-To: <20260724084328.3943997-1-wenst@chromium.org> References: <20260724084328.3943997-1-wenst@chromium.org> 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" Some UART / serdev based Bluetooth drivers need to be able to reset the hardware during initialization or recovery. This is not possible with the current power sequencing API if a unit is shared between USB and UART interfaces. For now, split the Bluetooth unit into two, one for each interface. This allows either interface to independently toggle the power, with the last action prevailing, thereby unbreaking the Qualcomm Bluetooth serdev driver. This is also needed for the Realtek Bluetooth serdev driver (hci_h5). Having independent control from either interface unfortunately means that userspace is able to shut down the controller from sysfs using the USB port's "disable" setting without the serdev driver knowing about it. On the USB side, independent control is also desired, as it allows the USB core to power cycle the port/device during faults, and for userspace to initiate reset and recovery using the aforementioned "disable" setting. However when USB is used, a serdev device is not created, and there is no conflicting usage, which allows the power sequencing to work even without the split unit. Suggested-by: Wei Deng Signed-off-by: Chen-Yu Tsai --- Changes since v4: - New patch This patch is _not_ squashed into the previous to provide clear context on the change, and the less than perfect nature of it. I think what we need in this case is some sort of lockout. The serdev consumer would want "exclusive" access, locking out the USB consumer, which can tolerate "shared" access. Something similar would be needed for the WiFi if we ever add support for SDIO for toggling the state of W_DISABLE#1. At least the SDIO and PCIe reset signals are separate. --- drivers/power/sequencing/pwrseq-pcie-m2.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/drivers/power/sequencing/pwrseq-pcie-m2.c b/drivers/power/sequ= encing/pwrseq-pcie-m2.c index 693b0d33f8cf..56e4f40e0480 100644 --- a/drivers/power/sequencing/pwrseq-pcie-m2.c +++ b/drivers/power/sequencing/pwrseq-pcie-m2.c @@ -83,8 +83,22 @@ static int pwrseq_pci_m2_e_bt_disable(struct pwrseq_devi= ce *pwrseq) return gpiod_set_value_cansleep(ctx->w_disable2_gpio, 1); } =20 -static const struct pwrseq_unit_data pwrseq_pcie_m2_e_bt_unit_data =3D { - .name =3D "bt-enable", +/* + * XXX There are two Bluetooth units to allow either one to be able to pow= er + * off and thus reset the controller. In practice only one of the interfac= es + * is used, so there is no conflict. However userspace could power off the + * USB unit by disabling the associated USB port, without the UART unit or + * its consumer ever knowing. + */ +static const struct pwrseq_unit_data pwrseq_pcie_m2_e_bt_uart_unit_data = =3D { + .name =3D "bt-uart-enable", + .deps =3D pwrseq_pcie_m2_unit_deps, + .enable =3D pwrseq_pci_m2_e_bt_enable, + .disable =3D pwrseq_pci_m2_e_bt_disable, +}; + +static const struct pwrseq_unit_data pwrseq_pcie_m2_e_bt_usb_unit_data =3D= { + .name =3D "bt-usb-enable", .deps =3D pwrseq_pcie_m2_unit_deps, .enable =3D pwrseq_pci_m2_e_bt_enable, .disable =3D pwrseq_pci_m2_e_bt_disable, @@ -130,13 +144,13 @@ static int pwrseq_pcie_m2_e_pwup_delay(struct pwrseq_= device *pwrseq) =20 static const struct pwrseq_target_data pwrseq_pcie_m2_e_uart_target_data = =3D { .name =3D "uart", - .unit =3D &pwrseq_pcie_m2_e_bt_unit_data, + .unit =3D &pwrseq_pcie_m2_e_bt_uart_unit_data, .post_enable =3D pwrseq_pcie_m2_e_pwup_delay, }; =20 static const struct pwrseq_target_data pwrseq_pcie_m2_e_usb_target_data = =3D { .name =3D "usb", - .unit =3D &pwrseq_pcie_m2_e_bt_unit_data, + .unit =3D &pwrseq_pcie_m2_e_bt_usb_unit_data, }; =20 static const struct pwrseq_target_data pwrseq_pcie_m2_e_pcie_target_data = =3D { --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:53:11 2026 Received: from mail-pj1-f47.google.com (mail-pj1-f47.google.com [209.85.216.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 AD3D43DC4CF for ; Fri, 24 Jul 2026 08:45:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882725; cv=none; b=kQTWbjeGuDyTwObpPER+sT45eIycvwgzQUc+p190zlWdOh225/0s318a+PBPZMibeYPOzXTRWtjJU+uZLUQqYQnlUwBTVNjZ5XMPAOnT4PP1/nckS8+8ZHRqtXZMYpthE2sLB3P6v3aSUKE8erLXX/sgcR7GS1R8I3WDgnYCnIA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882725; c=relaxed/simple; bh=5nZ4oAMk+j/TL2cUgeaIHep9LZ80pEB5bycph4BWJnY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cVLm37TyFoidIxy4pgkLfvvCvcTciacsEbbg7kuhLlQZThqdXo4SXvVqzRvxgwfoA1yPmVj3r86GHbtrW5XO2WuHOtkcrN+CTlJxVZglKUh3Dd8EesDrMmjpDeoktN6JGN4+euX7vLK1erELutv3APKBd5QjKqvWX4v3w/ivBnM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=a4R/TUXI; arc=none smtp.client-ip=209.85.216.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="a4R/TUXI" Received: by mail-pj1-f47.google.com with SMTP id 98e67ed59e1d1-38dfe910e9dso133454a91.3 for ; Fri, 24 Jul 2026 01:45:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784882723; x=1785487523; 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:content-type; bh=pSIe19R3Jx2/rJrVImdy8rgHYnwLDdUMVV9CAsQ6TV0=; b=a4R/TUXICZl5YZAdlX+M0WpFb5JBSRjpS9nz+nMNEWuPKpgpGiPW1WRDVHM2lsT3n/ GtL6OXk/EsMk4Q21vsQaiBs+HCoKC2m59vhaCX2wnbk1KpMePAwWiaSzJJWhhU3bTS5O XnlN1lvux6kWt+T8uaAQGnn1S/+W+x8n0M2uQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784882723; x=1785487523; 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:content-type; bh=pSIe19R3Jx2/rJrVImdy8rgHYnwLDdUMVV9CAsQ6TV0=; b=sCKDzigq7plTY8RAeYX9DMyn0z87+a2/4+uPPFfOiYloFQp5D8eyUnVOxrJl1o3qZD g7DSklZUYFKG365LV5vxA8EB5NW+hEpG6wcQZPSo2gY/C9GfS4mHxj0u7moG5WSkhti1 OxTGw/MUPNOQJpshjDd7TVTjsZLNh4GijEAYu63MJssG1J3p2r6DiCYCxpthKy3hMgxJ rpl/DrGptLizmAxL6p7UOC9f32At3uGc+qMp8H77yscGS3/z0XEN3mlzxh7ajNbUfmK4 cgVxP2qz0ehjD55O1KbzN6GOmduK4r/vbl3CoMPM677Ru4JptwMWy0I3zealzDMeF6IQ NKsg== X-Forwarded-Encrypted: i=1; AHgh+RqIKAtLFr5eNaGuYA60vTMlACPeOde3qh9ZM/UcOwY6621joX2AefhB5tWAWMnISvvlzLnE0PSBEzhDy9E=@vger.kernel.org X-Gm-Message-State: AOJu0YwJr6yczjIZfMdwi4mEhPEQJYZXPWEKE7GMWxJqD1DpvMWnqyXf Vp9/VsvTAf3FP2pnEwt4DjFykpCHMMlUkGb4X7L53dsOxOemBeem5etTV759a8r25g== X-Gm-Gg: AR+sD12V/88hJbyVggb1sLJHycFwfGYQuJzlQVsPhoeqwxG3rvm5EoQk4ta6jnTdseD 7g+fw9GFbIefP5uPxr+4TM+jc6v0rNSRIwS461aTUtUt5uRMqsjh7qOZcziJAQJGCXmqTCg9X4U KmNVWcJKqvnvgAhKccOQmT9WUEiqJM7/LcAmfH2WQ7pmHo6wXVUQqh+oLtcOp9iAs6oM49bWRzP mP7nkg0FF6AhElsA+VfMv2OKKCD4XVgifzYzpN6llYiOxzAfoQDYMble5V4VJMY4ff8lQKP27Wg N25bGEcis6BSA081UTK/b+rMoXtFCfg1PEfL2Kp9NTz21dAlKn9amBPmqb1wzAXqweNyiqly1WI 9EH3OV3xr/3UdRqlDYIoKm84bf0lR8AKdcuDuNWetVYZPa0k5zKEeFrPiOascPfGL96f+ERDqpZ /jD25KvnfqsAAlhb14Ch2LxL1P6f6v6uy+o0TMi8M+7M7k4AokJ1j1n5xfK8aVR8N8tK7RHg== X-Received: by 2002:a17:90b:586c:b0:38e:7446:d2b8 with SMTP id 98e67ed59e1d1-38ec6890685mr7222992a91.41.1784882723047; Fri, 24 Jul 2026 01:45:23 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:f131:86cc:5858:7325]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38f089ac6d8sm434546a91.2.2026.07.24.01.45.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 01:45:21 -0700 (PDT) From: Chen-Yu Tsai To: Bartosz Golaszewski , Greg Kroah-Hartman , Andy Shevchenko , Daniel Scally , Heikki Krogerus , Sakari Ailus , "Rafael J. Wysocki" , Danilo Krummrich , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno Cc: Wei Deng , Chen-Yu Tsai , linux-acpi@vger.kernel.org, driver-core@lists.linux.dev, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam , Alan Stern , Bartosz Golaszewski Subject: [PATCH v7 15/16] arm64: dts: mediatek: mt8195-cherry: Add M.2 E-key slot Date: Fri, 24 Jul 2026 16:43:24 +0800 Message-ID: <20260724084328.3943997-16-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog In-Reply-To: <20260724084328.3943997-1-wenst@chromium.org> References: <20260724084328.3943997-1-wenst@chromium.org> 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 Mt8195 Cherry design features an M.2 E-key slot for WiFi/BT combo cards. Only PCIe and USB are wired from the SoC to the slot, along with some auxiliary signals. Add the proper representation for it, replacing the PCIe wifi node and vpcie3v3-supply property under the PCIe controller, and the vbus-supply property under the xhci3 node. Reviewed-by: Bartosz Golaszewski Signed-off-by: Chen-Yu Tsai --- Changes since v2: - Drop default GPIO output state from kill pins pinconfig --- .../boot/dts/mediatek/mt8195-cherry.dtsi | 73 +++++++++++++++++-- 1 file changed, 68 insertions(+), 5 deletions(-) diff --git a/arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi b/arch/arm64/b= oot/dts/mediatek/mt8195-cherry.dtsi index ef7afc436aef..8d4cc30d91e4 100644 --- a/arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi @@ -266,6 +266,47 @@ tboard_thermistor2: thermal-sensor-t2 { 120000 51 125000 44>; }; + + wifi-bt-connector { + compatible =3D "pcie-m2-e-connector"; + pinctrl-names =3D "default"; + pinctrl-0 =3D <&m2_e_key_kill_pins>; + vpcie3v3-supply =3D <&pp3300_wlan>; + w-disable1-gpios =3D <&pio 61 GPIO_ACTIVE_LOW>; + w-disable2-gpios =3D <&pio 59 GPIO_ACTIVE_LOW>; + /* PCIe auxiliary signals wired to controller. */ + + ports { + #address-cells =3D <1>; + #size-cells =3D <0>; + + /* PCIe for WiFi */ + port@0 { + reg =3D <0>; + #address-cells =3D <1>; + #size-cells =3D <0>; + + wifi_ep: endpoint@0 { + reg =3D <0>; + remote-endpoint =3D <&pcie1_ep>; + }; + }; + + /* USB for Bluetooth */ + port@2 { + reg =3D <2>; + #address-cells =3D <1>; + #size-cells =3D <0>; + + bt_ep: endpoint@0 { + reg =3D <0>; + remote-endpoint =3D <&usb3_ep>; + }; + }; + + /* SDIO, UART and I2S not implemented */ + }; + }; }; =20 &adsp { @@ -791,14 +832,14 @@ pcie@0 { reg =3D <0 0 0 0 0>; device_type =3D "pci"; num-lanes =3D <1>; - vpcie3v3-supply =3D <&pp3300_wlan>; #address-cells =3D <3>; #size-cells =3D <2>; ranges; =20 - wifi@0 { - reg =3D <0 0 0 0 0>; - wakeup-source; + port { + pcie1_ep: endpoint { + remote-endpoint =3D <&wifi_ep>; + }; }; }; }; @@ -1085,6 +1126,13 @@ pins-bus { }; }; =20 + m2_e_key_kill_pins: m2-e-key-kill-pins { + pins-kill { + pinmux =3D , + ; + }; + }; + mmc0_pins_default: mmc0-default-pins { pins-cmd-dat { pinmux =3D , @@ -1637,9 +1685,24 @@ &xhci2 { &xhci3 { /* MT7921's USB Bluetooth has issues with USB2 LPM */ usb2-lpm-disable; - vbus-supply =3D <&pp3300_wlan>; vusb33-supply =3D <&mt6359_vusb_ldo_reg>; status =3D "okay"; + + ports { + #address-cells =3D <1>; + #size-cells =3D <0>; + + port@1 { + reg =3D <1>; + #address-cells =3D <1>; + #size-cells =3D <0>; + + usb3_ep: endpoint@0 { + reg =3D <0>; + remote-endpoint =3D <&bt_ep>; + }; + }; + }; }; =20 #include --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 21:53:11 2026 Received: from mail-pj1-f44.google.com (mail-pj1-f44.google.com [209.85.216.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 28C284137A5 for ; Fri, 24 Jul 2026 08:45:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882730; cv=none; b=D1hEjdg/sBhiT3LsT93sShyMTWAOEoJvRG4vFHuSipQnc+CpvsdVsB9CEuyjNJSyqO8Jnc2GuavEhQKDWxlbPVc+TgyKJCTy+YYOSmV6zq4LNZ7r3D/TcDQ3r/ElNIutSpaHsSzdMPCQGzVZBcXBdSWswKuMFN90YMvezCAwx5g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784882730; c=relaxed/simple; bh=mNpG544f4x3HV+KP/4A0iAH5FCpy/+89CTapAoZKNGU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=il6mcxkpZFZaa3NutAAfW0ADhFjPrs5YFk/E9BSrKMRp0Pwt/KTVaPecMcVEixq8sJErV0tnrTb3VpQlHTWIhCOsL9DOwj76/NMLqo8AB3Wlh7jcPKmSawXUORxaWxSIk1jVwwyPtBPYcfyWVMF241GsH9l2OmsLgOrQj+CF3+0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=j6xxCHeZ; arc=none smtp.client-ip=209.85.216.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="j6xxCHeZ" Received: by mail-pj1-f44.google.com with SMTP id 98e67ed59e1d1-38e88b60121so127500a91.3 for ; Fri, 24 Jul 2026 01:45:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784882728; x=1785487528; 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:content-type; bh=yabl9CFEsxsu5a/1yJNSCfa/j6/qqQrQ3CInFfZaiRc=; b=j6xxCHeZXbNDEEKhJlJKtEL2IBzxDezAX+JJ0JwcGaGvUlpqLNB3ywgYSNrYuDdUDf zxygXdeFoQNGqWLI8V3ezxpsnqYIZMAFXp8ve+Ept6GbhLVPLROTrqgaz+ZYnb/w/CEA IFKFd8AIwfKmUyEbgx5BqmG1s7+tY65s/r8oo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784882728; x=1785487528; 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:content-type; bh=yabl9CFEsxsu5a/1yJNSCfa/j6/qqQrQ3CInFfZaiRc=; b=bJJVNMGrrxJ+riaKJnHutGkP5RivhQhVK91h+1obsRpra+t7ijNpD4QyO7PtJxrPaR vRa8tsoZ54dONN+OCqNJYm94UgitvXDNa/8M96mU2kEfVEn7c0qEUZfvAXSzwj55XgVv D4mIVG7obYqekopH+D0SOQ7KfFX2kJxwZKpXICNyNfIaktPimXldriMdMopX+gzF1N4l N+q3FEaI+4+jyJqWEpZwFYAEqUbw1ACqAvtDJiDK5+dhLg9/82Y4Y+QmwKvBpT7rkQkK kNVGnQBoLeWeQ1lT/mINdFMj8+Lu4vHiOaIqQssUpasyPG3NlUy6oy/m8LZjpejN8VHQ lXeg== X-Forwarded-Encrypted: i=1; AHgh+Rpr5t0htw5/95ibtMU/ucBghaHM3c2Y+9W/jFkAuiZ8TERUoQ1RnnQ2ha5aXmTcaYeSig9tV2o1mVphDOM=@vger.kernel.org X-Gm-Message-State: AOJu0Yzqv2mzpzifJ0JxSEiiXnmE81ZYRvKbQMTF7GvT+ld1t6UWti0E hzD415k42Y1meMfNg0fTCL4yRtAflrfIWPq+yEdFUFPGJOL2AK1+fo/jfUjArWoRqQ== X-Gm-Gg: AR+sD13obeqxOZJlJ7hOQms0qzPwBiZZDXq/qB6+7DPFX8P3rO71hq7FeZa7iBeJdpX jxxHbbA6MmqWz3jVnqRu8ra/4uf+Tk0HMsnO/I16FsYpFEMSoZicciMh52Nf4DMZlE6W4YdWxCF pttYZ0+pfCinxyap3msY4yr9d+H9aLJ8wl9S8Qcqm/avEefa+AHwohUuUnyDgo2pJPTcgVLWSK5 LFtxu+B0VF2fN77uzzR2IQTQY0vVrjLozlk2fqSzm0cSVmKglLqYs9zziBC/ObTJ9H9VmISHqqS xY4yAE54s+bOx/qCwc+8oYa8I79+Ha29p/dY8WL35SScscCY5BsaKXFahjh3vSxysC2AC3LnKcu /ua4uVz548ATNcfZwof9QWL+J9/TbDrx0PjaBGyaFEwArSzNNKGPss9YE5xu8oPs8mAoinACHN9 Gm8n2xdwjww3gD03EGiE+P9WuI5KmRsZ6566PmLwL4e1dWXl3hNSMBP/P0+s5Ob2ol7WExWA== X-Received: by 2002:a17:90b:38c8:b0:38e:b400:a860 with SMTP id 98e67ed59e1d1-38ec642bd98mr7208354a91.13.1784882728495; Fri, 24 Jul 2026 01:45:28 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:f131:86cc:5858:7325]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38f089ac6d8sm434546a91.2.2026.07.24.01.45.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 01:45:27 -0700 (PDT) From: Chen-Yu Tsai To: Bartosz Golaszewski , Greg Kroah-Hartman , Andy Shevchenko , Daniel Scally , Heikki Krogerus , Sakari Ailus , "Rafael J. Wysocki" , Danilo Krummrich , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno Cc: Wei Deng , Chen-Yu Tsai , linux-acpi@vger.kernel.org, driver-core@lists.linux.dev, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam , Alan Stern , Bartosz Golaszewski Subject: [PATCH v7 16/16] arm64: dts: mediatek: mt8188-geralt: Add WiFi/BT as M.2 E-key slot Date: Fri, 24 Jul 2026 16:43:25 +0800 Message-ID: <20260724084328.3943997-17-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog In-Reply-To: <20260724084328.3943997-1-wenst@chromium.org> References: <20260724084328.3943997-1-wenst@chromium.org> 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 MT8188 Geralt design features a chip-on-board WiFi/BT solution. This is a M.2 E-key WiFi/BT board layout directly inserted into the mainboard design. The connections to the rest of the board are almost the same as if it were a separate M.2 card. The only addition is the PMU_EN pin on the chip; on M.2 cards this would be tied to the primary power source. Model the chip-on-board WiFi/BT solution as a M.2 E-key slot with PCIe, USB and auxiliary signals. The PMU_EN pin, which enables the internal power controls and regulators, is modeled as a regulator fed by the pp3300_wlan regulator. Since power sequencing is now correctly modeled using the M.2 E-key slot, drop the "regulator-always-on" property one pp3300_wlan regulator. Also drop the comment in xhci2 saying "MT7921's power is controlled by PCIe". Also drop the voltage range on the pp3300_wlan regulator. This "regulator" is just a load switch and does not provide any regulation. Reviewed-by: Bartosz Golaszewski Signed-off-by: Chen-Yu Tsai --- Changes since v2: - Drop default GPIO output state from kill pins pinconfig --- .../boot/dts/mediatek/mt8188-geralt.dtsi | 92 ++++++++++++++++++- 1 file changed, 88 insertions(+), 4 deletions(-) diff --git a/arch/arm64/boot/dts/mediatek/mt8188-geralt.dtsi b/arch/arm64/b= oot/dts/mediatek/mt8188-geralt.dtsi index dee946309121..73b5c0fdeae6 100644 --- a/arch/arm64/boot/dts/mediatek/mt8188-geralt.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt8188-geralt.dtsi @@ -88,13 +88,11 @@ pp3300_z1: regulator-pp3300-z1 { pp3300_wlan: regulator-pp3300-wlan { compatible =3D "regulator-fixed"; regulator-name =3D "pp3300_wlan"; - regulator-always-on; - regulator-min-microvolt =3D <3300000>; - regulator-max-microvolt =3D <3300000>; enable-active-high; gpio =3D <&pio 12 GPIO_ACTIVE_HIGH>; pinctrl-0 =3D <&wlan_en>; pinctrl-names =3D "default"; + /* load switch */ vin-supply =3D <&pp3300_z1>; }; =20 @@ -161,6 +159,17 @@ ppvar_mipi_disp_avee: regulator-ppvar-mipi-disp-avee { vin-supply =3D <&pp5000_z1>; }; =20 + /* PMU_EN pin controls internal regulators and power sequence */ + wlan_pmu: regulator-wlan-pmu { + compatible =3D "regulator-fixed"; + regulator-name =3D "wlan-pmu"; + enable-active-high; + gpio =3D <&pio 145 GPIO_ACTIVE_HIGH>; + pinctrl-0 =3D <&wlan_pmu_en>; + pinctrl-names =3D "default"; + vin-supply =3D <&pp3300_wlan>; + }; + reserved_memory: reserved-memory { #address-cells =3D <2>; #size-cells =3D <2>; @@ -195,6 +204,39 @@ adsp_dma_mem: memory@61000000 { no-map; }; }; + + wifi-bt-connector { + compatible =3D "pcie-m2-e-connector"; + pinctrl-names =3D "default"; + pinctrl-0 =3D <&m2_e_key_kill_pins>; + vpcie1v8-supply =3D <&mt6359_vcn18_ldo_reg>; + vpcie3v3-supply =3D <&wlan_pmu>; + w-disable1-gpios =3D <&pio 13 GPIO_ACTIVE_LOW>; + w-disable2-gpios =3D <&pio 14 GPIO_ACTIVE_LOW>; + + ports { + #address-cells =3D <1>; + #size-cells =3D <0>; + + /* PCIe for WiFi */ + port@0 { + reg =3D <0>; + + wifi_ep: endpoint { + remote-endpoint =3D <&pcie_ep>; + }; + }; + + /* USB for Bluetooth */ + port@2 { + reg =3D <2>; + + bt_ep: endpoint { + remote-endpoint =3D <&usb2_ep>; + }; + }; + }; + }; }; =20 &adsp { @@ -659,6 +701,22 @@ &pcie { pinctrl-names =3D "default"; pinctrl-0 =3D <&pcie_pins>; status =3D "okay"; + + pcie@0 { + compatible =3D "pciclass,0604"; + reg =3D <0 0 0 0 0>; + device_type =3D "pci"; + num-lanes =3D <1>; + #address-cells =3D <3>; + #size-cells =3D <2>; + ranges; + + port { + pcie_ep: endpoint { + remote-endpoint =3D <&wifi_ep>; + }; + }; + }; }; =20 &pciephy { @@ -1002,6 +1060,13 @@ pins-bus { }; }; =20 + m2_e_key_kill_pins: m2-e-key-kill-pins { + pins-kill { + pinmux =3D , + ; + }; + }; + mipi_disp_avdd_en: mipi-disp-avdd-en-pins { pins-en-ppvar-mipi-disp { pinmux =3D ; @@ -1174,6 +1239,13 @@ pins-bus { }; }; =20 + wlan_pmu_en: wlan-pmu-en-pins { + pins-wlan-pmu-en { + pinmux =3D ; + output-low; + }; + }; + wlan_en: wlan-en-pins { pins-en-pp3300-wlan { pinmux =3D ; @@ -1417,10 +1489,22 @@ vdosys1_ep_ext: endpoint@1 { }; =20 &xhci2 { - /* no power supply since MT7921's power is controlled by PCIe */ /* MT7921's USB BT has issues with USB2 LPM */ usb2-lpm-disable; status =3D "okay"; + + ports { + #address-cells =3D <1>; + #size-cells =3D <0>; + + port@1 { + reg =3D <1>; + + usb2_ep: endpoint { + remote-endpoint =3D <&bt_ep>; + }; + }; + }; }; =20 #include --=20 2.55.0.229.g6434b31f56-goog