From: Minda Chen <minda.chen@starfivetech.com>
To: Marek Vasut <marex@denx.de>, Tom Rini <trini@konsulko.com>,
Roger Quadros <rogerq@kernel.org>,
Neil Armstrong <neil.armstrong@linaro.org>,
Alexey Romanov <avromanov@salutedevices.com>,
Sumit Garg <sumit.garg@linaro.org>,
Mark Kettenis <kettenis@openbsd.org>, Nishanth Menon <nm@ti.com>,
Rick Chen <rick@andestech.com>,
Leo Yu-Chi Liang <ycliang@andestech.com>
Cc: u-boot@lists.denx.de, Heinrich Schuchardt <xypron.glpk@gmx.de>,
Simon Glass <sjg@chromium.org>, E Shattow <lucent@gmail.com>,
Minda Chen <minda.chen@starfivetech.com>
Subject: [PATCH v2 4/8] usb: cdns: starfive: Add cdns USB driver
Date: Thu, 4 Jul 2024 13:50:10 +0800 [thread overview]
Message-ID: <20240704055014.55117-5-minda.chen@starfivetech.com> (raw)
In-Reply-To: <20240704055014.55117-1-minda.chen@starfivetech.com>
Add cdns USB3 wrapper driver.
Signed-off-by: Minda Chen <minda.chen@starfivetech.com>
---
drivers/usb/cdns3/Kconfig | 7 ++
drivers/usb/cdns3/Makefile | 2 +
drivers/usb/cdns3/cdns3-starfive.c | 183 +++++++++++++++++++++++++++++
3 files changed, 192 insertions(+)
create mode 100644 drivers/usb/cdns3/cdns3-starfive.c
diff --git a/drivers/usb/cdns3/Kconfig b/drivers/usb/cdns3/Kconfig
index 35b61497d9..f8f363982b 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 USB_CDNS3
+ help
+ Say 'Y' here if you are building for Starfive platforms
+ that contain Cadence USB3 controller core. E.g.: JH7110.
endif
diff --git a/drivers/usb/cdns3/Makefile b/drivers/usb/cdns3/Makefile
index 18d7190755..03d1eadb2f 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
diff --git a/drivers/usb/cdns3/cdns3-starfive.c b/drivers/usb/cdns3/cdns3-starfive.c
new file mode 100644
index 0000000000..660833fb5b
--- /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.chen@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;
+
+ 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_STRAP_MASK, strap);
+ regmap_update_bits(data->stg_syscon, data->stg_usb_mode,
+ USB_SUSPENDM_MASK, suspendm);
+}
+
+static void cdns_clk_rst_deinit(struct cdns_starfive *data)
+{
+ reset_assert_bulk(&data->resets);
+ clk_disable_bulk(&data->clks);
+}
+
+static int cdns_clk_rst_init(struct cdns_starfive *data)
+{
+ int ret;
+
+ ret = clk_get_bulk(data->dev, &data->clks);
+ if (ret)
+ return ret;
+
+ ret = reset_get_bulk(data->dev, &data->resets);
+ if (ret)
+ goto err_clk;
+
+ ret = clk_enable_bulk(&data->clks);
+ if (ret)
+ goto err_en_clk;
+
+ ret = reset_deassert_bulk(&data->resets);
+ if (ret)
+ goto err_reset;
+
+ return 0;
+
+err_reset:
+ clk_disable_bulk(&data->clks);
+err_en_clk:
+ reset_release_bulk(&data->resets);
+err_clk:
+ clk_release_bulk(&data->clks);
+
+ return ret;
+}
+
+static int cdns_starfive_get_syscon(struct cdns_starfive *data)
+{
+ struct ofnode_phandle_args phandle;
+ int ret;
+
+ ret = dev_read_phandle_with_args(data->dev, "starfive,stg-syscon", NULL, 1, 0,
+ &phandle);
+
+ if (ret < 0) {
+ dev_err(data->dev, "Can't get stg cfg phandle: %d\n", ret);
+ return ret;
+ }
+
+ data->stg_syscon = syscon_node_to_regmap(phandle.node);
+ if (IS_ERR(data->stg_syscon)) {
+ dev_err(data->dev, "fail to get regmap: %d\n", (int)PTR_ERR(data->stg_syscon));
+ return PTR_ERR(data->stg_syscon);
+ }
+ data->stg_usb_mode = phandle.args[0];
+
+ return 0;
+}
+
+static int cdns_starfive_probe(struct udevice *dev)
+{
+ struct cdns_starfive *data = dev_get_plat(dev);
+ enum usb_dr_mode dr_mode;
+ ofnode node;
+ int ret;
+
+ data->dev = dev;
+
+ ret = cdns_starfive_get_syscon(data);
+
+ if (ret)
+ return ret;
+
+ node = ofnode_by_compatible(dev_ofnode(dev), "cdns,usb3");
+ if (!ofnode_valid(node)) {
+ dev_err(dev, "failed to get usb node\n");
+ return -ENODEV;
+ }
+
+ dr_mode = usb_get_dr_mode(node);
+
+ data->mode = dr_mode;
+ cdns_mode_init(data, dr_mode);
+
+ return cdns_clk_rst_init(data);
+}
+
+static int cdns_starfive_remove(struct udevice *dev)
+{
+ struct cdns_starfive *data = dev_get_plat(dev);
+
+ cdns_clk_rst_deinit(data);
+ return 0;
+}
+
+static const struct udevice_id cdns_starfive_of_match[] = {
+ { .compatible = "starfive,jh7110-usb", },
+ {},
+};
+
+U_BOOT_DRIVER(cdns_starfive) = {
+ .name = "cdns-starfive",
+ .id = UCLASS_NOP,
+ .of_match = cdns_starfive_of_match,
+ .bind = cdns3_bind,
+ .probe = cdns_starfive_probe,
+ .remove = cdns_starfive_remove,
+ .plat_auto = sizeof(struct cdns_starfive),
+ .flags = DM_FLAG_OS_PREPARE,
+};
--
2.17.1
next prev parent reply other threads:[~2024-07-04 5:51 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-04 5:50 [PATCH v2 0/7] Add Starfive JH7110 Cadence USB driver Minda Chen
2024-07-04 5:50 ` [PATCH v2 1/8] usb: cdns3: Set USB PHY mode in cdns3_core_init_role() Minda Chen
2024-07-04 13:30 ` Roger Quadros
2024-07-05 8:23 ` Minda Chen
2024-07-04 5:50 ` [PATCH v2 2/8] phy: starfive: Add Starfive JH7110 USB 2.0 PHY driver Minda Chen
2024-07-04 13:34 ` Roger Quadros
2024-07-04 5:50 ` [PATCH v2 3/8] phy: starfive: Add Starfive JH7110 PCIe " Minda Chen
2024-07-04 14:06 ` Roger Quadros
2024-07-19 1:29 ` Minda Chen
2024-07-04 14:16 ` Roger Quadros
2024-07-04 5:50 ` Minda Chen [this message]
2024-07-04 14:17 ` [PATCH v2 4/8] usb: cdns: starfive: Add cdns USB driver Roger Quadros
2024-07-04 5:50 ` [PATCH v2 5/8] pinctrl: starfive: Setup USB default disable overcurrent pin Minda Chen
2024-07-04 5:50 ` [PATCH v2 6/8] configs: starfive: Add visionfive2 cadence USB configuration Minda Chen
2024-07-04 5:50 ` [PATCH v2 7/8] dts: starfive: Add JH7110 Cadence USB dts node Minda Chen
2024-07-04 5:50 ` [PATCH v2 8/8] MAINTAINERS: Update Starfive visionfive2 maintain files Minda Chen
2024-07-04 13:25 ` [PATCH v2 0/7] Add Starfive JH7110 Cadence USB driver Heinrich Schuchardt
2024-07-05 1:08 ` E Shattow
2024-07-05 5:33 ` 回复: " Minda Chen
2024-07-19 1:31 ` Minda Chen
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=20240704055014.55117-5-minda.chen@starfivetech.com \
--to=minda.chen@starfivetech.com \
--cc=avromanov@salutedevices.com \
--cc=kettenis@openbsd.org \
--cc=lucent@gmail.com \
--cc=marex@denx.de \
--cc=neil.armstrong@linaro.org \
--cc=nm@ti.com \
--cc=rick@andestech.com \
--cc=rogerq@kernel.org \
--cc=sjg@chromium.org \
--cc=sumit.garg@linaro.org \
--cc=trini@konsulko.com \
--cc=u-boot@lists.denx.de \
--cc=xypron.glpk@gmx.de \
--cc=ycliang@andestech.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.