From nobody Sat Jul 25 17:34:03 2026 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) (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 52DAA3D7D75 for ; Wed, 15 Jul 2026 08:54:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105664; cv=none; b=sEO9k67I3bAIlKqGIyCyoOTEbOCIOlBJihUNQ6iV2zcCUmmXkTn9IS4TTsWyTuZH7Ye2uef+2gA+ABSEy1pp8TBoXTSPJwfjn7OQx6DBcl/2iZCokK+GwFluXwc//fImh7CJ+jjerOUyolV7kr7cgRCz+LdoWtXxcUTlYWdriuw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105664; c=relaxed/simple; bh=sHMrDgD936gJSs9bJLfV9Xhglpv5Agcq8aSC2pp7OfY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MHOAsa3WL8kAgsjPdyxv3/VQPetPk/ElX95ejTA3/OVYT9B0QbLug6NN3yQwM7TgKH+uRTHczLBCwmdCcXjCw5cXyRsTNmeimIOhU0VFxhlx8K6Q551oVMxTdk0bdkdjWBtxu09KU6xvxwgj9WI+cgTjWukgiGL1yjQUXBCmUY4= 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=ParLHhyM; arc=none smtp.client-ip=209.85.210.175 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="ParLHhyM" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-84862b0d5f8so1704012b3a.3 for ; Wed, 15 Jul 2026 01:54:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784105662; x=1784710462; 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=1XAlo36/cvqlWCfJP/st8V9NvEK1f/LvSK5OHVxavmM=; b=ParLHhyMLjNtZyB47iyTQu6bup3gTadNnJF4K/RdC43t9WZqyYxs41M01cpNtDEuDZ gKWxPz2jeK7D5s91p4R71J5TPrecM4fjNCnl2sHMivWga/g1OP3YR35F7cyuz/1v2/RQ EXKC+264rTh6Z1T/5knxodQ6pq8aZTSwK8jCw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784105662; x=1784710462; 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=1XAlo36/cvqlWCfJP/st8V9NvEK1f/LvSK5OHVxavmM=; b=IKd0zKswNPcxSynuGCSKGNbXI1+4UJP/fqlU0dHyKVrTXtDo+6Mg5n06/HFqR8Qqfx nIgL6kBTnQZQARaDM0MlCEht1UbvAPkD4DwaWQb5X+5JIR5I1YWyv6yPuSOrJqJF4xpq fQVZmIva6ocg7vVQEKq8exkWj/2eq0v+yIHFpLZR0KVQxBphRpzyXyEuDj9LHbpk9LiA pRn2Lf5SNvTalKU+LaylTn3Qxb4iN6lj21uJE1AL6BEFOX3eiDWr7pS806isadi58iM6 oSUKjPmKi3YwKI/EcEQNZeJUuPf4VNk2ezEDLEzwaA1EmTMx8R8G0mbxiV12vD0YDkww vlFQ== X-Forwarded-Encrypted: i=1; AHgh+RrC/Sxt88K8l2W/ES8MKK7WSuo8+cGgyxk2MO4t97joG352VJAJS96x+fUk5oxp9I7x+ISer65zWli6PAA=@vger.kernel.org X-Gm-Message-State: AOJu0YxLgoJJCvfDkAMY/S6aNP8x2OKbvj97LrNHlTM469sLn2q6xlLS KTPYYAueqHDUlr+PUV3JmfMeqS3THROasJYZzc06Nrh3ZBsYuDUIVsEQkvO9pHvg3g== X-Gm-Gg: AfdE7cnXWf/BbG8c20/WptuJrFLoe9c/PX21MQqxqjoQzXLmOvCfmvUzUhriz/2g7pr UUfVcBGLwP2ep1Aec+BYF1/jZlXLVKY9+O94MwBgMdAARMA33cdo/6AgYXWJW19TdFlTV4OpsfZ LVQo9g23z+nRQZaf6DNxU7VDlxBQXzQaSNxwPcJkckVUrbKXuX6PI4I8b+gh/BlT/e4IUzm6Ezi tXs8PzV5YTnAX0hBynI0S2m+V4nvwTZ3OtbKpsLWu+hS04WKH2DhprfwHDFJSo7/sm6L8O2paLG xwLLQXkIW/Pk3cSryKqmkXTxXXVORIJDnTcGQFw4vmG6WJTZb7VWTAA97RT4IadTKWCwO+1PI6y 2QDyLTi9ClpTLRvuS23I1/rsuc+x/r86UFTch46Va5k4FnYdmU0l4qrksUjd0DH5Fi4Q2jKsUza LUArzI4shQ12aGe19qwMAC7l9fnyoJH7BKVwuyilVdUekkpXFigbUGjB8OJYBKy1E/QSzssA== X-Received: by 2002:a05:6a00:21d2:b0:845:c6fc:2821 with SMTP id d2e1a72fcca58-84889604f51mr14884898b3a.22.1784105661732; Wed, 15 Jul 2026 01:54:21 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:47d7:4aa5:a6f8:2279]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84a4f819117sm2757491b3a.59.2026.07.15.01.54.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Jul 2026 01:54: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 v5 01/16] device property: Add fwnode_graph_get_port_by_id() Date: Wed, 15 Jul 2026 16:53:31 +0800 Message-ID: <20260715085348.3457359-2-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog In-Reply-To: <20260715085348.3457359-1-wenst@chromium.org> References: <20260715085348.3457359-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 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 | 3 +++ 2 files changed, 32 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..480ba8646bcc 100644 --- a/include/linux/property.h +++ b/include/linux/property.h @@ -505,6 +505,9 @@ 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); +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.795.g602f6c329a-goog From nobody Sat Jul 25 17:34:03 2026 Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) (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 359E13D8911 for ; Wed, 15 Jul 2026 08:54:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105668; cv=none; b=PcKci5z8QvgfAo50umfNnDvf8ReFFzjBnd0drWDBxmjGVYEBWF1YZKWDcFGeNun2nXnr2Y7vvCU3aZI9WEWTLwsszsS+swdIjWWWjOuI8Iy49cjT08hDn4gQ2+GOHnvK+vRfn8f0zYkRh3W31IACxjuYkDvaRNdIsexia3y8Xk4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105668; c=relaxed/simple; bh=sqdob5TVS1N4bmSmguYYfBBqYJRqBaCnxbFmD0sCAjI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pQunlNcYa0+USykxG4aKIZ3oEpqXL1/ag5zVjlfpVQuETfFMtj5VwMEeibHH3PNMB6Uc9DtONbBv0Gq4rzaH0uMFVBpwAMbRPzCtnHKrpJpc+pyEL/o38SJimi44uawu+RMwNNPfwPTtSgEb10FqXkD/QX5E2JsgNEJDMpATIw0= 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=F49u4kTA; arc=none smtp.client-ip=209.85.210.169 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="F49u4kTA" Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-845c92bc464so1817383b3a.2 for ; Wed, 15 Jul 2026 01:54:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784105666; x=1784710466; 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=VZ7tYQ51+XcWWhdGhKfBc+Z+vMHf2l2pRpxpCrkBTOs=; b=F49u4kTAOR0K7VBexydgAZXRUTsm+VJhRyAQqv+Ve/qdyP4gV6MoLTVLx4ZjL2uWhX cKN42UmTfQw0V6/saDUKC0qBMqh1v/l0wcQnTE6Mxkn8DOh0cdBRkRs6qY59HLxrOD7n LF/NITZHrx3sbvIplWvgVamTrnrmC/WxuUMTk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784105666; x=1784710466; 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=VZ7tYQ51+XcWWhdGhKfBc+Z+vMHf2l2pRpxpCrkBTOs=; b=JTf3er0bEvinsxRLiT4nPMQh74cw8I1dEQ3WbCP0n1wc8LMBqHf2C3oaSVqqKS+rV/ co9fahRoUpbHem3RrJ2KxJ93sH3ndzJNCZmypX2vYHizPWTWojEITlWKXNBSz9PA8GLG wa3kEF1lQQ2i5dooEV3dkI/5UKFZ+9VJ37gLLD6EBgTZNuvvpHtMmxCaesWNV9WwKYsq JB+VYETmbL0Di2OVgWujhf55GOXnpEH9OEyZMNgMS9E0o1/ETJWpUlAr68NaQ4bciSWP BMkWwu110y1FYkYqcWzgu5F3KcU6iFjDgTPpbHdIB+z57RHFJzHtNMcVN4aZ6nMbpSIv iMmw== X-Forwarded-Encrypted: i=1; AHgh+Rrt8Kgs/beGNasOkdAazimvyqU/SKa2K9dPJHZWpFXZabcBc8C05Y2fVZSKsCk+GtGByZHYMGMlyCiV7pA=@vger.kernel.org X-Gm-Message-State: AOJu0Yygh5BxWOO+jUq/K607HcktciZMiG8goqD1iChCBWr5CDmerA39 68+msqeLk6kRmgiOBkIbkuGgpHvNtklBuus4HPm1BC9FXCdy3ERVMAssxKsE2RKwiQ== X-Gm-Gg: AfdE7cm8zjFwv9jWhr5Bnv4xqjVAPhDj1s9Qt/UtGi4cxbO5KHlgkyklH8O4FAtb+dp 4C4O/Zkx8fxS6MuycwEioE3lU6+dmttuDED0jXPWKXcMBMtXsTSNaWdM3etMR3KLYncN2OPZMWj kv7I9NfTckgbKj2jDv38ecg69zH8xmy0l3FcY99lF0sxmsRFlivgdNOT0cFYioihswvPAbAKl6t GbL9Bt/+keYjekbOyI+Lb9MRDvjVMvBTHNI9vq0lFP3hOqtRfnqyAdvEirzHmHppzhg/FSeFj9p 81mAH9VwmHwlNSiWFiK9EnWX2RTImMRPaUUWZpmjPAu2XMK5miVEoC30KR54kph4q+ibed2bBxY SsT0apjAi/rdKI0Y4xmHZMD8f8KO0JBnjaF/+meRySfbVIOGetjFdzg/q3KFKToXl2rouyVnmfp RudD/snL9pX7qe2lIndrbY2JdR036e1f4mR1gs1Vft7gnNzYXGIQ4rrq3CZtZehLo+96Mi1Q== X-Received: by 2002:a05:6a00:228f:b0:848:2f74:1d65 with SMTP id d2e1a72fcca58-84889744e25mr15178478b3a.75.1784105666556; Wed, 15 Jul 2026 01:54:26 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:47d7:4aa5:a6f8:2279]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84a4f819117sm2757491b3a.59.2026.07.15.01.54.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Jul 2026 01:54:26 -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 v5 02/16] device property: Add fwnode_graph_get_next_port_endpoint() Date: Wed, 15 Jul 2026 16:53:32 +0800 Message-ID: <20260715085348.3457359-3-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog In-Reply-To: <20260715085348.3457359-1-wenst@chromium.org> References: <20260715085348.3457359-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. 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 | 3 ++- 2 files changed, 27 insertions(+), 1 deletion(-) 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 480ba8646bcc..9a784a856773 100644 --- a/include/linux/property.h +++ b/include/linux/property.h @@ -505,9 +505,10 @@ int fwnode_get_phy_mode(const struct fwnode_handle *fw= node); =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); 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.795.g602f6c329a-goog From nobody Sat Jul 25 17:34:03 2026 Received: from mail-pf1-f180.google.com (mail-pf1-f180.google.com [209.85.210.180]) (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 E84C03D9058 for ; Wed, 15 Jul 2026 08:54:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105673; cv=none; b=tTdVISEqt0BlLBpbbEFgCFJDJ9JbX4CsPIOExMgiydYMxYOCUyeoXxAOCqKzpiEjI6HZbsOqeiQaYZ+vRS4kz3UxCJo78xA7rnctVqL/q10LuNSH4kSGZkXmj+hzTavk/ZQKuB7x8pwnxFYzN6E8SNhacDNPmFldJmMMGpMu75U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105673; c=relaxed/simple; bh=rdGoAErDNJBoyYumylqg66ArDzAHOM3wX5UO22Ntd3k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mvUyMsF/+t/v/m3yzVWsWn04g/ofVTEsbcPnjEcwjtN0+1DsIDqbmUQe+WxoJgMmZXovQQIZhc7fmZu/FuuDrjNbMUzW7xzJdBXujT25GwBFGoImQfasjPOh0/kO6ASvKn/o/wRq6BJCeA8fAzzUDykeAD30kh0itYuz5B+QpWo= 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=ijHjYnM/; arc=none smtp.client-ip=209.85.210.180 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="ijHjYnM/" Received: by mail-pf1-f180.google.com with SMTP id d2e1a72fcca58-84862b0d5aeso5531108b3a.2 for ; Wed, 15 Jul 2026 01:54:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784105671; x=1784710471; 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=tiAJexuP13y6uWXyvfEXpTcy6egDm283JzaUjb9zN+o=; b=ijHjYnM/3tgn+KlB+XxWanrduV9o18Y3avJUFrunGxFuIrrYkuL+D12bpNP/I7jtPY qMpapp6Z9xkr0JBfggFmD+XgiixuwdlgM0SMgqxpKpkvVwkGXfpgfim+SJsMYS7md3QT y3nIvdooeKsthPUoeQI4b7aPmyGfWsCZejwb4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784105671; x=1784710471; 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=tiAJexuP13y6uWXyvfEXpTcy6egDm283JzaUjb9zN+o=; b=p+cAhmuEUjI5AKiIYC17Y+2/P6nJCiLTSIGtLHO47AAggcf5bFjpZwzrAeqXI35oeU hXxt1r8nF1izwQ90PsnWdkOza/iAOoRTQY/abNGTAyJyHskJbAo9Vb3h/rcA4QVOTtbn F0ifRb6nkE5wguD76mlQ0h5EbWXRhhNOaqV2nnUvClfi3hlZnL/y0ucuzqT9SafYyayr t9PiSfol1Y5UgRpx1Z0KV08h+p7Ch5q2vczyyhMgVAneuJmYqE9Y1fnjkiQ1zWw8FJ5l TyjI/H+wRTmEXhLJzuS4BlHSibv/ISM58y8XX2x9fgqrxBFct/GAGF7P+YHw5d26edeO +VHQ== X-Forwarded-Encrypted: i=1; AHgh+RroaZt+HYaZDwN6azafJb9565LB/gjfKhhyJ2t7N9nVmRqEHBTTyafi4XGdhg4v8Y6m5LaWANAGepPXJsQ=@vger.kernel.org X-Gm-Message-State: AOJu0YzPPgAXJEaQugHfuHBqYv4bqKSBuvv44ZClZeDGSl5i9rD9Tz0c jtXKTTuanLuQ81+RBWZZixqd5zrjfXpke6DHObxCAmNrLVhKlOlKOXmk89WOFYXDdw== X-Gm-Gg: AfdE7cnI3P2DDpzttrHPu2lMI8FbL/CdLTnErw429VkaK+qVqh+EJNQoG4EjUH9zqer DjKgZdD9H4gDlcEUv7YXgLmEb82zmo5oAM0+xt7JXwGSqvUHhwPro+Lk3cezEj9BlUT3npaZMFb /yBfRd2seNa7+1EQNl6NYLtIb4qQ8asM5I6zo2D+1hc8dZ08B/tUJDTv81xg2wYS3F9L9VM7uxg KdcZu9h6FKClBK156LFfcLuFyHdWigGV0kfYPTzfoOmb1ciTRIIgbN1b5dYHFpM504Vz80mVpWc JgxdmfQjGIYdzk363RMs4t0PcFf5YAN7YAcTeIl47wEYBkPjftcQNnKVWsnALpTYbnIphGpIpVh 64xIi/U2GW/wRjO2zS+Z+TxtyCLyWwpcmhN73lLWudBIp3nkCfRB5riO57/iHNDnyiQXFiM6Yl1 pw5L4edHrAgh3UlCeV08Qm3JTBlDtENw6Bo7CWBV7oU24aVx/0h5wR157qIUSsYKaGOwgkLQ== X-Received: by 2002:a05:6a00:2d19:b0:848:44ae:47c1 with SMTP id d2e1a72fcca58-84a559964ccmr5439963b3a.78.1784105671342; Wed, 15 Jul 2026 01:54:31 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:47d7:4aa5:a6f8:2279]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84a4f819117sm2757491b3a.59.2026.07.15.01.54.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Jul 2026 01:54:31 -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 v5 03/16] power: sequencing: Add pwrseq_power_is_on() Date: Wed, 15 Jul 2026 16:53:33 +0800 Message-ID: <20260715085348.3457359-4-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog In-Reply-To: <20260715085348.3457359-1-wenst@chromium.org> References: <20260715085348.3457359-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_power_is_on() so that they don't have to reimplement it locally. Acked-by: Bartosz Golaszewski Signed-off-by: Chen-Yu Tsai Reviewed-by: Andy Shevchenko --- 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 | 6 ++++++ 2 files changed, 25 insertions(+) diff --git a/drivers/power/sequencing/core.c b/drivers/power/sequencing/cor= e.c index 02f42da91598..db8c91be10c9 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_power_is_on() - Queries the last requested state of the power se= quencer. + * @desc: Descriptor referencing the power sequencer. + * + * This returns the last requested state of the power sequencer. + * + * Returns: + * On success, 1 for on or desc is NULL (optional) and 0 for off; + * negative error number on failure. + */ +int pwrseq_power_is_on(struct pwrseq_desc *desc) +{ + if (!desc) + return 1; + + return desc->powered_on; +} +EXPORT_SYMBOL_GPL(pwrseq_power_is_on); + /** * 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..3c6122bd0205 100644 --- a/include/linux/pwrseq/consumer.h +++ b/include/linux/pwrseq/consumer.h @@ -22,6 +22,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_power_is_on(struct pwrseq_desc *desc); =20 struct device *pwrseq_to_device(struct pwrseq_desc *desc); =20 @@ -53,6 +54,11 @@ static inline int pwrseq_power_off(struct pwrseq_desc *d= esc) return -ENOSYS; } =20 +static inline int pwrseq_power_is_on(struct pwrseq_desc *desc) +{ + return -ENOSYS; +} + static inline struct device *pwrseq_to_device(struct pwrseq_desc *desc) { return NULL; --=20 2.55.0.795.g602f6c329a-goog From nobody Sat Jul 25 17:34:03 2026 Received: from mail-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.176]) (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 C77353D9DAC for ; Wed, 15 Jul 2026 08:54:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105678; cv=none; b=fzU6lzE3U08KLPxTvAqVZVlX3wQYkbkHFEEk++G6nTLXtMzAxqxFN4d5p64WUnHg69DO3GG2/+1iJZiGDdef/+l34WH9Ue3mK80jZh+zQ3OmIsHsn92QyXCj78gl+9DZc7/qVBNOGi1S8RiblkbMNuisd9l+ovPgR+yGZys9Srw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105678; c=relaxed/simple; bh=OlqZwr18Cpifvs6/MASST22KmUKK2zb2fxpZOLeBWT0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KZKxnVk2DssIBr4OlUA9dW8NqiO7zVGz8OvIPEUvsP7LHV0TCjB/OrXGvBxZPP2Pot1lyXVIqbcbVNKa0LyRXoJIIFaV3poM1QSnLdcZUKNSr+rEOH0XrvxNy38NLofGqVIX6dwq0b6HAkMauUggDUAbed+OindkNjTKxVV1sOw= 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=VZgYdqBM; arc=none smtp.client-ip=209.85.210.176 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="VZgYdqBM" Received: by mail-pf1-f176.google.com with SMTP id d2e1a72fcca58-84a4d8fd6ecso1822888b3a.1 for ; Wed, 15 Jul 2026 01:54:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784105676; x=1784710476; 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=dYICwpllA6REcHU83KV0EGKSQt2kKv+TAZuxEKEYalU=; b=VZgYdqBM9Bta0pcAAOAqBbcozTRYHYk57aR3CCuV4FYSSO4JxeTaLeOzu0Mpkt7PCU c4vU4T8TZ6DPuoPQ7wX5fWouPMzzxJ7aTFnDf+Ucl//tVoUCevXtg/Zi3zPLXN4SfZO6 KOJcR9CfC2XR4tZCmOUeRaGrFgodnGv1Yt2LE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784105676; x=1784710476; 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=dYICwpllA6REcHU83KV0EGKSQt2kKv+TAZuxEKEYalU=; b=VSUSQNlKON1K08WwTSUMQeBLW50H6gv/67wn9GFvxq+R3Y8Qi+/iSyjdTbdVYle4xG Ez/1L2iQYQ9+103A/oGIvFPJ/xN0bxPfmD7kbQ/J4V4ISLaCHIqXrjctJgtLc3uuFtjg WFwoQdckKNKh74odpuVzwUm8J83W8rmRlXmx3QHUq23FzQLKvK/JVzbVNoUBY3YQGM/L cZAK58lR/Lx1HEoSaI5g8ZhQXGa0yxQF8R5h+nOvXaYmRq6GFetpFTJsaYvagq6OqmDh 4WP8tKZQesbPT6BTTBpXh8LLvRM7ZSE7vB/wnTCFmtvupBh+ugRaniUCWWs/qFQcVk+9 5i+A== X-Forwarded-Encrypted: i=1; AHgh+RqAZKEUmlRPFB8MBlZqck3LDTnR0UqslYGISVJDAORjgjiaRD4sl2ha423MqXUNYsdQQzfVewuORjEyq5A=@vger.kernel.org X-Gm-Message-State: AOJu0YxrlXsH1DbOoSLNtXgbnhNtoI2nHM5XBEN5cE0G0rv7YHBKfiT6 GL9IO1C30JVuhXycuedc0XIbTnywzm1/58jSxree4uwTTkWSQSYviED/5wrJYWbcZA== X-Gm-Gg: AfdE7cm8I9CffbH+QmP+fpjLHHCeZ9OZIS1PbwWYoZZs7yWl6FEF3vWVbkn1RSpU+7B /t6O8yWPWqIZWalR/gZ8HF/zWyClhNR7bfRi2izCiim8d9sUNqpn0X2ks0pFox5sr9dD4ZVXP75 6zWGatLqNJM+3+Xg9NoSw/bWgYkPXI6AL5A4WNBf3P1Z3NLAgH7U3QL3/jT6aZFp5Ui6ANdUaXm c9J9NPByAV1zxYBjLV2Q+BZEfqdqp4E0k+MpoEIXqfGFZcDwm+010duqkhGjIeY3+WurJ69dbsZ rtNhMiFFOAmzjyGea3cAbPPwPHt6/Oo0VIbeP52kU2Xty8HPivF8Ej6KvFfbCXw/Gues2fWnD53 IbrbSYN+0ukYg2qogYfjVgSsk5fA6B29xlasoNUNRXaybuJmCkmKA3W+5D1a4woZsnBaOcKq+K4 puS9x+ZH9HjQkpRWoeAW46e0+Lgf9rw/kOoI0+7vZhiTna4r9rQ01H5xx4XLE4i1YRAfSCkmjhf gR6R7Kp X-Received: by 2002:a05:6a00:17a4:b0:848:88e6:95d3 with SMTP id d2e1a72fcca58-84a673928d8mr1756444b3a.72.1784105676023; Wed, 15 Jul 2026 01:54:36 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:47d7:4aa5:a6f8:2279]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84a4f819117sm2757491b3a.59.2026.07.15.01.54.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Jul 2026 01:54:35 -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 v5 04/16] usb: hub: Use assign_bit() in usb_hub_set_port_power() Date: Wed, 15 Jul 2026 16:53:34 +0800 Message-ID: <20260715085348.3457359-5-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog In-Reply-To: <20260715085348.3457359-1-wenst@chromium.org> References: <20260715085348.3457359-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 Signed-off-by: Chen-Yu Tsai Reviewed-by: Andy Shevchenko --- 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 9b2bf608f9cc..36342c5718bb 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 @@ -896,10 +897,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.795.g602f6c329a-goog From nobody Sat Jul 25 17:34:03 2026 Received: from mail-pf1-f170.google.com (mail-pf1-f170.google.com [209.85.210.170]) (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 AE40E3DB63A for ; Wed, 15 Jul 2026 08:54:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105684; cv=none; b=QwYgEPC3OJ9Pl3mBQudAleNd7s8GAmuogWRFT2Z1l9uv8tKRgD+P1ywN8x2LUt29BcrSECMym+EGfyEKhKpHWi6OTQt02ogXG8Y4kQi724yrGCoKNGedHhny/07PYrwAao10w4Pni9QJSyZdqbokDeVUrzAM6EX0Sf2aBISninQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105684; c=relaxed/simple; bh=zZejQ+aVWVSSNX1WygLHkrfwpLKJjoR2C2VYQ+E3BZQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FjRoC3OCNYLyrWhqLX1wLntVcL0ASVBSHcIe8XsZjZ4QuNbmRPeX8FvjBq21I8NLMBr2wQEyw6Vfe8odi/RO7RaVplvPxaGlyDjg3BAgVO0iUrrQ0SnjCG9MItwe11wy3zus2jLufZcIBgVjEdeWNnU54Hgc1P5xFj28Hd1KAnE= 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=ZXCHVCMn; arc=none smtp.client-ip=209.85.210.170 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="ZXCHVCMn" Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-845b6d9bf39so1846552b3a.1 for ; Wed, 15 Jul 2026 01:54:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784105681; x=1784710481; 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=PR/rf/FwXUFRek4b9eCK6DZXZyozjvhZuepJNtfrJR4=; b=ZXCHVCMnM2Rmhrt+5rSTUruCNAGpx/zKEnsicqNkAeUwqpNzRNwz9l6SegOgcv1EEK LG5RB1pJU6rd27Tob1oTWJkLtRdZwciIn0OEh1BKXaMpLv/sD7pbP5KSh8N1+GFmFR0W fjMObK0JH9k2Rs0+NDbRHKIG1YAgvOiaxNbRs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784105681; x=1784710481; 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=PR/rf/FwXUFRek4b9eCK6DZXZyozjvhZuepJNtfrJR4=; b=E5kKsbqJosFebPSakFSRbAQkK0qyLYpRqM3JKiF42X5P9BQsNdCRFJwsshKQP1d1ib 7W/bCrywFNbZhjp3EAkBCmmZxxTtdwgcQrIgJCI/i0r6pMUFv96M/Zkht2sEwBZNvGHH S8KZfCiCHr76OxibeQuD/tvARlc1YWqt4EN7qxft2CYGzRxDre5iBCT2/jh+bh/kOuqf 8nOQ935Yd5OxX4vKqO6DJsBJkCJA8AeWu1/n8quSU8+CtsHaBogRaQjZaMCBubat5ToK pjij+vzj1a94ynv7whGCfUhdBCQIxW+suvMDMwZd9x1k1AcRGUL1HjlPYhd8pxZdbzD7 Q/aw== X-Forwarded-Encrypted: i=1; AHgh+Ro5KJjxn2CWBSvHopEJHbdxXCawqXa6uDrRhegii9Pkj7g0dUl5MyUrPEm+ECw3IGGGVrLJmH/ieiZEL0A=@vger.kernel.org X-Gm-Message-State: AOJu0YwPjHtJrcXIwKQ4yRj2MvLe0Vm/T5IlqD4gOKKk0zlwlrx5VGow XGl8BEra0pSTEyTeCMzNRoGkIdumxEOLCf+HRLyQn2ssPXEHRInMLwUY6yFrgo0AGg== X-Gm-Gg: AfdE7cmUUjw6qm/WEL3HRK+X0ijbijOo59gy4bR6eWfklbPcY3fGVUdRwg+wnd/Riim W22mphtSqbs2PsQXVXNo1nL2fHhmpnmjD5AsjqO3gqqmSlOC/rMQJtbNRKfycX2DA/kLn4jEuPL qljChKaVTH0IibBZaTqa5h1f8hrY643U6pZchnHNL0Hb+U3dH+FqKSroiEsXCqf12gKCbJFsv5s nbmwbf8JIhAjI1X+xxhI26iVgkt0DoAfM5//AWclQALNDd8a5EF8GelvAbUMMuXbYtM7EtBG6BC YIRiS60ALNCslkbyptU33UFfTOh531Qfc/mBgv2rohtiV8Oi+UdqmKlO3553JbJCbfbacvUC00b 4Kj0FJ/jlAOb2EHBw7PD1NNCf5Z1O1YTXz03ggkZ2Mu+oHRBwbRY6xICyRX+PazYZJ+wyY+Ef86 y4nZyJIjIRf5exWBNB5BPTznxKCq1CVgba6RrDBo7U6NvTUkm8wg5xqIQA/FIHvtx7HFj2GA== X-Received: by 2002:a05:6a00:2384:b0:845:3033:6cbb with SMTP id d2e1a72fcca58-8487036fc99mr19629780b3a.11.1784105680847; Wed, 15 Jul 2026 01:54:40 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:47d7:4aa5:a6f8:2279]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84a4f819117sm2757491b3a.59.2026.07.15.01.54.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Jul 2026 01:54:40 -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 v5 05/16] usb: hub: Return actual error from hub_configure() in hub_probe() Date: Wed, 15 Jul 2026 16:53:35 +0800 Message-ID: <20260715085348.3457359-6-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog In-Reply-To: <20260715085348.3457359-1-wenst@chromium.org> References: <20260715085348.3457359-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 36342c5718bb..a260148091c5 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -1872,6 +1872,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); @@ -2003,14 +2004,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.795.g602f6c329a-goog From nobody Sat Jul 25 17:34:03 2026 Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D16A03D9552 for ; Wed, 15 Jul 2026 08:54:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105691; cv=none; b=s5ARFGZOfCiUUDxEisWg3ZazVH1icPDzMMJMQB5MCGTRyNlm6DNQO2a4VpyqsgVekwsKdczumvKygrtE0fDbp8s4xtJM1iLHiypC+VHXj8Oa5CRjvikyvcr4SgZC5Djy8cYXi3S7opHGsVv3czZRcXXcm117Ib4c6YAF8An7LjY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105691; c=relaxed/simple; bh=9nlEv+Xa1sTuFoWhPSW1h4HQ6sr9BjtVm0Twy1kDFGA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=j7Zzrjblwqj/R/TZsSwjDQlCQJgPsqfSA74lhzg0V4IbCkyBcyT97fpgxu7A6Z/ZH9v/vnIXVv9FUz233g6k6B2pZQU3qjCtdyLbZcpzKMVocuVc7XF82Apf7XBvpWwRUBs4RhMXmrd1+Nu2NuY8/zFtMrMN1IZztM/IEAjUbdY= 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=Px+LR3Na; arc=none smtp.client-ip=209.85.210.179 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="Px+LR3Na" Received: by mail-pf1-f179.google.com with SMTP id d2e1a72fcca58-848595b338cso6085081b3a.0 for ; Wed, 15 Jul 2026 01:54:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784105686; x=1784710486; 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=e3MWujHDcAo6N5pm988slASDpmZJoFPb9rC5ReM64M0=; b=Px+LR3Na5thCg3SeVAiEA3tfSCt+rvACYsEPDHMJIG7EETxCyIyPOFfs+3jC+Sp7yw 3TY8Q8ZyVsfesqM/WRRPbpoFAMJzUDp8IjCcdWS0+4ZHXlslusKO5SPdREx8for7gXEy 7w7vJ1yShUl5gefWKwUbRDiN0pOBupC8qKVGg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784105686; x=1784710486; 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=e3MWujHDcAo6N5pm988slASDpmZJoFPb9rC5ReM64M0=; b=qlt50YzFuSnCkmtGJGJs4PNhrvEBAC8qDDtK19FHKYLhFhRJ1lMbVo819ZgMxxm/nS HGFdBzVQuzCdMDACBKxMfN5NegUkkp43yyQnX5Sdkl3f/oWXcDx50rF5L90/2STYl7j8 y/YDsyqmoXblsBVHYANXDJg1ImXswdvWlljSWpMeu0Hu3MLIQSymu81TiR74tuq3DDJX 8FttH/18GOhrdq9nijLBINIknnPlWEeawM9p8vuhkC5Jq2/eI0WyUxC+w3bD319eemy3 mn7e/J3ivC4UtjQS+gYXTfXC2YvobVlGb5HeQgenQhSs+o7mwboqMLmhBNOBwxa/LmoT tiFQ== X-Forwarded-Encrypted: i=1; AHgh+RpIJT1/8u/vVOXyIPLielavCjQ3X5AfXmo0uSZW9vtf8rBJ+VuOZWzgrQzQRp+EdiRbMEZR4PtHWiTLB3U=@vger.kernel.org X-Gm-Message-State: AOJu0YzWqBT721KAGgygf3FeTskeShezG83UHvbJJzCSbBxGcqSggTWP 37bRH/FXpCElRnDSXmUhfwL8pe9DmfYWfCb6UVUy5JDrYYpZvqbZGi+0RExzDp7WqQ== X-Gm-Gg: AfdE7ckcU2WcPNMHWCc975mubl44Qat3Pp24rCVRZWHKZU+7tMxsEAe13YxYdVuNH2r knYLzozVntynR6IznnOMHqmYOKkEkFlOwSU9+4Q+ekx6UEM350iiY/56+D1E3xGtpBoxaKOpVvT 8ssRjHOjazV1TaiFNZIvQRrAuYG6h2lNzLMZkbfTA8AOLgJ9tA3Q57Xwa49C8FyHTSwpwvOa2at +Ojx9zYieA0d6v1FNsVwAtHzx5F23owoaXSXpyAe9iG/VTIfiuKa73BoY6frc9Rbrg8v6/bfYrc YSuhPWEhkTHSBUYW2Ddj0GhblMero5J70iiut1OesPr+iKAuRD1NFQ30Pw/wLLxE3jgiVloC8t5 BMsu7XzzPatnGTKWzCsMOb4A8QwO9yzCtWZ1HZpP0iBAplflkDiHgYgSl1eRHW026npVcDP619w t32p1ZAfM3CRFNr+aFo8Ne/huj/sasIVpz7uHKNvBjeGvgYe+cJ80jznHnwxULVsfqoz+qqg== X-Received: by 2002:a05:6a00:94d8:b0:847:7f3c:b5f5 with SMTP id d2e1a72fcca58-84a554fa4e8mr5539619b3a.11.1784105685669; Wed, 15 Jul 2026 01:54:45 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:47d7:4aa5:a6f8:2279]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84a4f819117sm2757491b3a.59.2026.07.15.01.54.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Jul 2026 01:54:45 -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 v5 06/16] usb: hub: Associate port@ fwnode with USB port device Date: Wed, 15 Jul 2026 16:53:36 +0800 Message-ID: <20260715085348.3457359-7-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog In-Reply-To: <20260715085348.3457359-1-wenst@chromium.org> References: <20260715085348.3457359-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 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 | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c index b1364f0c384c..4fd0a4745741 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); } @@ -780,6 +786,14 @@ 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(dev_fwnode(&hdev->dev))) + device_set_node(&port_dev->dev, + fwnode_graph_get_port_by_id(dev_fwnode(&hdev->dev), port1, + FWNODE_GRAPH_DEVICE_DISABLED)); mutex_init(&port_dev->status_lock); retval =3D device_register(&port_dev->dev); if (retval) { --=20 2.55.0.795.g602f6c329a-goog From nobody Sat Jul 25 17:34:03 2026 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) (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 E65893DDAF6 for ; Wed, 15 Jul 2026 08:54:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105695; cv=none; b=cE6vLV8b1CItzfYMqRJDSTg4EnbajCoigvUAOT9UnJMRSBPbRNb9jQ/yQa0wQtNfvhHuXG++bSGfMqfXzOvaRljqGTOR9bd9su32zqDhdr3Haof+NovAN148UQMROs5z6OgqjzDRjQvJOvkZ/4bcLzmYzRa8M/h8z3gJIhgEX3Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105695; c=relaxed/simple; bh=5VwHP1+2fR3lVbJK1MfJg2mvITlMH5rmXsp1noB1nRQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ObUxO1cF5YUD0knqDW8oj9u5rCEtEZb2iVIxSpp9JFMnupMmlawMSjFvJ+z9a+H2F0sCSghEE98qwdA5yqTfJJS10rpn93CM5ik19gMUqqS3Fay+M8OCIAe2a+25TQJBnA2T6XONtDdIIqEOglFlL3JbG/pVG1VVnqL56kIaB0A= 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=EpZsW5wM; arc=none smtp.client-ip=209.85.210.175 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="EpZsW5wM" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-845b6d9bf39so1846696b3a.1 for ; Wed, 15 Jul 2026 01:54:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784105691; x=1784710491; 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=4AeC3O8QPKVB2ifeJYOSWItZEEl5hPmtb5Ax3dBIgNA=; b=EpZsW5wMNWaBSbiAUvmW+svsC6RRxb2N2KOk69Li9fEsY7Irfdcgqz6shCFXdWTxaB DfjXedJWlxF2NZlfmsdi2jD7Lj59xJb1DIdrUbRK0ZFl7GW2J7Mc5bgeSKEsH0+EpAJX nSQH6eBFuhgtJXdwXI9sujiW/lfF77eMYFKjw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784105691; x=1784710491; 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=4AeC3O8QPKVB2ifeJYOSWItZEEl5hPmtb5Ax3dBIgNA=; b=YhTtmKzkz68Dp3LmOtFWYrN2aF+cgpB5Yo3cOhgKT5URahtbZhoUHrOHlf6mKRUqls 5W0m+lBzKDQVySHxst7NVAhDVg6yi7tzgtAqRbSokZIBGOceR734lxA6tC+NwZgux6Va qORO5IcmlNFQLUog0KNvJ7eMoDiYM610dUKdP0e+Tn1lWys4bqOnlPnq1+MX4QktIwU+ ntuXOzeER6m4NmjyQJ4eC0QgjYRTykEDv/5n9+VhGvP9VevWYJfNTbIcQVFdmnkDgMIv 0UlPw23tQcKZGpHG4MFuwk+1uiv8D3BMyrYGxW8c9ZmpWwYQZcdksrOJTiPg2de7NTrT zHBQ== X-Forwarded-Encrypted: i=1; AHgh+RpYLST2usFjUw+gyb/2CRaATAIyedAlD2FhaVky3Q7kIo0uVMgLqV9lWMybBUNRXKQnen4MYThY3UjBhN0=@vger.kernel.org X-Gm-Message-State: AOJu0YwVWLY3l4jGbUBLXGNPpMbaGeqR211gN0KBtQyVAUDQnou73Ywh k4En4HjxmLrD8WQEM8JsBnCS99jDrKLkAVxMFlMHbmHFfwvBmWMJqcQ/u/SQXSboag== X-Gm-Gg: AfdE7cmQkZBVAFP+kmICP2L6MfyzEmubt2Juh1QSmEdHRj5+7XTfuwflYzfbJ7Jknt5 OqGTn5plqPVwpP1RSjA1JZ8c9sK43xtk3r8ohsVMAUpSfRei44JG5wkmKcub5k+jjeqDY5W5NSp voTQ2AsU24Eq4vHOiAHWIMSO/fmYp9mwzLtR4FRFeM95UznMRFAwSl4InQKK64ki8PEgSq3Jr/J kzqmoCGhMJtBRJBEOUbDpf+wlwgzydeGTgyYfhm5Kk1/293boKSIkiU34jOSIQLovANUAbXQCP7 yrL4cTE581nWKzMexCmqQz3bp7KezQI8Cpd0X+wDnZ/3sak6mh3yM+3X3rjrASYsAOYCr4wWnHg 3l5K1IVw1ALAOc5o9bXOi2ZL/T/wGQTxkp8cWt5zkpu2DsRSfe/OA0TFhzaMVVlVvr0Y+LpZF8G qzDAJairwb7j8r3lfsMZ5oje1idijL13dmJxd8ndoc67l4mRMPywelyF7PC3THPKsSQRzLdPsXQ WoI8MJI X-Received: by 2002:a05:6a00:8c8:b0:848:2ef5:50dc with SMTP id d2e1a72fcca58-8488ad099edmr13299301b3a.36.1784105690673; Wed, 15 Jul 2026 01:54:50 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:47d7:4aa5:a6f8:2279]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84a4f819117sm2757491b3a.59.2026.07.15.01.54.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Jul 2026 01:54:50 -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 v5 07/16] usb: core: Move struct usb_port and related APIs to port.h Date: Wed, 15 Jul 2026 16:53:37 +0800 Message-ID: <20260715085348.3457359-8-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog In-Reply-To: <20260715085348.3457359-1-wenst@chromium.org> References: <20260715085348.3457359-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 a260148091c5..e5a726dbebd0 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -3237,22 +3237,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 4fd0a4745741..8f99bce074fc 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.795.g602f6c329a-goog From nobody Sat Jul 25 17:34:03 2026 Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 04CCB3D969D for ; Wed, 15 Jul 2026 08:54:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105700; cv=none; b=KHOJv1ftQ3hGCwp2wkjrmfSHezqZrFIXusqibBsCg+VRRTtDoe7+yoTKkXfY6m/nKHzZ8H0VaFBgyW1hmHIuofwYESBEiYVeLaBZwIvw6GRgqqHAd/mI1SC2lfZQoZgpfhhqa2jvQeezkODzvRjuFQng97BQKxwZJyZfH8Uf808= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105700; c=relaxed/simple; bh=opJsajl38n8Ljc0uMTAPEIDo4mHro9R4uiqaF9re18g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VoftD7SbrpSbyVEVjI+RmiBoYdd3IJj7QvO8uP8r4Tw35ugIfcASFWgr2KsFD7HZyLP/wnzxFO7gzY05PVJ6w4SFuZckEeIiZbBCUY96hHaVxTHNV+Mcifey0Jw07xZ9frKtRw8dKH4jzBYtw1YI5uZCk25dr1qAF2pPUMchPMA= 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=IaIeBTmZ; arc=none smtp.client-ip=209.85.210.173 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="IaIeBTmZ" Received: by mail-pf1-f173.google.com with SMTP id d2e1a72fcca58-84a2dcec51cso3678088b3a.3 for ; Wed, 15 Jul 2026 01:54:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784105695; x=1784710495; 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=1xsqWCH9ZpOgskGGTXJEdoztx/tMXd/WwKbk5g0tHRc=; b=IaIeBTmZH3hyK9offsjw1Q6gliTqa8twVc3B4zzp+LQAUXF/MTJ6auH81OqGWgRK9B dA1Xp+vB+rWT2gFDNdRsZq3D1uP3Whtj62Auq2CitT9lq9Y4MK0wjRHv6M5vJnUXrfop 1ZbTGbsRJSgnmab4vf7XohB4O5WnSxEZv3Ivk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784105695; x=1784710495; 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=1xsqWCH9ZpOgskGGTXJEdoztx/tMXd/WwKbk5g0tHRc=; b=klO4JKqjYLrGSZQJMFGeQKJ+hSzU401Si/m495HGpqLJftOTQ3dto5D/42kRvmxoN5 r8AtIDFc0945VudgobaWMkslpdPRXHbcV1a9TF6cC2ahzULkIBsWot1JNSvIqi8mCvjr DDIEJl/cgqmxHVRUL6f859JkMdmrBHPiTaIozgUYT6vWSi00OXG8q0aeVxRkCAXpm8f7 7aLZv60/2GdpnQh48O+qIiSaEZLNWk6wI007DSJhhSAIU0yHENceR2EgkELsemCbbUGJ vcUlHedNuXkdvc9Nzd7X0eSOaIYX+b8lNClb6QPtVqGlXeUqJX8aUklr2zfDsS+ZN9Rq h9Dw== X-Forwarded-Encrypted: i=1; AHgh+Rr1VeiP58s/bO8M6oM9l+aoAxG6CTuo8hMKyV0L5nDxxBMwMUSg/QG5e+QrNuv9c0LmKgdrs1xb0oWJSeU=@vger.kernel.org X-Gm-Message-State: AOJu0YwfPwyK+MFq1od6TFPLYuyYCTPkv03ou9O3+s9sH+IL2iQyUctM hoRizo4yws6GeQYamlBiztts+rDyt2FLbDYjQhM2oO7pr/CtR2Khgh/EylbEFeCi2A== X-Gm-Gg: AfdE7cndAehqmezOMt13LaGIiiHE4HctwtMFIWyC73quW8ouuGgD5+Z+UluBXmDgevD T8jcmFGy24zKIGzVbXqG8BeecizYru3y84ARkNLOGhHZTndzj9IpFbycKgLvea8YQ+PHih4EEWg NtTLUrZRMogMbhOwLD7O1OLv6qAPgJdFRCgUlD0C3ZKnfJrxZUKM4McbcnLzkyTIVgA89Fk+JeB S+gyQnakgmdMOswfoyzd2lpRbHcRtpM9kpsNM6P2sI82frA+didicFyOdMFIeiRwwEBujpY9sQy HU51iwMIt1SDK2dmkgTmgoNhzkvkZyyLy52HykaYEQ7RrnWbGER80SjiPTrcW331k7/5UCViVvG OF1tWq9Frb4M2qO4vEnAG1P5CZZaoiHXNYGc1M7yWylCo35gJU/JMPIWyH7h/aAWU3HvoMbZmrB +oVeqj1hEiS7HY5L2Gs1oBBH8bFvln/G/4tv+dKTYXBhOt1VgPFaSTQ/LyQzgZcsLJ8qC/Hg== X-Received: by 2002:a05:6a00:138b:b0:848:7f56:1e44 with SMTP id d2e1a72fcca58-84a5576f784mr6047283b3a.7.1784105695546; Wed, 15 Jul 2026 01:54:55 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:47d7:4aa5:a6f8:2279]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84a4f819117sm2757491b3a.59.2026.07.15.01.54.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Jul 2026 01:54: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 v5 08/16] usb: hub: Pass |struct usb_port*| to usb_port_is_power_on() Date: Wed, 15 Jul 2026 16:53:38 +0800 Message-ID: <20260715085348.3457359-9-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog In-Reply-To: <20260715085348.3457359-1-wenst@chromium.org> References: <20260715085348.3457359-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 e5a726dbebd0..40cdb63b5333 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -3288,7 +3288,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)) { @@ -3730,12 +3730,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; } @@ -5431,7 +5432,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 8f99bce074fc..19913ad3598b 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.795.g602f6c329a-goog From nobody Sat Jul 25 17:34:03 2026 Received: from mail-pf1-f170.google.com (mail-pf1-f170.google.com [209.85.210.170]) (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 862753DFC99 for ; Wed, 15 Jul 2026 08:55:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105705; cv=none; b=XjhQ/jrjMkqGrkRBW+N8Vc53CAkDIWKe5rqBFtvPp3YbBzCiTocQv1SqBgPbf3eb3icHBbpuq68rwMxrwaObOyZA9Lc9UbrAc+wE84dMRZB1doF8R1tV24596dtQTGuWzjCQOn/sBDE7aI6hjeYBAh/FTqm1XvwohtimMELIOKI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105705; c=relaxed/simple; bh=y3WhF+SuyleAojl6FwQNCSw5fjhd9v1zDhHyaW9zvKI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OBH5ER2fTGUU5aAUQuW/8K/gvYj4FvMQ/6OmE7lddVaBtI7yM6qINDFKsgMwPIlRtgkdcxYp3OkujSBux4aoPRubFA6y1tVokjbj27/tinZc9XyQn8W5VsZNiCh4SGteXbEBsAFf0JQSIQRCEwuJvnHhejKazY/wk7wRTw0JyE0= 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=U4KiaC8Z; arc=none smtp.client-ip=209.85.210.170 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="U4KiaC8Z" Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-8486ac3f347so445489b3a.1 for ; Wed, 15 Jul 2026 01:55:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784105700; x=1784710500; 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=jC877lcIipbzPO12i6mSRmQx7EEzSrLJZiMLFWRppMI=; b=U4KiaC8ZHcotD1jLJItMvlRs1LXy3siwlGpuWwcVjaYsH2uPgbxhrljMsmmnnTdrr1 7RfAyNcwK2WRn6W4J6jlrEh23rCKQsvuExVUc6LwyJLCH9L3hkelsyQsM7v+GW89vtSy VOPwlU3gDFh+6S1Id18vmddoN/2FGNbbNfknI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784105700; x=1784710500; 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=jC877lcIipbzPO12i6mSRmQx7EEzSrLJZiMLFWRppMI=; b=MH92ygfXz3V2OLF0oc71lbn5Ik1c/K60KrOUAcfDQhu1mN8U67g6nLBE/GXXdCFf2d t6OxQQtJo0vBR2cQIG84Qaysw9VqN5V+VfSxPX4qVWdwkn2B5EBzcjS2DkRvztl1ukJX O3Ke+IlrRtUeElPXYc1qdLx76nLlpSC9W7IzNemCWtRME7D/H1bnB4rnbze4EhLt+W4z nxsOGehWeTYqh0MAV2ASzqDzEahFeezOmEVb0jomAnmK+kIZEpsvMufNutt89EaPgyLq z4qpI8ElmcygpzKQfz64JnIi1lmhGgQJp9CqXYK8UiirO9dXtqB83vPNHRqfG2gJ496u egrg== X-Forwarded-Encrypted: i=1; AHgh+Rrh+ZhCBZk6A/iO0stkyixnQ3Q68w8rwBseW31v6k40uupgf4SZ/GueeinCyW2DMGMBRwx4vlDVmgSWLPA=@vger.kernel.org X-Gm-Message-State: AOJu0Yy/F2+qVkSqyj3isscZzpbCCpGo6BZ+lzmYtSSucTPWn9exhqPU ZM+Tn1fMsiPcmAoZQPfgNIbO+vhUv/5AUsmTjQnRPhfK9GeoXABOjNykEKCwQO1YKA== X-Gm-Gg: AfdE7cl9Cc0MMlVS802Nzy+N1j6XBk2u36HwxB7oatl6EpLUXw4QsFzQpXb3uMoEB0O VScBBicx1RT85GpZfXwW0JpfUw7bSBrDjCsNUQePNNcDWBTisbnVad/UunvPrKS9VJYLiHswf4k r6c8l9EUZUcJxAqj/DQBZVCF72Ei0x09T7rynFeiAE+7GPJ2NF0tZq4O7WaPVYtlPZzjN7akWfc Y/A7n5f2cfJslhYnRgqDIcPpKTaay9R72yFagSwWtuBog7Xz3hmZ0Iq3ipdIDwqcV+Dm3+CbCUS e0uO+Cni8jpLjzbAUZk5r1QoZtcs33hRB/UDZvoVFdukAOWECxdq5tcf7a2uJU/ZC6ISEWhh0Lf e33h2MOjs8CTJTWhCUrrBBoI7XjeA2PtkcmPwrZdNApWmt+EwOg9D1enqDJ1MpqS8+kvzHjWpc0 F4ZdiYURb/3+00tegEkKGyJMa++H+kIkya/uIIbqCBM6q49102HJLmKyl9QPBQYnjuzxykEQ== X-Received: by 2002:a05:6a00:3928:b0:848:2f58:e1e9 with SMTP id d2e1a72fcca58-84870790b80mr18374319b3a.36.1784105700341; Wed, 15 Jul 2026 01:55:00 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:47d7:4aa5:a6f8:2279]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84a4f819117sm2757491b3a.59.2026.07.15.01.54.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Jul 2026 01:55: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 , Bartosz Golaszewski Subject: [PATCH v5 09/16] usb: hub: Use usb_hub_set_port_power() to control port power everywhere Date: Wed, 15 Jul 2026 16:53:39 +0800 Message-ID: <20260715085348.3457359-10-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog In-Reply-To: <20260715085348.3457359-1-wenst@chromium.org> References: <20260715085348.3457359-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 40cdb63b5333..47010090d3b6 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -973,11 +973,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)); } @@ -5434,7 +5431,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.795.g602f6c329a-goog From nobody Sat Jul 25 17:34:03 2026 Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5D5723E1CEF for ; Wed, 15 Jul 2026 08:55:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105712; cv=none; b=QGL+1iN2JWJcs8w/lG8sa2noZdUUi7cd0Q9ZB1dwy5WqqkyoRuRfWRXosqXe/mqYUDaD5wLzgiUT81Fd9bdlFmwZtTC73l42rxU5Ux3isBRHsyAHXG8Da/SDMu3s99h9jRsAAVYlTP6HbJQkdCMUU3LGW1G9lJXqfcbWuuO9NAE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105712; c=relaxed/simple; bh=tWQ2A1T+SOjbjO/WVwz/04jkOIhhvgNOM1YJmS9tiKU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=j6Xk1xweZmb9MTfFYAwR1/+TZUcK8rwJ17md8+RraUuVbAHydeA2v15EmJXt+3Vvycq3h7MFMpats2bdAUCL/bhiB5dp8jJHzSg1tVAIspSprNBZWwklzVNmwj5UuY1NuRoT5eZfqISNTqccaIM1YRWroi78rnCNzxMt4E3AIhc= 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=Ax/J4pnY; arc=none smtp.client-ip=209.85.210.179 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="Ax/J4pnY" Received: by mail-pf1-f179.google.com with SMTP id d2e1a72fcca58-84862b0d5aeso5531477b3a.2 for ; Wed, 15 Jul 2026 01:55:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784105705; x=1784710505; 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=f9EofJLWLQaMazkXy8PFVbgKayq1WN10VKKJgz0Tq84=; b=Ax/J4pnYNOHxBZtK72d+nYAnS8B3BhzZkU1+a1pL04+9Sf4LDziBILGV8qqqehB64z 9M3aNBIDZki7As36OJZA+GLEN6WjqyY2CpJcxn5FQdHBtsyttlsfkdzys+XMrLPGP3F7 YDqLLRvSG3T7/n0udQN8sghDlzd6uoYPigMkI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784105705; x=1784710505; 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=f9EofJLWLQaMazkXy8PFVbgKayq1WN10VKKJgz0Tq84=; b=Hu0Y0YDsP6SSV/JxQPYsLSbBLAFMo8zM5+8tsTJV/nj8ChpYy0im/ayVVzu1xmcOYE ZtA9vQTe3pcpuF0ThBvqrzQgHpkDzUgxGs2FlMKSPeEoU+vtTHn5ANXwjLuZvwXSnZXg tpzs6Pggt5gDnjQTnHNULNaE0cu4/FQ2JgRR9Ke9Dx7nRQkYndA27TKvKVn7rvSXwFbR rI5g5RNih1UY4v+ehOCYO2341w0NT8rPvGBMAm4L0w4V9B5E5dd3JrYDVsoyeVHHD9mM MbtYorLTvHvXWVsgglY0/zwGvPyytti6rz0sIBzLHDHaKZAHOy/LGlw6ErlLtnvwr6Pg ao2Q== X-Forwarded-Encrypted: i=1; AHgh+Ro+zLb2UdnVhFART64Bw/dNNMjXXZocz0igvy0Dbl5UTQiZJqu8NnJwzpQg3ai7rBbCCTYohbp18zeyg8Y=@vger.kernel.org X-Gm-Message-State: AOJu0YyhHMadHtrglPJU9iG9Z9fqmb1k5NJdPbMbqnchj/tUq8YbcriV UOYwsJvPH6yV7O0+YKzfHE1VxQrxy2OtKFdA/6cqlTH6hszyCQ7UjVFcTseNb31pTQGnujsaTXw EWyQ= X-Gm-Gg: AfdE7cmnPL9Ip9+86FZT/w6xlQcnRUEWA07Riwfd3eXFyOYjLjBHNOMefBuIioVNWSu IGN+UFrBsHLurJI+LITHDi8JcZ9FYzh27t65SFrZKK1F2avfNa0jOI76Y8rww9N//MAUvLZve/j ovYlwhIpFFGo8r9mhrcTepBo+G9IACHrbKIV9TE9EuYnepL7YGxaiP+LoKJoNMINgu1s0ea5oFB oKTmN4WIRUPscNKWqNvdQJk6LC9H4mmeISGrADp6XxUzlijKc1AVsVmJ9QiJsxOZryFdGcWt6Wf 4n44tlta5ZWHi+WPuKU2ScRzYm/7Abwqnn5YSvdE9qWrM4nkuj72KTUa8FmUyhnLhlcJhvjXov+ f7vaXefGOLozHgQc5nsmMi7uxvHe3RWvV/Q0K7LYjTy1Q3FpEk5J6wq9nT0cEKenphvdCkzxKXd E8N9KiU37iJfqceg1krlJaRisHrekO+h847OUThyOIza1YGrbi9AUg8BZgmUZ7HjQVad4XNQ== X-Received: by 2002:a05:6a00:1701:b0:848:42d0:bc91 with SMTP id d2e1a72fcca58-84a554fa58bmr5493373b3a.12.1784105705226; Wed, 15 Jul 2026 01:55:05 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:47d7:4aa5:a6f8:2279]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84a4f819117sm2757491b3a.59.2026.07.15.01.55.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Jul 2026 01:55:04 -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 v5 10/16] usb: hub: Power on connected M.2 E-key connectors with power sequencing API Date: Wed, 15 Jul 2026 16:53:40 +0800 Message-ID: <20260715085348.3457359-11-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog In-Reply-To: <20260715085348.3457359-1-wenst@chromium.org> References: <20260715085348.3457359-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. Reviewed-by: Bartosz Golaszewski Signed-off-by: Chen-Yu Tsai --- 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 - 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 | 8 +++++- drivers/usb/core/port.c | 56 +++++++++++++++++++++++++++++++++++++++++ drivers/usb/core/port.h | 2 ++ 5 files changed, 85 insertions(+), 2 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 47010090d3b6..d31c4f807391 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -33,6 +33,7 @@ #include #include #include +#include #include =20 #include @@ -872,6 +873,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 @@ -887,15 +898,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..7277c38c9e62 100644 --- a/drivers/usb/core/hub.h +++ b/drivers/usb/core/hub.h @@ -103,7 +103,13 @@ 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 19913ad3598b..430fc9023250 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 @@ -35,6 +38,10 @@ int usb_port_is_power_on(struct usb_port *port, unsigned= int portstatus) ret =3D 1; } =20 + /* stub functions return error */ + if (IS_ENABLED(CONFIG_POWER_SEQUENCING)) + return ret && pwrseq_power_is_on(port->pwrseq); + return ret; } =20 @@ -45,6 +52,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 +390,9 @@ 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 */ + if (!IS_ERR(port_dev->pwrseq)) + pwrseq_put(port_dev->pwrseq); kfree(port_dev->req); kfree(port_dev); } @@ -770,6 +783,40 @@ 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; @@ -814,6 +861,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 @@ -831,6 +879,13 @@ int usb_hub_create_port_device(struct usb_hub *hub, in= t port1) goto err_put_kn; } =20 + port_dev->pwrseq =3D usb_hub_port_pwrseq_get(port_dev); + if (IS_ERR(port_dev->pwrseq)) { + retval =3D dev_err_probe(&port_dev->dev, PTR_ERR(port_dev->pwrseq), + "failed to get power sequencing descriptor\n"); + goto err_put_kn; + } + retval =3D component_add(&port_dev->dev, &connector_ops); if (retval) { dev_warn(&port_dev->dev, "failed to add component\n"); @@ -888,6 +943,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.795.g602f6c329a-goog From nobody Sat Jul 25 17:34:03 2026 Received: from mail-pg1-f178.google.com (mail-pg1-f178.google.com [209.85.215.178]) (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 46A233E3155 for ; Wed, 15 Jul 2026 08:55:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105715; cv=none; b=PCdA/GPiXP0wZby4ECVZ3f9dC0swE9lWSJuxxndFsr9AZM3V5U7VqWpXGIN7VFoLGgNUHNtlaogHTnteajZxhweXXaEEhgHdI+/hUIvhoxvwW2sHHcVgRPMG3IOHlOhiHUb7l7CUtvGq7QApxlezibXc8TRAKL0oNw1Pn4EKU04= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105715; c=relaxed/simple; bh=lenyNo7yJLPeybyXOoMP7XgBlraWqZU0r6gw2MR7+1c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=axRPoxuRJCIpIe6+cHBCFXg38gzon+kK+yVR8r/kJfOe3235DjoxYKojxpA/5RH4++RbryLlkRB5l04AIGKinNRMTKp62t1WP0nI9Rar/Ctxr4rnXSdeZ+2BAfxn9YnPw8zN4B9ep6qHbkwUmq8Ww7y5yUjJLnPk06ZV8PIdy6o= 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=Ixva/yuz; arc=none smtp.client-ip=209.85.215.178 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="Ixva/yuz" Received: by mail-pg1-f178.google.com with SMTP id 41be03b00d2f7-ca97d139d8dso1230170a12.2 for ; Wed, 15 Jul 2026 01:55:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784105710; x=1784710510; 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=pRAxPjZgDa6ntXP4Zl1WhffxSqufwl7Pl3uMzQrQ3GY=; b=Ixva/yuz5D8tKB4fohb6jSQatDmVli4ujpK/mqdAvHBKPKha/QuP7t2Ivn0Wv3lDqt 1wWxnoZDTc+IcD0OucWOXv8l3eeB9EuUh/okhTMAhiPp2FOkgnm1tZ8T7MoDfq2o0p5k HZ/ipY7/MwQBwkMDoPjcitYhDKLK3i3z9YzTs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784105710; x=1784710510; 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=pRAxPjZgDa6ntXP4Zl1WhffxSqufwl7Pl3uMzQrQ3GY=; b=ALkwXMcbrXMkqr3q+WR+kuSvkVFF4ISsOYioKNsAp5NU6g+EZeUbVm5B97p1JovBY+ vFVOvM1wkSqxnHMhRw+fJZLBJbneYZDe7ZjfY2gChYHs790hAuV1thBgRZve5QhWRN4H c8u7BuxQ+I2IT+N536mdTSS02QFxi3x9llEB6aGz8jQls5l2SJ+O4+N9M3Fn8EB0Rfvi ssW1r+OLcKLFcMU6qAjZWSDcqDXzNPEqJOPnH9Qi1cVnSODMnrpZgNuuF4yDslX6Ngn9 BohS790ODBVpgbpgUQkg4s+tIuKBd1Bhbvi7j+xVFwU4NJ9ldBbdEaR4sBTTHVrRShNF yDwg== X-Forwarded-Encrypted: i=1; AHgh+RoGPCBXF82ciKE4Lu7VYan3BAcddJX3YYB9QJprFEkjnTRPTKo2X/UFW9gv4dtwMyi2YbbxQw24DwFfxUI=@vger.kernel.org X-Gm-Message-State: AOJu0YzQhhUCtceBC4IvQDJp+M/yeG/ggbiPhU6XXvdETtflxhSkLgnw NTL9qi6z/K5qsXA+4eb0/W6z0IUtNAxZNI9l+eQDC2wGixvHNfsoZ7WnqF3+Lx2QDw== X-Gm-Gg: AfdE7cmWevK+ORRXH0cWqcer3+hmFNYBXF9PpholkGbY0acDiEdBeoqLewz7Q42uqt6 be2oDfhtY1BElZSH02Ht92S3kzGauUBjvOZytNY1U57EQbnokOtPzAIot0WP9X2AHsEjNOEF7rg 7WAbogclk2krs91UoGqu0NEaL2Z0p+F8uxwLubG3MorPbZYYKMgA9Mz1L0TaZHWKEiYJ5vWf89t Ol+UY8H6GwrkhWXNLNcNMN9L41e7rW/dJrj1BaAyaEQ7rlBtMHZAMlTy5HOGrtsJyPTCP7bmvg3 qrHvOi1UZQ2IiOMjqG4UXBoAzGw7NyDgmobIDXeIsS2HFbGE2y56wrWcYK2/4iz/hWfanFCX7/q uO0MYN+7cP7okmZI8FEVZzC4kGp89y4BkPID75rvPQWFSR9+fcqNYTmCDCF4fRuX1rTnc1bvx4Q wz1PqXAN0N7SR9Lcjgu9FGQ/A+lJ+0SLuNA+e0zIaCcXxWpK/L7wpjIyHK4lSZOUs21fp9Kg== X-Received: by 2002:a05:6a00:1d90:b0:845:e9e8:6458 with SMTP id d2e1a72fcca58-84889703f26mr14531622b3a.20.1784105710178; Wed, 15 Jul 2026 01:55:10 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:47d7:4aa5:a6f8:2279]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84a4f819117sm2757491b3a.59.2026.07.15.01.55.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Jul 2026 01:55:09 -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 v5 11/16] dt-bindings: usb: mediatek,mtk-xhci: Switch to ports for USB connections Date: Wed, 15 Jul 2026 16:53:41 +0800 Message-ID: <20260715085348.3457359-12-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog In-Reply-To: <20260715085348.3457359-1-wenst@chromium.org> References: <20260715085348.3457359-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.795.g602f6c329a-goog From nobody Sat Jul 25 17:34:03 2026 Received: from mail-pg1-f178.google.com (mail-pg1-f178.google.com [209.85.215.178]) (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 B3EF73E51EF for ; Wed, 15 Jul 2026 08:55:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105720; cv=none; b=K5dZ13vSuIue86aKjIiIowwtgt1WbOvlFTJt+lE0CjTDc9bHfZLQkpOK/QX2n+Abh7qfJSiBOejaY22DoEMEiYVGphyf46yCGUdRDFpCS8cobfF0VsJ3ReOeGTqFtgRXTPNPVU5yt+WbA0Pyr/D+hRtQFZxCluXRDlKOoX4HnpI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105720; c=relaxed/simple; bh=gDXGZ+qtSgJBs1RokahbHI9JUNzui3YVteN3ANdaDwQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gdLLkTlRbzP762OaLoamtUH0cPEhP9Q94Hn2ePbfojOSqiOb8BtL7DvepjIKdAPjXjpMK23LHJt7/5W1C1tZytVci12Af/GgJm2H+RT1+0MXgyy2Qa2CCgAJoLTVjmmXwJkcLsyXpNQLdFlbf0j0Y/C71wKHsJdDUopaSn7ZVy4= 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=gPJdLGFW; arc=none smtp.client-ip=209.85.215.178 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="gPJdLGFW" Received: by mail-pg1-f178.google.com with SMTP id 41be03b00d2f7-ca965de53baso1074335a12.0 for ; Wed, 15 Jul 2026 01:55:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784105715; x=1784710515; 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=YVHm6p5wN5KSAyn8QSBlqPHJusamsYORhaWsm3vPLUI=; b=gPJdLGFWJPu2ncT7/v+qGEENyv+INhQHiPv30+8oFRe4ZhZwvfT17x6mf5srhvRY1h 0DqNNIeyWvxN8I2h36QSj+Vh7MjpJFQBsdtR6qSS9eGhrahvhC4gMpYd6qDFeC9pmFa0 SZn5tMfTJS8wd6zi59r47jW8IR+Vox1siunCQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784105715; x=1784710515; 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=YVHm6p5wN5KSAyn8QSBlqPHJusamsYORhaWsm3vPLUI=; b=AYvmLB29Acs4sJBPPlc6u7FyMsCXWwHd7VvE+jUj+Vb026oJU9KffBdbMWvTvKz2BK SlpXdWe8AhKHHejsDLKZ/XwL7EwpWD9fyC71gNc3Yv/QNHHYBby3adOf7F7eOZV1tQUZ wDqDmE/bMriXEHljWb47NLh39eHvjs80U79Y1jRVHnKZHR7HjKzaHEyddl4Xmoj67NTo fGBAJ4unM+wYWVxoUFgCZBHcxTf0dw5YjjVCcTSr0ihR5uxDW+Q3QvKJPtIynZa1buti 2jh2KTOXwhvNbZqpg3XOAZbjN4jRq290wlrYVoxZGP2EjU3KJIMLE2gjZKOdvBr6Nj79 ksVA== X-Forwarded-Encrypted: i=1; AHgh+Rq2fHLvvvKKXSNSNlmzwkw2tv01qFuT2nk5WvmhNgwkl1tTx1WTXtIpHohIPn5xMKRHa7xvGjEHf4xrLaQ=@vger.kernel.org X-Gm-Message-State: AOJu0YxWqmCVUJ63rORZEtOHyNSP5Rib6xvPwqIySjzunODOIDLT25ac nhQ85TG5UY5y5eRQlwTzMY9pefnCUuwoLwvISG0lBJSR6xdqYbyJAuBijio8nhF5mg== X-Gm-Gg: AfdE7clqxWVPIBhymabHI5C6NCHX1N1T9n5TMHfHXmwe7ClJV4AaiNScqyBccm0z+7g EDNiwT7rJ4luRIeqWTy4Icgq8smKF8vtUy/imf+UNYqNZbYwz0SFCEEjRKGeqOv9fZTucVd7nry jnkBExB/+gg/5xwhpLIjv2Kh8p+ncM9eAimL5/kOtPBPvr6Wnt0fiTjA/fa+H85RKb1LLLBGAzv ca4VfBrUvv2mFRYuC+2y9IcIDRw2D0yTmvr97udgV4+kiw0gcUw7E5MiVoc993Abvph9VtO/6fs idpeG7JHWs56Jc5QWmLWZzD7S2XTSsPfAEeejiwPUSMaFzm59+rPlu/1C8jhUa0ANWFWeWAEAYn j1k2BesD8txSacwvmSYLDWoZgydY1rxLz7FwSMWDvce1Dg2INxGhNDMLOoXy5SzMx05VWinUq5P TDVQ2nypugYUtCLhI0kpPXVK3MipRb/zXceZQ4PkkOb9bJtOox5wGkbH8hUifubBZQyQd3UA== X-Received: by 2002:a05:6a00:228e:b0:842:3aee:12c0 with SMTP id d2e1a72fcca58-8488960660emr14884802b3a.23.1784105714825; Wed, 15 Jul 2026 01:55:14 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:47d7:4aa5:a6f8:2279]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84a4f819117sm2757491b3a.59.2026.07.15.01.55.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Jul 2026 01:55:14 -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 v5 12/16] power: sequencing: pcie-m2: support matching on remote "port" node Date: Wed, 15 Jul 2026 16:53:42 +0800 Message-ID: <20260715085348.3457359-13-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog In-Reply-To: <20260715085348.3457359-1-wenst@chromium.org> References: <20260715085348.3457359-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 (Andy) 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.795.g602f6c329a-goog From nobody Sat Jul 25 17:34:03 2026 Received: from mail-pg1-f170.google.com (mail-pg1-f170.google.com [209.85.215.170]) (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 693F63D5673 for ; Wed, 15 Jul 2026 08:55:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105726; cv=none; b=gHYbKMJKkKzwciCCNegWMo4mmlyNbetw7dZTGNFmOed3qyh8tD8Ppk+EALn1JTMEbcK9C/Zt0v9t/jVIWGc7kkiWsg4C29u+LPY6lf3gIwME977+gI1E0nlF6YV/s2HnnpXq9+8UWsOjjpoRXhNScCxAlN7+PAqAWpPoq116PTc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105726; c=relaxed/simple; bh=S9qazdwnsr1QgW0osAkaYIzoucgKhcC+gdhN23cyZxU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iuWrtxgzt7hVZIRzUlLdeyQuYbfBn/d2tOfIbjdk0PcVbKK64cxscrFhoLh3JciKl51+cKl9YtEUYzoqQbred/jyhzV/LUcQjBrnsXHCyIVOJaiAK5ntkEx85hzmUt5/RkqW6lbMA4Y4o3ofjWiD4FMhAKDG3p1Tb7l7PqJQvE0= 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=UJdH6aVp; arc=none smtp.client-ip=209.85.215.170 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="UJdH6aVp" Received: by mail-pg1-f170.google.com with SMTP id 41be03b00d2f7-c9e0b89e228so1175117a12.1 for ; Wed, 15 Jul 2026 01:55:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784105719; x=1784710519; 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=R59ctZio0nbgqHRQ4JYecMwYKlS4svhcqsOXKq5o7ro=; b=UJdH6aVpvcxq7poyI7pN4WpXDbtvcjl3Gajb+p9bZ6Mf/iN6Sdnr+pTkawsVmtCQHb bGJa862wQ9cnUKRTEH0Cinkm2kizRGy/Eddyumaw1Xs56rf+w/u3mdMv9VSJeMGdEfg5 x4S4qLZHFMDhDY985fB1VxdVAC9CQT4uawi1w= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784105719; x=1784710519; 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=R59ctZio0nbgqHRQ4JYecMwYKlS4svhcqsOXKq5o7ro=; b=KLoZMh9/kMr9VsqeUbb+//SqUXX+Ftowxh7dYPbdPZz+Sr7ZdGQHBE2zdNQZSz+aB4 4sme9Aw+Ask/LfXlrq2i4EkeyI9G1hhSnCP67ugEFwBj3TtYtfSfBj+35XNUOEoCzJ2J wbO3xOF2UFMpXpE7/jjACdshnoME7iI4Sj8WmQXtYm9ruLwDH9GUzPvBtI8AwVsJJka4 qE1cgb9bGsrp26tWg1Y9/0J/O8T274od6aG7QKVNPLLTzQqtrO1+fl74rGho8BwrBGi9 vBIgcFQ7GhpLq0juFzIjnfVJnYcLgMB+/gkxWkP/ZvGVuwt+N3E/NET6FoO8k1Epp46n nMPg== X-Forwarded-Encrypted: i=1; AHgh+RoKnyPld5qpjkseawVlOS+sWiDtjvSA9ZHMDxYADr3fi+nhsaUc32oPtzrooFk+FC7WFJtFT/K6JJKDr/o=@vger.kernel.org X-Gm-Message-State: AOJu0YyeOLYIFPz5QnNRKOrI23HaRoNo76+tE59DMwNGsxw3XhR1TcYB bjTHdRQVduqQ+QZpAH6ikumN3YvUk8ZapYZEAGmD0UT0rNHkMVeoMKi3tiF0Yhhf8A== X-Gm-Gg: AfdE7ckEaQpMTe8DrokM6s0AveDDDdv9Ld/mJDBuj0wy9/s0k6s0Szr/qBWP/IPV6xP j9Fl5knyuZTNsY0TQEVH8S102hgIZlnDgS7n8HU2+HMBP4kS+lDA5wCpSOn9EaUFoATuqx9eFwY 1U4xJHCcPIys4hmPlcFEbs0EiF6vS7+jdFdFe5CNTLcDrXm14zqChbpSRLHLHaTv8FAm883N49l YEz5KTxG0gxgsyDFiZJGVQitynzV8LdLcDx3UlRSnKfWMtp9MI51uTN7qMx0qCQ2x7mQzXpSrQd KpLXXsXXEiacG8bCYtkmL4MtAuLn+VBFnpzG8h0eXR6vWRQwOvce56OBogSLtXHSFZotiJbzRXd bK2rdp+jL1mc1t8/N/tB60ZD5DM1LQ0TDZQFNNg4tIs/bnfl0TycmU1ngNxprhT6mxhDa9MDT5j TnpmAKZfLUzJIayBN1wJs6anwZXtGrhRn+Z570huCi6/93xa7axYLSQHrTW5mEi6GFeuhkNg== X-Received: by 2002:a05:6a00:ab8a:b0:848:48e7:437b with SMTP id d2e1a72fcca58-8488985bd87mr15890965b3a.69.1784105719486; Wed, 15 Jul 2026 01:55:19 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:47d7:4aa5:a6f8:2279]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84a4f819117sm2757491b3a.59.2026.07.15.01.55.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Jul 2026 01:55:19 -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 v5 13/16] power: sequencing: pcie-m2: Add usb and sdio targets for E-key connector Date: Wed, 15 Jul 2026 16:53:43 +0800 Message-ID: <20260715085348.3457359-14-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog In-Reply-To: <20260715085348.3457359-1-wenst@chromium.org> References: <20260715085348.3457359-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.795.g602f6c329a-goog From nobody Sat Jul 25 17:34:03 2026 Received: from mail-pf1-f170.google.com (mail-pf1-f170.google.com [209.85.210.170]) (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 2A2A63E7BA8 for ; Wed, 15 Jul 2026 08:55:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105729; cv=none; b=nlDL191/FA1zJw4cz2bARBDLH3bmS7vB5WgkmwKbX4MIbVORf5pXfNvyfk9SPH5JQuLmcHDuMW2EnoRHZ1eLP+TKb59+sj40buo3TRH0LD89UTRwGomCZ6HK1Jnt/BGxz6o8Hj95dqXlew4jBygtfM5GHHFdD2I9Alj/Q4QObNY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105729; c=relaxed/simple; bh=5/IN0+syw1+quFd0dmc3wlZb141a8fcAYXzlkitn7j4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MrOeoI3mxaEmsTg5I5ACssYi1zMXQUCG+p7/PPGWvon0VEUjfiNICjUzXym9sNq+DMRWulBfOd5WpDAahkimfZr/Kpqr9tbeaV2t73SdsmTAsFx3b4FH4oRHh6R/0SiFSCe12v3xEy4lYvNw9qpOcReETgl38zlgbErneppuL74= 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=idup/aKM; arc=none smtp.client-ip=209.85.210.170 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="idup/aKM" Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-84861fc51f5so3049649b3a.1 for ; Wed, 15 Jul 2026 01:55:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784105724; x=1784710524; 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=x4sxxYjabBMDuNPYs/dekkLCAVyFQe7dZPVIfnECI90=; b=idup/aKMYmrAJ1Br9sFr+Q9yHCeHXIN8C17e+SZneXQY8JqndzpaAfdJu5lIsVbNgL yb9hUBj7fg66XSRjTwK4Q7CuerbGaXIMJUzhQglNB6yAH0msrd8hR+ecdL702cPlQFd+ 9WjDkaQ5ZSuCp/qYwJU1Mn397kqkJvQ3E3w9A= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784105724; x=1784710524; 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=x4sxxYjabBMDuNPYs/dekkLCAVyFQe7dZPVIfnECI90=; b=YK9/KcIeqED5sOlVJiwuO/zm5HyPMYBhFd/VoVXzLevb7R3ZShnzWSLC6CNvyfOzFA 0l24gCVenue/3J7OEmrI0SntxUzZqnsJlOvLjI/TrfMIFIykF5i4WRSWH1oluv5KRNOV uZA9npS+SMRnw/gfJwNDvhwr6vNUroJiWOsTDOocAicTdLXdQ4KFuuReurZrPI3co8hA fpcli53H7N77fPsbgnqJdDzI4/z5Mdyiaaa/jZ9LXD9R4bAATEwNgd1Sony3foOOEm0B R6yfN/uyUJIUmcshz4ENnH1cD6rqgXBw42AIu4MP/9pBpkT3zTJi3MGtqzuoRKJS2XXi h3Gg== X-Forwarded-Encrypted: i=1; AHgh+RoMM6yc6I/uH5FSSyJrXnlCIN0TA7KZFHC5QQ8hjvpp9jK0lyDZwn/+TgLsiDmn84h71Vitkc6fqnnhYiY=@vger.kernel.org X-Gm-Message-State: AOJu0YyyB1/WosnXtVEMCDwF3mp1iK2hImYbDtUwKYPxUsbM6Ccq2Mv4 O+D2NJqOV+89VEy51xaNGOI/dPr3dfU1O8ZmwvTmNUKgcl9GXTq8xOx3DeQt3e7zqw== X-Gm-Gg: AfdE7cmborGAgJN1WeT/v5qHADCfrrMjZH1uxenFKqOHTtR/c2pjomHcjeM+YM2gie1 jD9T8jsttctZTaJN84eZDH5nUDuFl3ZP0CCVq5Q1Ycerr3p/9TIgC94FlljJE/ePu/X1hevPd+9 geg0FiNclSwkpnGbb11ASmGA0aZE/nyUyPSx82AqHdugJIOLRZEbAwpWx7uYVXarI7G++Y9+jTO 2tpWrj29qfFDEdbm8ICT7vdZ+s0uFf38ts6G2QP1ftTkZ0sfVjYrHcy3ir/RgZOMJzHuvEttWp1 CBVrk18y3rxDiPmndjUTHl6EfOM2VG9/DeErp4D5hR1xawJ6Z0tOMKGhiB641uCCJW0m6n0yjXB xkVQbaHIvD79TSaMzhcKVKMsy7Al458taLWcxf5KHaRa96OY5BuniR3IesYD+VFPrzrjlv/lymD VWz9wnn9+Aa3RhUW8M4d1QqOdhu3YdSAd5Aufp9eznrAnhtnF9EXKYaXdoeE+2tBS9UqpNWqJpo WivQCGJ X-Received: by 2002:a05:6a00:12e6:b0:847:712d:19ac with SMTP id d2e1a72fcca58-84a67242621mr1719045b3a.8.1784105724146; Wed, 15 Jul 2026 01:55:24 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:47d7:4aa5:a6f8:2279]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84a4f819117sm2757491b3a.59.2026.07.15.01.55.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Jul 2026 01:55: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 Subject: [PATCH v5 14/16] power: sequencing: pcie-m2: Split Bluetooth unit based on interface Date: Wed, 15 Jul 2026 16:53:44 +0800 Message-ID: <20260715085348.3457359-15-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog In-Reply-To: <20260715085348.3457359-1-wenst@chromium.org> References: <20260715085348.3457359-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.795.g602f6c329a-goog From nobody Sat Jul 25 17:34:03 2026 Received: from mail-pf1-f172.google.com (mail-pf1-f172.google.com [209.85.210.172]) (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 1A0BA3EAC7C for ; Wed, 15 Jul 2026 08:55:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105734; cv=none; b=uilHB9WJlCnrIF6vqhyeYMiT/jlSjVVxPwRAMmv2s2aV50kFHFjWFBtftEO7HIps5KuTBrCA+oMuFZKa6HhgE6sWurwnqVh92E5ZDV5a2RtOikIx1e7jsJON5zL4qxaAVD/5ct6V/Co9QhOCEXXxAy3rx8K5nEDMNUiG94HYasc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105734; c=relaxed/simple; bh=Kwdh1wsDA3PQhAJXo0c3P6asDMiUgGjPhgZiuNl33tU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cqiPhrPEXvUpM8SynfbHjW17RKxvVQie4MYUPOi0JU1DyWjpTQHtuzHgPwqZX7NqMrD1VGynSFxK7Xwzdfoyezdkm8mHFZVadmrbwm3L2oJTY92Jss2mV+5XAJHThbYPNiy2cz8oCpMl+lB2eAsIGkkU0IG1MChEyKM9Z/Z7Ff0= 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=YD+657aR; arc=none smtp.client-ip=209.85.210.172 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="YD+657aR" Received: by mail-pf1-f172.google.com with SMTP id d2e1a72fcca58-8487214ad2bso2681380b3a.1 for ; Wed, 15 Jul 2026 01:55:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784105729; x=1784710529; 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=E3HJTWjS7+7k2AMeQ/ADfiVkN81b/TWdXvCN6CQ3PZA=; b=YD+657aRgzTGumB9/oj+u6hfr1yAFK+xox0LXBU5PnN3FPPpf1xaqUYUTqv4drsZf6 pLfnBrEDEWUtFlJnyHR2sv+Ghxjn68bj404DI2u9vHanWEL56iIAkFLwKHnHD9l3f+Vv qHO5xy8FdjpojvO5acW/dlTCdgKSRmcLM2vF4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784105729; x=1784710529; 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=E3HJTWjS7+7k2AMeQ/ADfiVkN81b/TWdXvCN6CQ3PZA=; b=AJC2kXiNrJSDjkYpSaLHSJoweRm9EMoP2SBzr1v4A9kdf7z2OGhFXV3vbnSz7+VP6K uZdro/khI4+QblL576lNGmR4ePqQ71ZMRhFxhxK87PSBwNfGYgJ8QjZglw5YCccpLXeb u/kz0VErFax5emCRgI+NSP/QJlTaKtkbti9ai1oxVx1wnOfrGIKBS2MCNyVY0602WXuy +Z7GKQs1wovXfeLWl4fIS5rXV9qryoHzILDe8kKJZGL4Lr+al2nMiZ9SHzMTZfnG41cS vLy75Zyylt4hCXrvcKtFyVd/TQB18ckcm8e4wCzbnO/xZSM4ThNv0J7FO0HlK/CrFmx3 2MMA== X-Forwarded-Encrypted: i=1; AHgh+RoznAM+e465rM4RBZccOavqCJnAvfkO1296txjYRiLqQeVsnemt6r6aPG3qlX7WQk5fdJQIQRBEUOscUuk=@vger.kernel.org X-Gm-Message-State: AOJu0YyRmi0dcin9M1LVkKDPi7NS/i9iaK20nXneaUeCU8dj5j1chfla 8yJnJHW5WFlARyEVfDd0zrJ5/GQfEaurIUsEFAEXqZ0B1lPdWQwJqQxxIbhxjboUQlC4fuQYUVQ 4/AQ= X-Gm-Gg: AfdE7cmTkAF9S9hmu94GFTxRLo9yOpqzWhSNxr/1qJGSQx31Ateh5o2rn1qORcr7Qfw 2+I1ivqcTLe7uSU8q7cv6bJOR67EiQlAqosLBZztANPaP9lj05b5+0fXV1IaaShl4j5KoTDaK1k 0422r+oW4vAMrztDcDahnHbNL11u+EjHXbPT2Na/bFYrtNytG2dx2fVtQLwfDMwuOmpleCAdp8Z 6aRABOh4hVEuuikgDAJAs6CIeDSe5pOvxKjH5bu6n8+HpP9mE9+MH8CQrghf021gRXLZ9n5/K4m q8dZs6/6UzsqMf8wcJMYUHSTpclA9+X5lfVtnjwOYEyCtfVv+T9njrKnOLxTiIB6ujZPui4w8rI cVEAIqsIZ1K7D2uqgxxuATk4McP6LzlTuwnuuOjgrpeFI4Cfm1pq7loPOgQsRwoR4U/0UDc1Ueb pWVSKvv8YEOx6rFLjcjs6FPIvNPMzM1ZDAfdU2B1xqXEFpUsfWvb6MfUYfG60THVZWSVhfBpRrp UggkPE8 X-Received: by 2002:a05:6a00:23c3:b0:845:d284:9e11 with SMTP id d2e1a72fcca58-84889756a2cmr15382339b3a.56.1784105728841; Wed, 15 Jul 2026 01:55:28 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:47d7:4aa5:a6f8:2279]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84a4f819117sm2757491b3a.59.2026.07.15.01.55.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Jul 2026 01:55: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 Subject: [PATCH v5 15/16] arm64: dts: mediatek: mt8195-cherry: Add M.2 E-key slot Date: Wed, 15 Jul 2026 16:53:45 +0800 Message-ID: <20260715085348.3457359-16-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog In-Reply-To: <20260715085348.3457359-1-wenst@chromium.org> References: <20260715085348.3457359-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. 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.795.g602f6c329a-goog From nobody Sat Jul 25 17:34:03 2026 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) (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 05BC73EB10A for ; Wed, 15 Jul 2026 08:55:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105739; cv=none; b=HZ2tbUG335csFs7X5gx4jPCXCtXGAHfftAznwNKJFBtnTAI+IuUkM3elcMDMLU4MZCvOWpe4JdZfzSyp8KwsiQh6y3kDioBtK5Ch5PrwKBSTNs0ti7CxONmTUcLpkWd3EVyuKIuS0BI5P3ZTzhvS4yLsSFz8JXVsW9TcyzNYOzY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784105739; c=relaxed/simple; bh=YJyU75cpPuviW3DeoVCtVsycwY35EMz4CrOCdWp2v74=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mc0VyGebLrtz3B3bLuteojogjec0OXOng90yii5htGVgGjEs7Ef/eqNidF7oMi0E2L7BqLABFiL9+RkvkBWweUeZOTV+NcV3p1HkniNjyEgc+svSxhUOfYI9WkC0T5isc7KQPsUQLxSbPgNropxgXvktYCX9GGqd9WY8QTYNOwI= 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=OVszIwLS; arc=none smtp.client-ip=209.85.210.175 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="OVszIwLS" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-84a4d8fd6ecso1823734b3a.1 for ; Wed, 15 Jul 2026 01:55:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1784105733; x=1784710533; 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=fzcA9TG2yqej8iZO6JRem4wjlVQiv9Z5qdYjer6rUOE=; b=OVszIwLS7H8jiqE+d2DA2xPOT8UD7FSvMFhYDyZYT7/CL1w2FW4FSln6Z6V63NeATU R/fFeOrvCXNGaIKFMIOAnuZpho1aiq2jCYiY5ZRKWQshFQv2EQUWDDKgpBCNwPI9CnD0 F/DTNpxO9rBgMZHeVDybxLXFqlVr1VIEwVCxQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784105733; x=1784710533; 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=fzcA9TG2yqej8iZO6JRem4wjlVQiv9Z5qdYjer6rUOE=; b=ju1amDyBECu4LTUtK3H+yPPk3wIV5sWbazWaKut3qPaZVP3Q5dX9f5c3wv68HZdV8H R0VtIPf77J95QTaqadeUPa9p6yKC5hNKfojOcb/hZWhb6jeXfiADow6s1cBNnuJFycIF lt2z95gSM+VWH7/t2vFkVrCsMcyiEmQbNqiW2xicx9KTS8rKGnUNwblEI9UwK/OzicFq 56IDFvIk+XA32Vzrvt/EfS66qKFZa+FyaBbBt11LbFKAZ3Yers504cpe35OsBhUlRwZD KtjiTJ86ZRVKGafwFJoTNRwogZ02FbLiY6jhnkd4HL/TQlivpDQjiO7njdMcOYxsUxG5 U40Q== X-Forwarded-Encrypted: i=1; AHgh+Rq33ufTad8adtnwjBZO0zJchWMAUUpXvjxRrMH8R94K3/dcrDNRuYkgK+KSCF1QAWpbO9ZGCTNsRwBaE5Y=@vger.kernel.org X-Gm-Message-State: AOJu0YyqlynCksJQ9NAhlJxeoQAXevXGl2aLuSC8OhkJmMIZAE6z8qMk l13X7g2kMzC3n0z24caWJ468bW8dG7V2gD0lqnrYWhtdFjN+0abCXwEJdXNQAnf1Ig== X-Gm-Gg: AfdE7cnwKVQpdzF+V9OnLVjz80aSNrEev2truEwGn2HU9uJVcFuCzNHF4mxfapjFMVo S5UzG6KFgT022w7KjhnfJch/4o9Ae9wmXcZuaBfYqwYmP/ZxrEfz952vGLlitgKlO1QQhA9Vk8A vufNFpweC8xg7OeUXeZPCoPHZ8LYsD41+Bp/+X40CYmScwqcx2hVbMZsXqZrI9sh7cMqUpm+ye3 S07ZMyVS+2OtX7EQlNtGOeD3AG13bdUdayDdvjd0jHei3ToyJ6V5aTZc+56JgG5wqawqENMNR3r 19h5EMIbb+WJXaN31aHNLPQ3PktdIZq/LhKEL33rEihnB1/zVQ9vS0aaBZITP5oXlC6vJpgteS+ Eq3dfceJGmzVwpbtlXhWoM/t2rLkh2ZOtKw4w+CLT2cATqpZ9b6H26HMApy+eYGUBn8gM2o5ARf kR8C9nrOqigyp5vdvZSCmfyQyv/L4AwakIOXC4pAj4Lo8knAeJX4LJaXQxPrQSqW84rXM0Dg== X-Received: by 2002:a05:6a00:368d:b0:848:56ff:6ced with SMTP id d2e1a72fcca58-84a6723d613mr1884956b3a.8.1784105733495; Wed, 15 Jul 2026 01:55:33 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2a00:79e0:201d:8:47d7:4aa5:a6f8:2279]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84a4f819117sm2757491b3a.59.2026.07.15.01.55.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Jul 2026 01:55: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 Subject: [PATCH v5 16/16] arm64: dts: mediatek: mt8188-geralt: Add WiFi/BT as M.2 E-key slot Date: Wed, 15 Jul 2026 16:53:46 +0800 Message-ID: <20260715085348.3457359-17-wenst@chromium.org> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog In-Reply-To: <20260715085348.3457359-1-wenst@chromium.org> References: <20260715085348.3457359-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. 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.795.g602f6c329a-goog