On 10/12/24 5:13 AM, Minda Chen wrote:
Add cdns USB3 wrapper driver. And cdns core driver also get
dr mode from wrapper devcie dts node to make it is same with
Starfive cdns USB Linux kernel driver, preparing for enable
OF_UPSTREAM.

Signed-off-by: Minda Chen <minda.c...@starfivetech.com>
---
  drivers/usb/cdns3/Kconfig          |   7 ++
  drivers/usb/cdns3/Makefile         |   2 +
  drivers/usb/cdns3/cdns3-starfive.c | 183 +++++++++++++++++++++++++++++
  drivers/usb/cdns3/core.c           |   3 +
  4 files changed, 195 insertions(+)
  create mode 100644 drivers/usb/cdns3/cdns3-starfive.c

diff --git a/drivers/usb/cdns3/Kconfig b/drivers/usb/cdns3/Kconfig
index 35b61497d9c..6c9595c3c49 100644
--- a/drivers/usb/cdns3/Kconfig
+++ b/drivers/usb/cdns3/Kconfig
@@ -55,4 +55,11 @@ config USB_CDNS3_TI
        help
          Say 'Y' here if you are building for Texas Instruments
          platforms that contain Cadence USB3 controller core. E.g.: J721e.
+
+config USB_CDNS3_STARFIVE
+       tristate "Cadence USB3 support on Starfive platforms"
+       default y if STARFIVE_JH7110
+       help
+         Say 'Y' here if you are building for Starfive platforms
+         that contain Cadence USB3 controller core. E.g.: JH7110.
  endif

Keep the list sorted.

diff --git a/drivers/usb/cdns3/Makefile b/drivers/usb/cdns3/Makefile
index 18d7190755d..03d1eadb2ff 100644
--- a/drivers/usb/cdns3/Makefile
+++ b/drivers/usb/cdns3/Makefile
@@ -9,3 +9,5 @@ cdns3-$(CONFIG_$(SPL_)USB_CDNS3_GADGET) += gadget.o ep0.o
  cdns3-$(CONFIG_$(SPL_)USB_CDNS3_HOST) += host.o
obj-$(CONFIG_USB_CDNS3_TI) += cdns3-ti.o
+
+obj-$(CONFIG_USB_CDNS3_STARFIVE)       += cdns3-starfive.o

Keep the list sorted.

diff --git a/drivers/usb/cdns3/cdns3-starfive.c 
b/drivers/usb/cdns3/cdns3-starfive.c
new file mode 100644
index 00000000000..fad05451c80
--- /dev/null
+++ b/drivers/usb/cdns3/cdns3-starfive.c
@@ -0,0 +1,183 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * cdns3-starfive.c - StarFive specific Glue layer for Cadence USB Controller
+ *
+ * Copyright (C) 2024 StarFive Technology Co., Ltd.
+ *
+ * Author:     Minda Chen <minda.c...@starfivetech.com>
+ */
+
+#include <asm/io.h>
+#include <clk.h>
+#include <dm.h>
+#include <dm/device_compat.h>
+#include <linux/bitops.h>
+#include <linux/usb/otg.h>
+#include <reset.h>
+#include <regmap.h>
+#include <syscon.h>
+#include <malloc.h>
+
+#include "core.h"
+
+#define USB_STRAP_HOST                 BIT(17)
+#define USB_STRAP_DEVICE               BIT(18)
+#define USB_STRAP_MASK                 GENMASK(18, 16)
+
+#define USB_SUSPENDM_HOST              BIT(19)
+#define USB_SUSPENDM_MASK              BIT(19)
+
+#define USB_MISC_CFG_MASK              GENMASK(23, 20)
+#define USB_SUSPENDM_BYPS              BIT(20)
+#define USB_PLL_EN                     BIT(22)
+#define USB_REFCLK_MODE                        BIT(23)
+
+struct cdns_starfive {
+       struct udevice *dev;
+       struct regmap *stg_syscon;
+       struct reset_ctl_bulk resets;
+       struct clk_bulk clks;
+       u32 stg_usb_mode;
+       enum usb_dr_mode mode;
+};
+
+static void cdns_mode_init(struct cdns_starfive *data, enum usb_dr_mode mode)
+{
+       unsigned int strap, suspendm;
+
+       regmap_update_bits(data->stg_syscon, data->stg_usb_mode,
+                          USB_MISC_CFG_MASK,
+                          USB_SUSPENDM_BYPS | USB_PLL_EN | USB_REFCLK_MODE);
+
+       switch (mode) {
+       case USB_DR_MODE_HOST:
+               strap = USB_STRAP_HOST;
+               suspendm = USB_SUSPENDM_HOST;
+               break;
+

Drop the newline please.

+       case USB_DR_MODE_PERIPHERAL:
+               strap = USB_STRAP_DEVICE;
+               suspendm = 0;
+               break;
+       default:
+               return;
+       }
+
+       regmap_update_bits(data->stg_syscon, data->stg_usb_mode,
+                          USB_SUSPENDM_MASK | USB_STRAP_MASK,
+                          strap | suspendm);
+}

[...]

diff --git a/drivers/usb/cdns3/core.c b/drivers/usb/cdns3/core.c
index cbe06a9e7b6..9d0a56fd0e7 100644
--- a/drivers/usb/cdns3/core.c
+++ b/drivers/usb/cdns3/core.c
@@ -410,6 +410,9 @@ int cdns3_bind(struct udevice *parent)
        name = ofnode_get_name(node);
        dr_mode = usb_get_dr_mode(node);
+ if (dr_mode == USB_DR_MODE_UNKNOWN)
+               dr_mode = usb_get_dr_mode(dev_ofnode(parent));
Separate patch for core changes please.

Reply via email to