mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
To: Chen-Yu Tsai <wenst@chromium.org>,
	Bartosz Golaszewski <brgl@kernel.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	Daniel Scally <djrscally@gmail.com>,
	Heikki Krogerus <heikki.krogerus@linux.intel.com>,
	Sakari Ailus <sakari.ailus@linux.intel.com>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	Danilo Krummrich <dakr@kernel.org>, Rob Herring <robh@kernel.org>,
	Krzysztof Kozlowski <krzk+dt@kernel.org>,
	Conor Dooley <conor+dt@kernel.org>,
	Matthias Brugger <matthias.bgg@gmail.com>
Cc: 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 <mani@kernel.org>,
	Alan Stern <stern@rowland.harvard.edu>
Subject: Re: [PATCH v9 00/15] usb: enable M.2 E-key slot USB with pwrseq
Date: Mon, 21 Sep 2026 12:51:46 +0200	[thread overview]
Message-ID: <0133cf19-709b-41f0-8f2e-e7ffede3ac1c@collabora.com> (raw)
In-Reply-To: <20260916075745.3549953-1-wenst@chromium.org>

On 9/16/26 09:57, Chen-Yu Tsai wrote:
> Hi everyone,
> 
> This is v9 of my attempt at integrating the power sequencing API into
> the USB core to support the USB connection on M.2 E-key slots. M.2
> This series was previously titled "arm64: mediatek: Add M.2 E-key slot
> on Chromebooks", which caused it to be missed by the USB maintainers.
> E-key was enabled in v7.1-rc1 with just PCIe and UART supported [1].
> Hopefully this is the last revision. The fwnode patches need a reviewed-by
> from the fwnode owners.
> 
> As for Sashiko's comment about fwnode_get_next_*() not putting the
> reference to @prev when @node is NULL, I plan to update the kernel-doc
> for all the functions in a separate patch later.
> 
> Another one of Sashiko's comments is related to dropping the wakeup-source
> property from the PCIe node. AFAIK there is no alternative as there is
> no longer a node to put it in.
> 
> Last, one comment from Qualcomm folks is that the port numbering
> conflicts with what the dwc3 bindings specify. IMHO the dwc3 bindings
> should be fixed, as the dwc3 controller embeds a XHCI for host mode,
> and XHCI port numbering should follow standard USB host hardware port
> numbering. I will send separate RFC patches for this.
> 
> Changes since v8:
> - Moved Sashiko-related comments from commit message body to footer
> - Collected tags from Sakari
> - Dropped USB port related code movement to usb/core/port.[ch]
> - Link to v8:
>    https://lore.kernel.org/all/20260904084158.1341550-1-wenst@chromium.org/
> 
> Changes since v7:
> - Mention in kernel-doc that the function does not return ports that
>    have no endpoints (Sakari) (patch 1)
> - Adapted to pwrseq_enable/disable() rename
> - Link to v7:
>    https://lore.kernel.org/all/20260724084328.3943997-1-wenst@chromium.org/
> 
> Changes since v6:
> - Patch 3 (power: sequencing: Add pwrseq_get_state())
>    - Adopted enum for valid return codes (Bartosz)
> - Patch 10 (usb hub pwrseq integration)
>    - Added braces ("{}") to for loop in hub_is_port_power_switchable() (Andy)
>    - Adapted usb_port_is_power_on() to new pwrseq_get_state() function
>      return values (Bartosz)
> - Link to v6:
>    https://lore.kernel.org/all/20260721065413.2306137-1-wenst@chromium.org/
> 
> Changes since v5:
> - Patch 1 (device property: Add fwnode_graph_get_port_by_id())
>    - Dropped left-over declaration in header (Sashiko)
> - Patch 3 (power: sequencing: Add pwrseq_power_is_on())
>    - Reverted back to returning -EINVAL if descriptor is NULL (Andy /
>      Bartosz)
> - Patch 6 (usb: hub: Associate port@ fwnode with USB port device)
>    - Added extra |struct fwnode_handle *| local variables to shorten lines (Andy)
>    - Added comment about passing fwnode_graph_get_port_by_id() return value
>      directly to device_set_node() (Andy)
> - Patch 10 (usb hub pwrseq integration)
>    - Only assign port_dev->pwrseq if successfully retrieved pwrseq
>      descriptor (Andy)
>    - Dropped the pwrseq error pointer check in the release function
>      (Andy)
>    - Added check for port->pwrseq != NULL before calling
>      pwrseq_is_power_on() (API change from patch 3)
> - Link to v5:
>    https://lore.kernel.org/all/20260715085348.3457359-1-wenst@chromium.org/
> 
> Changes since v4:
> - Added flags parameter to fwnode_graph_get_port_by_id() so users can
>    specify whether incomplete ports are returned or not (Sashiko)
> - Made pwrseq_power_is_on() return 1 if descriptor is NULL, i.e. if
>    the descriptor is optional, matching the other pwrseq consumer APIs
> - Added patch to swap out conditional set_bit()/clear_bit() with
>    assign_bit() (split out from "usb: hub: Power on connected M.2 E-key
>    connectors with power sequencing API") (Andy)
> - Call fwnode_graph_get_port_by_id() with FWNODE_GRAPH_DEVICE_DISABLED
>    so that even incomplete ports can be connected (Sashiko)
> - Dropped unused |hdev| variable from usb_hub_remove_port_device()
>    (Greg / Sashiko)
> - Dropped 'extern' from usb_port_is_power_on() header declaration (Andy)
> 
> - Patch 10 (usb hub pwrseq integration)
>    - Rewrote usb_port_is_power_on() to better express intent and
>      restrictions of pwrseq API (Andy)
>    - Switched to dev_fwnode() in port_pwrseq_is_supported() (Andy)
>    - Added blank line separating normal variable declarations and __free()
>      type declarations (Andy)
>    - Split out assign_bit() rewrite (Andy)
>    - Moved pwrseq_put() to release function to avoid UAF (Sashiko)
>    - Added back pwrseq_power_off() call in usb_hub_remove_port_device();
>      otherwise power off could be delayed to object release
>    - Don't clear hub->ports[port1 - 1] in main error path;
>      by that time the port device is registered and sysfs attributes are
>      available to userspace (Sashiko)
> 
> - Dropped blank line between __free() variable declaration and
>    subsequent use of the variable in conditional (Andy)
> - Added patch to split Bluetooth pwrseq units (Wei)
> - Link to v4:
>    https://lore.kernel.org/all/20260709095726.704448-1-wenst@chromium.org/
> 
> Changes since v3:
> - Added missing stub function for !POWER_SEQUENCING (patch 3) (Sashiko)
> - Added missing fwnode_handle_put() (patch 5) (Sashiko)
> - Added new patch to move |struct usb_port| related declarations to
>    separate header (patch 6) (Andy)
> - Patch 9 (usb hub pwrseq integration)
>    - 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)
> - Drop redundant device node validity check; device_match_of_node()
>    does it internally (patch 11) (Andy)
> - Link to v3:
>    https://lore.kernel.org/all/20260703110317.1283411-1-wenst@chromium.org/
> 
> Major changes since v2:
> - Removed changes for MT8192 Asurada family: one of the device is
>    shipped with RTL8822CE-VR, which is PCIe + UART and needs more work.
> - Removed changes for USB A ports: VBUS one the type A ports on
>    Chromebooks are not directly controllable from the OS and VBUS is
>    modeled as always on. As such the changes I made don't actually
>    change how the system works.
> - Added new pwrseq_power_is_on() function
> - Make new pwrseq integration effectively OF only by not assigning the
>    port fwnode if the hub's fwnode is an ACPI node
> - Added patch to convert remaining instances of directly setting/clearing
>    USB_PORT_FEAT_POWER to usb_hub_set_port_power()
> - Power sequencing state removed again in favor of state tracking by
>    pwrseq subsystem
> - Power sequencing descriptor again separately requested for HS and SS
>    ports
> - Dropped pwrseq_power_off() call before pwrseq_put(); the latter calls
>    the former implicitly if the power state was left on
> - Squashed DT binding revert and addition into one patch
> - Link to v2:
>    https://lore.kernel.org/all/20260610084053.2059858-1-wenst@chromium.org/
> 
> 
> Major changes since v1:
> - No longer adding the "index" parameter the power sequencing API
> - Switched from OF graph to fwnode graph APIs
> - Tie "port@" node to usb_port device, and use this device as consumer
>    to acquire power sequencing descriptor
> - Power sequencing descriptor now only tied to USB 2.0 port to avoid
>    double reference
> - Power sequencing state tracking added
> - Link to v1
>    https://lore.kernel.org/all/20260515090149.3169406-1-wenst@chromium.org/
> 
> The series is based on next-20260901.
> 
> 
> Patch 1 and 2 add new fwnode graph helpers. These are used by the patch
> 5 and 8, respectively.
> 
> Patch 3 adds a new pwrseq_get_state() for power sequencer consumers
> to query the current request state. Note that this is not the _actual_
> state.
> 
> Patch 4 swaps out the existing conditional set_bit()/clear_bit() with
> assign_bit(), which does the same thing.
> 
> Patch 5 reworks the USB hub driver to return the actual error code from
> hub_configure() in hub_probe(). This is needed in the next patch to
> correctly return -EPROBE_DEFER returned by pwrseq_get() in patch 9.
> 
> Patch 6 makes the USB port device associated with a "port@" fwnode if
> available. This depends on patch 1.
> 
> Patch 7 changes usb_port_is_power_on() so that |struct usb_port*| is
> passed in instead of |struct usb_hub*|. This patch does not change any
> functionality.
> 
> Patch 8 changes some USB hub port power control code that directly
> toggles USB_PORT_FEAT_POWER to use usb_hub_set_port_power().
> 
> Patch 9 lets the USB hub driver look for power sequencers for each port.
> Currently this only works for M.2 E-key connections, but it could be
> extended to cover other cases. It should also make port reset via turning
> off the port VBUS work, even when VBUS is not directly controlled by the
> hub. This depends on patch 2 and 3 for the new helpers.
> 
> Patch 10 reverts an incorrectly modeled OF graph connection for the
> MediaTek XHCI controller and adds a proper representation.
> 
> Patch 11 adds matching pwrseq consumer by "port@" node to the M.2 slot
> driver. This is only used for the USB target, but there is no attempt
> to differentiate the connection type. The driver simply tries matching
> the "port@" node first, then falling back to the port parent or device's
> node.
> 
> Patch 12 reworks the power sequencing targets for the E-key connector in
> the pcie-m2 driver to add targets for USB and SDIO. The former is used
> later on in this series.
> 
> Patch 13 splits the Bluetooth power sequencing unit so that the USB and
> serdev consumers can separately toggle the actual state of W_DISABLE#2.
> This patch is purposefully not squashed into the previous one to provide
> a clear target for discussions.
> 
> Patches 14 and 15 enable the M.2 E-key slots (or slot-like integration)
> found on MT8195 and MT8188 MediaTek-based Chromebooks.
> 
> 
> This series unfortunately spans multiple trees. The way I see it:
> 
>    - Patches 1 and 2 go through the driver core, and an immutable tag is
>      provided to be merged together with the USB patches.
> 
>    - Patch 3 has an ack from Bartosz, and goes through the USB tree. But
>      Bartosz also wants an immutable branch/tag to have a copy in the
>      pwrseq tree.
> 
>    - Patches 4 through 10 (all the USB related ones) go through the USB
>      tree, along with the dependencies above.
> 
>    - Patches 11 through 13 go through the power sequencing tree.
> 
>    - Patches 14 and 15 (device tree only) go through the soc tree via the
>      mediatek tree.
> 
> Some of us discussed v1 at Embedded Recipes, and I believe Bartosz, Mani
> and I agree on this approach. The debate is likely going to be on
> whether this should be integrated into the USB core or not. I believe it
> should, so that the power sequencing timing is tied to the USB port
> being brought up. I do have a fallback option of just enabling the USB
> power sequencing target inside the M.2 slot driver if a valid OF graph
> connection is seen. But this is less desired for the reason given above.
> 
> I hope we can get this merged in this cycle for v7.4.
> 

