* [PATCH v1 0/4] Add Google Tensor SoC USB support
@ 2025-10-06 23:21 Roy Luo
2025-10-06 23:21 ` [PATCH v1 1/4] usb: dwc3: Add Google SoC DWC3 glue driver Roy Luo
` (4 more replies)
0 siblings, 5 replies; 19+ messages in thread
From: Roy Luo @ 2025-10-06 23:21 UTC (permalink / raw)
To: Vinod Koul, Kishon Vijay Abraham I, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Greg Kroah-Hartman,
Thinh Nguyen, Philipp Zabel, Peter Griffin, André Draszik,
Tudor Ambarus
Cc: Joy Chakraborty, Naveen Kumar, Roy Luo, linux-phy, devicetree,
linux-kernel, linux-usb, linux-arm-kernel, linux-samsung-soc
This series introduces support for the USB controller and PHY found on
Google Tensor SoCs (G5 and newer). This includes:
1. DWC3 Glue Driver: A new glue layer for the Synopsys DesignWare USB 3.0
controller (DWC3) as integrated into Google Tensor SoCs, including
hibernation support.
2. DWC3 DT Bindings: Device Tree binding documentation for the Google
Tensor SoC DWC3 controller.
3. USB PHY Driver: A new driver for the Google Tensor SoC USB PHY,
initially supporting high-speed operations.
4. USB PHY DT Bindings: Device Tree binding documentation for the Google
Tensor SoC USB PHY.
Co-developed-by: Joy Chakraborty <joychakr@google.com>
Signed-off-by: Joy Chakraborty <joychakr@google.com>
Co-developed-by: Naveen Kumar <mnkumar@google.com>
Signed-off-by: Naveen Kumar <mnkumar@google.com>
Signed-off-by: Roy Luo <royluo@google.com>
---
Roy Luo (4):
usb: dwc3: Add Google SoC DWC3 glue driver
dt-bindings: usb: dwc3: Add Google SoC DWC3 USB
usb: dwc3: Add Google SoC USB PHY driver
dt-bindings: phy: google: Add Google SoC USB PHY
.../bindings/phy/google,usb-phy.yaml | 91 +++
.../bindings/usb/google,snps-dwc3.yaml | 144 +++++
drivers/phy/Kconfig | 1 +
drivers/phy/Makefile | 1 +
drivers/phy/google/Kconfig | 15 +
drivers/phy/google/Makefile | 2 +
drivers/phy/google/phy-google-usb.c | 286 +++++++++
drivers/usb/dwc3/Kconfig | 8 +
drivers/usb/dwc3/Makefile | 1 +
drivers/usb/dwc3/dwc3-google.c | 597 ++++++++++++++++++
10 files changed, 1146 insertions(+)
create mode 100644 Documentation/devicetree/bindings/phy/google,usb-phy.yaml
create mode 100644 Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml
create mode 100644 drivers/phy/google/Kconfig
create mode 100644 drivers/phy/google/Makefile
create mode 100644 drivers/phy/google/phy-google-usb.c
create mode 100644 drivers/usb/dwc3/dwc3-google.c
base-commit: e5f0a698b34ed76002dc5cff3804a61c80233a7a
--
2.51.0.618.g983fd99d29-goog
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v1 1/4] usb: dwc3: Add Google SoC DWC3 glue driver
2025-10-06 23:21 [PATCH v1 0/4] Add Google Tensor SoC USB support Roy Luo
@ 2025-10-06 23:21 ` Roy Luo
2025-10-07 0:46 ` Krzysztof Kozlowski
2025-10-11 3:39 ` kernel test robot
2025-10-06 23:21 ` [PATCH v1 2/4] dt-bindings: usb: dwc3: Add Google SoC DWC3 USB Roy Luo
` (3 subsequent siblings)
4 siblings, 2 replies; 19+ messages in thread
From: Roy Luo @ 2025-10-06 23:21 UTC (permalink / raw)
To: Vinod Koul, Kishon Vijay Abraham I, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Greg Kroah-Hartman,
Thinh Nguyen, Philipp Zabel, Peter Griffin, André Draszik,
Tudor Ambarus
Cc: Joy Chakraborty, Naveen Kumar, Roy Luo, linux-phy, devicetree,
linux-kernel, linux-usb, linux-arm-kernel, linux-samsung-soc
This patch adds support for the DWC3 USB controller found on Google
Tensor SoCs. The controller features dual-role functionality and
hibernation.
The primary focus is implementing hibernation support in host mode,
enabling the controller to enter a low-power state (D3). This is
particularly relevant during system power state transition and
runtime power management for power efficiency.
Highlights:
- Align suspend callback with dwc3_suspend_common() for deciding
between a full teardown and hibernation in host mode.
- Integration with `usb_psw_pd` and `usb_top_pd` power domains,
managing their states and device links to support hibernation.
- A notifier callback dwc3_google_usb_psw_pd_notifier() for
`usb_psw_pd` power domain events to manage controller state
transitions to/from D3.
- Coordination of the `usbc_non_sticky` reset during power
state transitions, asserting it on D3 entry and deasserting
on D0 entry in hibernation scenario.
- Handling of U2 (high-speed) and U3 (super-speed) PME interrupts
that are generated by remote wakeup during hibernation.
Co-developed-by: Joy Chakraborty <joychakr@google.com>
Signed-off-by: Joy Chakraborty <joychakr@google.com>
Co-developed-by: Naveen Kumar <mnkumar@google.com>
Signed-off-by: Naveen Kumar <mnkumar@google.com>
Signed-off-by: Roy Luo <royluo@google.com>
---
drivers/usb/dwc3/Kconfig | 8 +
drivers/usb/dwc3/Makefile | 1 +
drivers/usb/dwc3/dwc3-google.c | 597 +++++++++++++++++++++++++++++++++
3 files changed, 606 insertions(+)
create mode 100644 drivers/usb/dwc3/dwc3-google.c
diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig
index 310d182e10b5..685405464339 100644
--- a/drivers/usb/dwc3/Kconfig
+++ b/drivers/usb/dwc3/Kconfig
@@ -189,4 +189,12 @@ config USB_DWC3_RTK
or dual-role mode.
Say 'Y' or 'M' if you have such device.
+config USB_DWC3_GOOGLE
+ tristate "Google Platform"
+ depends on OF && COMMON_CLK && RESET_CONTROLLER
+ default USB_DWC3
+ help
+ Support Google Tensor SoCs with DesignWare core USB3 IP.
+ Say 'Y' or 'M' if you have one such device.
+
endif
diff --git a/drivers/usb/dwc3/Makefile b/drivers/usb/dwc3/Makefile
index 830e6c9e5fe0..a94982630657 100644
--- a/drivers/usb/dwc3/Makefile
+++ b/drivers/usb/dwc3/Makefile
@@ -57,3 +57,4 @@ obj-$(CONFIG_USB_DWC3_IMX8MP) += dwc3-imx8mp.o
obj-$(CONFIG_USB_DWC3_XILINX) += dwc3-xilinx.o
obj-$(CONFIG_USB_DWC3_OCTEON) += dwc3-octeon.o
obj-$(CONFIG_USB_DWC3_RTK) += dwc3-rtk.o
+obj-$(CONFIG_USB_DWC3_GOOGLE) += dwc3-google.o
diff --git a/drivers/usb/dwc3/dwc3-google.c b/drivers/usb/dwc3/dwc3-google.c
new file mode 100644
index 000000000000..c9737da3ff3b
--- /dev/null
+++ b/drivers/usb/dwc3/dwc3-google.c
@@ -0,0 +1,597 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * dwc3-google.c - Google DWC3 Specific Glue Layer
+ *
+ * Copyright (c) 2025, Google LLC
+ * Author: Roy Luo <royluo@google.com>
+ */
+
+#include <linux/of.h>
+#include <linux/bitfield.h>
+#include <linux/irq.h>
+#include <linux/clk.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/reset.h>
+#include <linux/pm_domain.h>
+#include <linux/iopoll.h>
+#include "core.h"
+#include "glue.h"
+
+/* HOST CFG registers */
+#define HC_STATUS_OFFSET 0x0
+#define HC_STATUS_CURRENT_POWER_STATE_U2PMU GENMASK(1, 0)
+#define HC_STATUS_CURRENT_POWER_STATE_U3PMU GENMASK(4, 3)
+
+#define HOST_CFG1_OFFSET 0x4
+#define HOST_CFG1_PME_EN BIT(3)
+#define HOST_CFG1_PM_POWER_STATE_REQUEST GENMASK(5, 4)
+#define HOST_CFG1_PM_POWER_STATE_D0 0x0
+#define HOST_CFG1_PM_POWER_STATE_D3 0x3
+
+/* USBINT registers */
+#define USBINT_CFG1_OFFSET 0x0
+#define USBINT_CFG1_USBDRD_PME_GEN_U2P_INTR_MSK BIT(2)
+#define USBINT_CFG1_USBDRD_PME_GEN_U3P_INTR_MSK BIT(3)
+#define USBINT_CFG1_USBDRD_PME_GEN_U2P_INTR_INT_EN BIT(8)
+#define USBINT_CFG1_USBDRD_PME_GEN_U3P_INTR_INT_EN BIT(9)
+#define USBINT_CFG1_USBDRD_PME_GEN_U2_INTR_CLR BIT(14)
+#define USBINT_CFG1_USBDRD_PME_GEN_U3_INTR_CLR BIT(15)
+
+#define USBINT_STATUS_OFFSET 0x4
+#define USBINT_STATUS_USBDRD_PME_GEN_U2P_INTR_STS_RAW BIT(2)
+#define USBINT_STATUS_USBDRD_PME_GEN_U3P_INTR_STS_RAW BIT(3)
+
+#define DWC3_GOOGLE_MAX_RESETS 5
+
+struct dwc3_google {
+ struct device *dev;
+ struct dwc3 dwc;
+ struct clk_bulk_data *clks;
+ int num_clks;
+ struct reset_control_bulk_data rsts[DWC3_GOOGLE_MAX_RESETS];
+ int num_rsts;
+ struct reset_control *usbc_non_sticky_rst;
+ struct device *usb_psw_pd;
+ struct device_link *usb_psw_pd_dl;
+ struct notifier_block usb_psw_pd_nb;
+ struct device *usb_top_pd;
+ struct device_link *usb_top_pd_dl;
+ void __iomem *host_cfg_base;
+ void __iomem *usbint_base;
+ int hs_pme_irq;
+ int ss_pme_irq;
+ bool is_hibernation;
+};
+
+#define to_dwc3_google(d) container_of((d), struct dwc3_google, dwc)
+
+static int dwc3_google_rst_init(struct dwc3_google *google)
+{
+ int ret;
+
+ google->num_rsts = 5;
+ google->rsts[0].id = "usbc_non_sticky";
+ google->rsts[1].id = "usbc_sticky";
+ google->rsts[2].id = "usb_drd_bus";
+ google->rsts[3].id = "u2phy_apb";
+ google->rsts[4].id = "usb_top_csr";
+
+ ret = devm_reset_control_bulk_get_exclusive(google->dev,
+ google->num_rsts,
+ google->rsts);
+
+ if (ret < 0)
+ return ret;
+
+ google->usbc_non_sticky_rst = google->rsts[0].rstc;
+
+ return 0;
+}
+
+static int dwc3_google_set_pmu_state(struct dwc3_google *google, int state)
+{
+ u32 reg;
+ int ret;
+
+ reg = readl(google->host_cfg_base + HOST_CFG1_OFFSET);
+ reg &= ~HOST_CFG1_PM_POWER_STATE_REQUEST;
+ reg |= (FIELD_PREP(HOST_CFG1_PM_POWER_STATE_REQUEST, state) |
+ HOST_CFG1_PME_EN);
+ writel(reg, google->host_cfg_base + HOST_CFG1_OFFSET);
+
+ ret = readl_poll_timeout(google->host_cfg_base + HC_STATUS_OFFSET, reg,
+ (FIELD_GET(HC_STATUS_CURRENT_POWER_STATE_U2PMU, reg) == state &&
+ FIELD_GET(HC_STATUS_CURRENT_POWER_STATE_U3PMU, reg) == state),
+ 10, 10000);
+
+ if (ret)
+ dev_err(google->dev, "failed to set PMU state %d\n", state);
+
+ return ret;
+}
+
+/*
+ * Clear pme interrupts and report their status.
+ * The hardware requires write-1 then write-0 sequence to clear the interrupt bits.
+ */
+static u32 dwc3_google_clear_pme_irqs(struct dwc3_google *google)
+{
+ u32 irq_status, reg_set, reg_clear;
+
+ irq_status = readl(google->usbint_base + USBINT_STATUS_OFFSET);
+ irq_status &= (USBINT_STATUS_USBDRD_PME_GEN_U2P_INTR_STS_RAW |
+ USBINT_STATUS_USBDRD_PME_GEN_U3P_INTR_STS_RAW);
+ if (!irq_status)
+ return irq_status;
+
+ reg_set = readl(google->usbint_base + USBINT_CFG1_OFFSET);
+ reg_clear = reg_set;
+ if (irq_status & USBINT_STATUS_USBDRD_PME_GEN_U2P_INTR_STS_RAW) {
+ reg_set |= USBINT_CFG1_USBDRD_PME_GEN_U2_INTR_CLR;
+ reg_clear &= ~USBINT_CFG1_USBDRD_PME_GEN_U2_INTR_CLR;
+ }
+ if (irq_status & USBINT_STATUS_USBDRD_PME_GEN_U3P_INTR_STS_RAW) {
+ reg_set |= USBINT_CFG1_USBDRD_PME_GEN_U3_INTR_CLR;
+ reg_clear &= ~USBINT_CFG1_USBDRD_PME_GEN_U3_INTR_CLR;
+ }
+
+ writel(reg_set, google->usbint_base + USBINT_CFG1_OFFSET);
+ writel(reg_clear, google->usbint_base + USBINT_CFG1_OFFSET);
+
+ return irq_status;
+}
+
+static void dwc3_google_enable_pme_irq(struct dwc3_google *google)
+{
+ u32 reg;
+
+ reg = readl(google->usbint_base + USBINT_CFG1_OFFSET);
+ reg &= ~(USBINT_CFG1_USBDRD_PME_GEN_U2P_INTR_MSK |
+ USBINT_CFG1_USBDRD_PME_GEN_U3P_INTR_MSK);
+ reg |= (USBINT_CFG1_USBDRD_PME_GEN_U2P_INTR_INT_EN |
+ USBINT_CFG1_USBDRD_PME_GEN_U3P_INTR_INT_EN);
+ writel(reg, google->usbint_base + USBINT_CFG1_OFFSET);
+
+ enable_irq(google->hs_pme_irq);
+ enable_irq(google->ss_pme_irq);
+ enable_irq_wake(google->hs_pme_irq);
+ enable_irq_wake(google->ss_pme_irq);
+}
+
+static void dwc3_google_disable_pme_irq(struct dwc3_google *google)
+{
+ u32 reg;
+
+ reg = readl(google->usbint_base + USBINT_CFG1_OFFSET);
+ reg &= ~(USBINT_CFG1_USBDRD_PME_GEN_U2P_INTR_INT_EN |
+ USBINT_CFG1_USBDRD_PME_GEN_U3P_INTR_INT_EN);
+ reg |= (USBINT_CFG1_USBDRD_PME_GEN_U2P_INTR_MSK |
+ USBINT_CFG1_USBDRD_PME_GEN_U3P_INTR_MSK);
+ writel(reg, google->usbint_base + USBINT_CFG1_OFFSET);
+
+ disable_irq_wake(google->hs_pme_irq);
+ disable_irq_wake(google->ss_pme_irq);
+ disable_irq_nosync(google->hs_pme_irq);
+ disable_irq_nosync(google->ss_pme_irq);
+}
+
+static irqreturn_t dwc3_google_resume_irq(int irq, void *data)
+{
+ struct dwc3_google *google = data;
+ struct dwc3 *dwc = &google->dwc;
+ u32 irq_status, dr_role;
+
+ irq_status = dwc3_google_clear_pme_irqs(google);
+ dr_role = dwc->current_dr_role;
+
+ if (!irq_status || !google->is_hibernation ||
+ dr_role != DWC3_GCTL_PRTCAP_HOST) {
+ dev_warn(google->dev, "spurious pme irq %d, hibernation %d, dr_role %u\n",
+ irq, google->is_hibernation, dr_role);
+ return IRQ_HANDLED;
+ }
+
+ if (dwc->xhci)
+ pm_runtime_resume(&dwc->xhci->dev);
+
+ return IRQ_HANDLED;
+}
+
+static int dwc3_google_request_irq(struct dwc3_google *google, struct platform_device *pdev,
+ const char *irq_name, const char *req_name)
+{
+ int ret;
+ int irq;
+
+ irq = platform_get_irq_byname(pdev, irq_name);
+ if (irq < 0) {
+ dev_err(google->dev, "invalid irq name %s\n", irq_name);
+ return irq;
+ }
+
+ irq_set_status_flags(irq, IRQ_NOAUTOEN);
+ ret = devm_request_threaded_irq(google->dev, irq, NULL,
+ dwc3_google_resume_irq,
+ IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
+ req_name, google);
+ if (ret < 0) {
+ dev_err(google->dev, "failed to request irq %s\n", req_name);
+ return ret;
+ }
+
+ return irq;
+}
+
+static int dwc3_google_usb_psw_pd_notifier(struct notifier_block *nb, unsigned long action, void *d)
+{
+ struct dwc3_google *google = container_of(nb, struct dwc3_google, usb_psw_pd_nb);
+ int ret;
+
+ if (!google->is_hibernation)
+ return NOTIFY_OK;
+
+ if (action == GENPD_NOTIFY_OFF) {
+ dev_dbg(google->dev, "enter D3 power state\n");
+ dwc3_google_set_pmu_state(google, HOST_CFG1_PM_POWER_STATE_D3);
+ ret = reset_control_assert(google->usbc_non_sticky_rst);
+ if (ret)
+ dev_err(google->dev, "non sticky reset assert failed: %d\n", ret);
+ } else if (action == GENPD_NOTIFY_ON) {
+ dev_dbg(google->dev, "enter D0 power state\n");
+ dwc3_google_clear_pme_irqs(google);
+ ret = reset_control_deassert(google->usbc_non_sticky_rst);
+ if (ret)
+ dev_err(google->dev, "non sticky reset deassert failed: %d\n", ret);
+ dwc3_google_set_pmu_state(google, HOST_CFG1_PM_POWER_STATE_D0);
+ }
+
+ return NOTIFY_OK;
+}
+
+static void dwc3_google_pm_domain_deinit(struct dwc3_google *google)
+{
+ if (google->usb_top_pd_dl)
+ device_link_del(google->usb_top_pd_dl);
+
+ if (!IS_ERR_OR_NULL(google->usb_top_pd)) {
+ device_set_wakeup_capable(google->usb_top_pd, false);
+ dev_pm_domain_detach(google->usb_top_pd, true);
+ }
+
+ if (google->usb_psw_pd_dl)
+ device_link_del(google->usb_psw_pd_dl);
+
+ if (!IS_ERR_OR_NULL(google->usb_psw_pd)) {
+ dev_pm_genpd_remove_notifier(google->usb_psw_pd);
+ dev_pm_domain_detach(google->usb_psw_pd, true);
+ }
+}
+
+static int dwc3_google_pm_domain_init(struct dwc3_google *google)
+{
+ int ret;
+
+ /*
+ * Estalibsh PM RUNTIME link between dwc dev and its power domain usb_psw_pd,
+ * register notifier block to handle hibernation.
+ */
+ google->usb_psw_pd = dev_pm_domain_attach_by_name(google->dev, "usb_psw_pd");
+ if (IS_ERR_OR_NULL(google->usb_psw_pd)) {
+ dev_err(google->dev, "failed to get usb psw pd");
+ ret = google->usb_psw_pd ? PTR_ERR(google->usb_psw_pd) : -ENODATA;
+ return ret;
+ }
+
+ google->usb_psw_pd_nb.notifier_call = dwc3_google_usb_psw_pd_notifier;
+ ret = dev_pm_genpd_add_notifier(google->usb_psw_pd, &google->usb_psw_pd_nb);
+ if (ret) {
+ dev_err(google->dev, "failed to add usb psw pd notifier");
+ goto err;
+ }
+
+ google->usb_psw_pd_dl = device_link_add(google->dev, google->usb_psw_pd,
+ DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME |
+ DL_FLAG_RPM_ACTIVE);
+ if (!google->usb_psw_pd_dl) {
+ dev_err(google->usb_psw_pd, "failed to add device link");
+ ret = -ENODEV;
+ goto err;
+ }
+
+ /*
+ * usb_top_pd is the parent power domain of usb_psw_pd. Keeping usb_top_pd on
+ * while usb_psw_pd is off places the controller in a power-gated state,
+ * essential for hibernation. Acquire a handle to usb_top_pd and sets it as
+ * wakeup-capable to allow the domain to be left on during system suspend.
+ */
+ google->usb_top_pd = dev_pm_domain_attach_by_name(google->dev, "usb_top_pd");
+ if (IS_ERR_OR_NULL(google->usb_top_pd)) {
+ dev_err(google->dev, "failed to get usb top pd");
+ ret = google->usb_top_pd ? PTR_ERR(google->usb_top_pd) : -ENODATA;
+ goto err;
+ }
+ device_set_wakeup_capable(google->usb_top_pd, true);
+
+ google->usb_top_pd_dl = device_link_add(google->dev, google->usb_top_pd,
+ DL_FLAG_STATELESS);
+ if (!google->usb_top_pd_dl) {
+ dev_err(google->usb_top_pd, "failed to add device link");
+ ret = -ENODEV;
+ goto err;
+ }
+
+ return 0;
+
+err:
+ dwc3_google_pm_domain_deinit(google);
+
+ return ret;
+}
+
+static int dwc3_google_probe(struct platform_device *pdev)
+{
+ struct dwc3_probe_data probe_data = {};
+ struct device *dev = &pdev->dev;
+ struct dwc3_google *google;
+ struct resource *res;
+ int ret;
+
+ google = devm_kzalloc(&pdev->dev, sizeof(*google), GFP_KERNEL);
+ if (!google)
+ return -ENOMEM;
+
+ google->dev = &pdev->dev;
+
+ ret = dwc3_google_pm_domain_init(google);
+ if (ret < 0)
+ return dev_err_probe(&pdev->dev, ret, "failed to init pdom\n");
+
+ ret = devm_clk_bulk_get_all_enabled(dev, &google->clks);
+ if (ret < 0) {
+ ret = dev_err_probe(&pdev->dev, ret, "failed to get and enable clks\n");
+ goto err_deinit_pdom;
+ }
+ google->num_clks = ret;
+
+ ret = dwc3_google_rst_init(google);
+ if (ret) {
+ ret = dev_err_probe(&pdev->dev, ret, "failed to get resets\n");
+ goto err_deinit_pdom;
+ }
+
+ ret = reset_control_bulk_deassert(google->num_rsts, google->rsts);
+ if (ret) {
+ ret = dev_err_probe(&pdev->dev, ret, "failed to deassert rsts\n");
+ goto err_deinit_pdom;
+ }
+
+ ret = dwc3_google_request_irq(google, pdev, "hs_pme_irq", "USB HS wakeup");
+ if (ret < 0) {
+ ret = dev_err_probe(&pdev->dev, ret, "failed to request hs pme irq");
+ goto err_reset_assert;
+ }
+ google->hs_pme_irq = ret;
+
+ ret = dwc3_google_request_irq(google, pdev, "ss_pme_irq", "USB SS wakeup");
+ if (ret < 0) {
+ ret = dev_err_probe(&pdev->dev, ret, "failed to request ss pme irq");
+ goto err_reset_assert;
+ }
+ google->ss_pme_irq = ret;
+
+ google->host_cfg_base =
+ devm_platform_ioremap_resource_byname(pdev, "host_cfg_csr");
+ if (IS_ERR(google->host_cfg_base)) {
+ ret = dev_err_probe(&pdev->dev, PTR_ERR(google->host_cfg_base),
+ "invalid host cfg csr\n");
+ goto err_reset_assert;
+ }
+
+ google->usbint_base =
+ devm_platform_ioremap_resource_byname(pdev, "usbint_csr");
+ if (IS_ERR(google->usbint_base)) {
+ ret = dev_err_probe(&pdev->dev, PTR_ERR(google->usbint_base),
+ "invalid usbint csr\n");
+ goto err_reset_assert;
+ }
+
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dwc3_core");
+ if (!res) {
+ ret = dev_err_probe(dev, -ENODEV, "invalid dwc3 core memory\n");
+ goto err_reset_assert;
+ }
+
+ device_init_wakeup(dev, true);
+
+ google->dwc.dev = dev;
+ probe_data.dwc = &google->dwc;
+ probe_data.res = res;
+ probe_data.ignore_clocks_and_resets = true;
+ ret = dwc3_core_probe(&probe_data);
+ if (ret) {
+ ret = dev_err_probe(dev, ret, "failed to register DWC3 Core\n");
+ goto err_reset_assert;
+ }
+
+ return 0;
+
+err_reset_assert:
+ reset_control_bulk_assert(google->num_rsts, google->rsts);
+
+err_deinit_pdom:
+ dwc3_google_pm_domain_deinit(google);
+
+ return ret;
+}
+
+static void dwc3_google_remove(struct platform_device *pdev)
+{
+ struct dwc3 *dwc = platform_get_drvdata(pdev);
+ struct dwc3_google *google = to_dwc3_google(dwc);
+
+ dwc3_core_remove(&google->dwc);
+
+ reset_control_bulk_assert(google->num_rsts, google->rsts);
+
+ dwc3_google_pm_domain_deinit(google);
+}
+
+static int dwc3_google_suspend(struct dwc3_google *google, pm_message_t msg)
+{
+ if (pm_runtime_suspended(google->dev))
+ return 0;
+
+ if (google->dwc.current_dr_role == DWC3_GCTL_PRTCAP_HOST) {
+ /*
+ * Follow dwc3_suspend_common() guidelines for deciding between
+ * a full teardown and hibernation.
+ */
+ if (PMSG_IS_AUTO(msg) || device_may_wakeup(google->dev)) {
+ dev_dbg(google->dev, "enter hibernation");
+ pm_runtime_get_sync(google->usb_top_pd);
+ device_wakeup_enable(google->usb_top_pd);
+ dwc3_google_enable_pme_irq(google);
+ google->is_hibernation = true;
+ return 0;
+ }
+ }
+
+ reset_control_bulk_assert(google->num_rsts, google->rsts);
+ clk_bulk_disable_unprepare(google->num_clks, google->clks);
+
+ return 0;
+}
+
+static int dwc3_google_resume(struct dwc3_google *google, pm_message_t msg)
+{
+ int ret;
+
+ if (google->is_hibernation) {
+ dev_dbg(google->dev, "exit hibernation");
+ dwc3_google_disable_pme_irq(google);
+ device_wakeup_disable(google->usb_top_pd);
+ pm_runtime_put_sync(google->usb_top_pd);
+ google->is_hibernation = false;
+ return 0;
+ }
+
+ ret = clk_bulk_prepare_enable(google->num_clks, google->clks);
+ if (ret)
+ return ret;
+
+ ret = reset_control_bulk_deassert(google->num_rsts, google->rsts);
+ if (ret) {
+ clk_bulk_disable_unprepare(google->num_clks, google->clks);
+ return ret;
+ }
+
+ return 0;
+}
+
+#ifdef CONFIG_PM_SLEEP
+static int dwc3_google_pm_suspend(struct device *dev)
+{
+ struct dwc3 *dwc = dev_get_drvdata(dev);
+ struct dwc3_google *google = to_dwc3_google(dwc);
+ int ret;
+
+ ret = dwc3_pm_suspend(&google->dwc);
+ if (ret)
+ return ret;
+
+ return dwc3_google_suspend(google, PMSG_SUSPEND);
+}
+
+static int dwc3_google_pm_resume(struct device *dev)
+{
+ struct dwc3 *dwc = dev_get_drvdata(dev);
+ struct dwc3_google *google = to_dwc3_google(dwc);
+ int ret;
+
+ ret = dwc3_google_resume(google, PMSG_RESUME);
+ if (ret)
+ return ret;
+
+ return dwc3_pm_resume(&google->dwc);
+}
+
+static void dwc3_google_complete(struct device *dev)
+{
+ struct dwc3 *dwc = dev_get_drvdata(dev);
+
+ dwc3_pm_complete(dwc);
+}
+
+static int dwc3_google_prepare(struct device *dev)
+{
+ struct dwc3 *dwc = dev_get_drvdata(dev);
+
+ return dwc3_pm_prepare(dwc);
+}
+#else
+#define dwc3_google_complete NULL
+#define dwc3_google_prepare NULL
+#endif /* CONFIG_PM_SLEEP */
+
+#ifdef CONFIG_PM
+static int dwc3_google_runtime_suspend(struct device *dev)
+{
+ struct dwc3 *dwc = dev_get_drvdata(dev);
+ struct dwc3_google *google = to_dwc3_google(dwc);
+ int ret;
+
+ ret = dwc3_runtime_suspend(&google->dwc);
+ if (ret)
+ return ret;
+
+ return dwc3_google_suspend(google, PMSG_AUTO_SUSPEND);
+}
+
+static int dwc3_google_runtime_resume(struct device *dev)
+{
+ struct dwc3 *dwc = dev_get_drvdata(dev);
+ struct dwc3_google *google = to_dwc3_google(dwc);
+ int ret;
+
+ ret = dwc3_google_resume(google, PMSG_AUTO_RESUME);
+ if (ret)
+ return ret;
+
+ return dwc3_runtime_resume(&google->dwc);
+}
+
+static int dwc3_google_runtime_idle(struct device *dev)
+{
+ return dwc3_runtime_idle(dev_get_drvdata(dev));
+}
+#endif /* CONFIG_PM */
+
+static const struct dev_pm_ops dwc3_google_dev_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(dwc3_google_pm_suspend, dwc3_google_pm_resume)
+ SET_RUNTIME_PM_OPS(dwc3_google_runtime_suspend, dwc3_google_runtime_resume,
+ dwc3_google_runtime_idle)
+ .complete = dwc3_google_complete,
+ .prepare = dwc3_google_prepare,
+};
+
+static const struct of_device_id dwc3_google_of_match[] = {
+ { .compatible = "google,snps-dwc3" },
+ { }
+};
+MODULE_DEVICE_TABLE(of, dwc3_google_of_match);
+
+static struct platform_driver dwc3_google_driver = {
+ .probe = dwc3_google_probe,
+ .remove = dwc3_google_remove,
+ .driver = {
+ .name = "google-dwc3",
+ .pm = &dwc3_google_dev_pm_ops,
+ .of_match_table = dwc3_google_of_match,
+ },
+};
+
+module_platform_driver(dwc3_google_driver);
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("DesignWare DWC3 Google Glue Driver");
--
2.51.0.618.g983fd99d29-goog
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v1 2/4] dt-bindings: usb: dwc3: Add Google SoC DWC3 USB
2025-10-06 23:21 [PATCH v1 0/4] Add Google Tensor SoC USB support Roy Luo
2025-10-06 23:21 ` [PATCH v1 1/4] usb: dwc3: Add Google SoC DWC3 glue driver Roy Luo
@ 2025-10-06 23:21 ` Roy Luo
2025-10-07 0:44 ` Krzysztof Kozlowski
2025-10-06 23:21 ` [PATCH v1 3/4] usb: dwc3: Add Google SoC USB PHY driver Roy Luo
` (2 subsequent siblings)
4 siblings, 1 reply; 19+ messages in thread
From: Roy Luo @ 2025-10-06 23:21 UTC (permalink / raw)
To: Vinod Koul, Kishon Vijay Abraham I, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Greg Kroah-Hartman,
Thinh Nguyen, Philipp Zabel, Peter Griffin, André Draszik,
Tudor Ambarus
Cc: Joy Chakraborty, Naveen Kumar, Roy Luo, linux-phy, devicetree,
linux-kernel, linux-usb, linux-arm-kernel, linux-samsung-soc
Document the DWC3 USB bindings for Google Tensor SoCs.
Signed-off-by: Roy Luo <royluo@google.com>
---
.../bindings/usb/google,snps-dwc3.yaml | 144 ++++++++++++++++++
1 file changed, 144 insertions(+)
create mode 100644 Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml
diff --git a/Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml b/Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml
new file mode 100644
index 000000000000..3e8bcc0c2cef
--- /dev/null
+++ b/Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml
@@ -0,0 +1,144 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+# Copyright (c) 2025, Google LLC
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/usb/google,snps-dwc3.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Google DWC3 USB SoC Controller
+
+maintainers:
+ - Roy Luo <royluo@google.com>
+
+description:
+ Describes the Google DWC3 USB block, based on Synopsys DWC3 IP.
+
+properties:
+ compatible:
+ items:
+ - enum:
+ - google,lga-dwc3
+ - const: google,snps-dwc3
+
+ reg:
+ minItems: 3
+ maxItems: 3
+
+ reg-names:
+ description: |
+ The following memory regions must present:
+ - dwc3_core: Core DWC3 IP registers.
+ - host_cfg_csr: Hibernation control registers.
+ - usbint_csr: Hibernation interrupt registers.
+ items:
+ - const: dwc3_core
+ - const: host_cfg_csr
+ - const: usbint_csr
+
+ interrupts:
+ minItems: 3
+ maxItems: 3
+
+ interrupt-names:
+ description: |
+ The following interrupts must present:
+ - dwc_usb3: Core DWC3 interrupt.
+ - hs_pme_irq: High speed remote wakeup interrupt for hibernation.
+ - ss_pme_irq: Super speed remote wakeup interrupt for hibernation.
+ items:
+ - const: dwc_usb3
+ - const: hs_pme_irq
+ - const: ss_pme_irq
+
+ clocks:
+ minItems: 3
+ maxItems: 3
+
+ clock-names:
+ minItems: 3
+ maxItems: 3
+
+ resets:
+ minItems: 5
+ maxItems: 5
+
+ reset-names:
+ items:
+ - const: usbc_non_sticky
+ - const: usbc_sticky
+ - const: usb_drd_bus
+ - const: u2phy_apb
+ - const: usb_top_csr
+
+ power-domains:
+ minItems: 2
+ maxItems: 2
+
+ power-domain-names:
+ description: |
+ The following power domain must present:
+ - usb_psw_pd: The child power domain of usb_top_pd. Turning it on puts the controller
+ into full power state, turning it off puts the controller into power
+ gated state.
+ - usb_top_pd: The parent power domain of usb_psw_pd. Turning it on puts the controller
+ into power gated state, turning it off completely shuts off the
+ controller.
+ items:
+ - const: usb_psw_pd
+ - const: usb_top_pd
+
+ iommus:
+ maxItems: 1
+
+required:
+ - compatible
+ - reg
+ - reg-names
+ - interrupts
+ - interrupt-names
+ - clocks
+ - resets
+ - reset-names
+ - power-domains
+ - power-domain-names
+
+allOf:
+ - $ref: snps,dwc3-common.yaml#
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+ #include <dt-bindings/interrupt-controller/irq.h>
+ soc {
+ #address-cells = <2>;
+ #size-cells = <2>;
+
+ usb@c400000 {
+ compatible = "google,lga-dwc3", "google,snps-dwc3";
+ reg = <0 0x0c400000 0 0xd060>, <0 0x0c450000 0 0x14>, <0 0x0c450020 0 0x8>;
+ reg-names = "dwc3_core", "host_cfg_csr", "usbint_csr";
+ interrupts = <GIC_SPI 580 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 597 IRQ_TYPE_LEVEL_HIGH 0>,
+ <GIC_SPI 598 IRQ_TYPE_LEVEL_HIGH 0>;
+ interrupt-names = "dwc_usb3", "hs_pme_irq", "ss_pme_irq";
+ clocks = <&hsion_usbc_non_sticky_clk>, <&hsion_usbc_sticky_clk>,
+ <&hsion_u2phy_apb_clk>;
+ clock-names = "usbc_non_sticky", "usbc_sticky", "u2phy_apb";
+ resets = <&hsion_resets_usbc_non_sticky>, <&hsion_resets_usbc_sticky>,
+ <&hsion_resets_usb_drd_bus>, <&hsion_resets_u2phy_apb>,
+ <&hsion_resets_usb_top_csr>;
+ reset-names = "usbc_non_sticky", "usbc_sticky",
+ "usb_drd_bus", "u2phy_apb",
+ "usb_top_csr";
+ power-domains = <&hsio_n_usb_psw_pd>, <&hsio_n_usb_pd>;
+ power-domain-names = "usb_psw_pd", "usb_top_pd";
+ phys = <&usb_phy 0>;
+ phy-names = "usb2-phy";
+ snps,quirk-frame-length-adjustment = <0x20>;
+ snps,gfladj-refclk-lpm-sel-quirk;
+ snps,incr-burst-type-adjustment = <4>;
+ };
+ };
+...
--
2.51.0.618.g983fd99d29-goog
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v1 3/4] usb: dwc3: Add Google SoC USB PHY driver
2025-10-06 23:21 [PATCH v1 0/4] Add Google Tensor SoC USB support Roy Luo
2025-10-06 23:21 ` [PATCH v1 1/4] usb: dwc3: Add Google SoC DWC3 glue driver Roy Luo
2025-10-06 23:21 ` [PATCH v1 2/4] dt-bindings: usb: dwc3: Add Google SoC DWC3 USB Roy Luo
@ 2025-10-06 23:21 ` Roy Luo
2025-10-07 0:42 ` Krzysztof Kozlowski
2025-10-07 5:51 ` Greg Kroah-Hartman
2025-10-06 23:21 ` [PATCH v1 4/4] dt-bindings: phy: google: Add Google SoC USB PHY Roy Luo
2025-10-07 1:06 ` [PATCH v1 0/4] Add Google Tensor SoC USB support Krzysztof Kozlowski
4 siblings, 2 replies; 19+ messages in thread
From: Roy Luo @ 2025-10-06 23:21 UTC (permalink / raw)
To: Vinod Koul, Kishon Vijay Abraham I, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Greg Kroah-Hartman,
Thinh Nguyen, Philipp Zabel, Peter Griffin, André Draszik,
Tudor Ambarus
Cc: Joy Chakraborty, Naveen Kumar, Roy Luo, linux-phy, devicetree,
linux-kernel, linux-usb, linux-arm-kernel, linux-samsung-soc
Support the USB PHY found on Google Tensor SoCs.
This particular USB PHY supports both high-speed and super-speed
operations, and is paired with the SNPS DWC3 controller that's also
integrated on the SoCs.
This initial patch specifically adds functionality for high-speed.
Co-developed-by: Joy Chakraborty <joychakr@google.com>
Signed-off-by: Joy Chakraborty <joychakr@google.com>
Co-developed-by: Naveen Kumar <mnkumar@google.com>
Signed-off-by: Naveen Kumar <mnkumar@google.com>
Signed-off-by: Roy Luo <royluo@google.com>
---
drivers/phy/Kconfig | 1 +
drivers/phy/Makefile | 1 +
drivers/phy/google/Kconfig | 15 ++
drivers/phy/google/Makefile | 2 +
drivers/phy/google/phy-google-usb.c | 286 ++++++++++++++++++++++++++++
5 files changed, 305 insertions(+)
create mode 100644 drivers/phy/google/Kconfig
create mode 100644 drivers/phy/google/Makefile
create mode 100644 drivers/phy/google/phy-google-usb.c
diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
index 58c911e1b2d2..7772c04d5f5c 100644
--- a/drivers/phy/Kconfig
+++ b/drivers/phy/Kconfig
@@ -106,6 +106,7 @@ source "drivers/phy/amlogic/Kconfig"
source "drivers/phy/broadcom/Kconfig"
source "drivers/phy/cadence/Kconfig"
source "drivers/phy/freescale/Kconfig"
+source "drivers/phy/google/Kconfig"
source "drivers/phy/hisilicon/Kconfig"
source "drivers/phy/ingenic/Kconfig"
source "drivers/phy/lantiq/Kconfig"
diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile
index c670a8dac468..1b6dd784351c 100644
--- a/drivers/phy/Makefile
+++ b/drivers/phy/Makefile
@@ -18,6 +18,7 @@ obj-y += allwinner/ \
broadcom/ \
cadence/ \
freescale/ \
+ google/ \
hisilicon/ \
ingenic/ \
intel/ \
diff --git a/drivers/phy/google/Kconfig b/drivers/phy/google/Kconfig
new file mode 100644
index 000000000000..2ba13b77c819
--- /dev/null
+++ b/drivers/phy/google/Kconfig
@@ -0,0 +1,15 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# Phy drivers for Google platforms
+#
+config PHY_GOOGLE_USB
+ tristate "Google Tensor SoC series USB PHY driver"
+ depends on HAS_IOMEM
+ depends on OF
+ depends on TYPEC
+ depends on USB_DWC3_GOOGLE
+ select GENERIC_PHY
+ default y
+ help
+ Add support for the USB PHY on Google SoC series, providing
+ the PHY interface for the integrated USB DRD controller.
diff --git a/drivers/phy/google/Makefile b/drivers/phy/google/Makefile
new file mode 100644
index 000000000000..f926bd033533
--- /dev/null
+++ b/drivers/phy/google/Makefile
@@ -0,0 +1,2 @@
+# SPDX-License-Identifier: GPL-2.0
+obj-$(CONFIG_PHY_GOOGLE_USB) += phy-google-usb.o
diff --git a/drivers/phy/google/phy-google-usb.c b/drivers/phy/google/phy-google-usb.c
new file mode 100644
index 000000000000..f666ea6fbd4e
--- /dev/null
+++ b/drivers/phy/google/phy-google-usb.c
@@ -0,0 +1,286 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * phy-google-usb.c - Google USB PHY driver
+ *
+ * Copyright (C) 2025, Google LLC
+ */
+
+#include <linux/bitfield.h>
+#include <linux/clk.h>
+#include <linux/reset.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/phy/phy.h>
+#include <linux/platform_device.h>
+#include <linux/mutex.h>
+#include <linux/cleanup.h>
+#include <linux/usb/typec_mux.h>
+
+#define USBCS_USB2PHY_CFG19_OFFSET 0x0
+#define USBCS_USB2PHY_CFG19_PHY_CFG_PLL_FB_DIV GENMASK(19, 8)
+
+#define USBCS_USB2PHY_CFG21_OFFSET 0x8
+#define USBCS_USB2PHY_CFG21_PHY_ENABLE BIT(12)
+#define USBCS_USB2PHY_CFG21_REF_FREQ_SEL GENMASK(15, 13)
+#define USBCS_USB2PHY_CFG21_PHY_TX_DIG_BYPASS_SEL BIT(19)
+
+#define USBCS_PHY_CFG1_OFFSET 0x28
+#define USBCS_PHY_CFG1_SYS_VBUSVALID BIT(17)
+
+#define USBCS_TOP_CTRL_CFG1_OFFSET 0x0
+#define USBCS_TOP_CTRL_CFG1_USB2ONLY_MODE BIT(5)
+
+enum google_usb_phy_id {
+ GOOGLE_USB2_PHY,
+ GOOGLE_USB_PHY_NUM,
+};
+
+struct google_usb_phy_instance {
+ int index;
+ struct phy *phy;
+ struct clk *clk;
+ struct reset_control *rst;
+};
+
+struct google_usb_phy {
+ struct device *dev;
+ void __iomem *usb2_cfg_base;
+ void __iomem *dp_top_base;
+ void __iomem *usb_top_cfg_base;
+ struct google_usb_phy_instance insts[GOOGLE_USB_PHY_NUM];
+ /* serialize phy access */
+ struct mutex phy_mutex;
+ struct typec_switch_dev *sw;
+ enum typec_orientation orientation;
+};
+
+static inline struct google_usb_phy *to_google_usb_phy(struct google_usb_phy_instance *inst)
+{
+ return container_of(inst, struct google_usb_phy, insts[inst->index]);
+}
+
+static void set_vbus_valid(struct google_usb_phy *gphy)
+{
+ u32 reg;
+
+ if (gphy->orientation == TYPEC_ORIENTATION_NONE) {
+ reg = readl(gphy->dp_top_base + USBCS_PHY_CFG1_OFFSET);
+ reg &= ~USBCS_PHY_CFG1_SYS_VBUSVALID;
+ writel(reg, gphy->dp_top_base + USBCS_PHY_CFG1_OFFSET);
+ } else {
+ reg = readl(gphy->dp_top_base + USBCS_PHY_CFG1_OFFSET);
+ reg |= USBCS_PHY_CFG1_SYS_VBUSVALID;
+ writel(reg, gphy->dp_top_base + USBCS_PHY_CFG1_OFFSET);
+ }
+}
+
+static int google_usb_set_orientation(struct typec_switch_dev *sw,
+ enum typec_orientation orientation)
+{
+ struct google_usb_phy *gphy = typec_switch_get_drvdata(sw);
+
+ dev_dbg(gphy->dev, "set orientation %d\n", orientation);
+
+ gphy->orientation = orientation;
+
+ if (pm_runtime_suspended(gphy->dev))
+ return 0;
+
+ guard(mutex)(&gphy->phy_mutex);
+
+ set_vbus_valid(gphy);
+
+ return 0;
+}
+
+static int google_usb2_phy_init(struct phy *_phy)
+{
+ struct google_usb_phy_instance *inst = phy_get_drvdata(_phy);
+ struct google_usb_phy *gphy = to_google_usb_phy(inst);
+ u32 reg;
+ int ret = 0;
+
+ dev_dbg(gphy->dev, "initializing usb2 phy\n");
+
+ guard(mutex)(&gphy->phy_mutex);
+
+ /*
+ * TODO: usb2only mode should be removed once usb3 is supported
+ */
+ reg = readl(gphy->usb_top_cfg_base + USBCS_TOP_CTRL_CFG1_OFFSET);
+ reg |= USBCS_TOP_CTRL_CFG1_USB2ONLY_MODE;
+ writel(reg, gphy->usb_top_cfg_base + USBCS_TOP_CTRL_CFG1_OFFSET);
+
+ reg = readl(gphy->usb2_cfg_base + USBCS_USB2PHY_CFG21_OFFSET);
+ reg &= ~USBCS_USB2PHY_CFG21_PHY_TX_DIG_BYPASS_SEL;
+ reg &= ~USBCS_USB2PHY_CFG21_REF_FREQ_SEL;
+ reg |= FIELD_PREP(USBCS_USB2PHY_CFG21_REF_FREQ_SEL, 0);
+ writel(reg, gphy->usb2_cfg_base + USBCS_USB2PHY_CFG21_OFFSET);
+
+ reg = readl(gphy->usb2_cfg_base + USBCS_USB2PHY_CFG19_OFFSET);
+ reg &= ~USBCS_USB2PHY_CFG19_PHY_CFG_PLL_FB_DIV;
+ reg |= FIELD_PREP(USBCS_USB2PHY_CFG19_PHY_CFG_PLL_FB_DIV, 368);
+ writel(reg, gphy->usb2_cfg_base + USBCS_USB2PHY_CFG19_OFFSET);
+
+ set_vbus_valid(gphy);
+
+ ret = clk_prepare_enable(inst->clk);
+ if (ret)
+ return ret;
+
+ ret = reset_control_deassert(inst->rst);
+ if (ret) {
+ clk_disable_unprepare(inst->clk);
+ return ret;
+ }
+
+ reg = readl(gphy->usb2_cfg_base + USBCS_USB2PHY_CFG21_OFFSET);
+ reg |= USBCS_USB2PHY_CFG21_PHY_ENABLE;
+ writel(reg, gphy->usb2_cfg_base + USBCS_USB2PHY_CFG21_OFFSET);
+
+ return ret;
+}
+
+static int google_usb2_phy_exit(struct phy *_phy)
+{
+ struct google_usb_phy_instance *inst = phy_get_drvdata(_phy);
+ struct google_usb_phy *gphy = to_google_usb_phy(inst);
+ u32 reg;
+
+ dev_dbg(gphy->dev, "exiting usb2 phy\n");
+
+ guard(mutex)(&gphy->phy_mutex);
+
+ reg = readl(gphy->usb2_cfg_base + USBCS_USB2PHY_CFG21_OFFSET);
+ reg &= ~USBCS_USB2PHY_CFG21_PHY_ENABLE;
+ writel(reg, gphy->usb2_cfg_base + USBCS_USB2PHY_CFG21_OFFSET);
+
+ reset_control_assert(inst->rst);
+ clk_disable_unprepare(inst->clk);
+
+ return 0;
+}
+
+static const struct phy_ops google_usb2_phy_ops = {
+ .init = google_usb2_phy_init,
+ .exit = google_usb2_phy_exit,
+};
+
+static struct phy *google_usb_phy_xlate(struct device *dev,
+ const struct of_phandle_args *args)
+{
+ struct google_usb_phy *gphy = dev_get_drvdata(dev);
+
+ if (args->args[0] >= GOOGLE_USB_PHY_NUM) {
+ dev_err(dev, "invalid PHY index requested from DT\n");
+ return ERR_PTR(-ENODEV);
+ }
+ return gphy->insts[args->args[0]].phy;
+}
+
+static int google_usb_phy_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct google_usb_phy *gphy;
+ struct phy *phy;
+ struct google_usb_phy_instance *inst;
+ struct phy_provider *phy_provider;
+ struct typec_switch_desc sw_desc = { };
+ int ret;
+
+ gphy = devm_kzalloc(dev, sizeof(*gphy), GFP_KERNEL);
+ if (!gphy)
+ return -ENOMEM;
+
+ dev_set_drvdata(dev, gphy);
+ gphy->dev = dev;
+
+ ret = devm_mutex_init(dev, &gphy->phy_mutex);
+ if (ret)
+ return ret;
+
+ gphy->usb2_cfg_base =
+ devm_platform_ioremap_resource_byname(pdev, "usb2_cfg_csr");
+ if (IS_ERR(gphy->usb2_cfg_base))
+ return dev_err_probe(dev, PTR_ERR(gphy->usb2_cfg_base),
+ "invalid usb2 cfg csr\n");
+
+ gphy->dp_top_base =
+ devm_platform_ioremap_resource_byname(pdev, "dp_top_csr");
+ if (IS_ERR(gphy->dp_top_base))
+ return dev_err_probe(dev, PTR_ERR(gphy->dp_top_base),
+ "invalid dp top csr\n");
+
+ gphy->usb_top_cfg_base =
+ devm_platform_ioremap_resource_byname(pdev, "usb_top_cfg_csr");
+ if (IS_ERR(gphy->usb_top_cfg_base))
+ return dev_err_probe(dev, PTR_ERR(gphy->usb_top_cfg_base),
+ "invalid usb top cfg csr\n");
+
+ inst = &gphy->insts[GOOGLE_USB2_PHY];
+ inst->index = GOOGLE_USB2_PHY;
+ phy = devm_phy_create(dev, NULL, &google_usb2_phy_ops);
+ if (IS_ERR(phy))
+ return dev_err_probe(dev, PTR_ERR(phy),
+ "failed to create usb2 phy instance\n");
+ inst->phy = phy;
+ phy_set_drvdata(phy, inst);
+ inst->clk = devm_clk_get(dev, "usb2_phy_clk");
+ if (IS_ERR(inst->clk))
+ return dev_err_probe(dev, PTR_ERR(inst->clk),
+ "failed to get usb2 phy clk\n");
+ inst->rst = devm_reset_control_get_exclusive(dev, "usb2_phy_reset");
+ if (IS_ERR(inst->rst))
+ return dev_err_probe(dev, PTR_ERR(inst->rst),
+ "failed to get usb2 phy reset\n");
+
+ phy_provider = devm_of_phy_provider_register(dev, google_usb_phy_xlate);
+ if (IS_ERR(phy_provider))
+ return dev_err_probe(dev, PTR_ERR(phy_provider),
+ "failed to register phy provider\n");
+
+ pm_runtime_enable(dev);
+
+ sw_desc.fwnode = dev_fwnode(dev);
+ sw_desc.drvdata = gphy;
+ sw_desc.name = fwnode_get_name(dev_fwnode(dev));
+ sw_desc.set = google_usb_set_orientation;
+
+ gphy->sw = typec_switch_register(dev, &sw_desc);
+ if (IS_ERR(gphy->sw))
+ return dev_err_probe(dev, PTR_ERR(gphy->sw),
+ "failed to register typec switch\n");
+
+ return 0;
+}
+
+static void google_usb_phy_remove(struct platform_device *pdev)
+{
+ struct google_usb_phy *gphy = dev_get_drvdata(&pdev->dev);
+
+ typec_switch_unregister(gphy->sw);
+ pm_runtime_disable(&pdev->dev);
+}
+
+static const struct of_device_id google_usb_phy_of_match[] = {
+ {
+ .compatible = "google,usb-phy",
+ },
+ { }
+};
+MODULE_DEVICE_TABLE(of, google_usb_phy_of_match);
+
+static struct platform_driver google_usb_phy = {
+ .probe = google_usb_phy_probe,
+ .remove = google_usb_phy_remove,
+ .driver = {
+ .name = "google-usb-phy",
+ .of_match_table = google_usb_phy_of_match,
+ }
+};
+
+module_platform_driver(google_usb_phy);
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Google USB phy driver");
--
2.51.0.618.g983fd99d29-goog
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v1 4/4] dt-bindings: phy: google: Add Google SoC USB PHY
2025-10-06 23:21 [PATCH v1 0/4] Add Google Tensor SoC USB support Roy Luo
` (2 preceding siblings ...)
2025-10-06 23:21 ` [PATCH v1 3/4] usb: dwc3: Add Google SoC USB PHY driver Roy Luo
@ 2025-10-06 23:21 ` Roy Luo
2025-10-07 0:45 ` Krzysztof Kozlowski
2025-10-07 1:06 ` [PATCH v1 0/4] Add Google Tensor SoC USB support Krzysztof Kozlowski
4 siblings, 1 reply; 19+ messages in thread
From: Roy Luo @ 2025-10-06 23:21 UTC (permalink / raw)
To: Vinod Koul, Kishon Vijay Abraham I, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Greg Kroah-Hartman,
Thinh Nguyen, Philipp Zabel, Peter Griffin, André Draszik,
Tudor Ambarus
Cc: Joy Chakraborty, Naveen Kumar, Roy Luo, linux-phy, devicetree,
linux-kernel, linux-usb, linux-arm-kernel, linux-samsung-soc
Document the USB PHY bindings for Google Tensor SoCs.
Signed-off-by: Roy Luo <royluo@google.com>
---
.../bindings/phy/google,usb-phy.yaml | 91 +++++++++++++++++++
1 file changed, 91 insertions(+)
create mode 100644 Documentation/devicetree/bindings/phy/google,usb-phy.yaml
diff --git a/Documentation/devicetree/bindings/phy/google,usb-phy.yaml b/Documentation/devicetree/bindings/phy/google,usb-phy.yaml
new file mode 100644
index 000000000000..5552696edfff
--- /dev/null
+++ b/Documentation/devicetree/bindings/phy/google,usb-phy.yaml
@@ -0,0 +1,91 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+# Copyright (C) 2025, Google LLC
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/phy/google,usb-phy.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Google USB PHY
+
+maintainers:
+ - Roy Luo <royluo@google.com>
+
+description:
+ Describes the USB PHY block on Google Tensor SoCs.
+
+properties:
+ compatible:
+ items:
+ - enum:
+ - google,lga-usb-phy
+ - const: google,usb-phy
+
+ reg:
+ minItems: 3
+ maxItems: 3
+
+ reg-names:
+ items:
+ - const: usb2_cfg_csr
+ - const: dp_top_csr
+ - const: usb_top_cfg_csr
+
+ "#phy-cells":
+ const: 1
+
+ clocks:
+ maxItems: 1
+
+ clock-names:
+ items:
+ - const: usb2_phy_clk
+
+ resets:
+ maxItems: 1
+
+ reset-names:
+ items:
+ - const: usb2_phy_reset
+
+ power-domains:
+ maxItems: 1
+
+ orientation-switch:
+ type: boolean
+ description:
+ Indicates the PHY as a handler of USB Type-C orientation changes
+
+required:
+ - compatible
+ - reg
+ - reg-names
+ - "#phy-cells"
+ - clocks
+ - clock-names
+ - resets
+ - reset-names
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ soc {
+ #address-cells = <2>;
+ #size-cells = <2>;
+
+ usb_phy: usb_phy@c410000 {
+ compatible = "google,lga-usb-phy", "google,usb-phy";
+ reg = <0 0x0c450014 0 0xc>,
+ <0 0x0c637000 0 0xa0>,
+ <0 0x0c45002c 0 0x4>;
+ reg-names = "usb2_cfg_csr", "dp_top_csr", "usb_top_cfg_csr";
+ #phy-cells = <1>;
+ clocks = <&hsion_usb2_phy_reset_clk>;
+ clock-names = "usb2_phy_clk";
+ resets = <&hsion_resets_usb2_phy>;
+ reset-names = "usb2_phy_reset";
+ power-domains = <&hsio_n_usb_pd>;
+ orientation-switch;
+ };
+ };
+...
--
2.51.0.618.g983fd99d29-goog
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH v1 3/4] usb: dwc3: Add Google SoC USB PHY driver
2025-10-06 23:21 ` [PATCH v1 3/4] usb: dwc3: Add Google SoC USB PHY driver Roy Luo
@ 2025-10-07 0:42 ` Krzysztof Kozlowski
2025-10-07 5:51 ` Greg Kroah-Hartman
1 sibling, 0 replies; 19+ messages in thread
From: Krzysztof Kozlowski @ 2025-10-07 0:42 UTC (permalink / raw)
To: Roy Luo, Vinod Koul, Kishon Vijay Abraham I, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Greg Kroah-Hartman,
Thinh Nguyen, Philipp Zabel, Peter Griffin, André Draszik,
Tudor Ambarus
Cc: Joy Chakraborty, Naveen Kumar, linux-phy, devicetree,
linux-kernel, linux-usb, linux-arm-kernel, linux-samsung-soc
On 07/10/2025 08:21, Roy Luo wrote:
> Support the USB PHY found on Google Tensor SoCs.
> This particular USB PHY supports both high-speed and super-speed
> operations, and is paired with the SNPS DWC3 controller that's also
> integrated on the SoCs.
> This initial patch specifically adds functionality for high-speed.
>
> Co-developed-by: Joy Chakraborty <joychakr@google.com>
> Signed-off-by: Joy Chakraborty <joychakr@google.com>
> Co-developed-by: Naveen Kumar <mnkumar@google.com>
> Signed-off-by: Naveen Kumar <mnkumar@google.com>
> Signed-off-by: Roy Luo <royluo@google.com>
> ---
> drivers/phy/Kconfig | 1 +
> drivers/phy/Makefile | 1 +
> drivers/phy/google/Kconfig | 15 ++
> drivers/phy/google/Makefile | 2 +
> drivers/phy/google/phy-google-usb.c | 286 ++++++++++++++++++++++++++++
No, you don't get a new directory and new driver. That's a Samsung part,
AFAIK. Re-use existing code.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v1 2/4] dt-bindings: usb: dwc3: Add Google SoC DWC3 USB
2025-10-06 23:21 ` [PATCH v1 2/4] dt-bindings: usb: dwc3: Add Google SoC DWC3 USB Roy Luo
@ 2025-10-07 0:44 ` Krzysztof Kozlowski
2025-10-07 9:09 ` Peter Griffin
0 siblings, 1 reply; 19+ messages in thread
From: Krzysztof Kozlowski @ 2025-10-07 0:44 UTC (permalink / raw)
To: Roy Luo, Vinod Koul, Kishon Vijay Abraham I, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Greg Kroah-Hartman,
Thinh Nguyen, Philipp Zabel, Peter Griffin, André Draszik,
Tudor Ambarus
Cc: Joy Chakraborty, Naveen Kumar, linux-phy, devicetree,
linux-kernel, linux-usb, linux-arm-kernel, linux-samsung-soc
On 07/10/2025 08:21, Roy Luo wrote:
> Document the DWC3 USB bindings for Google Tensor SoCs.
>
> Signed-off-by: Roy Luo <royluo@google.com>
> ---
> .../bindings/usb/google,snps-dwc3.yaml | 144 ++++++++++++++++++
> 1 file changed, 144 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml
>
> diff --git a/Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml b/Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml
> new file mode 100644
> index 000000000000..3e8bcc0c2cef
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml
> @@ -0,0 +1,144 @@
> +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
> +# Copyright (c) 2025, Google LLC
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/usb/google,snps-dwc3.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Google DWC3 USB SoC Controller
> +
> +maintainers:
> + - Roy Luo <royluo@google.com>
> +
> +description:
> + Describes the Google DWC3 USB block, based on Synopsys DWC3 IP.
> +
> +properties:
> + compatible:
> + items:
> + - enum:
> + - google,lga-dwc3
> + - const: google,snps-dwc3
There is no such soc as snps, so you grossly misuse other company name
as name of SoC. Neither lga. Otherwise please point me to the top-level
bindings describing that SoC.
You need to better describe the hardware here - why this is something
completely different than GS which. Or switch to existing bindings and
existing drivers. Did you align this with Peter Griffin?
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v1 4/4] dt-bindings: phy: google: Add Google SoC USB PHY
2025-10-06 23:21 ` [PATCH v1 4/4] dt-bindings: phy: google: Add Google SoC USB PHY Roy Luo
@ 2025-10-07 0:45 ` Krzysztof Kozlowski
2025-10-07 19:04 ` Roy Luo
0 siblings, 1 reply; 19+ messages in thread
From: Krzysztof Kozlowski @ 2025-10-07 0:45 UTC (permalink / raw)
To: Roy Luo, Vinod Koul, Kishon Vijay Abraham I, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Greg Kroah-Hartman,
Thinh Nguyen, Philipp Zabel, Peter Griffin, André Draszik,
Tudor Ambarus
Cc: Joy Chakraborty, Naveen Kumar, linux-phy, devicetree,
linux-kernel, linux-usb, linux-arm-kernel, linux-samsung-soc
On 07/10/2025 08:21, Roy Luo wrote:
> Document the USB PHY bindings for Google Tensor SoCs.
>
> Signed-off-by: Roy Luo <royluo@google.com>
> ---
> .../bindings/phy/google,usb-phy.yaml | 91 +++++++++++++++++++
> 1 file changed, 91 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/phy/google,usb-phy.yaml
>
> diff --git a/Documentation/devicetree/bindings/phy/google,usb-phy.yaml b/Documentation/devicetree/bindings/phy/google,usb-phy.yaml
> new file mode 100644
> index 000000000000..5552696edfff
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/phy/google,usb-phy.yaml
> @@ -0,0 +1,91 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +# Copyright (C) 2025, Google LLC
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/phy/google,usb-phy.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Google USB PHY
> +
> +maintainers:
> + - Roy Luo <royluo@google.com>
> +
> +description:
> + Describes the USB PHY block on Google Tensor SoCs.
Which ones? You need to be VERY specific here.
> +
> +properties:
> + compatible:
> + items:
> + - enum:
> + - google,lga-usb-phy
> + - const: google,usb-phy
Please read carefully bindings. You cannot have generic compatible.
Plus you are duplicating existing Samsung bindings.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v1 1/4] usb: dwc3: Add Google SoC DWC3 glue driver
2025-10-06 23:21 ` [PATCH v1 1/4] usb: dwc3: Add Google SoC DWC3 glue driver Roy Luo
@ 2025-10-07 0:46 ` Krzysztof Kozlowski
2025-10-07 18:08 ` Roy Luo
2025-10-11 3:39 ` kernel test robot
1 sibling, 1 reply; 19+ messages in thread
From: Krzysztof Kozlowski @ 2025-10-07 0:46 UTC (permalink / raw)
To: Roy Luo, Vinod Koul, Kishon Vijay Abraham I, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Greg Kroah-Hartman,
Thinh Nguyen, Philipp Zabel, Peter Griffin, André Draszik,
Tudor Ambarus
Cc: Joy Chakraborty, Naveen Kumar, linux-phy, devicetree,
linux-kernel, linux-usb, linux-arm-kernel, linux-samsung-soc
On 07/10/2025 08:21, Roy Luo wrote:
> This patch adds support for the DWC3 USB controller found on Google
Please read submitting patches, how this should be written.
> Tensor SoCs. The controller features dual-role functionality and
> hibernation.
> +
> +static const struct dev_pm_ops dwc3_google_dev_pm_ops = {
> + SET_SYSTEM_SLEEP_PM_OPS(dwc3_google_pm_suspend, dwc3_google_pm_resume)
> + SET_RUNTIME_PM_OPS(dwc3_google_runtime_suspend, dwc3_google_runtime_resume,
> + dwc3_google_runtime_idle)
> + .complete = dwc3_google_complete,
> + .prepare = dwc3_google_prepare,
> +};
> +
> +static const struct of_device_id dwc3_google_of_match[] = {
> + { .compatible = "google,snps-dwc3" },
You cannot use compatible before documenting it. Read submitting patches.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v1 0/4] Add Google Tensor SoC USB support
2025-10-06 23:21 [PATCH v1 0/4] Add Google Tensor SoC USB support Roy Luo
` (3 preceding siblings ...)
2025-10-06 23:21 ` [PATCH v1 4/4] dt-bindings: phy: google: Add Google SoC USB PHY Roy Luo
@ 2025-10-07 1:06 ` Krzysztof Kozlowski
2025-10-07 18:03 ` Roy Luo
4 siblings, 1 reply; 19+ messages in thread
From: Krzysztof Kozlowski @ 2025-10-07 1:06 UTC (permalink / raw)
To: Roy Luo, Vinod Koul, Kishon Vijay Abraham I, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Greg Kroah-Hartman,
Thinh Nguyen, Philipp Zabel, Peter Griffin, André Draszik,
Tudor Ambarus
Cc: Joy Chakraborty, Naveen Kumar, linux-phy, devicetree,
linux-kernel, linux-usb, linux-arm-kernel, linux-samsung-soc
On 07/10/2025 08:21, Roy Luo wrote:
> This series introduces support for the USB controller and PHY found on
> Google Tensor SoCs (G5 and newer). This includes:
>
> 1. DWC3 Glue Driver: A new glue layer for the Synopsys DesignWare USB 3.0
> controller (DWC3) as integrated into Google Tensor SoCs, including
> hibernation support.
> 2. DWC3 DT Bindings: Device Tree binding documentation for the Google
> Tensor SoC DWC3 controller.
> 3. USB PHY Driver: A new driver for the Google Tensor SoC USB PHY,
> initially supporting high-speed operations.
> 4. USB PHY DT Bindings: Device Tree binding documentation for the Google
> Tensor SoC USB PHY.
This is useless message in the cover letter. We see what patches do from
the patches.
What you are supposed to explain here and in the bindings patches, is
why we want this driver and what is Tensor SoC, considering we already
have one Tensor SoC... IOW, explain everything which is not obvious -
and duplicating SoCs with some generic name is for sure not obvious.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v1 3/4] usb: dwc3: Add Google SoC USB PHY driver
2025-10-06 23:21 ` [PATCH v1 3/4] usb: dwc3: Add Google SoC USB PHY driver Roy Luo
2025-10-07 0:42 ` Krzysztof Kozlowski
@ 2025-10-07 5:51 ` Greg Kroah-Hartman
2025-10-07 18:57 ` Roy Luo
1 sibling, 1 reply; 19+ messages in thread
From: Greg Kroah-Hartman @ 2025-10-07 5:51 UTC (permalink / raw)
To: Roy Luo
Cc: Vinod Koul, Kishon Vijay Abraham I, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Thinh Nguyen, Philipp Zabel,
Peter Griffin, André Draszik, Tudor Ambarus, Joy Chakraborty,
Naveen Kumar, linux-phy, devicetree, linux-kernel, linux-usb,
linux-arm-kernel, linux-samsung-soc
On Mon, Oct 06, 2025 at 11:21:24PM +0000, Roy Luo wrote:
> Support the USB PHY found on Google Tensor SoCs.
That's great, but that's not what your subject line says (it says "usb:
dwc3")
> This particular USB PHY supports both high-speed and super-speed
> operations, and is paired with the SNPS DWC3 controller that's also
> integrated on the SoCs.
> This initial patch specifically adds functionality for high-speed.
>
> Co-developed-by: Joy Chakraborty <joychakr@google.com>
> Signed-off-by: Joy Chakraborty <joychakr@google.com>
> Co-developed-by: Naveen Kumar <mnkumar@google.com>
> Signed-off-by: Naveen Kumar <mnkumar@google.com>
> Signed-off-by: Roy Luo <royluo@google.com>
> ---
> drivers/phy/Kconfig | 1 +
> drivers/phy/Makefile | 1 +
> drivers/phy/google/Kconfig | 15 ++
> drivers/phy/google/Makefile | 2 +
> drivers/phy/google/phy-google-usb.c | 286 ++++++++++++++++++++++++++++
And as others said, you don't need a whole new directory for one single
.c file.
thanks,
greg k-h
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v1 2/4] dt-bindings: usb: dwc3: Add Google SoC DWC3 USB
2025-10-07 0:44 ` Krzysztof Kozlowski
@ 2025-10-07 9:09 ` Peter Griffin
2025-10-07 14:18 ` Krzysztof Kozlowski
0 siblings, 1 reply; 19+ messages in thread
From: Peter Griffin @ 2025-10-07 9:09 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: Roy Luo, Vinod Koul, Kishon Vijay Abraham I, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Greg Kroah-Hartman,
Thinh Nguyen, Philipp Zabel, André Draszik, Tudor Ambarus,
Joy Chakraborty, Naveen Kumar, linux-phy, devicetree,
linux-kernel, linux-usb, linux-arm-kernel, linux-samsung-soc
Hi Krzysztof & Roy,
Firstly thanks Roy for your patches, it's great to see more Tensor
support being posted upstream!
On Tue, 7 Oct 2025 at 01:44, Krzysztof Kozlowski <krzk@kernel.org> wrote:
>
> On 07/10/2025 08:21, Roy Luo wrote:
> > Document the DWC3 USB bindings for Google Tensor SoCs.
> >
> > Signed-off-by: Roy Luo <royluo@google.com>
> > ---
> > .../bindings/usb/google,snps-dwc3.yaml | 144 ++++++++++++++++++
> > 1 file changed, 144 insertions(+)
> > create mode 100644 Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml
> >
> > diff --git a/Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml b/Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml
> > new file mode 100644
> > index 000000000000..3e8bcc0c2cef
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml
> > @@ -0,0 +1,144 @@
> > +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
> > +# Copyright (c) 2025, Google LLC
> > +%YAML 1.2
> > +---
> > +$id: http://devicetree.org/schemas/usb/google,snps-dwc3.yaml#
> > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > +
> > +title: Google DWC3 USB SoC Controller
> > +
> > +maintainers:
> > + - Roy Luo <royluo@google.com>
> > +
> > +description:
> > + Describes the Google DWC3 USB block, based on Synopsys DWC3 IP.
> > +
> > +properties:
> > + compatible:
> > + items:
> > + - enum:
> > + - google,lga-dwc3
> > + - const: google,snps-dwc3
>
>
> There is no such soc as snps, so you grossly misuse other company name
> as name of SoC. Neither lga. Otherwise please point me to the top-level
> bindings describing that SoC.
>
> You need to better describe the hardware here - why this is something
> completely different than GS which. Or switch to existing bindings and
> existing drivers. Did you align this with Peter Griffin?
I think (from what I've seen at least) this is the first submission
for drivers in the Tensor G5 SoC used in Pixel 10 devices (which as I
understand it isn't based on any Samsung IP). Hence the new drivers,
bindings etc.
However the issue is that none of the other base SoC drivers on which
this driver depends currently exist upstream (like clocks, reset
driver, power domains, pinctrl etc). So it's very hard to reason about
the correctness or otherwise of this submission. It is also likely
that when those drivers are upstreamed things could change in the
review process, to how it looks today in the downstream kernel.
So in summary I think to progress with this we need to get the base
Tensor G5 SoC drivers merged first (e.g. boot to console with pinctrl,
basic clock support, reset driver etc). Then we can start adding in
some of the other peripherals like i2c/spi/usb etc and build up the
mainline support from there.
Thanks,
Peter.
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v1 2/4] dt-bindings: usb: dwc3: Add Google SoC DWC3 USB
2025-10-07 9:09 ` Peter Griffin
@ 2025-10-07 14:18 ` Krzysztof Kozlowski
2025-10-07 18:49 ` Roy Luo
0 siblings, 1 reply; 19+ messages in thread
From: Krzysztof Kozlowski @ 2025-10-07 14:18 UTC (permalink / raw)
To: Peter Griffin
Cc: Roy Luo, Vinod Koul, Kishon Vijay Abraham I, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Greg Kroah-Hartman,
Thinh Nguyen, Philipp Zabel, André Draszik, Tudor Ambarus,
Joy Chakraborty, Naveen Kumar, linux-phy, devicetree,
linux-kernel, linux-usb, linux-arm-kernel, linux-samsung-soc
On 07/10/2025 18:09, Peter Griffin wrote:
> Hi Krzysztof & Roy,
>
> Firstly thanks Roy for your patches, it's great to see more Tensor
> support being posted upstream!
>
> On Tue, 7 Oct 2025 at 01:44, Krzysztof Kozlowski <krzk@kernel.org> wrote:
>>
>> On 07/10/2025 08:21, Roy Luo wrote:
>>> Document the DWC3 USB bindings for Google Tensor SoCs.
>>>
>>> Signed-off-by: Roy Luo <royluo@google.com>
>>> ---
>>> .../bindings/usb/google,snps-dwc3.yaml | 144 ++++++++++++++++++
>>> 1 file changed, 144 insertions(+)
>>> create mode 100644 Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml
>>>
>>> diff --git a/Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml b/Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml
>>> new file mode 100644
>>> index 000000000000..3e8bcc0c2cef
>>> --- /dev/null
>>> +++ b/Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml
>>> @@ -0,0 +1,144 @@
>>> +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
>>> +# Copyright (c) 2025, Google LLC
>>> +%YAML 1.2
>>> +---
>>> +$id: http://devicetree.org/schemas/usb/google,snps-dwc3.yaml#
>>> +$schema: http://devicetree.org/meta-schemas/core.yaml#
>>> +
>>> +title: Google DWC3 USB SoC Controller
>>> +
>>> +maintainers:
>>> + - Roy Luo <royluo@google.com>
>>> +
>>> +description:
>>> + Describes the Google DWC3 USB block, based on Synopsys DWC3 IP.
>>> +
>>> +properties:
>>> + compatible:
>>> + items:
>>> + - enum:
>>> + - google,lga-dwc3
>>> + - const: google,snps-dwc3
>>
>>
>> There is no such soc as snps, so you grossly misuse other company name
>> as name of SoC. Neither lga. Otherwise please point me to the top-level
>> bindings describing that SoC.
>>
>> You need to better describe the hardware here - why this is something
>> completely different than GS which. Or switch to existing bindings and
>> existing drivers. Did you align this with Peter Griffin?
>
> I think (from what I've seen at least) this is the first submission
> for drivers in the Tensor G5 SoC used in Pixel 10 devices (which as I
> understand it isn't based on any Samsung IP). Hence the new drivers,
> bindings etc.
That could explain a lot. I would be happy to see background of hardware
in the bindings commit msg and the cover letter.
>
> However the issue is that none of the other base SoC drivers on which
> this driver depends currently exist upstream (like clocks, reset
> driver, power domains, pinctrl etc). So it's very hard to reason about
> the correctness or otherwise of this submission. It is also likely
> that when those drivers are upstreamed things could change in the
> review process, to how it looks today in the downstream kernel.
Bindings and drivers can be contributed without core SoC support, but
then please describe the hardware (SoC) here. Having core support posted
earlier is of course preferred, but I think not a requirement.
Anyway, compatibles and all commit messages in this patchset are too
generic and need to reflect this actual SoC, not "Tensor" because we
already have a Tensor with USB. So basically based on existing support
all this patchset would be redundant, right? :)
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v1 0/4] Add Google Tensor SoC USB support
2025-10-07 1:06 ` [PATCH v1 0/4] Add Google Tensor SoC USB support Krzysztof Kozlowski
@ 2025-10-07 18:03 ` Roy Luo
0 siblings, 0 replies; 19+ messages in thread
From: Roy Luo @ 2025-10-07 18:03 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: Vinod Koul, Kishon Vijay Abraham I, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Greg Kroah-Hartman,
Thinh Nguyen, Philipp Zabel, Peter Griffin, André Draszik,
Tudor Ambarus, Joy Chakraborty, Naveen Kumar, linux-phy,
devicetree, linux-kernel, linux-usb, linux-arm-kernel,
linux-samsung-soc
On Mon, Oct 6, 2025 at 6:06 PM Krzysztof Kozlowski <krzk@kernel.org> wrote:
>
> On 07/10/2025 08:21, Roy Luo wrote:
> > This series introduces support for the USB controller and PHY found on
> > Google Tensor SoCs (G5 and newer). This includes:
> >
> > 1. DWC3 Glue Driver: A new glue layer for the Synopsys DesignWare USB 3.0
> > controller (DWC3) as integrated into Google Tensor SoCs, including
> > hibernation support.
> > 2. DWC3 DT Bindings: Device Tree binding documentation for the Google
> > Tensor SoC DWC3 controller.
> > 3. USB PHY Driver: A new driver for the Google Tensor SoC USB PHY,
> > initially supporting high-speed operations.
> > 4. USB PHY DT Bindings: Device Tree binding documentation for the Google
> > Tensor SoC USB PHY.
>
> This is useless message in the cover letter. We see what patches do from
> the patches.
>
> What you are supposed to explain here and in the bindings patches, is
> why we want this driver and what is Tensor SoC, considering we already
> have one Tensor SoC... IOW, explain everything which is not obvious -
> and duplicating SoCs with some generic name is for sure not obvious.
>
> Best regards,
> Krzysztof
Thanks for the review. Will remove the redundant info and ensure the next
cover letter provides the necessary context on the Google Tensor G5 SoC
this series intends to support.
Regards,
Roy Luo
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v1 1/4] usb: dwc3: Add Google SoC DWC3 glue driver
2025-10-07 0:46 ` Krzysztof Kozlowski
@ 2025-10-07 18:08 ` Roy Luo
0 siblings, 0 replies; 19+ messages in thread
From: Roy Luo @ 2025-10-07 18:08 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: Vinod Koul, Kishon Vijay Abraham I, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Greg Kroah-Hartman,
Thinh Nguyen, Philipp Zabel, Peter Griffin, André Draszik,
Tudor Ambarus, Joy Chakraborty, Naveen Kumar, linux-phy,
devicetree, linux-kernel, linux-usb, linux-arm-kernel,
linux-samsung-soc
On Mon, Oct 6, 2025 at 5:46 PM Krzysztof Kozlowski <krzk@kernel.org> wrote:
>
> On 07/10/2025 08:21, Roy Luo wrote:
> > This patch adds support for the DWC3 USB controller found on Google
>
> Please read submitting patches, how this should be written.
Will use imperative mood in the next patch.
>
> > Tensor SoCs. The controller features dual-role functionality and
> > hibernation.
>
>
>
> > +
> > +static const struct dev_pm_ops dwc3_google_dev_pm_ops = {
> > + SET_SYSTEM_SLEEP_PM_OPS(dwc3_google_pm_suspend, dwc3_google_pm_resume)
> > + SET_RUNTIME_PM_OPS(dwc3_google_runtime_suspend, dwc3_google_runtime_resume,
> > + dwc3_google_runtime_idle)
> > + .complete = dwc3_google_complete,
> > + .prepare = dwc3_google_prepare,
> > +};
> > +
> > +static const struct of_device_id dwc3_google_of_match[] = {
> > + { .compatible = "google,snps-dwc3" },
>
> You cannot use compatible before documenting it. Read submitting patches.
>
> Best regards,
> Krzysztof
Will change the ordering so that the dt binding patch goes first.
Thanks,
Roy Luo
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v1 2/4] dt-bindings: usb: dwc3: Add Google SoC DWC3 USB
2025-10-07 14:18 ` Krzysztof Kozlowski
@ 2025-10-07 18:49 ` Roy Luo
0 siblings, 0 replies; 19+ messages in thread
From: Roy Luo @ 2025-10-07 18:49 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: Peter Griffin, Vinod Koul, Kishon Vijay Abraham I, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Greg Kroah-Hartman,
Thinh Nguyen, Philipp Zabel, André Draszik, Tudor Ambarus,
Joy Chakraborty, Naveen Kumar, linux-phy, devicetree,
linux-kernel, linux-usb, linux-arm-kernel, linux-samsung-soc
On Tue, Oct 7, 2025 at 7:18 AM Krzysztof Kozlowski <krzk@kernel.org> wrote:
>
> On 07/10/2025 18:09, Peter Griffin wrote:
> > Hi Krzysztof & Roy,
> >
> > Firstly thanks Roy for your patches, it's great to see more Tensor
> > support being posted upstream!
> >
> > On Tue, 7 Oct 2025 at 01:44, Krzysztof Kozlowski <krzk@kernel.org> wrote:
> >>
> >> On 07/10/2025 08:21, Roy Luo wrote:
> >>> Document the DWC3 USB bindings for Google Tensor SoCs.
> >>>
> >>> Signed-off-by: Roy Luo <royluo@google.com>
> >>> ---
> >>> .../bindings/usb/google,snps-dwc3.yaml | 144 ++++++++++++++++++
> >>> 1 file changed, 144 insertions(+)
> >>> create mode 100644 Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml
> >>>
> >>> diff --git a/Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml b/Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml
> >>> new file mode 100644
> >>> index 000000000000..3e8bcc0c2cef
> >>> --- /dev/null
> >>> +++ b/Documentation/devicetree/bindings/usb/google,snps-dwc3.yaml
> >>> @@ -0,0 +1,144 @@
> >>> +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
> >>> +# Copyright (c) 2025, Google LLC
> >>> +%YAML 1.2
> >>> +---
> >>> +$id: http://devicetree.org/schemas/usb/google,snps-dwc3.yaml#
> >>> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> >>> +
> >>> +title: Google DWC3 USB SoC Controller
> >>> +
> >>> +maintainers:
> >>> + - Roy Luo <royluo@google.com>
> >>> +
> >>> +description:
> >>> + Describes the Google DWC3 USB block, based on Synopsys DWC3 IP.
> >>> +
> >>> +properties:
> >>> + compatible:
> >>> + items:
> >>> + - enum:
> >>> + - google,lga-dwc3
> >>> + - const: google,snps-dwc3
> >>
> >>
> >> There is no such soc as snps, so you grossly misuse other company name
> >> as name of SoC. Neither lga. Otherwise please point me to the top-level
> >> bindings describing that SoC.
> >>
> >> You need to better describe the hardware here - why this is something
> >> completely different than GS which. Or switch to existing bindings and
> >> existing drivers. Did you align this with Peter Griffin?
> >
> > I think (from what I've seen at least) this is the first submission
> > for drivers in the Tensor G5 SoC used in Pixel 10 devices (which as I
> > understand it isn't based on any Samsung IP). Hence the new drivers,
> > bindings etc.
>
>
> That could explain a lot. I would be happy to see background of hardware
> in the bindings commit msg and the cover letter.
>
> >
> > However the issue is that none of the other base SoC drivers on which
> > this driver depends currently exist upstream (like clocks, reset
> > driver, power domains, pinctrl etc). So it's very hard to reason about
> > the correctness or otherwise of this submission. It is also likely
> > that when those drivers are upstreamed things could change in the
> > review process, to how it looks today in the downstream kernel.
>
>
> Bindings and drivers can be contributed without core SoC support, but
> then please describe the hardware (SoC) here. Having core support posted
> earlier is of course preferred, but I think not a requirement.
>
> Anyway, compatibles and all commit messages in this patchset are too
> generic and need to reflect this actual SoC, not "Tensor" because we
> already have a Tensor with USB. So basically based on existing support
> all this patchset would be redundant, right? :)
>
> Best regards,
> Krzysztof
Hi Krzysztof and Peter,
My apologies for not providing the full context on the SoC supported in this
series. Thanks to Peter for clarifying; yes, the Tensor G5 SoC is a new
generation of Google silicon that is significantly different from previous
generations which are based on Samsung/Exynos IP. This necessitates
new bindings and drivers for the G5 and future generations, and I will
ensure this is clearly detailed in the next patch set's cover letter and
commit message.
I acknowledge that the core SoC support (clocks, reset, etc.) for G5 is still
missing from upstream. We do have plans to push this forward, but I don't
have a firm timeline yet. Thanks for confirming that this won't be a show
stopper for this patchset.
Thanks,
Roy Luo
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v1 3/4] usb: dwc3: Add Google SoC USB PHY driver
2025-10-07 5:51 ` Greg Kroah-Hartman
@ 2025-10-07 18:57 ` Roy Luo
0 siblings, 0 replies; 19+ messages in thread
From: Roy Luo @ 2025-10-07 18:57 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: Vinod Koul, Kishon Vijay Abraham I, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Thinh Nguyen, Philipp Zabel,
Peter Griffin, André Draszik, Tudor Ambarus, Joy Chakraborty,
Naveen Kumar, linux-phy, devicetree, linux-kernel, linux-usb,
linux-arm-kernel, linux-samsung-soc
On Mon, Oct 6, 2025 at 10:51 PM Greg Kroah-Hartman
<gregkh@linuxfoundation.org> wrote:
>
> On Mon, Oct 06, 2025 at 11:21:24PM +0000, Roy Luo wrote:
> > Support the USB PHY found on Google Tensor SoCs.
>
> That's great, but that's not what your subject line says (it says "usb:
> dwc3")
Will change the title prefix to phy in the next patchset.
>
> > This particular USB PHY supports both high-speed and super-speed
> > operations, and is paired with the SNPS DWC3 controller that's also
> > integrated on the SoCs.
> > This initial patch specifically adds functionality for high-speed.
> >
> > Co-developed-by: Joy Chakraborty <joychakr@google.com>
> > Signed-off-by: Joy Chakraborty <joychakr@google.com>
> > Co-developed-by: Naveen Kumar <mnkumar@google.com>
> > Signed-off-by: Naveen Kumar <mnkumar@google.com>
> > Signed-off-by: Roy Luo <royluo@google.com>
> > ---
> > drivers/phy/Kconfig | 1 +
> > drivers/phy/Makefile | 1 +
> > drivers/phy/google/Kconfig | 15 ++
> > drivers/phy/google/Makefile | 2 +
> > drivers/phy/google/phy-google-usb.c | 286 ++++++++++++++++++++++++++++
>
> And as others said, you don't need a whole new directory for one single
> .c file.
>
> thanks,
>
> greg k-h
The USB phy on Google Tensor G5 is no longer based on Samsung/Exynos
IP, hence we need a new driver for it.
Acknowledge that we don't need a new directory just for one file, will move
it to the drivers/phy directory in the next patchset.
Thanks,
Roy Luo
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v1 4/4] dt-bindings: phy: google: Add Google SoC USB PHY
2025-10-07 0:45 ` Krzysztof Kozlowski
@ 2025-10-07 19:04 ` Roy Luo
0 siblings, 0 replies; 19+ messages in thread
From: Roy Luo @ 2025-10-07 19:04 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: Vinod Koul, Kishon Vijay Abraham I, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Greg Kroah-Hartman,
Thinh Nguyen, Philipp Zabel, Peter Griffin, André Draszik,
Tudor Ambarus, Joy Chakraborty, Naveen Kumar, linux-phy,
devicetree, linux-kernel, linux-usb, linux-arm-kernel,
linux-samsung-soc
On Mon, Oct 6, 2025 at 5:45 PM Krzysztof Kozlowski <krzk@kernel.org> wrote:
>
> On 07/10/2025 08:21, Roy Luo wrote:
> > Document the USB PHY bindings for Google Tensor SoCs.
> >
> > Signed-off-by: Roy Luo <royluo@google.com>
> > ---
> > .../bindings/phy/google,usb-phy.yaml | 91 +++++++++++++++++++
> > 1 file changed, 91 insertions(+)
> > create mode 100644 Documentation/devicetree/bindings/phy/google,usb-phy.yaml
> >
> > diff --git a/Documentation/devicetree/bindings/phy/google,usb-phy.yaml b/Documentation/devicetree/bindings/phy/google,usb-phy.yaml
> > new file mode 100644
> > index 000000000000..5552696edfff
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/phy/google,usb-phy.yaml
> > @@ -0,0 +1,91 @@
> > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> > +# Copyright (C) 2025, Google LLC
> > +%YAML 1.2
> > +---
> > +$id: http://devicetree.org/schemas/phy/google,usb-phy.yaml#
> > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > +
> > +title: Google USB PHY
> > +
> > +maintainers:
> > + - Roy Luo <royluo@google.com>
> > +
> > +description:
> > + Describes the USB PHY block on Google Tensor SoCs.
>
> Which ones? You need to be VERY specific here.
This USB PHY is specific to Tensor G5 SoC (and future generations) and thus
necessitates new drivers and new bindings. Will update the description and
commit message in the next patchset.
>
> > +
> > +properties:
> > + compatible:
> > + items:
> > + - enum:
> > + - google,lga-usb-phy
> > + - const: google,usb-phy
>
> Please read carefully bindings. You cannot have generic compatible.
> Plus you are duplicating existing Samsung bindings.
>
> Best regards,
> Krzysztof
Will refrain from using generic compatible in the next patchset.
Thanks,
Roy Luo
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v1 1/4] usb: dwc3: Add Google SoC DWC3 glue driver
2025-10-06 23:21 ` [PATCH v1 1/4] usb: dwc3: Add Google SoC DWC3 glue driver Roy Luo
2025-10-07 0:46 ` Krzysztof Kozlowski
@ 2025-10-11 3:39 ` kernel test robot
1 sibling, 0 replies; 19+ messages in thread
From: kernel test robot @ 2025-10-11 3:39 UTC (permalink / raw)
To: Roy Luo, Vinod Koul, Kishon Vijay Abraham I, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Greg Kroah-Hartman,
Thinh Nguyen, Philipp Zabel, Peter Griffin, André Draszik,
Tudor Ambarus
Cc: oe-kbuild-all, Joy Chakraborty, Naveen Kumar, Roy Luo, linux-phy,
devicetree, linux-kernel, linux-usb, linux-arm-kernel,
linux-samsung-soc
Hi Roy,
kernel test robot noticed the following build warnings:
[auto build test WARNING on e5f0a698b34ed76002dc5cff3804a61c80233a7a]
url: https://github.com/intel-lab-lkp/linux/commits/Roy-Luo/usb-dwc3-Add-Google-SoC-DWC3-glue-driver/20251010-092651
base: e5f0a698b34ed76002dc5cff3804a61c80233a7a
patch link: https://lore.kernel.org/r/20251006232125.1833979-2-royluo%40google.com
patch subject: [PATCH v1 1/4] usb: dwc3: Add Google SoC DWC3 glue driver
config: s390-randconfig-002-20251011 (https://download.01.org/0day-ci/archive/20251011/202510111335.oyOAs9MB-lkp@intel.com/config)
compiler: s390-linux-gcc (GCC) 15.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251011/202510111335.oyOAs9MB-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202510111335.oyOAs9MB-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/usb/dwc3/dwc3-google.c:467:12: warning: 'dwc3_google_resume' defined but not used [-Wunused-function]
467 | static int dwc3_google_resume(struct dwc3_google *google, pm_message_t msg)
| ^~~~~~~~~~~~~~~~~~
>> drivers/usb/dwc3/dwc3-google.c:441:12: warning: 'dwc3_google_suspend' defined but not used [-Wunused-function]
441 | static int dwc3_google_suspend(struct dwc3_google *google, pm_message_t msg)
| ^~~~~~~~~~~~~~~~~~~
vim +/dwc3_google_resume +467 drivers/usb/dwc3/dwc3-google.c
440
> 441 static int dwc3_google_suspend(struct dwc3_google *google, pm_message_t msg)
442 {
443 if (pm_runtime_suspended(google->dev))
444 return 0;
445
446 if (google->dwc.current_dr_role == DWC3_GCTL_PRTCAP_HOST) {
447 /*
448 * Follow dwc3_suspend_common() guidelines for deciding between
449 * a full teardown and hibernation.
450 */
451 if (PMSG_IS_AUTO(msg) || device_may_wakeup(google->dev)) {
452 dev_dbg(google->dev, "enter hibernation");
453 pm_runtime_get_sync(google->usb_top_pd);
454 device_wakeup_enable(google->usb_top_pd);
455 dwc3_google_enable_pme_irq(google);
456 google->is_hibernation = true;
457 return 0;
458 }
459 }
460
461 reset_control_bulk_assert(google->num_rsts, google->rsts);
462 clk_bulk_disable_unprepare(google->num_clks, google->clks);
463
464 return 0;
465 }
466
> 467 static int dwc3_google_resume(struct dwc3_google *google, pm_message_t msg)
468 {
469 int ret;
470
471 if (google->is_hibernation) {
472 dev_dbg(google->dev, "exit hibernation");
473 dwc3_google_disable_pme_irq(google);
474 device_wakeup_disable(google->usb_top_pd);
475 pm_runtime_put_sync(google->usb_top_pd);
476 google->is_hibernation = false;
477 return 0;
478 }
479
480 ret = clk_bulk_prepare_enable(google->num_clks, google->clks);
481 if (ret)
482 return ret;
483
484 ret = reset_control_bulk_deassert(google->num_rsts, google->rsts);
485 if (ret) {
486 clk_bulk_disable_unprepare(google->num_clks, google->clks);
487 return ret;
488 }
489
490 return 0;
491 }
492
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2025-10-11 3:40 UTC | newest]
Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-06 23:21 [PATCH v1 0/4] Add Google Tensor SoC USB support Roy Luo
2025-10-06 23:21 ` [PATCH v1 1/4] usb: dwc3: Add Google SoC DWC3 glue driver Roy Luo
2025-10-07 0:46 ` Krzysztof Kozlowski
2025-10-07 18:08 ` Roy Luo
2025-10-11 3:39 ` kernel test robot
2025-10-06 23:21 ` [PATCH v1 2/4] dt-bindings: usb: dwc3: Add Google SoC DWC3 USB Roy Luo
2025-10-07 0:44 ` Krzysztof Kozlowski
2025-10-07 9:09 ` Peter Griffin
2025-10-07 14:18 ` Krzysztof Kozlowski
2025-10-07 18:49 ` Roy Luo
2025-10-06 23:21 ` [PATCH v1 3/4] usb: dwc3: Add Google SoC USB PHY driver Roy Luo
2025-10-07 0:42 ` Krzysztof Kozlowski
2025-10-07 5:51 ` Greg Kroah-Hartman
2025-10-07 18:57 ` Roy Luo
2025-10-06 23:21 ` [PATCH v1 4/4] dt-bindings: phy: google: Add Google SoC USB PHY Roy Luo
2025-10-07 0:45 ` Krzysztof Kozlowski
2025-10-07 19:04 ` Roy Luo
2025-10-07 1:06 ` [PATCH v1 0/4] Add Google Tensor SoC USB support Krzysztof Kozlowski
2025-10-07 18:03 ` Roy Luo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).