]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
clk: clk_octeon: Add simple MIPS Octeon clock driver
authorStefan Roese <sr@denx.de>
Thu, 30 Jul 2020 11:56:16 +0000 (13:56 +0200)
committerDaniel Schwierzeck <daniel.schwierzeck@gmail.com>
Mon, 3 Aug 2020 19:11:41 +0000 (21:11 +0200)
This patch adds a simple clock driver for the Marvell Octeon MIPS SoC
family. Its for IO clock rate passing via DT in some of the Octeon
driver, like I2C. So that we don't need to use the non-mainline API
octeon_get_io_clock().

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Lukasz Majewski <lukma@denx.de>
drivers/clk/Kconfig
drivers/clk/Makefile
drivers/clk/clk_octeon.c [new file with mode: 0644]
include/dt-bindings/clock/octeon-clock.h [new file with mode: 0644]

index 82cb1874e191eb5e84a61a413caf58d6ddfb195b..6003e140b58228207d6ce833542b0f204e6975af 100644 (file)
@@ -83,6 +83,13 @@ config CLK_INTEL
          set up by U-Boot itself but only statically. Thus the driver does not
          support changing clock rates, only querying them.
 
+config CLK_OCTEON
+       bool "Clock controller driver for Marvell MIPS Octeon"
+       depends on CLK && ARCH_OCTEON
+       default y
+       help
+         Enable this to support the clocks on Octeon MIPS platforms.
+
 config CLK_STM32F
        bool "Enable clock driver support for STM32F family"
        depends on CLK && (STM32F7 || STM32F4)
index d9119545810f61c54c6128547182f26ca177b583..cda4b4b605f191ee60e57b902b471671e9d64abe 100644 (file)
@@ -29,6 +29,7 @@ obj-$(CONFIG_$(SPL_TPL_)CLK_INTEL) += intel/
 obj-$(CONFIG_CLK_HSDK) += clk-hsdk-cgu.o
 obj-$(CONFIG_CLK_K210) += kendryte/
 obj-$(CONFIG_CLK_MPC83XX) += mpc83xx_clk.o
+obj-$(CONFIG_CLK_OCTEON) += clk_octeon.o
 obj-$(CONFIG_CLK_OWL) += owl/
 obj-$(CONFIG_CLK_RENESAS) += renesas/
 obj-$(CONFIG_CLK_SIFIVE) += sifive/
diff --git a/drivers/clk/clk_octeon.c b/drivers/clk/clk_octeon.c
new file mode 100644 (file)
index 0000000..fd559e0
--- /dev/null
@@ -0,0 +1,72 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2020 Stefan Roese <sr@denx.de>
+ */
+
+#include <clk-uclass.h>
+#include <dm.h>
+#include <dt-bindings/clock/octeon-clock.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+struct octeon_clk_priv {
+       u64 core_clk;
+       u64 io_clk;
+};
+
+static int octeon_clk_enable(struct clk *clk)
+{
+       /* Nothing to do on Octeon */
+       return 0;
+}
+
+static ulong octeon_clk_get_rate(struct clk *clk)
+{
+       struct octeon_clk_priv *priv = dev_get_priv(clk->dev);
+
+       switch (clk->id) {
+       case OCTEON_CLK_CORE:
+               return priv->core_clk;
+
+       case OCTEON_CLK_IO:
+               return priv->io_clk;
+
+       default:
+               return 0;
+       }
+
+       return 0;
+}
+
+static struct clk_ops octeon_clk_ops = {
+       .enable = octeon_clk_enable,
+       .get_rate = octeon_clk_get_rate,
+};
+
+static const struct udevice_id octeon_clk_ids[] = {
+       { .compatible = "mrvl,octeon-clk" },
+       { /* sentinel */ }
+};
+
+static int octeon_clk_probe(struct udevice *dev)
+{
+       struct octeon_clk_priv *priv = dev_get_priv(dev);
+
+       /*
+        * The clock values are already read into GD, lets just store them
+        * in priv data
+        */
+       priv->core_clk = gd->cpu_clk;
+       priv->io_clk = gd->bus_clk;
+
+       return 0;
+}
+
+U_BOOT_DRIVER(clk_octeon) = {
+       .name = "clk_octeon",
+       .id = UCLASS_CLK,
+       .of_match = octeon_clk_ids,
+       .ops = &octeon_clk_ops,
+       .probe = octeon_clk_probe,
+       .priv_auto_alloc_size = sizeof(struct octeon_clk_priv),
+};
diff --git a/include/dt-bindings/clock/octeon-clock.h b/include/dt-bindings/clock/octeon-clock.h
new file mode 100644 (file)
index 0000000..34e6a3b
--- /dev/null
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2020 Stefan Roese <sr@denx.de>
+ */
+
+#ifndef __DT_BINDINGS_CLOCK_OCTEON_CLOCK_H
+#define __DT_BINDINGS_CLOCK_OCTEON_CLOCK_H
+
+#define OCTEON_CLK_CORE                0
+#define OCTEON_CLK_IO          1
+
+#endif /* __DT_BINDINGS_CLOCK_OCTEON_CLOCK_H */