Series is

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>

Cheers,
Angelo

> 
> Thanks
> ChenYu
> 
> 
> [1] https://lore.kernel.org/all/20260326-pci-m2-e-v7-0-43324a7866e6@oss.qualcomm.com/
> 
> Chen-Yu Tsai (15):
>    device property: Add fwnode_graph_get_port_by_id()
>    device property: Add fwnode_graph_get_next_port_endpoint()
>    power: sequencing: Add pwrseq_get_state()
>    usb: hub: Use assign_bit() in usb_hub_set_port_power()
>    usb: hub: Return actual error from hub_configure() in hub_probe()
>    usb: hub: Associate port@ fwnode with USB port device
>    usb: hub: Pass |struct usb_port*| to usb_port_is_power_on()
>    usb: hub: Use usb_hub_set_port_power() to control port power
>      everywhere
>    usb: hub: Power on connected M.2 E-key connectors with power
>      sequencing API
>    dt-bindings: usb: mediatek,mtk-xhci: Switch to ports for USB
>      connections
>    power: sequencing: pcie-m2: support matching on remote "port" node
>    power: sequencing: pcie-m2: Add usb and sdio targets for E-key
>      connector
>    power: sequencing: pcie-m2: Split Bluetooth unit based on interface
>    arm64: dts: mediatek: mt8195-cherry: Add M.2 E-key slot
>    arm64: dts: mediatek: mt8188-geralt: Add WiFi/BT as M.2 E-key slot
> 
>   .../bindings/usb/mediatek,mtk-xhci.yaml       | 17 +++-
>   .../boot/dts/mediatek/mt8188-geralt.dtsi      | 92 ++++++++++++++++++-
>   .../boot/dts/mediatek/mt8195-cherry.dtsi      | 73 ++++++++++++++-
>   drivers/base/property.c                       | 56 +++++++++++
>   drivers/power/sequencing/core.c               | 19 ++++
>   drivers/power/sequencing/pwrseq-pcie-m2.c     | 64 ++++++++++---
>   drivers/usb/Kconfig                           |  1 +
>   drivers/usb/core/hub.c                        | 69 +++++++++-----
>   drivers/usb/core/hub.h                        | 14 ++-
>   drivers/usb/core/port.c                       | 80 +++++++++++++++-
>   include/linux/property.h                      |  4 +
>   include/linux/pwrseq/consumer.h               | 12 +++
>   12 files changed, 447 insertions(+), 54 deletions(-)
> 

      parent reply	other threads:[~2026-09-21 10:51 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-16  7:57 Chen-Yu Tsai
2026-09-16  7:57 ` [PATCH v9 01/15] device property: Add fwnode_graph_get_port_by_id() Chen-Yu Tsai
2026-09-16  7:57 ` [PATCH v9 02/15] device property: Add fwnode_graph_get_next_port_endpoint() Chen-Yu Tsai
2026-09-16  7:57 ` [PATCH v9 03/15] power: sequencing: Add pwrseq_get_state() Chen-Yu Tsai
2026-09-16  7:57 ` [PATCH v9 04/15] usb: hub: Use assign_bit() in usb_hub_set_port_power() Chen-Yu Tsai
2026-09-16  7:57 ` [PATCH v9 05/15] usb: hub: Return actual error from hub_configure() in hub_probe() Chen-Yu Tsai
2026-09-16  7:57 ` [PATCH v9 06/15] usb: hub: Associate port@ fwnode with USB port device Chen-Yu Tsai
2026-09-16  7:57 ` [PATCH v9 07/15] usb: hub: Pass |struct usb_port*| to usb_port_is_power_on() Chen-Yu Tsai
2026-09-16  7:57 ` [PATCH v9 08/15] usb: hub: Use usb_hub_set_port_power() to control port power everywhere Chen-Yu Tsai
2026-09-16  7:57 ` [PATCH v9 09/15] usb: hub: Power on connected M.2 E-key connectors with power sequencing API Chen-Yu Tsai
2026-09-16  7:57 ` [PATCH v9 10/15] dt-bindings: usb: mediatek,mtk-xhci: Switch to ports for USB connections Chen-Yu Tsai
2026-09-16  7:57 ` [PATCH v9 11/15] power: sequencing: pcie-m2: support matching on remote "port" node Chen-Yu Tsai
2026-09-16  7:57 ` [PATCH v9 12/15] power: sequencing: pcie-m2: Add usb and sdio targets for E-key connector Chen-Yu Tsai
2026-09-16  7:57 ` [PATCH v9 13/15] power: sequencing: pcie-m2: Split Bluetooth unit based on interface Chen-Yu Tsai
2026-09-16  7:57 ` [PATCH v9 14/15] arm64: dts: mediatek: mt8195-cherry: Add M.2 E-key slot Chen-Yu Tsai
2026-09-16  7:57 ` [PATCH v9 15/15] arm64: dts: mediatek: mt8188-geralt: Add WiFi/BT as " Chen-Yu Tsai
2026-09-21 10:51 ` AngeloGioacchino Del Regno [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0133cf19-709b-41f0-8f2e-e7ffede3ac1c@collabora.com \
    --to=angelogioacchino.delregno@collabora.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=brgl@kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=dakr@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=djrscally@gmail.com \
    --cc=driver-core@lists.linux.dev \
    --cc=gregkh@linuxfoundation.org \
    --cc=heikki.krogerus@linux.intel.com \
    --cc=krzk+dt@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=mani@kernel.org \
    --cc=matthias.bgg@gmail.com \
    --cc=rafael@kernel.org \
    --cc=robh@kernel.org \
    --cc=sakari.ailus@linux.intel.com \
    --cc=stern@rowland.harvard.edu \
    --cc=wenst@chromium.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®