summaryrefslogtreecommitdiff
path: root/drivers/usb/cdns3/cdns3-starfive.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/cdns3/cdns3-starfive.c')
-rw-r--r--drivers/usb/cdns3/cdns3-starfive.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/drivers/usb/cdns3/cdns3-starfive.c b/drivers/usb/cdns3/cdns3-starfive.c
new file mode 100644
index 0000000000..eb184394cd
--- /dev/null
+++ b/drivers/usb/cdns3/cdns3-starfive.c
@@ -0,0 +1,79 @@
+// SPDX-License-Identifier: GPL-2.0
+/**
+ * cdns-starfive.c - Cadence USB Controller
+ *
+ * Copyright (C) 2022 Starfive, Inc.
+ * Author: yanhong <yanhong.wang@starfivetech.com>
+ */
+
+#include <common.h>
+#include <clk.h>
+#include <dm.h>
+#include <dm/device_compat.h>
+#include <linux/usb/otg.h>
+#include <reset.h>
+
+#include "core.h"
+
+struct cdns_starfive {
+ struct udevice *dev;
+ struct clk_bulk clks;
+ struct reset_ctl_bulk resets;
+};
+
+static int cdns_starfive_probe(struct udevice *dev)
+{
+ struct cdns_starfive *data = dev_get_plat(dev);
+ int ret;
+
+ data->dev = dev;
+
+ ret = clk_get_bulk(dev, &data->clks);
+ if (ret)
+ goto err;
+
+ ret = reset_get_bulk(dev, &data->resets);
+ if (ret)
+ goto err_clk;
+
+ ret = clk_enable_bulk(&data->clks);
+ if (ret)
+ goto err_reset;
+
+ ret = reset_deassert_bulk(&data->resets);
+ if (ret)
+ goto err_reset;
+
+ return 0;
+err_reset:
+ reset_release_bulk(&data->resets);
+err_clk:
+ clk_release_bulk(&data->clks);
+err:
+ return ret;
+}
+
+static int cdns_starfive_remove(struct udevice *dev)
+{
+ struct cdns_starfive *data = dev_get_plat(dev);
+
+ clk_release_bulk(&data->clks);
+// reset_assert_bulk(&data->resets);
+
+ return 0;
+}
+
+static const struct udevice_id cdns_starfive_of_match[] = {
+ { .compatible = "starfive,jh7110-cdns3", },
+ {},
+};
+
+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),
+};